blob: 5abaa287540ab3e6c4960fdf59f10e3c534d3f93 [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).
hadik3ra9dd9012016-08-09 10:51:13 +020026from requests import get, put, delete
hadik3r237d3f52016-06-27 17:57:49 +020027from tabulate import tabulate
28import pprint
29import argparse
stevenvanrossem4e184a72016-11-08 08:47:20 +010030from subprocess import Popen
hadik3r237d3f52016-06-27 17:57:49 +020031
32pp = pprint.PrettyPrinter(indent=4)
33
hadik3r237d3f52016-06-27 17:57:49 +020034
hadik3ra9dd9012016-08-09 10:51:13 +020035class RestApiClient():
hadik3r237d3f52016-06-27 17:57:49 +020036 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 start(self, args):
47
hadik3ra9dd9012016-08-09 10:51:13 +020048 req = {'image': args.get("image"),
49 'command': args.get("docker_command"),
50 'network': args.get("network")}
hadik3r237d3f52016-06-27 17:57:49 +020051
hadik3ra9dd9012016-08-09 10:51:13 +020052 response = put("%s/restapi/compute/%s/%s" %
hadik3r237d3f52016-06-27 17:57:49 +020053 (args.get("endpoint"),
54 args.get("datacenter"),
55 args.get("name")),
hadik3ra9dd9012016-08-09 10:51:13 +020056 json=req)
stevenvanrossemff6b4042016-07-14 20:51:37 +020057
stevenvanrossem73efd192016-06-29 01:44:07 +020058 pp.pprint(response.json())
59
hadik3r237d3f52016-06-27 17:57:49 +020060 def stop(self, args):
61
hadik3ra9dd9012016-08-09 10:51:13 +020062 response = delete("%s/restapi/compute/%s/%s" %
63 (args.get("endpoint"),
64 args.get("datacenter"),
65 args.get("name")))
stevenvanrossem73efd192016-06-29 01:44:07 +020066 pp.pprint(response.json())
hadik3r237d3f52016-06-27 17:57:49 +020067
hadik3ra9dd9012016-08-09 10:51:13 +020068 def list(self, args):
hadik3r237d3f52016-06-27 17:57:49 +020069
peusterm72f09882018-05-15 17:10:27 +020070 list = get('%s/restapi/compute/%s' %
71 (args.get("endpoint"), args.get('datacenter'))).json()
hadik3r237d3f52016-06-27 17:57:49 +020072
73 table = []
74 for c in list:
75 # for each container add a line to the output table
76 if len(c) > 1:
77 name = c[0]
78 status = c[1]
peusterm72f09882018-05-15 17:10:27 +020079 # eth0ip = status.get("docker_network", "-")
80 netw_list = [netw_dict['intf_name']
81 for netw_dict in status.get("network")]
82 dc_if_list = [netw_dict['dc_portname']
83 for netw_dict in status.get("network")]
hadik3r237d3f52016-06-27 17:57:49 +020084 table.append([status.get("datacenter"),
85 name,
86 status.get("image"),
stevenvanrossem566779d2016-11-07 06:33:44 +010087 ','.join(netw_list),
88 ','.join(dc_if_list)])
peusterm72f09882018-05-15 17:10:27 +020089 # status.get("state").get("Status")]
hadik3r237d3f52016-06-27 17:57:49 +020090
91 headers = ["Datacenter",
92 "Container",
93 "Image",
stevenvanrossem566779d2016-11-07 06:33:44 +010094 "Interface list",
95 "Datacenter interfaces"]
hadik3r237d3f52016-06-27 17:57:49 +020096 print(tabulate(table, headers=headers, tablefmt="grid"))
97
hadik3ra9dd9012016-08-09 10:51:13 +020098 def status(self, args):
hadik3r237d3f52016-06-27 17:57:49 +020099
100 list = get("%s/restapi/compute/%s/%s" %
101 (args.get("endpoint"),
102 args.get("datacenter"),
103 args.get("name"))).json()
hadik3ra9dd9012016-08-09 10:51:13 +0200104
hadik3r237d3f52016-06-27 17:57:49 +0200105 pp.pprint(list)
106
stevenvanrossem4e184a72016-11-08 08:47:20 +0100107 def xterm(self, args):
108 vnf_names = args.get("vnf_names")
109 for vnf_name in vnf_names:
110 Popen(['xterm', '-xrm', 'XTerm.vt100.allowTitleOps: false', '-T', vnf_name,
111 '-e', "docker exec -it mn.{0} /bin/bash".format(vnf_name)])
hadik3r237d3f52016-06-27 17:57:49 +0200112
peusterm72f09882018-05-15 17:10:27 +0200113
stevenvanrossemf693a3b2017-06-01 15:15:59 +0200114parser = argparse.ArgumentParser(description="""son-emu-cli compute
peusterm72f09882018-05-15 17:10:27 +0200115
peustermfa63aa92016-08-19 08:49:39 +0200116 Examples:
117 - son-emu-cli compute start -d dc2 -n client -i sonatanfv/sonata-iperf3-vnf
118 - son-emu-cli list
119 - son-emu-cli compute status -d dc2 -n client
120 """, formatter_class=argparse.RawTextHelpFormatter)
hadik3r237d3f52016-06-27 17:57:49 +0200121parser.add_argument(
122 "command",
stevenvanrossem4e184a72016-11-08 08:47:20 +0100123 choices=['start', 'stop', 'list', 'status', 'xterm'],
hadik3r237d3f52016-06-27 17:57:49 +0200124 help="Action to be executed.")
125parser.add_argument(
stevenvanrossem4e184a72016-11-08 08:47:20 +0100126 "vnf_names",
127 nargs='*',
128 help="vnf names to open an xterm for")
129parser.add_argument(
hadik3r237d3f52016-06-27 17:57:49 +0200130 "--datacenter", "-d", dest="datacenter",
131 help="Data center to which the command should be applied.")
132parser.add_argument(
133 "--name", "-n", dest="name",
134 help="Name of compute instance e.g. 'vnf1'.")
135parser.add_argument(
hadik3ra9dd9012016-08-09 10:51:13 +0200136 "--image", "-i", dest="image",
hadik3r237d3f52016-06-27 17:57:49 +0200137 help="Name of container image to be used e.g. 'ubuntu:trusty'")
138parser.add_argument(
139 "--dcmd", "-c", dest="docker_command",
140 help="Startup command of the container e.g. './start.sh'")
141parser.add_argument(
142 "--net", dest="network",
143 help="Network properties of a compute instance e.g. \
144 '(id=input,ip=10.0.10.3/24),(id=output,ip=10.0.10.4/24)' for multiple interfaces.")
145parser.add_argument(
hadik3r237d3f52016-06-27 17:57:49 +0200146 "--endpoint", "-e", dest="endpoint",
peusterm0a336cc2016-07-04 09:15:47 +0200147 default="http://127.0.0.1:5001",
stevenvanrossemf693a3b2017-06-01 15:15:59 +0200148 help="REST API endpoint of son-emu (default:http://127.0.0.1:5001)")
hadik3r237d3f52016-06-27 17:57:49 +0200149
hadik3ra9dd9012016-08-09 10:51:13 +0200150
hadik3r237d3f52016-06-27 17:57:49 +0200151def main(argv):
152 args = vars(parser.parse_args(argv))
153 c = RestApiClient()
hadik3ra9dd9012016-08-09 10:51:13 +0200154 c.execute_command(args)