From 2516bf80a85973a37147e1f46dd37f7b1d006f31 Mon Sep 17 00:00:00 2001 From: grossmj Date: Sat, 21 Dec 2013 17:42:33 -0700 Subject: [PATCH] Dynamips backend (API implementation) --- gns3server/modules/dynamips/__init__.py | 63 +- .../dynamips/adapters}/__init__.py | 0 .../modules/dynamips/adapters/adapter.py | 155 +++ .../modules/dynamips/adapters/c1700_mb_1fe.py | 43 + .../dynamips/adapters/c1700_mb_wic1.py | 44 + .../modules/dynamips/adapters/c2600_mb_1e.py | 43 + .../modules/dynamips/adapters/c2600_mb_1fe.py | 44 + .../modules/dynamips/adapters/c2600_mb_2e.py | 43 + .../modules/dynamips/adapters/c2600_mb_2fe.py | 43 + .../modules/dynamips/adapters/c7200_io_2fe.py | 43 + .../modules/dynamips/adapters/c7200_io_fe.py | 43 + .../dynamips/adapters/c7200_io_ge_e.py | 43 + .../modules/dynamips/adapters/gt96100_fe.py | 40 + .../modules/dynamips/adapters/leopard_2fe.py | 44 + .../modules/dynamips/adapters/nm_16esw.py | 39 + gns3server/modules/dynamips/adapters/nm_1e.py | 39 + .../modules/dynamips/adapters/nm_1fe_tx.py | 39 + gns3server/modules/dynamips/adapters/nm_4e.py | 39 + gns3server/modules/dynamips/adapters/nm_4t.py | 39 + .../modules/dynamips/adapters/pa_2fe_tx.py | 39 + gns3server/modules/dynamips/adapters/pa_4e.py | 39 + gns3server/modules/dynamips/adapters/pa_4t.py | 39 + gns3server/modules/dynamips/adapters/pa_8e.py | 39 + gns3server/modules/dynamips/adapters/pa_8t.py | 39 + gns3server/modules/dynamips/adapters/pa_a1.py | 39 + .../modules/dynamips/adapters/pa_fe_tx.py | 39 + gns3server/modules/dynamips/adapters/pa_ge.py | 39 + .../modules/dynamips/adapters/pa_pos_oc3.py | 39 + .../modules/dynamips/adapters/wic_1enet.py | 48 + .../modules/dynamips/adapters/wic_1t.py | 48 + .../modules/dynamips/adapters/wic_2t.py | 48 + .../dynamips/dynamips_error.py} | 28 +- .../modules/dynamips/dynamips_hypervisor.py | 419 +++++++ gns3server/modules/dynamips/hypervisor.py | 270 ++++ .../modules/dynamips/hypervisor_manager.py | 235 ++++ gns3server/modules/dynamips/nios/__init__.py | 0 gns3server/modules/dynamips/nios/nio.py | 236 ++++ gns3server/modules/dynamips/nios/nio_fifo.py | 53 + .../dynamips/nios/nio_generic_ethernet.py | 56 + .../dynamips/nios/nio_linux_ethernet.py | 56 + gns3server/modules/dynamips/nios/nio_mcast.py | 92 ++ gns3server/modules/dynamips/nios/nio_null.py | 43 + gns3server/modules/dynamips/nios/nio_tap.py | 56 + gns3server/modules/dynamips/nios/nio_udp.py | 82 ++ .../modules/dynamips/nios/nio_udp_auto.py | 106 ++ gns3server/modules/dynamips/nios/nio_unix.py | 69 ++ gns3server/modules/dynamips/nios/nio_vde.py | 69 ++ gns3server/modules/dynamips/nodes/__init__.py | 0 .../modules/dynamips/nodes/atm_bridge.py | 170 +++ .../modules/dynamips/nodes/atm_switch.py | 248 ++++ gns3server/modules/dynamips/nodes/bridge.py | 121 ++ gns3server/modules/dynamips/nodes/c1700.py | 125 ++ gns3server/modules/dynamips/nodes/c2600.py | 135 ++ gns3server/modules/dynamips/nodes/c2691.py | 79 ++ gns3server/modules/dynamips/nodes/c3600.py | 121 ++ gns3server/modules/dynamips/nodes/c3725.py | 79 ++ gns3server/modules/dynamips/nodes/c3745.py | 79 ++ gns3server/modules/dynamips/nodes/c7200.py | 187 +++ .../modules/dynamips/nodes/ethernet_switch.py | 212 ++++ .../dynamips/nodes/frame_relay_switch.py | 188 +++ gns3server/modules/dynamips/nodes/hub.py | 76 ++ gns3server/modules/dynamips/nodes/router.py | 1085 +++++++++++++++++ gns3server/stomp/frame.py | 161 --- gns3server/stomp/protocol.py | 234 ---- gns3server/topology.py | 49 + tests/dynamips/.gitignore | 1 + tests/dynamips/conftest.py | 30 + tests/dynamips/dynamips.stable | Bin 0 -> 961258 bytes tests/dynamips/test_atm_bridge.py | 62 + tests/dynamips/test_atm_switch.py | 83 ++ tests/dynamips/test_bridge.py | 31 + tests/dynamips/test_c1700.py | 167 +++ tests/dynamips/test_c2600.py | 216 ++++ tests/dynamips/test_c2691.py | 75 ++ tests/dynamips/test_c3600.py | 118 ++ tests/dynamips/test_c3725.py | 73 ++ tests/dynamips/test_c3745.py | 73 ++ tests/dynamips/test_c7200.py | 188 +++ tests/dynamips/test_ethernet_switch.py | 87 ++ tests/dynamips/test_frame_relay_switch.py | 65 + tests/dynamips/test_hub.py | 25 + tests/dynamips/test_hypervisor.py | 44 + tests/dynamips/test_hypervisor_manager.py | 51 + tests/dynamips/test_nios.py | 139 +++ tests/dynamips/test_router.py | 229 ++++ tests/dynamips/test_vmhandler.py | 65 + 86 files changed, 8004 insertions(+), 418 deletions(-) rename gns3server/{stomp => modules/dynamips/adapters}/__init__.py (100%) create mode 100644 gns3server/modules/dynamips/adapters/adapter.py create mode 100644 gns3server/modules/dynamips/adapters/c1700_mb_1fe.py create mode 100644 gns3server/modules/dynamips/adapters/c1700_mb_wic1.py create mode 100644 gns3server/modules/dynamips/adapters/c2600_mb_1e.py create mode 100644 gns3server/modules/dynamips/adapters/c2600_mb_1fe.py create mode 100644 gns3server/modules/dynamips/adapters/c2600_mb_2e.py create mode 100644 gns3server/modules/dynamips/adapters/c2600_mb_2fe.py create mode 100644 gns3server/modules/dynamips/adapters/c7200_io_2fe.py create mode 100644 gns3server/modules/dynamips/adapters/c7200_io_fe.py create mode 100644 gns3server/modules/dynamips/adapters/c7200_io_ge_e.py create mode 100644 gns3server/modules/dynamips/adapters/gt96100_fe.py create mode 100644 gns3server/modules/dynamips/adapters/leopard_2fe.py create mode 100644 gns3server/modules/dynamips/adapters/nm_16esw.py create mode 100644 gns3server/modules/dynamips/adapters/nm_1e.py create mode 100644 gns3server/modules/dynamips/adapters/nm_1fe_tx.py create mode 100644 gns3server/modules/dynamips/adapters/nm_4e.py create mode 100644 gns3server/modules/dynamips/adapters/nm_4t.py create mode 100644 gns3server/modules/dynamips/adapters/pa_2fe_tx.py create mode 100644 gns3server/modules/dynamips/adapters/pa_4e.py create mode 100644 gns3server/modules/dynamips/adapters/pa_4t.py create mode 100644 gns3server/modules/dynamips/adapters/pa_8e.py create mode 100644 gns3server/modules/dynamips/adapters/pa_8t.py create mode 100644 gns3server/modules/dynamips/adapters/pa_a1.py create mode 100644 gns3server/modules/dynamips/adapters/pa_fe_tx.py create mode 100644 gns3server/modules/dynamips/adapters/pa_ge.py create mode 100644 gns3server/modules/dynamips/adapters/pa_pos_oc3.py create mode 100644 gns3server/modules/dynamips/adapters/wic_1enet.py create mode 100644 gns3server/modules/dynamips/adapters/wic_1t.py create mode 100644 gns3server/modules/dynamips/adapters/wic_2t.py rename gns3server/{stomp/utils.py => modules/dynamips/dynamips_error.py} (55%) create mode 100644 gns3server/modules/dynamips/dynamips_hypervisor.py create mode 100644 gns3server/modules/dynamips/hypervisor.py create mode 100644 gns3server/modules/dynamips/hypervisor_manager.py create mode 100644 gns3server/modules/dynamips/nios/__init__.py create mode 100644 gns3server/modules/dynamips/nios/nio.py create mode 100644 gns3server/modules/dynamips/nios/nio_fifo.py create mode 100644 gns3server/modules/dynamips/nios/nio_generic_ethernet.py create mode 100644 gns3server/modules/dynamips/nios/nio_linux_ethernet.py create mode 100644 gns3server/modules/dynamips/nios/nio_mcast.py create mode 100644 gns3server/modules/dynamips/nios/nio_null.py create mode 100644 gns3server/modules/dynamips/nios/nio_tap.py create mode 100644 gns3server/modules/dynamips/nios/nio_udp.py create mode 100644 gns3server/modules/dynamips/nios/nio_udp_auto.py create mode 100644 gns3server/modules/dynamips/nios/nio_unix.py create mode 100644 gns3server/modules/dynamips/nios/nio_vde.py create mode 100644 gns3server/modules/dynamips/nodes/__init__.py create mode 100644 gns3server/modules/dynamips/nodes/atm_bridge.py create mode 100644 gns3server/modules/dynamips/nodes/atm_switch.py create mode 100644 gns3server/modules/dynamips/nodes/bridge.py create mode 100644 gns3server/modules/dynamips/nodes/c1700.py create mode 100644 gns3server/modules/dynamips/nodes/c2600.py create mode 100644 gns3server/modules/dynamips/nodes/c2691.py create mode 100644 gns3server/modules/dynamips/nodes/c3600.py create mode 100644 gns3server/modules/dynamips/nodes/c3725.py create mode 100644 gns3server/modules/dynamips/nodes/c3745.py create mode 100644 gns3server/modules/dynamips/nodes/c7200.py create mode 100644 gns3server/modules/dynamips/nodes/ethernet_switch.py create mode 100644 gns3server/modules/dynamips/nodes/frame_relay_switch.py create mode 100644 gns3server/modules/dynamips/nodes/hub.py create mode 100644 gns3server/modules/dynamips/nodes/router.py delete mode 100644 gns3server/stomp/frame.py delete mode 100644 gns3server/stomp/protocol.py create mode 100644 gns3server/topology.py create mode 100644 tests/dynamips/.gitignore create mode 100644 tests/dynamips/conftest.py create mode 100755 tests/dynamips/dynamips.stable create mode 100644 tests/dynamips/test_atm_bridge.py create mode 100644 tests/dynamips/test_atm_switch.py create mode 100644 tests/dynamips/test_bridge.py create mode 100644 tests/dynamips/test_c1700.py create mode 100644 tests/dynamips/test_c2600.py create mode 100644 tests/dynamips/test_c2691.py create mode 100644 tests/dynamips/test_c3600.py create mode 100644 tests/dynamips/test_c3725.py create mode 100644 tests/dynamips/test_c3745.py create mode 100644 tests/dynamips/test_c7200.py create mode 100644 tests/dynamips/test_ethernet_switch.py create mode 100644 tests/dynamips/test_frame_relay_switch.py create mode 100644 tests/dynamips/test_hub.py create mode 100644 tests/dynamips/test_hypervisor.py create mode 100644 tests/dynamips/test_hypervisor_manager.py create mode 100644 tests/dynamips/test_nios.py create mode 100644 tests/dynamips/test_router.py create mode 100644 tests/dynamips/test_vmhandler.py diff --git a/gns3server/modules/dynamips/__init__.py b/gns3server/modules/dynamips/__init__.py index 83261edc..5ae34ad3 100644 --- a/gns3server/modules/dynamips/__init__.py +++ b/gns3server/modules/dynamips/__init__.py @@ -16,10 +16,61 @@ # along with this program. If not, see . from gns3server.modules import IModule +import gns3server.jsonrpc as jsonrpc from .hypervisor import Hypervisor from .hypervisor_manager import HypervisorManager from .dynamips_error import DynamipsError + +# nodes from .nodes.router import Router +from .nodes.c1700 import C1700 +from .nodes.c2600 import C2600 +from .nodes.c2691 import C2691 +from .nodes.c3600 import C3600 +from .nodes.c3725 import C3725 +from .nodes.c3745 import C3745 +from .nodes.c7200 import C7200 +from .nodes.bridge import Bridge +from .nodes.ethernet_switch import EthernetSwitch +from .nodes.atm_switch import ATMSwitch +from .nodes.atm_bridge import ATMBridge +from .nodes.frame_relay_switch import FrameRelaySwitch +from .nodes.hub import Hub + +# adapters +from .adapters.c7200_io_2fe import C7200_IO_2FE +from .adapters.c7200_io_fe import C7200_IO_FE +from .adapters.c7200_io_ge_e import C7200_IO_GE_E +from .adapters.nm_16esw import NM_16ESW +from .adapters.nm_1e import NM_1E +from .adapters.nm_1fe_tx import NM_1FE_TX +from .adapters.nm_4e import NM_4E +from .adapters.nm_4t import NM_4T +from .adapters.pa_2fe_tx import PA_2FE_TX +from .adapters.pa_4e import PA_4E +from .adapters.pa_4t import PA_4T +from .adapters.pa_8e import PA_8E +from .adapters.pa_8t import PA_8T +from .adapters.pa_a1 import PA_A1 +from .adapters.pa_fe_tx import PA_FE_TX +from .adapters.pa_ge import PA_GE +from .adapters.pa_pos_oc3 import PA_POS_OC3 +from .adapters.wic_1t import WIC_1T +from .adapters.wic_2t import WIC_2T +from .adapters.wic_1enet import WIC_1ENET + +# NIOs +from .nios.nio_udp import NIO_UDP +from .nios.nio_udp_auto import NIO_UDP_auto +from .nios.nio_unix import NIO_UNIX +from .nios.nio_vde import NIO_VDE +from .nios.nio_tap import NIO_TAP +from .nios.nio_generic_ethernet import NIO_GenericEthernet +from .nios.nio_linux_ethernet import NIO_LinuxEthernet +from .nios.nio_fifo import NIO_FIFO +from .nios.nio_mcast import NIO_Mcast +from .nios.nio_null import NIO_Null + import logging log = logging.getLogger(__name__) @@ -29,21 +80,25 @@ class Dynamips(IModule): def __init__(self, name=None, args=(), kwargs={}): IModule.__init__(self, name=name, args=args, kwargs=kwargs) + + # start the hypervisor manager #self._hypervisor_manager = HypervisorManager("/usr/bin/dynamips", "/tmp") - @IModule.route("dynamips/echo") + @IModule.route("dynamips.echo") def echo(self, request): - print("Echo!") + if request == None: + self.send_param_error() + return log.debug("received request {}".format(request)) self.send_response(request) - @IModule.route("dynamips/create_vm") + @IModule.route("dynamips.create_vm") def create_vm(self, request): print("Create VM!") log.debug("received request {}".format(request)) self.send_response(request) - @IModule.route("dynamips/start_vm") + @IModule.route("dynamips.start_vm") def start_vm(self, request): print("Start VM!") log.debug("received request {}".format(request)) diff --git a/gns3server/stomp/__init__.py b/gns3server/modules/dynamips/adapters/__init__.py similarity index 100% rename from gns3server/stomp/__init__.py rename to gns3server/modules/dynamips/adapters/__init__.py diff --git a/gns3server/modules/dynamips/adapters/adapter.py b/gns3server/modules/dynamips/adapters/adapter.py new file mode 100644 index 00000000..4e10bf99 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/adapter.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +class Adapter(object): + """ + Base class for adapters. + + :param interfaces: number of interfaces supported by this adapter. + :param wics: number of wics supported by this adapter. + """ + + def __init__(self, interfaces=0, wics=0): + + self._interfaces = interfaces + + self._ports = {} + for port_id in range(0, interfaces): + self._ports[port_id] = None + self._wics = wics * [None] + + def removable(self): + """ + Returns True if the adapter can be removed from a slot + and False if not. + + :returns: boolean + """ + + return True + + def port_exists(self, port_id): + """ + Checks if a port exists on this adapter. + + :returns: True is the port exists, + False otherwise. + """ + + if port_id in self._ports: + return True + return False + + def wic_slot_available(self, wic_slot_id): + """ + Checks if a WIC slot is available + + :returns: True is the WIC slot is available, + False otherwise. + """ + + if self._wics[wic_slot_id] == None: + return True + return False + + def install_wic(self, wic_slot_id, wic): + """ + Installs a WIC on this adapter. + + :param wic_slot_id: WIC slot ID (integer) + :param wic: WIC object + """ + + self._wics[wic_slot_id] = wic + + # Dynamips WICs ports start on a multiple of 16 + port number + # WIC1 port 1 = 16, WIC1 port 2 = 17 + # WIC2 port 1 = 32, WIC2 port 2 = 33 + # WIC3 port 1 = 48, WIC3 port 2 = 49 + base = 16 * (wic_slot_id + 1) + for wic_port in range(0, wic.interfaces): + port_id = base + wic_port + self._ports[port_id] = None + + def uninstall_wic(self, wic_slot_id): + """ + Removes a WIC from this adapter. + + :param wic_slot_id: WIC slot ID (integer) + """ + + wic = self._wics[wic_slot_id] + + # Dynamips WICs ports start on a multiple of 16 + port number + # WIC1 port 1 = 16, WIC1 port 2 = 17 + # WIC2 port 1 = 32, WIC2 port 2 = 33 + # WIC3 port 1 = 48, WIC3 port 2 = 49 + base = 16 * (wic_slot_id + 1) + for wic_port in range(0, wic.interfaces): + port_id = base + wic_port + del self._ports[port_id] + self._wics[wic_slot_id] = None + + def add_nio(self, port_id, nio): + """ + Adds a NIO to a port on this adapter. + + :param port_id: port ID (integer) + :param nio: NIO object + """ + + self._ports[port_id] = nio + + def remove_nio(self, port_id): + """ + Removes a NIO from a port on this adapter. + + :param port_id: port ID (integer) + """ + + self._ports[port_id] = None + + @property + def ports(self): + """ + Returns port to NIO mapping + + :returns: dictionary port -> NIO + """ + + return self._ports + + @property + def interfaces(self): + """ + Returns the number of interfaces supported by this adapter. + + :returns: number of interfaces + """ + + return self._interfaces + + @property + def wics(self): + """ + Returns the wics adapters inserted in this adapter. + + :returns: list WIC objects + """ + + return self._wics diff --git a/gns3server/modules/dynamips/adapters/c1700_mb_1fe.py b/gns3server/modules/dynamips/adapters/c1700_mb_1fe.py new file mode 100644 index 00000000..71f992e7 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c1700_mb_1fe.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C1700_MB_1FE(Adapter): + """ + Integrated 1 port FastEthernet adapter for c1700 platform. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1, wics=2) + + def __str__(self): + + return "C1700-MB-1FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c1700_mb_wic1.py b/gns3server/modules/dynamips/adapters/c1700_mb_wic1.py new file mode 100644 index 00000000..7705984c --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c1700_mb_wic1.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C1700_MB_WIC1(Adapter): + """ + Fake module to provide a placeholder for slot 1 interfaces when WICs + are inserted into WIC slot 1. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=0, wics=2) + + def __str__(self): + + return "C1700_MB_WIC1" + + def removable(self): + + return False + + def interface_type(self): + + return "N/A" + + def medium(self): + + return "N/A" diff --git a/gns3server/modules/dynamips/adapters/c2600_mb_1e.py b/gns3server/modules/dynamips/adapters/c2600_mb_1e.py new file mode 100644 index 00000000..2ccb1661 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c2600_mb_1e.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C2600_MB_1E(Adapter): + """ + Integrated 1 port Ethernet adapter for the c2600 platform. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1, wics=3) + + def __str__(self): + + return "C2600-MB-1E" + + def removable(self): + + return False + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c2600_mb_1fe.py b/gns3server/modules/dynamips/adapters/c2600_mb_1fe.py new file mode 100644 index 00000000..a630c194 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c2600_mb_1fe.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C2600_MB_1FE(Adapter): + """ + Integrated 1 port FastEthernet adapter for the c2600 platform. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1, wics=3) + self._interfaces = 1 + + def __str__(self): + + return "C2600-MB-1FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c2600_mb_2e.py b/gns3server/modules/dynamips/adapters/c2600_mb_2e.py new file mode 100644 index 00000000..68ea2db8 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c2600_mb_2e.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C2600_MB_2E(Adapter): + """ + Integrated 2 port Ethernet adapter for the c2600 platform. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=2, wics=3) + + def __str__(self): + + return "C2600-MB-2E" + + def removable(self): + + return False + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c2600_mb_2fe.py b/gns3server/modules/dynamips/adapters/c2600_mb_2fe.py new file mode 100644 index 00000000..3a2d59be --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c2600_mb_2fe.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C2600_MB_2FE(Adapter): + """ + Integrated 2 port FastEthernet adapter for the c2600 platform. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=2, wics=3) + + def __str__(self): + + return "C2600-MB-2FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c7200_io_2fe.py b/gns3server/modules/dynamips/adapters/c7200_io_2fe.py new file mode 100644 index 00000000..0ee8674f --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c7200_io_2fe.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C7200_IO_2FE(Adapter): + """ + C7200-IO-2FE FastEthernet Input/Ouput controller. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=2) + + def __str__(self): + + return "C7200_IO_2FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c7200_io_fe.py b/gns3server/modules/dynamips/adapters/c7200_io_fe.py new file mode 100644 index 00000000..22200ded --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c7200_io_fe.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C7200_IO_FE(Adapter): + """ + C7200-IO-FE FastEthernet Input/Ouput controller. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "C7200_IO_FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/c7200_io_ge_e.py b/gns3server/modules/dynamips/adapters/c7200_io_ge_e.py new file mode 100644 index 00000000..dd732dfa --- /dev/null +++ b/gns3server/modules/dynamips/adapters/c7200_io_ge_e.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class C7200_IO_GE_E(Adapter): + """ + C7200-IO-GE-E GigabitEthernet Input/Ouput controller. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "C7200-IO-GE-E" + + def removable(self): + + return False + + def interface_type(self): + + return "GigabitEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/gt96100_fe.py b/gns3server/modules/dynamips/adapters/gt96100_fe.py new file mode 100644 index 00000000..27217e31 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/gt96100_fe.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class GT96100_FE(Adapter): + + def __init__(self): + Adapter.__init__(self, interfaces=2, wics=3) + + def __str__(self): + + return "GT96100-FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/leopard_2fe.py b/gns3server/modules/dynamips/adapters/leopard_2fe.py new file mode 100644 index 00000000..c25744eb --- /dev/null +++ b/gns3server/modules/dynamips/adapters/leopard_2fe.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class Leopard_2FE(Adapter): + """ + Integrated 2 port FastEthernet adapter for c3660 router. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=2) + self._interfaces = 2 + + def __str__(self): + + return "Leopard-2FE" + + def removable(self): + + return False + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/nm_16esw.py b/gns3server/modules/dynamips/adapters/nm_16esw.py new file mode 100644 index 00000000..ea7bccce --- /dev/null +++ b/gns3server/modules/dynamips/adapters/nm_16esw.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class NM_16ESW(Adapter): + """ + NM-16ESW FastEthernet network module. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=16) + + def __str__(self): + + return "NM-16ESW" + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/nm_1e.py b/gns3server/modules/dynamips/adapters/nm_1e.py new file mode 100644 index 00000000..7663f934 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/nm_1e.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class NM_1E(Adapter): + """ + NM-1E Ethernet network module. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "NM-1E" + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/nm_1fe_tx.py b/gns3server/modules/dynamips/adapters/nm_1fe_tx.py new file mode 100644 index 00000000..02f19248 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/nm_1fe_tx.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class NM_1FE_TX(Adapter): + """ + NM-1FE-TX FastEthernet network module. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "NM-1FE-TX" + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/nm_4e.py b/gns3server/modules/dynamips/adapters/nm_4e.py new file mode 100644 index 00000000..32219522 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/nm_4e.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class NM_4E(Adapter): + """ + NM-4E Ethernet network module. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=4) + + def __str__(self): + + return "NM-4E" + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/nm_4t.py b/gns3server/modules/dynamips/adapters/nm_4t.py new file mode 100644 index 00000000..1021dc51 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/nm_4t.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class NM_4T(Adapter): + """ + NM-4T Serial network module. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=4) + + def __str__(self): + + return "NM-4T" + + def interface_type(self): + + return "Serial" + + def medium(self): + + return "Serial" diff --git a/gns3server/modules/dynamips/adapters/pa_2fe_tx.py b/gns3server/modules/dynamips/adapters/pa_2fe_tx.py new file mode 100644 index 00000000..2706f51d --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_2fe_tx.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_2FE_TX(Adapter): + """ + PA-2FE-TX FastEthernet port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=2) + + def __str__(self): + + return "PA-2FE-TX" + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/pa_4e.py b/gns3server/modules/dynamips/adapters/pa_4e.py new file mode 100644 index 00000000..44f5437d --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_4e.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_4E(Adapter): + """ + PA-4E Ethernet port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=4) + + def __str__(self): + + return "PA-4E" + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/pa_4t.py b/gns3server/modules/dynamips/adapters/pa_4t.py new file mode 100644 index 00000000..592eb688 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_4t.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_4T(Adapter): + """ + PA-4T+ Serial port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=4) + + def __str__(self): + + return "PA-4T+" + + def interface_type(self): + + return "Serial" + + def medium(self): + + return "Serial" diff --git a/gns3server/modules/dynamips/adapters/pa_8e.py b/gns3server/modules/dynamips/adapters/pa_8e.py new file mode 100644 index 00000000..4e5b5a7f --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_8e.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_8E(Adapter): + """ + PA-8E Ethernet port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=8) + + def __str__(self): + + return "PA-8E" + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/pa_8t.py b/gns3server/modules/dynamips/adapters/pa_8t.py new file mode 100644 index 00000000..c4851154 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_8t.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_8T(Adapter): + """ + PA-8T Serial port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=8) + + def __str__(self): + + return "PA-8T" + + def interface_type(self): + + return "Serial" + + def medium(self): + + return "Serial" diff --git a/gns3server/modules/dynamips/adapters/pa_a1.py b/gns3server/modules/dynamips/adapters/pa_a1.py new file mode 100644 index 00000000..72cb455e --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_a1.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_A1(Adapter): + """ + PA-A1 ATM port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "PA-A1" + + def interface_type(self): + + return "ATM" + + def medium(self): + + return "Serial" diff --git a/gns3server/modules/dynamips/adapters/pa_fe_tx.py b/gns3server/modules/dynamips/adapters/pa_fe_tx.py new file mode 100644 index 00000000..7a22e2af --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_fe_tx.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_FE_TX(Adapter): + """ + PA-FE-TX FastEthernet port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "PA-FE-TX" + + def interface_type(self): + + return "FastEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/pa_ge.py b/gns3server/modules/dynamips/adapters/pa_ge.py new file mode 100644 index 00000000..20d5994b --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_ge.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_GE(Adapter): + """ + PA-GE GigabitEthernet port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "PA-GE" + + def interface_type(self): + + return "GigabitEthernet" + + def medium(self): + + return "Ethernet" diff --git a/gns3server/modules/dynamips/adapters/pa_pos_oc3.py b/gns3server/modules/dynamips/adapters/pa_pos_oc3.py new file mode 100644 index 00000000..064f63cf --- /dev/null +++ b/gns3server/modules/dynamips/adapters/pa_pos_oc3.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from .adapter import Adapter + + +class PA_POS_OC3(Adapter): + """ + PA-POS-OC3 port adapter. + """ + + def __init__(self): + Adapter.__init__(self, interfaces=1) + + def __str__(self): + + return "PA-POS-OC3" + + def interface_type(self): + + return "POS" + + def medium(self): + + return "SONET" diff --git a/gns3server/modules/dynamips/adapters/wic_1enet.py b/gns3server/modules/dynamips/adapters/wic_1enet.py new file mode 100644 index 00000000..790cf618 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/wic_1enet.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +class WIC_1ENET(object): + """ + WIC-1ENET Ethernet + """ + + def __init__(self): + + self._interfaces = 2 + + def __str__(self): + + return "WIC-1ENET" + + def interface_type(self): + + return "Ethernet" + + def medium(self): + + return "Ethernet" + + @property + def interfaces(self): + """ + Returns the number of interfaces supported by this WIC. + + :returns: number of interfaces + """ + + return self._interfaces diff --git a/gns3server/modules/dynamips/adapters/wic_1t.py b/gns3server/modules/dynamips/adapters/wic_1t.py new file mode 100644 index 00000000..c6f30c26 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/wic_1t.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +class WIC_1T(object): + """ + WIC-1T Serial + """ + + def __init__(self): + + self._interfaces = 1 + + def __str__(self): + + return "WIC-1T" + + def interface_type(self): + + return "Serial" + + def medium(self): + + return "Serial" + + @property + def interfaces(self): + """ + Returns the number of interfaces supported by this WIC. + + :returns: number of interfaces + """ + + return self._interfaces diff --git a/gns3server/modules/dynamips/adapters/wic_2t.py b/gns3server/modules/dynamips/adapters/wic_2t.py new file mode 100644 index 00000000..8e73cb35 --- /dev/null +++ b/gns3server/modules/dynamips/adapters/wic_2t.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +class WIC_2T(object): + """ + WIC-2T Serial + """ + + def __init__(self): + + self._interfaces = 2 + + def __str__(self): + + return "WIC-2T" + + def interface_type(self): + + return "Serial" + + def medium(self): + + return "Serial" + + @property + def interfaces(self): + """ + Returns the number of interfaces supported by this WIC. + + :returns: number of interfaces + """ + + return self._interfaces diff --git a/gns3server/stomp/utils.py b/gns3server/modules/dynamips/dynamips_error.py similarity index 55% rename from gns3server/stomp/utils.py rename to gns3server/modules/dynamips/dynamips_error.py index 8dd1b7e4..285e4a7b 100644 --- a/gns3server/stomp/utils.py +++ b/gns3server/modules/dynamips/dynamips_error.py @@ -16,28 +16,18 @@ # along with this program. If not, see . """ -Utilitary functions for STOMP implementation +Custom exceptions for Dynamips module. """ -import sys -PY2 = sys.version_info[0] == 2 +class DynamipsError(Exception): -if not PY2: - def encode(char_data): - if type(char_data) is str: - return char_data.encode() - elif type(char_data) is bytes: - return char_data - else: - raise TypeError('message should be a string or bytes') -else: - def encode(char_data): - if type(char_data) is unicode: - return char_data.encode('utf-8') - else: - return char_data + def __init__(self, message, original_exception=None): + Exception.__init__(self, message) + self._message = message + self._original_exception = original_exception -def hasbyte(byte, byte_data): - return bytes([byte]) in byte_data + def __repr__(self): + + return self._message diff --git a/gns3server/modules/dynamips/dynamips_hypervisor.py b/gns3server/modules/dynamips/dynamips_hypervisor.py new file mode 100644 index 00000000..0bedc7b7 --- /dev/null +++ b/gns3server/modules/dynamips/dynamips_hypervisor.py @@ -0,0 +1,419 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips hypervisor management module ("hypervisor") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L46 +""" + +import socket +import re +import logging +from .dynamips_error import DynamipsError + +log = logging.getLogger(__name__) + + +class DynamipsHypervisor(object): + """ + Creates a new connection to a Dynamips server (also called hypervisor) + + :param host: the hostname or ip address string of the Dynamips server + :param port: the tcp port integer (defaults to 7200) + :param timeout: timeout integer for how long to wait for a response to commands sent to the + hypervisor (defaults to 30 seconds) + """ + + # Used to parse Dynamips response codes + error_re = re.compile(r"""^2[0-9]{2}-""") + success_re = re.compile(r"""^1[0-9]{2}\s{1}""") + + def __init__(self, host, port=7200, timeout=30.0): + + self._host = host + self._port = port + + self._devices = [] + self._ghosts = {} + self._jitsharing_groups = {} + self._working_dir = "" + self._baseconsole = 2000 + self._baseaux = 2100 + self._baseudp = 10000 + self._version = "N/A" + self._timeout = 30 + self._socket = None + self._uuid = None + + def connect(self): + """ + Connects to the hypervisor. + """ + + try: + self._socket = socket.create_connection((self._host, + self._port), + self._timeout) + except socket.error as e: + raise DynamipsError("Could not connect to server: {}".format(e)) + + try: + self._version = self.send("hypervisor version")[0][4:] + except IndexError: + self._version = "Unknown" + + self._uuid = self.send("hypervisor uuid") + + @property + def version(self): + """ + Returns Dynamips version. + + :returns: version string + """ + + return self._version + + def module_list(self): + """ + Returns the modules supported by this hypervisor. + + :returns: module list + """ + + return self.send("hypervisor module_list") + + def cmd_list(self, module): + """ + Returns commands recognized by the specified module. + + :param module: the module name + :returns: command list + """ + + return self.send("hypervisor cmd_list {}".format(module)) + + def close(self): + """ + Closes the connection to this hypervisor (but leave it running). + """ + + self.send("hypervisor close") + self._socket.close() + self._socket = None + + def stop(self): + """ + Stops this hypervisor (will no longer run). + """ + + self.send("hypervisor stop") + self._socket.close() + self._socket = None + + def reset(self): + """ + Resets this hypervisor (used to get an empty configuration). + """ + + self.send('hypervisor reset') + + @property + def working_dir(self): + """ + Returns current working directory + + :returns: path to the working directory + """ + + return self._working_dir + + @working_dir.setter + def working_dir(self, working_dir): + """ + Set the working directory for this hypervisor. + + :param working_dir: path to the working directory + """ + + # encase working_dir in quotes to protect spaces in the path + self.send("hypervisor working_dir {}".format('"' + working_dir + '"')) + self._working_dir = working_dir + + def save_config(self, filename): + """ + Saves the configuration of all Dynamips objects into the specified file. + + :param filename: path string + """ + + # encase working_dir in quotes to protect spaces in the path + self.send("hypervisor save_config {}".format('"' + filename + '"')) + + @property + def uuid(self): + """ + Returns this hypervisor UUID. + + :Returns: uuid string + """ + + return self._uuid + + @property + def socket(self): + """ + Returns the current socket used to communicate with this hypervisor. + + :returns: socket object + """ + + assert self._socket + return self._socket + + @property + def devices(self): + """ + Returns the list of devices managed by this hypervisor instance. + + :returns: a list of device objects + """ + + return self._devices + + @devices.setter + def devices(self, devices): + """ + Set the list of devices managed by this hypervisor instance. + This method is for internal use. + + :param devices: a list of device objects + """ + + self._devices = devices + + @property + def baseconsole(self): + """ + Returns base console TCP port for this hypervisor. + + :returns: base console value (integer) + """ + + return self._baseconsole + + @baseconsole.setter + def baseconsole(self, baseconsole): + """ + Set the base console TCP port for this hypervisor. + + :param baseconsole: base console value (integer) + """ + + self._baseconsole = baseconsole + + @property + def baseaux(self): + """ + Returns base auxiliary port for this hypervisor. + + :returns: base auxiliary port value (integer) + """ + + return self._baseaux + + @baseaux.setter + def baseaux(self, baseaux): + """ + Set the base auxiliary TCP port for this hypervisor. + + :param baseaux: base auxiliary port value (integer) + """ + + self._baseaux = baseaux + + @property + def baseudp(self): + """ + Returns the next available UDP port for UDP NIOs. + + :returns: base UDP port value (integer) + """ + + return self._baseudp + + @baseudp.setter + def baseudp(self, baseudp): + """ + Set the next open UDP port for NIOs for this hypervisor. + + :param baseudp: base UDP port value (integer) + """ + + self._baseudp = baseudp + + @property + def ghosts(self): + """ + Returns a list of the ghosts hosted by this hypervisor. + + :returns: Ghosts dict (image_name -> device) + """ + + return self._ghosts + + def add_ghost(self, image_name, router): + """ + Adds a ghost name to the list of ghosts created on this hypervisor. + + :param image_name: name of the ghost image + :param router: router object + """ + + self._ghosts[image_name] = router + + @property + def jitsharing_groups(self): + """ + Returns a list of the JIT sharing groups hosted by this hypervisor. + + :returns: JIT sharing groups dict (image_name -> group number) + """ + + return self._ghosts + + def add_jitsharing_group(self, image_name, group_number): + """ + Adds a JIT blocks sharing group name to the list of groups created on this hypervisor. + + :param image_name: name of the ghost image + :param group_number: group (integer) + """ + + self._jitsharing_groups[image_name] = group_number + + @property + def host(self): + """ + Returns this hypervisor host. + + :returns: host (string) + """ + + return self._host + + @property + def port(self): + """ + Returns this hypervisor port. + + :returns: port (integer) + """ + + return self._port + + def send_raw(self, string): + """ + Sends a raw command to this hypervisor. Use sparingly. + + :param string: command string. + + :returns: command result (string) + """ + + result = self.send(string) + return result + + def send(self, command): + """ + Sends commands to this hypervisor. + + :param command: a Dynamips hypervisor command + + :returns: results as a list + """ + + # Dynamips responses are of the form: + # 1xx yyyyyy\r\n + # 1xx yyyyyy\r\n + # ... + # 100-yyyy\r\n + # or + # 2xx-yyyy\r\n + # + # Where 1xx is a code from 100-199 for a success or 200-299 for an error + # The result might be multiple lines and might be less than the buffer size + # but still have more data. The only thing we know for sure is the last line + # will begin with '100-' or a '2xx-' and end with '\r\n' + + if not self._socket: + raise DynamipsError("Not connected") + + try: + command = command.strip() + '\n' + log.debug("sending {}".format(command)) + self.socket.sendall(command.encode('utf-8')) + except socket.error as e: + raise DynamipsError("Lost communication with {host}:{port} :{error}" + .format(host=self._host, port=self._port, error=e)) + + # Now retrieve the result + data = [] + buf = '' + while True: + try: + chunk = self.socket.recv(1024) # match to Dynamips' buffer size + buf += chunk.decode("utf-8") + except socket.error as e: + raise DynamipsError("Communication timed out with {host}:{port} :{error}" + .format(host=self._host, port=self._port, error=e)) + + # If the buffer doesn't end in '\n' then we can't be done + try: + if buf[-1] != '\n': + continue + except IndexError: + raise DynamipsError("Could not communicate with {host}:{port}" + .format(host=self._host, port=self._port)) + + data += buf.split('\r\n') + if data[-1] == '': + data.pop() + buf = '' + + if len(data) == 0: + raise DynamipsError("no data returned from {host}:{port}" + .format(host=self._host, port=self._port)) + + # Does it contain an error code? + if self.error_re.search(data[-1]): + raise DynamipsError(data[-1][4:]) + + # Or does the last line begin with '100-'? Then we are done! + if data[-1][:4] == '100-': + data[-1] = data[-1][4:] + if data[-1] == 'OK': + data.pop() + break + + # Remove success responses codes + for index in range(len(data)): + if self.success_re.search(data[index]): + data[index] = data[index][4:] + + log.debug("returned result {}".format(data)) + return data diff --git a/gns3server/modules/dynamips/hypervisor.py b/gns3server/modules/dynamips/hypervisor.py new file mode 100644 index 00000000..3a8933f3 --- /dev/null +++ b/gns3server/modules/dynamips/hypervisor.py @@ -0,0 +1,270 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Represents a Dynamips hypervisor and starts/stops the associated Dynamips process. +""" + +import os +import subprocess +import logging + +from .dynamips_hypervisor import DynamipsHypervisor + +logger = logging.getLogger(__name__) + + +class Hypervisor(DynamipsHypervisor): + """ + Hypervisor. + + :param path: path to Dynamips executable + :param workingdir: working directory + :param port: port for this hypervisor + :param host: host/address for this hypervisor + """ + + _instance_count = 0 + + def __init__(self, path, workingdir, host, port): + + DynamipsHypervisor.__init__(self, host, port) + + # create an unique ID + self._id = Hypervisor._instance_count + Hypervisor._instance_count += 1 + + self._path = path + self._workingdir = workingdir + self._command = [] + self._process = None + self._stdout = None + + # settings used the load-balance hypervisors + # (for the hypervisor manager) + self._memory_load = 0 + self._ios_image_ref = "" + + @property + def id(self): + """ + Returns the unique ID for this hypervisor. + + :returns: id (integer) + """ + + return(self._id) + + @property + def path(self): + """ + Returns the path to the Dynamips executable. + + :returns: path to Dynamips + """ + + return(self._path) + + @path.setter + def path(self, path): + """ + Set the path to the Dynamips executable. + + :param path: path to Dynamips + """ + + self._path = path + + @property + def port(self): + """ + Returns the port used to start the Dynamips hypervisor. + + :returns: port number (integer) + """ + + return(self._port) + + @port.setter + def port(self, port): + """ + Set the port used to start the Dynamips hypervisor. + + :param port: port number (integer) + """ + + self._port = port + + @property + def host(self): + """ + Returns the host (binding) used to start the Dynamips hypervisor. + + :returns: host/address (string) + """ + + return(self._host) + + @host.setter + def host(self, host): + """ + Set the host (binding) used to start the Dynamips hypervisor. + + :param host: host/address (string) + """ + + self._host = host + + @property + def workingdir(self): + """ + Returns the working directory used to start the Dynamips hypervisor. + + :returns: path to a working directory + """ + + return(self._workingdir) + + @workingdir.setter + def workingdir(self, workingdir): + """ + Set the working directory used to start the Dynamips hypervisor. + + :param workingdir: path to a working directory + """ + + self._workingdir = workingdir + + @property + def image_ref(self): + """ + Returns the reference IOS image name + (used by the hypervisor manager for load-balancing purposes). + + :returns: image reference name + """ + + return self._ios_image_ref + + @image_ref.setter + def image_ref(self, ios_image_name): + """ + Set the reference IOS image name + (used by the hypervisor manager for load-balancing purposes). + + :param ios_image_name: image reference name + """ + + self._ios_image_ref = ios_image_name + + def increase_memory_load(self, memory): + """ + Increases the memory load of this hypervisor. + (used by the hypervisor manager for load-balancing purposes). + + :param memory: amount of RAM (integer) + """ + + self._memory_load += memory + + def decrease_memory_load(self, memory): + """ + Decreases the memory load of this hypervisor. + (used by the hypervisor manager for load-balancing purposes). + + :param memory: amount of RAM (integer) + """ + + self._memory_load -= memory + + @property + def memory_load(self): + """ + Returns the memory load of this hypervisor. + (used by the hypervisor manager for load-balancing purposes). + + :returns: amount of RAM (integer) + """ + + return self._memory_load + + def start(self): + """ + Starts the Dynamips hypervisor process. + """ + + self._command = self._build_command() + try: + logger.info("Starting Dynamips: {}".format(self._command)) + # TODO: create unique filename for stdout + self.stdout_file = os.path.join(self._workingdir, "dynamips.log") + fd = open(self.stdout_file, "w") + # TODO: check for exceptions and if process has already been started + self._process = subprocess.Popen(self._command, + stdout=fd, + stderr=subprocess.STDOUT, + cwd=self._workingdir) + logger.info("Dynamips started PID={}".format(self._process.pid)) + except OSError as e: + logger.error("Could not start Dynamips: {}".format(e)) + finally: + fd.close() + + def stop(self): + """ + Stops the Dynamips hypervisor process. + """ + + if self.is_running(): + logger.info("Stopping Dynamips PID={}".format(self._process.pid)) + self._process.kill() + + def read_stdout(self): + """ + Reads the standard output of the Dynamips process. + Only use when the process has been stopped or has crashed. + """ + + # TODO: check for exceptions + with open(self.stdout_file) as file: + output = file.read() + return output + + def is_running(self): + """ + Checks if the process is running + + :returns: True or False + """ + + if self._process and self._process.poll() == None: + return True + return False + + def _build_command(self): + """ + Command to start the Dynamips hypervisor process. + (to be passed to subprocess.Popen()) + """ + + command = [self._path] + command.extend(["-N1"]) # use instance IDs for filenames + if self._host != '0.0.0.0': + command.extend(['-H', self._host + ':' + str(self._port)]) + else: + command.extend(['-H', self._port]) + return command diff --git a/gns3server/modules/dynamips/hypervisor_manager.py b/gns3server/modules/dynamips/hypervisor_manager.py new file mode 100644 index 00000000..d759cd1b --- /dev/null +++ b/gns3server/modules/dynamips/hypervisor_manager.py @@ -0,0 +1,235 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Manages Dynamips hypervisors (load-balancing etc.) +""" + +from __future__ import unicode_literals +from .hypervisor import Hypervisor +import socket +import time +import logging + +log = logging.getLogger(__name__) + + +class HypervisorManager(object): + """ + Manages Dynamips hypervisors. + + :param path: path to the Dynamips executable + :param workingdir: path to a working directory + :param host: host/address for hypervisors to listen to + :param base_port: base TCP port for hypervisors + :param base_console: base TCP port for consoles + :param base_aux: base TCP port for auxiliary consoles + :param base_udp: base UDP port for UDP tunnels + """ + + def __init__(self, + path, + workingdir, + host='127.0.0.1', + base_port=7200, + base_console=2000, + base_aux=3000, + base_udp=10000): + + self._hypervisors = [] + self._path = path + self._workingdir = workingdir + self._base_port = base_port + self._current_port = self._base_port + self._base_console = base_console + self._base_aux = base_aux + self._base_udp = base_udp + self._host = host + self._clean_workingdir = False + self._ghost_ios = True + self._mmap = True + self._jit_sharing = False + self._sparsemem = True + self._memory_usage_limit_per_hypervisor = 1024 + self._group_ios_per_hypervisor = True + + def __del__(self): + """ + Shutdowns all started hypervisors + """ + + self.stop_all_hypervisors() + + @property + def hypervisors(self): + """ + Returns all hypervisor instances. + + :returns: list of hypervisor objects + """ + + return self._hypervisors + + @property + def memory_usage_limit_per_hypervisor(self): + """ + Returns the memory usage limit per hypervisor + + :returns: limit value (integer) + """ + + return self._memory_usage_limit_per_hypervisor + + @memory_usage_limit_per_hypervisor.setter + def memory_usage_limit_per_hypervisor(self, memory_limit): + """ + Set the memory usage limit per hypervisor + + :param memory_limit: memory limit value (integer) + """ + + self._memory_usage_limit_per_hypervisor = memory_limit + + @property + def group_ios_per_hypervisor(self): + """ + Returns if router are grouped per hypervisor + based on their IOS image. + + :returns: True or False + """ + + return self._group_ios_per_hypervisor + + @group_ios_per_hypervisor.setter + def group_ios_per_hypervisor(self, value): + """ + Set if router are grouped per hypervisor + based on their IOS image. + + :param value: True or False + """ + + self._group_ios_per_hypervisor = value + + def wait_for_hypervisor(self, host, port, timeout=10): + """ + Waits for an hypervisor to be started (accepting a socket connection) + + :param host: host/address to connect to the hypervisor + :param port: port to connect to the hypervisor + :param timeout: timeout value (default is 10 seconds) + """ + + # try to connect 5 times + for _ in range(0, 5): + try: + s = socket.create_connection((host, port), timeout) + except socket.error as e: + time.sleep(0.5) + last_exception = e + continue + connection_success = True + break + + if connection_success: + s.close() + #time.sleep(0.1) + else: + log.critical("Couldn't connect to hypervisor on {}:{} :{}".format(host, port, + last_exception)) + + def start_new_hypervisor(self): + """ + Creates a new Dynamips process and start it. + + :returns: the new hypervisor object + """ + + hypervisor = Hypervisor(self._path, + self._workingdir, + self._host, + self._current_port) + + log.info("creating new hypervisor {}:{}".format(hypervisor.host, hypervisor.port)) + hypervisor.start() + + self.wait_for_hypervisor(self._host, self._current_port) + log.info("hypervisor {}:{} has successfully started".format(hypervisor.host, hypervisor.port)) + + hypervisor.connect() + self._hypervisors.append(hypervisor) + self._current_port += 1 + return hypervisor + + def allocate_hypervisor_for_router(self, router_ios_image, router_ram): + """ + Allocates a Dynamips hypervisor for a specific router + (new or existing depending on the RAM amount and IOS image) + + :param router_ios_image: IOS image name + :param router_ram: amount of RAM (integer) + + :returns: the allocated hypervisor object + """ + + for hypervisor in self._hypervisors: + if self._group_ios_per_hypervisor and hypervisor.image_ref != router_ios_image: + continue + if (hypervisor.memory_load + router_ram) <= self._memory_usage_limit_per_hypervisor: + current_memory_load = hypervisor.memory_load + hypervisor.increase_memory_load(router_ram) + log.info("allocating existing hypervisor {}:{}, RAM={}+{}".format(hypervisor.host, + hypervisor.port, + current_memory_load, + router_ram)) + return hypervisor + + hypervisor = self.start_new_hypervisor() + hypervisor.image_ref = router_ios_image + hypervisor.increase_memory_load(router_ram) + return hypervisor + + def unallocate_hypervisor_for_router(self, router): + """ + Unallocates a Dynamips hypervisor for a specific router. + + :param router: router object + """ + + hypervisor = router.hypervisor + hypervisor.decrease_memory_load(router.ram) + + if hypervisor.memory_load < 0: + log.warn("hypervisor {}:{} has a memory load below 0 ({})".format(hypervisor.host, + hypervisor.port, + hypervisor.memory_load)) + hypervisor.memory_load = 0 + + # memory load at 0MB and no devices managed anymore... + # let's stop this hypervisor + if hypervisor.memory_load == 0 and not hypervisor.devices: + hypervisor.stop() + self._hypervisors.remove(hypervisor) + + def stop_all_hypervisors(self): + """ + Stops all hypervisors. + """ + + for hypervisor in self._hypervisors: + hypervisor.stop() diff --git a/gns3server/modules/dynamips/nios/__init__.py b/gns3server/modules/dynamips/nios/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gns3server/modules/dynamips/nios/nio.py b/gns3server/modules/dynamips/nios/nio.py new file mode 100644 index 00000000..41346ce5 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio.py @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Base interface for Dynamips Network Input/Output (NIO) module ("nio"). +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L451 +""" + +from ..dynamips_error import DynamipsError + + +class NIO(object): + """ + Base NIO class + + :param hypervisor: Dynamips hypervisor object + """ + + def __init__(self, hypervisor): + + self._hypervisor = hypervisor + self._bandwidth = None # no bandwidth constraint by default + self._input_filter = None # no input filter applied by default + self._output_filter = None # no output filter applied by default + self._input_filter_options = None # no input filter options by default + self._output_filter_options = None # no output filter options by default + self._dynamips_direction = {"in": 0, "out": 1, "both": 2} + + def list(self): + """ + Returns all NIOs. + + :returns: NIO list + """ + + return self._hypervisor.send("nio list") + + def delete(self): + """ + Deletes this NIO. + """ + + self._hypervisor.send("nio delete {}".format(self._name)) + + def rename(self, new_name): + """ + Renames this NIO + + :param new_name: new NIO name + """ + + self._hypervisor.send("nio rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def debug(self, debug): + """ + Enables/Disables debugging for this NIO. + + :param debug: debug value (0 = disable, enable = 1) + """ + + self._hypervisor.send("nio set_debug {name} {debug}".format(name=self._name, + debug=debug)) + + def bind_filter(self, direction, filter_name): + """ + Adds a packet filter to this NIO. + Filter "freq_drop" drops packets. + Filter "capture" captures packets. + + :param direction: "in", "out" or "both" + :param filter_name: name of the filter to apply + """ + + if direction not in self._dynamips_direction: + raise DynamipsError("Unknown direction {} to bind filter {}:".format(direction, filter_name)) + dynamips_direction = self._dynamips_direction[direction] + + self._hypervisor.send("nio bind_filter {name} {direction} {filter}".format(name=self._name, + direction=dynamips_direction, + filter=filter_name)) + + if direction == "in": + self._input_filter = filter_name + elif direction == "out": + self._output_filter = filter_name + elif direction == "both": + self._input_filter = filter_name + self._output_filter = filter_name + + def unbind_filter(self, direction): + """ + Removes packet filter for this NIO. + + :param direction: "in", "out" or "both" + """ + + if direction not in self._dynamips_direction: + raise DynamipsError("Unknown direction {} to unbind filter:".format(direction)) + dynamips_direction = self._dynamips_direction[direction] + + self._hypervisor.send("nio unbind_filter {name} {direction}".format(name=self._name, + direction=dynamips_direction)) + + if direction == "in": + self._input_filter = None + elif direction == "out": + self._output_filter = None + elif direction == "both": + self._input_filter = None + self._output_filter = None + + def setup_filter(self, direction, options): + """ + Setups a packet filter binded with this NIO. + + Filter "freq_drop" has 1 argument "". It will drop + everything with a -1 frequency, drop every Nth packet with a + positive frequency, or drop nothing. + + Filter "capture" has 2 arguments " ". + It will capture packets to the target output file. The link type + name is a case-insensitive DLT_ name from the PCAP library + constants with the DLT_ part removed.See http://www.tcpdump.org/linktypes.html + for a list of all available DLT values. + + :param direction: "in", "out" or "both" + :param options: options for the packet filter (string) + """ + + if direction not in self._dynamips_direction: + raise DynamipsError("Unknown direction {} to setup filter:".format(direction)) + dynamips_direction = self._dynamips_direction[direction] + + self._hypervisor.send("nio setup_filter {name} {direction} {options}".format(name=self._name, + direction=dynamips_direction, + options=options)) + + if direction == "in": + self._input_filter_options = options + elif direction == "out": + self._output_filter_options = options + elif direction == "both": + self._input_filter_options = options + self._output_filter_options = options + + @property + def input_filter(self): + """ + Returns the input packet filter for this NIO. + + :returns: tuple (filter name, filter options) + """ + + return (self._input_filter, self._input_filter_options) + + @property + def output_filter(self): + """ + Returns the output packet filter for this NIO. + + :returns: tuple (filter name, filter options) + """ + + return (self._output_filter, self._output_filter_options) + + def get_stats(self): + """ + Gets statistics for this NIO. + + :returns: NIO statistics (string with packets in, packets out, bytes in, bytes out) + """ + + return self._hypervisor.send("nio get_stats {}".format(self._name))[0] + + def reset_stats(self): + """ + Resets statistics for this NIO. + """ + + self._hypervisor.send("nio reset_stats {}".format(self._name)) + + def set_bandwidth(self, bandwidth): + """ + Set bandwidth constraint. + + :param bandwidth: bandwidth integer value (in Kb/s) + """ + + self._hypervisor.send("nio set_bandwidth {name} {bandwidth}".format(name=self._name, + bandwidth=bandwidth)) + self._bandwidth = bandwidth + + @property + def bandwidth(self): + """ + Returns the bandwidth constraint for this NIO. + + :returns: bandwidth integer value (in Kb/s) + """ + + return self._bandwidth + + def __str__(self): + """ + NIO string representation. + + :returns: NIO name + """ + + return self._name + + @property + def name(self): + """ + Returns the NIO name. + + :returns: NIO name + """ + + return self._name diff --git a/gns3server/modules/dynamips/nios/nio_fifo.py b/gns3server/modules/dynamips/nios/nio_fifo.py new file mode 100644 index 00000000..e4153f53 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_fifo.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for FIFO NIOs. +""" + +from .nio import NIO + + +class NIO_FIFO(NIO): + """ + Dynamips FIFO NIO. + + :param hypervisor: Dynamips hypervisor object + """ + + _instance_count = 0 + + def __init__(self, hypervisor): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_FIFO._instance_count + NIO_FIFO._instance_count += 1 + self._name = 'nio_fifo' + str(self._id) + + self._hypervisor.send("nio create_fifo {}".format(self._name)) + + def crossconnect(self, nio): + """ + Establishes a cross-connect between this FIFO NIO and another one. + + :param nio: FIFO NIO object. + """ + + self._hypervisor.send("nio crossconnect_fifo {name} {nio}".format(name=self._name, + nio=nio)) diff --git a/gns3server/modules/dynamips/nios/nio_generic_ethernet.py b/gns3server/modules/dynamips/nios/nio_generic_ethernet.py new file mode 100644 index 00000000..48a2c9c5 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_generic_ethernet.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for generic Ethernet NIOs (PCAP library). +""" + +from .nio import NIO + + +class NIO_GenericEthernet(NIO): + """ + Dynamips generic Ethernet NIO. + + :param hypervisor: Dynamips hypervisor object + :param ethernet_device: Ethernet device name (e.g. eth0) + """ + + _instance_count = 0 + + def __init__(self, hypervisor, ethernet_device): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_GenericEthernet._instance_count + NIO_GenericEthernet._instance_count += 1 + self._name = 'nio_gen_eth' + str(self._id) + self._ethernet_device = ethernet_device + + self._hypervisor.send("nio create_gen_eth {name} {eth_device}".format(name=self._name, + eth_device=ethernet_device)) + + @property + def ethernet_device(self): + """ + Returns the Ethernet device used by this NIO. + + :returns: the Ethernet device name + """ + + return self._ethernet_device diff --git a/gns3server/modules/dynamips/nios/nio_linux_ethernet.py b/gns3server/modules/dynamips/nios/nio_linux_ethernet.py new file mode 100644 index 00000000..afee21b9 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_linux_ethernet.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Linux Ethernet NIOs (Linux only). +""" + +from .nio import NIO + + +class NIO_LinuxEthernet(NIO): + """ + Dynamips Linux Ethernet NIO. + + :param hypervisor: Dynamips hypervisor object + :param ethernet_device: Ethernet device name (e.g. eth0) + """ + + _instance_count = 0 + + def __init__(self, hypervisor, ethernet_device): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_LinuxEthernet._instance_count + NIO_LinuxEthernet._instance_count += 1 + self._name = 'nio_linux_eth' + str(self._id) + self._ethernet_device = ethernet_device + + self._hypervisor.send("nio create_linux_eth {name} {eth_device}".format(name=self._name, + eth_device=ethernet_device)) + + @property + def ethernet_device(self): + """ + Returns the Ethernet device used by this NIO. + + :returns: the Ethernet device name + """ + + return self._ethernet_device diff --git a/gns3server/modules/dynamips/nios/nio_mcast.py b/gns3server/modules/dynamips/nios/nio_mcast.py new file mode 100644 index 00000000..6b80fd65 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_mcast.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for multicast NIOs. +""" + +from .nio import NIO + + +class NIO_Mcast(NIO): + """ + Dynamips Linux Ethernet NIO. + + :param hypervisor: Dynamips hypervisor object + :param group: multicast group to bind + :param port: port for binding + """ + + _instance_count = 0 + + def __init__(self, hypervisor, group, port): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_Mcast._instance_count + NIO_Mcast._instance_count += 1 + self._name = 'nio_mcast' + str(self._id) + self._group = group + self._port = port + self._ttl = 1 # default TTL + + self._hypervisor.send("nio create_mcast {name} {mgroup} {mport}".format(name=self._name, + mgroup=group, + mport=port)) + + @property + def group(self): + """ + Returns the multicast group + + :returns: multicast group address + """ + + return self._group + + @property + def port(self): + """ + Returns the port + + :returns: port number + """ + + return self._port + + @property + def ttl(self): + """ + Returns the TTL associated with the multicast address. + + :returns: TTL value + """ + + return self._ttl + + @ttl.setter + def ttl(self, ttl): + """ + Set the TTL for the multicast address + + :param ttl: TTL value + """ + + self._hypervisor.send("nio set_mcast_ttl {name} {ttl}".format(name=self._name, + ttl=ttl)) + self._ttl = ttl diff --git a/gns3server/modules/dynamips/nios/nio_null.py b/gns3server/modules/dynamips/nios/nio_null.py new file mode 100644 index 00000000..7795e2c4 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_null.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for dummy NIOs (mostly for tests). +""" + +from .nio import NIO + + +class NIO_Null(NIO): + """ + Dynamips NULL NIO. + + :param hypervisor: Dynamips hypervisor object + """ + + _instance_count = 0 + + def __init__(self, hypervisor): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_Null._instance_count + NIO_Null._instance_count += 1 + self._name = 'nio_null' + str(self._id) + + self._hypervisor.send("nio create_null {}".format(self._name)) diff --git a/gns3server/modules/dynamips/nios/nio_tap.py b/gns3server/modules/dynamips/nios/nio_tap.py new file mode 100644 index 00000000..28ce710d --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_tap.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for TAP NIOs (UNIX based OSes only). +""" + +from .nio import NIO + + +class NIO_TAP(NIO): + """ + Dynamips TAP NIO. + + :param hypervisor: Dynamips hypervisor object + :param tap_device: TAP device name (e.g. tap0) + """ + + _instance_count = 0 + + def __init__(self, hypervisor, tap_device): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_TAP._instance_count + NIO_TAP._instance_count += 1 + self._name = 'nio_tap' + str(self._id) + self._tap_device = tap_device + + self._hypervisor.send("nio create_tap {name} {tap}".format(name=self._name, + tap=tap_device)) + + @property + def tap_device(self): + """ + Returns the TAP device used by this NIO. + + :returns: the TAP device name + """ + + return self._tap_device diff --git a/gns3server/modules/dynamips/nios/nio_udp.py b/gns3server/modules/dynamips/nios/nio_udp.py new file mode 100644 index 00000000..6021cfe9 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_udp.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for UDP NIOs. +""" + +from .nio import NIO + + +class NIO_UDP(NIO): + """ + Dynamips UDP NIO. + + :param hypervisor: Dynamips hypervisor object + :param lport: local port number + :param rhost: remote address/host + :param rport: remote port number + """ + + _instance_count = 0 + + def __init__(self, hypervisor, lport, rhost, rport): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_UDP._instance_count + NIO_UDP._instance_count += 1 + self._name = 'nio_udp' + str(self._id) + self._lport = lport + self._rhost = rhost + self._rport = rport + + self._hypervisor.send("nio create_udp {name} {lport} {rhost} {rport}".format(name=self._name, + lport=lport, + rhost=rhost, + rport=rport)) + + @property + def lport(self): + """ + Returns the local port + + :returns: local port number + """ + + return self._lport + + @property + def rhost(self): + """ + Returns the remote host + + :returns: remote address/host + """ + + return self._rhost + + @property + def rport(self): + """ + Returns the remote port + + :returns: remote port number + """ + + return self._rport diff --git a/gns3server/modules/dynamips/nios/nio_udp_auto.py b/gns3server/modules/dynamips/nios/nio_udp_auto.py new file mode 100644 index 00000000..eedbbcd5 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_udp_auto.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for automatic UDP NIOs. +""" + +from .nio import NIO + + +class NIO_UDP_auto(NIO): + """ + Dynamips auto UDP NIO. + + :param hypervisor: Dynamips hypervisor object + :param laddr: local address + :param lport_start: start local port range + :param lport_end: end local port range + """ + + _instance_count = 0 + + def __init__(self, hypervisor, laddr, lport_start, lport_end): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_UDP_auto._instance_count + NIO_UDP_auto._instance_count += 1 + self._name = 'nio_udp_auto' + str(self._id) + + self._laddr = laddr + self._lport = int(self._hypervisor.send("nio create_udp_auto {name} {laddr} {lport_start} {lport_end}".format(name=self._name, + laddr=laddr, + lport_start=lport_start, + lport_end=lport_end))[0]) + self._raddr = None + self._rport = None + + @property + def laddr(self): + """ + Returns the local address + + :returns: local address + """ + + return self._laddr + + @property + def lport(self): + """ + Returns the local port + + :returns: local port number + """ + + return self._lport + + @property + def raddr(self): + """ + Returns the remote address + + :returns: remote address + """ + + return self._raddr + + @property + def rport(self): + """ + Returns the remote port + + :returns: remote port number + """ + + return self._rport + + def connect(self, raddr, rport): + """ + Connects this NIO to a remote socket + + :param raddr: remote address + :param rport: remote port number + """ + + self._hypervisor.send("nio connect_udp_auto {name} {raddr} {rport}".format(name=self._name, + raddr=raddr, + rport=rport)) + self._raddr = raddr + self._rport = rport diff --git a/gns3server/modules/dynamips/nios/nio_unix.py b/gns3server/modules/dynamips/nios/nio_unix.py new file mode 100644 index 00000000..304c7f72 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_unix.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for UNIX NIOs (Unix based OSes only). +""" + +from .nio import NIO + + +class NIO_UNIX(NIO): + """ + Dynamips UNIX NIO. + + :param hypervisor: Dynamips hypervisor object + :param local_file: local UNIX socket filename + :param remote_file: remote UNIX socket filename + """ + + _instance_count = 0 + + def __init__(self, hypervisor, local_file, remote_file): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_UNIX._instance_count + NIO_UNIX._instance_count += 1 + self._name = 'nio_unix' + str(self._id) + self._local_file = local_file + self._remote_file = remote_file + + self._hypervisor.send("nio create_unix {name} {local} {remote}".format(name=self._name, + local=local_file, + remote=remote_file)) + + @property + def local_file(self): + """ + Returns the local UNIX socket. + + :returns: local UNIX socket filename + """ + + return self._local_file + + @property + def remote_file(self): + """ + Returns the remote UNIX socket. + + :returns: remote UNIX socket filename + """ + + return self._remote_file diff --git a/gns3server/modules/dynamips/nios/nio_vde.py b/gns3server/modules/dynamips/nios/nio_vde.py new file mode 100644 index 00000000..9f4df297 --- /dev/null +++ b/gns3server/modules/dynamips/nios/nio_vde.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for VDE (Virtual Distributed Ethernet) NIOs (Unix based OSes only). +""" + +from .nio import NIO + + +class NIO_VDE(NIO): + """ + Dynamips VDE NIO. + + :param hypervisor: Dynamips hypervisor object + :param control_file: VDE control filename + :param local_file: VDE local filename + """ + + _instance_count = 0 + + def __init__(self, hypervisor, control_file, local_file): + + NIO.__init__(self, hypervisor) + + # create an unique ID + self._id = NIO_VDE._instance_count + NIO_VDE._instance_count += 1 + self._name = 'nio_vde' + str(self._id) + self._control_file = control_file + self._local_file = local_file + + self._hypervisor.send("nio create_vde {name} {control} {local}".format(name=self._name, + control=control_file, + local=local_file)) + + @property + def control_file(self): + """ + Returns the VDE control file. + + :returns: VDE control filename + """ + + return self._control_file + + @property + def local_file(self): + """ + Returns the VDE local file. + + :returns: VDE local filename + """ + + return self._local_file diff --git a/gns3server/modules/dynamips/nodes/__init__.py b/gns3server/modules/dynamips/nodes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/gns3server/modules/dynamips/nodes/atm_bridge.py b/gns3server/modules/dynamips/nodes/atm_bridge.py new file mode 100644 index 00000000..1028249f --- /dev/null +++ b/gns3server/modules/dynamips/nodes/atm_bridge.py @@ -0,0 +1,170 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual ATM bridge module ("atm_bridge"). +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L622 +""" + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError + + +class ATMBridge(object): + """ + Dynamips bridge switch. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this switch + """ + + def __init__(self, hypervisor, name): + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._hypervisor.send("atm_bridge create {}".format(self._name)) + self._hypervisor.devices.append(self) + self._nios = {} + self._mapping = {} + + @property + def name(self): + """ + Returns the current name of this ATM bridge. + + :returns: ATM bridge name + """ + + return self._name[1:-1] # remove quotes + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all ATM bridge instances. + + :returns: list of all ATM bridges + """ + + return self._hypervisor.send("atm_bridge list") + + @property + def nios(self): + """ + Returns all the NIOs member of this ATM bridge. + + :returns: nio list + """ + + return self._nios + + @property + def mapping(self): + """ + Returns port mapping + + :returns: mapping list + """ + + return self._mapping + + def rename(self, new_name): + """ + Renames this ATM bridge. + + :param new_name: New name for this bridge + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("atm_bridge rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this ATM bridge. + """ + + self._hypervisor.send("atm_bridge delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def add_nio(self, nio, port): + """ + Adds a NIO as new port on ATM bridge. + + :param nio: NIO object to add + :param port: port to allocate for the NIO + """ + + if port in self._nios: + raise DynamipsError("Port {} isn't free".format(port)) + + self._nios[port] = nio + + def remove_nio(self, port): + """ + Removes the specified NIO as member of this ATM switch. + + :param port: allocated port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + del self._nios[port] + + def configure(self, eth_port, atm_port, atm_vpi, atm_vci): + """ + Configures this ATM bridge. + + :param eth_port: Ethernet port + :param atm_port: ATM port + :param atm_vpi: ATM VPI + :param atm_vci: ATM VCI + """ + + if eth_port not in self._nios: + raise DynamipsError("Ethernet port {} is not allocated".format(eth_port)) + + if atm_port not in self._nios: + raise DynamipsError("ATM port {} is not allocated".format(atm_port)) + + eth_nio = self._nios[eth_port] + atm_nio = self._nios[atm_port] + + self._hypervisor.send("atm_bridge configure {name} {eth_nio} {atm_nio} {vpi} {vci}".format(name=self._name, + eth_nio=eth_nio, + atm_nio=atm_nio, + vpi=atm_vpi, + vci=atm_vci)) + self._mapping[eth_port] = (atm_port, atm_vpi, atm_vci) + + def unconfigure(self): + """ + Unconfigures this ATM bridge. + """ + + self._hypervisor.send("atm_bridge unconfigure {}".format(self._name)) + del self._mapping diff --git a/gns3server/modules/dynamips/nodes/atm_switch.py b/gns3server/modules/dynamips/nodes/atm_switch.py new file mode 100644 index 00000000..99474912 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/atm_switch.py @@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual ATM switch module ("atmsw"). +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L593 +""" + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError + + +class ATMSwitch(object): + """ + Dynamips ATM switch. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this switch + """ + + def __init__(self, hypervisor, name): + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._hypervisor.send("atmsw create {}".format(self._name)) + self._hypervisor.devices.append(self) + self._nios = {} + self._mapping = {} + + @property + def name(self): + """ + Returns the current name of this ATM switch. + + :returns: ATM switch name + """ + + return self._name[1:-1] # remove quotes + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all ATM switches instances. + + :returns: list of all ATM switches + """ + + return self._hypervisor.send("atmsw list") + + @property + def nios(self): + """ + Returns all the NIOs member of this ATM switch. + + :returns: nio list + """ + + return self._nios + + @property + def mapping(self): + """ + Returns port mapping + + :returns: mapping list + """ + + return self._mapping + + def rename(self, new_name): + """ + Renames this ATM switch. + + :param new_name: New name for this switch + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("atmsw rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this ATM switch. + """ + + self._hypervisor.send("atmsw delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def add_nio(self, nio, port): + """ + Adds a NIO as new port on ATM switch. + + :param nio: NIO object to add + :param port: port to allocate for the NIO + """ + + if port in self._nios: + raise DynamipsError("Port {} isn't free".format(port)) + + self._nios[port] = nio + + def remove_nio(self, port): + """ + Removes the specified NIO as member of this ATM switch. + + :param port: allocated port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + del self._nios[port] + + def map_vp(self, port1, vpi1, port2, vpi2): + """ + Creates a new Virtual Path connection. + + :param port1: input port + :param vpi1: input vpi + :param port2: output port + :param vpi2: output vpi + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("atmsw create_vpc {name} {input_nio} {input_vpi} {output_nio} {output_vpi}".format(name=self._name, + input_nio=nio1, + input_vpi=vpi1, + output_nio=nio2, + output_vpi=vpi2)) + self._mapping[(port1, vpi1)] = (port2, vpi2) + + def unmap_vp(self, port1, vpi1, port2, vpi2): + """ + Deletes a new Virtual Path connection. + + :param port1: input port + :param vpi1: input vpi + :param port2: output port + :param vpi2: output vpi + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("atmsw delete_vpc {name} {input_nio} {input_vpi} {output_nio} {output_vpi}".format(name=self._name, + input_nio=nio1, + input_vpi=vpi1, + output_nio=nio2, + output_vpi=vpi2)) + del self._mapping[(port1, vpi1)] + + def map_pvc(self, port1, vpi1, vci1, port2, vpi2, vci2): + """ + Creates a new Virtual Channel connection (unidirectional). + + :param port1: input port + :param vpi1: input vpi + :param vci1: input vci + :param port2: output port + :param vpi2: output vpi + :param vci2: output vci + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("atmsw create_vcc {name} {input_nio} {input_vpi} {input_vci} {output_nio} {output_vpi} {output_vci}".format(name=self._name, + input_nio=nio1, + input_vpi=vpi1, + input_vci=vci1, + output_nio=nio2, + output_vpi=vpi2, + output_vci=vci2)) + self._mapping[(port1, vpi1, vci1)] = (port2, vpi2, vci2) + + def unmap_pvc(self, port1, vpi1, vci1, port2, vpi2, vci2): + """ + Deletes a new Virtual Channel connection (unidirectional). + + :param port1: input port + :param vpi1: input vpi + :param vci1: input vci + :param port2: output port + :param vpi2: output vpi + :param vci2: output vci + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("atmsw delete_vcc {name} {input_nio} {input_vpi} {input_vci} {output_nio} {output_vpi} {output_vci}".format(name=self._name, + input_nio=nio1, + input_vpi=vpi1, + input_vci=vci1, + output_nio=nio2, + output_vpi=vpi2, + output_vci=vci2)) + del self._mapping[(port1, vpi1, vci1)] diff --git a/gns3server/modules/dynamips/nodes/bridge.py b/gns3server/modules/dynamips/nodes/bridge.py new file mode 100644 index 00000000..9e5a8af1 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/bridge.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips NIO bridge module ("nio_bridge"). +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L538 +""" + +from __future__ import unicode_literals + + +class Bridge(object): + """ + Dynamips bridge. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this bridge + """ + + def __init__(self, hypervisor, name): + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._hypervisor.send("nio_bridge create {}".format(self._name)) + self._hypervisor.devices.append(self) + self._nios = [] + + @property + def name(self): + """ + Returns the current name of this bridge. + + :returns: bridge name + """ + + return self._name[1:-1] # remove quotes + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all bridge instances. + + :returns: list of all bridges + """ + + return self._hypervisor.send("nio_bridge list") + + @property + def nios(self): + """ + Returns all the NIOs member of this bridge. + + :returns: nio list + """ + + return self._nios + + def rename(self, new_name): + """ + Renames this bridge. + + :param new_name: New name for this bridge + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("nio_bridge rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this bridge. + """ + + self._hypervisor.send("nio_bridge delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def add_nio(self, nio): + """ + Adds a NIO as new port on this bridge. + + :param nio: NIO object to add + """ + + self._hypervisor.send("nio_bridge add_nio {name} {nio}".format(name=self._name, + nio=nio)) + self._nios.append(nio) + + def remove_nio(self, nio): + """ + Removes the specified NIO as member of this bridge. + + :param nio: NIO object to remove + """ + + self._hypervisor.send("nio_bridge remove_nio {name} {nio}".format(name=self._name, + nio=nio)) + self._nios.remove(nio) diff --git a/gns3server/modules/dynamips/nodes/c1700.py b/gns3server/modules/dynamips/nodes/c1700.py new file mode 100644 index 00000000..96b4ec72 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c1700.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 1700 instances module ("c1700") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L428 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.c1700_mb_1fe import C1700_MB_1FE +from ..adapters.c1700_mb_wic1 import C1700_MB_WIC1 + + +class C1700(Router): + """ + Dynamips c1700 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + :param chassis: chassis for this router: + 1720, 1721, 1750, 1751 or 1760 (default = 1720). + 1710 is not supported. + """ + + def __init__(self, hypervisor, name, chassis="1720"): + Router.__init__(self, hypervisor, name, platform="c1700") + + # Set default values for this platform + self._ram = 64 + self._nvram = 32 + self._disk0 = 0 + self._disk1 = 0 + self._chassis = chassis + self._iomem = 15 # percentage + self._clock_divisor = 8 + + if chassis != "1720": + self.chassis = chassis + + self._setup_chassis() + + def list(self): + """ + Returns all c1700 instances + + :returns: c1700 instance list + """ + + return self._hypervisor.send("c1700 list") + + def _setup_chassis(self): + """ + Set up the router with the corresponding chassis + (create slots and insert default adapters). + """ + + # With 1751 and 1760, WICs in WIC slot 1 show up as in slot 1, not 0 + # e.g. s1/0 not s0/2 + if self._chassis in ['1751', '1760']: + self._create_slots(2) + self._slots[1] = C1700_MB_WIC1() + else: + self._create_slots(1) + self._slots[0] = C1700_MB_1FE() + + @property + def chassis(self): + """ + Returns the chassis. + + :returns: chassis string + """ + + return self._chassis + + @chassis.setter + def chassis(self, chassis): + """ + Set the chassis. + + :param: chassis string: + 1720, 1721, 1750, 1751 or 1760 + """ + + self._hypervisor.send("c1700 set_chassis {name} {chassis}".format(name=self._name, + chassis=chassis)) + self._chassis = chassis + self._setup_chassis() + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c1700 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c2600.py b/gns3server/modules/dynamips/nodes/c2600.py new file mode 100644 index 00000000..eaf75cde --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c2600.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 2600 instances module ("c2600") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L404 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.c2600_mb_1e import C2600_MB_1E +from ..adapters.c2600_mb_2e import C2600_MB_2E +from ..adapters.c2600_mb_1fe import C2600_MB_1FE +from ..adapters.c2600_mb_2fe import C2600_MB_2FE + + +class C2600(Router): + """ + Dynamips c2600 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + :param chassis: chassis for this router: + 2610, 2611, 2620, 2621, 2610XM, 2611XM + 2620XM, 2621XM, 2650XM or 2651XM (default = 2610). + """ + + # adapters to insert by default corresponding the + # chosen chassis. + integrated_adapters = {'2610': C2600_MB_1E, + '2611': C2600_MB_2E, + '2620': C2600_MB_1FE, + '2621': C2600_MB_2FE, + '2610XM': C2600_MB_1FE, + '2611XM': C2600_MB_2FE, + '2620XM': C2600_MB_1FE, + '2621XM': C2600_MB_2FE, + '2650XM': C2600_MB_1FE, + '2651XM': C2600_MB_2FE} + + def __init__(self, hypervisor, name, chassis="2610"): + Router.__init__(self, hypervisor, name, platform="c2600") + + # Set default values for this platform + self._ram = 64 + self._nvram = 128 + self._disk0 = 0 + self._disk1 = 0 + self._chassis = chassis + self._iomem = 15 # percentage + self._clock_divisor = 8 + + if chassis != "2610": + self.chassis = chassis + + self._setup_chassis() + + def list(self): + """ + Returns all c2600 instances + + :returns: c2600 instance list + """ + + return self._hypervisor.send("c2600 list") + + def _setup_chassis(self): + """ + Set up the router with the corresponding chassis + (create slots and insert default adapters). + """ + + self._create_slots(2) + self._slots[0] = self.integrated_adapters[self._chassis]() + + @property + def chassis(self): + """ + Returns the chassis. + + :returns: chassis string + """ + + return self._chassis + + @chassis.setter + def chassis(self, chassis): + """ + Set the chassis. + + :param: chassis string: + 2610, 2611, 2620, 2621, 2610XM, 2611XM + 2620XM, 2621XM, 2650XM or 2651XM + """ + + self._hypervisor.send("c2600 set_chassis {name} {chassis}".format(name=self._name, + chassis=chassis)) + self._chassis = chassis + self._setup_chassis() + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c2600 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c2691.py b/gns3server/modules/dynamips/nodes/c2691.py new file mode 100644 index 00000000..d075bbd5 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c2691.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 2691 instances module ("c2691") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L387 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.gt96100_fe import GT96100_FE + + +class C2691(Router): + """ + Dynamips c2691 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + """ + + def __init__(self, hypervisor, name): + Router.__init__(self, hypervisor, name, platform="c2691") + + # Set default values for this platform + self._ram = 128 + self._nvram = 112 + self._disk0 = 16 + self._disk1 = 0 + self._iomem = 5 # percentage + self._clock_divisor = 8 + + self._create_slots(2) + self._slots[0] = GT96100_FE() + + def list(self): + """ + Returns all c2691 instances + + :returns: c2691 instance list + """ + + return self._hypervisor.send("c2691 list") + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c2691 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c3600.py b/gns3server/modules/dynamips/nodes/c3600.py new file mode 100644 index 00000000..7806da54 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c3600.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 3600 instances module ("c3600") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L366 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.leopard_2fe import Leopard_2FE + + +class C3600(Router): + """ + Dynamips c3600 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + :param chassis: chassis for this router: + 3620, 3640 or 3660 (default = 3640). + """ + + def __init__(self, hypervisor, name, chassis="3640"): + Router.__init__(self, hypervisor, name, platform="c3600") + + # Set default values for this platform + self._ram = 128 + self._nvram = 128 + self._disk0 = 0 + self._disk1 = 0 + self._iomem = 5 # percentage + self._chassis = chassis + self._clock_divisor = 4 + + if chassis != "3640": + self.chassis = chassis + + self._setup_chassis() + + def list(self): + """ + Returns all c3600 instances + + :returns: c3600 instance list + """ + + return self._hypervisor.send("c3600 list") + + def _setup_chassis(self): + """ + Set up the router with the corresponding chassis + (create slots and insert default adapters). + """ + + if self._chassis == "3620": + self._create_slots(2) + elif self._chassis == "3640": + self._create_slots(4) + elif self._chassis == "3660": + self._create_slots(7) + self._slots[0] = Leopard_2FE() + + @property + def chassis(self): + """ + Returns the chassis. + + :returns: chassis string + """ + + return self._chassis + + @chassis.setter + def chassis(self, chassis): + """ + Set the chassis. + + :param: chassis string: 3620, 3640 or 3660 + """ + + self._hypervisor.send("c3600 set_chassis {name} {chassis}".format(name=self._name, + chassis=chassis)) + self._chassis = chassis + self._setup_chassis() + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c3600 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c3725.py b/gns3server/modules/dynamips/nodes/c3725.py new file mode 100644 index 00000000..1730b48d --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c3725.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 3725 instances module ("c3725") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L346 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.gt96100_fe import GT96100_FE + + +class C3725(Router): + """ + Dynamips c3725 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + """ + + def __init__(self, hypervisor, name): + Router.__init__(self, hypervisor, name, platform="c3725") + + # Set default values for this platform + self._ram = 128 + self._nvram = 112 + self._disk0 = 16 + self._disk1 = 0 + self._iomem = 5 # percentage + self._clock_divisor = 8 + + self._create_slots(3) + self._slots[0] = GT96100_FE() + + def list(self): + """ + Returns all c3725 instances. + + :returns: c3725 instance list + """ + + return self._hypervisor.send("c3725 list") + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c3725 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c3745.py b/gns3server/modules/dynamips/nodes/c3745.py new file mode 100644 index 00000000..1ed94a40 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c3745.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 3745 instances module ("c3745") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L326 +""" + +from __future__ import unicode_literals +from .router import Router +from ..adapters.gt96100_fe import GT96100_FE + + +class C3745(Router): + """ + Dynamips c3745 router. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + """ + + def __init__(self, hypervisor, name): + Router.__init__(self, hypervisor, name, platform="c3745") + + # Set default values for this platform + self._ram = 128 + self._nvram = 304 + self._disk0 = 16 + self._disk1 = 0 + self._iomem = 5 # percentage + self._clock_divisor = 8 + + self._create_slots(5) + self._slots[0] = GT96100_FE() + + def list(self): + """ + Returns all c3745 instances. + + :returns: c3745 instance list + """ + + return self._hypervisor.send("c3745 list") + + @property + def iomem(self): + """ + Returns I/O memory size for this router. + + :returns: I/O memory size (integer) + """ + + return self._iomem + + @iomem.setter + def iomem(self, iomem): + """ + Set I/O memory size for this router. + + :param iomem: I/O memory size + """ + + self._hypervisor.send("c3745 set_iomem {name} {size}".format(name=self._name, + size=iomem)) + self._iomem = iomem diff --git a/gns3server/modules/dynamips/nodes/c7200.py b/gns3server/modules/dynamips/nodes/c7200.py new file mode 100644 index 00000000..baa981c6 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/c7200.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Cisco 7200 instances module ("c7200") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L294 +""" + + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError +from .router import Router +from ..adapters.c7200_io_2fe import C7200_IO_2FE +from ..adapters.c7200_io_ge_e import C7200_IO_GE_E + + +class C7200(Router): + """ + Dynamips c7200 router (model is 7206). + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + :param npe: default NPE + """ + + def __init__(self, hypervisor, name, npe="npe-400"): + Router.__init__(self, hypervisor, name, platform="c7200") + + # Set default values for this platform + self._ram = 256 + self._nvram = 128 + self._disk0 = 64 + self._disk1 = 0 + self._npe = npe + self._midplane = "vxr" + self._clock_divisor = 4 + + if npe != "npe-400": + self.npe = npe + + # 4 sensors with a default temperature of 22C: + # sensor 1 = I/0 controller inlet + # sensor 2 = I/0 controller outlet + # sensor 3 = NPE inlet + # sensor 4 = NPE outlet + self._sensors = [22, 22, 22, 22] + + # 2 power supplies powered on + self._power_supplies = [1, 1] + + self._create_slots(7) + + # first slot is a mandatory Input/Output controller (based on NPE type) + if npe == "npe-g2": + self._slots[0] = C7200_IO_GE_E() + else: + self._slots[0] = C7200_IO_2FE() + + def list(self): + """ + Returns all c7200 instances. + + :returns: c7200 instance list + """ + + return self._hypervisor.send("c7200 list") + + @property + def npe(self): + """ + Returns the NPE model. + + :returns: NPE model string (e.g. "npe-200") + """ + + return self._npe + + @npe.setter + def npe(self, npe): + """ + Set the NPE model. + + :params npe: NPE model string (e.g. "npe-200") + NPE models are npe-100, npe-150, npe-175, npe-200, + npe-225, npe-300, npe-400 and npe-g2 (PowerPC c7200 only) + """ + + if self.is_running(): + raise DynamipsError("Cannot change NPE on running router") + + self._hypervisor.send("c7200 set_npe {name} {npe}".format(name=self._name, + npe=npe)) + self._npe = npe + + @property + def midplane(self): + """ + Returns the midplane model. + + :returns: midplane model string (e.g. "vxr" or "std") + """ + + return self._midplane + + @midplane.setter + def midplane(self, midplane): + """ + Set the midplane model. + + :returns: midplane model string (e.g. "vxr" or "std") + """ + + self._hypervisor.send("c7200 set_midplane {name} {midplane}".format(name=self._name, + midplane=midplane)) + self._midplane = midplane + + @property + def sensors(self): + """ + Returns the 4 sensors with temperature in degree Celcius. + + :returns: list of 4 sensor temperatures + """ + + return self._sensors + + @sensors.setter + def sensors(self, sensors): + """ + Set the 4 sensors with temperature in degree Celcius. + + :param sensors: list of 4 sensor temperatures corresponding to + sensor 1 = I/0 controller inlet + sensor 2 = I/0 controller outlet + sensor 3 = NPE inlet + sensor 4 = NPE outlet + Example: [22, 22, 22, 22] + """ + + sensor_id = 0 + for sensor in sensors: + self._hypervisor.send("c7200 set_temp_sensor {name} {sensor_id} {temp}".format(name=self._name, + sensor_id=sensor_id, + temp=sensor)) + sensor_id += 1 + self._sensors = sensors + + @property + def power_supplies(self): + """ + Returns the 2 power supplies with 0 = off, 1 = on. + + :returns: list of 2 power supplies. + """ + + return self._power_supplies + + @power_supplies.setter + def power_supplies(self, power_supplies): + """ + Set the 2 power supplies with 0 = off, 1 = on. + + :param power_supplies: list of 2 power supplies. + Example: [1, 0] = first power supply is on, second is off. + """ + + power_supply_id = 0 + for power_supply in power_supplies: + self._hypervisor.send("c7200 set_power_supply {name} {power_supply_id} {powered_on}".format(name=self._name, + power_supply_id=power_supply_id, + powered_on=power_supply)) + power_supply_id += 1 + self._power_supplies = power_supplies diff --git a/gns3server/modules/dynamips/nodes/ethernet_switch.py b/gns3server/modules/dynamips/nodes/ethernet_switch.py new file mode 100644 index 00000000..b0bde746 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/ethernet_switch.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Ethernet switch module ("ethsw"). +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L558 +""" + + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError + + +class EthernetSwitch(object): + """ + Dynamips Ethernet switch. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this switch + """ + + def __init__(self, hypervisor, name): + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._hypervisor.send("ethsw create {}".format(self._name)) + self._hypervisor.devices.append(self) + self._nios = {} + self._mapping = {} + + @property + def name(self): + """ + Returns the current name of this Ethernet switch. + + :returns: Ethernet switch name + """ + + return self._name[1:-1] # remove quotes + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all Ethernet switches instances. + + :returns: list of all Ethernet switches + """ + + return self._hypervisor.send("ethsw list") + + @property + def nios(self): + """ + Returns all the NIOs member of this Ethernet switch. + + :returns: nio list + """ + + return self._nios + + @property + def mapping(self): + """ + Returns port mapping + + :returns: mapping list + """ + + return self._mapping + + def rename(self, new_name): + """ + Renames this Ethernet switch. + + :param new_name: New name for this switch + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("ethsw rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this Ethernet switch. + """ + + self._hypervisor.send("ethsw delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def add_nio(self, nio, port): + """ + Adds a NIO as new port on Ethernet switch. + + :param nio: NIO object to add + :param port: port to allocate for the NIO + """ + + if port in self._nios: + raise DynamipsError("Port {} isn't free".format(port)) + + self._hypervisor.send("ethsw add_nio {name} {nio}".format(name=self._name, + nio=nio)) + self._nios[port] = nio + + def remove_nio(self, port): + """ + Removes the specified NIO as member of this Ethernet switch. + + :param port: allocated port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + nio = self._nios[port] + self._hypervisor.send("ethsw remove_nio {name} {nio}".format(name=self._name, + nio=nio)) + del self._nios[port] + + if port in self._mapping: + del self._mapping[port] + + def set_access_port(self, port, vlan_id): + """ + Set the specified port as an ACCESS port. + + :param port: allocated port + :param vlan_id: VLAN number membership + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + nio = self._nios[port] + self._hypervisor.send("ethsw set_access_port {name} {nio} {vlan_id}".format(name=self._name, + nio=nio, + vlan_id=vlan_id)) + self._mapping[port] = ("access", vlan_id) + + def set_dot1q_port(self, port, native_vlan): + """ + Set the specified port as a 802.1Q trunk port. + + :param port: allocated port + :param native_vlan: native VLAN for this trunk port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + nio = self._nios[port] + self._hypervisor.send("ethsw set_dot1q_port {name} {nio} {native_vlan}".format(name=self._name, + nio=nio, + native_vlan=native_vlan)) + self._mapping[port] = ("dot1q", native_vlan) + + def set_qinq_port(self, port, outer_vlan): + """ + Set the specified port as a trunk (QinQ) port. + + :param port: allocated port + :param outer_vlan: outer VLAN (transport VLAN) for this QinQ port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + nio = self._nios[port] + self._hypervisor.send("ethsw set_qinq_port {name} {nio} {outer_vlan}".format(name=self._name, + nio=nio, + outer_vlan=outer_vlan)) + self._mapping[port] = ("qinq", outer_vlan) + + def get_mac_addr_table(self): + """ + Returns the MAC address table for this Ethernet switch. + + :returns: list of entries (Ethernet address, VLAN, NIO) + """ + + return self._hypervisor.send("ethsw show_mac_addr_table {}".format(self._name)) + + def clear_mac_addr_table(self): + """ + Clears the MAC address table for this Ethernet switch. + """ + + self._hypervisor.send("ethsw clear_mac_addr_table {}".format(self._name)) diff --git a/gns3server/modules/dynamips/nodes/frame_relay_switch.py b/gns3server/modules/dynamips/nodes/frame_relay_switch.py new file mode 100644 index 00000000..d27f282a --- /dev/null +++ b/gns3server/modules/dynamips/nodes/frame_relay_switch.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Frame-Relay switch module. +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L642 +""" + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError + + +class FrameRelaySwitch(object): + """ + Dynamips Frame Relay switch. + + :param hypervisor: Dynamips hypervisor object + :param name: name for this switch + """ + + def __init__(self, hypervisor, name): + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._hypervisor.send("frsw create {}".format(self._name)) + self._hypervisor.devices.append(self) + self._nios = {} + self._mapping = {} + + @property + def name(self): + """ + Returns the current name of this Frame Relay switch. + + :returns: Frame Relay switch name + """ + + return self._name[1:-1] # remove quotes + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all Frame Relay switches instances. + + :returns: list of all Frame Relay switches + """ + + return self._hypervisor.send("frsw list") + + @property + def nios(self): + """ + Returns all the NIOs member of this Frame Relay switch. + + :returns: nio list + """ + + return self._nios + + @property + def mapping(self): + """ + Returns port mapping + + :returns: mapping list + """ + + return self._mapping + + def rename(self, new_name): + """ + Renames this Frame Relay switch. + + :param new_name: New name for this switch + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("frsw rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this Frame Relay switch. + """ + + self._hypervisor.send("frsw delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def add_nio(self, nio, port): + """ + Adds a NIO as new port on Frame Relay switch. + + :param nio: NIO object to add + :param port: port to allocate for the NIO + """ + + if port in self._nios: + raise DynamipsError("Port {} isn't free".format(port)) + + self._nios[port] = nio + + def remove_nio(self, port): + """ + Removes the specified NIO as member of this Frame Relay switch. + + :param port: allocated port + """ + + if port not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port)) + + del self._nios[port] + + def map_vc(self, port1, dlci1, port2, dlci2): + """ + Creates a new Virtual Circuit connection (unidirectional). + + :param port1: input port + :param dlci1: input DLCI + :param port2: output port + :param dlci2: output DLCI + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("frsw create_vc {name} {input_nio} {input_dlci} {output_nio} {output_dlci}".format(name=self._name, + input_nio=nio1, + input_dlci=dlci1, + output_nio=nio2, + output_dlci=dlci2)) + self._mapping[(port1, dlci1)] = (port2, dlci2) + + def unmap_vc(self, port1, dlci1, port2, dlci2): + """ + Deletes a Virtual Circuit connection (unidirectional). + + :param port1: input port + :param dlci1: input DLCI + :param port2: output port + :param dlci2: output DLCI + """ + + if port1 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port1)) + + if port2 not in self._nios: + raise DynamipsError("Port {} is not allocated".format(port2)) + + nio1 = self._nios[port1] + nio2 = self._nios[port2] + + self._hypervisor.send("frsw delete_vc {name} {input_nio} {input_dlci} {output_nio} {output_dlci}".format(name=self._name, + input_nio=nio1, + input_dlci=dlci1, + output_nio=nio2, + output_dlci=dlci2)) + del self._mapping[(port1, dlci1)] diff --git a/gns3server/modules/dynamips/nodes/hub.py b/gns3server/modules/dynamips/nodes/hub.py new file mode 100644 index 00000000..ff3f8c41 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/hub.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Hub object that uses the Bridge interface to create a hub with ports. +""" + +from __future__ import unicode_literals +from .bridge import Bridge +from ..dynamips_error import DynamipsError + + +class Hub(Bridge): + """ + Dynamips hub (based on Bridge) + + :param hypervisor: Dynamips hypervisor object + :param name: name for this hub + """ + + def __init__(self, hypervisor, name): + + Bridge.__init__(self, hypervisor, name) + self._mapping = {} + + @property + def mapping(self): + """ + Returns port mapping + + :returns: mapping list + """ + + return self._mapping + + def add_nio(self, nio, port): + """ + Adds a NIO as new port on this hub. + + :param nio: NIO object to add + :param port: port to allocate for the NIO + """ + + if port in self._mapping: + raise DynamipsError("Port {} isn't free".format(port)) + + Bridge.add_nio(self, nio) + self._mapping[port] = nio + + def remove_nio(self, port): + """ + Removes the specified NIO as member of this hub. + + :param port: allocated port + """ + + if port not in self._mapping: + raise DynamipsError("Port {} is not allocated".format(port)) + + nio = self._mapping[port] + Bridge.remove_nio(self, nio) + del self._mapping[port] diff --git a/gns3server/modules/dynamips/nodes/router.py b/gns3server/modules/dynamips/nodes/router.py new file mode 100644 index 00000000..16259299 --- /dev/null +++ b/gns3server/modules/dynamips/nodes/router.py @@ -0,0 +1,1085 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Interface for Dynamips virtual Machine module ("vm") +http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L77 +""" + +from __future__ import unicode_literals +from ..dynamips_error import DynamipsError +import os + + +class Router(object): + """ + Dynamips router + + :param hypervisor: Dynamips hypervisor object + :param name: name for this router + :param platform: c7200, c3745, c3725, c3600, c2691, c2600 or c1700 + :param console_flag: create console ports if True. + """ + + _instance_count = 0 + _status = {0: "inactive", + 1: "shutting down", + 2: "running", + 3: "suspended"} + + def __init__(self, hypervisor, name, platform="c7200", console_flag=True): + + # create an unique ID + self._id = Router._instance_count + Router._instance_count += 1 + + self._hypervisor = hypervisor + self._name = '"' + name + '"' # put name into quotes to protect spaces + self._platform = platform + self._image = "" + self._ram = 128 # Megabytes + self._nvram = 128 # Kilobytes + self._mmap = True + self._sparsemem = True + self._clock_divisor = 8 + self._idlepc = "" + self._idlemax = 1500 + self._idlesleep = 30 + self._ghost_file = "" + self._ghost_status = 0 + self._exec_area = None # Megabytes (None = default for the router platform) + self._jit_sharing_group = None + self._disk0 = 0 # Megabytes + self._disk1 = 0 # Megabytes + self._confreg = '0x2102' + self._console = None + self._aux = None + self._mac_addr = None + self._system_id = None # processor board ID in IOS + self._slots = [] + + self._hypervisor.send("vm create {name} {id} {platform}".format(name=self._name, + id=self._id, + platform=self._platform)) + + if console_flag: + self.console = self._hypervisor.baseconsole + self._id + self.aux = self._hypervisor.baseaux + self._id + + self._hypervisor.devices.append(self) + + @property + def id(self): + """ + Returns the unique ID for this router. + + :returns: id (integer) + """ + + return self._id + + @property + def name(self): + """ + Returns the name of this router. + + :returns: name (string) + """ + + return self._name[1:-1] # remove quotes + + @property + def platform(self): + """ + Returns the platform of this router. + + :returns: platform name (string): + c7200, c3745, c3725, c3600, c2691, c2600 or c1700 + """ + + return self._platform + + @property + def hypervisor(self): + """ + Returns the current hypervisor. + + :returns: hypervisor object + """ + + return self._hypervisor + + def list(self): + """ + Returns all VM instances + + :returns: list of all VM instances + """ + + return self._hypervisor.send("vm list") + + def list_con_ports(self): + """ + Returns all VM console TCP ports + + :returns: list of port numbers + """ + + return self._hypervisor.send("vm list_con_ports") + + def rename(self, new_name): + """ + Renames this router. + + :param new_name: new name string + """ + + new_name = '"' + new_name + '"' # put the new name into quotes to protect spaces + self._hypervisor.send("vm rename {name} {new_name}".format(name=self._name, + new_name=new_name)) + self._name = new_name + + def delete(self): + """ + Deletes this router. + """ + + self._hypervisor.send("vm delete {}".format(self._name)) + self._hypervisor.devices.remove(self) + + def start(self): + """ + Starts this router. + At least the IOS image must be set. + """ + + self._hypervisor.send("vm start {}".format(self._name)) + + def stop(self): + """ + Stops this router. + The settings are kept. + """ + + self._hypervisor.send("vm stop {}".format(self._name)) + + def suspend(self): + """ + Suspends this router + """ + + self._hypervisor.send("vm suspend {}".format(self._name)) + + def resume(self): + """ + Resumes this suspended router + """ + + self._hypervisor.send("vm resume {}".format(self._name)) + + def get_status(self): + """ + Returns the status of this router + + :returns: 0=inactive, 1=shutting down, 2=running, 3=suspended + """ + + status_id = int(self._hypervisor.send("vm get_status {}".format(self._name))[0]) + return self._status[status_id] + + def is_running(self): + """ + Checks if this router is running. + + :returns: True if running, False otherwise + """ + + if self.get_status() == "running": + return True + return False + + @property + def jit_sharing_group(self): + """ + Returns the JIT sharing group for this router. + + :returns: translation sharing group ID + """ + + return self._jit_sharing_group + + @jit_sharing_group.setter + def jit_sharing_group(self, group_id): + """ + Set the translation sharing group (unstable). + + :param group_id: translation sharing group ID + """ + + if not self._image: + raise DynamipsError("Register an IOS image fist") + + self._hypervisor.send("vm set_tsg {name} {group_id}".format(name=self._name, + group_id=group_id)) + + self._jit_sharing_group = group_id + self._hypervisor.add_jitsharing_group(os.path.basename(self._image), group_id) + + def set_debug_level(self, level): + """ + Set the debug level for this router (default is 0). + + :param level: level number + """ + + self._hypervisor.send("vm set_debug_level {name} {level}".format(name=self._name, + level=level)) + + @property + def image(self): + """ + Returns this IOS image for this router. + + :returns: path to IOS image file + """ + + return self._image + + @image.setter + def image(self, image): + """ + Set the IOS image for this router. + There is no default. + + :param image: path to IOS image file + """ + + # encase image in quotes to protect spaces in the path + self._hypervisor.send("vm set_ios {name} {image}".format(name=self._name, + image='"' + image + '"')) + self._image = image + + def set_config(self, startup_config, private_config=''): + """ + Set the config files that are pushed to startup-config and + private-config in NVRAM when the instance is started. + + :param startup_config: path to statup-config file + :param private_config: path to private-config file + (keep existing data when if an empty string) + """ + + self._hypervisor.send("vm set_config {name} {startup} {private}".format(name=self._name, + startup='"' + startup_config + '"', + private='"' + private_config + '"')) + + def extract_config(self): + """ + Gets the contents of the config files + startup-config and private-config from NVRAM. + + :returns: tuple (startup-config, private-config) base64 encoded + """ + + try: + reply = self._hypervisor.send("vm extract_config {}".format(self._name))[0].rsplit(' ', 2)[-2:] + except IOError: + #for some reason Dynamips gets frozen when it does not find the magic number in the NVRAM file. + return (None, None) + startup_config = reply[0][1:-1] # get statup-config and remove single quotes + private_config = reply[1][1:-1] # get private-config and remove single quotes + return (startup_config, private_config) + + def push_config(self, startup_config, private_config='(keep)'): + """ + Pushes configuration to the config files startup-config and private-config in NVRAM. + The data is a Base64 encoded string, or '(keep)' to keep existing data. + + :param startup_config: statup-config string base64 encoded + :param private_config: private-config string base64 encoded + (keep existing data when if the value is ('keep')) + """ + + self._hypervisor.send("vm push_config {name} {startup} {private}".format(name=self._name, + startup=startup_config, + private=private_config)) + + @property + def ram(self): + """ + Returns the amount of RAM allocated to this router. + + :returns: amount of RAM in Mbytes (integer) + """ + + return self._ram + + @ram.setter + def ram(self, ram): + """ + Set amount of RAM allocated to this router + + :param ram: amount of RAM in Mbytes (integer) + """ + + self._hypervisor.send("vm set_ram {name} {ram}".format(name=self._name, + ram=self._ram)) + self._hypervisor.decrease_memory_load(self._ram) + self._ram = ram + self._hypervisor.increase_memory_load(self._ram) + + @property + def nvram(self): + """ + Returns the mount of NVRAM allocated to this router. + + :returns: amount of NVRAM in Kbytes (integer) + """ + + return self._nvram + + @nvram.setter + def nvram(self, nvram): + """ + Set amount of NVRAM allocated to this router + + :param nvram: amount of NVRAM in Kbytes (integer) + """ + + self._hypervisor.send("vm set_nvram {name} {nvram}".format(name=self._name, + nvram=self._nvram)) + self._nvram = nvram + + @property + def mmap(self): + """ + Returns True if a mapped file is used to simulate this router memory. + + :returns: boolean either mmap is activated or not + """ + + return self._mmap + + @mmap.setter + def mmap(self, mmap): + """ + Enable/Disable use of a mapped file to simulate router memory. + By default, a mapped file is used. This is a bit slower, but requires less memory. + + :param mmap: activate/deactivate mmap (boolean) + """ + + if mmap: + flag = 1 + else: + flag = 0 + self._hypervisor.send("vm set_ram_mmap {name} {mmap}".format(name=self._name, + mmap=flag)) + self._mmap = mmap + + @property + def sparsemem(self): + """ + Returns True if sparse memory is used on this router. + + :returns: boolean either mmap is activated or not + """ + + return self._sparsemem + + @sparsemem.setter + def sparsemem(self, sparsemem): + """ + Enable/disable use of sparse memory + + :param sparsemem: activate/deactivate sparsemem (boolean) + """ + + if sparsemem: + flag = 1 + else: + flag = 0 + self._hypervisor.send("vm set_sparse_mem {name} {sparsemem}".format(name=self._name, + sparsemem=flag)) + self._sparsemem = sparsemem + + @property + def clock_divisor(self): + """ + Returns the clock divisor value for this router. + + :returns: clock divisor value (integer) + """ + + return self._clock_divisor + + @clock_divisor.setter + def clock_divisor(self, clock_divisor): + """ + Set the clock divisor value. The higher is the value, the faster is the clock in the + virtual machine. The default is 4, but it is often required to adjust it. + + :param clock_divisor: clock divisor value (integer) + """ + + self._hypervisor.send("vm set_clock_divisor {name} {clock}".format(name=self._name, + clock=clock_divisor)) + self._clock_divisor = clock_divisor + + @property + def idlepc(self): + """ + Returns the idle Pointer Counter (PC). + + :returns: idlepc value (string) + """ + + return self._idlepc + + @idlepc.setter + def idlepc(self, idlepc): + """ + Set the idle Pointer Counter (PC) + + :param idlepc: idlepc value (string) + """ + + if not self.is_running(): + # router is not running + self._hypervisor.send("vm set_idle_pc {name} {idlepc}".format(name=self._name, + idlepc=idlepc)) + else: + self._hypervisor.send("vm set_idle_pc_online {name} 0 {idlepc}".format(name=self._name, + idlepc=idlepc)) + self._idlepc = idlepc + + def get_idle_pc_prop(self): + """ + Gets the idle PC proposals. + Takes 1000 measurements and records up to 10 idle PC proposals. + There is a 10ms wait between each measurement. + + :returns: list of idle PC proposal + """ + + return self._hypervisor.send("vm get_idle_pc_prop {} 0".format(self._name)) + + def show_idle_pc_prop(self): + """ + Dumps the idle PC proposals (previously generated). + + :returns: list of idle PC proposal + """ + + return self._hypervisor.send("vm show_idle_pc_prop {} 0".format(self._name)) + + @property + def idlemax(self): + """ + Returns CPU idle max value. + + :returns: idle max (integer) + """ + + return self._idlemax + + @idlemax.setter + def idlemax(self, idlemax): + """ + Set CPU idle max value + + :param idlemax: idle max value (integer) + """ + + if self.is_running(): # router is running + self._hypervisor.send("vm set_idle_max {name} 0 {idlemax}".format(name=self._name, + idlemax=idlemax)) + self._idlemax = idlemax + + @property + def idlesleep(self): + """ + Returns CPU idle sleep time value. + + :returns: idle sleep (integer) + """ + + return self._idlesleep + + @idlesleep.setter + def idlesleep(self, idlesleep): + """ + Set CPU idle sleep time value. + + :param idlesleep: idle sleep value (integer) + """ + + if self.is_running(): # router is running + self._hypervisor.send("vm set_idle_sleep_time {name} 0 {idlesleep}".format(name=self._name, + idlesleep=idlesleep)) + self._idlesleep = idlesleep + + def show_timer_drift(self): + """ + Shows info about potential timer drift. + + :returns: timer drift info. + """ + + return self._hypervisor.send("vm show_timer_drift {} 0".format(self._name)) + + @property + def ghost_file(self): + """ + Returns ghost RAM file. + + :returns: path to ghost file + """ + + return self._ghost_file + + @ghost_file.setter + def ghost_file(self, ghost_file): + """ + Set ghost RAM file + + :ghost_file: path to ghost file + """ + + self._hypervisor.send("vm set_ghost_file {name} {ghost_file}".format(name=self._name, + ghost_file=ghost_file)) + self._ghost_file = ghost_file + + # If this is a ghost instance, track this as a hosted ghost instance by this hypervisor + if self.ghost_status == 1: + self._hypervisor.add_ghost(ghost_file, self) + + def formatted_ghost_file(self): + """ + Returns a properly formatted ghost file name. + + :returns: formatted ghost_file name (string) + """ + + # Replace specials characters in 'drive:\filename' in Linux and Dynamips in MS Windows or viceversa. + ghost_file = os.path.basename(self._image) + '-' + self._hypervisor.host + '.ghost' + ghost_file = ghost_file.replace('\\', '-').replace('/', '-').replace(':', '-') + return ghost_file + + @property + def ghost_status(self): + """Returns ghost RAM status + + :returns: ghost status (integer) + """ + + return self._ghost_status + + @ghost_status.setter + def ghost_status(self, ghost_status): + """ + Set ghost RAM status + + :param ghost_status: state flag indicating status + 0 => Do not use IOS ghosting + 1 => This is a ghost instance + 2 => Use an existing ghost instance + """ + + self._hypervisor.send("vm set_ghost_status {name} {ghost_status}".format(name=self._name, + ghost_status=ghost_status)) + self._ghost_status = ghost_status + + @property + def exec_area(self): + """ + Returns the exec area value. + + :returns: exec area value (integer) + """ + + return self._exec_area + + @exec_area.setter + def exec_area(self, exec_area): + """ + Set the exec area value. + The exec area is a pool of host memory used to store pages + translated by the JIT (they contain the native code + corresponding to MIPS code pages). + + :param excec_area: exec area value (integer) + """ + + self._hypervisor.send("vm set_exec_area {name} {exec_area}".format(name=self._name, + exec_area=exec_area)) + self._exec_area = exec_area + + @property + def disk0(self): + """ + Returns the size (MB) for PCMCIA disk0. + + :returns: disk0 size (integer) + """ + + return self._disk0 + + @disk0.setter + def disk0(self, disk0): + """ + Set the size (MB) for PCMCIA disk0. + + :param disk0: disk0 size (integer) + """ + + self._hypervisor.send("vm set_disk0 {name} {disk0}".format(name=self._name, + disk0=disk0)) + self._disk0 = disk0 + + @property + def disk1(self): + """ + Returns the size (MB) for PCMCIA disk1. + + :returns: disk1 size (integer) + """ + + return self._disk1 + + @disk1.setter + def disk1(self, disk1): + """ + Set the size (MB) for PCMCIA disk1. + + :param disk1: disk1 size (integer) + """ + + self._hypervisor.send("vm set_disk1 {name} {disk1}".format(name=self._name, + disk1=disk1)) + self._disk1 = disk1 + + @property + def confreg(self): + """ + Returns the configuration register. + The default is 0x2102. + + :returns: configuration register value (string) + """ + + return self._confreg + + @confreg.setter + def confreg(self, confreg): + """ + Set the configuration register. + + :param confreg: configuration register value (string) + """ + + self._hypervisor.send("vm set_conf_reg {name} {confreg}".format(name=self._name, + confreg=confreg)) + self._confreg = confreg + + @property + def console(self): + """ + Returns the TCP console port. + + :returns: console port (integer) + """ + + return self._console + + @console.setter + def console(self, console): + """ + Set the TCP console port. + + :param console: console port (integer) + """ + + if console == self._console: + return + + self._hypervisor.send("vm set_con_tcp_port {name} {console}".format(name=self._name, + console=console)) + self._console = console + + @property + def aux(self): + """ + Returns the TCP auxiliary port. + + :returns: console auxiliary port (integer) + """ + + return self._aux + + @aux.setter + def aux(self, aux): + """ + Set the TCP auxiliary port. + + :param aux: console auxiliary port (integer) + """ + + if aux == self._aux: + return + + self._hypervisor.send("vm set_aux_tcp_port {name} {aux}".format(name=self._name, + aux=aux)) + self._aux = aux + + def get_cpu_info(self, cpu_id=0): + """ + Shows info about the CPU identified by cpu_id. + The boot CPU (which is typically the only CPU) has ID 0. + + :returns: ? (could not test) + """ + + # FIXME: nothing returned by Dynamips. + return self._hypervisor.send("vm cpu_info {name} {cpu_id}".format(name=self._name, + cpu_id=cpu_id)) + + def get_cpu_usage(self, cpu_id=0): + """ + Shows cpu usage in seconds, "cpu_id" is ignored. + + :returns: cpu usage in seconds + """ + + return int(self._hypervisor.send("vm cpu_usage {name} {cpu_id}".format(name=self._name, + cpu_id=cpu_id))[0]) + + def send_console_msg(self, message): + """ + Sends a message to the console. + + :param message: message to send to the console + """ + + self._hypervisor.send("vm send_con_msg {name} {message}".format(name=self._name, + message=message)) + + def send_aux_msg(self, message): + """ + Sends a message to the auxiliary console. + + :param message: message to send to the auxiliary console + """ + + self._hypervisor.send("vm send_aux_msg {name} {message}".format(name=self._name, + message=message)) + + @property + def mac_addr(self): + """ + Returns the MAC address. + + :returns: the MAC address (hexadecimal format: hh:hh:hh:hh:hh:hh) + """ + + return self._mac_addr + + @mac_addr.setter + def mac_addr(self, mac_addr): + """ + Set the MAC address. + + :param mac_addr: a MAC address (hexadecimal format: hh:hh:hh:hh:hh:hh) + """ + + self._hypervisor.send("{platform} set_mac_addr {name} {mac_addr}".format(platform=self._platform, + name=self._name, + mac_addr=mac_addr)) + self._mac_addr = mac_addr + + @property + def system_id(self): + """ + Returns the system ID. + + :returns: the system ID (also called board processor ID) + """ + + return self._system_id + + @system_id.setter + def system_id(self, system_id): + """ + Set the system ID. + + :param system_id: a system ID (also called board processor ID) + """ + + self._hypervisor.send("{platform} set_system_id {name} {system_id}".format(platform=self._platform, + name=self._name, + system_id=system_id)) + self._system_id = system_id + + def get_hardware_info(self): + """ + Get some hardware info about this router. + + :returns: ? (could not test) + """ + + # FIXME: nothing returned by Dynamips. + return (self._hypervisor.send("{platform} show_hardware {name}".format(platform=self._platform, + name=self._name))) + + def get_slot_bindings(self): + """ + Returns slot bindings. + + :returns: slot bindings (adapter names) list + """ + + return (self._hypervisor.send("vm slot_bindings {}".format(self._name))) + + def slot_add_binding(self, slot_id, adapter): + """ + Adds a slot binding. + + :param slot_id: slot ID + :param adapter: device to add in the corresponding slot (object) + """ + + try: + slot = self._slots[slot_id] + except IndexError: + raise DynamipsError("Slot {slot_id} doesn't exist on router {name}".format(name=self._name, + slot_id=slot_id)) + + if slot != None: + current_adapter = slot + raise DynamipsError("Slot {slot_id} is already occupied by adapter {adapter} on router {name}".format(name=self._name, + slot_id=slot_id, + adapter=current_adapter)) + + self._hypervisor.send("vm slot_add_binding {name} {slot_id} 0 {adapter}".format(name=self._name, + slot_id=slot_id, + adapter=adapter)) + self._slots[slot_id] = adapter + + # Generate an OIR event if the router is running and + # only for c7200, c3600 and c3745 (NM-4T only) + if self.is_running() and self._platform == 'c7200' \ + or (self._platform == 'c3600' and self.chassis == '3660') \ + or (self._platform == 'c3745' and adapter == 'NM-4T'): + + self._hypervisor.send("vm slot_oir_start {name} {slot_id} 0".format(name=self._name, + slot_id=slot_id)) + + def slot_remove_binding(self, slot_id): + """ + Removes a slot binding. + + :param slot_id: slot ID + """ + + try: + slot = self._slots[slot_id] + except IndexError: + raise DynamipsError("Slot {slot_id} doesn't exist on router {name}".format(name=self._name, + slot_id=slot_id)) + + if slot == None: + return + + # Generate an OIR event if the router is running and + # only for c7200, c3600 and c3745 (NM-4T only) + if self.is_running() and self._platform == 'c7200' \ + or (self._platform == 'c3600' and self.chassis == '3660') \ + or (self._platform == 'c3745' and slot == 'NM-4T'): + + self._hypervisor.send("vm slot_oir_stop {name} {slot_id} 0".format(name=self._name, + slot_id=slot_id)) + + self._hypervisor.send("vm slot_remove_binding {name} {slot_id} 0".format(name=self._name, + slot_id=slot_id)) + self._slots[slot_id] = None + + def install_wic(self, wic_slot_id, wic): + """ + Installs a WIC adapter into this router. + + :param wic_slot_id: WIC slot ID + :param wic: WIC to be install (object) + """ + + # WICs are always installed on adapters in slot 0 + slot_id = 0 + + # Do not check if slot has an adapter because adapters with WICs interfaces + # must be inserted by default in the router and cannot be removed. + adapter = self._slots[slot_id] + + if wic_slot_id > len(adapter.wics) - 1: + raise DynamipsError("WIC slot {wic_slot_id} doesn't exist".format(name=self._name, + wic_slot_id=wic_slot_id)) + + if not adapter.wic_slot_available(wic_slot_id): + raise DynamipsError("WIC slot {wic_slot_id} is already occupied by another WIC".format(name=self._name, + wic_slot_id=wic_slot_id)) + + # Dynamips WICs slot IDs start on a multiple of 16 + # WIC1 = 16, WIC2 = 32 and WIC3 = 48 + internal_wic_slot_id = 16 * (wic_slot_id + 1) + self._hypervisor.send("vm slot_add_binding {name} {slot_id} {wic_slot_id} {wic}".format(name=self._name, + slot_id=slot_id, + wic_slot_id=internal_wic_slot_id, + wic=wic)) + adapter.install_wic(wic_slot_id, wic) + + def uninstall_wic(self, wic_slot_id): + """ + Uninstalls a WIC adapter from this router. + + :param wic_slot_id: WIC slot ID + """ + + # WICs are always installed on adapters in slot 0 + slot_id = 0 + + # Do not check if slot has an adapter because adapters with WICs interfaces + # must be inserted by default in the router and cannot be removed. + adapter = self._slots[slot_id] + + if wic_slot_id > len(adapter.wics) - 1: + raise DynamipsError("WIC slot {wic_slot_id} doesn't exist".format(name=self._name, + wic_slot_id=wic_slot_id)) + + if adapter.wic_slot_available(wic_slot_id): + raise DynamipsError("No WIC is installed in WIC slot {wic_slot_id}".format(name=self._name, + wic_slot_id=wic_slot_id)) + # Dynamips WICs slot IDs start on a multiple of 16 + # WIC1 = 16, WIC2 = 32 and WIC3 = 48 + internal_wic_slot_id = 16 * (wic_slot_id + 1) + self._hypervisor.send("vm slot_remove_binding {name} {slot_id} {wic_slot_id}".format(name=self._name, + slot_id=slot_id, + wic_slot_id=internal_wic_slot_id)) + adapter.uninstall_wic(wic_slot_id) + + def get_slot_nio_bindings(self, slot_id): + """ + Returns slot NIO bindings. + + :param slot_id: slot ID + + :returns: list of NIO bindings + """ + + return (self._hypervisor.send("vm slot_nio_bindings {name} {slot_id}".format(name=self._name, + slot_id=slot_id))) + + def slot_add_nio_binding(self, slot_id, port_id, nio): + """ + Adds a slot NIO binding. + + :param slot_id: slot ID + :param port_id: port ID + :param nio: NIO to add to the slot/port (object) + """ + + try: + adapter = self._slots[slot_id] + except IndexError: + raise DynamipsError("Slot {slot_id} doesn't exist on router {name}".format(name=self._name, + slot_id=slot_id)) + if not adapter.port_exists(port_id): + raise DynamipsError("Port {port_id} doesn't exist in adapter {adapter}".format(adapter=adapter, + port_id=port_id)) + + self._hypervisor.send("vm slot_add_nio_binding {name} {slot_id} {port_id} {nio}".format(name=self._name, + slot_id=slot_id, + port_id=port_id, + nio=nio)) + self.slot_enable_nio(slot_id, port_id) + adapter.add_nio(port_id, nio) + + def slot_remove_nio_binding(self, slot_id, port_id): + """ + Removes a slot NIO binding. + + :param slot_id: slot ID + :param port_id: port ID + """ + + try: + adapter = self._slots[slot_id] + except IndexError: + raise DynamipsError("Slot {slot_id} doesn't exist on router {name}".format(name=self._name, + slot_id=slot_id)) + if not adapter.port_exists(port_id): + raise DynamipsError("Port {port_id} doesn't exist in adapter {adapter}".format(adapter=adapter, + port_id=port_id)) + + self.slot_disable_nio(slot_id, port_id) + self._hypervisor.send("vm slot_remove_binding {name} {slot_id} {port_id}".format(name=self._name, + slot_id=slot_id, + port_id=port_id)) + + adapter.remove_nio(port_id) + + def slot_enable_nio(self, slot_id, port_id): + """ + Enables a slot NIO binding. + + :param slot_id: slot ID + :param port_id: port ID + """ + + if self.is_running(): # running router + self._hypervisor.send("vm slot_enable_nio {name} {slot_id} {port_id}".format(name=self._name, + slot_id=slot_id, + port_id=port_id)) + + def slot_disable_nio(self, slot_id, port_id): + """ + Disables a slot NIO binding. + + :param slot_id: slot ID + :param port_id: port ID + """ + + if self.is_running(): # running router + self._hypervisor.send("vm slot_disable_nio {name} {slot_id} {port_id}".format(name=self._name, + slot_id=slot_id, + port_id=port_id)) + + def _create_slots(self, numslots): + """ + Creates the appropriate number of slots for this router. + + :param numslots: number of slots to create + """ + + self._slots = numslots * [None] + + @property + def slots(self): + """ + Returns the slots for this router. + + :return: slot list + """ + + return self._slots diff --git a/gns3server/stomp/frame.py b/gns3server/stomp/frame.py deleted file mode 100644 index 90d83e48..00000000 --- a/gns3server/stomp/frame.py +++ /dev/null @@ -1,161 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -""" -STOMP frame representation, decoding and encoding -http://stomp.github.io/stomp-specification-1.2.html -Adapted from Jason R. Briggs's code -https://github.com/jasonrbriggs/stomp.py -""" - -import re -from .utils import encode - - -class Frame(object): - """ - A STOMP frame. Comprises a command, the headers and the body content. - """ - - # Used to parse STOMP header lines in the format "key:value", - HEADER_LINE_RE = re.compile('(?P[^:]+)[:](?P.*)') - # As of STOMP 1.2, lines can end with either line feed, or carriage return plus line feed. - PREAMBLE_END_RE = re.compile('\n\n|\r\n\r\n') - # As of STOMP 1.2, lines can end with either line feed, or carriage return plus line feed. - LINE_END_RE = re.compile('\n|\r\n') - # NULL value - NULL = b'\x00' - - def __init__(self, cmd=None, headers={}, body=None): - self._cmd = cmd - self._headers = headers - self._body = body - - @property - def cmd(self): - - return(self._cmd) - - @cmd.setter - def cmd(self, cmd): - - self._cmd = cmd - - @property - def headers(self): - - return(self._headers) - - @headers.setter - def headers(self, headers): - - self._headers = headers - - @property - def body(self): - - return(self._body) - - @body.setter - def body(self, body): - - self._body = body - - def encode(self): - """ - Encodes this frame to be send on the wire - """ - - lines = [] - if self._cmd: - lines.append(self._cmd) - lines.append("\n") - for key, vals in sorted(self._headers.items()): - if type(vals) != tuple: - vals = (vals,) - for val in vals: - lines.append("%s:%s\n" % (key, val)) - lines.append("\n") - if self._body: - lines.append(self._body) - - if self._cmd: - lines.append(self.NULL) - - encoded_lines = (encode(line) for line in lines) - return b''.join(encoded_lines) - - @classmethod - def parse_headers(cls, lines, offset=0): - """ - Parses frame headers - - :param lines: Frame preamble lines - :param offset: To start parsing at the given offset - - :returns: Headers in dict header:value - """ - - headers = {} - for header_line in lines[offset:]: - header_match = cls.HEADER_LINE_RE.match(header_line) - if header_match: - key = header_match.group('key') - if key not in headers: - headers[key] = header_match.group('value') - return headers - - @classmethod - def parse_frame(cls, frame): - """ - Parses a frame - - :params frame: The frame data to be parsed - - :returns: STOMP Frame object - """ - - f = Frame() - # End-of-line (EOL) indicates an heart beat frame - if frame == '\x0a': - f.cmd = 'heartbeat' # This will have the frame ignored - return f - - mat = cls.PREAMBLE_END_RE.search(frame) - preamble_end = -1 - if mat: - preamble_end = mat.start() - if preamble_end == -1: - preamble_end = len(frame) - preamble = frame[0:preamble_end] - preamble_lines = cls.LINE_END_RE.split(preamble) - f.body = frame[preamble_end + 2:] - if f.body[-1] == '\x00': - f.body = f.body[:-1] - - # Skip any leading newlines - first_line = 0 - while first_line < len(preamble_lines) and len(preamble_lines[first_line]) == 0: - first_line += 1 - - # Extract frame type/command - f.cmd = preamble_lines[first_line] - - # Put headers into a key/value map - f.headers = cls.parse_headers(preamble_lines, first_line + 1) - - return f diff --git a/gns3server/stomp/protocol.py b/gns3server/stomp/protocol.py deleted file mode 100644 index 0491c1bf..00000000 --- a/gns3server/stomp/protocol.py +++ /dev/null @@ -1,234 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2013 GNS3 Technologies Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -""" -Basic STOMP 1.2 protocol implementation -http://stomp.github.io/stomp-specification-1.2.html -""" - -import uuid -from .frame import Frame -from .utils import encode, hasbyte - -# Commands server-side -CMD_CONNECTED = 'CONNECTED' -CMD_ERROR = 'ERROR' -CMD_MESSAGE = 'MESSAGE' -CMD_RECEIPT = 'RECEIPT' - -# Commands client-side -CMD_STOMP = 'STOMP' -CMD_CONNECT = 'CONNECT' -CMD_DISCONNECT = 'DISCONNECT' -CMD_SEND = 'SEND' - -# Commands not supported -CMD_SUBSCRIBE = 'SUBSCRIBE' -CMD_UNSUBSCRIBE = 'UNSUBSCRIBE' -CMD_ACK = 'ACK' -CMD_NACK = 'NACK' -CMD_BEGIN = 'BEGIN' -CMD_ABORT = 'ABORT' - -# Headers -HDR_VERSION = 'version' -HDR_SESSION = 'session' -HDR_SERVER = 'server' -HDR_CONTENT_TYPE = 'content-type' -HDR_CONTENT_LENGTH = 'content-length' -HDR_RECEIPT_ID = 'receipt-id' -HDR_MESSAGE = 'message' -HDR_MESSAGE_ID = 'message-id' -HDR_ACCEPT_VERSION = 'accept-version' -HDR_HOST = 'host' -HDR_DESTINATION = 'destination' -HDR_RECEIPT = 'receipt' - -# Headers not supported -HDR_HEARTBEAT = 'heart-beat' -HDR_LOGIN = 'login' -HDR_PASSCODE = 'passcode' -HDR_ID = 'id' -HDR_ACK = 'ack' -HDR_SUBSCRIPTION = 'subscription' -HDR_TRANSACTION = 'transaction' - - -class serverProtocol(object): - """ - STOMP 1.2 protocol support for servers. - """ - - def __init__(self): - - # STOMP protocol version - self.version = 1.2 - - def connected(self, session=None, server=None): - """ - Replies to the CONNECT or STOMP command. - Heart-beat header is not supported. - - :param session: A session identifier that uniquely identifies the session. - :param server: A field that contains information about the STOMP server. - - :returns: STOMP Frame object - """ - - # Version header is required - headers = {HDR_VERSION: self.version} - - if session: - headers[HDR_SESSION] = session - - # The server-name field consists of a name token followed by an - # optional version number token. Example: Apache/1.3.9 - if server: - headers[HDR_SERVER] = server - - return Frame(CMD_CONNECTED, headers).encode() - - def message(self, destination, body, content_type=None, message_id=str(uuid.uuid4())): - """ - Sends a message to a STOMP client. - - :param destination: Destination string - :param body: Data to be added in the frame body - :param content_type: MIME type which describes the format of the body - :param message_id: Unique identifier for that message - - :returns: STOMP Frame object - """ - - # Destination and message id headers are required - headers = {HDR_DESTINATION: destination, - HDR_MESSAGE_ID: message_id} - - # Subscription is required but not implemented on this server - headers[HDR_SUBSCRIPTION] = 0 - - if content_type: - headers[HDR_CONTENT_TYPE] = content_type - - body = encode(body) - if HDR_CONTENT_LENGTH not in headers and hasbyte(0, body): - headers[HDR_CONTENT_LENGTH] = len(body) - - return Frame(CMD_MESSAGE, headers, body).encode() - - def receipt(self, receipt_id): - """ - Sends an acknowledgment for client frame that requests a receipt. - - :param receipt_id: Receipt ID to send back to the client - - :returns: STOMP Frame object - """ - - # Receipt ID header is required (the same sent in the client frame) - headers = {HDR_RECEIPT_ID: receipt_id} - return Frame(CMD_RECEIPT, headers).encode() - - def error(self, message='', body='', content_type=None): - """ - Sends an error to the client if something goes wrong. - - :param message: Short description of the error - :param body: Detailed information - :param content_type: MIME type which describes the format of the body - - :returns: STOMP Frame object - """ - - headers = {} - if message: - headers[HDR_MESSAGE] = message - - if body: - body = encode(body) - if HDR_CONTENT_LENGTH not in headers and hasbyte(0, body): - headers[HDR_CONTENT_LENGTH] = len(body) - if content_type: - headers[HDR_CONTENT_TYPE] = content_type - - return Frame(CMD_ERROR, headers, body).encode() - - -class clientProtocol(object): - """ - STOMP 1.2 protocol support for clients. - """ - - def connect(self, host, accept_version='1.2'): - """ - Connects to a STOMP server. - Heart-beat, login and passcode headers are not supported. - - :param host: Host name that the socket was established against. - :param accept_version: The versions of the STOMP protocol the client supports. - - :returns: STOMP Frame object - """ - - # Currently only STOMP 1.2 is supported (required header) - headers = {HDR_ACCEPT_VERSION: accept_version} - - if host: - headers[HDR_HOST] = host - - # The STOMP command is not backward compatible with STOMP 1.0 servers. - # Clients that use the STOMP frame instead of the CONNECT frame will - # only be able to connect to STOMP 1.2 servers (as well as some STOMP 1.1 servers. - return Frame(CMD_STOMP, headers).encode() - - def disconnect(self, receipt=str(uuid.uuid4())): - """ - Disconnects to a STOMP server. - - :param receipt: unique identifier - - :returns: STOMP Frame object - """ - - # Receipt header is required - headers = {HDR_RECEIPT: receipt} - return Frame(CMD_DISCONNECT, headers).encode() - - def send(self, destination, body, content_type=None): - """ - Sends a message to a destination in the messaging system. - Transaction header is not supported. - User defined headers are not supported too (against the protocol specification) - - :param destination: Destination string - :param body: Data to be added in the frame body - :param content_type: MIME type which describes the format of the body - - :returns: STOMP Frame object - """ - - # Destination header is required - headers = {HDR_DESTINATION: destination} - - if content_type: - headers[HDR_CONTENT_TYPE] = content_type - - body = encode(body) - if HDR_CONTENT_LENGTH not in headers and hasbyte(0, body): - headers[HDR_CONTENT_LENGTH] = len(body) - - return Frame(CMD_SEND, headers, body).encode() diff --git a/gns3server/topology.py b/gns3server/topology.py new file mode 100644 index 00000000..e14ce555 --- /dev/null +++ b/gns3server/topology.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +#import networkx as nx + + +class Topology(object): + + def __init__(self): + + pass + #self._topology = nx.Graph() + + def add_node(self, node): + + self._topology.add_node(node) + + def remove_node(self, node): + + self._topology.remove_node(node) + + def clear(self): + + self._topology.clear() + + def __str__(self): + + return "GNS3 network topology" + + @staticmethod + def instance(): + + if not hasattr(Topology, "_instance"): + Topology._instance = Topology() + return Topology._instance diff --git a/tests/dynamips/.gitignore b/tests/dynamips/.gitignore new file mode 100644 index 00000000..39ffa4b5 --- /dev/null +++ b/tests/dynamips/.gitignore @@ -0,0 +1 @@ +/c3725.image diff --git a/tests/dynamips/conftest.py b/tests/dynamips/conftest.py new file mode 100644 index 00000000..9d7f294a --- /dev/null +++ b/tests/dynamips/conftest.py @@ -0,0 +1,30 @@ +from gns3server.modules.dynamips import HypervisorManager +import pytest +import os + + +@pytest.fixture(scope="module") +def hypervisor(request): + + cwd = os.path.dirname(os.path.abspath(__file__)) + dynamips_path = os.path.join(cwd, "dynamips.stable") + print("\nStarting Dynamips Hypervisor: {}".format(dynamips_path)) + manager = HypervisorManager(dynamips_path, "/tmp", base_port=9000) + hypervisor = manager.start_new_hypervisor() + + def stop(): + print("\nStopping Dynamips Hypervisor") + manager.stop_all_hypervisors() + + request.addfinalizer(stop) + return hypervisor + + +@pytest.fixture(scope="session") +def image(request): + + cwd = os.path.dirname(os.path.abspath(__file__)) + image_path = os.path.join(cwd, "c3725.image") + if not os.path.exists(image_path): + return None + return image_path diff --git a/tests/dynamips/dynamips.stable b/tests/dynamips/dynamips.stable new file mode 100755 index 0000000000000000000000000000000000000000..df7950ca571293a9920c72b6166c00a4b2542504 GIT binary patch literal 961258 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.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�#hCSTpy$eD2_f$A|8P_(LS5`#)$Vq?;wXx04S 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 {6q7#_U%U!&MqGHP(^Xw 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ⅈC*M18xquJ%YE6Y8TcJ65&+Wy3wRLB!8 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

