X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fcli%2Frest%2Fcompute.py;h=9e5e0abb462cd425e223034d16447acae4ad9ec7;hb=9cc7360bf2c0dacb869d8ed0674d9d9e269a1082;hp=4a20ca94978ace7044d1f37a2ad406dfdb327f11;hpb=0a336cc612849715b03a513a7b4668d30542b5d6;p=osm%2Fvim-emu.git diff --git a/src/emuvim/cli/rest/compute.py b/src/emuvim/cli/rest/compute.py index 4a20ca9..9e5e0ab 100755 --- a/src/emuvim/cli/rest/compute.py +++ b/src/emuvim/cli/rest/compute.py @@ -1,13 +1,41 @@ -from requests import get,put +""" +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). +""" +from requests import get, put, delete from tabulate import tabulate import pprint import argparse import json +from subprocess import Popen pp = pprint.PrettyPrinter(indent=4) -class RestApiClient(): +class RestApiClient(): def __init__(self): self.cmds = {} @@ -20,31 +48,29 @@ class RestApiClient(): def start(self, args): - nw_list = list() - if args.get("network") is not None: - nw_list = self._parse_network(args.get("network")) - req = {'image':args.get("image"), - 'command':args.get("docker_command"), - 'network':nw_list} + req = {'image': args.get("image"), + 'command': args.get("docker_command"), + 'network': args.get("network")} - response = put("%s/restapi/compute/%s/%s/start" % + response = put("%s/restapi/compute/%s/%s" % (args.get("endpoint"), args.get("datacenter"), args.get("name")), - json = json.dumps(req)) + json=req) + pp.pprint(response.json()) def stop(self, args): - response = get("%s/restapi/compute/%s/%s/stop" % - (args.get("endpoint"), - args.get("datacenter"), - args.get("name"))) + response = delete("%s/restapi/compute/%s/%s" % + (args.get("endpoint"), + args.get("datacenter"), + args.get("name"))) pp.pprint(response.json()) - def list(self,args): + def list(self, args): - list = get('%s/restapi/compute/%s' % (args.get("endpoint"),args.get('datacenter'))).json() + list = get('%s/restapi/compute/%s' % (args.get("endpoint"), args.get('datacenter'))).json() table = [] for c in list: @@ -52,57 +78,53 @@ class RestApiClient(): 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" + #eth0ip = status.get("docker_network", "-") + netw_list = [netw_dict['intf_name'] for netw_dict in status.get("network")] + dc_if_list = [netw_dict['dc_portname'] for netw_dict in status.get("network")] table.append([status.get("datacenter"), name, status.get("image"), - eth0ip, - eth0status, - status.get("state").get("Status")]) + ','.join(netw_list), + ','.join(dc_if_list)]) + #status.get("state").get("Status")] headers = ["Datacenter", "Container", "Image", - "eth0 IP", - "eth0 status", - "Status"] + "Interface list", + "Datacenter interfaces"] print(tabulate(table, headers=headers, tablefmt="grid")) - def status(self,args): + def status(self, args): list = get("%s/restapi/compute/%s/%s" % (args.get("endpoint"), args.get("datacenter"), args.get("name"))).json() - pp.pprint(list) - - - - 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 + pp.pprint(list) -parser = argparse.ArgumentParser(description='son-emu datacenter') + def xterm(self, args): + vnf_names = args.get("vnf_names") + for vnf_name in vnf_names: + Popen(['xterm', '-xrm', 'XTerm.vt100.allowTitleOps: false', '-T', vnf_name, + '-e', "docker exec -it mn.{0} /bin/bash".format(vnf_name)]) + +parser = argparse.ArgumentParser(description="""son-emu compute + + Examples: + - son-emu-cli compute start -d dc2 -n client -i sonatanfv/sonata-iperf3-vnf + - son-emu-cli list + - son-emu-cli compute status -d dc2 -n client + """, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument( "command", - choices=['start', 'stop', 'list', 'status'], + choices=['start', 'stop', 'list', 'status', 'xterm'], help="Action to be executed.") +parser.add_argument( + "vnf_names", + nargs='*', + help="vnf names to open an xterm for") parser.add_argument( "--datacenter", "-d", dest="datacenter", help="Data center to which the command should be applied.") @@ -110,7 +132,7 @@ parser.add_argument( "--name", "-n", dest="name", help="Name of compute instance e.g. 'vnf1'.") parser.add_argument( - "--image","-i", dest="image", + "--image", "-i", dest="image", help="Name of container image to be used e.g. 'ubuntu:trusty'") parser.add_argument( "--dcmd", "-c", dest="docker_command", @@ -124,7 +146,8 @@ parser.add_argument( default="http://127.0.0.1:5001", help="UUID of the plugin to be manipulated.") + def main(argv): args = vars(parser.parse_args(argv)) c = RestApiClient() - c.execute_command(args) \ No newline at end of file + c.execute_command(args)