X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Frest%2Frest_api_endpoint.py;h=b2a7b86a475e7da7fcf86efe846b2d72e42b2b7b;hb=284ba2b074eecf9cc46867b317d46ab95445b18e;hp=7168f37b60ed4c754e46944fa2b36ac4a63cdae1;hpb=5ec2cabc29fabd63769c96c60c8008182fc0ab72;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/rest/rest_api_endpoint.py b/src/emuvim/api/rest/rest_api_endpoint.py index 7168f37..b2a7b86 100755 --- a/src/emuvim/api/rest/rest_api_endpoint.py +++ b/src/emuvim/api/rest/rest_api_endpoint.py @@ -25,21 +25,26 @@ the Horizon 2020 and 5G-PPP programmes. The authors would like to acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ + import logging import threading from flask import Flask from flask_restful import Api +from gevent.wsgi import WSGIServer # need to import total module to set its global variable dcs import compute -from compute import dcs, ComputeList, Compute, DatacenterList, DatacenterStatus +from compute import dcs, ComputeList, Compute, ComputeResources, DatacenterList, DatacenterStatus # need to import total module to set its global variable net import network -from network import NetworkAction +from network import NetworkAction, DrawD3jsgraph import monitor -from monitor import MonitorInterfaceAction, MonitorFlowAction, MonitorLinkAction, MonitorSkewAction +from monitor import MonitorInterfaceAction, MonitorFlowAction, MonitorLinkAction, MonitorSkewAction, MonitorTerminal + +import pkg_resources +from os import path logging.basicConfig(level=logging.INFO) @@ -51,23 +56,30 @@ class RestApiEndpoint(object): default command line client. """ - def __init__(self, listenip, port): + def __init__(self, listenip, port, DCnetwork=None): self.ip = listenip self.port = port + # connect this DC network to the rest api endpoint (needed for the networking and monitoring api) + self.connectDCNetwork(DCnetwork) + # setup Flask - self.app = Flask(__name__) + # find directory of dashboard files + dashboard_file = pkg_resources.resource_filename('emuvim.dashboard', "index.html") + dashboard_dir = path.dirname(dashboard_file) + logging.info("Started emu dashboard: {0}".format(dashboard_dir)) + + self.app = Flask(__name__, static_folder=dashboard_dir, static_url_path='/dashboard') self.api = Api(self.app) # setup endpoints # compute related actions (start/stop VNFs, get info) - self.api.add_resource(Compute, - "/restapi/compute//", - "/restapi/compute////") + self.api.add_resource(Compute, "/restapi/compute//") self.api.add_resource(ComputeList, "/restapi/compute", "/restapi/compute/") + self.api.add_resource(ComputeResources, "/restapi/compute/resources//") self.api.add_resource(DatacenterStatus, "/restapi/datacenter/") self.api.add_resource(DatacenterList, "/restapi/datacenter") @@ -75,30 +87,33 @@ class RestApiEndpoint(object): # network related actions (setup chaining between VNFs) self.api.add_resource(NetworkAction, - "/restapi/network//") - + "/restapi/network") + self.api.add_resource(DrawD3jsgraph, + "/restapi/network/d3jsgraph") # monitoring related actions # export a network interface traffic rate counter self.api.add_resource(MonitorInterfaceAction, - "/restapi/monitor/interface//", - "/restapi/monitor/interface///", - "/restapi/monitor/interface////") + "/restapi/monitor/interface") # export flow traffic counter, of a manually pre-installed flow entry, specified by its cookie self.api.add_resource(MonitorFlowAction, - "/restapi/monitor/flow///", - "/restapi/monitor/flow////") + "/restapi/monitor/flow") # install monitoring of a specific flow on a pre-existing link in the service. # the traffic counters of the newly installed monitor flow are exported self.api.add_resource(MonitorLinkAction, - "/restapi/monitor/link//") + "/restapi/monitor/link") # install skewness monitor of resource usage disribution # the skewness metric is exported self.api.add_resource(MonitorSkewAction, - "/restapi/monitor/skewness//") + "/restapi/monitor/skewness") + # start a terminal window for the specified vnfs + self.api.add_resource(MonitorTerminal, + "/restapi/monitor/term") + logging.debug("Created API endpoint %s(%s:%d)" % (self.__class__.__name__, self.ip, self.port)) + def connectDatacenter(self, dc): compute.dcs[dc.label] = dc logging.info( @@ -118,4 +133,11 @@ class RestApiEndpoint(object): logging.info("Started API endpoint @ http://%s:%d" % (self.ip, self.port)) def _start_flask(self): - self.app.run(self.ip, self.port, debug=True, use_reloader=False) + #self.app.run(self.ip, self.port, debug=False, use_reloader=False) + #this should be a more production-fit http-server + #self.app.logger.setLevel(logging.ERROR) + http_server = WSGIServer((self.ip, self.port), + self.app, + log=open("/dev/null", "w") # This disables HTTP request logs to not mess up the CLI when e.g. the auto-updated dashboard is used + ) + http_server.serve_forever()