9216f45752766fc5fbc52f50c3d327ae7bc9448d
[osm/IM.git] / osm_im / im_translation.py
1 # -*- coding: utf-8 -*-
2
3 # Copyright 2020 Whitestack, LLC
4 # *************************************************************
5 #
6 # This file is part of OSM common repository.
7 # All Rights Reserved to Whitestack, LLC
8 #
9 # Licensed under the Apache License, Version 2.0 (the "License"); you may
10 # not use this file except in compliance with the License. You may obtain
11 # a copy of the License at
12 #
13 # http://www.apache.org/licenses/LICENSE-2.0
14 #
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18 # License for the specific language governing permissions and limitations
19 # under the License.
20 #
21 # For those usages not covered by the Apache License, Version 2.0 please
22 # contact: agarcia@whitestack.com
23 ##
24
25 from osm_im.validation import Validation, ValidationException
26
27
28 class TranslationException(Exception):
29 pass
30
31
32 # ******************** Translation public functions ********************
33
34 def translate_im_model_to_sol006(im_model_data):
35 _validate_im_model(im_model_data)
36 descriptor_type = _get_im_model_descriptor_type(im_model_data)
37 if descriptor_type == "vnfd":
38 return translate_im_vnfd_to_sol006(im_model_data)
39 if descriptor_type == "nsd":
40 return translate_im_nsd_to_sol006(im_model_data)
41 # For sanity, should not happen
42 raise TranslationException("Error in translation: cannot determine the type of OSM-IM descriptor. Found {}, "
43 "expected one of: vnfd:vnfd-catalog, vnfd-catalog, nsd:nsd-catalog, nsd-catalog."
44 .format(descriptor_type))
45
46
47 def translate_im_vnfd_to_sol006(im_vnfd):
48 im_vnfd = _remove_im_vnfd_envelope(im_vnfd)
49 sol006_vnfd = {}
50 _add_im_vnfd_basic_data_to_sol006_vnfd(im_vnfd, sol006_vnfd)
51 _add_im_vnfd_mgmt_interface_cp_to_sol006_vnfd(im_vnfd, sol006_vnfd)
52 _add_im_vdu_flavors_to_sol006_vnfd(im_vnfd, sol006_vnfd)
53 _add_im_vdu_guest_epa_to_sol006_vnfd(im_vnfd, sol006_vnfd)
54 _add_im_vdu_images_to_sol006_vnfd(im_vnfd, sol006_vnfd)
55 _add_im_vdus_to_sol006_vnfd(im_vnfd, sol006_vnfd)
56 _add_im_internal_vlds_to_sol006_vfnd(im_vnfd, sol006_vnfd)
57 _add_im_vnf_configuration_to_sol006_vnfd(im_vnfd, sol006_vnfd)
58 _add_im_ip_profiles_to_sol006_vnfd(im_vnfd, sol006_vnfd)
59 _add_im_vdu_monitoring_params_to_sol006_vnfd(im_vnfd, sol006_vnfd)
60 _add_im_scaling_group_descriptors_to_sol006_vnfd(im_vnfd, sol006_vnfd)
61 _add_im_kdus_to_sol006_vnfd(im_vnfd, sol006_vnfd)
62 _add_im_k8s_clusters_to_sol006_vnfd(im_vnfd, sol006_vnfd)
63 _add_im_placement_groups_to_sol006_vnfd(im_vnfd, sol006_vnfd)
64 return {"vnfd": sol006_vnfd}
65
66
67 def translate_im_nsd_to_sol006(im_nsd):
68 im_nsd = _remove_im_nsd_envelope(im_nsd)
69 sol006_nsd = {}
70 _add_im_nsd_basic_data_to_sol006_nsd(im_nsd, sol006_nsd)
71 _add_im_constituent_vnfds_to_sol006_nsd(im_nsd, sol006_nsd)
72 _add_im_vlds_to_sol006_nsd(im_nsd, sol006_nsd)
73 return {"nsd": {"nsd": [sol006_nsd]}}
74
75
76 # ******************** Common translation private functions ********************
77
78 def _validate_im_model(im_model_data):
79 descriptor_type = _get_im_model_descriptor_type(im_model_data)
80 try:
81 Validation().pyangbind_validation(descriptor_type, im_model_data)
82 except ValidationException as e:
83 raise TranslationException("Error on input model validation: {}".format(str(e)))
84
85
86 def _get_im_model_descriptor_type(im_model_data):
87 data_root = list(im_model_data.keys())[0]
88 if "vnfd" in data_root:
89 return "vnfd"
90 if "nsd" in data_root:
91 return "nsd"
92 raise TranslationException("Error in translation: cannot determine the type of OSM-IM descriptor. Found {}, "
93 "expected one of: vnfd:vnfd-catalog, vnfd-catalog, nsd:nsd-catalog, nsd-catalog."
94 .format(data_root))
95
96
97 # ******************** VNFD translation private functions ********************
98
99 def _remove_im_vnfd_envelope(im_vnfd):
100 # Data is wrapped as { vnfd-catalog: { vnfd: [ <data> ] } }
101 return list(im_vnfd.values())[0]["vnfd"][0]
102
103
104 def _add_im_vnfd_basic_data_to_sol006_vnfd(im_vnfd, sol006_vnfd):
105 sol006_vnfd["id"] = im_vnfd["id"]
106 if im_vnfd.get("name"):
107 sol006_vnfd["product-name"] = im_vnfd["name"]
108 if im_vnfd.get("description"):
109 sol006_vnfd["description"] = im_vnfd["description"]
110 if im_vnfd.get("vendor"):
111 sol006_vnfd["provider"] = im_vnfd["vendor"]
112 if im_vnfd.get("version"):
113 sol006_vnfd["version"] = im_vnfd["version"]
114
115
116 def _add_im_vnfd_mgmt_interface_cp_to_sol006_vnfd(im_vnfd, sol006_vnfd):
117 sol006_vnfd["mgmt-cp"] = "{}-ext".format(im_vnfd["mgmt-interface"]["cp"])
118
119
120 def _add_im_vdu_flavors_to_sol006_vnfd(im_vnfd, sol006_vnfd):
121 storage_descriptors = []
122 compute_descriptors = []
123 for vdu in im_vnfd.get("vdu", ()):
124 vdu_id = vdu.get("id")
125 vdu_flavor = vdu.get("vm-flavor")
126 if not vdu_flavor:
127 continue
128 storage_descriptor = {"id": "{}-storage".format(vdu_id)}
129 compute_descriptor = {"id": "{}-compute".format(vdu_id)}
130 if vdu_flavor.get("storage-gb"):
131 storage_descriptor["size-of-storage"] = int(vdu_flavor["storage-gb"])
132 storage_descriptors.append(storage_descriptor)
133 if vdu_flavor.get("vcpu-count"):
134 compute_descriptor["virtual-cpu"] = {"num-virtual-cpu": int(vdu_flavor["vcpu-count"])}
135 if vdu_flavor.get("memory-mb"):
136 compute_descriptor["virtual-memory"] = {"size": float(vdu_flavor["memory-mb"]) / 1024.0}
137 if len(compute_descriptor) > 1:
138 compute_descriptors.append(compute_descriptor)
139 if len(storage_descriptors) > 0:
140 sol006_vnfd["virtual-storage-desc"] = storage_descriptors
141 if len(compute_descriptors) > 0:
142 sol006_vnfd["virtual-compute-desc"] = compute_descriptors
143
144
145 def _add_im_vdu_guest_epa_to_sol006_vnfd(im_vnfd, sol006_vnfd):
146 for vdu in im_vnfd.get("vdu", ()):
147 vdu_guest_epa = vdu.get("guest-epa")
148 if not vdu_guest_epa:
149 continue
150
151 _add_im_vdu_guest_epa_memory_and_cpu_to_sol006_vnfd(vdu, sol006_vnfd)
152 _add_im_vdu_guest_epa_disk_io_to_sol006_vnfd(vdu, sol006_vnfd)
153
154
155 def _add_im_vdu_guest_epa_memory_and_cpu_to_sol006_vnfd(im_vdu, sol006_vnfd):
156 vdu_guest_epa = im_vdu.get("guest-epa")
157 virtual_memory = _get_virtual_memory_from_im_vdu_guest_epa(vdu_guest_epa)
158 virtual_cpu = _get_virtual_cpu_from_im_vdu_guest_epa(vdu_guest_epa)
159 # Find this vdu compute descriptor and update it with the EPA options. If the
160 # vdu compute descriptor does not exist, create one with the EPA options only.
161 compute_descriptor_id = "{}-compute".format(im_vdu["id"])
162 compute_descriptor = {"id": compute_descriptor_id}
163 compute_descriptor_found = False
164 for vcd in sol006_vnfd.get("virtual-compute-desc", ()):
165 if vcd.get("id") == compute_descriptor_id:
166 compute_descriptor = vcd
167 compute_descriptor_found = True
168
169 compute_descriptor_virtual_memory = compute_descriptor.get("virtual-memory", {})
170 compute_descriptor_virtual_cpu = compute_descriptor.get("virtual-cpu", {})
171 compute_descriptor_virtual_memory.update(virtual_memory)
172 compute_descriptor_virtual_cpu.update(virtual_cpu)
173 if compute_descriptor_virtual_memory:
174 compute_descriptor["virtual-memory"] = compute_descriptor_virtual_memory
175 if compute_descriptor_virtual_cpu:
176 compute_descriptor["virtual-cpu"] = compute_descriptor_virtual_cpu
177
178 if not compute_descriptor_found:
179 if sol006_vnfd.get("virtual-compute-desc"):
180 sol006_vnfd["virtual-compute-desc"].append(compute_descriptor)
181 else:
182 sol006_vnfd["virtual-compute-desc"] = [compute_descriptor]
183
184
185 def _add_im_vdu_guest_epa_disk_io_to_sol006_vnfd(im_vdu, sol006_vnfd):
186 vdu_guest_epa = im_vdu.get("guest-epa")
187 disk_io_quota = vdu_guest_epa.get("disk-io-quota", {})
188 if not disk_io_quota:
189 return
190 # Find this vdu storage descriptor and update it with the EPA options. If the
191 # vdu storage descriptor does not exist, create one with the EPA options only.
192 storage_descriptor_id = "{}-storage".format(im_vdu["id"])
193 storage_descriptor = {"id": storage_descriptor_id}
194 storage_descriptor_found = False
195 for vsd in sol006_vnfd.get("virtual-storage-desc", ()):
196 if vsd.get("id") == storage_descriptor_id:
197 storage_descriptor = vsd
198 storage_descriptor_found = True
199
200 storage_descriptor["disk-io-quota"] = disk_io_quota
201 if not storage_descriptor_found:
202 if sol006_vnfd.get("virtual-storage-desc"):
203 sol006_vnfd["virtual-storage-desc"].append(storage_descriptor)
204 else:
205 sol006_vnfd["virtual-storage-desc"] = [storage_descriptor]
206
207
208 def _get_virtual_memory_from_im_vdu_guest_epa(im_vdu_guest_epa):
209 virtual_memory = {}
210 if im_vdu_guest_epa.get("mempage-size"):
211 virtual_memory["mempage-size"] = im_vdu_guest_epa["mempage-size"]
212 if im_vdu_guest_epa.get("numa-node-policy"):
213 virtual_memory["numa-enabled"] = True
214 virtual_memory["numa-node-policy"] = im_vdu_guest_epa["numa-node-policy"]
215 if im_vdu_guest_epa.get("mem-quota"):
216 virtual_memory["mem-quota"] = im_vdu_guest_epa["mem-quota"]
217 return virtual_memory
218
219
220 def _get_virtual_cpu_from_im_vdu_guest_epa(im_vdu_guest_epa):
221 virtual_cpu = {}
222 if im_vdu_guest_epa.get("cpu-pinning-policy") or im_vdu_guest_epa.get("cpu-thread-pinning-policy"):
223 virtual_cpu["pinning"] = {}
224 if im_vdu_guest_epa.get("cpu-pinning-policy"):
225 if im_vdu_guest_epa["cpu-pinning-policy"] == "SHARED":
226 virtual_cpu["pinning"]["policy"] = "dynamic"
227 else:
228 virtual_cpu["pinning"]["policy"] = "static"
229 if im_vdu_guest_epa.get("cpu-thread-pinning-policy"):
230 virtual_cpu["pinning"]["thread-policy"] = im_vdu_guest_epa["cpu-thread-pinning-policy"]
231 if im_vdu_guest_epa.get("cpu-quota"):
232 virtual_cpu["cpu-quota"] = im_vdu_guest_epa["cpu-quota"]
233 return virtual_cpu
234
235
236 def _add_im_vdu_images_to_sol006_vnfd(im_vnfd, sol006_vnfd):
237 image_descriptors = []
238 all_images = set() # To avoid duplicated images
239 for vdu in im_vnfd.get("vdu", ()):
240 vdu_image = vdu.get("image")
241 if vdu_image and vdu_image not in all_images:
242 image_descriptors.append({"id": vdu_image, "name": vdu_image, "image": vdu_image})
243 all_images.add(vdu_image)
244 for alternative_image in vdu.get("alternative-images", ()):
245 alt_image = alternative_image.get("image")
246 alt_image_descriptor = {"id": alt_image, "name": alt_image, "image": alt_image}
247 if alternative_image.get("vim-type"):
248 alt_image_descriptor["vim-type"] = alternative_image["vim-type"]
249 if alt_image not in all_images:
250 image_descriptors.append(alt_image_descriptor)
251 all_images.add(alt_image)
252
253 if len(image_descriptors) > 0:
254 sol006_vnfd["sw-image-desc"] = image_descriptors
255
256
257 def _add_im_vdus_to_sol006_vnfd(im_vnfd, sol006_vnfd):
258 vdus = []
259 ext_cpds = []
260 vdu_configurations = []
261 df_instantiation_level = {"id": "default-instantiation-level", "vdu-level": []}
262 df = {"id": "default-df", "vdu-profile": [], "instantiation-level": [df_instantiation_level]}
263 for vdu in im_vnfd.get("vdu", ()):
264 vdu_descriptor = {"id": vdu["id"]}
265 if vdu.get("description"):
266 vdu_descriptor["description"] = vdu["description"]
267 if vdu.get("name"):
268 vdu_descriptor["name"] = vdu["name"]
269 if vdu.get("cloud-init-file"):
270 vdu_descriptor["cloud-init-file"] = vdu["cloud-init-file"]
271 if vdu.get("supplemental-boot-data"):
272 vdu_descriptor["supplemental-boot-data"] = vdu["supplemental-boot-data"]
273 if vdu.get("alarm"):
274 vdu_descriptor["alarm"] = vdu["alarm"]
275 if vdu.get("pdu-type"):
276 vdu_descriptor["pdu-type"] = vdu["pdu-type"]
277
278 _add_im_vdu_images_to_sol006_vdu(vdu, vdu_descriptor)
279 _add_im_vdu_flavor_to_sol006_vdu(vdu, vdu_descriptor)
280
281 vdu_int_cpds, vdu_ext_cpds = _get_int_and_ext_cpds_from_im_vdu(vdu, im_vnfd)
282 vdu_descriptor["int-cpd"] = vdu_int_cpds
283 ext_cpds.extend(vdu_ext_cpds)
284
285 vdu_profile = _get_vdu_profile_from_im_vdu(vdu, im_vnfd)
286 vdu_level = _get_instantiation_level_vdu_level_from_im_vdu(vdu)
287 if vdu.get("vdu-configuration"):
288 vdu_configuration = vdu["vdu-configuration"]
289 vdu_configuration["id"] = "{}-vdu-configuration".format(vdu["id"])
290 vdu_configurations.append(vdu_configuration)
291 df["vdu-profile"].append(vdu_profile)
292 df["instantiation-level"][0]["vdu-level"].append(vdu_level)
293
294 vdus.append(vdu_descriptor)
295
296 if len(vdus) > 0:
297 sol006_vnfd["vdu"] = vdus
298 sol006_vnfd["df"] = [df]
299 if len(ext_cpds) > 0:
300 sol006_vnfd["ext-cpd"] = ext_cpds
301 if len(vdu_configurations) > 0:
302 sol006_vnfd["vdu-configuration"] = vdu_configurations
303
304
305 def _add_im_vdu_images_to_sol006_vdu(im_vdu, sol006_vdu):
306 if im_vdu.get("image"):
307 sol006_vdu["sw-image-desc"] = im_vdu["image"]
308 alternative_images = []
309 for alternative_image in im_vdu.get("alternative-images", ()):
310 alternative_images.append(alternative_image.get("image"))
311 if len(alternative_images) > 0:
312 sol006_vdu["alternative-sw-image-desc"] = alternative_images
313
314
315 def _add_im_vdu_flavor_to_sol006_vdu(im_vdu, sol006_vdu):
316 vdu_flavor = im_vdu.get("vm-flavor")
317 if vdu_flavor:
318 if vdu_flavor.get("vcpu-count") or vdu_flavor.get("memory-mb"):
319 sol006_vdu["virtual-compute-desc"] = "{}-compute".format(im_vdu["id"])
320 if vdu_flavor.get("storage-gb"):
321 sol006_vdu["virtual-storage-desc"] = ["{}-storage".format(im_vdu["id"])]
322
323
324 def _get_int_and_ext_cpds_from_im_vdu(im_vdu, im_vnfd):
325 int_cpds = []
326 ext_cpds = []
327 for interface in im_vdu.get("interface", ()):
328 int_cpd = {"id": "{}-int".format(interface["name"])}
329 virtual_network_interface_requirement = {"name": interface["name"]}
330 if interface.get("virtual-interface"):
331 virtual_network_interface_requirement["virtual-interface"] = interface["virtual-interface"]
332 if "position" in interface:
333 virtual_network_interface_requirement["position"] = int(interface["position"])
334 int_cpd["virtual-network-interface-requirement"] = [virtual_network_interface_requirement]
335 if interface.get("external-connection-point-ref"):
336 ext_cpd = {
337 "id": "{}-ext".format(interface["external-connection-point-ref"]),
338 "int-cpd": {
339 "vdu-id": im_vdu["id"],
340 "cpd": int_cpd["id"]
341 }
342 }
343 for cp in im_vnfd.get("connection-point", ()):
344 if cp.get("name", "") != interface["external-connection-point-ref"]:
345 continue
346 if "port-security-enabled" in cp:
347 ext_cpd["port-security-enabled"] = cp["port-security-enabled"]
348 if cp.get("port-security-disable-strategy"):
349 ext_cpd["port-security-disable-strategy"] = cp["port-security-disable-strategy"]
350 ext_cpds.append(ext_cpd)
351
352 int_cpds.append(int_cpd)
353
354 return int_cpds, ext_cpds
355
356
357 def _get_vdu_profile_from_im_vdu(im_vdu, im_vnfd):
358 vdu_profile = {"id": im_vdu["id"]}
359 initial_instances = int(im_vdu.get("count", 1))
360 vdu_profile["min-number-of-instances"] = initial_instances
361 for scaling_group_descriptor in im_vnfd.get("scaling-group-descriptor", ()):
362 for sgd_vdu in scaling_group_descriptor.get("vdu", []):
363 if sgd_vdu.get("vdu-id-ref") == im_vdu["id"]:
364 sgd_max_instances = int(scaling_group_descriptor.get("max-instance-count", 1))
365 sgd_min_instances = int(scaling_group_descriptor.get("min-instance-count", 0))
366 vdu_profile["min-number-of-instances"] = sgd_min_instances + initial_instances
367 vdu_profile["max-number-of-instances"] = sgd_max_instances + initial_instances
368 if im_vdu.get("vdu-configuration"):
369 vdu_profile["vdu-configuration-id"] = "{}-vdu-configuration".format(im_vdu["id"])
370 return vdu_profile
371
372
373 def _get_instantiation_level_vdu_level_from_im_vdu(im_vdu):
374 vdu_level = {"vdu-id": im_vdu["id"]}
375 vdu_level["number-of-instances"] = int(im_vdu.get("count", 1))
376 return vdu_level
377
378
379 def _add_im_internal_vlds_to_sol006_vfnd(im_vnfd, sol006_vnfd):
380 int_virtual_link_descs = []
381 for ivld in im_vnfd.get("internal-vld", ()):
382 int_virtual_link_desc = {"id": ivld["id"]}
383 _add_im_internal_vld_connection_point_refs_to_sol006_vnfd(ivld, im_vnfd, sol006_vnfd)
384
385 int_virtual_link_descs.append(int_virtual_link_desc)
386
387 if len(int_virtual_link_descs) > 0:
388 sol006_vnfd["int-virtual-link-desc"] = int_virtual_link_descs
389
390
391 def _add_im_internal_vld_connection_point_refs_to_sol006_vnfd(ivld, im_vnfd, sol006_vnfd):
392 all_int_cp_refs_interfaces = {}
393 for vdu in im_vnfd.get("vdu", ()):
394 for interface in vdu.get("interface", ()):
395 int_cp_ref = interface.get("internal-connection-point-ref")
396 if not int_cp_ref:
397 continue
398 all_int_cp_refs_interfaces[int_cp_ref] = (vdu["id"], interface["name"])
399
400 for int_cp in ivld.get("internal-connection-point", ()):
401 int_cp_ref = int_cp["id-ref"]
402 (vdu_id, interface_name) = all_int_cp_refs_interfaces[int_cp_ref]
403 sol006_int_cpd_id = "{}-int".format(interface_name)
404 # Search for this int_cp on sol006_vnfd and update it
405 for vdu in sol006_vnfd.get("vdu", ()):
406 if vdu["id"] != vdu_id:
407 continue
408 for int_cpd in vdu.get("int-cpd", ()):
409 if int_cpd["id"] == sol006_int_cpd_id:
410 int_cpd["int-virtual-link-desc"] = ivld["id"]
411
412
413 def _add_im_vnf_configuration_to_sol006_vnfd(im_vnfd, sol006_vnfd):
414 vnf_configuration = im_vnfd.get("vnf-configuration")
415 if not vnf_configuration:
416 return
417 vnf_configuration["id"] = "default-vnf-configuration"
418 sol006_vnfd["vnf-configuration"] = [vnf_configuration]
419 sol006_vnfd["df"][0]["vnf-configuration-id"] = vnf_configuration["id"]
420
421
422 def _add_im_ip_profiles_to_sol006_vnfd(im_vnfd, sol006_vnfd):
423 all_ivlds_ip_profiles = {}
424 for ivld in im_vnfd.get("internal-vld", ()):
425 if ivld.get("ip-profile-ref"):
426 all_ivlds_ip_profiles[ivld["ip-profile-ref"]] = ivld["id"]
427
428 virtual_link_profiles = []
429 for ip_profile in im_vnfd.get("ip-profiles", ()):
430 virtual_link_profile = {"id": all_ivlds_ip_profiles[ip_profile["name"]], "flavour": ""}
431 ip_profile_params = ip_profile.get("ip-profile-params")
432 if ip_profile_params:
433 l3_protocol_data = {"name": "{}-l3-protocol-data".format(virtual_link_profile["id"])}
434 if ip_profile_params.get("ip-version"):
435 l3_protocol_data["ip-version"] = ip_profile_params["ip-version"]
436 if ip_profile_params.get("subnet-address"):
437 l3_protocol_data["cidr"] = ip_profile_params["subnet-address"]
438 if ip_profile_params.get("gateway-address"):
439 l3_protocol_data["gateway-ip"] = ip_profile_params["gateway-address"]
440 if ip_profile_params.get("security-group"):
441 l3_protocol_data["security-group"] = ip_profile_params["security-group"]
442 if ip_profile_params.get("dhcp-params", {}).get("enabled"):
443 l3_protocol_data["dhcp-enabled"] = ip_profile_params["dhcp-params"]["enabled"]
444 if ip_profile.get("description"):
445 l3_protocol_data["description"] = ip_profile["description"]
446
447 virtual_link_profile["virtual-link-protocol-data"] = {"l3-protocol-data": l3_protocol_data}
448
449 virtual_link_profiles.append(virtual_link_profile)
450
451 if len(virtual_link_profiles) > 0:
452 sol006_vnfd["df"][0]["virtual-link-profile"] = virtual_link_profiles
453
454
455 def _add_im_vdu_monitoring_params_to_sol006_vnfd(im_vnfd, sol006_vnfd):
456 all_vdu_monitoring_param_metrics = {}
457 for vdu in im_vnfd.get("vdu", ()):
458 for monitoring_param in vdu.get("monitoring-param", ()):
459 monitoring_param_metric = monitoring_param.get("nfvi-metric")
460 if monitoring_param_metric:
461 all_vdu_monitoring_param_metrics[(vdu["id"], monitoring_param["id"])] = monitoring_param_metric
462
463 for monitoring_param in im_vnfd.get("monitoring-param", ()):
464 sol006_mp = {"id": monitoring_param["id"]}
465 if monitoring_param.get("name"):
466 sol006_mp["name"] = monitoring_param["name"]
467 if monitoring_param.get("vdu-monitoring-param"):
468 monitoring_param_vdu_id = monitoring_param["vdu-monitoring-param"].get("vdu-ref")
469 monitoring_param_id = monitoring_param["vdu-monitoring-param"].get("vdu-monitoring-param-ref")
470 metric = all_vdu_monitoring_param_metrics.get((monitoring_param_vdu_id, monitoring_param_id))
471 if metric:
472 sol006_mp["performance-metric"] = metric
473 # Find that vdu inside sol006_vnfd and update its monitoring-parameter list
474 for vdu in sol006_vnfd.get("vdu", ()):
475 if vdu["id"] != monitoring_param_vdu_id:
476 continue
477 if vdu.get("monitoring-parameter"):
478 vdu["monitoring-parameter"].append(sol006_mp)
479 else:
480 vdu["monitoring-parameter"] = [sol006_mp]
481
482
483 def _add_im_scaling_group_descriptors_to_sol006_vnfd(im_vnfd, sol006_vnfd):
484 scaling_aspects = []
485 for scaling_group_descriptor in im_vnfd.get("scaling-group-descriptor", ()):
486 scaling_aspect = {"id": scaling_group_descriptor["name"], "name": scaling_group_descriptor["name"]}
487 if scaling_group_descriptor.get("max-instance-count"):
488 scaling_aspect["max-scale-level"] = int(scaling_group_descriptor["max-instance-count"])
489 if scaling_group_descriptor.get("scaling-policy"):
490 scaling_aspect["scaling-policy"] = scaling_group_descriptor["scaling-policy"]
491 if scaling_group_descriptor.get("scaling-config-action"):
492 scaling_aspect["scaling-config-action"] = scaling_group_descriptor["scaling-config-action"]
493
494 delta = {"id": "{}-delta".format(scaling_aspect["id"])}
495 vdu_deltas = []
496 for vdu in scaling_group_descriptor.get("vdu", ()):
497 vdu_delta = {}
498 if vdu.get("count"):
499 vdu_delta["number-of-instances"] = int(vdu["count"])
500 if vdu.get("vdu-id-ref"):
501 vdu_delta["id"] = vdu["vdu-id-ref"]
502 vdu_deltas.append(vdu_delta)
503 if len(vdu_deltas) > 0:
504 delta["vdu-delta"] = vdu_deltas
505 scaling_aspect["aspect-delta-details"] = {"deltas": [delta]}
506
507 scaling_aspects.append(scaling_aspect)
508
509 if len(scaling_aspects) > 0:
510 sol006_vnfd["df"][0]["scaling-aspect"] = scaling_aspects
511
512
513 def _add_im_kdus_to_sol006_vnfd(im_vnfd, sol006_vnfd):
514 if im_vnfd.get("kdu"):
515 sol006_vnfd["kdu"] = im_vnfd["kdu"]
516 if len(sol006_vnfd.get("df", ())) == 0:
517 sol006_vnfd["df"] = [{"id": "default-df"}]
518
519
520 def _add_im_k8s_clusters_to_sol006_vnfd(im_vnfd, sol006_vnfd):
521 im_k8s_cluster = im_vnfd.get("k8s-cluster")
522 if not im_k8s_cluster:
523 return
524
525 sol006_k8s_cluster = {}
526 if im_k8s_cluster.get("version"):
527 sol006_k8s_cluster["version"] = im_k8s_cluster["version"]
528 if im_k8s_cluster.get("cni"):
529 sol006_k8s_cluster["cni"] = im_k8s_cluster["cni"]
530
531 nets = []
532 k8s_cluster_ext_cpds = []
533 for net in im_k8s_cluster.get("nets", ()):
534 if net.get("external-connection-point-ref"):
535 ext_cpd = {"id": "{}-ext".format(net["external-connection-point-ref"]), "k8s-cluster-net": net["id"]}
536 k8s_cluster_ext_cpds.append(ext_cpd)
537 nets.append({"id": net["id"]})
538 if len(nets) > 0:
539 sol006_k8s_cluster["nets"] = nets
540
541 sol006_vnfd["k8s-cluster"] = sol006_k8s_cluster
542 if len(k8s_cluster_ext_cpds) > 0:
543 if not sol006_vnfd.get("ext-cpd"):
544 sol006_vnfd["ext-cpd"] = []
545 sol006_vnfd["ext-cpd"].extend(k8s_cluster_ext_cpds)
546
547
548 def _add_im_placement_groups_to_sol006_vnfd(im_vnfd, sol006_vnfd):
549 if im_vnfd.get("placement-groups"):
550 sol006_vnfd["placement-groups"] = im_vnfd["placement-groups"]
551
552
553 # ******************** NSD translation private functions ********************
554
555 def _remove_im_nsd_envelope(im_nsd):
556 # Data is wrapped as { nsd-catalog: { nsd: [ <data> ] } }
557 return list(im_nsd.values())[0]["nsd"][0]
558
559
560 def _add_im_nsd_basic_data_to_sol006_nsd(im_nsd, sol006_nsd):
561 sol006_nsd["id"] = im_nsd["id"]
562 if im_nsd.get("name"):
563 sol006_nsd["name"] = im_nsd["name"]
564 if im_nsd.get("description"):
565 sol006_nsd["description"] = im_nsd["description"]
566 if im_nsd.get("vendor"):
567 sol006_nsd["designer"] = im_nsd["vendor"]
568 if im_nsd.get("version"):
569 sol006_nsd["version"] = im_nsd["version"]
570
571
572 def _add_im_constituent_vnfds_to_sol006_nsd(im_nsd, sol006_nsd):
573 vnfd_ids = set()
574 for constituent_vnfd in im_nsd.get("constituent-vnfd", ()):
575 if constituent_vnfd.get("vnfd-id-ref"):
576 vnfd_ids.add(constituent_vnfd["vnfd-id-ref"])
577
578 if len(vnfd_ids) > 0:
579 sol006_nsd["vnfd-id"] = list(vnfd_ids)
580
581
582 def _add_im_vlds_to_sol006_nsd(im_nsd, sol006_nsd):
583 vlds = im_nsd.get("vld", [])
584 flattened_vlds = [{**vld, **cp_ref} for vld in vlds for cp_ref in vld.get("vnfd-connection-point-ref", ())]
585 all_vlds_by_member_vnf_index = {}
586 for vld in flattened_vlds:
587 member_vnf_index = str(vld.get("member-vnf-index-ref", ""))
588 if member_vnf_index in all_vlds_by_member_vnf_index:
589 all_vlds_by_member_vnf_index[member_vnf_index].append(vld)
590 else:
591 all_vlds_by_member_vnf_index[member_vnf_index] = [vld]
592
593 df = {"id": "default-df", "vnf-profile": []}
594
595 for member_vnf_index in all_vlds_by_member_vnf_index:
596 vnf_profile = {"id": member_vnf_index}
597 vnf_profile["vnfd-id"] = all_vlds_by_member_vnf_index.get(member_vnf_index, [{}])[0].get("vnfd-id-ref")
598 vnf_profile["virtual-link-connectivity"] = []
599 for vld in all_vlds_by_member_vnf_index[member_vnf_index]:
600 virtual_link_connectivity = {"virtual-link-profile-id": vld["id"]}
601 virtual_link_connectivity["constituent-cpd-id"] = [{
602 "constituent-base-element-id": member_vnf_index,
603 "constituent-cpd-id": "{}-ext".format(vld.get("vnfd-connection-point-ref"))
604 }]
605 if vld.get("ip-address"):
606 virtual_link_connectivity["constituent-cpd-id"][0]["ip-address"] = vld["ip-address"]
607 vnf_profile["virtual-link-connectivity"].append(virtual_link_connectivity)
608
609 vlcs_by_virtual_link_profile = {}
610 for vlc in vnf_profile.get("virtual-link-connectivity"):
611 vl_profile_id = vlc.get("virtual-link-profile-id")
612 if vl_profile_id in vlcs_by_virtual_link_profile:
613 vlc_constituent_cpds = vlcs_by_virtual_link_profile[vl_profile_id].get("constituent-cpd-id")
614 vlc_constituent_cpds.extend(vlc.get("constituent-cpd-id"))
615 else:
616 vlcs_by_virtual_link_profile[vl_profile_id] = vlc
617
618 vnf_profile["virtual-link-connectivity"] = list(vlcs_by_virtual_link_profile.values())
619
620 df["vnf-profile"].append(vnf_profile)
621
622 sol006_nsd["df"] = [df]
623
624 virtual_link_descs = []
625 for vld in im_nsd.get("vld", ()):
626 virtual_link_desc = {"id": vld["id"]}
627 if vld.get("mgmt-network"):
628 virtual_link_desc["mgmt-network"] = vld["mgmt-network"]
629 if vld.get("vim-network-name"):
630 virtual_link_desc["vim-network-name"] = vld["vim-network-name"]
631 virtual_link_descs.append(virtual_link_desc)
632
633 if len(virtual_link_descs) > 0:
634 sol006_nsd["virtual-link-desc"] = virtual_link_descs