From a9ad6ffd4623575b87e32ebed19492cfe265396a Mon Sep 17 00:00:00 2001 From: ChunAn Wu Date: Mon, 22 Dec 2025 17:00:40 +0800 Subject: [PATCH] Fix: zapper_iot must define test_data issue We default use test_data username/password, while test_data is not defined fallback to use provision_data username/password but just "ubunut"/"ubuntu" Signed-off-by: ChunAn Wu --- .../devices/zapper_iot/__init__.py | 15 ++++- .../zapper_iot/tests/test_zapper_iot.py | 59 ++++++++++++++++++- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/__init__.py b/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/__init__.py index c41ee7d65..bd776b722 100644 --- a/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/__init__.py +++ b/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/__init__.py @@ -38,11 +38,22 @@ def _validate_configuration( """Validate the job config and data and prepare the arguments for the Zapper `provision` API. """ + # We prefer using username/password in provision_plan + # while username/password are not defined in test_data + provision_plan = self.job_data.get("provision_data", {}).get( + "provision_plan", {} + ) + + config = provision_plan.get("config", {}) + + default_uname = config.get("username", "ubuntu") + default_password = config.get("password", "ubuntu") + username = self.job_data.get("test_data", {}).get( - "test_username", "ubuntu" + "test_username", default_uname ) password = self.job_data.get("test_data", {}).get( - "test_password", "ubuntu" + "test_password", default_password ) ubuntu_sso_email = self.job_data["provision_data"].get( "ubuntu_sso_email" diff --git a/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/tests/test_zapper_iot.py b/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/tests/test_zapper_iot.py index a992c7d1d..7b7512048 100644 --- a/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/tests/test_zapper_iot.py +++ b/device-connectors/src/testflinger_device_connectors/devices/zapper_iot/tests/test_zapper_iot.py @@ -58,7 +58,7 @@ def test_validate_configuration_ubuntu_sso_email(self): self.assertEqual(args, ()) self.assertDictEqual(kwargs, expected) - def test_validate_configuration_provision_plan(self): + def test_validate_configuration_provision_plan_without_test_data(self): """Test the function validates a custom test plan when provided. """ @@ -85,6 +85,63 @@ def test_validate_configuration_provision_plan(self): args, kwargs = device._validate_configuration() + expected = { + "username": "admin", + "password": "admin", + "custom_provision_plan": { + "config": { + "project_name": "name", + "username": "admin", # this gets overridden + "password": "admin", + "serial_console": { + "port": "/dev/ttySanity1", + "baud_rate": 115200, + }, + "network": "eth0", + }, + "run_stage": [ + {"initial_login": {"method": "system-user"}}, + ], + }, + "urls": [], + "preset": None, + "preset_kwargs": None, + } + self.maxDiff = None + self.assertEqual(args, ()) + self.assertDictEqual(expected, kwargs) + + def test_validate_configuration_provision_plan_with_test_data(self): + """Test the function validates a custom test plan + when provided. + """ + device = DeviceConnector({}) + device.job_data = { + "provision_data": { + "provision_plan": { + "config": { + "project_name": "name", + "username": "admin", + "password": "admin", + "serial_console": { + "port": "/dev/ttySanity1", + "baud_rate": 115200, + }, + "network": "eth0", + }, + "run_stage": [ + {"initial_login": {"method": "system-user"}}, + ], + } + }, + "test_data": { + "test_username": "ubuntu", + "test_password": "ubuntu", + }, + } + + args, kwargs = device._validate_configuration() + expected = { "username": "ubuntu", "password": "ubuntu",