From 51479cb62674c5052c3fd949db52c7fbcd74c22b Mon Sep 17 00:00:00 2001 From: Azmy Ali Date: Wed, 23 Aug 2023 11:48:07 +0300 Subject: [PATCH] Expanding the manifest capabilities to include ports forwarding as well as docker network type configuration --- sonic_package_manager/manifest.py | 2 ++ sonic_package_manager/service_creator/creator.py | 12 ++++++++++++ .../sonic_package_manager/test_service_creator.py | 15 +++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/sonic_package_manager/manifest.py b/sonic_package_manager/manifest.py index 865db7ef5c..cad69691f5 100644 --- a/sonic_package_manager/manifest.py +++ b/sonic_package_manager/manifest.py @@ -213,6 +213,8 @@ def unmarshal(self, value): ManifestRoot('container', [ ManifestField('privileged', DefaultMarshaller(bool), False), ManifestArray('volumes', DefaultMarshaller(str)), + ManifestField('network', DefaultMarshaller(str), ''), + ManifestArray('ports', DefaultMarshaller(str)), ManifestArray('mounts', ManifestRoot('mounts', [ ManifestField('source', DefaultMarshaller(str)), ManifestField('target', DefaultMarshaller(str)), diff --git a/sonic_package_manager/service_creator/creator.py b/sonic_package_manager/service_creator/creator.py index 4b547b0578..deba54f672 100644 --- a/sonic_package_manager/service_creator/creator.py +++ b/sonic_package_manager/service_creator/creator.py @@ -222,6 +222,7 @@ def generate_container_mgmt(self, package: Package): image_id = package.image_id name = package.manifest['service']['name'] container_spec = package.manifest['container'] + is_asic_service = package.manifest['service']['asic-service'] script_path = os.path.join(DOCKER_CTL_SCRIPT_LOCATION, f'{name}.sh') script_template = get_tmpl_path(DOCKER_CTL_SCRIPT_TEMPLATE) run_opt = [] @@ -231,6 +232,17 @@ def generate_container_mgmt(self, package: Package): run_opt.append('-t') + if not is_asic_service: + if container_spec['network']: + docker_network_type = container_spec['network'] + run_opt.append(f'--net={docker_network_type}') + else: + if container_spec['network'] != 'none': + raise ServiceCreatorError(f"Invalid Configuration, asic-service must not contain network type") + + for port in container_spec['ports']: + run_opt.append(f'--publish {port}') + for volume in container_spec['volumes']: run_opt.append(f'-v {volume}') diff --git a/tests/sonic_package_manager/test_service_creator.py b/tests/sonic_package_manager/test_service_creator.py index 657e4aacdb..b5e66da12a 100644 --- a/tests/sonic_package_manager/test_service_creator.py +++ b/tests/sonic_package_manager/test_service_creator.py @@ -43,6 +43,10 @@ def manifest(): }, 'container': { 'privileged': True, + 'network': 'bridge', + 'ports': [ + "8080:8080" + ], 'volumes': [ '/etc/sonic:/etc/sonic:ro' ] @@ -114,6 +118,17 @@ def read_file(name): assert read_file('test_reconcile') == 'test-process test-process-3' +def test_service_creator_asic_service_network_type_err(sonic_fs, manifest, service_creator, package_manager): + new_manifest = copy.deepcopy(manifest) + new_manifest['service']['asic-service'] = True + entry = PackageEntry('test', 'azure/sonic-test') + package = Package(entry, Metadata(new_manifest)) + installed_packages = package_manager._get_installed_packages_and(package) + + with pytest.raises(ServiceCreatorError) as e: + service_creator.create(package) + + def test_service_creator_with_timer_unit(sonic_fs, manifest, service_creator): entry = PackageEntry('test', 'azure/sonic-test') package = Package(entry, Metadata(manifest))