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:
parent
08b2dc6369
commit
6644c640db
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
56
tests/modules/vpcs/test_vpcs_manager.py
Normal file
56
tests/modules/vpcs/test_vpcs_manager.py
Normal 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
|
Loading…
Reference in New Issue
Block a user