diff --git a/gns3server/modules/dynamips/backends/atmsw.py b/gns3server/modules/dynamips/backends/atmsw.py index 4c5c2644..b775c191 100644 --- a/gns3server/modules/dynamips/backends/atmsw.py +++ b/gns3server/modules/dynamips/backends/atmsw.py @@ -38,7 +38,7 @@ class ATMSW(object): """ Creates a new ATM switch. - Optional request parameters: + Mandatory request parameters: - name (switch name) Response parameters: @@ -52,10 +52,8 @@ class ATMSW(object): if request and not self.validate_request(request, ATMSW_CREATE_SCHEMA): return - name = None - if request and "name" in request: - name = request["name"] + name = request["name"] try: if not self._hypervisor_manager: self.start_hypervisor_manager() diff --git a/gns3server/modules/dynamips/backends/ethhub.py b/gns3server/modules/dynamips/backends/ethhub.py index 28678bf0..9939cb71 100644 --- a/gns3server/modules/dynamips/backends/ethhub.py +++ b/gns3server/modules/dynamips/backends/ethhub.py @@ -37,7 +37,7 @@ class ETHHUB(object): """ Creates a new Ethernet hub. - Optional request parameters: + Mandatory request parameters: - name (hub name) Response parameters: @@ -51,10 +51,7 @@ class ETHHUB(object): if request and not self.validate_request(request, ETHHUB_CREATE_SCHEMA): return - name = None - if request and "name" in request: - name = request["name"] - + name = request["name"] try: if not self._hypervisor_manager: self.start_hypervisor_manager() diff --git a/gns3server/modules/dynamips/backends/ethsw.py b/gns3server/modules/dynamips/backends/ethsw.py index cf8369f4..cb06f927 100644 --- a/gns3server/modules/dynamips/backends/ethsw.py +++ b/gns3server/modules/dynamips/backends/ethsw.py @@ -37,7 +37,7 @@ class ETHSW(object): """ Creates a new Ethernet switch. - Optional request parameters: + Mandatory request parameters: - name (switch name) Response parameters: @@ -51,10 +51,7 @@ class ETHSW(object): if request and not self.validate_request(request, ETHSW_CREATE_SCHEMA): return - name = None - if request and "name" in request: - name = request["name"] - + name = request["name"] try: if not self._hypervisor_manager: self.start_hypervisor_manager() diff --git a/gns3server/modules/dynamips/backends/frsw.py b/gns3server/modules/dynamips/backends/frsw.py index 5bbf72a2..34042332 100644 --- a/gns3server/modules/dynamips/backends/frsw.py +++ b/gns3server/modules/dynamips/backends/frsw.py @@ -37,7 +37,7 @@ class FRSW(object): """ Creates a new Frame-Relay switch. - Optional request parameters: + Mandatory request parameters: - name (switch name) Response parameters: @@ -51,10 +51,7 @@ class FRSW(object): if request and not self.validate_request(request, FRSW_CREATE_SCHEMA): return - name = None - if request and "name" in request: - name = request["name"] - + name = request["name"] try: if not self._hypervisor_manager: self.start_hypervisor_manager() diff --git a/gns3server/modules/dynamips/backends/vm.py b/gns3server/modules/dynamips/backends/vm.py index 99fa0f87..56274d9f 100644 --- a/gns3server/modules/dynamips/backends/vm.py +++ b/gns3server/modules/dynamips/backends/vm.py @@ -105,12 +105,12 @@ class VM(object): Creates a new VM (router). Mandatory request parameters: + - name (vm name) - platform (platform name e.g. c7200) - image (path to IOS image) - ram (amount of RAM in MB) Optional request parameters: - - name (vm name) - console (console port number) - aux (auxiliary console port number) - mac_addr (MAC address) @@ -127,9 +127,7 @@ class VM(object): if not self.validate_request(request, VM_CREATE_SCHEMA): return - name = None - if "name" in request: - name = request["name"] + name = request["name"] platform = request["platform"] image = request["image"] ram = request["ram"] diff --git a/gns3server/modules/dynamips/nodes/atm_switch.py b/gns3server/modules/dynamips/nodes/atm_switch.py index eecd9544..7dfcbbbe 100644 --- a/gns3server/modules/dynamips/nodes/atm_switch.py +++ b/gns3server/modules/dynamips/nodes/atm_switch.py @@ -37,22 +37,16 @@ class ATMSwitch(object): _allocated_names = [] _instance_count = 1 - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): + + # check if the name is already taken + if name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another ATM switch'.format(name)) # create an unique ID self._id = ATMSwitch._instance_count ATMSwitch._instance_count += 1 - # let's create a unique name if none has been chosen - if not name: - name_id = self._id - while True: - name = "ATM" + str(name_id) - # check if the name has already been allocated to another switch - if name not in self._allocated_names: - break - name_id += 1 - self._allocated_names.append(name) self._hypervisor = hypervisor self._name = '"' + name + '"' # put name into quotes to protect spaces @@ -102,6 +96,10 @@ class ATMSwitch(object): :param new_name: New name for this switch """ + # check if the name is already taken + if new_name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another ATM switch'.format(new_name)) + new_name_no_quotes = new_name 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, diff --git a/gns3server/modules/dynamips/nodes/bridge.py b/gns3server/modules/dynamips/nodes/bridge.py index a47bf654..d0f194d6 100644 --- a/gns3server/modules/dynamips/nodes/bridge.py +++ b/gns3server/modules/dynamips/nodes/bridge.py @@ -20,6 +20,8 @@ Interface for Dynamips NIO bridge module ("nio_bridge"). http://github.com/GNS3/dynamips/blob/master/README.hypervisor#L538 """ +from ..dynamips_error import DynamipsError + class Bridge(object): """ @@ -58,6 +60,10 @@ class Bridge(object): :param new_name: New name for this bridge """ + # check if the name is already taken + if new_name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another bridge'.format(new_name)) + new_name_no_quotes = new_name 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, diff --git a/gns3server/modules/dynamips/nodes/c1700.py b/gns3server/modules/dynamips/nodes/c1700.py index 51318790..09d75d31 100644 --- a/gns3server/modules/dynamips/nodes/c1700.py +++ b/gns3server/modules/dynamips/nodes/c1700.py @@ -39,7 +39,7 @@ class C1700(Router): 1710 is not supported. """ - def __init__(self, hypervisor, name=None, chassis="1720"): + def __init__(self, hypervisor, name, chassis="1720"): Router.__init__(self, hypervisor, name, platform="c1700") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c2600.py b/gns3server/modules/dynamips/nodes/c2600.py index e7f5b61a..ff0fb0c0 100644 --- a/gns3server/modules/dynamips/nodes/c2600.py +++ b/gns3server/modules/dynamips/nodes/c2600.py @@ -54,7 +54,7 @@ class C2600(Router): "2650XM": C2600_MB_1FE, "2651XM": C2600_MB_2FE} - def __init__(self, hypervisor, name=None, chassis="2610"): + def __init__(self, hypervisor, name, chassis="2610"): Router.__init__(self, hypervisor, name, platform="c2600") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c2691.py b/gns3server/modules/dynamips/nodes/c2691.py index 9ba7e396..baec82de 100644 --- a/gns3server/modules/dynamips/nodes/c2691.py +++ b/gns3server/modules/dynamips/nodes/c2691.py @@ -35,7 +35,7 @@ class C2691(Router): :param name: name for this router """ - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): Router.__init__(self, hypervisor, name, platform="c2691") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c3600.py b/gns3server/modules/dynamips/nodes/c3600.py index ccbd565c..fd9790d4 100644 --- a/gns3server/modules/dynamips/nodes/c3600.py +++ b/gns3server/modules/dynamips/nodes/c3600.py @@ -37,7 +37,7 @@ class C3600(Router): 3620, 3640 or 3660 (default = 3640). """ - def __init__(self, hypervisor, name=None, chassis="3640"): + def __init__(self, hypervisor, name, chassis="3640"): Router.__init__(self, hypervisor, name, platform="c3600") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c3725.py b/gns3server/modules/dynamips/nodes/c3725.py index d32fab1b..455575ce 100644 --- a/gns3server/modules/dynamips/nodes/c3725.py +++ b/gns3server/modules/dynamips/nodes/c3725.py @@ -35,7 +35,7 @@ class C3725(Router): :param name: name for this router """ - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): Router.__init__(self, hypervisor, name, platform="c3725") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c3745.py b/gns3server/modules/dynamips/nodes/c3745.py index 5c0ea13c..5c914fee 100644 --- a/gns3server/modules/dynamips/nodes/c3745.py +++ b/gns3server/modules/dynamips/nodes/c3745.py @@ -35,7 +35,7 @@ class C3745(Router): :param name: name for this router """ - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): Router.__init__(self, hypervisor, name, platform="c3745") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/c7200.py b/gns3server/modules/dynamips/nodes/c7200.py index 0307eedc..ce63e726 100644 --- a/gns3server/modules/dynamips/nodes/c7200.py +++ b/gns3server/modules/dynamips/nodes/c7200.py @@ -38,7 +38,7 @@ class C7200(Router): :param npe: default NPE """ - def __init__(self, hypervisor, name=None, npe="npe-400"): + def __init__(self, hypervisor, name, npe="npe-400"): Router.__init__(self, hypervisor, name, platform="c7200") # Set default values for this platform diff --git a/gns3server/modules/dynamips/nodes/ethernet_switch.py b/gns3server/modules/dynamips/nodes/ethernet_switch.py index 83ddf080..99794f4a 100644 --- a/gns3server/modules/dynamips/nodes/ethernet_switch.py +++ b/gns3server/modules/dynamips/nodes/ethernet_switch.py @@ -37,22 +37,16 @@ class EthernetSwitch(object): _allocated_names = [] _instance_count = 1 - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): + + # check if the name is already taken + if name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another Ethernet switch'.format(name)) # create an unique ID self._id = EthernetSwitch._instance_count EthernetSwitch._instance_count += 1 - # let's create a unique name if none has been chosen - if not name: - name_id = self._id - while True: - name = "SW" + str(name_id) - # check if the name has already been allocated to another switch - if name not in self._allocated_names: - break - name_id += 1 - self._allocated_names.append(name) self._hypervisor = hypervisor self._name = '"' + name + '"' # put name into quotes to protect spaces @@ -102,6 +96,9 @@ class EthernetSwitch(object): :param new_name: New name for this switch """ + if new_name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another Ethernet switch'.format(new_name)) + new_name_no_quotes = new_name 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, diff --git a/gns3server/modules/dynamips/nodes/frame_relay_switch.py b/gns3server/modules/dynamips/nodes/frame_relay_switch.py index 8a1eec31..1cd5f3a0 100644 --- a/gns3server/modules/dynamips/nodes/frame_relay_switch.py +++ b/gns3server/modules/dynamips/nodes/frame_relay_switch.py @@ -37,22 +37,16 @@ class FrameRelaySwitch(object): _allocated_names = [] _instance_count = 1 - def __init__(self, hypervisor, name=None): + def __init__(self, hypervisor, name): + + # check if the name is already taken + if name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another Frame Relay switch'.format(name)) # create an unique ID self._id = FrameRelaySwitch._instance_count FrameRelaySwitch._instance_count += 1 - # let's create a unique name if none has been chosen - if not name: - name_id = self._id - while True: - name = "FR" + str(name_id) - # check if the name has already been allocated to another switch - if name not in self._allocated_names: - break - name_id += 1 - self._allocated_names.append(name) self._hypervisor = hypervisor self._name = '"' + name + '"' # put name into quotes to protect spaces @@ -102,6 +96,9 @@ class FrameRelaySwitch(object): :param new_name: New name for this switch """ + if new_name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another Frame Relay switch'.format(new_name)) + new_name_no_quotes = new_name 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, diff --git a/gns3server/modules/dynamips/nodes/hub.py b/gns3server/modules/dynamips/nodes/hub.py index b66a5488..2ee8274b 100644 --- a/gns3server/modules/dynamips/nodes/hub.py +++ b/gns3server/modules/dynamips/nodes/hub.py @@ -38,20 +38,14 @@ class Hub(Bridge): def __init__(self, hypervisor, name): + # check if the name is already taken + if name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another Ethernet hub'.format(name)) + # create an unique ID self._id = Hub._instance_count Hub._instance_count += 1 - # let's create a unique name if none has been chosen - if not name: - name_id = self._id - while True: - name = "Hub" + str(name_id) - # check if the name has already been allocated to another switch - if name not in self._allocated_names: - break - name_id += 1 - self._mapping = {} Bridge.__init__(self, hypervisor, name) diff --git a/gns3server/modules/dynamips/nodes/router.py b/gns3server/modules/dynamips/nodes/router.py index 554cd729..931573f3 100644 --- a/gns3server/modules/dynamips/nodes/router.py +++ b/gns3server/modules/dynamips/nodes/router.py @@ -50,22 +50,18 @@ class Router(object): 2: "running", 3: "suspended"} - def __init__(self, hypervisor, name=None, platform="c7200", ghost_flag=False): + def __init__(self, hypervisor, name, platform="c7200", ghost_flag=False): if not ghost_flag: + + # check if the name is already taken + if name in self._allocated_names: + raise DynamipsError('Name "{}" is already used by another router'.format(name)) + # create an unique ID self._id = Router._instance_count Router._instance_count += 1 - # let's create a unique name if none has been chosen - if not name: - name_id = self._id - while True: - name = "R" + str(name_id) - # check if the name has already been allocated to another router - if name not in self._allocated_names: - break - name_id += 1 else: log.info("creating a new ghost IOS file") self._id = 0 @@ -581,10 +577,10 @@ class Router(object): 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) + 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) + return startup_config, private_config def push_config(self, startup_config, private_config='(keep)'): """ @@ -727,7 +723,7 @@ class Router(object): else: flag = 0 self._hypervisor.send("vm set_sparse_mem {name} {sparsemem}".format(name=self._name, - sparsemem=flag)) + sparsemem=flag)) if sparsemem: log.info("router {name} [id={id}]: sparse memory enabled".format(name=self._name, diff --git a/gns3server/modules/dynamips/schemas/atmsw.py b/gns3server/modules/dynamips/schemas/atmsw.py index b545880b..2041299b 100644 --- a/gns3server/modules/dynamips/schemas/atmsw.py +++ b/gns3server/modules/dynamips/schemas/atmsw.py @@ -27,6 +27,7 @@ ATMSW_CREATE_SCHEMA = { }, }, "additionalProperties": False, + "required": ["name"] } ATMSW_DELETE_SCHEMA = { diff --git a/gns3server/modules/dynamips/schemas/ethhub.py b/gns3server/modules/dynamips/schemas/ethhub.py index efea271c..6db1b796 100644 --- a/gns3server/modules/dynamips/schemas/ethhub.py +++ b/gns3server/modules/dynamips/schemas/ethhub.py @@ -27,6 +27,7 @@ ETHHUB_CREATE_SCHEMA = { }, }, "additionalProperties": False, + "required": ["name"] } ETHHUB_DELETE_SCHEMA = { diff --git a/gns3server/modules/dynamips/schemas/ethsw.py b/gns3server/modules/dynamips/schemas/ethsw.py index 0c8b8074..a33a98b8 100644 --- a/gns3server/modules/dynamips/schemas/ethsw.py +++ b/gns3server/modules/dynamips/schemas/ethsw.py @@ -27,6 +27,7 @@ ETHSW_CREATE_SCHEMA = { }, }, "additionalProperties": False, + "required": ["name"] } ETHSW_DELETE_SCHEMA = { diff --git a/gns3server/modules/dynamips/schemas/frsw.py b/gns3server/modules/dynamips/schemas/frsw.py index 72272782..5dd5e5bb 100644 --- a/gns3server/modules/dynamips/schemas/frsw.py +++ b/gns3server/modules/dynamips/schemas/frsw.py @@ -27,6 +27,7 @@ FRSW_CREATE_SCHEMA = { }, }, "additionalProperties": False, + "required": ["name"] } FRSW_DELETE_SCHEMA = { diff --git a/gns3server/modules/dynamips/schemas/vm.py b/gns3server/modules/dynamips/schemas/vm.py index 581a4d65..47bcb75b 100644 --- a/gns3server/modules/dynamips/schemas/vm.py +++ b/gns3server/modules/dynamips/schemas/vm.py @@ -66,7 +66,7 @@ VM_CREATE_SCHEMA = { } }, "additionalProperties": False, - "required": ["platform", "image", "ram"] + "required": ["name", "platform", "image", "ram"] } VM_DELETE_SCHEMA = {