From 2397cd58eead17566337740bf54717f60c61340a Mon Sep 17 00:00:00 2001 From: Blake Harnden Date: Fri, 28 Jun 2019 15:41:55 -0700 Subject: [PATCH] integrated creation into the standard session.add_node call, currently requires an extra check due to the need for being able to specify an image --- daemon/core/emulator/emudata.py | 4 +++- daemon/core/emulator/session.py | 7 +++++-- daemon/core/nodes/docker.py | 15 ++++++++------ daemon/examples/docker/docker2core.py | 14 ++++++------- daemon/examples/docker/docker2docker.py | 17 +++++++++------- daemon/examples/docker/switch.py | 26 +++++++++++++++---------- 6 files changed, 49 insertions(+), 34 deletions(-) diff --git a/daemon/core/emulator/emudata.py b/daemon/core/emulator/emudata.py index ed54e20a..2dc96570 100644 --- a/daemon/core/emulator/emudata.py +++ b/daemon/core/emulator/emudata.py @@ -79,12 +79,13 @@ class NodeOptions(object): Options for creating and updating nodes within core. """ - def __init__(self, name=None, model="PC"): + def __init__(self, name=None, model="PC", image=None): """ Create a NodeOptions object. :param str name: name of node, defaults to node class name postfix with its id :param str model: defines services for default and physical nodes, defaults to "router" + :param str image: image to use for docker nodes """ self.name = name self.model = model @@ -99,6 +100,7 @@ class NodeOptions(object): self.alt = None self.emulation_id = None self.emulation_server = None + self.image = image def set_position(self, x, y): """ diff --git a/daemon/core/emulator/session.py b/daemon/core/emulator/session.py index ef79dcf5..7d2365e7 100644 --- a/daemon/core/emulator/session.py +++ b/daemon/core/emulator/session.py @@ -500,7 +500,10 @@ class Session(object): # create node logging.info("creating node(%s) id(%s) name(%s) start(%s)", node_class.__name__, _id, name, start) - node = self.create_node(cls=node_class, _id=_id, name=name, start=start) + if _type == NodeTypes.DOCKER: + node = self.create_node(cls=node_class, _id=_id, name=name, start=start, image=node_options.image) + else: + node = self.create_node(cls=node_class, _id=_id, name=name, start=start) # set node attributes node.icon = node_options.icon @@ -511,7 +514,7 @@ class Session(object): self.set_node_position(node, node_options) # add services to default and physical nodes only - if _type in [NodeTypes.DEFAULT, NodeTypes.PHYSICAL]: + if _type in [NodeTypes.DEFAULT, NodeTypes.PHYSICAL, NodeTypes.DOCKER]: node.type = node_options.model logging.debug("set node type: %s", node.type) self.services.add_services(node, node.type, node_options.services) diff --git a/daemon/core/nodes/docker.py b/daemon/core/nodes/docker.py index 7f612d48..909909f9 100644 --- a/daemon/core/nodes/docker.py +++ b/daemon/core/nodes/docker.py @@ -8,15 +8,16 @@ from core.nodes.base import CoreNode class DockerClient(object): - def __init__(self, name): + def __init__(self, name, image): self.name = name + self.image = image self.pid = None self._addr = {} - def create_container(self, image): + def create_container(self): utils.check_cmd("docker run -td --net=none --hostname {name} --name {name} {image} /bin/bash".format( name=self.name, - image=image + image=self.image )) self.pid = self.get_pid() return self.pid @@ -119,7 +120,7 @@ class DockerNode(CoreNode): apitype = NodeTypes.DOCKER.value valid_address_types = {"inet", "inet6", "inet6link"} - def __init__(self, session, _id=None, name=None, nodedir=None, bootsh="boot.sh", start=True): + def __init__(self, session, _id=None, name=None, nodedir=None, bootsh="boot.sh", start=True, image=None): """ Create a CoreNode instance. @@ -133,7 +134,9 @@ class DockerNode(CoreNode): super(CoreNode, self).__init__(session, _id, name, start=start) self.nodedir = nodedir self.ctrlchnlname = os.path.abspath(os.path.join(self.session.session_dir, self.name)) - self.client = DockerClient(self.name) + if image is None: + image = "ubuntu" + self.client = DockerClient(self.name, image) self.pid = None self.up = False self.lock = threading.RLock() @@ -164,7 +167,7 @@ class DockerNode(CoreNode): if self.up: raise ValueError("starting a node that is already up") self.makenodedir() - self.pid = self.client.create_container("ubuntu:ifconfig") + self.pid = self.client.create_container() self.up = True def shutdown(self): diff --git a/daemon/examples/docker/docker2core.py b/daemon/examples/docker/docker2core.py index 39491214..e7a626ec 100644 --- a/daemon/examples/docker/docker2core.py +++ b/daemon/examples/docker/docker2core.py @@ -1,7 +1,7 @@ import logging from core.emulator.coreemu import CoreEmu -from core.emulator.emudata import IpPrefixes +from core.emulator.emudata import IpPrefixes, NodeOptions from core.emulator.enumerations import NodeTypes, EventTypes @@ -12,14 +12,14 @@ if __name__ == "__main__": session.set_state(EventTypes.CONFIGURATION_STATE) try: - # create nodes one prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") - node_one = session.add_node(_type=NodeTypes.DOCKER) - session.services.add_services(node_one, node_one.type, ["SSH"]) - logging.info("docker node(%s): %s", node_one.name, node_one.services) + options = NodeOptions(image="ubuntu:ifconfig") + + # create node one + node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options) interface_one = prefixes.create_interface(node_one) - # create nodes two + # create node two node_two = session.add_node() interface_two = prefixes.create_interface(node_two) @@ -27,8 +27,6 @@ if __name__ == "__main__": session.add_link(node_one.id, node_two.id, interface_one, interface_two) # instantiate - logging.info("INSTANTIATE") - logging.info("docker node(%s): %s", node_one.name, node_one.services) session.instantiate() finally: input("continue to shutdown") diff --git a/daemon/examples/docker/docker2docker.py b/daemon/examples/docker/docker2docker.py index 60c63c53..52bca1ce 100644 --- a/daemon/examples/docker/docker2docker.py +++ b/daemon/examples/docker/docker2docker.py @@ -1,7 +1,7 @@ import logging from core.emulator.coreemu import CoreEmu -from core.emulator.emudata import IpPrefixes +from core.emulator.emudata import IpPrefixes, NodeOptions from core.emulator.enumerations import NodeTypes, EventTypes @@ -15,17 +15,20 @@ if __name__ == "__main__": # create nodes and interfaces try: prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") - node_one = session.add_node(_type=NodeTypes.DOCKER) - node_two = session.add_node(_type=NodeTypes.DOCKER) + options = NodeOptions(image="ubuntu:ifconfig") + + # create node one + node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options) interface_one = prefixes.create_interface(node_one) + + # create node two + node_two = session.add_node(_type=NodeTypes.DOCKER, node_options=options) interface_two = prefixes.create_interface(node_two) # add link - input("press key to continue") session.add_link(node_one.id, node_two.id, interface_one, interface_two) - print(node_one.cmd_output("ifconfig")) - print(node_two.cmd_output("ifconfig")) - input("press key to continue") + + # instantiate session.instantiate() finally: input("continue to shutdown") diff --git a/daemon/examples/docker/switch.py b/daemon/examples/docker/switch.py index 70ba634f..6204a4cb 100644 --- a/daemon/examples/docker/switch.py +++ b/daemon/examples/docker/switch.py @@ -1,7 +1,7 @@ import logging from core.emulator.coreemu import CoreEmu -from core.emulator.emudata import IpPrefixes +from core.emulator.emudata import IpPrefixes, NodeOptions from core.emulator.enumerations import NodeTypes, EventTypes @@ -12,25 +12,31 @@ if __name__ == "__main__": session = coreemu.create_session() session.set_state(EventTypes.CONFIGURATION_STATE) - # create nodes and interfaces try: prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") + options = NodeOptions(image="ubuntu:ifconfig") + + # create switch switch = session.add_node(_type=NodeTypes.SWITCH) - node_one = session.add_node(_type=NodeTypes.DOCKER) - node_two = session.add_node(_type=NodeTypes.DOCKER) - node_three = session.add_node() + + # node one + node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options) interface_one = prefixes.create_interface(node_one) + + # node two + node_two = session.add_node(_type=NodeTypes.DOCKER, node_options=options) interface_two = prefixes.create_interface(node_two) + + # node three + node_three = session.add_node() interface_three = prefixes.create_interface(node_three) - # add link - input("press key to continue") + # add links session.add_link(node_one.id, switch.id, interface_one) session.add_link(node_two.id, switch.id, interface_two) session.add_link(node_three.id, switch.id, interface_three) - print(node_one.cmd_output("ifconfig")) - print(node_two.cmd_output("ifconfig")) - input("press key to continue") + + # instantiate session.instantiate() finally: input("continue to shutdown")