Fix/update: Simplified emulator dashboard that only shows running containers and...
[osm/vim-emu.git] / src / emuvim / api / rest / rest_api_endpoint.py
index 0ecf548..10b6c26 100755 (executable)
@@ -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)
 
@@ -56,18 +61,22 @@ class RestApiEndpoint(object):
         self.port = port
 
         # 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/<dc_label>/<compute_name>",
-                              "/restapi/compute/<dc_label>/<compute_name>/<resource>/<value>")
+        self.api.add_resource(Compute, "/restapi/compute/<dc_label>/<compute_name>")
         self.api.add_resource(ComputeList,
                       "/restapi/compute",
                       "/restapi/compute/<dc_label>")
+        self.api.add_resource(ComputeResources, "/restapi/compute/resources/<dc_label>/<compute_name>")
 
         self.api.add_resource(DatacenterStatus, "/restapi/datacenter/<dc_label>")
         self.api.add_resource(DatacenterList, "/restapi/datacenter")
@@ -76,7 +85,8 @@ class RestApiEndpoint(object):
         # network related actions (setup chaining between VNFs)
         self.api.add_resource(NetworkAction,
                               "/restapi/network")
-
+        self.api.add_resource(DrawD3jsgraph,
+                              "/restapi/network/d3jsgraph")
 
         # monitoring related actions
         # export a network interface traffic rate counter
@@ -93,9 +103,14 @@ class RestApiEndpoint(object):
         # the skewness metric is exported
         self.api.add_resource(MonitorSkewAction,
                               "/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(
@@ -115,4 +130,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()