From 4bf29fe26d76fcbf1b0e6e39170de19d2539848a Mon Sep 17 00:00:00 2001 From: Yaqiang Zhu Date: Mon, 11 Sep 2023 01:12:00 -0400 Subject: [PATCH 1/2] [sonic-package-manager] Increate timeout for sonic-package-manager migrate (#2973) What I did When we migrate package via sonic-package-manager in some low-performance device, getting docker image from old image via docker socket may timeout by default timeout setting (60s) client.py. This PR is to increase timeout to 120s. How I did it Increase docker client timeout from 60s to 120s. How to verify it ut passed. Build image with INCLUDE_MACSEC, and install it, macsec image was not include. And the build image with this PR, install it. Migrate package successfully. Signed-off-by: Yaqiang Zhu --- sonic_package_manager/manager.py | 7 +++++- tests/sonic_package_manager/test_manager.py | 28 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/sonic_package_manager/manager.py b/sonic_package_manager/manager.py index f29bd4776..bd67c690c 100644 --- a/sonic_package_manager/manager.py +++ b/sonic_package_manager/manager.py @@ -653,6 +653,10 @@ def reset(self, name: str, force: bool = False, skip_host_plugins: bool = False) allow_downgrade=True, skip_host_plugins=skip_host_plugins) + @under_lock + def get_docker_client(self, dockerd_sock:str): + return docker.DockerClient(base_url=f'unix://{dockerd_sock}', timeout=120) + @under_lock def migrate_packages(self, old_package_database: PackageDatabase, @@ -695,7 +699,8 @@ def migrate_package(old_package_entry, # dockerd_sock is defined, so use docked_sock to connect to # dockerd and fetch package image from it. log.info(f'installing {name} from old docker library') - docker_api = DockerApi(docker.DockerClient(base_url=f'unix://{dockerd_sock}')) + docker_client = self.get_docker_client(dockerd_sock) + docker_api = DockerApi(docker_client) image = docker_api.get_image(old_package_entry.image_id) diff --git a/tests/sonic_package_manager/test_manager.py b/tests/sonic_package_manager/test_manager.py index a1348514b..216721272 100644 --- a/tests/sonic_package_manager/test_manager.py +++ b/tests/sonic_package_manager/test_manager.py @@ -327,3 +327,31 @@ def test_manager_migration(package_manager, fake_db_for_migration): call('test-package-6=2.0.0')], any_order=True ) + + +def mock_get_docker_client(dockerd_sock): + class DockerClient: + def __init__(self, dockerd_sock): + class Image: + def __init__(self, image_id): + self.image_id = image_id + + def save(self, named): + return ["named: {}".format(named).encode()] + + image = Image("dummy_id") + self.images = { + "Azure/docker-test-3:1.6.0": image, + "Azure/docker-test-6:2.0.0": image + } + self.dockerd_sock = dockerd_sock + + return DockerClient(dockerd_sock) + + +def test_manager_migration_dockerd(package_manager, fake_db_for_migration, mock_docker_api): + package_manager.install = Mock() + package_manager.get_docker_client = Mock(side_effect=mock_get_docker_client) + package_manager.migrate_packages(fake_db_for_migration, '/var/run/docker.sock') + package_manager.get_docker_client.assert_has_calls([ + call('/var/run/docker.sock')], any_order=True) From d9bc820ef07f7a5a572a906acd853ed59ef32915 Mon Sep 17 00:00:00 2001 From: mihirpat1 <112018033+mihirpat1@users.noreply.github.com> Date: Mon, 18 Sep 2023 21:53:50 -0700 Subject: [PATCH 2/2] Handle NotImplementedError exception while changing optoe write max (#2985) * Handle NotImplementedError exception while changing optoe write max Signed-off-by: Mihir Patel * Added unit test for more coverage * Removed unused import --------- Signed-off-by: Mihir Patel --- sfputil/main.py | 10 ++++++++-- tests/sfputil_test.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/sfputil/main.py b/sfputil/main.py index 753634be7..42630de7e 100644 --- a/sfputil/main.py +++ b/sfputil/main.py @@ -1362,7 +1362,10 @@ def download_firmware(port_name, filepath): sys.exit(EXIT_FAIL) # Increase the optoe driver's write max to speed up firmware download - sfp.set_optoe_write_max(SMBUS_BLOCK_WRITE_SIZE) + try: + sfp.set_optoe_write_max(SMBUS_BLOCK_WRITE_SIZE) + except NotImplementedError: + click.echo("Platform doesn't implement optoe write max change. Skipping value increase.") with click.progressbar(length=file_size, label="Downloading ...") as bar: address = 0 @@ -1388,7 +1391,10 @@ def download_firmware(port_name, filepath): remaining -= count # Restore the optoe driver's write max to '1' (default value) - sfp.set_optoe_write_max(1) + try: + sfp.set_optoe_write_max(1) + except NotImplementedError: + click.echo("Platform doesn't implement optoe write max change. Skipping value restore!") status = api.cdb_firmware_download_complete() update_firmware_info_to_state_db(port_name) diff --git a/tests/sfputil_test.py b/tests/sfputil_test.py index 7b1e99d0b..6224cef51 100644 --- a/tests/sfputil_test.py +++ b/tests/sfputil_test.py @@ -697,6 +697,23 @@ def test_show_fwversion_Rj45(self, mock_chassis): assert result.output == 'Show firmware version is not applicable for RJ45 port Ethernet0.\n' assert result.exit_code == EXIT_FAIL + @patch('builtins.open') + @patch('sfputil.main.platform_chassis') + @patch('sfputil.main.logical_port_to_physical_port_index', MagicMock(return_value=1)) + @patch('sfputil.main.update_firmware_info_to_state_db', MagicMock()) + def test_download_firmware(self, mock_chassis, mock_file): + mock_file.return_value.tell.return_value = 0 + mock_sfp = MagicMock() + mock_api = MagicMock() + mock_sfp.get_xcvr_api = MagicMock(return_value=mock_api) + mock_chassis.get_sfp = MagicMock(return_value=mock_sfp) + mock_api.get_module_fw_mgmt_feature.return_value = {'status': True, 'feature': (0, 0, False, False, 0)} + mock_api.cdb_start_firmware_download.return_value = 1 + mock_api.cdb_firmware_download_complete.return_value = 1 + mock_sfp.set_optoe_write_max = MagicMock(side_effect=NotImplementedError) + status = sfputil.download_firmware("Ethernet0", "test.bin") + assert status == 1 + @patch('sfputil.main.platform_chassis') @patch('sfputil.main.logical_port_to_physical_port_index', MagicMock(return_value=1)) def test_run_firmwre(self, mock_chassis):