Merge pull request #124 from stevenvanrossem/master
[osm/vim-emu.git] / src / emuvim / api / rest / rest_api_endpoint.py
1 import logging
2 import threading
3 from flask import Flask
4 from flask_restful import Api
5
6 # need to import total module to set its global variable dcs
7 import compute
8 from compute import dcs, ComputeList, ComputeStart, ComputeStatus, ComputeStop, DatacenterList, DatacenterStatus
9
10 # need to import total module to set its global variable net
11 import network
12 from network import NetworkAction
13
14 import monitor
15 from monitor import MonitorInterfaceAction, MonitorFlowAction
16
17 logging.basicConfig(level=logging.INFO)
18
19
20
21 class RestApiEndpoint(object):
22
23 """
24 Simple API endpoint that offers a REST
25 interface. This interface will be used by the
26 default command line client.
27 """
28
29 def __init__(self, listenip, port):
30 self.ip = listenip
31 self.port = port
32
33 # setup Flask
34 self.app = Flask(__name__)
35 self.api = Api(self.app)
36
37 # setup endpoints
38 self.api.add_resource(ComputeList, "/restapi/compute/<dc_label>")
39 self.api.add_resource(ComputeStart, "/restapi/compute/<dc_label>/<compute_name>/start")
40 self.api.add_resource(ComputeStop, "/restapi/compute/<dc_label>/<compute_name>/stop")
41 self.api.add_resource(ComputeStatus, "/restapi/compute/<dc_label>/<compute_name>")
42 self.api.add_resource(DatacenterList, "/restapi/datacenter")
43 self.api.add_resource(DatacenterStatus, "/restapi/datacenter/<dc_label>")
44
45 self.api.add_resource(NetworkAction, "/restapi/network/<vnf_src_name>/<vnf_dst_name>")
46
47 self.api.add_resource(MonitorInterfaceAction, "/restapi/monitor/<vnf_name>/<vnf_interface>/<metric>")
48 self.api.add_resource(MonitorFlowAction, "/restapi/monitor/<vnf_name>/<vnf_interface>/<metric>/<cookie>")
49
50 logging.debug("Created API endpoint %s(%s:%d)" % (self.__class__.__name__, self.ip, self.port))
51
52
53 def connectDatacenter(self, dc):
54 compute.dcs[dc.label] = dc
55 logging.info("Connected DC(%s) to API endpoint %s(%s:%d)" % (dc.label, self.__class__.__name__, self.ip, self.port))
56
57 def connectDCNetwork(self, DCnetwork):
58
59 network.net = DCnetwork
60 monitor.net = DCnetwork
61
62 logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (
63 self.__class__.__name__, self.ip, self.port))
64
65 def start(self):
66 thread = threading.Thread(target= self._start_flask, args=())
67 thread.daemon = True
68 thread.start()
69 logging.info("Started API endpoint @ http://%s:%d" % (self.ip, self.port))
70
71
72 def _start_flask(self):
73 self.app.run(self.ip, self.port, debug=True, use_reloader=False)