fix missing vnfd composer constraint

Change-Id: I58644c97076cf87fe82017cb10a072db21fecab6
Signed-off-by: lombardofr <lombardo@everyup.it>
diff --git a/descriptorhandler/views.py b/descriptorhandler/views.py
index 1bdb9b4..1cf6906 100644
--- a/descriptorhandler/views.py
+++ b/descriptorhandler/views.py
@@ -137,6 +137,24 @@
 
         return __response_handler(request, result_graph, url=None, status=200)
 
+    elif descriptor_type == 'vnfd':
+        descriptor_result = client.vnfd_get(user.get_token(), descriptor_id)
+        element_id = request.POST.get('id', '')
+        util = OsmUtil()
+        descriptor_updated = util.add_base_node('vnfd', descriptor_result, element_type, element_id, request.POST.dict())
+        result = client.vnfd_update(user.get_token(), descriptor_id, descriptor_updated)
+        if result['error'] == True:
+            return __response_handler(request, result['data'], url=None,
+                                      status=result['data']['status'] if 'status' in result['data'] else 500)
+        else:
+            parser = OsmParser()
+            # print nsr_object
+            if descriptor_type == 'vnfd':
+                result_graph = parser.vnfd_to_graph(descriptor_updated)
+
+        return __response_handler(request, result_graph, url=None, status=200)
+
+
 @login_required
 def removeElement(request, descriptor_type=None, descriptor_id=None, element_type=None):
     user = osmutils.get_user(request)
diff --git a/lib/osm/osm_rdcl_parser.py b/lib/osm/osm_rdcl_parser.py
index 84814f2..ab62688 100644
--- a/lib/osm/osm_rdcl_parser.py
+++ b/lib/osm/osm_rdcl_parser.py
@@ -267,9 +267,30 @@
             "layer": {
                 "vnfd": {
                     "nodes": {
-                        "vdu": {},
-                        "cp": {},
-                        "int_cp": {},
+                        "vdu": {
+                            "addable": {
+                                "callback": "addNode"
+                            },
+                            "removable": {
+                                "callback": "removeNode"
+                            }
+                        },
+                        "cp": {
+                            "addable": {
+                                "callback": "addNode"
+                            },
+                            "removable": {
+                                "callback": "removeNode"
+                            }
+                        },
+                        "int_cp": {
+                            "addable": {
+                                "callback": "addNode"
+                            },
+                            "removable": {
+                                "callback": "removeNode"
+                            }
+                        },
                         "vnf_vl": {
                             "addable": {
                                 "callback": "addNode"
@@ -287,9 +308,6 @@
                                 },
                                 "int_cp": {
                                     "direct_edge": False,
-                                },
-                                "vnf_vl": {
-                                    "direct_edge": False,
                                 }
                             }
                         },
@@ -312,7 +330,7 @@
                         },
                         "vnf_vl": {
                             "destination": {
-                                "vdu": {
+                                "int_cp": {
                                     "direct_edge": False
                                 }
                             }
diff --git a/lib/osm/osm_util.py b/lib/osm/osm_util.py
index 5d314ce..12e567b 100644
--- a/lib/osm/osm_util.py
+++ b/lib/osm/osm_util.py
@@ -29,6 +29,16 @@
                                                             str(item['member-vnf-index-ref']) != str(
                                                                 args['member-vnf-index-ref']) or str(
                                                                 item['vnfd-id-ref']) != str(args['vnfd-id-ref'])]
+        elif descriptor_type == 'vnfd':
+            if 'vnfd-catalog' in descriptor:
+                vnfd = descriptor['vnfd-catalog']['vnfd'][0]
+            elif 'vnfd:vnfd-catalog' in descriptor:
+                vnfd = descriptor['vnfd:vnfd-catalog']['vnfd'][0]
+
+            if node_type == 'vnf_vl':
+                vnfd['internal-vld'] = [item for item in vnfd['internal-vld'] if item['id'] != element_id]
+            if node_type == 'cp':
+                vnfd['connection-point'] = [item for item in vnfd['connection-point'] if item['name'] != element_id]
 
         return descriptor
 
@@ -92,6 +102,41 @@
                                 "vnfd-id-ref": args['vnfd-id-ref']
                             },
                         )
+
+        elif descriptor_type == 'vnfd':
+            if 'vnfd-catalog' in descriptor:
+                vnfd = descriptor['vnfd-catalog']['vnfd'][0]
+            elif 'vnfd:vnfd-catalog' in descriptor:
+                vnfd = descriptor['vnfd:vnfd-catalog']['vnfd'][0]
+            if node_type == 'vdu':
+                vnfd['vdu'].append({
+                    "count": "1",
+                    "description": "",
+                    "monitoring-param": [],
+                    "internal-connection-point": [],
+                    "image": "ubuntu",
+                    "cloud-init-file": "",
+                    "vm-flavor": {},
+                    "interface": [],
+                    "id": element_id,
+                    "name": element_id
+                })
+            if node_type == 'cp':
+                vnfd['connection-point'].append({
+                    "type": "VPORT",
+                    "name": element_id
+                })
+
+            if node_type == 'vnf_vl':
+                vnfd['internal-vld'].append({
+                    "short-name": element_id,
+                    "name": element_id,
+                    "internal-connection-point": [],
+                    "type": "ELAN",
+                    "ip-profile-ref": "",
+                    "id": element_id
+                })
+
         return descriptor
 
     @staticmethod
diff --git a/static/src/descriptorhandler/composer.js b/static/src/descriptorhandler/composer.js
index d56e22f..4b8bfd5 100644
--- a/static/src/descriptorhandler/composer.js
+++ b/static/src/descriptorhandler/composer.js
@@ -118,7 +118,7 @@
 
         var nodetype = $('#' + elemet_id).attr('type-name');
         var random_name = nodetype + "_" + generateUID();
-
+        console.log(nodetype)
         var node_information = {
             'id': random_name,
             'info': {
@@ -134,21 +134,17 @@
             'x': e.layerX,
             'y': e.layerY
         };
-        if (nodetype === 'ns_vl') {
 
-            graph_editor.addNode(node_information, function () {
-                console.log("OK")
-            }, function (error) {
-                showAlert(error)
-            })
-        } else if (nodetype === 'vnf') {
+        if (nodetype === 'vnf') {
             node_information['id'] = $('#' + elemet_id).attr('desc_id');
-            graph_editor.addNode(node_information, function () {
-                console.log("OK")
-            }, function (error) {
-                showAlert(error)
-            })
         }
+
+        graph_editor.addNode(node_information, function () {
+            console.log("OK")
+        }, function (error) {
+            showAlert(error)
+        })
+
     };
 
     dropZone.ondragover = function (ev) {
@@ -261,7 +257,7 @@
             var node = nodes[n];
             if (nodes_properties[node]) {
                 palette_template += '<div id="drag_' + n + '" class="node ui-draggable"' +
-                    'type-name="' + n + '" draggable="true" ondragstart="nodeDragStart(event)">' +
+                    'type-name="' + node + '" draggable="true" ondragstart="nodeDragStart(event)">' +
                     '<div class="icon" style="background-color:' + nodes_properties[node].color + '"></div>' +
                     '<div class="name">' + nodes_properties[node].name + '</div></div>';
             }