Refactored logging
[osm/vim-emu.git] / src / emuvim / api / rest / network.py
index ee0c389..9aab1e6 100755 (executable)
@@ -36,9 +36,13 @@ import logging
 from flask_restful import Resource
 from flask import request
 import json
+import networkx
 
-logging.basicConfig(level=logging.INFO)
+logging.basicConfig()
 
+CORS_HEADER = {'Access-Control-Allow-Origin': '*'}
+
+# the global net is set from the topology file, and connected via connectDCNetwork function in rest_api_endpoint.py
 net = None
 
 
@@ -53,31 +57,52 @@ class NetworkAction(Resource):
     :param match: OpenFlow match format of the flow entry
     :param bidirectional: boolean value if the link needs to be implemented from src to dst and back
     :param cookie: cookie value, identifier of the flow entry to be installed.
+    :param priority: integer indicating the priority of the flow entry
+    :param skip_vlan_tag: boolean to indicate whether a new vlan tag should be created for this chain
+    :param monitor: boolean to indicate whether a new vlan tag should be created for this chain
+    :param monitor_placement: 'tx'=place the monitoring flowrule at the beginning of the chain, 'rx'=place at the end of the chain
     :return: message string indicating if the chain action is succesful or not
     """
 
     global net
 
-    def put(self, vnf_src_name, vnf_dst_name):
+    def put(self):
         logging.debug("REST CALL: network chain add")
         command = 'add-flow'
-        return self._NetworkAction(vnf_src_name, vnf_dst_name, command=command)
+        return self._NetworkAction(command=command)
 
-    def delete(self, vnf_src_name, vnf_dst_name):
+    def delete(self):
         logging.debug("REST CALL: network chain remove")
         command = 'del-flows'
-        return self._NetworkAction(vnf_src_name, vnf_dst_name, command=command)
+        return self._NetworkAction(command=command)
 
-    def _NetworkAction(self, vnf_src_name, vnf_dst_name, command=None):
+    def _NetworkAction(self, command=None):
         # call DCNetwork method, not really datacenter specific API for now...
         # no check if vnfs are really connected to this datacenter...
         try:
-            vnf_src_interface = json.loads(request.json).get("vnf_src_interface")
-            vnf_dst_interface = json.loads(request.json).get("vnf_dst_interface")
-            weight = json.loads(request.json).get("weight")
-            match = json.loads(request.json).get("match")
-            bidirectional = json.loads(request.json).get("bidirectional")
-            cookie = json.loads(request.json).get("cookie")
+            # check json payload
+            logging.debug("json: {}".format(request.json))
+            logging.debug("args: {}".format(request.args))
+
+            data = request.json
+            if data is None:
+                data = request.args
+            if data is None:
+                data = {}
+
+            vnf_src_name = data.get("vnf_src_name")
+            vnf_dst_name = data.get("vnf_dst_name")
+            vnf_src_interface = data.get("vnf_src_interface")
+            vnf_dst_interface = data.get("vnf_dst_interface")
+            weight = data.get("weight")
+            match = data.get("match")
+            bidirectional = data.get("bidirectional")
+            cookie = data.get("cookie")
+            priority = data.get("priority")
+            skip_vlan_tag = data.get("skip_vlan_tag")
+            monitor = data.get("monitor")
+            monitor_placement = data.get("monitor_placement")
+
             c = net.setChain(
                 vnf_src_name, vnf_dst_name,
                 vnf_src_interface=vnf_src_interface,
@@ -86,9 +111,42 @@ class NetworkAction(Resource):
                 weight=weight,
                 match=match,
                 bidirectional=bidirectional,
-                cookie=cookie)
+                cookie=cookie,
+                priority=priority,
+                skip_vlan_tag=skip_vlan_tag,
+                monitor=monitor,
+                monitor_placement=monitor_placement)
             # return setChain response
-            return str(c), 200
+            return str(c), 200, CORS_HEADER
         except Exception as ex:
             logging.exception("API error.")
-            return ex.message, 500
\ No newline at end of file
+            return ex.message, 500, CORS_HEADER
+
+
+class DrawD3jsgraph(Resource):
+
+    global net
+
+    def get(self):
+        nodes = list()
+        nodes2 = list()
+        links = list()
+        # add all DCs
+        node_attr = networkx.get_node_attributes(net.DCNetwork_graph, 'type')
+        for node_name in net.DCNetwork_graph.nodes():
+            nodes2.append(node_name)
+            node_index = nodes2.index(node_name)
+            type = node_attr[node_name]
+            node_dict = {"name":node_name,"group":type}
+            nodes.append(node_dict)
+
+        # add links between other DCs
+        for node1_name in net.DCNetwork_graph.nodes():
+            node1_index = nodes2.index(node1_name)
+            for node2_name in net.DCNetwork_graph.neighbors(node1_name):
+                node2_index = nodes2.index(node2_name)
+                edge_dict = {"source": node1_index, "target": node2_index, "value": 10}
+                links.append(edge_dict)
+
+        json = {"nodes":nodes, "links":links}
+        return json, 200, CORS_HEADER