Exemplo n.º 1
0
def main(args):
    # ip generator for example
    prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu = CoreEmu({"distributed_address": args.address})
    session = coreemu.create_session()

    # initialize distributed
    server_name = "core2"
    session.distributed.add_server(server_name, args.server)

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create local node, switch, and remote nodes
    options = NodeOptions()
    node1 = session.add_node(CoreNode, options=options)
    options.server = server_name
    node2 = session.add_node(CoreNode, options=options)

    # create node interfaces and link
    interface1_data = prefixes.create_iface(node1)
    interface2_data = prefixes.create_iface(node2)
    session.add_link(node1.id, node2.id, interface1_data, interface2_data)

    # instantiate session
    session.instantiate()

    # pause script for verification
    input("press enter for shutdown")

    # shutdown session
    coreemu.shutdown()
Exemplo n.º 2
0
    def __init__(self, ip4_prefix: str = None, ip6_prefix: str = None) -> None:
        """
        Creates an InterfaceHelper object.

        :param ip4_prefix: ip4 prefix to use for generation
        :param ip6_prefix: ip6 prefix to use for generation
        :raises ValueError: when both ip4 and ip6 prefixes have not been provided
        """
        self.prefixes: IpPrefixes = IpPrefixes(ip4_prefix, ip6_prefix)
Exemplo n.º 3
0
    def test_two_emane_interfaces(self, session: Session):
        """
        Test nodes running multiple emane interfaces.

        :param core.emulator.coreemu.EmuSession session: session for test
        """
        # create emane node for networking the core nodes
        session.set_location(47.57917, -122.13232, 2.00000, 1.0)
        options = NodeOptions()
        options.set_position(80, 50)
        options.emane = EmaneIeee80211abgModel.name
        emane_net1 = session.add_node(EmaneNet, options=options)
        options.emane = EmaneRfPipeModel.name
        emane_net2 = session.add_node(EmaneNet, options=options)

        # create nodes
        options = NodeOptions(model="mdr")
        options.set_position(150, 150)
        node1 = session.add_node(CoreNode, options=options)
        options.set_position(300, 150)
        node2 = session.add_node(CoreNode, options=options)

        # create interfaces
        ip_prefix1 = IpPrefixes("10.0.0.0/24")
        ip_prefix2 = IpPrefixes("10.0.1.0/24")
        for i, node in enumerate([node1, node2]):
            node.setposition(x=150 * (i + 1), y=150)
            iface_data = ip_prefix1.create_iface(node)
            session.add_link(node.id, emane_net1.id, iface1_data=iface_data)
            iface_data = ip_prefix2.create_iface(node)
            session.add_link(node.id, emane_net2.id, iface1_data=iface_data)

        # instantiate session
        session.instantiate()

        # ping node2 from node1 on both interfaces and check success
        status = ping(node1, node2, ip_prefix1, count=5)
        assert not status
        status = ping(node1, node2, ip_prefix2, count=5)
        assert not status
Exemplo n.º 4
0
def main():
    # ip generator for example
    prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu = CoreEmu()
    session = coreemu.create_session()

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create emane network node, emane determines connectivity based on
    # location, so the session and nodes must be configured to provide one
    session.set_location(47.57917, -122.13232, 2.00000, 1.0)
    options = NodeOptions()
    options.set_position(80, 50)
    emane_network = session.add_node(EmaneNet, options=options, _id=100)
    session.emane.set_model(emane_network, EmaneIeee80211abgModel)

    # create nodes
    options = NodeOptions(model="mdr")
    for i in range(NODES):
        node = session.add_node(CoreNode, options=options)
        node.setposition(x=150 * (i + 1), y=150)
        interface = prefixes.create_iface(node)
        session.add_link(node.id, emane_network.id, iface1_data=interface)

    # instantiate session
    session.instantiate()

    # OSPF MDR requires some time for routes to be created
    logging.info("waiting %s seconds for OSPF MDR to create routes",
                 EMANE_DELAY)
    time.sleep(EMANE_DELAY)

    # get nodes to run example
    first_node = session.get_node(1, CoreNode)
    last_node = session.get_node(NODES, CoreNode)
    address = prefixes.ip4_address(first_node.id)
    logging.info("node %s pinging %s", last_node.name, address)
    output = last_node.cmd(f"ping -c 3 {address}")
    logging.info(output)

    # shutdown session
    coreemu.shutdown()
