Merge pull request #131 from stevenvanrossem/master
[osm/vim-emu.git] / src / emuvim / cli / rest / monitor.py
1 from requests import get, put, delete
2 from tabulate import tabulate
3 import pprint
4 import argparse
5 import json
6 from emuvim.cli import prometheus
7
8 pp = pprint.PrettyPrinter(indent=4)
9
10 class RestApiClient():
11
12 def __init__(self):
13 self.cmds = {}
14
15 def execute_command(self, args):
16 if getattr(self, args["command"]) is not None:
17 # call the local method with the same name as the command arg
18 getattr(self, args["command"])(args)
19 else:
20 print("Command not implemented.")
21
22 def setup_metric(self, args):
23 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
24 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
25
26 response = put("%s/restapi/monitor/%s/%s/%s" %
27 (args.get("endpoint"),
28 vnf_name,
29 vnf_interface,
30 args.get("metric")))
31 pp.pprint(response.json())
32
33 def stop_metric(self, args):
34 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
35 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
36
37 response = delete("%s/restapi/monitor/%s/%s/%s" %
38 (args.get("endpoint"),
39 vnf_name,
40 vnf_interface,
41 args.get("metric")))
42 pp.pprint(response.json())
43
44 def setup_flow(self, args):
45 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
46 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
47
48 response = put("%s/restapi/monitor/%s/%s/%s/%s" %
49 (args.get("endpoint"),
50 vnf_name,
51 vnf_interface,
52 args.get("metric"),
53 args.get("cookie")))
54
55 pp.pprint(response.json())
56
57 def stop_flow(self, args):
58 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
59 vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
60
61 response = delete("%s/restapi/monitor/%s/%s/%s/%s" %
62 (args.get("endpoint"),
63 vnf_name,
64 vnf_interface,
65 args.get("metric"),
66 args.get("cookie")))
67
68 pp.pprint(response.json())
69
70 def _parse_vnf_name(self, vnf_name_str):
71 vnf_name = vnf_name_str.split(':')[0]
72 return vnf_name
73
74 def _parse_vnf_interface(self, vnf_name_str):
75 try:
76 vnf_interface = vnf_name_str.split(':')[1]
77 except:
78 vnf_interface = None
79
80 return vnf_interface
81
82 parser = argparse.ArgumentParser(description='son-emu monitor')
83 parser.add_argument(
84 "command",
85 choices=['setup_metric', 'stop_metric', 'setup_flow', 'stop_flow','prometheus'],
86 help="setup/stop a metric/flow to be monitored or query Prometheus")
87 parser.add_argument(
88 "--vnf_name", "-vnf", dest="vnf_name",
89 help="vnf name:interface to be monitored")
90 parser.add_argument(
91 "--metric", "-m", dest="metric",
92 help="tx_bytes, rx_bytes, tx_packets, rx_packets")
93 parser.add_argument(
94 "--cookie", "-c", dest="cookie",
95 help="flow cookie to monitor")
96 parser.add_argument(
97 "--query", "-q", dest="query",
98 help="prometheus query")
99 parser.add_argument(
100 "--datacenter", "-d", dest="datacenter",
101 help="Data center where the vnf is deployed")
102 parser.add_argument(
103 "--endpoint", "-e", dest="endpoint",
104 default="http://127.0.0.1:5001",
105 help="UUID of the plugin to be manipulated.")
106
107 def main(argv):
108 args = vars(parser.parse_args(argv))
109 c = RestApiClient()
110 c.execute_command(args)