Fix bug 682: NSD cross references between vnffgd classifier and rsp not validated
[osm/NBI.git] / osm_nbi / descriptor_topics.py
index 95ced0d..0939000 100644 (file)
@@ -139,6 +139,7 @@ class DescriptorTopic(BaseTopic):
             self.format_on_new(content, session["project_id"], make_public=session["public"])
             _id = self.db.create(self.topic, content)
             rollback.append({"topic": self.topic, "_id": _id})
+            self._send_msg("created", {"_id": _id})
             return _id, None
         except ValidationError as e:
             raise EngineException(e, HTTPStatus.UNPROCESSABLE_ENTITY)
@@ -284,7 +285,7 @@ class DescriptorTopic(BaseTopic):
             self.fs.dir_rename(temp_folder, _id)
 
             indata["_id"] = _id
-            self._send_msg("created", indata)
+            self._send_msg("edited", indata)
 
             # TODO if descriptor has changed because kwargs update content and remove cached zip
             # TODO if zip is not present creates one
@@ -703,6 +704,19 @@ class NsdTopic(DescriptorTopic):
                                           "does not match any constituent-vnfd:member-vnf-index"
                                           .format(vld["id"], vnfd_cp["member-vnf-index-ref"]),
                                           http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
+        # Check VNFFGD
+        for fgd in get_iterable(indata.get("vnffgd")):
+            for cls in get_iterable(fgd.get("classifier")):
+                rspref = cls.get("rsp-id-ref")
+                for rsp in get_iterable(fgd.get("rsp")):
+                    rspid = rsp.get("id")
+                    if rspid and rspref and rspid == rspref:
+                        break
+                else:
+                    raise EngineException(
+                        "Error at vnffgd[id='{}']:classifier[id='{}']:rsp-id-ref '{}' does not match any rsp:id"
+                        .format(fgd["id"], cls["id"], rspref),
+                        http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
         return indata
 
     def _validate_input_edit(self, indata, force=False):