X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Frest%2Fnetwork.py;h=0479ee6b423beb2bf5c44ebfeb380249453bd7d3;hp=63696a0ccb63db2916fbc376c1799ff125ee6c4e;hb=ae58801332baaa66ea71c9e233e23f0f68a0afe2;hpb=becc7c55f44225979dc706d1e7c3dfc8748cf1c7 diff --git a/src/emuvim/api/rest/network.py b/src/emuvim/api/rest/network.py index 63696a0..0479ee6 100755 --- a/src/emuvim/api/rest/network.py +++ b/src/emuvim/api/rest/network.py @@ -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(level=logging.DEBUG) +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 @@ -54,32 +58,40 @@ class NetworkAction(Resource): :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: - # check if json data is a dict + # 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 = {} - elif type(data) is not dict: - data = json.loads(request.json) + 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") @@ -105,7 +117,36 @@ class NetworkAction(Resource): 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 \ No newline at end of file