1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-12-26 00:38:10 +00:00

Attribute mac address

This commit is contained in:
Julien Duponchelle 2015-01-22 16:12:21 +01:00
parent 08b2dc6369
commit 6644c640db
5 changed files with 101 additions and 9 deletions

View File

@ -49,13 +49,6 @@ class BaseManager:
cls._instance = cls() cls._instance = cls()
return cls._instance return cls._instance
def __del__(self):
self.destroy()
def destroy():
"""Cleanup the VMS. Call this before closing the server"""
cls._instance()
@property @property
def module_name(self): def module_name(self):
""" """

View File

@ -19,9 +19,45 @@
VPCS server module. VPCS server module.
""" """
import asyncio
from ..base_manager import BaseManager from ..base_manager import BaseManager
from .vpcs_error import VPCSError
from .vpcs_vm import VPCSVM from .vpcs_vm import VPCSVM
class VPCS(BaseManager): class VPCS(BaseManager):
_VM_CLASS = VPCSVM _VM_CLASS = VPCSVM
def __init__(self):
super().__init__()
self._free_mac_ids = list(range(0, 255))
self._used_mac_ids = {}
@asyncio.coroutine
def create_vm(self, *args, **kwargs):
vm = yield from super().create_vm(*args, **kwargs)
try:
self._used_mac_ids[vm.uuid] = self._free_mac_ids.pop(0)
except IndexError:
raise VPCSError("No mac address available")
return vm
@asyncio.coroutine
def delete_vm(self, uuid, *args, **kwargs):
i = self._used_mac_ids[uuid]
self._free_mac_ids.insert(0, i)
del self._used_mac_ids[uuid]
yield from super().delete_vm(uuid, *args, **kwargs)
def get_mac_id(self, vm_uuid):
"""
Get an unique VPCS mac id
:param vm_uuid: UUID of the VPCS vm
:returns: VPCS Mac id
"""
return self._used_mac_ids.get(vm_uuid, 1)

View File

@ -415,8 +415,7 @@ class VPCSVM(BaseVM):
command.extend(["-e"]) command.extend(["-e"])
command.extend(["-d", nio.tap_vm]) command.extend(["-d", nio.tap_vm])
# FIXME: find workaround command.extend(["-m", str(self._manager.get_mac_id(self._uuid))]) # the unique ID is used to set the MAC address offset
# command.extend(["-m", str(self._id)]) # the unique ID is used to set the MAC address offset
command.extend(["-i", "1"]) # option to start only one VPC instance command.extend(["-i", "1"]) # option to start only one VPC instance
command.extend(["-F"]) # option to avoid the daemonization of VPCS command.extend(["-F"]) # option to avoid the daemonization of VPCS
if self._script_file: if self._script_file:

View File

@ -53,6 +53,8 @@ def _get_unused_port():
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def server(request, loop, port_manager): def server(request, loop, port_manager):
"""A GNS 3 server"""
port = _get_unused_port() port = _get_unused_port()
host = "localhost" host = "localhost"
app = web.Application() app = web.Application()
@ -75,16 +77,22 @@ def server(request, loop, port_manager):
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
def project(): def project():
"""A GNS3 lab"""
return ProjectManager.instance().create_project(uuid="a1e920ca-338a-4e9f-b363-aa607b09dd80") return ProjectManager.instance().create_project(uuid="a1e920ca-338a-4e9f-b363-aa607b09dd80")
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def port_manager(): def port_manager():
"""An instance of port manager"""
return PortManager("127.0.0.1", False) return PortManager("127.0.0.1", False)
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def free_console_port(request, port_manager): def free_console_port(request, port_manager):
"""Get a free TCP port"""
# In case of already use ports we will raise an exception # In case of already use ports we will raise an exception
port = port_manager.get_free_console_port() port = port_manager.get_free_console_port()
# We release the port immediately in order to allow # We release the port immediately in order to allow

View File

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.
import pytest
import asyncio
import uuid
from gns3server.modules.vpcs import VPCS
from gns3server.modules.vpcs.vpcs_error import VPCSError
from gns3server.modules.project_manager import ProjectManager
def test_get_mac_id(loop, project, port_manager):
# Cleanup the VPCS object
VPCS._instance = None
vpcs = VPCS.instance()
vpcs.port_manager = port_manager
vm1_uuid = str(uuid.uuid4())
vm2_uuid = str(uuid.uuid4())
vm3_uuid = str(uuid.uuid4())
loop.run_until_complete(vpcs.create_vm("PC 1", project.uuid, vm1_uuid))
loop.run_until_complete(vpcs.create_vm("PC 2", project.uuid, vm2_uuid))
assert vpcs.get_mac_id(vm1_uuid) == 0
assert vpcs.get_mac_id(vm1_uuid) == 0
assert vpcs.get_mac_id(vm2_uuid) == 1
loop.run_until_complete(vpcs.delete_vm(vm1_uuid))
loop.run_until_complete(vpcs.create_vm("PC 3", project.uuid, vm3_uuid))
assert vpcs.get_mac_id(vm3_uuid) == 0
def test_get_mac_id_no_id_available(loop, project, port_manager):
# Cleanup the VPCS object
VPCS._instance = None
vpcs = VPCS.instance()
vpcs.port_manager = port_manager
with pytest.raises(VPCSError):
for i in range(0, 256):
vm_uuid = str(uuid.uuid4())
loop.run_until_complete(vpcs.create_vm("PC {}".format(i), project.uuid, vm_uuid))
assert vpcs.get_mac_id(vm_uuid) == i