+++ /dev/null
-"""
-Copyright (c) 2015 SONATA-NFV and Paderborn University
-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
-
-
-pp = pprint.PrettyPrinter(indent=4)
-
-
-class ZeroRpcClient(object):
-
- def __init__(self):
- self.c = zerorpc.Client(heartbeat=None, timeout=120) #heartbeat=None, timeout=120
- self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later
- self.cmds = {}
-
- def execute_command(self, args):
- if getattr(self, args["command"]) is not None:
- # call the local method with the same name as the command arg
- getattr(self, args["command"])(args)
- else:
- print("Command not implemented.")
-
- def start(self, args):
- nw_list = list()
- if args.get("network") is not None:
- nw_list = self._parse_network(args.get("network"))
- r = self.c.compute_action_start(
- args.get("datacenter"),
- args.get("name"),
- args.get("image"),
- nw_list,
- args.get("docker_command")
- )
- pp.pprint(r)
-
- def stop(self, args):
- r = self.c.compute_action_stop(
- args.get("datacenter"), args.get("name"))
- pp.pprint(r)
-
- def list(self, args):
- r = self.c.compute_list(
- args.get("datacenter"))
- table = []
- for c in r:
- # for each container add a line to the output table
- if len(c) > 1:
- name = c[0]
- status = c[1]
- eth0ip = None
- eth0status = "down"
- if len(status.get("network")) > 0:
- eth0ip = status.get("network")[0].get("ip")
- eth0status = "up" if status.get(
- "network")[0].get("up") else "down"
- table.append([status.get("datacenter"),
- name,
- status.get("image"),
- eth0ip,
- eth0status,
- status.get("state").get("Status")])
- headers = ["Datacenter",
- "Container",
- "Image",
- "eth0 IP",
- "eth0 status",
- "Status"]
- print(tabulate(table, headers=headers, tablefmt="grid"))
-
- def status(self, args):
- r = self.c.compute_status(
- args.get("datacenter"), args.get("name"))
- pp.pprint(r)
-
- def _create_dict(self, **kwargs):
- return kwargs
-
- def _parse_network(self, network_str):
- '''
- parse the options for all network interfaces of the vnf
- :param network_str: (id=x,ip=x.x.x.x/x), ...
- :return: list of dicts [{"id":x,"ip":"x.x.x.x/x"}, ...]
- '''
- nw_list = list()
- networks = network_str[1:-1].split('),(')
- for nw in networks:
- nw_dict = dict(tuple(e.split('=')) for e in nw.split(','))
- nw_list.append(nw_dict)
-
- return nw_list
-
-
-
-parser = argparse.ArgumentParser(description='son-emu compute')
-parser.add_argument(
- "command",
- choices=['start', 'stop', 'list', 'status'],
- help="Action to be executed.")
-parser.add_argument(
- "--datacenter", "-d", dest="datacenter",
- help="Data center to in which the compute instance should be executed")
-parser.add_argument(
- "--name", "-n", dest="name",
- help="Name of compute instance e.g. 'vnf1'")
-parser.add_argument(
- "--image","-i", dest="image",
- help="Name of container image to be used e.g. 'ubuntu:trusty'")
-parser.add_argument(
- "--dcmd", "-c", dest="docker_command",
- help="Startup command of the container e.g. './start.sh'")
-parser.add_argument(
- "--net", dest="network",
- help="Network properties of a compute instance e.g. \
- '(id=input,ip=10.0.10.3/24),(id=output,ip=10.0.10.4/24)' for multiple interfaces.")
-
-def main(argv):
- args = vars(parser.parse_args(argv))
- c = ZeroRpcClient()
- c.execute_command(args)
+++ /dev/null
-"""
-Copyright (c) 2015 SONATA-NFV and Paderborn University
-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
-
-
-pp = pprint.PrettyPrinter(indent=4)
-
-
-class ZeroRpcClient(object):
-
- def __init__(self):
- self.c = zerorpc.Client()
- self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later
- self.cmds = {}
-
- def execute_command(self, args):
- if getattr(self, args["command"]) is not None:
- # call the local method with the same name as the command arg
- getattr(self, args["command"])(args)
- else:
- print("Command not implemented.")
-
- def list(self, args):
- r = self.c.datacenter_list()
- table = []
- for d in r:
- # for each dc add a line to the output table
- if len(d) > 0:
- table.append([d.get("label"),
- d.get("internalname"),
- d.get("switch"),
- d.get("n_running_containers"),
- len(d.get("metadata"))])
- headers = ["Label",
- "Internal Name",
- "Switch",
- "# Containers",
- "# Metadata Items"]
- print(tabulate(table, headers=headers, tablefmt="grid"))
-
- def status(self, args):
- r = self.c.datacenter_status(
- args.get("datacenter"))
- pp.pprint(r)
-
-
-parser = argparse.ArgumentParser(description='son-emu datacenter')
-parser.add_argument(
- "command",
- choices=['list', 'status'],
- help="Action to be executed.")
-parser.add_argument(
- "--datacenter", "-d", dest="datacenter",
- help="Data center to which the command should be applied.")
-
-
-def main(argv):
- args = vars(parser.parse_args(argv))
- c = ZeroRpcClient()
- c.execute_command(args)
+++ /dev/null
-"""\r
-Copyright (c) 2015 SONATA-NFV\r
-ALL RIGHTS RESERVED.\r
-\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
- http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
-limitations under the License.\r
-\r
-Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]\r
-nor the names of its contributors may be used to endorse or promote\r
-products derived from this software without specific prior written\r
-permission.\r
-\r
-This work has been performed in the framework of the SONATA project,\r
-funded by the European Commission under Grant number 671517 through\r
-the Horizon 2020 and 5G-PPP programmes. The authors would like to\r
-acknowledge the contributions of their colleagues of the SONATA\r
-partner consortium (www.sonata-nfv.eu).\r
-"""\r
-\r
-import argparse\r
-import pprint\r
-import zerorpc\r
-from emuvim.cli import prometheus\r
-\r
-pp = pprint.PrettyPrinter(indent=4)\r
-\r
-class ZeroRpcClient(object):\r
-\r
- def __init__(self):\r
- # network zerorpc\r
- self.c = zerorpc.Client()\r
- # TODO connect to DCNetwork API\r
- #self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later\r
- self.c.connect("tcp://127.0.0.1:5151")\r
-\r
- # compute zerorpc\r
- self.compute_api = zerorpc.Client(heartbeat=None, timeout=120) # heartbeat=None, timeout=120\r
- self.compute_api.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later\r
-\r
- self.cmds = {}\r
-\r
- def execute_command(self, args):\r
- if getattr(self, args["command"]) is not None:\r
- # call the local method with the same name as the command arg\r
- getattr(self, args["command"])(args)\r
- else:\r
- print("Command not implemented.")\r
-\r
- def setup_metric(self, args):\r
- vnf_name = self._parse_vnf_name(args.get("vnf_name"))\r
- vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))\r
- r = self.c.setup_metric(\r
- vnf_name,\r
- vnf_interface,\r
- args.get("metric"))\r
- pp.pprint(r)\r
-\r
- def stop_metric(self, args):\r
- vnf_name = self._parse_vnf_name(args.get("vnf_name"))\r
- vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))\r
- r = self.c.stop_metric(\r
- vnf_name,\r
- vnf_interface,\r
- args.get("metric"))\r
- pp.pprint(r)\r
-\r
- def setup_flow(self, args):\r
- vnf_name = self._parse_vnf_name(args.get("vnf_name"))\r
- vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))\r
- r = self.c.setup_flow(\r
- vnf_name,\r
- vnf_interface,\r
- args.get("metric"),\r
- args.get("cookie"))\r
- pp.pprint(r)\r
-\r
- def stop_flow(self, args):\r
- vnf_name = self._parse_vnf_name(args.get("vnf_name"))\r
- vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))\r
- r = self.c.stop_flow(\r
- vnf_name,\r
- vnf_interface,\r
- args.get("metric"),\r
- args.get("cookie"))\r
- pp.pprint(r)\r
-\r
- def prometheus(self, args):\r
- # This functions makes it more user-friendly to create the correct prometheus query\r
- # <uuid> is replaced by the correct uuid of the deployed vnf container\r
- vnf_name = self._parse_vnf_name(args.get("vnf_name"))\r
- vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))\r
- dc_label = args.get("datacenter")\r
- query = args.get("query")\r
- vnf_status = self.compute_api.compute_status(dc_label, vnf_name)\r
- uuid = vnf_status['id']\r
- query = query.replace('<uuid>', uuid)\r
-\r
- r = prometheus.query_Prometheus(query)\r
- pp.pprint(r)\r
-\r
-\r
- def _parse_vnf_name(self, vnf_name_str):\r
- vnf_name = vnf_name_str.split(':')[0]\r
- return vnf_name\r
-\r
- def _parse_vnf_interface(self, vnf_name_str):\r
- try:\r
- vnf_interface = vnf_name_str.split(':')[1]\r
- except:\r
- vnf_interface = None\r
-\r
- return vnf_interface\r
-\r
-parser = argparse.ArgumentParser(description='son-emu monitor')\r
-parser.add_argument(\r
- "command",\r
- choices=['setup_metric', 'stop_metric', 'setup_flow', 'stop_flow','prometheus'],\r
- help="setup/stop a metric/flow to be monitored or query Prometheus")\r
-parser.add_argument(\r
- "--vnf_name", "-vnf", dest="vnf_name",\r
- help="vnf name:interface to be monitored")\r
-parser.add_argument(\r
- "--metric", "-m", dest="metric",\r
- help="tx_bytes, rx_bytes, tx_packets, rx_packets")\r
-parser.add_argument(\r
- "--cookie", "-c", dest="cookie",\r
- help="flow cookie to monitor")\r
-parser.add_argument(\r
- "--query", "-q", dest="query",\r
- help="prometheus query")\r
-parser.add_argument(\r
- "--datacenter", "-d", dest="datacenter",\r
- help="Data center where the vnf is deployed")\r
-\r
-def main(argv):\r
- #print "This is the son-emu monitor CLI."\r
- #print "Arguments: %s" % str(argv)\r
- args = vars(parser.parse_args(argv))\r
- c = ZeroRpcClient()\r
- c.execute_command(args)\r
+++ /dev/null
-"""\r
-Copyright (c) 2015 SONATA-NFV\r
-ALL RIGHTS RESERVED.\r
-\r
-Licensed under the Apache License, Version 2.0 (the "License");\r
-you may not use this file except in compliance with the License.\r
-You may obtain a copy of the License at\r
-\r
- http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-Unless required by applicable law or agreed to in writing, software\r
-distributed under the License is distributed on an "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-See the License for the specific language governing permissions and\r
-limitations under the License.\r
-\r
-Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]\r
-nor the names of its contributors may be used to endorse or promote\r
-products derived from this software without specific prior written\r
-permission.\r
-\r
-This work has been performed in the framework of the SONATA project,\r
-funded by the European Commission under Grant number 671517 through\r
-the Horizon 2020 and 5G-PPP programmes. The authors would like to\r
-acknowledge the contributions of their colleagues of the SONATA\r
-partner consortium (www.sonata-nfv.eu).\r
-"""\r
-\r
-import argparse\r
-import pprint\r
-from tabulate import tabulate\r
-import zerorpc\r
-\r
-\r
-pp = pprint.PrettyPrinter(indent=4)\r
-\r
-class ZeroRpcClient(object):\r
-\r
- def __init__(self):\r
- self.c = zerorpc.Client()\r
- # TODO connect to DCNetwork API\r
- #self.c.connect("tcp://127.0.0.1:4242") # TODO hard coded for now. we'll change this later\r
- self.c.connect("tcp://127.0.0.1:5151")\r
- self.cmds = {}\r
-\r
- def execute_command(self, args):\r
- if getattr(self, args["command"]) is not None:\r
- # call the local method with the same name as the command arg\r
- getattr(self, args["command"])(args)\r
- else:\r
- print("Command not implemented.")\r
-\r
- def add(self, args):\r
- vnf_src_name = self._parse_vnf_name(args.get("source"))\r
- vnf_dst_name = self._parse_vnf_name(args.get("destination"))\r
-\r
- params = self._create_dict(\r
- vnf_src_interface=self._parse_vnf_interface(args.get("source")),\r
- vnf_dst_interface=self._parse_vnf_interface(args.get("destination")),\r
- weight=args.get("weight"),\r
- match=args.get("match"),\r
- bidirectional=args.get("bidirectional"),\r
- cookie=args.get("cookie"))\r
-\r
- # note zerorpc does not support named arguments\r
- r = self.c.network_action_start(\r
- #args.get("datacenter"),\r
- vnf_src_name,\r
- vnf_dst_name,\r
- params)\r
- pp.pprint(r)\r
-\r
- def remove(self, args):\r
- vnf_src_name = self._parse_vnf_name(args.get("source"))\r
- vnf_dst_name = self._parse_vnf_name(args.get("destination"))\r
-\r
- params = self._create_dict(\r
- vnf_src_interface=self._parse_vnf_interface(args.get("source")),\r
- vnf_dst_interface=self._parse_vnf_interface(args.get("destination")),\r
- weight=args.get("weight"),\r
- match=args.get("match"),\r
- bidirectional=args.get("bidirectional"),\r
- cookie=args.get("cookie"))\r
-\r
- r = self.c.network_action_stop(\r
- #args.get("datacenter"),\r
- vnf_src_name,\r
- vnf_dst_name,\r
- params)\r
- pp.pprint(r)\r
-\r
- def _parse_vnf_name(self, vnf_name_str):\r
- vnf_name = vnf_name_str.split(':')[0]\r
- return vnf_name\r
-\r
- def _parse_vnf_interface(self, vnf_name_str):\r
- try:\r
- vnf_interface = vnf_name_str.split(':')[1]\r
- except:\r
- vnf_interface = None\r
-\r
- return vnf_interface\r
-\r
- def _create_dict(self, **kwargs):\r
- return kwargs\r
-\r
-parser = argparse.ArgumentParser(description='son-emu network')\r
-parser.add_argument(\r
- "command",\r
- choices=['add', 'remove'],\r
- help="Action to be executed.")\r
-parser.add_argument(\r
- "--datacenter", "-d", dest="datacenter",\r
- help="Data center to in which the network action should be initiated")\r
-parser.add_argument(\r
- "--source", "-src", dest="source",\r
- help="vnf name of the source of the chain")\r
-parser.add_argument(\r
- "--destination", "-dst", dest="destination",\r
- help="vnf name of the destination of the chain")\r
-parser.add_argument(\r
- "--weight", "-w", dest="weight",\r
- help="weight metric to calculate the path")\r
-parser.add_argument(\r
- "--match", "-m", dest="match",\r
- help="string holding extra matches for the flow entries")\r
-parser.add_argument(\r
- "--bidirectional", "-b", dest="bidirectional",\r
- action='store_true',\r
- help="add/remove the flow entries from src to dst and back")\r
-parser.add_argument(\r
- "--cookie", "-c", dest="cookie",\r
- help="cookie for this flow, as easy to use identifier (eg. per tenant/service)")\r
-\r
-def main(argv):\r
- args = vars(parser.parse_args(argv))\r
- c = ZeroRpcClient()\r
- c.execute_command(args)\r
"""
import sys
-
-from emuvim.cli import compute
-from emuvim.cli import datacenter
-from emuvim.cli import monitor
-from emuvim.cli import network
from emuvim.cli.rest import compute as restcom
from emuvim.cli.rest import datacenter as restdc
from emuvim.cli.rest import monitor as restmon
def main():
if len(sys.argv) < 2:
- print("Usage: son-emu-cli <toolname> <arguments>")
+ print("Usage: son-emu-cli compute|datacenter|network|monitor <arguments>")
exit(0)
- if sys.argv[1] == "compute-zapi":
- compute.main(sys.argv[2:])
- elif sys.argv[1] == "network-zapi":
- network.main(sys.argv[2:])
- elif sys.argv[1] == "datacenter-zapi":
- datacenter.main(sys.argv[2:])
- elif sys.argv[1] == "monitor-zapi":
- monitor.main(sys.argv[2:])
elif sys.argv[1] == "monitor":
restmon.main(sys.argv[2:])
elif sys.argv[1] == "network":