Fix: Crashbug that was caused by an import of an
[osm/vim-emu.git] / src / emuvim / api / rest / rest_api_endpoint.py
index 71f87b9..a980dc9 100755 (executable)
@@ -14,7 +14,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 
-Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
+Neither the name of the SONATA-NFV, Paderborn University
 nor the names of its contributors may be used to endorse or promote
 products derived from this software without specific prior written
 permission.
@@ -30,7 +30,7 @@ import logging
 import threading
 from flask import Flask
 from flask_restful import Api
-#from gevent.wsgi import WSGIServer
+from gevent.pywsgi import WSGIServer
 
 # need to import total module to set its global variable dcs
 import compute
@@ -38,15 +38,15 @@ from compute import dcs, ComputeList, Compute, ComputeResources, DatacenterList,
 
 # 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)
+logging.basicConfig()
 
 
 class RestApiEndpoint(object):
@@ -56,10 +56,13 @@ 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
         # find directory of dashboard files
         dashboard_file = pkg_resources.resource_filename('emuvim.dashboard', "index.html")
@@ -85,7 +88,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
@@ -102,6 +106,10 @@ 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))
 
@@ -119,13 +127,21 @@ class RestApiEndpoint(object):
             self.__class__.__name__, self.ip, self.port))
 
     def start(self):
-        thread = threading.Thread(target=self._start_flask, args=())
-        thread.daemon = True
-        thread.start()
+        self.thread = threading.Thread(target=self._start_flask, args=())
+        self.thread.daemon = True
+        self.thread.start()
         logging.info("Started API endpoint @ http://%s:%d" % (self.ip, self.port))
 
+    def stop(self):
+        if self.http_server:
+            self.http_server.close()
+
     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
-        #http_server = WSGIServer((self.ip, self.port), self.app)
-        #http_server.serve_forever()
+        #self.app.logger.setLevel(logging.ERROR)
+        self.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
+        )
+        self.http_server.serve_forever()