blob: 3e872d6eec8bfbee2a3a9382be6966f46efd2c23 [file] [log] [blame]
stevenvanrossemc5a536a2016-02-16 14:52:39 +01001"""
peusterm79ef6ae2016-07-08 13:53:57 +02002Copyright (c) 2015 SONATA-NFV
3ALL RIGHTS RESERVED.
4
5Licensed under the Apache License, Version 2.0 (the "License");
6you may not use this file except in compliance with the License.
7You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16
17Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
18nor the names of its contributors may be used to endorse or promote
19products derived from this software without specific prior written
20permission.
21
22This work has been performed in the framework of the SONATA project,
23funded by the European Commission under Grant number 671517 through
24the Horizon 2020 and 5G-PPP programmes. The authors would like to
25acknowledge the contributions of their colleagues of the SONATA
26partner consortium (www.sonata-nfv.eu).
stevenvanrossemc5a536a2016-02-16 14:52:39 +010027"""
28
29import argparse
30import pprint
stevenvanrossemc5a536a2016-02-16 14:52:39 +010031import zerorpc
stevenvanrossem1a6843a2016-05-19 12:19:36 +020032from emuvim.cli import prometheus
stevenvanrossemc5a536a2016-02-16 14:52:39 +010033
34pp = pprint.PrettyPrinter(indent=4)
35
36class ZeroRpcClient(object):
37
38 def __init__(self):
stevenvanrossem2fdfbf42016-05-13 15:08:47 +020039 # network zerorpc
stevenvanrossemc5a536a2016-02-16 14:52:39 +010040 self.c = zerorpc.Client()
41 # TODO connect to DCNetwork API
42 #self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later
43 self.c.connect("tcp://127.0.0.1:5151")
stevenvanrossem2fdfbf42016-05-13 15:08:47 +020044
45 # compute zerorpc
46 self.compute_api = zerorpc.Client(heartbeat=None, timeout=120) # heartbeat=None, timeout=120
47 self.compute_api.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later
48
stevenvanrossemc5a536a2016-02-16 14:52:39 +010049 self.cmds = {}
50
51 def execute_command(self, args):
52 if getattr(self, args["command"]) is not None:
53 # call the local method with the same name as the command arg
54 getattr(self, args["command"])(args)
55 else:
stevenvanrossem49378152016-05-19 11:33:48 +020056 print("Command not implemented.")
stevenvanrossemc5a536a2016-02-16 14:52:39 +010057
stevenvanrossema24b4372016-04-14 09:55:20 +020058 def setup_metric(self, args):
stevenvanrossemed711fd2016-04-11 16:59:29 +020059 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
60 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
stevenvanrossema24b4372016-04-14 09:55:20 +020061 r = self.c.setup_metric(
62 vnf_name,
63 vnf_interface,
64 args.get("metric"))
65 pp.pprint(r)
stevenvanrossemb098cb52016-04-15 13:28:23 +020066
stevenvanrossembbdb5ee2016-04-15 15:18:44 +020067 def stop_metric(self, args):
stevenvanrossemb098cb52016-04-15 13:28:23 +020068 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
69 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
stevenvanrossem300e1e52016-04-22 22:17:51 +020070 r = self.c.stop_metric(
stevenvanrossemed711fd2016-04-11 16:59:29 +020071 vnf_name,
72 vnf_interface,
stevenvanrossemed711fd2016-04-11 16:59:29 +020073 args.get("metric"))
stevenvanrossemb098cb52016-04-15 13:28:23 +020074 pp.pprint(r)
stevenvanrossemc5a536a2016-02-16 14:52:39 +010075
stevenvanrossem461941c2016-05-10 11:41:29 +020076 def setup_flow(self, args):
77 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
78 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
79 r = self.c.setup_flow(
80 vnf_name,
81 vnf_interface,
82 args.get("metric"),
83 args.get("cookie"))
84 pp.pprint(r)
85
stevenvanrossem81955a52016-05-12 14:34:12 +020086 def stop_flow(self, args):
87 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
88 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
89 r = self.c.stop_flow(
90 vnf_name,
91 vnf_interface,
92 args.get("metric"),
93 args.get("cookie"))
94 pp.pprint(r)
95
stevenvanrossem2fdfbf42016-05-13 15:08:47 +020096 def prometheus(self, args):
stevenvanrosseme131bf52016-07-14 11:42:09 +020097 # This functions makes it more user-friendly to create the correct prometheus query
98 # <uuid> is replaced by the correct uuid of the deployed vnf container
stevenvanrossem2fdfbf42016-05-13 15:08:47 +020099 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
100 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
101 dc_label = args.get("datacenter")
102 query = args.get("query")
103 vnf_status = self.compute_api.compute_status(dc_label, vnf_name)
104 uuid = vnf_status['id']
105 query = query.replace('<uuid>', uuid)
106
107 r = prometheus.query_Prometheus(query)
108 pp.pprint(r)
109
stevenvanrossem461941c2016-05-10 11:41:29 +0200110
stevenvanrossemed711fd2016-04-11 16:59:29 +0200111 def _parse_vnf_name(self, vnf_name_str):
112 vnf_name = vnf_name_str.split(':')[0]
113 return vnf_name
114
115 def _parse_vnf_interface(self, vnf_name_str):
116 try:
117 vnf_interface = vnf_name_str.split(':')[1]
118 except:
119 vnf_interface = None
120
121 return vnf_interface
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100122
stevenvanrossem461941c2016-05-10 11:41:29 +0200123parser = argparse.ArgumentParser(description='son-emu monitor')
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100124parser.add_argument(
125 "command",
stevenvanrossem81955a52016-05-12 14:34:12 +0200126 choices=['setup_metric', 'stop_metric', 'setup_flow', 'stop_flow','prometheus'],
stevenvanrossem2fdfbf42016-05-13 15:08:47 +0200127 help="setup/stop a metric/flow to be monitored or query Prometheus")
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100128parser.add_argument(
129 "--vnf_name", "-vnf", dest="vnf_name",
stevenvanrossembbdb5ee2016-04-15 15:18:44 +0200130 help="vnf name:interface to be monitored")
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100131parser.add_argument(
stevenvanrossemed711fd2016-04-11 16:59:29 +0200132 "--metric", "-m", dest="metric",
stevenvanrossema24b4372016-04-14 09:55:20 +0200133 help="tx_bytes, rx_bytes, tx_packets, rx_packets")
stevenvanrossem461941c2016-05-10 11:41:29 +0200134parser.add_argument(
135 "--cookie", "-c", dest="cookie",
136 help="flow cookie to monitor")
137parser.add_argument(
138 "--query", "-q", dest="query",
139 help="prometheus query")
140parser.add_argument(
141 "--datacenter", "-d", dest="datacenter",
142 help="Data center where the vnf is deployed")
stevenvanrossem994245b2016-05-04 12:36:57 +0200143
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100144def main(argv):
stevenvanrossema24b4372016-04-14 09:55:20 +0200145 #print "This is the son-emu monitor CLI."
146 #print "Arguments: %s" % str(argv)
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100147 args = vars(parser.parse_args(argv))
148 c = ZeroRpcClient()
149 c.execute_command(args)