blob: 3787887e8cb9bc2ae9f88a8e50c0c8833f9ea391 [file] [log] [blame]
peusterm72f09882018-05-15 17:10:27 +02001# Copyright (c) 2015 SONATA-NFV and Paderborn University
2# ALL RIGHTS RESERVED.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16# Neither the name of the SONATA-NFV, Paderborn University
17# nor the names of its contributors may be used to endorse or promote
18# products derived from this software without specific prior written
19# permission.
20#
21# This work has been performed in the framework of the SONATA project,
22# funded by the European Commission under Grant number 671517 through
23# the Horizon 2020 and 5G-PPP programmes. The authors would like to
24# acknowledge the contributions of their colleagues of the SONATA
25# partner consortium (www.sonata-nfv.eu).
26from requests import get, put
stevenvanrossem73efd192016-06-29 01:44:07 +020027import pprint
28import argparse
stevenvanrossem73efd192016-06-29 01:44:07 +020029from emuvim.cli import prometheus
30
31pp = pprint.PrettyPrinter(indent=4)
32
peusterm72f09882018-05-15 17:10:27 +020033
stevenvanrossem73efd192016-06-29 01:44:07 +020034class RestApiClient():
35
36 def __init__(self):
37 self.cmds = {}
38
39 def execute_command(self, args):
40 if getattr(self, args["command"]) is not None:
41 # call the local method with the same name as the command arg
42 getattr(self, args["command"])(args)
43 else:
44 print("Command not implemented.")
45
46 def setup_metric(self, args):
stevenvanrossem73efd192016-06-29 01:44:07 +020047
stevenvanrossemf693a3b2017-06-01 15:15:59 +020048 params = self._create_dict(
49 vnf_name=self._parse_vnf_name(args.get("vnf_name")),
peusterm72f09882018-05-15 17:10:27 +020050 vnf_interface=self._parse_vnf_interface(args.get("vnf_name")),
51 metric=args.get("metric"))
stevenvanrossemf693a3b2017-06-01 15:15:59 +020052
53 url = "{0}/restapi/monitor/interface".format(args.get("endpoint"))
54 response = put(url, params=params)
55 pp.pprint(response.text)
stevenvanrossem73efd192016-06-29 01:44:07 +020056
57 def stop_metric(self, args):
stevenvanrossemf693a3b2017-06-01 15:15:59 +020058 params = self._create_dict(
59 vnf_name=self._parse_vnf_name(args.get("vnf_name")),
60 vnf_interface=self._parse_vnf_interface(args.get("vnf_name")),
61 metric=args.get("metric"))
stevenvanrossem73efd192016-06-29 01:44:07 +020062
stevenvanrossemf693a3b2017-06-01 15:15:59 +020063 url = "{0}/restapi/monitor/interface".format(args.get("endpoint"))
64 response = put(url, params=params)
65 pp.pprint(response.text)
stevenvanrossem73efd192016-06-29 01:44:07 +020066
67 def setup_flow(self, args):
stevenvanrossemf693a3b2017-06-01 15:15:59 +020068 params = self._create_dict(
69 vnf_name=self._parse_vnf_name(args.get("vnf_name")),
70 vnf_interface=self._parse_vnf_interface(args.get("vnf_name")),
71 metric=args.get("metric"),
72 cookie=args.get("cookie"))
stevenvanrossem73efd192016-06-29 01:44:07 +020073
stevenvanrossemf693a3b2017-06-01 15:15:59 +020074 url = "{0}/restapi/monitor/flow".format(args.get("endpoint"))
75 response = put(url, params=params)
76 pp.pprint(response.text)
stevenvanrossem73efd192016-06-29 01:44:07 +020077
78 def stop_flow(self, args):
stevenvanrossemf693a3b2017-06-01 15:15:59 +020079 params = self._create_dict(
80 vnf_name=self._parse_vnf_name(args.get("vnf_name")),
81 vnf_interface=self._parse_vnf_interface(args.get("vnf_name")),
82 metric=args.get("metric"),
83 cookie=args.get("cookie"))
stevenvanrossem73efd192016-06-29 01:44:07 +020084
stevenvanrossemf693a3b2017-06-01 15:15:59 +020085 url = "{0}/restapi/monitor/flow".format(args.get("endpoint"))
86 response = put(url, params=params)
87 pp.pprint(response.text)
stevenvanrossem73efd192016-06-29 01:44:07 +020088
stevenvanrosseme131bf52016-07-14 11:42:09 +020089 def prometheus(self, args):
90 # This functions makes it more user-friendly to create the correct prometheus query
91 # <uuid> is replaced by the correct uuid of the deployed vnf container
92 vnf_name = self._parse_vnf_name(args.get("vnf_name"))
stevenvanrosseme131bf52016-07-14 11:42:09 +020093 query = args.get("query")
stevenvanrossemf693a3b2017-06-01 15:15:59 +020094
stevenvanrosseme131bf52016-07-14 11:42:09 +020095 vnf_status = get("%s/restapi/compute/%s/%s" %
peusterm72f09882018-05-15 17:10:27 +020096 (args.get("endpoint"),
97 args.get("datacenter"),
98 vnf_name)).json()
stevenvanrosseme131bf52016-07-14 11:42:09 +020099 uuid = vnf_status['id']
100 query = query.replace('<uuid>', uuid)
101
102 response = prometheus.query_Prometheus(query)
103 pp.pprint(response)
104
stevenvanrossem73efd192016-06-29 01:44:07 +0200105 def _parse_vnf_name(self, vnf_name_str):
106 vnf_name = vnf_name_str.split(':')[0]
107 return vnf_name
108
109 def _parse_vnf_interface(self, vnf_name_str):
110 try:
111 vnf_interface = vnf_name_str.split(':')[1]
peusterm72f09882018-05-15 17:10:27 +0200112 except BaseException:
stevenvanrossem73efd192016-06-29 01:44:07 +0200113 vnf_interface = None
114
115 return vnf_interface
116
stevenvanrossemf693a3b2017-06-01 15:15:59 +0200117 def _create_dict(self, **kwargs):
118 return kwargs
119
peusterm72f09882018-05-15 17:10:27 +0200120
stevenvanrossemf693a3b2017-06-01 15:15:59 +0200121parser = argparse.ArgumentParser(description='son-emu-cli monitor')
stevenvanrossem73efd192016-06-29 01:44:07 +0200122parser.add_argument(
123 "command",
peusterm72f09882018-05-15 17:10:27 +0200124 choices=['setup_metric', 'stop_metric',
125 'setup_flow', 'stop_flow', 'prometheus'],
stevenvanrossem73efd192016-06-29 01:44:07 +0200126 help="setup/stop a metric/flow to be monitored or query Prometheus")
127parser.add_argument(
128 "--vnf_name", "-vnf", dest="vnf_name",
129 help="vnf name:interface to be monitored")
130parser.add_argument(
131 "--metric", "-m", dest="metric",
132 help="tx_bytes, rx_bytes, tx_packets, rx_packets")
133parser.add_argument(
134 "--cookie", "-c", dest="cookie",
135 help="flow cookie to monitor")
136parser.add_argument(
137 "--query", "-q", dest="query",
138 help="prometheus query")
139parser.add_argument(
140 "--datacenter", "-d", dest="datacenter",
141 help="Data center where the vnf is deployed")
142parser.add_argument(
143 "--endpoint", "-e", dest="endpoint",
peusterm0a336cc2016-07-04 09:15:47 +0200144 default="http://127.0.0.1:5001",
stevenvanrossemf693a3b2017-06-01 15:15:59 +0200145 help="REST API endpoint of son-emu (default:http://127.0.0.1:5001)")
stevenvanrossem73efd192016-06-29 01:44:07 +0200146
peusterm72f09882018-05-15 17:10:27 +0200147
stevenvanrossem73efd192016-06-29 01:44:07 +0200148def main(argv):
149 args = vars(parser.parse_args(argv))
150 c = RestApiClient()
peusterm72f09882018-05-15 17:10:27 +0200151 c.execute_command(args)