Refactor VPCS script file loading

This allow to support moving the project on disk
This commit is contained in:
Julien Duponchelle 2015-02-05 14:20:01 +01:00
parent 869405738e
commit 41a8872819
4 changed files with 22 additions and 30 deletions

View File

@ -49,11 +49,10 @@ class VPCSVM(BaseVM):
:param project: Project instance :param project: Project instance
:param manager: parent VM Manager :param manager: parent VM Manager
:param console: TCP console port :param console: TCP console port
:param script_file: A VPCS startup script
:param startup_script: Content of vpcs startup script file :param startup_script: Content of vpcs startup script file
""" """
def __init__(self, name, vm_id, project, manager, console=None, script_file=None, startup_script=None): def __init__(self, name, vm_id, project, manager, console=None, startup_script=None):
super().__init__(name, vm_id, project, manager) super().__init__(name, vm_id, project, manager)
@ -64,7 +63,6 @@ class VPCSVM(BaseVM):
self._started = False self._started = False
# VPCS settings # VPCS settings
self._script_file = script_file
if startup_script is not None: if startup_script is not None:
self.startup_script = startup_script self.startup_script = startup_script
self._ethernet_adapter = EthernetAdapter() # one adapter with 1 Ethernet interface self._ethernet_adapter = EthernetAdapter() # one adapter with 1 Ethernet interface
@ -104,7 +102,6 @@ class VPCSVM(BaseVM):
"vm_id": self.id, "vm_id": self.id,
"console": self._console, "console": self._console,
"project_id": self.project.id, "project_id": self.project.id,
"script_file": self.script_file,
"startup_script": self.startup_script} "startup_script": self.startup_script}
@property @property
@ -152,7 +149,7 @@ class VPCSVM(BaseVM):
:param new_name: name :param new_name: name
""" """
if self._script_file: if self.script_file:
content = self.startup_script content = self.startup_script
content = content.replace(self._name, new_name) content = content.replace(self._name, new_name)
self.startup_script = content self.startup_script = content
@ -163,19 +160,15 @@ class VPCSVM(BaseVM):
def startup_script(self): def startup_script(self):
"""Return the content of the current startup script""" """Return the content of the current startup script"""
if self._script_file is None: script_file = self.script_file
# If the default VPCS file exist we use it if script_file is None:
path = os.path.join(self.working_dir, 'startup.vpc')
if os.path.exists(path):
self._script_file = path
else:
return None return None
try: try:
with open(self._script_file) as f: with open(script_file) as f:
return f.read() return f.read()
except OSError as e: except OSError as e:
raise VPCSError("Can't read VPCS startup file '{}'".format(self._script_file)) raise VPCSError("Can't read VPCS startup file '{}'".format(script_file))
@startup_script.setter @startup_script.setter
def startup_script(self, startup_script): def startup_script(self, startup_script):
@ -185,17 +178,16 @@ class VPCSVM(BaseVM):
:param startup_script The content of the vpcs startup script :param startup_script The content of the vpcs startup script
""" """
if self._script_file is None:
self._script_file = os.path.join(self.working_dir, 'startup.vpcs')
try: try:
with open(self._script_file, 'w+') as f: script_file = os.path.join(self.working_dir, 'startup.vpc')
with open(script_file, 'w+') as f:
if startup_script is None: if startup_script is None:
f.write('') f.write('')
else: else:
startup_script = startup_script.replace("%h", self._name) startup_script = startup_script.replace("%h", self._name)
f.write(startup_script) f.write(startup_script)
except OSError as e: except OSError as e:
raise VPCSError("Can't write VPCS startup file '{}'".format(self._script_file)) raise VPCSError("Can't write VPCS startup file '{}'".format(self.script_file))
@asyncio.coroutine @asyncio.coroutine
def _check_vpcs_version(self): def _check_vpcs_version(self):
@ -413,8 +405,9 @@ class VPCSVM(BaseVM):
command.extend(["-m", str(self._manager.get_mac_id(self.id))]) # the unique ID is used to set the MAC address offset command.extend(["-m", str(self._manager.get_mac_id(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:
command.extend([self._script_file]) if self.script_file:
command.extend([self.script_file])
return command return command
@property @property
@ -425,4 +418,9 @@ class VPCSVM(BaseVM):
:returns: path to script-file :returns: path to script-file
""" """
return self._script_file # If the default VPCS file exist we use it
path = os.path.join(self.working_dir, 'startup.vpc')
if os.path.exists(path):
return path
else:
return None

View File

@ -158,10 +158,6 @@ VPCS_OBJECT_SCHEMA = {
"maxLength": 36, "maxLength": 36,
"pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$"
}, },
"script_file": {
"description": "VPCS startup script",
"type": ["string", "null"]
},
"startup_script": { "startup_script": {
"description": "Content of the VPCS startup script", "description": "Content of the VPCS startup script",
"type": ["string", "null"] "type": ["string", "null"]

View File

@ -34,7 +34,6 @@ def test_vpcs_create(server, project):
assert response.route == "/{project_id}/vpcs/vms" assert response.route == "/{project_id}/vpcs/vms"
assert response.json["name"] == "PC TEST 1" assert response.json["name"] == "PC TEST 1"
assert response.json["project_id"] == project.id assert response.json["project_id"] == project.id
assert response.json["script_file"] is None
def test_vpcs_get(server, project, vm): def test_vpcs_get(server, project, vm):

View File

@ -134,7 +134,7 @@ def test_port_remove_nio_binding(vm):
def test_update_startup_script(vm): def test_update_startup_script(vm):
content = "echo GNS3 VPCS\nip 192.168.1.2\n" content = "echo GNS3 VPCS\nip 192.168.1.2\n"
vm.startup_script = content vm.startup_script = content
filepath = os.path.join(vm.working_dir, 'startup.vpcs') filepath = os.path.join(vm.working_dir, 'startup.vpc')
assert os.path.exists(filepath) assert os.path.exists(filepath)
with open(filepath) as f: with open(filepath) as f:
assert f.read() == content assert f.read() == content
@ -143,7 +143,7 @@ def test_update_startup_script(vm):
def test_update_startup_script(vm): def test_update_startup_script(vm):
content = "echo GNS3 VPCS\nip 192.168.1.2\n" content = "echo GNS3 VPCS\nip 192.168.1.2\n"
vm.startup_script = content vm.startup_script = content
filepath = os.path.join(vm.working_dir, 'startup.vpcs') filepath = os.path.join(vm.working_dir, 'startup.vpc')
assert os.path.exists(filepath) assert os.path.exists(filepath)
with open(filepath) as f: with open(filepath) as f:
assert f.read() == content assert f.read() == content
@ -192,11 +192,10 @@ def test_change_console_port(vm, port_manager):
def test_change_name(vm, tmpdir): def test_change_name(vm, tmpdir):
path = os.path.join(str(tmpdir), 'startup.vpcs') path = os.path.join(vm.working_dir, 'startup.vpc')
vm.name = "world" vm.name = "world"
with open(path, 'w+') as f: with open(path, 'w+') as f:
f.write("name world") f.write("name world")
vm._script_file = path
vm.name = "hello" vm.name = "hello"
assert vm.name == "hello" assert vm.name == "hello"
with open(path) as f: with open(path) as f: