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:
parent
0e7464d419
commit
2397cd58ee
6 changed files with 49 additions and 34 deletions
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -500,7 +500,10 @@ 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)
|
||||||
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
|
# set node attributes
|
||||||
node.icon = node_options.icon
|
node.icon = node_options.icon
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Add table
Reference in a new issue