1 # ============LICENSE_START=======================================================
2 # Copyright (C) 2020 Orange
3 # ================================================================================
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # ============LICENSE_END=========================================================
20 from io import BytesIO
21 from time import sleep
22 from uuid import uuid4
26 from config import Config
27 from onapsdk.aai.cloud_infrastructure import (
30 from onapsdk.aai.business import (
32 OwningEntity as AaiOwningEntity
34 from onapsdk.msb.k8s import Definition
36 from onapsdk.so.instantiation import (
38 InstantiationParameter, VnfParameters, VfmoduleParameters)
39 from onapsdk.sdc.service import Service
40 from onapsdk.vid import LineOfBusiness, OwningEntity, Platform, Project
41 from onapsdk.so.so_element import OrchestrationRequest
43 logger = logging.getLogger("")
44 logger.setLevel(logging.DEBUG)
45 fh = logging.StreamHandler()
46 fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
47 fh.setFormatter(fh_formatter)
50 logger.info("*******************************")
51 logger.info("**** SERVICE INSTANTIATION ****")
52 logger.info("*******************************")
54 logger.info("******** Create Customer *******")
56 for found_customer in list(Customer.get_all()):
57 logger.debug("Customer %s found", found_customer.subscriber_name)
58 if found_customer.subscriber_name == Config.GLOBAL_CUSTOMER_ID:
59 logger.info("Customer %s found", found_customer.subscriber_name)
60 customer = found_customer
63 customer = Customer.create(Config.GLOBAL_CUSTOMER_ID, Config.GLOBAL_CUSTOMER_ID, "INFRA")
65 logger.info("******** Find Service in SDC *******")
67 services = Service.get_all()
68 for found_service in services:
69 logger.debug("Service %s is found, distribution %s", found_service.name, found_service.distribution_status)
70 if found_service.name == Config.SERVICENAME:
71 logger.info("Found Service %s in SDC", found_service.name)
72 service = found_service
76 logger.error("Service %s not found in SDC", Config.SERVICENAME)
79 logger.info("******** Check Service Subscription *******")
80 service_subscription = None
81 for service_sub in customer.service_subscriptions:
82 logger.debug("Service subscription %s is found", service_sub.service_type)
83 if service_sub.service_type == Config.SERVICENAME:
84 logger.info("Service %s subscribed", Config.SERVICENAME)
85 service_subscription = service_sub
88 if not service_subscription:
89 logger.info("******** Subscribe Service *******")
90 customer.subscribe_service(service)
92 logger.info("******** Get Tenant *******")
93 cloud_region = CloudRegion(cloud_owner=Config.CLOUD_OWNER, cloud_region_id=Config.CLOUD_REGION,
94 orchestration_disabled=True, in_maint=False)
96 for found_tenant in cloud_region.tenants:
97 logger.debug("Tenant %s found in %s_%s", found_tenant.name, cloud_region.cloud_owner, cloud_region.cloud_region_id)
98 if found_tenant.name == Config.TENANT_NAME:
99 logger.info("Found my Tenant %s", found_tenant.name)
100 tenant = found_tenant
104 logger.error("tenant %s not found", Config.TENANT_NAME)
107 logger.info("******** Connect Service to Tenant *******")
108 service_subscription = None
109 for service_sub in customer.service_subscriptions:
110 logger.debug("Service subscription %s is found", service_sub.service_type)
111 if service_sub.service_type == Config.SERVICENAME:
112 logger.info("Service %s subscribed", Config.SERVICENAME)
113 service_subscription = service_sub
116 if not service_subscription:
117 logger.error("Service subscription %s is not found", Config.SERVICENAME)
120 service_subscription.link_to_cloud_region_and_tenant(cloud_region, tenant)
122 logger.info("******** Add Business Objects (OE, P, Pl, LoB) in VID *******")
123 vid_owning_entity = OwningEntity.create(Config.OWNING_ENTITY)
124 vid_project = Project.create(Config.PROJECT)
125 vid_platform = Platform.create(Config.PLATFORM)
126 vid_line_of_business = LineOfBusiness.create(Config.LINE_OF_BUSINESS)
128 logger.info("******** Add Owning Entity in AAI *******")
130 for oe in AaiOwningEntity.get_all():
131 if oe.name == vid_owning_entity.name:
134 if not owning_entity:
135 logger.info("******** Owning Entity not existing: create *******")
136 owning_entity = AaiOwningEntity.create(vid_owning_entity.name, str(uuid4()))
138 logger.info("******** Delete old profiles ********")
139 for vnf in service.vnfs:
140 for vf_module in vnf.vf_modules:
141 definition = Definition.get_definition_by_name_version(vf_module.metadata["vfModuleModelInvariantUUID"],
142 vf_module.metadata["vfModuleModelUUID"])
143 vf_module_label = vf_module.properties["vf_module_label"]
144 if vf_module_label == "base_template_dummy_ignore":
146 profile_name = Config.VF_MODULE_LIST[vf_module_label]["k8s-rb-profile-name"]
148 profile = definition.get_profile_by_name(profile_name)
149 if profile.namespace != Config.VF_MODULE_LIST[vf_module_label]["k8s-rb-profile-namespace"]:
151 logger.info("Profile: " + profile_name + " for " + vf_module.name + " deleted")
153 logger.info("No need to delete Profile " + profile_name +
154 " for " + vf_module.name + ". Namespace is fine")
156 logger.info("Profile: " + profile_name + " for " + vf_module.name + " not found")
158 # Read SDNC MODEL NAME and VERSION from CBA.zip
159 logger.info("*******************************")
160 logger.info("Retrieving SDNC MODEL NAME and VERSION")
161 logger.info("*******************************")
162 with zipfile.ZipFile(Config.VSPFILE, 'r') as package:
163 cba_io = BytesIO(package.read("CBA.zip"))
164 with zipfile.ZipFile(cba_io) as cba:
165 with cba.open('TOSCA-Metadata/TOSCA.meta') as meta_file:
166 tosca_meta = yaml.load(meta_file, Loader=yaml.FullLoader)
167 SDNC_MODEL_NAME = tosca_meta.get("Template-Name")
168 SDNC_MODEL_VERSION = tosca_meta.get("Template-Version")
170 logger.info("******** Instantiate Service *******")
171 service_instance = None
172 service_instantiation = None
173 for se in service_subscription.service_instances:
174 if se.instance_name == Config.SERVICE_INSTANCE_NAME:
175 service_instance = se
177 if not service_instance:
178 logger.info("******** Service Instance not existing: Instantiate *******")
179 # Instantiate service
180 vfmodules_list = Config.VF_MODULE_LIST
183 InstantiationParameter(name="sdnc_model_name", value=SDNC_MODEL_NAME),
184 InstantiationParameter(name="sdnc_model_version", value=SDNC_MODEL_VERSION),
185 InstantiationParameter(name="sdnc_artifact_name", value=Config.SDNC_ARTIFACT_NAME)]
188 for vfmodule in vfmodules_list:
190 InstantiationParameter(name="k8s-rb-profile-name", value=vfmodules_list[vfmodule]["k8s-rb-profile-name"]),
191 InstantiationParameter(name="k8s-rb-profile-namespace", value=vfmodules_list[vfmodule]["k8s-rb-profile-namespace"]),
192 InstantiationParameter(name="sdnc_model_name", value=SDNC_MODEL_NAME),
193 InstantiationParameter(name="sdnc_model_version", value=SDNC_MODEL_VERSION),
194 InstantiationParameter(name="vf_module_label", value=vfmodules_list[vfmodule]["name"])]
196 vfmodules_param.append(VfmoduleParameters(vfmodules_list[vfmodule]["name"], params))
198 vnf_params = VnfParameters(name=Config.VFNAME, vnf_parameters=vnf_param, vfmodule_parameters=vfmodules_param)
200 service_instantiation = ServiceInstantiation.instantiate_macro(
202 cloud_region=cloud_region,
205 owning_entity=owning_entity,
207 line_of_business=vid_line_of_business,
208 platform=vid_platform,
209 service_instance_name=Config.SERVICE_INSTANCE_NAME,
210 vnf_parameters=[vnf_params]
213 while not (status == OrchestrationRequest.StatusEnum.COMPLETED
214 or status == OrchestrationRequest.StatusEnum.FAILED):
216 status = service_instantiation.status
217 logger.info(f"Orchestration status is: {status.value}")