blob: 9620a98aca368e7521edf077f87e9bcba8729c30 [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_zrpc(self, args):
stevenvanrossem461941c2016-05-10 11:41:29 +020097 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
98 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
99 r = self.c.prometheus(
100 args.get("datacenter"),
101 vnf_name,
102 vnf_interface,
103 args.get("query"))
104 pp.pprint(r)
105
stevenvanrossem2fdfbf42016-05-13 15:08:47 +0200106 def prometheus(self, args):
107 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
108 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
109 dc_label = args.get("datacenter")
110 query = args.get("query")
111 vnf_status = self.compute_api.compute_status(dc_label, vnf_name)
112 uuid = vnf_status['id']
113 query = query.replace('<uuid>', uuid)
114
115 r = prometheus.query_Prometheus(query)
116 pp.pprint(r)
117
stevenvanrossem461941c2016-05-10 11:41:29 +0200118
stevenvanrossemed711fd2016-04-11 16:59:29 +0200119 def _parse_vnf_name(self, vnf_name_str):
120 vnf_name = vnf_name_str.split(':')[0]
121 return vnf_name
122
123 def _parse_vnf_interface(self, vnf_name_str):
124 try:
125 vnf_interface = vnf_name_str.split(':')[1]
126 except:
127 vnf_interface = None
128
129 return vnf_interface
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100130
stevenvanrossem461941c2016-05-10 11:41:29 +0200131parser = argparse.ArgumentParser(description='son-emu monitor')
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100132parser.add_argument(
133 "command",
stevenvanrossem81955a52016-05-12 14:34:12 +0200134 choices=['setup_metric', 'stop_metric', 'setup_flow', 'stop_flow','prometheus'],
stevenvanrossem2fdfbf42016-05-13 15:08:47 +0200135 help="setup/stop a metric/flow to be monitored or query Prometheus")
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100136parser.add_argument(
137 "--vnf_name", "-vnf", dest="vnf_name",
stevenvanrossembbdb5ee2016-04-15 15:18:44 +0200138 help="vnf name:interface to be monitored")
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100139parser.add_argument(
stevenvanrossemed711fd2016-04-11 16:59:29 +0200140 "--metric", "-m", dest="metric",
stevenvanrossema24b4372016-04-14 09:55:20 +0200141 help="tx_bytes, rx_bytes, tx_packets, rx_packets")
stevenvanrossem461941c2016-05-10 11:41:29 +0200142parser.add_argument(
143 "--cookie", "-c", dest="cookie",
144 help="flow cookie to monitor")
145parser.add_argument(
146 "--query", "-q", dest="query",
147 help="prometheus query")
148parser.add_argument(
149 "--datacenter", "-d", dest="datacenter",
150 help="Data center where the vnf is deployed")
stevenvanrossem994245b2016-05-04 12:36:57 +0200151
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100152def main(argv):
stevenvanrossema24b4372016-04-14 09:55:20 +0200153 #print "This is the son-emu monitor CLI."
154 #print "Arguments: %s" % str(argv)
stevenvanrossemc5a536a2016-02-16 14:52:39 +0100155 args = vars(parser.parse_args(argv))
156 c = ZeroRpcClient()
157 c.execute_command(args)