--- /dev/null
+#!/usr/bin/env python3
+###
+# ============LICENSE_START===================================================
+# ORAN SMO PACKAGE - PYTHONSDK TESTS
+# ================================================================================
+# Copyright (C) 2021 Samsung Electronics
+# Copyright (C) 2022 AT&T Intellectual Property. All rights
+# reserved.
+# ============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=====================================================
+#
+###
+"""Onap Sdc module."""
+from time import sleep
+import onapsdk.constants as const
+from onapsdk.configuration import settings
+from onapsdk.exceptions import APIError, ResourceNotFound
+from onapsdk.onap_service import OnapService as Onap
+from onapsdk.sdc.properties import Input, NestedInput, ParameterError
+
+from onapsdk.sdc.vf import Vf
+from onapsdk.sdc.vsp import Vsp
+from onapsdk.sdc.vfc import Vfc
+from onapsdk.sdc.vendor import Vendor
+from oransdk.sdc.category_management import OranServiceCategory
+from oransdk.sdc.service import OranService
+
+class SdcTemplate(Onap):
+ """Onap Sdc Template class."""
+
+ def healthcheck(self) -> dict:
+ """Healchcheck SDC components.
+
+ Returns:
+ status of SDC components
+ """
+ status = self.send_message_json("GET",
+ "SDC Healchcheck",
+ f"{settings.SDC_FE_URL}/sdc1/feProxy/rest/healthCheck")
+
+ return status
+
+ def create_service_category(self, category_names) -> None:
+ """Create service category by names.
+
+ Args:
+ category_names : The list of category names
+ """
+ for cn in category_names:
+ self._logger.info('creating service category [%s]', cn)
+ OranServiceCategory.create(name=cn)
+
+
+ def create_vendor(self, vendor_name) -> dict:
+ """Create Vendor by names.
+
+ Args:
+ vendor_name : The vendor names
+ Returns:
+ the vendor
+ """
+ vendor = Vendor(vendor_name)
+ vendor.create()
+ try:
+ vendor.onboard()
+ except APIError as e:
+ self._logger.error("Exception during vendor onboarding: %s", e)
+ raise e
+ return vendor
+
+ def create_vsp(self, name, vendor, onboard=False) -> dict:
+ """Create vsp.
+
+ Args:
+ name : The vsp name
+ vendor : The vendor name
+ onboard : The onboard flag
+ Returns:
+ the vsp
+ """
+ self._logger.info("creating vsp: [%s:%s]", name, vendor)
+ retry = 0
+ done = False
+
+ vsp = Vsp(name=name, vendor=vendor)
+ if onboard:
+ while not done:
+ try:
+ vsp.create()
+ vsp.onboard()
+ except ResourceNotFound as e:
+ self._logger.error("Failed to onboard %s : %s", name, e)
+ retry = retry + 1
+ if retry >= 5:
+ raise e
+ except APIError as e:
+ self._logger.error("Exception during vsp onboarding: %s", e)
+ raise e
+ else:
+ done = True
+ return vsp
+
+
+ def create_vf(self, name, category, subcategory, vendor, onboard=False) -> dict:
+ """Create vf.
+
+ Args:
+ name : The vf name
+ category : The category name
+ subcategory : The subcategory name
+ vendor : The vendor name
+ onboard : The onboard flag
+ Returns:
+ the vf
+ """
+ self._logger.error("create vf: [%s:%s]", name, category)
+
+ vfc = Vfc('AllottedResource') # seemd incorrect
+ vf = Vf(name=name, category=category, subcategory=subcategory, vendor=vendor)
+ self._logger.error("create vf 2: ")
+ vf.create()
+ if vf.status == const.DRAFT:
+ vf.add_resource(vfc)
+ self._logger.error("create vf 3:")
+ if onboard:
+ self.onboard_vf(vf)
+ return vf
+
+
+ def onboard_vf(self, vf) -> None:
+ """Onboard the vf.
+
+ Args:
+ vf : The vf to onboard
+ """
+ retry = 0
+ done = False
+ to = 2
+
+ while not done:
+ try:
+ vf.onboard()
+ except ResourceNotFound as e:
+ retry += 1
+ if retry > 5:
+ raise e
+ sleep(to)
+ to = 2 * to + 1
+ else:
+ done = True
+ self._logger.info("onboarded vf: [%s]", vf.name)
+
+
+ def create_service(self, name, category, vnfs=None, properties=None, inputs=None, role=None, service_type=None) -> dict:
+ """Create service.
+
+ Args:
+ name : The service name
+ category : The category name
+ vnfs : The list of vnfs
+ properties : the list of properties
+ role : the role value
+ service_type : the service type
+ Returns:
+ the created service
+ """
+ self._logger.info("create service: [%s:%s]", name, category)
+ retry = 0
+ done = False
+
+ if vnfs is None:
+ vnfs = []
+ if properties is None:
+ properties = []
+
+ srvc = OranService(name=name, category=category, properties=properties, inputs=inputs, role=role, service_type=service_type)
+ srvc.create()
+
+ while not done:
+ try:
+ if srvc.status == const.DRAFT:
+ for vnf in vnfs:
+ srvc.add_resource(vnf)
+
+ if srvc.status != const.DISTRIBUTED:
+ srvc.onboard()
+ except ResourceNotFound as e:
+ retry += 1
+ if retry > 5:
+ raise e
+ else:
+ done = True
+
+ return srvc
+
+ def create_service_1(self, name, category, vnfs=None, properties=None, inputs=None, complex_input=None, role=None, service_type=None) -> dict:
+ """Create slicing profile service.
+
+ Args:
+ name : The service name
+ category : The category name
+ vnfs : The list of vnfs
+ properties : the list of properties
+ inputs : the list of inputs
+ complex_input : the predefined property type, that should be declared as input
+ role : the role value
+ service_type : the service type
+ Returns:
+ the created service
+ """
+ self._logger.info("create service: [%s:%s]", name, category)
+ retry = 0
+ done = False
+
+ if vnfs is None:
+ vnfs = []
+ if properties is None:
+ properties = []
+
+ srvc = OranService(name=name, category=category, inputs=inputs, complex_input=complex_input, properties=properties, role=role, service_type=service_type)
+ srvc.create()
+
+ while not done:
+ try:
+ if srvc.status == const.DRAFT:
+ for vnf in vnfs:
+ srvc.add_resource(vnf)
+ for c in srvc.components:
+ self.set_property_input_slice_ar(vnf, srvc, c)
+
+ if srvc.status != const.DISTRIBUTED:
+ srvc.onboard()
+ except ResourceNotFound as e:
+ retry += 1
+ if retry > 5:
+ raise e
+ else:
+ done = True
+
+ return srvc
+
+ def set_property_input_slice_ar(self, vnf, service, component) -> None:
+ """Get component property.
+
+ Args:
+ vnf: The vnf of the input
+ service : The service
+ component : The component
+ """
+ self._logger.info("set property input slice ar: %s", component.name)
+ if component.name.startswith("Slice_AR"):
+ self._logger.info("get component Slice_AR 0")
+ cp = self.get_component_property(component, 'allottedresource0_providing_service_invariant_uuid')
+ if cp:
+ self._logger.info('setting value on property [%s]', cp)
+ service.declare_input(NestedInput(sdc_resource=vnf, input_obj=Input(unique_id="123",
+ input_type=cp.property_type,
+ name=cp.name,
+ sdc_resource=vnf)))
+ else:
+ raise ParameterError('no property providing_service_invariant_uuid found')
+
+ cp = self.get_component_property(component, 'allottedresource0_providing_service_uuid')
+ if cp:
+ service.declare_input(NestedInput(sdc_resource=vnf, input_obj=Input(unique_id="123",
+ input_type=cp.property_type,
+ name=cp.name,
+ sdc_resource=vnf)))
+ else:
+ raise ParameterError('no property providing_service_uuid found')
+
+ def get_component_property(self, component, name) -> dict:
+ """Get component property.
+
+ Args:
+ component : The component
+ name : The property name
+ Returns:
+ the property
+ """
+ prop = None
+ try:
+ prop = list(filter(lambda x: x.name == name, component.properties))
+ if prop:
+ prop = prop[0]
+ else:
+ raise ParameterError('no property found')
+ except ParameterError as e:
+ self._logger.error("component [%s] has no property [%s]", component.name, name)
+ raise e
+
+ self._logger.error("retrived property [%s] for component [%s]", prop.name if prop else 'null', component.name)
+ return prop