From 40fbcad471ba3a8ce45160bf1cdc950a2aaffa06 Mon Sep 17 00:00:00 2001 From: tierno Date: Fri, 26 Oct 2018 10:58:15 +0200 Subject: [PATCH] Minor updates to Validate cross references in descriptors Change-Id: Ia56f9cdbc951ebc8a1fbdbfb4e9d036666609c7b Signed-off-by: tierno --- osm_nbi/descriptor_topics.py | 91 +++++++++++++++++------------------- osm_nbi/instance_topics.py | 64 ++++++++++++------------- 2 files changed, 72 insertions(+), 83 deletions(-) diff --git a/osm_nbi/descriptor_topics.py b/osm_nbi/descriptor_topics.py index 6ecf7dc..be34d5a 100644 --- a/osm_nbi/descriptor_topics.py +++ b/osm_nbi/descriptor_topics.py @@ -390,41 +390,40 @@ class VnfdTopic(DescriptorTopic): # TODO validate with pyangbind, serialize # Cross references validation in the descriptor - if indata.get("mgmt-interface"): - if indata["mgmt-interface"].get("cp"): - for cp in get_iterable(indata.get("connection-point")): - if cp["name"] == indata["mgmt-interface"]["cp"]: - break - else: - raise EngineException("mgmt-interface:cp='{} must match an existing connection-point" - .format(indata["mgmt-interface"].get("cp")), - http_code=HTTPStatus.UNPROCESSABLE_ENTITY) - else: + if not indata.get("mgmt-interface"): raise EngineException("'mgmt-interface' is a mandatory field and it is not defined", http_code=HTTPStatus.UNPROCESSABLE_ENTITY) + if indata["mgmt-interface"].get("cp"): + for cp in get_iterable(indata.get("connection-point")): + if cp["name"] == indata["mgmt-interface"]["cp"]: + break + else: + raise EngineException("mgmt-interface:cp='{}' must match an existing connection-point" + .format(indata["mgmt-interface"]["cp"]), + http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for vdu in get_iterable(indata.get("vdu")): for interface in get_iterable(vdu.get("interface")): if interface.get("external-connection-point-ref"): for cp in get_iterable(indata.get("connection-point")): - if cp["name"] == interface.get("external-connection-point-ref"): + if cp["name"] == interface["external-connection-point-ref"]: break else: - raise EngineException("vdu[id='{}']:interface[name='{}']:external-connection-point-ref='{} " + raise EngineException("vdu[id='{}']:interface[name='{}']:external-connection-point-ref='{}' " "must match an existing connection-point" .format(vdu["id"], interface["name"], interface["external-connection-point-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) - for interface in get_iterable(vdu.get("interface")): - if interface.get("internal-connection-point-ref"): + + elif interface.get("internal-connection-point-ref"): for internal_cp in get_iterable(vdu.get("internal-connection-point")): - if interface.get("internal-connection-point-ref") == internal_cp.get("id"): + if interface["internal-connection-point-ref"] == internal_cp.get("id"): break else: - raise EngineException("vdu[id='{}']:interface[name='{}']:internal-connection-point-ref='{}' is " - "not associated to an internal-connection-point".format - (vdu["id"], interface["name"], - interface["internal-connection-point-ref"]), + raise EngineException("vdu[id='{}']:interface[name='{}']:internal-connection-point-ref='{}' " + "must match an existing vdu:internal-connection-point" + .format(vdu["id"], interface["name"], + interface["internal-connection-point-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for ivld in get_iterable(indata.get("internal-vld")): for icp in get_iterable(ivld.get("internal-connection-point")): @@ -437,15 +436,15 @@ class VnfdTopic(DescriptorTopic): if icp_mark: break else: - raise EngineException("'internal-vld='{}':internal-connection-point='{}'' must match an existing " - "internal-connection-point".format(ivld["id"], icp["id-ref"]), + raise EngineException("internal-vld[id='{}']:internal-connection-point='{}' must match an existing " + "vdu:internal-connection-point".format(ivld["id"], icp["id-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) if ivld.get("ip-profile-ref"): - for ip_prof in get_iterable(indata["ip-profiles"]): + for ip_prof in get_iterable(indata.get("ip-profiles")): if ip_prof["name"] == get_iterable(ivld.get("ip-profile-ref")): break else: - raise EngineException("internal-vld='{}':ip-profile-ref='{}' does not exist".format( + raise EngineException("internal-vld[id='{}']:ip-profile-ref='{}' does not exist".format( ivld["id"], ivld["ip-profile-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for mp in get_iterable(indata.get("monitoring-param")): @@ -453,7 +452,7 @@ class VnfdTopic(DescriptorTopic): mp_vmp_mark = False for vdu in get_iterable(indata.get("vdu")): for vmp in get_iterable(vdu.get("monitoring-param")): - if vmp["id"] == mp["vdu-monitoring-param"]["vdu-monitoring-param-ref"] and vdu["id"] ==\ + if vmp["id"] == mp["vdu-monitoring-param"].get("vdu-monitoring-param-ref") and vdu["id"] ==\ mp["vdu-monitoring-param"]["vdu-ref"]: mp_vmp_mark = True break @@ -461,7 +460,7 @@ class VnfdTopic(DescriptorTopic): break else: raise EngineException("monitoring-param:vdu-monitoring-param:vdu-monitoring-param-ref='{}' not " - "defined in VDU vdu[id='{}'] or does not exist an VDU with this id" + "defined at vdu[id='{}'] or vdu does not exist" .format(mp["vdu-monitoring-param"]["vdu-monitoring-param-ref"], mp["vdu-monitoring-param"]["vdu-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) @@ -477,8 +476,8 @@ class VnfdTopic(DescriptorTopic): if mp_vm_mark: break else: - raise EngineException("monitoring-param:vdu-metric:vdu-metric-name-ref='{}' not defined in VDU " - "vdu[id='{}'] or or does not exist an VDU with this id" + raise EngineException("monitoring-param:vdu-metric:vdu-metric-name-ref='{}' not defined at " + "vdu[id='{}'] or vdu does not exist" .format(mp["vdu-metric"]["vdu-metric-name-ref"], mp["vdu-metric"]["vdu-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) @@ -490,9 +489,9 @@ class VnfdTopic(DescriptorTopic): if mp["id"] == get_iterable(sc.get("vnf-monitoring-param-ref")): break else: - raise EngineException("scaling-group-descriptor:name='{}':scaling-criteria:name='{}':" - "vnf-monitoring-param-ref='{}' not defined in any 'monitoring-param" - "['id']'".format(sgd["name"], sc["name"], sc["vnf-monitoring-param-ref"]), + raise EngineException("scaling-group-descriptor[name='{}']:scaling-criteria[name='{}']:" + "vnf-monitoring-param-ref='{}' not defined in any monitoring-param" + .format(sgd["name"], sc["name"], sc["vnf-monitoring-param-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for sgd_vdu in get_iterable(sgd.get("vdu")): sgd_vdu_mark = False @@ -503,28 +502,24 @@ class VnfdTopic(DescriptorTopic): if sgd_vdu_mark: break else: - raise EngineException("scaling-group-descriptor[name='{}']:vdu not defined and" - "it is mandatory in any 'scaling-group-descriptor'" - .format(sgd["name"]), + raise EngineException("scaling-group-descriptor[name='{}']:vdu-id-ref={} does not match any vdu" + .format(sgd["name"], sgd_vdu["vdu-id-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) for sca in get_iterable(sgd.get("scaling-config-action")): - sca_vcp_mark = False - if indata.get("vnf-configuration"): - for primitive in get_iterable(indata["vnf-configuration"].get("config-primitive")): - if primitive["name"] == sca["vnf-config-primitive-name-ref"]: - sca_vcp_mark = True - break - else: - raise EngineException("scaling-group-descriptor:name='{}':scaling-config-action:vnf-config-" - "primitive-name-ref='{}' not defined in " - "'vnf-configuration:config-primitive'" - .format(sgd["name"], sca["vnf-config-primitive-name-ref"]), - http_code=HTTPStatus.UNPROCESSABLE_ENTITY) + if not indata.get("vnf-configuration"): + raise EngineException("'vnf-configuration' not defined in the descriptor but it is referenced by " + "scaling-group-descriptor[name='{}']:scaling-config-action" + .format(sgd["name"]), + http_code=HTTPStatus.UNPROCESSABLE_ENTITY) + for primitive in get_iterable(indata["vnf-configuration"].get("config-primitive")): + if primitive["name"] == sca["vnf-config-primitive-name-ref"]: + break else: - raise EngineException("'vnf-configuration' not defined in the descriptor but it is referenced", + raise EngineException("scaling-group-descriptor[name='{}']:scaling-config-action:vnf-config-" + "primitive-name-ref='{}' does not match any " + "vnf-configuration:config-primitive:name" + .format(sgd["name"], sca["vnf-config-primitive-name-ref"]), http_code=HTTPStatus.UNPROCESSABLE_ENTITY) - if sca_vcp_mark: - break return indata def _validate_input_edit(self, indata, force=False): diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py index de2a1e6..e98f90f 100644 --- a/osm_nbi/instance_topics.py +++ b/osm_nbi/instance_topics.py @@ -291,38 +291,31 @@ class NsLcmOpTopic(BaseTopic): def _check_vnf_instantiation_params(in_vnfd, vnfd): - for in_vdu in get_iterable(in_vnfd["vdu"]): - if in_vdu.get("id"): - for vdu in get_iterable(vnfd["vdu"]): - if in_vdu["id"] == vdu["id"]: - for volume in get_iterable(in_vdu.get("volume")): - for volumed in get_iterable(vdu.get("volumes")): - if volumed["name"] == volume["name"]: - break - else: - raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:vdu[id='{}']:" - "volume:name='{}' is not present at vnfd:vdu:volumes list". - format(in_vnf["member-vnf-index"], in_vdu["id"], - volume["name"])) - for in_iface in get_iterable(in_vdu["interface"]): - if in_iface.get("name"): - for iface in vdu["interface"]: - if in_iface["name"] == iface["name"]: - break - else: - raise EngineException("vdu[id='{}']:interface[name='{}'] defined in " - "additional configuration, is not present at vnfd '{}'" - .format(in_vdu["id"], in_iface["name"], vnfd["id"])) - else: - raise EngineException("vdu[id='{}']:interface defined in additional " - "configuration needs 'name' parameter to be defined" - .format(in_vdu["id"])) - break - else: - raise EngineException("VDU '{}' defined in additional configuration, is not present at vnfd " - "'{}'".format(in_vdu["id"], vnfd["id"])) + for in_vdu in get_iterable(in_vnfd.get("vdu")): + for vdu in get_iterable(vnfd.get("vdu")): + if in_vdu["id"] == vdu["id"]: + for volume in get_iterable(in_vdu.get("volume")): + for volumed in get_iterable(vdu.get("volumes")): + if volumed["name"] == volume["name"]: + break + else: + raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:vdu[id='{}']:" + "volume:name='{}' is not present at vnfd:vdu:volumes list". + format(in_vnf["member-vnf-index"], in_vdu["id"], + volume["name"])) + for in_iface in get_iterable(in_vdu["interface"]): + for iface in get_iterable(vdu.get("interface")): + if in_iface["name"] == iface["name"]: + break + else: + raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:vdu[id='{}']:" + "interface[name='{}'] is not present at vnfd:vdu:interface" + .format(in_vnf["member-vnf-index"], in_vdu["id"], + in_iface["name"])) + break else: - raise EngineException("No ID defined for VDU in the additional configuration") + raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:vdu[id='{}'] is is not present " + "at vnfd:vdu".format(in_vnf["member-vnf-index"], in_vdu["id"])) for in_ivld in get_iterable(in_vnfd.get("internal-vld")): for ivld in get_iterable(vnfd.get("internal-vld")): @@ -332,10 +325,11 @@ class NsLcmOpTopic(BaseTopic): if in_icp["id-ref"] == icp["id-ref"]: break else: - raise EngineException("internal-vld:name='{}':internal-connection-point:" - "id-ref='{}' defined in additional configuration, is not " - "present at vnfd '{}'".format(in_ivld["name"], - in_icp["id-ref"], vnfd["id"])) + raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:internal-vld[name" + "='{}']:internal-connection-point[id-ref:'{}'] is not present at " + "vnfd:internal-vld:name/id:internal-connection-point" + .format(in_vnf["member-vnf-index"], in_ivld["name"], + in_icp["id-ref"], vnfd["id"])) break else: raise EngineException("Invalid parameter vnf[member-vnf-index='{}']:internal-vld:name='{}'" -- 2.25.1