Fixes 1367 by preventing pyang discard repeated constituent-base-element-id
[osm/NBI.git] / osm_nbi / descriptor_topics.py
index 4e056f5..ed958b1 100644 (file)
@@ -456,6 +456,9 @@ class VnfdTopic(DescriptorTopic):
         DescriptorTopic.__init__(self, db, fs, msg, auth)
 
     def pyangbind_validation(self, item, data, force=False):
+        if self._descriptor_data_is_in_old_format(data):
+            raise EngineException("ERROR: Unsupported descriptor format. Please, use an ETSI SOL006 descriptor.",
+                                  http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
         try:
             virtual_compute_descriptors = data.get('virtual-compute-desc')
             virtual_storage_descriptors = data.get('virtual-storage-desc')
@@ -474,6 +477,10 @@ class VnfdTopic(DescriptorTopic):
             raise EngineException("Error in pyangbind validation: {}".format(str(e)),
                                   http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
 
+    @staticmethod
+    def _descriptor_data_is_in_old_format(data):
+        return ('vnfd-catalog' in data) or ('vnfd:vnfd-catalog' in data)
+
     @staticmethod
     def _remove_envelop(indata=None):
         if not indata:
@@ -797,18 +804,28 @@ class NsdTopic(DescriptorTopic):
         DescriptorTopic.__init__(self, db, fs, msg, auth)
 
     def pyangbind_validation(self, item, data, force=False):
+        if self._descriptor_data_is_in_old_format(data):
+            raise EngineException("ERROR: Unsupported descriptor format. Please, use an ETSI SOL006 descriptor.",
+                                  http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
         try:
+            nsd_vnf_profiles = data.get('df', [{}])[0].get('vnf-profile', [])
             mynsd = etsi_nfv_nsd.etsi_nfv_nsd()
             pybindJSONDecoder.load_ietf_json({'nsd': {'nsd': [data]}}, None, None, obj=mynsd,
                                              path_helper=True, skip_unknown=force)
             out = pybindJSON.dumps(mynsd, mode="ietf")
             desc_out = self._remove_envelop(yaml.safe_load(out))
             desc_out = self._remove_yang_prefixes_from_descriptor(desc_out)
+            if nsd_vnf_profiles:
+                desc_out['df'][0]['vnf-profile'] = nsd_vnf_profiles
             return desc_out
         except Exception as e:
             raise EngineException("Error in pyangbind validation: {}".format(str(e)),
                                   http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
 
+    @staticmethod
+    def _descriptor_data_is_in_old_format(data):
+        return ('nsd-catalog' in data) or ('nsd:nsd-catalog' in data)
+
     @staticmethod
     def _remove_envelop(indata=None):
         if not indata: