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

This commit is contained in:
Blake Harnden 2019-06-28 15:41:55 -07:00
parent 0e7464d419
commit 2397cd58ee
6 changed files with 49 additions and 34 deletions

View file

@ -79,12 +79,13 @@ class NodeOptions(object):
Options for creating and updating nodes within core. 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. Create a NodeOptions object.
:param str name: name of node, defaults to node class name postfix with its id :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 model: defines services for default and physical nodes, defaults to "router"
:param str image: image to use for docker nodes
""" """
self.name = name self.name = name
self.model = model self.model = model
@ -99,6 +100,7 @@ class NodeOptions(object):
self.alt = None self.alt = None
self.emulation_id = None self.emulation_id = None
self.emulation_server = None self.emulation_server = None
self.image = image
def set_position(self, x, y): def set_position(self, x, y):
""" """

View file

@ -500,6 +500,9 @@ class Session(object):
# create node # create node
logging.info("creating node(%s) id(%s) name(%s) start(%s)", node_class.__name__, _id, name, start) logging.info("creating node(%s) id(%s) name(%s) start(%s)", node_class.__name__, _id, name, 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) node = self.create_node(cls=node_class, _id=_id, name=name, start=start)
# set node attributes # set node attributes
@ -511,7 +514,7 @@ class Session(object):
self.set_node_position(node, node_options) self.set_node_position(node, node_options)
# add services to default and physical nodes only # 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 node.type = node_options.model
logging.debug("set node type: %s", node.type) logging.debug("set node type: %s", node.type)
self.services.add_services(node, node.type, node_options.services) self.services.add_services(node, node.type, node_options.services)

View file

@ -8,15 +8,16 @@ from core.nodes.base import CoreNode
class DockerClient(object): class DockerClient(object):
def __init__(self, name): def __init__(self, name, image):
self.name = name self.name = name
self.image = image
self.pid = None self.pid = None
self._addr = {} 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( utils.check_cmd("docker run -td --net=none --hostname {name} --name {name} {image} /bin/bash".format(
name=self.name, name=self.name,
image=image image=self.image
)) ))
self.pid = self.get_pid() self.pid = self.get_pid()
return self.pid return self.pid
@ -119,7 +120,7 @@ class DockerNode(CoreNode):
apitype = NodeTypes.DOCKER.value apitype = NodeTypes.DOCKER.value
valid_address_types = {"inet", "inet6", "inet6link"} 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. Create a CoreNode instance.
@ -133,7 +134,9 @@ class DockerNode(CoreNode):
super(CoreNode, self).__init__(session, _id, name, start=start) super(CoreNode, self).__init__(session, _id, name, start=start)
self.nodedir = nodedir self.nodedir = nodedir
self.ctrlchnlname = os.path.abspath(os.path.join(self.session.session_dir, self.name)) 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.pid = None
self.up = False self.up = False
self.lock = threading.RLock() self.lock = threading.RLock()
@ -164,7 +167,7 @@ class DockerNode(CoreNode):
if self.up: if self.up:
raise ValueError("starting a node that is already up") raise ValueError("starting a node that is already up")
self.makenodedir() self.makenodedir()
self.pid = self.client.create_container("ubuntu:ifconfig") self.pid = self.client.create_container()
self.up = True self.up = True
def shutdown(self): def shutdown(self):

View file

@ -1,7 +1,7 @@
import logging import logging
from core.emulator.coreemu import CoreEmu 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 from core.emulator.enumerations import NodeTypes, EventTypes
@ -12,14 +12,14 @@ if __name__ == "__main__":
session.set_state(EventTypes.CONFIGURATION_STATE) session.set_state(EventTypes.CONFIGURATION_STATE)
try: try:
# create nodes one
prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")
node_one = session.add_node(_type=NodeTypes.DOCKER) options = NodeOptions(image="ubuntu:ifconfig")
session.services.add_services(node_one, node_one.type, ["SSH"])
logging.info("docker node(%s): %s", node_one.name, node_one.services) # create node one
node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options)
interface_one = prefixes.create_interface(node_one) interface_one = prefixes.create_interface(node_one)
# create nodes two # create node two
node_two = session.add_node() node_two = session.add_node()
interface_two = prefixes.create_interface(node_two) 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) session.add_link(node_one.id, node_two.id, interface_one, interface_two)
# instantiate # instantiate
logging.info("INSTANTIATE")
logging.info("docker node(%s): %s", node_one.name, node_one.services)
session.instantiate() session.instantiate()
finally: finally:
input("continue to shutdown") input("continue to shutdown")

View file

@ -1,7 +1,7 @@
import logging import logging
from core.emulator.coreemu import CoreEmu 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 from core.emulator.enumerations import NodeTypes, EventTypes
@ -15,17 +15,20 @@ if __name__ == "__main__":
# create nodes and interfaces # create nodes and interfaces
try: try:
prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")
node_one = session.add_node(_type=NodeTypes.DOCKER) options = NodeOptions(image="ubuntu:ifconfig")
node_two = session.add_node(_type=NodeTypes.DOCKER)
# create node one
node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options)
interface_one = prefixes.create_interface(node_one) 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) interface_two = prefixes.create_interface(node_two)
# add link # add link
input("press key to continue")
session.add_link(node_one.id, node_two.id, interface_one, interface_two) 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")) # instantiate
input("press key to continue")
session.instantiate() session.instantiate()
finally: finally:
input("continue to shutdown") input("continue to shutdown")

View file

@ -1,7 +1,7 @@
import logging import logging
from core.emulator.coreemu import CoreEmu 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 from core.emulator.enumerations import NodeTypes, EventTypes
@ -12,25 +12,31 @@ if __name__ == "__main__":
session = coreemu.create_session() session = coreemu.create_session()
session.set_state(EventTypes.CONFIGURATION_STATE) session.set_state(EventTypes.CONFIGURATION_STATE)
# create nodes and interfaces
try: try:
prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16") prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")
options = NodeOptions(image="ubuntu:ifconfig")
# create switch
switch = session.add_node(_type=NodeTypes.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 one
node_three = session.add_node() node_one = session.add_node(_type=NodeTypes.DOCKER, node_options=options)
interface_one = prefixes.create_interface(node_one) 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) interface_two = prefixes.create_interface(node_two)
# node three
node_three = session.add_node()
interface_three = prefixes.create_interface(node_three) interface_three = prefixes.create_interface(node_three)
# add link # add links
input("press key to continue")
session.add_link(node_one.id, switch.id, interface_one) session.add_link(node_one.id, switch.id, interface_one)
session.add_link(node_two.id, switch.id, interface_two) session.add_link(node_two.id, switch.id, interface_two)
session.add_link(node_three.id, switch.id, interface_three) session.add_link(node_three.id, switch.id, interface_three)
print(node_one.cmd_output("ifconfig"))
print(node_two.cmd_output("ifconfig")) # instantiate
input("press key to continue")
session.instantiate() session.instantiate()
finally: finally:
input("continue to shutdown") input("continue to shutdown")