X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fdescriptor_topics.py;h=df218ccb2b41445b3590761dcd1276b852b01d80;hp=ff5da89d8de1bfed124efbf7155d8fc2a7097184;hb=refs%2Fchanges%2F57%2F10657%2F3;hpb=b995ea260a3a2f88a4e041c7e2dd745daee91825 diff --git a/osm_nbi/descriptor_topics.py b/osm_nbi/descriptor_topics.py index ff5da89..df218cc 100644 --- a/osm_nbi/descriptor_topics.py +++ b/osm_nbi/descriptor_topics.py @@ -33,7 +33,7 @@ etsi_nfv_nsd = importlib.import_module("osm_im.etsi-nfv-nsd") from osm_im.nst import nst as nst_im from pyangbind.lib.serialise import pybindJSONDecoder import pyangbind.lib.pybindJSON as pybindJSON -from osm_nbi.utils import deep_update_dict +from osm_nbi import utils __author__ = "Alfonso Tierno " @@ -473,7 +473,7 @@ class VnfdTopic(DescriptorTopic): out = pybindJSON.dumps(myvnfd, mode="ietf") desc_out = self._remove_envelop(yaml.safe_load(out)) desc_out = self._remove_yang_prefixes_from_descriptor(desc_out) - return deep_update_dict(data, desc_out) + return utils.deep_update_dict(data, desc_out) except Exception as e: raise EngineException("Error in pyangbind validation: {}".format(str(e)), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) @@ -539,13 +539,14 @@ class VnfdTopic(DescriptorTopic): # check vnfrs using this vnfd _filter["vnfd-id"] = _id if self.db.get_list("vnfrs", _filter): - raise EngineException("There is at least one VNF using this descriptor", http_code=HTTPStatus.CONFLICT) + raise EngineException("There is at least one VNF instance using this descriptor", + http_code=HTTPStatus.CONFLICT) # check NSD referencing this VNFD del _filter["vnfd-id"] - _filter["constituent-vnfd.ANYINDEX.vnfd-id-ref"] = descriptor_id + _filter["vnfd-id"] = descriptor_id if self.db.get_list("nsds", _filter): - raise EngineException("There is at least one NSD referencing this descriptor", + raise EngineException("There is at least one NS package referencing this descriptor", http_code=HTTPStatus.CONFLICT) def _validate_input_new(self, indata, storage_params, force=False): @@ -561,8 +562,8 @@ class VnfdTopic(DescriptorTopic): for vdu in get_iterable(indata.get("vdu")): self.validate_vdu_internal_connection_points(vdu) - self._validate_vdu_charms_in_package(storage_params, vdu, indata) self._validate_vdu_cloud_init_in_package(storage_params, vdu, indata) + self._validate_vdu_charms_in_package(storage_params, indata) self._validate_vnf_charms_in_package(storage_params, indata) @@ -621,14 +622,20 @@ class VnfdTopic(DescriptorTopic): http_code=HTTPStatus.UNPROCESSABLE_ENTITY) # TODO: Validate k8s-cluster-net points to a valid k8s-cluster:nets ? - def _validate_vdu_charms_in_package(self, storage_params, vdu, indata): - if not vdu.get("vdu-configuration"): - return - for vdu_configuration in get_iterable(indata.get("vdu-configuration")): - if vdu_configuration.get("juju"): - if not self._validate_package_folders(storage_params, 'charms'): - raise EngineException("Charm defined in vnf[id={}] but not present in " - "package".format(indata["id"])) + def _validate_vdu_charms_in_package(self, storage_params, indata): + for df in indata["df"]: + if "lcm-operations-configuration" in df and "operate-vnf-op-config" in df["lcm-operations-configuration"]: + configs = df["lcm-operations-configuration"]["operate-vnf-op-config"].get("day1-2", []) + vdus = df.get("vdu-profile", []) + for vdu in vdus: + for config in configs: + if config["id"] == vdu["id"] and utils.find_in_list( + config.get("execution-environment-list", []), + lambda ee: "juju" in ee + ): + if not self._validate_package_folders(storage_params, 'charms'): + raise EngineException("Charm defined in vnf[id={}] but not present in " + "package".format(indata["id"])) def _validate_vdu_cloud_init_in_package(self, storage_params, vdu, indata): if not vdu.get("cloud-init-file"): @@ -638,13 +645,21 @@ class VnfdTopic(DescriptorTopic): "package".format(indata["id"], vdu["id"])) def _validate_vnf_charms_in_package(self, storage_params, indata): - if not indata.get("vnf-configuration"): - return - for vnf_configuration in get_iterable(indata.get("vnf-configuration")): - if vnf_configuration.get("juju"): - if not self._validate_package_folders(storage_params, 'charms'): - raise EngineException("Charm defined in vnf[id={}] but not present in " - "package".format(indata["id"])) + # Get VNF configuration through new container + for deployment_flavor in indata.get('df', []): + if "lcm-operations-configuration" not in deployment_flavor: + return + if "operate-vnf-op-config" not in deployment_flavor["lcm-operations-configuration"]: + return + for day_1_2_config in deployment_flavor["lcm-operations-configuration"]["operate-vnf-op-config"]["day1-2"]: + if day_1_2_config["id"] == indata["id"]: + if utils.find_in_list( + day_1_2_config.get("execution-environment-list", []), + lambda ee: "juju" in ee + ): + if not self._validate_package_folders(storage_params, 'charms'): + raise EngineException("Charm defined in vnf[id={}] but not present in " + "package".format(indata["id"])) def _validate_package_folders(self, storage_params, folder, file=None): if not storage_params or not storage_params.get("pkg-dir"): @@ -755,19 +770,25 @@ class VnfdTopic(DescriptorTopic): http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for sca in get_iterable(sa.get("scaling-config-action")): - if not indata.get("vnf-configuration"): - raise EngineException("'vnf-configuration' not defined in the descriptor but it is referenced " - "by df[id='{}']:scaling-aspect[id='{}']:scaling-config-action" + if "lcm-operations-configuration" not in df \ + or "operate-vnf-op-config" not in df["lcm-operations-configuration"] \ + or not utils.find_in_list( + df["lcm-operations-configuration"]["operate-vnf-op-config"].get("day1-2", []), + lambda config: config["id"] == indata["id"]): + raise EngineException("'day1-2 configuration' not defined in the descriptor but it is " + "referenced by df[id='{}']:scaling-aspect[id='{}']:scaling-config-action" .format(df["id"], sa["id"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) - for configuration in get_iterable(indata["vnf-configuration"]): + for configuration in get_iterable( + df["lcm-operations-configuration"]["operate-vnf-op-config"].get("day1-2", []) + ): for primitive in get_iterable(configuration.get("config-primitive")): if primitive["name"] == sca["vnf-config-primitive-name-ref"]: break else: raise EngineException("df[id='{}']:scaling-aspect[id='{}']:scaling-config-action:vnf-" "config-primitive-name-ref='{}' does not match any " - "vnf-configuration:config-primitive:name" + "day1-2 configuration:config-primitive:name" .format(df["id"], sa["id"], sca["vnf-config-primitive-name-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) @@ -999,7 +1020,8 @@ class NsdTopic(DescriptorTopic): _filter = self._get_project_filter(session) _filter["nsd-id"] = _id if self.db.get_list("nsrs", _filter): - raise EngineException("There is at least one NS using this descriptor", http_code=HTTPStatus.CONFLICT) + raise EngineException("There is at least one NS instance using this descriptor", + http_code=HTTPStatus.CONFLICT) # check NSD referenced by NST del _filter["nsd-id"] @@ -1150,7 +1172,7 @@ class PduTopic(BaseTopic): _filter = self._get_project_filter(session) _filter["vdur.pdu-id"] = _id if self.db.get_list("vnfrs", _filter): - raise EngineException("There is at least one VNF using this PDU", http_code=HTTPStatus.CONFLICT) + raise EngineException("There is at least one VNF instance using this PDU", http_code=HTTPStatus.CONFLICT) class VnfPkgOpTopic(BaseTopic):