From 2ec74e1b51575358297374272edd2b9562210ee5 Mon Sep 17 00:00:00 2001 From: peusterm Date: Wed, 13 Jan 2016 11:17:53 +0100 Subject: [PATCH] added status and list commands to cli --- emuvim/api/zerorpcapi.py | 13 +++++++++++-- emuvim/cli/compute.py | 36 +++++++++++++++++++++++++++++++++--- emuvim/cli/network.py | 1 + emuvim/cli/son-emu-cli | 2 ++ emuvim/dcemulator/node.py | 5 +++++ 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/emuvim/api/zerorpcapi.py b/emuvim/api/zerorpcapi.py index 28519c6..ecf822c 100644 --- a/emuvim/api/zerorpcapi.py +++ b/emuvim/api/zerorpcapi.py @@ -76,8 +76,17 @@ class MultiDatacenterApi(object): def compute_list(self, dc_name): logging.info("RPC CALL: compute list") try: - return [(c.name, c.IP()) - for c in self.dcs.get(dc_name).listCompute()] + if dc_name is None: + # return list with all compute nodes in all DCs + all_containers = [] + for dc in self.dcs.itervalues(): + all_containers += dc.listCompute() + return [(c.name, c.getStatus()) + for c in all_containers] + else: + # return list of compute nodes for specified DC + return [(c.name, c.getStatus()) + for c in self.dcs.get(dc_name).listCompute()] except Exception as ex: logging.exception("RPC error.") return ex.message diff --git a/emuvim/cli/compute.py b/emuvim/cli/compute.py index b75b043..c5f2231 100644 --- a/emuvim/cli/compute.py +++ b/emuvim/cli/compute.py @@ -1,9 +1,11 @@ """ son-emu compute CLI +(c) 2016 by Manuel Peuster """ import argparse import pprint +from tabulate import tabulate import zerorpc @@ -14,7 +16,7 @@ class ZeroRpcClient(object): def __init__(self): self.c = zerorpc.Client() - self.c.connect("tcp://127.0.0.1:4242") # yes, hard coded for now. we'll change this later + 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): @@ -35,10 +37,38 @@ class ZeroRpcClient(object): pp.pprint(r) def list(self, args): - print "TODO: Not implemented" + 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][1] + eth0status = "up" if status.get( + "network")[0][3] 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): - print "TODO: Not implemented" + r = self.c.compute_status( + args.get("datacenter"), args.get("name")) + pp.pprint(r) parser = argparse.ArgumentParser(description='son-emu compute') diff --git a/emuvim/cli/network.py b/emuvim/cli/network.py index 0c50dda..080b0ac 100644 --- a/emuvim/cli/network.py +++ b/emuvim/cli/network.py @@ -1,5 +1,6 @@ """ son-emu network CLI +(c) 2016 by Manuel Peuster """ diff --git a/emuvim/cli/son-emu-cli b/emuvim/cli/son-emu-cli index 57ae053..56fe58b 100755 --- a/emuvim/cli/son-emu-cli +++ b/emuvim/cli/son-emu-cli @@ -2,6 +2,8 @@ """ Simple CLI client to interact with a running emulator. + (c) 2016 by Manuel Peuster + The CLI offers different tools, e.g., compute, network, ... Each of these tools is implemented as an independent Python module. diff --git a/emuvim/dcemulator/node.py b/emuvim/dcemulator/node.py index 87a5a6e..def1e2d 100644 --- a/emuvim/dcemulator/node.py +++ b/emuvim/dcemulator/node.py @@ -21,6 +21,7 @@ class EmulatorCompute(Docker): def __init__( self, name, dimage, **kwargs): logging.debug("Create EmulatorCompute instance: %s" % name) + self.datacenter = None # pointer to current DC # call original Docker.__init__ Docker.__init__(self, name, dimage, **kwargs) @@ -50,6 +51,8 @@ class EmulatorCompute(Docker): status["memswap_limit"] = self.memswap_limit status["state"] = self.dcli.inspect_container(self.dc)["State"] status["id"] = self.dcli.inspect_container(self.dc)["Id"] + status["datacenter"] = (None if self.datacenter is None + else self.datacenter.name) return status @@ -104,7 +107,9 @@ class Datacenter(object): # create the container and connect it to the given network d = self.net.addDocker("%s" % (name), dimage=image) self.net.addLink(d, self.switch, params1=network) + # do bookkeeping self.containers[name] = d + d.datacenter = self return name # we might use UUIDs for naming later on def stopCompute(self, name): -- 2.17.1