Decoupled service YAML template into a model YAML template and a (SO) service YAML template.
Model YAML template will be used during the onboarding steps and service YAML template will be used to generate payload when sending instantiation request to SO.
Service YAML template reference model name to use for its VNF/VF-Modules using "model_name" field.
This provide more flexibility to design the testcase and enables to setup more complex testcases like instantiating several VNF/VF-MOdules using the same SDC model infos.
This patch aims to provide backward compatibility for existing testcases based on YAML template.
Issue-ID: TEST-358
Signed-off-by: Julien Fontaine <julien.fontaine@bell.ca>
Change-Id: I69d370eff4d383d5af135206476c65e4a56e4ee5
--- /dev/null
+import logging.config
+import time
+import onaptests.utils.exceptions as onap_test_exceptions
+from onapsdk.configuration import settings
+from onaptests.scenario.multi_vnf_macro import MultiVnfUbuntuMacroStep
+
+if __name__ == "__main__":
+ # logging configuration for onapsdk, it is not requested for onaptests
+ # Correction requested in onapsdk to avoid having this duplicate code
+ logging.config.dictConfig(settings.LOG_CONFIG)
+ logger = logging.getLogger("Instantiate Ubuntu multi VNF without multicloud")
+ step = MultiVnfUbuntuMacroStep(cleanup=settings.CLEANUP_FLAG)
+ try:
+ step.execute()
+ if settings.CLEANUP_FLAG:
+ logger.info("Starting to clean up in {} seconds".format(settings.CLEANUP_ACTIVITY_TIMER))
+ time.sleep(settings.CLEANUP_ACTIVITY_TIMER)
+ step.cleanup()
+ except onap_test_exceptions.TestConfigurationException:
+ logger.error("Ubuntu NSO VM configuration error")
+ except onap_test_exceptions.ServiceInstantiateException:
+ logger.error("Ubuntu NSO VM instantiation error")
+ except onap_test_exceptions.ServiceCleanupException:
+ logger.error("Ubuntu NSO VM instance cleanup error")
+ except onap_test_exceptions.VnfInstantiateException:
+ logger.error("Ubuntu NSO VM Vnf instantiation error")
+ except onap_test_exceptions.VnfCleanupException:
+ logger.error("Ubuntu NSO VM Vnf instance cleanup error")
+ except onap_test_exceptions.VfModuleInstantiateException:
+ logger.error("Ubuntu NSO VM Module instantiation error")
+ except onap_test_exceptions.VfModuleCleanupException:
+ logger.error("Ubuntu NSO VM Module cleanup error")
pnf_macro = onaptests.scenario.pnf_macro:PnfMacro
basic_clamp = onaptests.scenario.basic_clamp:BasicClamp
cds_resource_resolution = onaptests.scenario.cds_resource_resolution:CDSResourceResolution
+ multi_vnf_ubuntu_macro = onaptests.scenario.multi_vnf_macro:MultiVnfUbuntuMacro
except ValueError:
SERVICE_NAME = "" # Fill me
VF_NAME = "" # Fill me
+
+MODEL_YAML_TEMPLATE = None
VIM_SERVICE_URL = cloud.config.auth.get('auth_url','http://10.12.25.2:5000/v3')
TENANT_ID = cloud.config.auth.get('project_id','123456')
TENANT_NAME = cloud.config.auth.get('project_name','dummy_test')
+
+MODEL_YAML_TEMPLATE = None
TENANT_NAME = cloud.config.auth.get('project_name','Fill me')
CLOUD_REGION_ID = cloud.config.auth.get('region_name','RegionOne')
CLOUD_DOMAIN = cloud.config.auth.get('project_domain_name','Default')
+
+MODEL_YAML_TEMPLATE = None
VF_NAME = "basic_onboard_vf"
VSP_NAME = "basic_onboard_vsp"
+
+MODEL_YAML_TEMPLATE = None
raise onap_test_exceptions.TestConfigurationException
SERVICE_INSTANCE_NAME = f"basic_macro_{str(uuid4())}"
+
+MODEL_YAML_TEMPLATE = None
SERVICE_YAML_TEMPLATE = Path(Path(__file__).parent.parent, "templates/vnf-services/" +
"basic_vm_macro_stability-service.yaml")
+MODEL_YAML_TEMPLATE = None
SERVICE_INSTANCE_NAME = "sdktests_service_instance_name"
SERVICE_YAML_TEMPLATE = sys.path[-1] + "/onaptests/templates/vnf-services/basic_vm-service.yaml"
+MODEL_YAML_TEMPLATE = None
TENANT_NAME = cloud.config.auth.get('project_name','Fill me')
CLOUD_REGION_ID = cloud.config.auth.get('region_name','RegionOne')
CLOUD_DOMAIN = cloud.config.auth.get('project_domain_name','Default')
+
+MODEL_YAML_TEMPLATE = None
TENANT_NAME = cloud.config.auth.get('project_name','Fill me')
CLOUD_REGION_ID = cloud.config.get('region_name','RegionOne')
CLOUD_DOMAIN = cloud.config.auth.get('project_domain_name','Default')
+
+MODEL_YAML_TEMPLATE = None
--- /dev/null
+import uuid
+import os
+import sys
+from pathlib import Path
+import openstack
+from jinja2 import Environment, PackageLoader
+from .settings import * # pylint: disable=W0614
+
+VNF_FILENAME_PREFIX = "multi-vnf-ubuntu"
+SERVICE_NAME = f"multivnfubuntu{str(uuid.uuid4().hex)[:6]}"
+
+
+# We need to create a service file with a random service name,
+# to be sure that we force onboarding
+def generate_service_config_yaml_file(filename):
+ """ generate the service file with a random service name
+ from a jinja template"""
+
+ env = Environment(
+ loader=PackageLoader('onaptests', 'templates/vnf-services'),
+ )
+ template = env.get_template(f"{filename}.yaml.j2")
+
+ rendered_template = template.render(service_name=SERVICE_NAME)
+
+ file_name = (sys.path[-1] + "/onaptests/templates/vnf-services/" +
+ f"{filename}.yaml")
+
+ with open(file_name, 'w+') as file_to_write:
+ file_to_write.write(rendered_template)
+
+
+CLEANUP_FLAG = True
+
+CDS_DD_FILE = Path(Path(__file__).parent.parent, "templates/artifacts/dd_nso_ubuntu.json")
+CDS_CBA_UNENRICHED = Path(Path(__file__).parent.parent, "templates/artifacts/nso_ubuntuvnf.zip")
+CDS_CBA_ENRICHED = "/tmp/UBUNTUVNF_enriched.zip"
+
+ONLY_INSTANTIATE = False
+USE_MULTICLOUD = False
+
+CLOUD_REGION_CLOUD_OWNER = "Bell-IaaS"
+CLOUD_REGION_TYPE = "openstack"
+CLOUD_REGION_VERSION = "v1"
+CLOUD_OWNER_DEFINED_TYPE = "VNF"
+
+AVAILABILITY_ZONE_NAME = "z1"
+AVAILABILITY_ZONE_TYPE = "nova"
+COMPLEX_PHYSICAL_LOCATION_ID = "nso-lab-ltec"
+COMPLEX_DATA_CENTER_CODE = "nlt"
+
+GLOBAL_CUSTOMER_ID = "ubuntu-customer"
+
+TEST_CLOUD = os.getenv('OS_TEST_CLOUD') # Get values from clouds.yaml
+cloud = openstack.connect(cloud=TEST_CLOUD)
+VIM_USERNAME = cloud.config.auth.get('username', 'nso')
+VIM_PASSWORD = cloud.config.auth.get('password', 'Password123')
+VIM_SERVICE_URL = cloud.config.auth.get('auth_url', 'https://10.195.194.215:5000')
+TENANT_ID = cloud.config.auth.get('project_id', 'e2710e84063b421fab08189818761d55')
+TENANT_NAME = cloud.config.auth.get('project_name', 'nso')
+CLOUD_REGION_ID = cloud.config.auth.get('region_name', 'nso215')
+CLOUD_DOMAIN = cloud.config.auth.get('project_domain_name', 'Default')
+
+OWNING_ENTITY = "seb"
+PROJECT = "Project-UbuntuDemo"
+LINE_OF_BUSINESS = "wireless"
+PLATFORM = "iaas-openstack"
+CLOUD_DOMAIN = "Default"
+
+VENDOR_NAME = 'ubuntu_xtesting_vendor'
+
+SERVICE_YAML_TEMPLATE = Path(Path(__file__).parent.parent, "templates/vnf-services/" +
+ f"{VNF_FILENAME_PREFIX}-service.yaml")
+
+MODEL_YAML_TEMPLATE = Path(Path(__file__).parent.parent, "templates/vnf-services/" +
+ f"{VNF_FILENAME_PREFIX}-model.yaml")
+
+
+generate_service_config_yaml_file(f"{VNF_FILENAME_PREFIX}-service")
+generate_service_config_yaml_file(f"{VNF_FILENAME_PREFIX}-model")
+
+SERVICE_INSTANCE_NAME = f"{SERVICE_NAME}_svc"
DCAE_VES_COLLECTOR_POD_NAME = "dcae-ves-collector"
PNF_WAIT_TIME = 60.0
PNF_REGISTRATION_NUMBER_OF_TRIES = 20
+
+# Disable YAML SDC model definition which means all SDC config reside in SERVICE_YAML_TEMPLATE
+MODEL_YAML_TEMPLATE = None
self._yaml_template: dict = load(yaml_template)
return self._yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> dict:
"""Service name.
--- /dev/null
+"""Instantiate basic vm using SO macro flow."""
+import logging
+import time
+
+from yaml import load
+
+from onapsdk.configuration import settings
+from onapsdk.exceptions import SDKException
+from xtesting.core import testcase
+
+from onaptests.steps.base import YamlTemplateBaseStep
+from onaptests.steps.onboard.cds import CbaPublishStep
+from onaptests.utils.exceptions import OnapTestException
+from onaptests.steps.instantiate.service_macro import YamlTemplateServiceMacroInstantiateStep
+
+
+class MultiVnfUbuntuMacroStep(YamlTemplateBaseStep):
+
+ def __init__(self, cleanup=False):
+ """Initialize step.
+
+ Substeps:
+ - CbaPublishStep
+ - YamlTemplateServiceAlaCarteInstantiateStep.
+ """
+ super().__init__(cleanup=cleanup)
+ self._yaml_template: dict = None
+ self._model_yaml_template: dict = None
+ self.add_step(CbaPublishStep(
+ cleanup=settings.CLEANUP_FLAG
+ ))
+ self.add_step(YamlTemplateServiceMacroInstantiateStep(
+ cleanup=settings.CLEANUP_FLAG
+ ))
+
+ @property
+ def description(self) -> str:
+ """Step description.
+
+ Used for reports
+
+ Returns:
+ str: Step description
+
+ """
+ return "Multi VNF Ubuntu macro scenario step"
+
+ @property
+ def component(self) -> str:
+ """Component name.
+
+ Name of component which step is related with.
+ Most is the name of ONAP component.
+
+ Returns:
+ str: Component name
+
+ """
+ return "PythonSDK-tests"
+
+ @property
+ def yaml_template(self) -> dict:
+ """YAML template abstract property.
+
+ Every YAML template step need to implement that property.
+
+ Returns:
+ dict: YAML template
+
+ """
+ if not self._yaml_template:
+ with open(settings.SERVICE_YAML_TEMPLATE, "r") as yaml_template:
+ self._yaml_template: dict = load(yaml_template)
+ return self._yaml_template
+
+ @property
+ def model_yaml_template(self) -> dict:
+ if not self._model_yaml_template:
+ with open(settings.MODEL_YAML_TEMPLATE, "r") as model_yaml_template:
+ self._model_yaml_template: dict = load(model_yaml_template)
+ return self._model_yaml_template
+
+ @property
+ def service_name(self) -> dict:
+ """Service name.
+
+ Get from YAML template.
+
+ Returns:
+ str: Service name
+
+ """
+ return next(iter(self.yaml_template.keys()))
+
+ @property
+ def service_instance_name(self) -> str:
+ """Service instance name.
+
+ Returns:
+ str: Service instance name
+
+ """
+ return settings.SERVICE_INSTANCE_NAME
+
+
+class MultiVnfUbuntuMacro(testcase.TestCase):
+ """Instantiate a basic vm macro."""
+
+ __logger = logging.getLogger(__name__)
+
+ def __init__(self, **kwargs):
+ """Init Basic Macro use case."""
+ if "case_name" not in kwargs:
+ kwargs["case_name"] = 'nso_ubuntu_macro'
+ super().__init__(**kwargs)
+ self.__logger.debug("NSO Ubuntu macro init started")
+ self.test = MultiVnfUbuntuMacro(cleanup=settings.CLEANUP_FLAG)
+
+ def run(self):
+ """Run NSO Ubuntu macro test."""
+ self.start_time = time.time()
+ try:
+ self.test.execute()
+ self.__logger.info("Starting to clean up in {} seconds".format(settings.CLEANUP_ACTIVITY_TIMER))
+ time.sleep(settings.CLEANUP_ACTIVITY_TIMER)
+ self.test.cleanup()
+ self.result = 100
+ except OnapTestException as exc:
+ self.result = 0
+ self.__logger.error(exc.error_message)
+ except SDKException:
+ self.result = 0
+ self.__logger.error("SDK Exception")
+ finally:
+ self.stop_time = time.time()
+
+ def clean(self):
+ """Generate report."""
+ self.test.reports_collection.generate_report()
self._yaml_template: dict = load(yaml_template)
return self._yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> dict:
"""Service name.
dict: YAML template
"""
+
+ @property
+ @abstractmethod
+ def model_yaml_template(self) -> dict:
+ """Model YAML template abstract property.
+
+ Every YAML template step need to implement that property.
+
+ Returns:
+ dict: YAML template
+
+ """
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
from onapsdk.configuration import settings
from onapsdk.exceptions import ResourceNotFound
from onapsdk.sdc.service import Service
-from onapsdk.so.instantiation import InstantiationParameter, ServiceInstantiation, VfmoduleParameters, VnfParameters
+from onapsdk.so.instantiation import InstantiationParameter, ServiceInstantiation, VfmoduleParameters, VnfParameters, SoService
+from onapsdk.vid import LineOfBusiness, Platform, Project
from onaptests.steps.cloud.customer_service_subscription_create import CustomerServiceSubscriptionCreateStep
import onaptests.utils.exceptions as onap_test_exceptions
"""
super().__init__(cleanup=cleanup)
self._yaml_template: dict = None
+ self._model_yaml_template: dict = None
self._service_instance_name: str = None
self._service_instance: str = None
if not settings.ONLY_INSTANTIATE:
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ """Step Model YAML template.
+
+ Load from file if it's a root step, get from parent otherwise.
+
+ Returns:
+ dict: Step YAML template
+
+ """
+ if self.is_root:
+ if not self._model_yaml_template:
+ with open(settings.MODEL_YAML_TEMPLATE, "r") as model_yaml_template:
+ self._model_yaml_template: dict = load(model_yaml_template)
+ return self._model_yaml_template
+ return self.parent.model_yaml_template
+
@property
def service_name(self) -> str:
"""Service name.
except ResourceNotFound:
self._logger.info("Owning entity not found, create it")
owning_entity = OwningEntity.create(settings.OWNING_ENTITY)
+ vid_project: Project = Project(settings.PROJECT)
+ line_of_business: LineOfBusiness = LineOfBusiness(settings.LINE_OF_BUSINESS)
+ platform: Platform = Platform(settings.PLATFORM)
# Before instantiating, be sure that the service has been distributed
self._logger.info("******** Check Service Distribution *******")
if distribution_completed is False:
self._logger.error(
- "Service Distribution for %s failed !!",service.name)
+ "Service Distribution for %s failed !!", service.name)
raise onap_test_exceptions.ServiceDistributionException
+ so_service = None
vnf_params_list: List[VnfParameters] = []
- for vnf_data in self.yaml_template[self.service_name].get("vnfs", []):
- vnf_params_list.append(VnfParameters(
- vnf_data["vnf_name"],
- [InstantiationParameter(name=parameter["name"], value=parameter["value"]) for parameter in vnf_data.get("vnf_parameters", [])],
- [VfmoduleParameters(vf_module_data["vf_module_name"],
- [InstantiationParameter(name=parameter["name"], value=parameter["value"]) for parameter in vf_module_data.get("parameters", [])]) \
+ if settings.MODEL_YAML_TEMPLATE:
+ so_data = self.yaml_template[self.service_name]
+ so_service = SoService(vnfs=so_data.get("vnfs", []),
+ subscription_service_type=so_data.get('subscription_service_type'))
+ else:
+ for vnf_data in self.yaml_template[self.service_name].get("vnfs", []):
+ vnf_params_list.append(VnfParameters(
+ vnf_data["vnf_name"],
+ [InstantiationParameter(name=parameter["name"], value=parameter["value"]) for parameter in
+ vnf_data.get("vnf_parameters", [])],
+ [VfmoduleParameters(vf_module_data["vf_module_name"],
+ [InstantiationParameter(name=parameter["name"], value=parameter["value"]) for
+ parameter in vf_module_data.get("parameters", [])]) \
for vf_module_data in vnf_data.get("vf_module_parameters", [])]
- ))
+ ))
service_instantiation = ServiceInstantiation.instantiate_macro(
- service,
+ sdc_service=service,
customer=customer,
owning_entity=owning_entity,
- project=settings.PROJECT,
- line_of_business=settings.LINE_OF_BUSINESS,
- platform=settings.PLATFORM,
+ project=vid_project,
+ line_of_business=line_of_business,
+ platform=platform,
cloud_region=cloud_region,
tenant=tenant,
service_instance_name=self.service_instance_name,
vnf_parameters=vnf_params_list,
- enable_multicloud=settings.USE_MULTICLOUD
+ enable_multicloud=settings.USE_MULTICLOUD,
+ so_service=so_service
)
try:
service_instantiation.wait_for_finish(timeout=settings.ORCHESTRATION_REQUEST_TIMEOUT)
if service_instantiation.failed:
self._logger.error("Service instantiation %s failed", self.service_instance_name)
raise onap_test_exceptions.ServiceInstantiateException
- else:
- service_subscription: ServiceSubscription = customer.get_service_subscription_by_service_type(self.service_name)
- self._service_instance: ServiceInstance = service_subscription.get_service_instance_by_name(self.service_instance_name)
+
+ service_subscription: ServiceSubscription = customer.get_service_subscription_by_service_type(self.service_name)
+ self._service_instance: ServiceInstance = service_subscription.get_service_instance_by_name(self.service_instance_name)
@YamlTemplateBaseStep.store_state(cleanup=True)
def cleanup(self) -> None:
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@property
def service_name(self) -> str:
"""Service name.
"""
return self.parent.yaml_template[self.parent.service_name]
+ @property
+ def model_yaml_template(self) -> dict:
+ return {}
+
@YamlTemplateBaseStep.store_state
def execute(self):
"""Onboard PNFs from YAML template."""
"""
super().__init__(cleanup=cleanup)
self._yaml_template: dict = None
+ self._model_yaml_template: dict = None
if "vnfs" in self.yaml_template[self.service_name]:
self.add_step(YamlTemplateVfOnboardStep(cleanup=cleanup))
if "pnfs" in self.yaml_template[self.service_name]:
dict: Step YAML template
"""
- if self.is_root:
+ if settings.MODEL_YAML_TEMPLATE:
+ return self.model_yaml_template
+ elif self.is_root:
if not self._yaml_template:
with open(settings.SERVICE_YAML_TEMPLATE, "r") as yaml_template:
self._yaml_template: dict = load(yaml_template)
return self._yaml_template
return self.parent.yaml_template
+ @property
+ def model_yaml_template(self) -> dict:
+ """Step Model YAML template.
+
+ Load from file if it's a root step, get from parent otherwise.
+
+ Returns:
+ dict: Step YAML template
+
+ """
+ if self.is_root:
+ if not self._model_yaml_template:
+ with open(settings.MODEL_YAML_TEMPLATE, "r") as model_yaml_template:
+ self._model_yaml_template: dict = load(model_yaml_template)
+ return self._model_yaml_template
+ return self.parent.model_yaml_template
+
@property
def service_name(self) -> str:
"""Service name.
dict: YAML template
"""
- return self.parent.yaml_template[self.parent.service_name]
+ if settings.MODEL_YAML_TEMPLATE:
+ return self.model_yaml_template
+ else:
+ return self.parent.yaml_template[self.parent.service_name]
+
+ @property
+ def model_yaml_template(self) -> dict:
+ """Step Model YAML template.
+
+ Load from file if it's a root step, get from parent otherwise.
+
+ Returns:
+ dict: Step YAML template
+
+ """
+ return self.parent.model_yaml_template[self.parent.service_name]
@YamlTemplateBaseStep.store_state
def execute(self):
dict: YAML template
"""
- return self.parent.yaml_template
+ if settings.MODEL_YAML_TEMPLATE:
+ return self.model_yaml_template
+ else:
+ return self.parent.yaml_template
+
+ @property
+ def model_yaml_template(self) -> dict:
+ """Model YAML template.
+
+ Get model YAML template from parent.
+
+ Returns:
+ dict: YAML template
+
+ """
+ return self.parent.model_yaml_template
@YamlTemplateBaseStep.store_state
def execute(self):
--- /dev/null
+---
+{{ service_name }}:
+ instantiation_type: "Macro"
+ vnfs:
+ - vnf_name: {{ service_name }}VF0
+ properties:
+ controller_actor: "CDS"
+ skip_post_instantiation_configuration: False
+ sdnc_artifact_name: "UbuntuVNF"
+ sdnc_model_version: "1.0.0"
+ sdnc_model_name: "UbuntuVNF"
+ vnf_artifact_type: "CONTROLLER_BLUEPRINT_ARCHIVE"
+ vnf_artifact_name: "UBUNTUVNF_enriched.zip"
+ vnf_artifact_label: "UbuntuVNF"
+ vnf_artifact_file_path: "/tmp/UBUNTUVNF_enriched.zip"
+ heat_files_to_upload: onaptests/templates/heat-files/nso_ubuntu/nso_ubuntu.zip
--- /dev/null
+---
+{{ service_name }}:
+ subscription_service_type: {{ service_name }}
+ vnfs:
+ - model_name: {{ service_name }}VF0
+ vnf_name: {{ service_name }}00
+ parameters:
+ vnf-name: "multi_vnf_ubuntu_0_0"
+ vnf_name: "MultiVnfUbuntu00"
+ vf_modules:
+ - vf_module_name: {{ service_name }}00network0
+ model_name: base
+ parameters:
+ name: "multi_vnf_ubuntu_0_0_network_0"
+ cidr: "10.10.10.0/24"
+ - model_name: {{ service_name }}VF0
+ vnf_name: {{ service_name }}01
+ parameters:
+ vnf-name: "multi_vnf_ubuntu_0_1"
+ vnf_name: "MultiVnfUbuntu01"
+ vf_modules:
+ - vf_module_name: {{ service_name }}01vfm0
+ model_name: ubuntu-vf-module
+ parameters:
+ name: "multi_vnf_ubuntu_0_1_vfm_0"
+ network_mgmt: "vlan197_net"
+ key_name: "sebastien"
+ network_name: "multi_vnf_ubuntu_0_0_network_0"
+ - vf_module_name: {{ service_name }}01vfm1
+ model_name: ubuntu-vf-module
+ parameters:
+ name: "multi_vnf_ubuntu_0_1_vfm_1"
+ network_mgmt: "vlan197_net"
+ key_name: "sebastien"
+ network_name: "multi_vnf_ubuntu_0_0_network_0"