Exemplo n.º 5
0
def main(args):
    # ip generator for example
    prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu = CoreEmu({
        "controlnet":
        "core1:172.16.1.0/24 core2:172.16.2.0/24 core3:172.16.3.0/24 "
        "core4:172.16.4.0/24 core5:172.16.5.0/24",
        "distributed_address":
        args.address,
    })
    session = coreemu.create_session()

    # initialize distributed
    server_name = "core2"
    session.distributed.add_server(server_name, args.server)

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create local node, switch, and remote nodes
    options = NodeOptions(model="mdr")
    options.set_position(0, 0)
    node1 = session.add_node(CoreNode, options=options)
    emane_net = session.add_node(EmaneNet)
    session.emane.set_model(emane_net, EmaneIeee80211abgModel)
    options.server = server_name
    node2 = session.add_node(CoreNode, options=options)

    # create node interfaces and link
    interface1_data = prefixes.create_iface(node1)
    interface2_data = prefixes.create_iface(node2)
    session.add_link(node1.id, emane_net.id, iface1_data=interface1_data)
    session.add_link(node2.id, emane_net.id, iface1_data=interface2_data)

    # instantiate session
    session.instantiate()

    # pause script for verification
    input("press enter for shutdown")

    # shutdown session
    coreemu.shutdown()
