Merge pull request #133 from mpeuster/master
[osm/vim-emu.git] / src / emuvim / cli / compute.py
index 006b57b..25ac247 100755 (executable)
@@ -1,6 +1,29 @@
 """
-son-emu compute CLI
-(c) 2016 by Manuel Peuster <manuel.peuster@upb.de>
+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
@@ -15,7 +38,7 @@ pp = pprint.PrettyPrinter(indent=4)
 class ZeroRpcClient(object):
 
     def __init__(self):
-        self.c = zerorpc.Client()
+        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 = {}
 
@@ -24,19 +47,19 @@ 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 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"),
-            args.get("docker_command"),
-            nw_list)
+            nw_list,
+            args.get("docker_command")
+            )
         pp.pprint(r)
 
     def stop(self, args):
@@ -56,9 +79,9 @@ class ZeroRpcClient(object):
                 eth0ip = None
                 eth0status = "down"
                 if len(status.get("network")) > 0:
-                    eth0ip = status.get("network")[0][1]
+                    eth0ip = status.get("network")[0].get("ip")
                     eth0status = "up" if status.get(
-                        "network")[0][3] else "down"
+                        "network")[0].get("up") else "down"
                 table.append([status.get("datacenter"),
                               name,
                               status.get("image"),
@@ -71,13 +94,37 @@ class ZeroRpcClient(object):
                    "eth0 IP",
                    "eth0 status",
                    "Status"]
-        print tabulate(table, headers=headers, tablefmt="grid")
+        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 profile(self, args):
+        nw_list = list()
+        if args.get("network") is not None:
+            nw_list = self._parse_network(args.get("network"))
+
+        params = self._create_dict(
+            network=nw_list,
+            command=args.get("docker_command"),
+            image=args.get("image"),
+            input=args.get("input"),
+            output=args.get("output"))
+
+        for output in self.c.compute_profile(
+            args.get("datacenter"),
+            args.get("name"),
+            params):
+            print(output + '\n')
+
+        #pp.pprint(r)
+        #print(r)
+
+    def _create_dict(self, **kwargs):
+        return kwargs
+
     def _parse_network(self, network_str):
         '''
         parse the options for all network interfaces of the vnf
@@ -97,7 +144,7 @@ class ZeroRpcClient(object):
 parser = argparse.ArgumentParser(description='son-emu compute')
 parser.add_argument(
     "command",
-    choices=['start', 'stop', 'list', 'status'],
+    choices=['start', 'stop', 'list', 'status', 'profile'],
     help="Action to be executed.")
 parser.add_argument(
     "--datacenter", "-d", dest="datacenter",
@@ -107,14 +154,20 @@ parser.add_argument(
     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'")
+    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 compute instance e.g. \
-          '10.0.0.123/8' or '10.0.0.123/8,11.0.0.123/24' for multiple interfaces.")
+    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.")
+parser.add_argument(
+    "--input", "-in", dest="input",
+    help="input interface of the vnf to profile")
+parser.add_argument(
+    "--output", "-out", dest="output",
+    help="output interface of the vnf to profile")
 
 
 def main(argv):