Merge pull request #95 from stevenvanrossem/master
[osm/vim-emu.git] / src / emuvim / api / zerorpc / network.py
1 """
2 Distributed Cloud Emulator (dcemulator)
3 """
4
5 import logging
6 import threading
7 import zerorpc
8
9
10 logging.basicConfig(level=logging.INFO)
11
12
13 class ZeroRpcApiEndpointDCNetwork(object):
14 """
15 Simple API endpoint that offers a zerorpc-based
16 interface. This interface will be used by the
17 default command line client.
18 It can be used as a reference to implement
19 REST interfaces providing the same semantics,
20 like e.g. OpenStack compute API.
21 """
22
23 def __init__(self, listenip, port, DCNetwork=None):
24 if DCNetwork :
25 self.connectDCNetwork(DCNetwork)
26 self.ip = listenip
27 self.port = port
28 logging.debug("Created monitoring API endpoint %s(%s:%d)" % (
29 self.__class__.__name__, self.ip, self.port))
30
31 def connectDCNetwork(self, net):
32 self.net = net
33 logging.info("Connected DCNetwork to API endpoint %s(%s:%d)" % (
34 self.__class__.__name__, self.ip, self.port))
35
36 def start(self):
37 thread = threading.Thread(target=self._api_server_thread, args=())
38 thread.daemon = True
39 thread.start()
40 logging.debug("Started API endpoint %s(%s:%d)" % (
41 self.__class__.__name__, self.ip, self.port))
42
43 def _api_server_thread(self):
44 s = zerorpc.Server(DCNetworkApi(self.net))
45 s.bind("tcp://%s:%d" % (self.ip, self.port))
46 s.run()
47
48 def stop(self):
49 logging.info("Stop the monitoring API endpoint")
50 return
51
52
53 class DCNetworkApi(object):
54 """
55 The networking and monitoring commands need the scope of the
56 whole DC network to find the requested vnf. So this API is intended
57 to work with a DCNetwork.
58 Just pass through the corresponding request to the
59 selected data center network. Do not implement provisioning
60 logic here because will will have multiple API
61 endpoint implementations at the end.
62 """
63
64 def __init__(self, net):
65 self.net = net
66
67 def network_action_start(self, vnf_src_name, vnf_dst_name, kwargs):
68 # call DCNetwork method, not really datacenter specific API for now...
69 # provided dc name needs to be part of API endpoint
70 # no check if vnfs are really connected to this datacenter...
71 logging.debug("RPC CALL: network chain start")
72 try:
73 c = self.net.setChain(
74 vnf_src_name, vnf_dst_name,
75 vnf_src_interface=kwargs.get('vnf_src_interface'),
76 vnf_dst_interface=kwargs.get('vnf_dst_interface'),
77 cmd='add-flow',
78 weight=kwargs.get('weight'),
79 match=kwargs.get('match'),
80 bidirectional=kwargs.get('bidirectional'),
81 cookie=kwargs.get('cookie'))
82 return str(c)
83 except Exception as ex:
84 logging.exception("RPC error.")
85 return ex.message
86
87 def network_action_stop(self, vnf_src_name, vnf_dst_name, kwargs):
88 # call DCNetwork method, not really datacenter specific API for now...
89 # provided dc name needs to be part of API endpoint
90 # no check if vnfs are really connected to this datacenter...
91 logging.debug("RPC CALL: network chain stop")
92 try:
93 c = self.net.setChain(
94 vnf_src_name, vnf_dst_name,
95 vnf_src_interface=kwargs.get('vnf_src_interface'),
96 vnf_dst_interface=kwargs.get('vnf_dst_interface'),
97 cmd='del-flows',
98 weight=kwargs.get('weight'),
99 match=kwargs.get('match'),
100 bidirectional=kwargs.get('bidirectional'))
101 return c
102 except Exception as ex:
103 logging.exception("RPC error.")
104 return ex.message
105
106 # setup the rate measurement for a vnf interface
107 def setup_metric(self, vnf_name, vnf_interface, metric):
108 logging.debug("RPC CALL: setup metric")
109 try:
110 c = self.net.monitor_agent.setup_metric(vnf_name, vnf_interface, metric)
111 return c
112 except Exception as ex:
113 logging.exception("RPC error.")
114 return ex.message
115
116 # remove the rate measurement for a vnf interface
117 def stop_metric(self, vnf_name, vnf_interface, metric):
118 logging.debug("RPC CALL: stop metric")
119 try:
120 c = self.net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric)
121 return c
122 except Exception as ex:
123 logging.exception("RPC error.")
124 return ex.message
125
126 # setup the flow metrics measurement
127 def setup_flow(self, vnf_name, vnf_interface, metric, cookie):
128 logging.debug("RPC CALL: setup flow")
129 try:
130 c = self.net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie)
131 return c
132 except Exception as ex:
133 logging.exception("RPC error.")
134 return ex.message
135
136 # do prometheus query
137 def prometheus(self, dc_label, vnf_name, vnf_interface, query):
138 logging.debug("RPC CALL: query prometheus")
139 vnf_status = self.net.dcs.get(dc_label).containers.get(vnf_name).getStatus()
140 uuid = vnf_status['id']
141 query = query.replace('<uuid>', uuid)
142 #if needed, replace interface id with emu-intfs name
143 # query = query.replace('<intf>', vnf_interface)
144 logging.info('query: {0}'.format(query))
145 try:
146 c = self.net.monitor_agent.query_Prometheus(query)
147 return c
148 except Exception as ex:
149 logging.exception("RPC error.")
150 return ex.message
151
152
153