X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fcli%2Fmonitor.py;h=9620a98aca368e7521edf077f87e9bcba8729c30;hb=0d98d75450be28bba00ebabcd9041b4ae541f964;hp=0c3c515289a79b29315755a31212aff5bcf085ac;hpb=43a9649213180695e908e67e01d3c4e77bc7b2ca;p=osm%2Fvim-emu.git diff --git a/src/emuvim/cli/monitor.py b/src/emuvim/cli/monitor.py index 0c3c515..9620a98 100755 --- a/src/emuvim/cli/monitor.py +++ b/src/emuvim/cli/monitor.py @@ -1,24 +1,51 @@ """ -son-emu network CLI -(c) 2016 by Manuel Peuster +Copyright (c) 2015 SONATA-NFV +ALL RIGHTS RESERVED. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION] +nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +This work has been performed in the framework of the SONATA project, +funded by the European Commission under Grant number 671517 through +the Horizon 2020 and 5G-PPP programmes. The authors would like to +acknowledge the contributions of their colleagues of the SONATA +partner consortium (www.sonata-nfv.eu). """ import argparse import pprint -from tabulate import tabulate import zerorpc -import time - +from emuvim.cli import prometheus pp = pprint.PrettyPrinter(indent=4) class ZeroRpcClient(object): def __init__(self): + # network zerorpc self.c = zerorpc.Client() # TODO connect to DCNetwork API #self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later self.c.connect("tcp://127.0.0.1:5151") + + # compute zerorpc + self.compute_api = zerorpc.Client(heartbeat=None, timeout=120) # heartbeat=None, timeout=120 + self.compute_api.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later + self.cmds = {} def execute_command(self, args): @@ -26,24 +53,68 @@ class ZeroRpcClient(object): # call the local method with the same name as the command arg getattr(self, args["command"])(args) else: - print "Command not implemented." + print("Command not implemented.") - def get_rate(self, args): + def setup_metric(self, args): vnf_name = self._parse_vnf_name(args.get("vnf_name")) vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) - self.c.monitor_setup_rate_measurement( + r = self.c.setup_metric( vnf_name, vnf_interface, - args.get("direction"), args.get("metric")) - while True: - r = self.c.monitor_get_rate( - vnf_name, - vnf_interface, - args.get("direction"), - args.get("metric")) - pp.pprint(r) - time.sleep(1) + pp.pprint(r) + + def stop_metric(self, args): + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + r = self.c.stop_metric( + vnf_name, + vnf_interface, + args.get("metric")) + pp.pprint(r) + + def setup_flow(self, args): + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + r = self.c.setup_flow( + vnf_name, + vnf_interface, + args.get("metric"), + args.get("cookie")) + pp.pprint(r) + + def stop_flow(self, args): + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + r = self.c.stop_flow( + vnf_name, + vnf_interface, + args.get("metric"), + args.get("cookie")) + pp.pprint(r) + + def prometheus_zrpc(self, args): + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + r = self.c.prometheus( + args.get("datacenter"), + vnf_name, + vnf_interface, + args.get("query")) + pp.pprint(r) + + def prometheus(self, args): + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + dc_label = args.get("datacenter") + query = args.get("query") + vnf_status = self.compute_api.compute_status(dc_label, vnf_name) + uuid = vnf_status['id'] + query = query.replace('', uuid) + + r = prometheus.query_Prometheus(query) + pp.pprint(r) + def _parse_vnf_name(self, vnf_name_str): vnf_name = vnf_name_str.split(':')[0] @@ -57,23 +128,30 @@ class ZeroRpcClient(object): return vnf_interface -parser = argparse.ArgumentParser(description='son-emu network') +parser = argparse.ArgumentParser(description='son-emu monitor') parser.add_argument( "command", - help="Action to be executed: get_rate") + choices=['setup_metric', 'stop_metric', 'setup_flow', 'stop_flow','prometheus'], + help="setup/stop a metric/flow to be monitored or query Prometheus") parser.add_argument( "--vnf_name", "-vnf", dest="vnf_name", - help="vnf name to be monitored") -parser.add_argument( - "--direction", "-d", dest="direction", - help="rx (ingress rate) or tx (egress rate)") + help="vnf name:interface to be monitored") parser.add_argument( "--metric", "-m", dest="metric", - help="bytes (byte rate), packets (packet rate)") + help="tx_bytes, rx_bytes, tx_packets, rx_packets") +parser.add_argument( + "--cookie", "-c", dest="cookie", + help="flow cookie to monitor") +parser.add_argument( + "--query", "-q", dest="query", + help="prometheus query") +parser.add_argument( + "--datacenter", "-d", dest="datacenter", + help="Data center where the vnf is deployed") def main(argv): - print "This is the son-emu monitor CLI." - print "Arguments: %s" % str(argv) + #print "This is the son-emu monitor CLI." + #print "Arguments: %s" % str(argv) args = vars(parser.parse_args(argv)) c = ZeroRpcClient() c.execute_command(args)