J(a6 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 literal 0 HcmV?d00001 diff --git a/tests/dynamips/test_atm_bridge.py b/tests/dynamips/test_atm_bridge.py new file mode 100644 index 00000000..8b84fe61 --- /dev/null +++ b/tests/dynamips/test_atm_bridge.py @@ -0,0 +1,62 @@ +from gns3server.modules.dynamips import ATMBridge +from gns3server.modules.dynamips import NIO_Null +from gns3server.modules.dynamips import DynamipsError +import pytest + + +@pytest.fixture +def atm_bridge(request, hypervisor): + + atm_bridge = ATMBridge(hypervisor, "ATM bridge") + request.addfinalizer(atm_bridge.delete) + return atm_bridge + + +def test_atm_bridge_exists(atm_bridge): + + assert atm_bridge.list() + + +def test_rename_atm_bridge(atm_bridge): + + atm_bridge.rename("new ATM bridge") + assert atm_bridge.name == "new ATM bridge" + + +def test_add_remove_nio(atm_bridge): + + nio = NIO_Null(atm_bridge.hypervisor) + atm_bridge.add_nio(nio, 0) # add NIO on port 0 + assert atm_bridge.nios + atm_bridge.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_add_nio_already_allocated_port(atm_bridge): + + nio = NIO_Null(atm_bridge.hypervisor) + atm_bridge.add_nio(nio, 0) # add NIO on port 0 + with pytest.raises(DynamipsError): + atm_bridge.add_nio(nio, 0) + nio.delete() + + +def test_remove_nio_non_allocated_port(atm_bridge): + + with pytest.raises(DynamipsError): + atm_bridge.remove_nio(0) # remove NIO from port 0 + + +def test_bridge(atm_bridge): + + nio1 = NIO_Null(atm_bridge.hypervisor) + atm_bridge.add_nio(nio1, 0) # add NIO on port 0 (Ethernet NIO) + nio2 = NIO_Null(atm_bridge.hypervisor) + atm_bridge.add_nio(nio1, 1) # add NIO on port 1 (ATM NIO) + atm_bridge.configure(0, 1, 10, 10) # configure Ethernet port 0 -> ATM port 1 with VC 10:10 + assert atm_bridge.mapping[0] == (1, 10, 10) + atm_bridge.unconfigure() + atm_bridge.remove_nio(0) + atm_bridge.remove_nio(1) + nio1.delete() + nio2.delete() diff --git a/tests/dynamips/test_atm_switch.py b/tests/dynamips/test_atm_switch.py new file mode 100644 index 00000000..8d2f92f6 --- /dev/null +++ b/tests/dynamips/test_atm_switch.py @@ -0,0 +1,83 @@ +from gns3server.modules.dynamips import ATMSwitch +from gns3server.modules.dynamips import NIO_Null +from gns3server.modules.dynamips import DynamipsError +import pytest + + +@pytest.fixture +def atmsw(request, hypervisor): + + atmsw = ATMSwitch(hypervisor, "ATM switch") + request.addfinalizer(atmsw.delete) + return atmsw + + +def test_atmsw_exists(atmsw): + + assert atmsw.list() + + +def test_rename_atmsw(atmsw): + + atmsw.rename("new ATM switch") + assert atmsw.name == "new ATM switch" + + +def test_add_remove_nio(atmsw): + + nio = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio, 0) # add NIO on port 0 + assert atmsw.nios + atmsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_add_nio_already_allocated_port(atmsw): + + nio = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio, 0) # add NIO on port 0 + with pytest.raises(DynamipsError): + atmsw.add_nio(nio, 0) + nio.delete() + + +def test_remove_nio_non_allocated_port(atmsw): + + with pytest.raises(DynamipsError): + atmsw.remove_nio(0) # remove NIO from port 0 + + +def test_vp(atmsw): + + nio1 = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio1, 0) # add NIO on port 0 + nio2 = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio1, 1) # add NIO on port 1 + atmsw.map_vp(0, 10, 1, 20) # port 0 VP 10 to port 1 VP 20 (unidirectional) + atmsw.map_vp(1, 20, 0, 10) # port 1 VP 20 to port 0 VP 10 (unidirectional) + assert atmsw.mapping[(0, 10)] == (1, 20) + assert atmsw.mapping[(1, 20)] == (0, 10) + atmsw.unmap_vp(0, 10, 1, 20) # port 0 VP 10 to port 1 VP 20 (unidirectional) + atmsw.unmap_vp(1, 20, 0, 10) # port 1 VP 20 to port 0 VP 10 (unidirectional) + atmsw.remove_nio(0) + atmsw.remove_nio(1) + nio1.delete() + nio2.delete() + + +def test_pvc(atmsw): + + nio1 = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio1, 0) # add NIO on port 0 + nio2 = NIO_Null(atmsw.hypervisor) + atmsw.add_nio(nio1, 1) # add NIO on port 1 + atmsw.map_pvc(0, 10, 10, 1, 20, 20) # port 0 VC 10:10 to port 1 VP 20:20 (unidirectional) + atmsw.map_pvc(1, 20, 20, 0, 10, 10) # port 1 VC 20:20 to port 0 VC 10:10 (unidirectional) + assert atmsw.mapping[(0, 10, 10)] == (1, 20, 20) + assert atmsw.mapping[(1, 20, 20)] == (0, 10, 10) + atmsw.unmap_pvc(0, 10, 10, 1, 20, 20) # port 0 VC 10:10 to port 1 VP 20:20 (unidirectional) + atmsw.unmap_pvc(1, 20, 20, 0, 10, 10) # port 1 VC 20:20 to port 0 VC 10:10 (unidirectional) + atmsw.remove_nio(0) + atmsw.remove_nio(1) + nio1.delete() + nio2.delete() diff --git a/tests/dynamips/test_bridge.py b/tests/dynamips/test_bridge.py new file mode 100644 index 00000000..6ab07ee1 --- /dev/null +++ b/tests/dynamips/test_bridge.py @@ -0,0 +1,31 @@ +from gns3server.modules.dynamips import Bridge +from gns3server.modules.dynamips import NIO_Null +import pytest + + +@pytest.fixture +def bridge(request, hypervisor): + + bridge = Bridge(hypervisor, "bridge") + request.addfinalizer(bridge.delete) + return bridge + + +def test_bridge_exists(bridge): + + assert bridge.list() + + +def test_rename_bridge(bridge): + + bridge.rename("new bridge") + assert bridge.name == "new bridge" + + +def test_add_remove_nio(bridge): + + nio = NIO_Null(bridge.hypervisor) + bridge.add_nio(nio) + assert bridge.nios + bridge.remove_nio(nio) + nio.delete() diff --git a/tests/dynamips/test_c1700.py b/tests/dynamips/test_c1700.py new file mode 100644 index 00000000..2202a50f --- /dev/null +++ b/tests/dynamips/test_c1700.py @@ -0,0 +1,167 @@ +from gns3server.modules.dynamips import C1700 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import WIC_2T +from gns3server.modules.dynamips import WIC_1ENET +from gns3server.modules.dynamips import NIO_Null +import pytest + + +@pytest.fixture +def router_c1700(request, hypervisor): + + router = C1700(hypervisor, "c1700 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c1700): + + assert router_c1700.platform == "c1700" + assert router_c1700.list() + + +def test_chassis_1721(hypervisor): + + router = C1700(hypervisor, "1721 chassis", chassis="1721") + assert router.chassis == "1721" + assert str(router.slots[0]) == "C1700-MB-1FE" + router.delete() + + +def test_chassis_change_to_1721(router_c1700): + + assert router_c1700.chassis == "1720" # default chassis + router_c1700.chassis = "1721" + assert router_c1700.chassis == "1721" + + +def test_chassis_1750(hypervisor): + + router = C1700(hypervisor, "1750 chassis", chassis="1750") + assert router.chassis == "1750" + assert str(router.slots[0]) == "C1700-MB-1FE" + router.delete() + + +def test_chassis_change_to_1750(router_c1700): + + assert router_c1700.chassis == "1720" # default chassis + router_c1700.chassis = "1750" + assert router_c1700.chassis == "1750" + + +def test_chassis_1751(hypervisor): + + router = C1700(hypervisor, "1751 chassis", chassis="1751") + assert router.chassis == "1751" + assert str(router.slots[0]) == "C1700-MB-1FE" + router.delete() + + +def test_chassis_change_to_1751(router_c1700): + + assert router_c1700.chassis == "1720" # default chassis + router_c1700.chassis = "1751" + assert router_c1700.chassis == "1751" + + +def test_chassis_1760(hypervisor): + + router = C1700(hypervisor, "1760 chassis", chassis="1760") + assert router.chassis == "1760" + assert str(router.slots[0]) == "C1700-MB-1FE" + router.delete() + + +def test_chassis_change_to_1760(router_c1700): + + assert router_c1700.chassis == "1720" # default chassis + router_c1700.chassis = "1760" + assert router_c1700.chassis == "1760" + + +def test_iomem(router_c1700): + + assert router_c1700.iomem == 15 # default value + router_c1700.iomem = 20 + assert router_c1700.iomem == 20 + + +def test_mac_addr(router_c1700): + + assert router_c1700.mac_addr == None # default value + router_c1700.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c1700.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c1700): + + with pytest.raises(DynamipsError): + router_c1700.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c1700): + + assert router_c1700.system_id == None # default value + router_c1700.system_id = "FTX0945W0MO" + assert router_c1700.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c1700): + + router_c1700.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_install_remove_wic(router_c1700): + + wic = WIC_2T() + router_c1700.install_wic(0, wic) # install in WIC slot 0 + assert router_c1700.slots[0].wics[0] + wic = WIC_1ENET() + router_c1700.install_wic(1, wic) # install in WIC slot 1 + assert router_c1700.slots[0].wics[1] + router_c1700.uninstall_wic(0) # uninstall WIC from slot 0 + assert not router_c1700.slots[0].wics[0] + + +def test_install_wic_into_wrong_slot(router_c1700): + + wic = WIC_2T() + with pytest.raises(DynamipsError): + router_c1700.install_wic(2, wic) # install in WIC slot 2 + + +def test_install_wic_into_already_occupied_slot(router_c1700): + + wic = WIC_2T() + router_c1700.install_wic(0, wic) # install in WIC slot 0 + wic = WIC_1ENET() + with pytest.raises(DynamipsError): + router_c1700.install_wic(0, wic) # install in WIC slot 0 + + +def test_wic_add_remove_nio_binding(router_c1700): + + nio = NIO_Null(router_c1700.hypervisor) + wic = WIC_2T() + router_c1700.install_wic(0, wic) # install WIC in slot 0 + router_c1700.slot_add_nio_binding(0, 17, nio) # slot 0/17 (slot 0, wic 0, port 1) + assert router_c1700.slots[0].ports[17] == nio + assert router_c1700.get_slot_nio_bindings(slot_id=0) + router_c1700.slot_remove_nio_binding(0, 17) # slot 0/17 (slot 0, wic 0, port 1) + assert not router_c1700.get_slot_nio_bindings(slot_id=0) + assert not router_c1700.slots[0].ports[17] == nio + nio.delete() + + +def test_wic_add_remove_nio_binding_for_chassis_1760(hypervisor): + + router = C1700(hypervisor, "1760 chassis", chassis="1760") + nio = NIO_Null(router.hypervisor) + wic = WIC_2T() + router.install_wic(1, wic) # install WIC in slot 1 + router.slot_add_nio_binding(0, 32, nio) # slot 0/17 (slot 0, wic 1, port 0) + router.slot_remove_nio_binding(0, 32) + assert not router.get_slot_nio_bindings(slot_id=0) + nio.delete() + router.delete() diff --git a/tests/dynamips/test_c2600.py b/tests/dynamips/test_c2600.py new file mode 100644 index 00000000..d17ee345 --- /dev/null +++ b/tests/dynamips/test_c2600.py @@ -0,0 +1,216 @@ +from gns3server.modules.dynamips import C2600 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import NM_1E +from gns3server.modules.dynamips import NM_4E +from gns3server.modules.dynamips import NM_1FE_TX +from gns3server.modules.dynamips import NM_16ESW +import pytest + + +@pytest.fixture +def router_c2600(request, hypervisor): + + router = C2600(hypervisor, "c2600 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c2600): + + assert router_c2600.platform == "c2600" + assert router_c2600.list() + + +def test_chassis_2611(hypervisor): + + router = C2600(hypervisor, "2611 chassis", chassis="2611") + assert router.chassis == "2611" + assert isinstance(router.slots[0], router.integrated_adapters["2611"]) + router.delete() + + +def test_chassis_change_to_2611(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2611" + assert router_c2600.chassis == "2611" + + +def test_chassis_2620(hypervisor): + + router = C2600(hypervisor, "2620 chassis", chassis="2620") + assert router.chassis == "2620" + assert isinstance(router.slots[0], router.integrated_adapters["2620"]) + router.delete() + + +def test_chassis_change_to_2620(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2620" + assert router_c2600.chassis == "2620" + + +def test_chassis_2621(hypervisor): + + router = C2600(hypervisor, "2621 chassis", chassis="2621") + assert router.chassis == "2621" + assert isinstance(router.slots[0], router.integrated_adapters["2621"]) + router.delete() + + +def test_chassis_change_to_2621(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2621" + assert router_c2600.chassis == "2621" + + +def test_chassis_2610XM(hypervisor): + + router = C2600(hypervisor, "2610XM chassis", chassis="2610XM") + assert router.chassis == "2610XM" + assert isinstance(router.slots[0], router.integrated_adapters["2610XM"]) + router.delete() + + +def test_chassis_change_to_2610XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2610XM" + assert router_c2600.chassis == "2610XM" + + +def test_chassis_2611XM(hypervisor): + + router = C2600(hypervisor, "2611XM chassis", chassis="2611XM") + assert router.chassis == "2611XM" + assert isinstance(router.slots[0], router.integrated_adapters["2611XM"]) + router.delete() + + +def test_chassis_change_to_2611XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2611XM" + assert router_c2600.chassis == "2611XM" + + +def test_chassis_2620XM(hypervisor): + + router = C2600(hypervisor, "2620XM chassis", chassis="2620XM") + assert router.chassis == "2620XM" + assert isinstance(router.slots[0], router.integrated_adapters["2620XM"]) + router.delete() + + +def test_chassis_change_to_2620XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2620XM" + assert router_c2600.chassis == "2620XM" + + +def test_chassis_2621XM(hypervisor): + + router = C2600(hypervisor, "2621XM chassis", chassis="2621XM") + assert router.chassis == "2621XM" + assert isinstance(router.slots[0], router.integrated_adapters["2621XM"]) + router.delete() + + +def test_chassis_change_to_2621XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2621XM" + assert router_c2600.chassis == "2621XM" + + +def test_chassis_2650XM(hypervisor): + + router = C2600(hypervisor, "2650XM chassis", chassis="2650XM") + assert router.chassis == "2650XM" + assert isinstance(router.slots[0], router.integrated_adapters["2650XM"]) + router.delete() + + +def test_chassis_change_to_2650XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2650XM" + assert router_c2600.chassis == "2650XM" + + +def test_chassis_2651XM(hypervisor): + + router = C2600(hypervisor, "2651XM chassis", chassis="2651XM") + assert router.chassis == "2651XM" + assert isinstance(router.slots[0], router.integrated_adapters["2651XM"]) + router.delete() + + +def test_chassis_change_to_2651XM(router_c2600): + + assert router_c2600.chassis == "2610" # default chassis + router_c2600.chassis = "2651XM" + assert router_c2600.chassis == "2651XM" + + +def test_iomem(router_c2600): + + assert router_c2600.iomem == 15 # default value + router_c2600.iomem = 20 + assert router_c2600.iomem == 20 + + +def test_mac_addr(router_c2600): + + assert router_c2600.mac_addr == None # default value + router_c2600.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c2600.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c2600): + + with pytest.raises(DynamipsError): + router_c2600.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c2600): + + assert router_c2600.system_id == None # default value + router_c2600.system_id = "FTX0945W0MO" + assert router_c2600.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c2600): + + router_c2600.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_NM_1E(router_c2600): + + adapter = NM_1E() + router_c2600.slot_add_binding(1, adapter) + assert router_c2600.slots[1] == adapter + + +def test_slot_add_NM_4E(router_c2600): + + adapter = NM_4E() + router_c2600.slot_add_binding(1, adapter) + assert router_c2600.slots[1] == adapter + + +def test_slot_add_NM_1FE_TX(router_c2600): + + adapter = NM_1FE_TX() + router_c2600.slot_add_binding(1, adapter) + assert router_c2600.slots[1] == adapter + + +def test_slot_add_NM_16ESW(router_c2600): + + adapter = NM_16ESW() + router_c2600.slot_add_binding(1, adapter) + assert router_c2600.slots[1] == adapter diff --git a/tests/dynamips/test_c2691.py b/tests/dynamips/test_c2691.py new file mode 100644 index 00000000..2af7e94a --- /dev/null +++ b/tests/dynamips/test_c2691.py @@ -0,0 +1,75 @@ +from gns3server.modules.dynamips import C2691 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import NM_1FE_TX +from gns3server.modules.dynamips import NM_4T +from gns3server.modules.dynamips import NM_16ESW +import pytest + + +@pytest.fixture +def router_c2691(request, hypervisor): + + router = C2691(hypervisor, "c2691 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c2691): + + assert router_c2691.platform == "c2691" + assert router_c2691.list() + + +def test_iomem(router_c2691): + + assert router_c2691.iomem == 5 # default value + router_c2691.iomem = 10 + assert router_c2691.iomem == 10 + + +def test_mac_addr(router_c2691): + + assert router_c2691.mac_addr == None # default value + router_c2691.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c2691.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c2691): + + with pytest.raises(DynamipsError): + router_c2691.mac_addr = "zz:zz:zz:zz:zz:zz" + + +# FIXME: no implemented within Dynamips +# def test_system_id(hypervisor): +# router = C2691(hypervisor, "test system id") +# assert router.system_id == None # default value +# router.system_id = "FTX0945W0MO" +# assert router.system_id == "FTX0945W0MO" +# router.delete() + + +def test_get_hardware_info(router_c2691): + + router_c2691.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_NM_1FE_TX(router_c2691): + + adapter = NM_1FE_TX() + router_c2691.slot_add_binding(1, adapter) + assert router_c2691.slots[1] == adapter + + +def test_slot_add_NM_4T(router_c2691): + + adapter = NM_4T() + router_c2691.slot_add_binding(1, adapter) + assert router_c2691.slots[1] == adapter + + +def test_slot_add_NM_16ESW(router_c2691): + + adapter = NM_16ESW() + router_c2691.slot_add_binding(1, adapter) + assert router_c2691.slots[1] == adapter diff --git a/tests/dynamips/test_c3600.py b/tests/dynamips/test_c3600.py new file mode 100644 index 00000000..f3bd06cb --- /dev/null +++ b/tests/dynamips/test_c3600.py @@ -0,0 +1,118 @@ +from gns3server.modules.dynamips import C3600 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import NM_1E +from gns3server.modules.dynamips import NM_4E +from gns3server.modules.dynamips import NM_1FE_TX +from gns3server.modules.dynamips import NM_16ESW +from gns3server.modules.dynamips import NM_4T +import pytest + + +@pytest.fixture +def router_c3600(request, hypervisor): + + router = C3600(hypervisor, "c3600 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exist(router_c3600): + + assert router_c3600.platform == "c3600" + assert router_c3600.list() + + +def test_chassis_3620(hypervisor): + + router = C3600(hypervisor, "3620 chassis", chassis="3620") + assert router.chassis == "3620" + router.delete() + + +def test_chassis_change_to_3620(router_c3600): + + assert router_c3600.chassis == "3640" # default chassis + router_c3600.chassis = "3620" + assert router_c3600.chassis == "3620" + + +def test_chassis_3660(hypervisor): + + router = C3600(hypervisor, "3660 chassis", chassis="3660") + assert router.chassis == "3660" + assert str(router.slots[0]) == "Leopard-2FE" + router.delete() + + +def test_chassis_change_to_3660(router_c3600): + + assert router_c3600.chassis == "3640" # default chassis + router_c3600.chassis = "3660" + assert router_c3600.chassis == "3660" + + +def test_iomem(router_c3600): + + assert router_c3600.iomem == 5 # default value + router_c3600.iomem = 10 + assert router_c3600.iomem == 10 + + +def test_mac_addr(router_c3600): + + assert router_c3600.mac_addr == None # default value + router_c3600.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c3600.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c3600): + + with pytest.raises(DynamipsError): + router_c3600.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c3600): + + assert router_c3600.system_id == None # default value + router_c3600.system_id = "FTX0945W0MO" + assert router_c3600.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c3600): + + router_c3600.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_NM_1E(router_c3600): + + adapter = NM_1E() + router_c3600.slot_add_binding(1, adapter) + assert router_c3600.slots[1] == adapter + + +def test_slot_add_NM_4E(router_c3600): + + adapter = NM_4E() + router_c3600.slot_add_binding(1, adapter) + assert router_c3600.slots[1] == adapter + + +def test_slot_add_NM_1FE_TX(router_c3600): + + adapter = NM_1FE_TX() + router_c3600.slot_add_binding(1, adapter) + assert router_c3600.slots[1] == adapter + + +def test_slot_add_NM_16ESW(router_c3600): + + adapter = NM_16ESW() + router_c3600.slot_add_binding(1, adapter) + assert router_c3600.slots[1] == adapter + + +def test_slot_add_NM_4T(router_c3600): + + adapter = NM_4T() + router_c3600.slot_add_binding(1, adapter) + assert router_c3600.slots[1] == adapter diff --git a/tests/dynamips/test_c3725.py b/tests/dynamips/test_c3725.py new file mode 100644 index 00000000..5bb6f6e9 --- /dev/null +++ b/tests/dynamips/test_c3725.py @@ -0,0 +1,73 @@ +from gns3server.modules.dynamips import C3725 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import NM_1FE_TX +from gns3server.modules.dynamips import NM_4T +from gns3server.modules.dynamips import NM_16ESW +import pytest + + +@pytest.fixture +def router_c3725(request, hypervisor): + + router = C3725(hypervisor, "c3725 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c3725): + + assert router_c3725.platform == "c3725" + assert router_c3725.list() + + +def test_iomem(router_c3725): + + assert router_c3725.iomem == 5 # default value + router_c3725.iomem = 10 + assert router_c3725.iomem == 10 + + +def test_mac_addr(router_c3725): + + assert router_c3725.mac_addr == None # default value + router_c3725.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c3725.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c3725): + + with pytest.raises(DynamipsError): + router_c3725.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c3725): + + assert router_c3725.system_id == None # default value + router_c3725.system_id = "FTX0945W0MO" + assert router_c3725.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c3725): + + router_c3725.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_NM_1FE_TX(router_c3725): + + adapter = NM_1FE_TX() + router_c3725.slot_add_binding(1, adapter) + assert router_c3725.slots[1] == adapter + + +def test_slot_add_NM_4T(router_c3725): + + adapter = NM_4T() + router_c3725.slot_add_binding(1, adapter) + assert router_c3725.slots[1] == adapter + + +def test_slot_add_NM_16ESW(router_c3725): + + adapter = NM_16ESW() + router_c3725.slot_add_binding(1, adapter) + assert router_c3725.slots[1] == adapter diff --git a/tests/dynamips/test_c3745.py b/tests/dynamips/test_c3745.py new file mode 100644 index 00000000..78cc53e3 --- /dev/null +++ b/tests/dynamips/test_c3745.py @@ -0,0 +1,73 @@ +from gns3server.modules.dynamips import C3745 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import NM_1FE_TX +from gns3server.modules.dynamips import NM_4T +from gns3server.modules.dynamips import NM_16ESW +import pytest + + +@pytest.fixture +def router_c3745(request, hypervisor): + + router = C3745(hypervisor, "c3745 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c3745): + + assert router_c3745.platform == "c3745" + assert router_c3745.list() + + +def test_iomem(router_c3745): + + assert router_c3745.iomem == 5 # default value + router_c3745.iomem = 10 + assert router_c3745.iomem == 10 + + +def test_mac_addr(router_c3745): + + assert router_c3745.mac_addr == None # default value + router_c3745.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c3745.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c3745): + + with pytest.raises(DynamipsError): + router_c3745.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c3745): + + assert router_c3745.system_id == None # default value + router_c3745.system_id = "FTX0945W0MO" + assert router_c3745.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c3745): + + router_c3745.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_NM_1FE_TX(router_c3745): + + adapter = NM_1FE_TX() + router_c3745.slot_add_binding(1, adapter) + assert router_c3745.slots[1] == adapter + + +def test_slot_add_NM_4T(router_c3745): + + adapter = NM_4T() + router_c3745.slot_add_binding(1, adapter) + assert router_c3745.slots[1] == adapter + + +def test_slot_add_NM_16ESW(router_c3745): + + adapter = NM_16ESW() + router_c3745.slot_add_binding(1, adapter) + assert router_c3745.slots[1] == adapter diff --git a/tests/dynamips/test_c7200.py b/tests/dynamips/test_c7200.py new file mode 100644 index 00000000..d3929188 --- /dev/null +++ b/tests/dynamips/test_c7200.py @@ -0,0 +1,188 @@ +from gns3server.modules.dynamips import C7200 +from gns3server.modules.dynamips import DynamipsError +from gns3server.modules.dynamips import PA_2FE_TX +from gns3server.modules.dynamips import PA_4E +from gns3server.modules.dynamips import PA_4T +from gns3server.modules.dynamips import PA_8E +from gns3server.modules.dynamips import PA_8T +from gns3server.modules.dynamips import PA_A1 +from gns3server.modules.dynamips import PA_FE_TX +from gns3server.modules.dynamips import PA_GE +from gns3server.modules.dynamips import PA_POS_OC3 +from gns3server.modules.dynamips import NIO_Null +import pytest + + +@pytest.fixture +def router_c7200(request, hypervisor): + + router = C7200(hypervisor, "c7200 router") + request.addfinalizer(router.delete) + return router + + +def test_router_exists(router_c7200): + + assert router_c7200.platform == "c7200" + assert router_c7200.list() + + +def test_npe(router_c7200): + + assert router_c7200.npe == "npe-400" # default value + router_c7200.npe = "npe-200" + assert router_c7200.npe == "npe-200" + + +def test_midplane(router_c7200): + + assert router_c7200.midplane == "vxr" # default value + router_c7200.midplane = "std" + assert router_c7200.midplane == "std" + + +def test_sensors(router_c7200): + + assert router_c7200.sensors == [22, 22, 22, 22] # default values (everything at 22C) + router_c7200.sensors = [25, 25, 25, 25] + assert router_c7200.sensors == [25, 25, 25, 25] + + +def test_power_supplies(router_c7200): + + assert router_c7200.power_supplies == [1, 1] # default values (1 = powered on) + router_c7200.power_supplies = [0, 0] + assert router_c7200.power_supplies == [0, 0] + + +def test_mac_addr(router_c7200): + + assert router_c7200.mac_addr == None # default value + router_c7200.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router_c7200.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router_c7200): + + with pytest.raises(DynamipsError): + router_c7200.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router_c7200): + + assert router_c7200.system_id == None # default value + router_c7200.system_id = "FTX0945W0MO" + assert router_c7200.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router_c7200): + + router_c7200.get_hardware_info() # FIXME: Dynamips doesn't return anything + + +def test_slot_add_PA_2FE_TX(router_c7200): + + adapter = PA_2FE_TX() + router_c7200.slot_add_binding(1, adapter) + assert router_c7200.slots[1] == adapter + + +def test_slot_add_PA_4E(router_c7200): + + adapter = PA_4E() + router_c7200.slot_add_binding(2, adapter) + assert router_c7200.slots[2] == adapter + + +def test_slot_add_PA_4T(router_c7200): + + adapter = PA_4T() + router_c7200.slot_add_binding(3, adapter) + assert router_c7200.slots[3] == adapter + + +def test_slot_add_PA_8E(router_c7200): + + adapter = PA_8E() + router_c7200.slot_add_binding(4, adapter) + assert router_c7200.slots[4] == adapter + + +def test_slot_add_PA_8T(router_c7200): + + adapter = PA_8T() + router_c7200.slot_add_binding(5, adapter) + assert router_c7200.slots[5] == adapter + + +def test_slot_add_PA_A1(router_c7200): + + adapter = PA_A1() + router_c7200.slot_add_binding(1, adapter) + assert router_c7200.slots[1] == adapter + + +def test_slot_add_PA_FE_TX(router_c7200): + + adapter = PA_FE_TX() + router_c7200.slot_add_binding(2, adapter) + assert router_c7200.slots[2] == adapter + + +def test_slot_add_PA_GE(router_c7200): + + adapter = PA_GE() + router_c7200.slot_add_binding(3, adapter) + assert router_c7200.slots[3] == adapter + + +def test_slot_add_PA_POS_OC3(router_c7200): + + adapter = PA_POS_OC3() + router_c7200.slot_add_binding(4, adapter) + assert router_c7200.slots[4] == adapter + + +def test_slot_add_into_already_occupied_slot(router_c7200): + + adapter = PA_FE_TX() + with pytest.raises(DynamipsError): + router_c7200.slot_add_binding(0, adapter) + + +def test_slot_add_into_wrong_slot(router_c7200): + + adapter = PA_FE_TX() + with pytest.raises(DynamipsError): + router_c7200.slot_add_binding(10, adapter) + + +def test_slot_remove_adapter(router_c7200): + + adapter = PA_FE_TX() + router_c7200.slot_add_binding(1, adapter) + router_c7200.slot_remove_binding(1) + assert router_c7200.slots[1] == None + + +def test_slot_add_remove_nio_binding(router_c7200): + + adapter = PA_FE_TX() + router_c7200.slot_add_binding(1, adapter) + nio = NIO_Null(router_c7200.hypervisor) + router_c7200.slot_add_nio_binding(1, 0, nio) # slot 1/0 + assert router_c7200.get_slot_nio_bindings(slot_id=1) + assert router_c7200.slots[1].ports[0] == nio + router_c7200.slot_remove_nio_binding(1, 0) # slot 1/0 + assert not router_c7200.get_slot_nio_bindings(slot_id=0) + nio.delete() + + +def test_slot_add_nio_to_wrong_port(router_c7200): + + adapter = PA_FE_TX() + router_c7200.slot_add_binding(1, adapter) + nio = NIO_Null(router_c7200.hypervisor) + with pytest.raises(DynamipsError): + router_c7200.slot_add_nio_binding(1, 1, nio) # slot 1/1 + nio.delete() diff --git a/tests/dynamips/test_ethernet_switch.py b/tests/dynamips/test_ethernet_switch.py new file mode 100644 index 00000000..52574ec5 --- /dev/null +++ b/tests/dynamips/test_ethernet_switch.py @@ -0,0 +1,87 @@ +from gns3server.modules.dynamips import EthernetSwitch +from gns3server.modules.dynamips import NIO_Null +from gns3server.modules.dynamips import DynamipsError +import pytest + + +@pytest.fixture +def ethsw(request, hypervisor): + + ethsw = EthernetSwitch(hypervisor, "Ethernet switch") + request.addfinalizer(ethsw.delete) + return ethsw + + +def test_ethsw_exists(ethsw): + + assert ethsw.list() + + +def test_rename_ethsw(ethsw): + + ethsw.rename("new Ethernet switch") + assert ethsw.name == "new Ethernet switch" + + +def test_add_remove_nio(ethsw): + + nio = NIO_Null(ethsw.hypervisor) + ethsw.add_nio(nio, 0) # add NIO on port 0 + assert ethsw.nios + ethsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_add_nio_already_allocated_port(ethsw): + + nio = NIO_Null(ethsw.hypervisor) + ethsw.add_nio(nio, 0) # add NIO on port 0 + with pytest.raises(DynamipsError): + ethsw.add_nio(nio, 0) + nio.delete() + + +def test_remove_nio_non_allocated_port(ethsw): + + with pytest.raises(DynamipsError): + ethsw.remove_nio(0) # remove NIO from port 0 + + +def test_set_access_port(ethsw): + + nio = NIO_Null(ethsw.hypervisor) + ethsw.add_nio(nio, 0) # add NIO on port 0 + ethsw.set_access_port(0, 10) # set port 0 as access in VLAN 10 + assert ethsw.mapping[0] == ("access", 10) + ethsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_set_dot1q_port(ethsw): + + nio = NIO_Null(ethsw.hypervisor) + ethsw.add_nio(nio, 0) # add NIO on port 0 + ethsw.set_dot1q_port(0, 1) # set port 0 as 802.1Q trunk with native VLAN 1 + assert ethsw.mapping[0] == ("dot1q", 1) + ethsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_set_qinq_port(ethsw): + + nio = NIO_Null(ethsw.hypervisor) + ethsw.add_nio(nio, 0) # add NIO on port 0 + ethsw.set_qinq_port(0, 100) # set port 0 as QinQ trunk with outer VLAN 100 + assert ethsw.mapping[0] == ("qinq", 100) + ethsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_get_mac_addr_table(ethsw): + + assert not ethsw.get_mac_addr_table() # MAC address table should be empty + + +def test_clear_mac_addr_table(ethsw): + + ethsw.clear_mac_addr_table() diff --git a/tests/dynamips/test_frame_relay_switch.py b/tests/dynamips/test_frame_relay_switch.py new file mode 100644 index 00000000..79be3d7a --- /dev/null +++ b/tests/dynamips/test_frame_relay_switch.py @@ -0,0 +1,65 @@ +from gns3server.modules.dynamips import FrameRelaySwitch +from gns3server.modules.dynamips import NIO_Null +from gns3server.modules.dynamips import DynamipsError +import pytest + + +@pytest.fixture +def frsw(request, hypervisor): + + frsw = FrameRelaySwitch(hypervisor, "Frane Relay switch") + request.addfinalizer(frsw.delete) + return frsw + + +def test_frsw_exists(frsw): + + assert frsw.list() + + +def test_rename_frsw(frsw): + + frsw.rename("new Frame Relay switch") + assert frsw.name == "new Frame Relay switch" + + +def test_add_remove_nio(frsw): + + nio = NIO_Null(frsw.hypervisor) + frsw.add_nio(nio, 0) # add NIO on port 0 + assert frsw.nios + frsw.remove_nio(0) # remove NIO from port 0 + nio.delete() + + +def test_add_nio_already_allocated_port(frsw): + + nio = NIO_Null(frsw.hypervisor) + frsw.add_nio(nio, 0) # add NIO on port 0 + with pytest.raises(DynamipsError): + frsw.add_nio(nio, 0) + nio.delete() + + +def test_remove_nio_non_allocated_port(frsw): + + with pytest.raises(DynamipsError): + frsw.remove_nio(0) # remove NIO from port 0 + + +def test_vc(frsw): + + nio1 = NIO_Null(frsw.hypervisor) + frsw.add_nio(nio1, 0) # add NIO on port 0 + nio2 = NIO_Null(frsw.hypervisor) + frsw.add_nio(nio1, 1) # add NIO on port 1 + frsw.map_vc(0, 10, 1, 20) # port 0 DLCI 10 to port 1 DLCI 20 (unidirectional) + frsw.map_vc(1, 20, 0, 10) # port 1 DLCI 20 to port 0 DLCI 10 (unidirectional) + assert frsw.mapping[(0, 10)] == (1, 20) + assert frsw.mapping[(1, 20)] == (0, 10) + frsw.unmap_vc(0, 10, 1, 20) # port 0 DLCI 10 to port 1 DLCI 20 (unidirectional) + frsw.unmap_vc(1, 20, 0, 10) # port 1 DLCI 20 to port 0 DLCI 10 (unidirectional) + frsw.remove_nio(0) + frsw.remove_nio(1) + nio1.delete() + nio2.delete() diff --git a/tests/dynamips/test_hub.py b/tests/dynamips/test_hub.py new file mode 100644 index 00000000..d490cb11 --- /dev/null +++ b/tests/dynamips/test_hub.py @@ -0,0 +1,25 @@ +from gns3server.modules.dynamips import Hub +from gns3server.modules.dynamips import NIO_Null +import pytest + + +@pytest.fixture +def hub(request, hypervisor): + + hub = Hub(hypervisor, "hub") + request.addfinalizer(hub.delete) + return hub + + +def test_hub_exists(hub): + + assert hub.list() + + +def test_add_remove_nio(hub): + + nio = NIO_Null(hub.hypervisor) + hub.add_nio(nio, 0) # add NIO to port 0 + assert hub.mapping[0] == nio + hub.remove_nio(0) # remove NIO from port 0 + nio.delete() diff --git a/tests/dynamips/test_hypervisor.py b/tests/dynamips/test_hypervisor.py new file mode 100644 index 00000000..d89da84e --- /dev/null +++ b/tests/dynamips/test_hypervisor.py @@ -0,0 +1,44 @@ +from gns3server.modules.dynamips import Hypervisor +import time +import os + + +def test_is_started(hypervisor): + + assert hypervisor.is_running() + + +def test_port(hypervisor): + + assert hypervisor.port == 9000 + + +def test_host(hypervisor): + + assert hypervisor.host == "127.0.0.1" + + +def test_workingdir(hypervisor): + + assert hypervisor.workingdir == "/tmp" + + +def test_path(hypervisor): + + cwd = os.path.dirname(os.path.abspath(__file__)) + dynamips_path = os.path.join(cwd, "dynamips.stable") + assert hypervisor.path == dynamips_path + + +def test_stdout(): + + # try to launch Dynamips on the same port + # this will fail so that we can read its stdout/stderr + cwd = os.path.dirname(os.path.abspath(__file__)) + dynamips_path = os.path.join(cwd, "dynamips.stable") + hypervisor = Hypervisor(dynamips_path, "/tmp", "172.0.0.1", 7200) + hypervisor.start() + # give some time for Dynamips to start + time.sleep(0.01) + output = hypervisor.read_stdout() + assert output diff --git a/tests/dynamips/test_hypervisor_manager.py b/tests/dynamips/test_hypervisor_manager.py new file mode 100644 index 00000000..658cb9b9 --- /dev/null +++ b/tests/dynamips/test_hypervisor_manager.py @@ -0,0 +1,51 @@ +from gns3server.modules.dynamips import Router +from gns3server.modules.dynamips import HypervisorManager +import pytest +import os + + +@pytest.fixture(scope="module") +def hypervisor_manager(request): + + cwd = os.path.dirname(os.path.abspath(__file__)) + dynamips_path = os.path.join(cwd, "dynamips.stable") + print("\nStarting Dynamips Hypervisor: {}".format(dynamips_path)) + manager = HypervisorManager(dynamips_path, "/tmp", "127.0.0.1", 9000) + #manager.start_new_hypervisor() + + def stop(): + print("\nStopping Dynamips Hypervisor") + manager.stop_all_hypervisors() + + request.addfinalizer(stop) + return manager + + +def test_allocate_hypervisor_for_router(hypervisor_manager): + + # default of 1GB of RAM per hypervisor instance + assert hypervisor_manager.memory_usage_limit_per_hypervisor == 1024 + hypervisor = hypervisor_manager.allocate_hypervisor_for_router("c3725.image", 512) + assert hypervisor.is_running() + hypervisor = hypervisor_manager.allocate_hypervisor_for_router("c3725.image", 256) + assert hypervisor.memory_load == 768 + hypervisor = hypervisor_manager.allocate_hypervisor_for_router("c3725.image", 512) + assert hypervisor.memory_load == 512 + assert len(hypervisor_manager.hypervisors) == 2 + + +def test_unallocate_hypervisor_for_router(hypervisor_manager): + + assert len(hypervisor_manager.hypervisors) == 2 + hypervisor = hypervisor_manager.hypervisors[0] + assert hypervisor.memory_load == 768 + router = Router(hypervisor, "router", "c3725") # default is 128MB of RAM + hypervisor_manager.unallocate_hypervisor_for_router(router) + assert hypervisor.memory_load == 640 + hypervisor.decrease_memory_load(512) # forces memory load down to 128 + assert hypervisor.memory_load == 128 + router.delete() + hypervisor_manager.unallocate_hypervisor_for_router(router) + # router is deleted and memory load to 0 now, one hypervisor must + # have been shutdown + assert len(hypervisor_manager.hypervisors) == 1 diff --git a/tests/dynamips/test_nios.py b/tests/dynamips/test_nios.py new file mode 100644 index 00000000..0538c298 --- /dev/null +++ b/tests/dynamips/test_nios.py @@ -0,0 +1,139 @@ +from gns3server.modules.dynamips import NIO_UDP +from gns3server.modules.dynamips import NIO_UDP_auto +from gns3server.modules.dynamips import NIO_FIFO +from gns3server.modules.dynamips import NIO_Mcast +from gns3server.modules.dynamips import NIO_Null +from gns3server.modules.dynamips import DynamipsError +import pytest + +# TODO: test UNIX, TAP, VDE, generic Ethernet and Linux Ethernet NIOs + + +def test_nio_udp(hypervisor): + + nio1 = NIO_UDP(hypervisor, 10001, "127.0.0.1", 10002) + assert nio1.lport == 10001 + nio2 = NIO_UDP(hypervisor, 10002, "127.0.0.1", 10001) + assert nio2.lport == 10002 + nio1.delete() + nio2.delete() + + +def test_nio_udp_auto(hypervisor): + + nio1 = NIO_UDP_auto(hypervisor, "127.0.0.1", 10001, 10010) + assert nio1.lport == 10001 + nio2 = NIO_UDP_auto(hypervisor, "127.0.0.1", 10001, 10010) + assert nio2.lport == 10002 + nio1.connect("127.0.0.1", nio2.lport) + nio2.connect("127.0.0.1", nio1.lport) + nio1.delete() + nio2.delete() + + +def test_nio_fifo(hypervisor): + + nio1 = NIO_FIFO(hypervisor) + nio2 = NIO_FIFO(hypervisor) + nio1.crossconnect(nio2) + assert nio1.list() + nio1.delete() + nio2.delete() + + +def test_nio_mcast(hypervisor): + + nio1 = NIO_Mcast(hypervisor, "232.0.0.1", 10001) + assert nio1.group == "232.0.0.1" + assert nio1.port == 10001 + nio1.ttl = 254 + assert nio1.ttl == 254 + nio2 = NIO_UDP(hypervisor, 10002, "232.0.0.1", 10001) + nio1.delete() + nio2.delete() + + +def test_nio_null(hypervisor): + + nio = NIO_Null(hypervisor) + assert nio.list() + nio.delete() + + +def test_rename_nio(hypervisor): + + nio = NIO_Null(hypervisor) + assert nio.name.startswith("nio_null") + nio.rename("test") + assert nio.name == "test" + nio.delete() + + +def test_debug_nio(hypervisor): + + nio = NIO_Null(hypervisor) + nio.debug(1) + nio.debug(0) + nio.delete() + + +def test_bind_unbind_filter(hypervisor): + + nio = NIO_Null(hypervisor) + nio.bind_filter("both", "freq_drop") + assert nio.input_filter == ("freq_drop", None) + assert nio.output_filter == ("freq_drop", None) + nio.unbind_filter("both") + nio.bind_filter("in", "capture") + assert nio.input_filter == ("capture", None) + nio.unbind_filter("in") + nio.delete() + + +def test_bind_unknown_filter(hypervisor): + + nio = NIO_Null(hypervisor) + with pytest.raises(DynamipsError): + nio.bind_filter("both", "my_filter") + nio.delete() + + +def test_unbind_with_no_filter_applied(hypervisor): + + nio = NIO_Null(hypervisor) + with pytest.raises(DynamipsError): + nio.unbind_filter("out") + nio.delete() + + +def test_setup_filter(hypervisor): + + nio = NIO_Null(hypervisor) + nio.bind_filter("in", "freq_drop") + nio.setup_filter("in", "5") # drop every 5th packet + assert nio.input_filter == ("freq_drop", "5") + nio.unbind_filter("in") + nio.delete() + + +def test_get_stats(hypervisor): + + nio = NIO_Null(hypervisor) + assert nio.get_stats() == "0 0 0 0" # nothing has been transmitted or received + nio.delete() + + +def test_reset_stats(hypervisor): + + nio = NIO_Null(hypervisor) + nio.reset_stats() + nio.delete() + + +def test_set_bandwidth(hypervisor): + + nio = NIO_Null(hypervisor) + assert nio.bandwidth == None # no constraint by default + nio.set_bandwidth(1000) # bandwidth = 1000 Kb/s + assert nio.bandwidth == 1000 + nio.delete() diff --git a/tests/dynamips/test_router.py b/tests/dynamips/test_router.py new file mode 100644 index 00000000..7540caac --- /dev/null +++ b/tests/dynamips/test_router.py @@ -0,0 +1,229 @@ +from gns3server.modules.dynamips import Router +from gns3server.modules.dynamips import DynamipsError +import pytest +import tempfile +import base64 + + +@pytest.fixture +def router(request, hypervisor): + + router = Router(hypervisor, "router", "c3725") + request.addfinalizer(router.delete) + return router + + +def test_hypervisor_is_started(hypervisor): + + assert hypervisor.is_running() + + +def test_create_and_delete_router(hypervisor): + + router = Router(hypervisor, "test my router") + assert router.id >= 0 + assert router.name == "test my router" + assert router.platform == "c7200" # default platform + assert not router.is_running() + router.delete() + with pytest.raises(DynamipsError): + router.get_status() + + +# def test_rename_router(router): +# +# assert router.name == "router" +# router.rename("my_router") +# assert router.name == "my_router" +# router.rename("router") +# assert router.name == "router" + #router.delete() # FIXME: fails with current Dynamips version + + +def test_image(router): + + # let's pretend this file is an IOS image + with tempfile.NamedTemporaryFile() as ios_image: + router.image = ios_image.name + assert router.image == ios_image.name + + +def test_set_config(router): + + with tempfile.NamedTemporaryFile() as startup_config: + startup_config.write(b"hostname test_config\n") + router.set_config(startup_config.name) + + +def test_push_config(router): + + startup_config = base64.b64encode(b"hostname test_config\n").decode("utf-8") + private_config = base64.b64encode(b"private config\n").decode("utf-8") + router.push_config(startup_config, private_config) + router_startup_config, router_private_config = router.extract_config() + assert startup_config == router_startup_config + assert private_config == router_private_config + + +def test_status(router, image): + # don't test if we have no IOS image + if not image: + return + + assert router.get_status() == "inactive" + router.ram = 256 + router.image = image + router.start() + assert router.is_running() + router.suspend() + assert router.get_status() == "suspended" + router.resume() + assert router.is_running() + router.stop() + assert router.get_status() == "inactive" + + +def test_ram(router): + + assert router.ram == 128 # default ram + router.ram = 256 + assert router.ram == 256 + + +def test_nvram(router): + + assert router.nvram == 128 # default nvram + router.nvram = 256 + assert router.nvram == 256 + + +def test_mmap(router): + + assert router.mmap == True # default value + router.mmap = False + assert router.mmap == False + + +def test_sparsemem(router): + + assert router.sparsemem == True # default value + router.sparsemem = False + assert router.sparsemem == False + + +def test_clock_divisor(router): + + assert router.clock_divisor == 8 # default value + router.clock_divisor = 4 + assert router.clock_divisor == 4 + + +def test_idlepc(router): + + assert router.idlepc == "" # no default value + router.idlepc = "0x60c086a8" + assert router.idlepc == "0x60c086a8" + + +def test_idlemax(router): + + assert router.idlemax == 1500 # default value + router.idlemax = 500 + assert router.idlemax == 500 + + +def test_idlesleep(router): + + assert router.idlesleep == 30 # default value + router.idlesleep = 15 + assert router.idlesleep == 15 + + +def test_exec_area(router): + + assert router.exec_area == None # default value + router.exec_area = 64 + assert router.exec_area == 64 + + +def test_disk0(router): + + assert router.disk0 == 0 # default value + router.disk0 = 16 + assert router.disk0 == 16 + + +def test_disk1(router): + + assert router.disk1 == 0 # default value + router.disk1 = 16 + assert router.disk1 == 16 + + +def test_confreg(router): + + assert router.confreg == "0x2102" # default value + router.confreg = "0x2142" + assert router.confreg == "0x2142" + + +def test_console(router): + + assert router.console == router.hypervisor.baseconsole + router.id + new_console_port = router.console + 100 + router.console = new_console_port + assert router.console == new_console_port + + +def test_aux(router): + + assert router.aux == router.hypervisor.baseaux + router.id + new_aux_port = router.aux + 100 + router.aux = new_aux_port + assert router.aux == new_aux_port + + +def test_cpu_info(router): + + router.get_cpu_info() # nothing is returned by the hypervisor, cannot test? + + +def test_cpu_usage(router): + + usage = router.get_cpu_usage() + assert usage == 0 # router isn't running, so usage must be 0 + + +def test_get_slot_bindings(router): + + assert router.get_slot_bindings()[0] == "0/0: GT96100-FE" + + +def test_get_slot_nio_bindings(router): + + router.get_slot_nio_bindings(slot_id=0) + + +def test_mac_addr(router): + + assert router.mac_addr == None # default value + router.mac_addr = "aa:aa:aa:aa:aa:aa" + assert router.mac_addr == "aa:aa:aa:aa:aa:aa" + + +def test_bogus_mac_addr(router): + + with pytest.raises(DynamipsError): + router.mac_addr = "zz:zz:zz:zz:zz:zz" + + +def test_system_id(router): + + assert router.system_id == None # default value + router.system_id = "FTX0945W0MO" + assert router.system_id == "FTX0945W0MO" + + +def test_get_hardware_info(router): + + router.get_hardware_info() diff --git a/tests/dynamips/test_vmhandler.py b/tests/dynamips/test_vmhandler.py new file mode 100644 index 00000000..cdc4998c --- /dev/null +++ b/tests/dynamips/test_vmhandler.py @@ -0,0 +1,65 @@ +from tornado.testing import AsyncHTTPTestCase +#from gns3server.plugins.dynamips import Dynamips +#from gns3server._compat import urlencode +from functools import partial +import tornado.web +import json +import tempfile + + +# class TestVMHandler(AsyncHTTPTestCase): +# +# def setUp(self): +# +# AsyncHTTPTestCase.setUp(self) +# self.post_request = partial(self.http_client.fetch, +# self.get_url("/api/vms/dynamips"), +# self.stop, +# method="POST") +# +# def get_app(self): +# return tornado.web.Application(Dynamips().handlers()) +# +# def test_endpoint(self): +# self.http_client.fetch(self.get_url("/api/vms/dynamips"), self.stop) +# response = self.wait() +# assert response.code == 200 +# +# def test_upload(self): +# +# try: +# from poster.encode import multipart_encode +# except ImportError: +# # poster isn't available for Python 3, let's just ignore the test +# return +# +# file_to_upload = tempfile.NamedTemporaryFile() +# data, headers = multipart_encode({"file1": file_to_upload}) +# body = "" +# for d in data: +# body += d +# +# response = self.fetch('/api/vms/dynamips/storage/upload', +# headers=headers, +# body=body, +# method='POST') +# +# assert response.code == 200 +# +# def get_new_ioloop(self): +# return tornado.ioloop.IOLoop.instance() +# +# def test_create_vm(self): +# +# post_data = {"name": "R1", +# "platform": "c3725", +# "console": 2000, +# "aux": 3000, +# "image": "c3725.bin", +# "ram": 128} +# +# self.post_request(body=json.dumps(post_data)) +# response = self.wait() +# assert(response.headers['Content-Type'].startswith('application/json')) +# expected = {"success": True} +# assert response.body.decode("utf-8") == json.dumps(expected)