Merge branch 'rel/5.1' into core-rest-flask

This commit is contained in:
Blake J. Harnden 2018-05-02 09:06:53 -07:00
commit 1ea9de34db
20 changed files with 125 additions and 134 deletions

View file

@ -1,5 +1,4 @@
CORE # CORE
====
CORE: Common Open Research Emulator CORE: Common Open Research Emulator
@ -7,24 +6,39 @@ Copyright (c)2005-2018 the Boeing Company.
See the LICENSE file included in this distribution. See the LICENSE file included in this distribution.
About ## About
-----
CORE is a tool for emulating networks using a GUI or Python scripts. The CORE The Common Open Research Emulator (CORE) is a tool for emulating
project site (1) is a good source of introductory information, with a manual, networks on one or more machines. You can connect these emulated
screenshots, and demos about this software. The GitHub project (2) hosts the networks to live networks. CORE consists of a GUI for drawing
source repos, wiki, and bug tracker. There is a deprecated topologies of lightweight virtual machines, and Python modules for
Google Code page (3) with the old wiki, blog, bug tracker, and quickstart guide. scripting network emulation.
1. http://www.nrl.navy.mil/itd/ncs/products/core ## Documentation and Examples
1. https://github.com/coreemu/core
1. http://code.google.com/p/coreemu/
1. [Official Documentation](https://downloads.pf.itd.nrl.navy.mil/docs/core/core-html/index.html)
Building CORE * Documentation hosted on GitHub
------------- * http://coreemu.github.io/core/
* Basic Script Examples
* [Examples](daemon/examples/api)
* Custom Service Example
* [sample.py](daemon/examples/myservices/sample.py)
* Custom Emane Model Example
* [examplemodel.py](daemon/examples/myemane/examplemodel.py)
To build this software you should use: ## Support
We are leveraging Discord for persistent chat rooms, voice chat, and
GitHub integration. This allows for more dynamic conversations and the
capability to respond faster. Feel free to join us at the link below.
https://discord.gg/AKd7kmP
You can also get help with questions, comments, or trouble, by using
the CORE mailing lists:
* [core-users](https://pf.itd.nrl.navy.mil/mailman/listinfo/core-users) for general comments and questions
* [core-dev](https://pf.itd.nrl.navy.mil/mailman/listinfo/core-dev) for bugs, compile errors, and other development issues
## Building CORE
```shell ```shell
./bootstrap.sh ./bootstrap.sh
@ -33,42 +47,19 @@ make
sudo make install sudo make install
``` ```
Note: You may need to pass the proxy settings to sudo make install:
sudo make install HTTP_PROXY=<proxy>
Here is what is installed with 'make install':
/usr/local/bin/core-gui
/usr/local/bin/core-daemon
/usr/local/bin/[vcmd, vnoded, coresendmsg, core-cleanup]
/usr/local/lib/core/*
/usr/local/share/core/*
/usr/local/lib/python2.6/dist-packages/core/*
/usr/local/lib/python2.6/dist-packages/[netns,vcmd].so
/etc/core/*
/etc/init.d/core
See the manual for the software required for building CORE.
Building Documentation Building Documentation
---------------------- ----------------------
Being able to build documentation depends on help2man being installed.
Once that has been done you can run the following commands:
```shell ```shell
./bootstrap.sh ./bootstrap.sh
./configure ./configure
make html make doc
``` ```
Building Packages Building Packages
----------------- -----------------
Install fpm Install fpm: http://fpm.readthedocs.io/en/latest/installing.html
http://fpm.readthedocs.io/en/latest/installing.html
Build package commands, DESTDIR is used for gui packaging only Build package commands, DESTDIR is used for gui packaging only
@ -83,8 +74,12 @@ make fpm DESTDIR=/tmp/core-gui
This will produce: This will produce:
* CORE GUI rpm/deb files * CORE GUI rpm/deb files
* core-gui_$VERSION_$ARCH
* CORE ns3 rpm/deb files * CORE ns3 rpm/deb files
* python-core-ns3_$VERSION_$ARCH
* CORE python rpm/deb files for SysV and systemd service types * CORE python rpm/deb files for SysV and systemd service types
* python-core-sysv_$VERSION_$ARCH
* python-core-systemd_$VERSION_$ARCH
Running CORE Running CORE
------------ ------------
@ -92,7 +87,10 @@ Running CORE
First start the CORE services: First start the CORE services:
```shell ```shell
sudo /etc/init.d/core-daemon start # sysv
sudo service core-daemon start
# systemd
sudo systemctl start core-daemon
``` ```
This automatically runs the core-daemon program. This automatically runs the core-daemon program.
@ -103,12 +101,3 @@ core-gui
``` ```
This launches the CORE GUI. You do not need to run the GUI as root. This launches the CORE GUI. You do not need to run the GUI as root.
Support
-------
If you have questions, comments, or trouble, please use the CORE mailing lists:
- [core-users](https://pf.itd.nrl.navy.mil/mailman/listinfo/core-users) for general comments and questions
- [core-dev](https://pf.itd.nrl.navy.mil/mailman/listinfo/core-dev) for bugs, compile errors, and other development issues

View file

@ -142,14 +142,13 @@ class CoreBroker(ConfigurableManager):
Close all active sockets; called when the session enters the Close all active sockets; called when the session enters the
data collect state data collect state
""" """
self.reset()
with self.servers_lock: with self.servers_lock:
while len(self.servers) > 0: while len(self.servers) > 0:
name, server = self.servers.popitem() name, server = self.servers.popitem()
if server.sock is not None: if server.sock is not None:
logger.info("closing connection with %s @ %s:%s" % logger.info("closing connection with %s: %s:%s", name, server.host, server.port)
(name, server.host, server.port))
server.close() server.close()
self.reset()
self.dorecvloop = False self.dorecvloop = False
if self.recvthread is not None: if self.recvthread is not None:
self.recvthread.join() self.recvthread.join()
@ -214,8 +213,7 @@ class CoreBroker(ConfigurableManager):
continue continue
rcvlen = self.recv(server) rcvlen = self.recv(server)
if rcvlen == 0: if rcvlen == 0:
logger.info("connection with %s @ %s:%s has closed" % ( logger.info("connection with server(%s) closed: %s:%s", server.name, server.host, server.port)
server.name, server.host, server.port))
def recv(self, server): def recv(self, server):
""" """
@ -236,18 +234,18 @@ class CoreBroker(ConfigurableManager):
return 0 return 0
if len(msghdr) != coreapi.CoreMessage.header_len: if len(msghdr) != coreapi.CoreMessage.header_len:
logger.info("warning: broker received not enough data len=%s" % len(msghdr)) logger.warn("warning: broker received not enough data len=%s", len(msghdr))
return len(msghdr) return len(msghdr)
msgtype, msgflags, msglen = coreapi.CoreMessage.unpack_header(msghdr) msgtype, msgflags, msglen = coreapi.CoreMessage.unpack_header(msghdr)
msgdata = server.sock.recv(msglen) msgdata = server.sock.recv(msglen)
data = msghdr + msgdata data = msghdr + msgdata
count = None count = None
logger.info("received message type: %s", MessageTypes(msgtype)) logger.debug("received message type: %s", MessageTypes(msgtype))
# snoop exec response for remote interactive TTYs # snoop exec response for remote interactive TTYs
if msgtype == MessageTypes.EXECUTE.value and msgflags & MessageFlags.TTY.value: if msgtype == MessageTypes.EXECUTE.value and msgflags & MessageFlags.TTY.value:
data = self.fixupremotetty(msghdr, msgdata, server.host) data = self.fixupremotetty(msghdr, msgdata, server.host)
logger.info("created remote tty message: %s", data) logger.debug("created remote tty message: %s", data)
elif msgtype == MessageTypes.NODE.value: elif msgtype == MessageTypes.NODE.value:
# snoop node delete response to decrement node counts # snoop node delete response to decrement node counts
if msgflags & MessageFlags.DELETE.value: if msgflags & MessageFlags.DELETE.value:
@ -293,22 +291,21 @@ class CoreBroker(ConfigurableManager):
with self.servers_lock: with self.servers_lock:
server = self.servers.get(name) server = self.servers.get(name)
if server is not None: if server is not None:
if host == server.host and port == server.port and \ if host == server.host and port == server.port and server.sock is not None:
server.sock is not None:
# leave this socket connected # leave this socket connected
return return
logger.info("closing connection with %s @ %s:%s" % (name, server.host, server.port)) logger.info("closing connection with %s @ %s:%s", name, server.host, server.port)
server.close() server.close()
del self.servers[name] del self.servers[name]
logger.info("adding broker server(%s): %s:%s" % (name, host, port)) logger.info("adding broker server(%s): %s:%s", name, host, port)
server = CoreDistributedServer(name, host, port) server = CoreDistributedServer(name, host, port)
if host is not None and port is not None: if host is not None and port is not None:
try: try:
server.connect() server.connect()
except IOError: except IOError:
logger.exception("error connecting to server %s:%s" % (host, port)) logger.exception("error connecting to server(%s): %s:%s", name, host, port)
if server.sock is not None: if server.sock is not None:
self.startrecvloop() self.startrecvloop()
self.servers[name] = server self.servers[name] = server
@ -328,7 +325,7 @@ class CoreBroker(ConfigurableManager):
logger.exception("error deleting server") logger.exception("error deleting server")
if server.sock is not None: if server.sock is not None:
logger.info("closing connection with %s @ %s:%s" % (server.name, server.host, server.port)) logger.info("closing connection with %s @ %s:%s", server.name, server.host, server.port)
server.close() server.close()
def getserverbyname(self, name): def getserverbyname(self, name):
@ -412,7 +409,7 @@ class CoreBroker(ConfigurableManager):
remotenum = n2num remotenum = n2num
if key in self.tunnels.keys(): if key in self.tunnels.keys():
logger.warn("tunnel with key %s (%s-%s) already exists!" % (key, n1num, n2num)) logger.warn("tunnel with key %s (%s-%s) already exists!", key, n1num, n2num)
else: else:
objid = key & ((1 << 16) - 1) objid = key & ((1 << 16) - 1)
logger.info("adding tunnel for %s-%s to %s with key %s", n1num, n2num, remoteip, key) logger.info("adding tunnel for %s-%s to %s with key %s", n1num, n2num, remoteip, key)
@ -494,7 +491,7 @@ class CoreBroker(ConfigurableManager):
gt = self.tunnels[key] gt = self.tunnels[key]
r.append(gt) r.append(gt)
continue continue
logger.info("adding tunnel for net %s to %s with key %s" % (node_id, host, key)) logger.info("adding tunnel for net %s to %s with key %s", node_id, host, key)
gt = GreTap(node=None, name=None, session=self.session, remoteip=host, key=key) gt = GreTap(node=None, name=None, session=self.session, remoteip=host, key=key)
self.tunnels[key] = gt self.tunnels[key] = gt
r.append(gt) r.append(gt)
@ -698,8 +695,7 @@ class CoreBroker(ConfigurableManager):
elif message.message_type == MessageTypes.CONFIG.value: elif message.message_type == MessageTypes.CONFIG.value:
# broadcast location and services configuration everywhere # broadcast location and services configuration everywhere
confobj = message.get_tlv(ConfigTlvs.OBJECT.value) confobj = message.get_tlv(ConfigTlvs.OBJECT.value)
if confobj == "location" or confobj == "services" or \ if confobj == "location" or confobj == "services" or confobj == "session" or confobj == "all":
confobj == "session" or confobj == "all":
servers = self.getservers() servers = self.getservers()
elif message.message_type == MessageTypes.FILE.value: elif message.message_type == MessageTypes.FILE.value:
# broadcast hook scripts and custom service files everywhere # broadcast hook scripts and custom service files everywhere
@ -735,10 +731,10 @@ class CoreBroker(ConfigurableManager):
""" """
server = self.getserverbyname(servername) server = self.getserverbyname(servername)
if server is None: if server is None:
logger.warn("ignoring unknown server: %s" % servername) logger.warn("ignoring unknown server: %s", servername)
return return
if server.sock is None or server.host is None or server.port is None: if server.sock is None or server.host is None or server.port is None:
logger.info("ignoring disconnected server: %s" % servername) logger.info("ignoring disconnected server: %s", servername)
return return
# communicate this session"s current state to the server # communicate this session"s current state to the server
@ -811,10 +807,10 @@ class CoreBroker(ConfigurableManager):
try: try:
nodecls = nodeutils.get_node_class(NodeTypes(nodetype)) nodecls = nodeutils.get_node_class(NodeTypes(nodetype))
except KeyError: except KeyError:
logger.warn("broker invalid node type %s" % nodetype) logger.warn("broker invalid node type %s", nodetype)
return handle_locally, servers return handle_locally, servers
if nodecls is None: if nodecls is None:
logger.warn("broker unimplemented node type %s" % nodetype) logger.warn("broker unimplemented node type %s", nodetype)
return handle_locally, servers return handle_locally, servers
if issubclass(nodecls, PyCoreNet) and nodetype != NodeTypes.WIRELESS_LAN.value: if issubclass(nodecls, PyCoreNet) and nodetype != NodeTypes.WIRELESS_LAN.value:
# network node replicated on all servers; could be optimized # network node replicated on all servers; could be optimized
@ -1013,11 +1009,10 @@ class CoreBroker(ConfigurableManager):
# local emulation server, handle this locally # local emulation server, handle this locally
handle_locally = True handle_locally = True
elif server.sock is None: elif server.sock is None:
logger.info("server %s @ %s:%s is disconnected" % ( logger.info("server %s @ %s:%s is disconnected", server.name, server.host, server.port)
server.name, server.host, server.port))
else: else:
logger.info("forwarding message to server: %s - %s:\n%s", logger.info("forwarding message to server(%s): %s:%s", server.name, server.host, server.port)
server.host, server.port, message) logger.debug("message being forwarded:\n%s", message)
server.sock.send(message.raw_message) server.sock.send(message.raw_message)
return handle_locally return handle_locally
@ -1045,7 +1040,7 @@ class CoreBroker(ConfigurableManager):
lhost, lport = server.sock.getsockname() lhost, lport = server.sock.getsockname()
f.write("%s %s %s %s %s\n" % (server.name, server.host, server.port, lhost, lport)) f.write("%s %s %s %s %s\n" % (server.name, server.host, server.port, lhost, lport))
except IOError: except IOError:
logger.exception("error writing server list to the file: %s" % filename) logger.exception("error writing server list to the file: %s", filename)
def writenodeserver(self, nodestr, server): def writenodeserver(self, nodestr, server):
""" """
@ -1072,7 +1067,7 @@ class CoreBroker(ConfigurableManager):
with open(filename, "w") as f: with open(filename, "w") as f:
f.write("%s\n%s\n" % (serverstr, nodestr)) f.write("%s\n%s\n" % (serverstr, nodestr))
except IOError: except IOError:
logger.exception("error writing server file %s for node %s" % (filename, name)) logger.exception("error writing server file %s for node %s", filename, name)
def local_instantiation_complete(self): def local_instantiation_complete(self):
""" """
@ -1126,9 +1121,9 @@ class CoreBroker(ConfigurableManager):
if values_str is None: if values_str is None:
return return
value_strings = values_str.split('|') value_strings = values_str.split("|")
for value_string in value_strings: for value_string in value_strings:
key, value = value_string.split('=', 1) key, value = value_string.split("=", 1)
if key == "controlnet": if key == "controlnet":
self.handle_distributed_control_net(message, value_strings, value_strings.index(value_string)) self.handle_distributed_control_net(message, value_strings, value_strings.index(value_string))
@ -1144,7 +1139,7 @@ class CoreBroker(ConfigurableManager):
:return: nothing :return: nothing
""" """
key_value = values[index] key_value = values[index]
key, value = key_value.split('=', 1) key, value = key_value.split("=", 1)
control_nets = value.split() control_nets = value.split()
if len(control_nets) < 2: if len(control_nets) < 2:

View file

@ -15,6 +15,9 @@ from core import logger
from core.api import coreapi from core.api import coreapi
from core.data import ConfigData from core.data import ConfigData
from core.data import EventData from core.data import EventData
from core.emulator.emudata import InterfaceData
from core.emulator.emudata import LinkOptions
from core.emulator.emudata import NodeOptions
from core.enumerations import ConfigTlvs from core.enumerations import ConfigTlvs
from core.enumerations import EventTlvs from core.enumerations import EventTlvs
from core.enumerations import EventTypes from core.enumerations import EventTypes
@ -29,9 +32,6 @@ from core.enumerations import NodeTlvs
from core.enumerations import NodeTypes from core.enumerations import NodeTypes
from core.enumerations import RegisterTlvs from core.enumerations import RegisterTlvs
from core.enumerations import SessionTlvs from core.enumerations import SessionTlvs
from core.future.futuredata import InterfaceData
from core.future.futuredata import LinkOptions
from core.future.futuredata import NodeOptions
from core.misc import nodeutils from core.misc import nodeutils
from core.misc import structutils from core.misc import structutils
from core.misc import utils from core.misc import utils

View file

@ -4,7 +4,7 @@ Defines core server for handling TCP connections.
import SocketServer import SocketServer
from core.future.coreemu import CoreEmu from core.emulator.coreemu import CoreEmu
class CoreServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): class CoreServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):

View file

@ -8,11 +8,11 @@ from core import logger
from core.coreobj import PyCoreNet from core.coreobj import PyCoreNet
from core.coreobj import PyCoreNode from core.coreobj import PyCoreNode
from core.data import NodeData from core.data import NodeData
from core.emulator.emudata import LinkOptions
from core.emulator.emudata import NodeOptions
from core.enumerations import EventTypes from core.enumerations import EventTypes
from core.enumerations import LinkTypes from core.enumerations import LinkTypes
from core.enumerations import NodeTypes from core.enumerations import NodeTypes
from core.future.futuredata import LinkOptions
from core.future.futuredata import NodeOptions
from core.misc import nodemaps from core.misc import nodemaps
from core.misc import nodeutils from core.misc import nodeutils
from core.session import Session from core.session import Session
@ -45,7 +45,7 @@ def create_interface(node, network, interface_data):
:param node: node to create interface for :param node: node to create interface for
:param network: network to associate interface with :param network: network to associate interface with
:param core.future.futuredata.InterfaceData interface_data: interface data :param core.emulator.emudata.InterfaceData interface_data: interface data
:return: created interface :return: created interface
""" """
node.newnetif( node.newnetif(
@ -64,7 +64,7 @@ def link_config(network, interface, link_options, devname=None, interface_two=No
:param network: network to configure link for :param network: network to configure link for
:param interface: interface to configure :param interface: interface to configure
:param core.future.futuredata.LinkOptions link_options: data to configure link with :param core.emulator.emudata.LinkOptions link_options: data to configure link with
:param str devname: device name, default is None :param str devname: device name, default is None
:param interface_two: other interface associated, default is None :param interface_two: other interface associated, default is None
:return: nothing :return: nothing
@ -117,9 +117,9 @@ class IdGen(object):
return self.id return self.id
class FutureSession(Session): class EmuSession(Session):
def __init__(self, session_id, config=None, mkdir=True): def __init__(self, session_id, config=None, mkdir=True):
super(FutureSession, self).__init__(session_id, config, mkdir) super(EmuSession, self).__init__(session_id, config, mkdir)
# object management # object management
self.node_id_gen = IdGen() self.node_id_gen = IdGen()
@ -220,9 +220,9 @@ class FutureSession(Session):
:param int node_one_id: node one id :param int node_one_id: node one id
:param int node_two_id: node two id :param int node_two_id: node two id
:param core.future.futuredata.InterfaceData interface_one: node one interface data, defaults to none :param core.emulator.emudata.InterfaceData interface_one: node one interface data, defaults to none
:param core.future.futuredata.InterfaceData interface_two: node two interface data, defaults to none :param core.emulator.emudata.InterfaceData interface_two: node two interface data, defaults to none
:param core.future.futuredata.LinkOptions link_options: data for creating link, defaults to no options :param core.emulator.emudata.LinkOptions link_options: data for creating link, defaults to no options
:return: :return:
""" """
# get node objects identified by link data # get node objects identified by link data
@ -386,7 +386,7 @@ class FutureSession(Session):
:param int node_two_id: node two id :param int node_two_id: node two id
:param int interface_one_id: interface id for node one :param int interface_one_id: interface id for node one
:param int interface_two_id: interface id for node two :param int interface_two_id: interface id for node two
:param core.future.futuredata.LinkOptions link_options: data to update link with :param core.emulator.emudata.LinkOptions link_options: data to update link with
:return: nothing :return: nothing
""" """
# interface data # interface data
@ -467,7 +467,7 @@ class FutureSession(Session):
:param core.enumerations.NodeTypes _type: type of node to create :param core.enumerations.NodeTypes _type: type of node to create
:param int _id: id for node, defaults to None for generated id :param int _id: id for node, defaults to None for generated id
:param core.future.futuredata.NodeOptions node_options: data to create node with :param core.emulator.emudata.NodeOptions node_options: data to create node with
:return: created node :return: created node
""" """
@ -531,7 +531,7 @@ class FutureSession(Session):
Update node information. Update node information.
:param int node_id: id of node to update :param int node_id: id of node to update
:param core.future.futuredata.NodeOptions node_options: data to update node with :param core.emulator.emudata.NodeOptions node_options: data to update node with
:return: True if node updated, False otherwise :return: True if node updated, False otherwise
:rtype: bool :rtype: bool
""" """
@ -573,7 +573,7 @@ class FutureSession(Session):
Set position for a node, use lat/lon/alt if needed. Set position for a node, use lat/lon/alt if needed.
:param node: node to set position for :param node: node to set position for
:param core.future.futuredata.NodeOptions node_options: data for node :param core.emulator.emudata.NodeOptions node_options: data for node
:return: nothing :return: nothing
""" """
# extract location values # extract location values
@ -627,9 +627,10 @@ class FutureSession(Session):
:return: nothing :return: nothing
""" """
logger.info("session(%s) shutting down", self.session_id)
self.set_state(EventTypes.DATACOLLECT_STATE, send_event=True) self.set_state(EventTypes.DATACOLLECT_STATE, send_event=True)
self.set_state(EventTypes.SHUTDOWN_STATE, send_event=True) self.set_state(EventTypes.SHUTDOWN_STATE, send_event=True)
super(FutureSession, self).shutdown() super(EmuSession, self).shutdown()
def custom_delete_object(self, object_id): def custom_delete_object(self, object_id):
""" """
@ -653,7 +654,7 @@ class FutureSession(Session):
:return: True if active, False otherwise :return: True if active, False otherwise
""" """
result = self.state in {EventTypes.RUNTIME_STATE.value, EventTypes.DATACOLLECT_STATE.value} result = self.state in {EventTypes.RUNTIME_STATE.value, EventTypes.DATACOLLECT_STATE.value}
logger.info("checking if session is active: %s", result) logger.info("session(%s) checking if active: %s", self.session_id, result)
return result return result
def open_xml(self, file_name, start=False): def open_xml(self, file_name, start=False):
@ -775,7 +776,7 @@ class FutureSession(Session):
Create a wireless node for use within an wireless/EMANE networks. Create a wireless node for use within an wireless/EMANE networks.
:param int _id: int for node, defaults to None and will be generated :param int _id: int for node, defaults to None and will be generated
:param core.future.futuredata.NodeOptions node_options: options for emane node, model will always be "mdr" :param core.emulator.emudata.NodeOptions node_options: options for emane node, model will always be "mdr"
:return: new emane node :return: new emane node
:rtype: core.netns.nodes.CoreNode :rtype: core.netns.nodes.CoreNode
""" """
@ -789,7 +790,7 @@ class FutureSession(Session):
:param model: emane model to use for emane network :param model: emane model to use for emane network
:param geo_reference: geo reference point to use for emane node locations :param geo_reference: geo reference point to use for emane node locations
:param geo_scale: geo scale to use for emane node locations, defaults to 1.0 :param geo_scale: geo scale to use for emane node locations, defaults to 1.0
:param core.future.futuredata.NodeOptions node_options: options for emane node being created :param core.emulator.emudata.NodeOptions node_options: options for emane node being created
:return: create emane network :return: create emane network
""" """
# required to be set for emane to function properly # required to be set for emane to function properly
@ -880,7 +881,7 @@ class CoreEmu(object):
:return: nothing :return: nothing
""" """
logger.info("shutting down all session") logger.info("shutting down all sessions")
sessions = self.sessions.copy() sessions = self.sessions.copy()
self.sessions.clear() self.sessions.clear()
for session in sessions.itervalues(): for session in sessions.itervalues():
@ -893,7 +894,7 @@ class CoreEmu(object):
:param int _id: session id for new session :param int _id: session id for new session
:param bool master: sets session to master :param bool master: sets session to master
:return: created session :return: created session
:rtype: FutureSession :rtype: EmuSession
""" """
session_id = _id session_id = _id
@ -903,7 +904,7 @@ class CoreEmu(object):
if session_id not in self.sessions: if session_id not in self.sessions:
break break
session = FutureSession(session_id, config=self.config) session = EmuSession(session_id, config=self.config)
logger.info("created session: %s", session_id) logger.info("created session: %s", session_id)
if master: if master:
session.master = True session.master = True

View file

@ -1,5 +1,7 @@
from core.enumerations import LinkTypes from core.enumerations import LinkTypes
from core.misc.ipaddress import Ipv4Prefix, Ipv6Prefix, MacAddress from core.misc.ipaddress import Ipv4Prefix
from core.misc.ipaddress import Ipv6Prefix
from core.misc.ipaddress import MacAddress
class NodeOptions(object): class NodeOptions(object):

View file

@ -891,6 +891,10 @@ def get_endpoint(network_object, interface_object):
ep = None ep = None
l2devport = None l2devport = None
# skip if either are none
if not network_object or not interface_object:
return ep
# if ifcObj references an interface of a node and is part of this network # if ifcObj references an interface of a node and is part of this network
if interface_object.net.objid == network_object.objid and hasattr(interface_object, if interface_object.net.objid == network_object.objid and hasattr(interface_object,
'node') and interface_object.node: 'node') and interface_object.node:
@ -957,7 +961,7 @@ def get_endpoints(network_object):
if ep is not None: if ep is not None:
endpoints.append(ep) endpoints.append(ep)
except: except:
logger.exception("error geting endpoints, was skipped before") logger.debug("error geting endpoints, was skipped before")
return endpoints return endpoints

View file

@ -6,9 +6,9 @@ import datetime
import parser import parser
from core.emane.ieee80211abg import EmaneIeee80211abgModel from core.emane.ieee80211abg import EmaneIeee80211abgModel
from core.emulator.coreemu import CoreEmu
from core.emulator.emudata import IpPrefixes
from core.enumerations import EventTypes from core.enumerations import EventTypes
from core.future.coreemu import CoreEmu
from core.future.futuredata import IpPrefixes
def example(options): def example(options):

View file

@ -8,9 +8,9 @@
import datetime import datetime
import parser import parser
from core.emulator.coreemu import CoreEmu
from core.emulator.emudata import IpPrefixes
from core.enumerations import NodeTypes, EventTypes from core.enumerations import NodeTypes, EventTypes
from core.future.coreemu import CoreEmu
from core.future.futuredata import IpPrefixes
def example(options): def example(options):

View file

@ -5,8 +5,8 @@
# and repeat for minnodes <= n <= maxnodes with a step size of # and repeat for minnodes <= n <= maxnodes with a step size of
# nodestep # nodestep
from core.emulator.emudata import IpPrefixes
from core.enumerations import NodeTypes, EventTypes from core.enumerations import NodeTypes, EventTypes
from core.future.futuredata import IpPrefixes
def example(nodes): def example(nodes):

View file

@ -8,9 +8,9 @@
import datetime import datetime
import parser import parser
from core.emulator.coreemu import CoreEmu
from core.emulator.emudata import IpPrefixes
from core.enumerations import NodeTypes, EventTypes from core.enumerations import NodeTypes, EventTypes
from core.future.coreemu import CoreEmu
from core.future.futuredata import IpPrefixes
from core.mobility import BasicRangeModel from core.mobility import BasicRangeModel

View file

@ -13,8 +13,8 @@ import time
from core import constants from core import constants
from core import enumerations from core import enumerations
from core import logger from core import logger
from core.legacy.corehandler import CoreHandler from core.corehandlers import CoreHandler
from core.legacy.coreserver import CoreServer from core.coreserver import CoreServer
from core.misc.utils import close_onexec from core.misc.utils import close_onexec
from core.service import ServiceManager from core.service import ServiceManager
@ -51,7 +51,7 @@ def cored(cfg, use_ovs):
sys.exit(1) sys.exit(1)
close_onexec(server.fileno()) close_onexec(server.fileno())
logger.debug("main server started, listening on: %s:%s", host, port) logger.info("server started, listening on: %s:%s", host, port)
server.serve_forever() server.serve_forever()

View file

@ -13,6 +13,10 @@ from core.api.coreapi import CoreEventMessage
from core.api.coreapi import CoreExecMessage from core.api.coreapi import CoreExecMessage
from core.api.coreapi import CoreLinkMessage from core.api.coreapi import CoreLinkMessage
from core.api.coreapi import CoreNodeMessage from core.api.coreapi import CoreNodeMessage
from core.corehandlers import CoreHandler
from core.coreserver import CoreServer
from core.emulator.coreemu import CoreEmu
from core.emulator.emudata import IpPrefixes
from core.enumerations import CORE_API_PORT from core.enumerations import CORE_API_PORT
from core.enumerations import ConfigTlvs from core.enumerations import ConfigTlvs
from core.enumerations import EventTlvs from core.enumerations import EventTlvs
@ -23,10 +27,6 @@ from core.enumerations import LinkTypes
from core.enumerations import MessageFlags from core.enumerations import MessageFlags
from core.enumerations import NodeTlvs from core.enumerations import NodeTlvs
from core.enumerations import NodeTypes from core.enumerations import NodeTypes
from core.future.coreemu import CoreEmu
from core.future.futuredata import IpPrefixes
from core.legacy.corehandler import CoreHandler
from core.legacy.coreserver import CoreServer
from core.misc import ipaddress from core.misc import ipaddress
from core.misc.ipaddress import MacAddress from core.misc.ipaddress import MacAddress

View file

@ -11,8 +11,8 @@ import pytest
from mock import MagicMock from mock import MagicMock
from core.data import ConfigData from core.data import ConfigData
from core.emulator.emudata import NodeOptions
from core.enumerations import MessageFlags, NodeTypes from core.enumerations import MessageFlags, NodeTypes
from core.future.futuredata import NodeOptions
from core.mobility import BasicRangeModel from core.mobility import BasicRangeModel
from core.netns.vnodeclient import VnodeClient from core.netns.vnodeclient import VnodeClient
from core.service import ServiceManager from core.service import ServiceManager
@ -250,7 +250,7 @@ class TestCore:
""" """
Test basic wlan network. Test basic wlan network.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """
@ -283,7 +283,7 @@ class TestCore:
""" """
Test basic wlan network. Test basic wlan network.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """

View file

@ -10,7 +10,7 @@ from core.emane.commeffect import EmaneCommEffectModel
from core.emane.ieee80211abg import EmaneIeee80211abgModel from core.emane.ieee80211abg import EmaneIeee80211abgModel
from core.emane.rfpipe import EmaneRfPipeModel from core.emane.rfpipe import EmaneRfPipeModel
from core.emane.tdma import EmaneTdmaModel from core.emane.tdma import EmaneTdmaModel
from core.future.futuredata import NodeOptions from core.emulator.emudata import NodeOptions
_EMANE_MODELS = [ _EMANE_MODELS = [
EmaneIeee80211abgModel, EmaneIeee80211abgModel,
@ -27,7 +27,7 @@ class TestEmane:
""" """
Test emane models within a basic network. Test emane models within a basic network.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param model: emane model to test :param model: emane model to test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """

View file

@ -105,7 +105,7 @@ class TestGui:
""" """
Test session broker creation. Test session broker creation.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param cored: cored daemon server to test with :param cored: cored daemon server to test with
""" """

View file

@ -1,5 +1,5 @@
from core.emulator.emudata import LinkOptions
from core.enumerations import NodeTypes from core.enumerations import NodeTypes
from core.future.futuredata import LinkOptions
from core.misc import utils from core.misc import utils
@ -138,7 +138,7 @@ class TestLinks:
""" """
Test ptp node network with modifying link bandwidth. Test ptp node network with modifying link bandwidth.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """
@ -169,7 +169,7 @@ class TestLinks:
""" """
Test ptp node network with modifying link packet loss. Test ptp node network with modifying link packet loss.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """
@ -200,7 +200,7 @@ class TestLinks:
""" """
Test ptp node network with modifying link packet delay. Test ptp node network with modifying link packet delay.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """
@ -232,7 +232,7 @@ class TestLinks:
""" """
Test ptp node network with modifying link packet jitter. Test ptp node network with modifying link packet jitter.
:param core.future.coreemu.FutureSession session: session for test :param core.emulator.coreemu.EmuSession session: session for test
:param ip_prefixes: generates ip addresses for nodes :param ip_prefixes: generates ip addresses for nodes
""" """

View file

@ -3,8 +3,8 @@ import time
import pytest import pytest
from core.emulator.emudata import NodeOptions
from core.enumerations import NodeTypes from core.enumerations import NodeTypes
from core.future.futuredata import NodeOptions
from core.misc import utils from core.misc import utils
MODELS = [ MODELS = [