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 15d3aedd76..37700f7373 100644 --- a/sonic_package_manager/service_creator/creator.py +++ b/sonic_package_manager/service_creator/creator.py @@ -228,6 +228,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 = [] @@ -237,6 +238,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 8e6edcd0f0..8797dd2053 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' ] @@ -119,6 +123,17 @@ def read_file(name): assert set(generated_services_conf_content.split()) == set(['test.service', 'test@.service']) +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))