Exemplo n.º 6
0
def main():
    # ip generator for example
    prefixes = IpPrefixes("10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu: CoreEmu = globals()["coreemu"]
    session = coreemu.create_session()

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create switch network node
    switch = session.add_node(SwitchNode)

    # create nodes
    for _ in range(NODES):
        node = session.add_node(CoreNode)
        interface = prefixes.create_iface(node)
        session.add_link(node.id, switch.id, iface1_data=interface)

    # instantiate session
    session.instantiate()
Exemplo n.º 7
0
Arquivo: wlan.py Projeto: umr-ds/core
def main():
    # ip generator for example
    prefixes = IpPrefixes("10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu = CoreEmu()
    session = coreemu.create_session()

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create wlan network node
    wlan = session.add_node(WlanNode, _id=100)
    session.mobility.set_model(wlan, BasicRangeModel)

    # create nodes, must set a position for wlan basic range model
    options = NodeOptions(model="mdr")
    options.set_position(0, 0)
    for _ in range(NODES):
        node = session.add_node(CoreNode, options=options)
        interface = prefixes.create_iface(node)
        session.add_link(node.id, wlan.id, iface1_data=interface)

    # instantiate session
    session.instantiate()

    # get nodes for example run
    first_node = session.get_node(1, CoreNode)
    last_node = session.get_node(NODES, CoreNode)
    address = prefixes.ip4_address(first_node.id)
    logging.info("node %s pinging %s", last_node.name, address)
    output = last_node.cmd(f"ping -c 3 {address}")
    logging.info(output)

    # shutdown session
    coreemu.shutdown()
Exemplo n.º 8
0
# required imports

import netaddr, dataclasses, fabric, lxml, pyproj
from core.emulator.coreemu import CoreEmu
from core.emulator.data import IpPrefixes, NodeOptions
from core.emulator.enumerations import EventTypes
from core.nodes.base import CoreNode
from core.nodes.network import SwitchNode

# ip nerator for example
ip_prefixes = IpPrefixes(ip4_prefix="10.0.0.0/24")

# create emulator instance for creating sessions and utility methods
coreemu = CoreEmu()
session = coreemu.create_session()

print(session)

# must be in configuration state for nodes to start, when using "node_add" below
session.set_state(EventTypes.CONFIGURATION_STATE)

# create switch
options = NodeOptions(x=200, y=200)
switch = session.add_node(SwitchNode, options=options)

# create nodes
options = NodeOptions(x=100, y=100)
n1 = session.add_node(CoreNode, options=options)
options = NodeOptions(x=300, y=100)
n2 = session.add_node(CoreNode, options=options)
Exemplo n.º 9
0
import logging

from core.emulator.coreemu import CoreEmu
from core.emulator.data import IpPrefixes, NodeOptions
from core.emulator.enumerations import EventTypes
from core.nodes.base import CoreNode
from core.nodes.lxd import LxcNode

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)
    coreemu = CoreEmu()
    session = coreemu.create_session()
    session.set_state(EventTypes.CONFIGURATION_STATE)

    try:
        prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")
        options = NodeOptions(image="ubuntu")

        # create node one
        node1 = session.add_node(LxcNode, options=options)
        interface1_data = prefixes.create_iface(node1)

        # create node two
        node2 = session.add_node(CoreNode)
        interface2_data = prefixes.create_iface(node2)

        # add link
        session.add_link(node1.id, node2.id, interface1_data, interface2_data)

        # instantiate
        session.instantiate()
Exemplo n.º 10
0
def main():

    parser = argparse.ArgumentParser()
    parser.add_argument('--is_virtual',
                        dest='is_virtual',
                        help='with Kronos',
                        default="False")

    args = parser.parse_args()

    if args.is_virtual == "True":
        is_virtual = True
    else:
        is_virtual = False

    # Kronos specific parameters
    total_num_dilated_executables = 6  # (2 plcs + 2 communication modules + 2 hmis )
    run_time_secs = 5
    rel_cpu_speed = 1.0
    num_insns_per_round = 1000000

    plc_spec_directory = os.path.dirname(os.path.realpath(__file__))
    plc1_spec_file = f"{plc_spec_directory}/plc1_system_specification.prototxt"
    plc2_spec_file = f"{plc_spec_directory}/plc2_system_specification.prototxt"

    NUM_PLCS = 2
    NUM_HMIS = 2

    # ip generator for example
    prefixes = IpPrefixes(ip4_prefix="10.83.0.0/16")

    # create emulator instance for creating sessions and utility methods
    coreemu = CoreEmu()
    session = coreemu.create_session()

    # must be in configuration state for nodes to start, when using "node_add" below
    session.set_state(EventTypes.CONFIGURATION_STATE)

    # create switch network node
    switch = session.add_node(SwitchNode, _id=100)

    # create nodes
    for _ in range(NUM_PLCS + NUM_HMIS):
        node = session.add_node(CoreNode)
        interface = prefixes.create_iface(node)
        session.add_link(node.id,
                         switch.id,
                         iface1_data=interface,
                         options=LinkOptions(delay=1000))  # delay in us

    # instantiate session
    session.instantiate()

    node_ifaces = []

    # get nodes to run example
    plc1_node = session.get_node(1, CoreNode)
    node_ifaces.extend(
        [x.localname for x in plc1_node.get_ifaces(control=False)])

    plc2_node = session.get_node(2, CoreNode)
    node_ifaces.extend(
        [x.localname for x in plc2_node.get_ifaces(control=False)])

    hmi1_node = session.get_node(3, CoreNode)
    node_ifaces.extend(
        [x.localname for x in hmi1_node.get_ifaces(control=False)])

    hmi2_node = session.get_node(4, CoreNode)
    node_ifaces.extend(
        [x.localname for x in hmi2_node.get_ifaces(control=False)])

    print("node-ifaces ", node_ifaces)
    plc1_ip_address = prefixes.ip4_address(plc1_node.id)
    plc2_ip_address = prefixes.ip4_address(plc2_node.id)

    print(f"PLC-1 IP: {plc1_ip_address}, PLC-2 IP: {plc2_ip_address}")

    # Clear any existing log files
    if os.path.exists("/tmp/pc_grpc_server_log.txt"):
        os.remove("/tmp/pc_grpc_server_log.txt")
    if os.path.exists("/tmp/plc1_log.txt"):
        os.remove("/tmp/plc1_log.txt")
    if os.path.exists("/tmp/plc2_log.txt"):
        os.remove("/tmp/plc2_log.txt")
    if os.path.exists("/tmp/comm_module1_log.txt"):
        os.remove("/tmp/comm_module1_log.txt")
    if os.path.exists("/tmp/comm_module2_log.txt"):
        os.remove("/tmp/comm_module2_log.txt")
    if os.path.exists("/tmp/hmi1.txt"):
        os.remove("/tmp/hmi1.txt")
    if os.path.exists("/tmp/hmi2.txt"):
        os.remove("/tmp/hmi2.txt")

    fd1 = os.open("/tmp/pc_grpc_server_log.txt", os.O_RDWR | os.O_CREAT)

    pendulum_sim = PendulumSystemSimulator()
    if args.is_virtual == "True":
        is_virtual = True
    else:
        is_virtual = False

    # Create an emulation driver. Register pendulum system simulator with it.
    emulation = EmulationDriver(
        number_dilated_nodes=total_num_dilated_executables,
        is_virtual=is_virtual,
        n_insns_per_round=num_insns_per_round,
        rel_cpu_speed=rel_cpu_speed,
        physical_system_sim_driver=pendulum_sim)

    # Start pc_grpc_server, all PLCs and all communication modules here
    emulation.start_grpc_server(plc_spec_directory, fd1)

    if is_virtual:
        emulation.add_interfaces_to_vt_control(node_ifaces)

    # Retrieve command strings to run PLCs/HMIs/Communication Modules
    plc1_cmd = emulation.get_plc_exec_command(
        path_to_plc_specification_file=plc1_spec_file,
        log_file_path="/tmp/plc1_log.txt")
    plc2_cmd = emulation.get_plc_exec_command(
        path_to_plc_specification_file=plc2_spec_file,
        log_file_path="/tmp/plc2_log.txt")

    comm_module1_cmd = emulation.wrap_command(
        get_comm_module_start_command(plc1_spec_file, plc1_ip_address,
                                      "/tmp/comm_module1_log.txt"))
    comm_module2_cmd = emulation.wrap_command(
        get_comm_module_start_command(plc2_spec_file, plc2_ip_address,
                                      "/tmp/comm_module2_log.txt"))

    hmi1_cmd = emulation.wrap_command(
        get_example_hmi_start_command(plc1_ip_address, "/tmp/hmi1.txt"))
    hmi2_cmd = emulation.wrap_command(
        get_example_hmi_start_command(plc2_ip_address, "/tmp/hmi2.txt"))

    print("Starting PLCs ...")
    plc1_node.cmd(plc1_cmd, wait=False)
    plc2_node.cmd(plc2_cmd, wait=False)
    print("Starting PLC Modbus Comm modules ...")
    plc1_node.cmd(comm_module1_cmd, wait=False)
    plc2_node.cmd(comm_module2_cmd, wait=False)
    print("Starting HMI ...")
    hmi1_node.cmd(hmi1_cmd, wait=False)
    hmi2_node.cmd(hmi2_cmd, wait=False)

    # Wait until all processes have started and registered themselves
    emulation.wait_for_initialization()

    # Register an interrupt signal handler.
    signal.signal(signal.SIGINT, handler)

    total_time_elapsed = 0.0
    while total_time_elapsed <= run_time_secs:

        emulation.run_for(0.01)
        total_time_elapsed += 0.01
        if is_virtual:
            print("Time Elapsed: ", total_time_elapsed)
        if stop == True:
            break

    print("Stopping Emulation ...")
    sys.stdout.flush()
    emulation.stop_exp()

    os.close(fd1)

    # shutdown session
    coreemu.shutdown()

    print("Emulation finished ! ")
Exemplo n.º 11
0
def ip_prefixes():
    return IpPrefixes(ip4_prefix="10.83.0.0/16")
Exemplo n.º 12
0
from core.location.mobility import BasicRangeModel
from core.nodes.base import CoreNode
from core.nodes.network import WlanNode
import time
import logging
from pyroute2 import IPRoute
import signal
import os
import net_events

log = logging.getLogger()
log.setLevel(logging.INFO)

SWARMDAG_PATH = '/home/jasonatran/go/src/github.com/ANRGUSC/swarmdag/build'
NUM_NODES = 8
prefixes = IpPrefixes("192.168.10.0/24")
session = CoreEmu().create_session()
ip = IPRoute()  # for IP routes on host


def cleanup_session(signum, frame):
    print("shutting down Core nodes...")
    session.shutdown()
    if len(ip.link_lookup(ifname='veth0')) == 1:
        #  `sudo ip link del veth0 type veth peer name veth1`
        ip.link("delete",
                ifname="veth0",
                kind="veth",
                peer={"ifname": "veth1"})
    exit()