From 7aae68563f4ca72f321bd264215f6a58dec6c346 Mon Sep 17 00:00:00 2001 From: peusterm Date: Tue, 12 Jan 2016 14:53:18 +0100 Subject: [PATCH] created EmulatorCompute node class. Improved rpc interface. --- emuvim/api/zerorpcapi.py | 29 ++++++++++++++++++++++------- emuvim/dcemulator/net.py | 4 ++-- emuvim/dcemulator/node.py | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/emuvim/api/zerorpcapi.py b/emuvim/api/zerorpcapi.py index e00ecb9..28519c6 100644 --- a/emuvim/api/zerorpcapi.py +++ b/emuvim/api/zerorpcapi.py @@ -59,19 +59,34 @@ class MultiDatacenterApi(object): def compute_action_start(self, dc_name, compute_name): # TODO what to return UUID / given name / internal name ? logging.debug("RPC CALL: compute start") - if dc_name in self.dcs: - return self.dcs[dc_name].addCompute(compute_name) + try: + return self.dcs.get(dc_name).startCompute(compute_name) + except Exception as ex: + logging.exception("RPC error.") + return ex.message def compute_action_stop(self, dc_name, compute_name): logging.info("RPC CALL: compute stop") - if dc_name in self.dcs: - return self.dcs[dc_name].removeCompute(compute_name) + try: + return self.dcs.get(dc_name).stopCompute(compute_name) + except Exception as ex: + logging.exception("RPC error.") + return ex.message def compute_list(self, dc_name): logging.info("RPC CALL: compute list") - if dc_name in self.dcs: - return [(c.name, c.IP()) for c in self.dcs[dc_name].listCompute()] + try: + return [(c.name, c.IP()) + for c in self.dcs.get(dc_name).listCompute()] + except Exception as ex: + logging.exception("RPC error.") + return ex.message def compute_status(self, dc_name, compute_name): logging.info("RPC CALL: compute status") - # TODO implement + try: + return self.dcs.get( + dc_name).containers.get(compute_name).getStatus() + except Exception as ex: + logging.exception("RPC error.") + return ex.message diff --git a/emuvim/dcemulator/net.py b/emuvim/dcemulator/net.py index 13df531..f5e58d1 100644 --- a/emuvim/dcemulator/net.py +++ b/emuvim/dcemulator/net.py @@ -10,7 +10,7 @@ from mininet.cli import CLI from mininet.log import setLogLevel, info from mininet.link import TCLink, Link -from node import Datacenter +from node import Datacenter, EmulatorCompute class DCNetwork(object): @@ -103,7 +103,7 @@ class DCNetwork(object): """ Wrapper for addDocker method provided by Dockernet. """ - return self.mnet.addDocker( name, **params) + return self.mnet.addDocker( name, cls=EmulatorCompute, **params) def removeDocker( self, name, **params): """ diff --git a/emuvim/dcemulator/node.py b/emuvim/dcemulator/node.py index 3ab6341..aeac665 100644 --- a/emuvim/dcemulator/node.py +++ b/emuvim/dcemulator/node.py @@ -2,12 +2,43 @@ Distributed Cloud Emulator (dcemulator) (c) 2015 by Manuel Peuster """ +from mininet.node import Docker import logging DCDPID_BASE = 1000 # start of switch dpid's used for data center switches +class EmulatorCompute(Docker): + """ + Emulator specific compute node class. + Inherits from Dockernet's Docker host class. + Represents a single container connected to a (logical) + data center. + We can add emulator specific helper functions to it. + """ + + def __init__( + self, name, dimage, **kwargs): + logging.debug("Create EmulatorCompute instance: %s" % name) + + # call original Docker.__init__ + Docker.__init__(self, name, dimage, **kwargs) + + def getNetworkStatus(self): + """ + Helper method to receive information about the virtual networks + this compute instance is connected to. + """ + return None + + def getStatus(self): + """ + Helper method to receive information about this compute instance. + """ + return None + + class Datacenter(object): """ Represents a logical data center to which compute resources @@ -42,7 +73,7 @@ class Datacenter(object): def start(self): pass - def addCompute(self, name, image=None, network=None): + def startCompute(self, name, image=None, network=None): """ Create a new container as compute resource and connect it to this data center. @@ -62,7 +93,7 @@ class Datacenter(object): self.containers[name] = d return name # we might use UUIDs for naming later on - def removeCompute(self, name): + def stopCompute(self, name): """ Stop and remove a container from this data center. """ -- 2.17.1