From: Alina Quereilhac Date: Sun, 28 Aug 2011 16:12:44 +0000 (+0200) Subject: Added CLEAN_ROOT option to DEPLOYMENT_ATTRIBUTES. This option force removal of the... X-Git-Tag: nepi-3.0.0~254^2~1 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=f1f3d35246f3665163f4c8d16ad900a2ca552b57;p=nepi.git Added CLEAN_ROOT option to DEPLOYMENT_ATTRIBUTES. This option force removal of the server's root_directory if it exists already. --- diff --git a/src/nepi/core/metadata.py b/src/nepi/core/metadata.py index b96f009b..db1b0043 100644 --- a/src/nepi/core/metadata.py +++ b/src/nepi/core/metadata.py @@ -351,6 +351,17 @@ class Metadata(object): Attribute.Metadata, "validation_function" : validation.is_bool, "category" : AC.CATEGORY_DEPLOYMENT, + }), + DC.CLEAN_ROOT : dict({ + "name" : DC.CLEAN_ROOT, + "help" : "Clean server root directory (Warning: This will erase previous data).", + "type" : Attribute.BOOL, + "value" : False, + "flags" : Attribute.ExecReadOnly |\ + Attribute.ExecImmutable |\ + Attribute.Metadata, + "validation_function" : validation.is_bool, + "category" : AC.CATEGORY_DEPLOYMENT, }), DC.LOG_LEVEL : dict({ "name" : DC.LOG_LEVEL, diff --git a/src/nepi/util/constants.py b/src/nepi/util/constants.py index 237dc476..b765134d 100644 --- a/src/nepi/util/constants.py +++ b/src/nepi/util/constants.py @@ -77,5 +77,6 @@ class DeploymentConfiguration: LOG_LEVEL = "logLevel" RECOVER = "recover" RECOVERY_POLICY = "recoveryPolicy" + CLEAN_ROOT = "cleanRoot" diff --git a/src/nepi/util/proxy.py b/src/nepi/util/proxy.py index 72af827e..49c9989b 100644 --- a/src/nepi/util/proxy.py +++ b/src/nepi/util/proxy.py @@ -147,10 +147,11 @@ def to_server_log_level(log_level): ) def get_access_config_params(access_config): + mode = access_config.get_attribute_value(DC.DEPLOYMENT_MODE) + launch = not access_config.get_attribute_value(DC.RECOVER) root_dir = access_config.get_attribute_value(DC.ROOT_DIRECTORY) log_level = access_config.get_attribute_value(DC.LOG_LEVEL) log_level = to_server_log_level(log_level) - user = host = port = agent = key = sudo = None communication = access_config.get_attribute_value(DC.DEPLOYMENT_COMMUNICATION) environment_setup = ( access_config.get_attribute_value(DC.DEPLOYMENT_ENVIRONMENT_SETUP) @@ -164,8 +165,9 @@ def get_access_config_params(access_config): sudo = access_config.get_attribute_value(DC.USE_SUDO) key = access_config.get_attribute_value(DC.DEPLOYMENT_KEY) communication = access_config.get_attribute_value(DC.DEPLOYMENT_COMMUNICATION) - return (root_dir, log_level, communication, user, host, port, key, agent, - sudo, environment_setup) + clean_root = access_config.get_attribute_value(DC.CLEAN_ROOT) + return (mode, launch, root_dir, log_level, communication, user, host, port, + key, agent, sudo, environment_setup, clean_root) class AccessConfiguration(AttributesMap): def __init__(self, params = None): @@ -194,12 +196,14 @@ class PermDir(object): self.path = path def create_experiment_controller(xml, access_config = None): - mode = None if not access_config \ - else access_config.get_attribute_value(DC.DEPLOYMENT_MODE) - launch = True if not access_config \ - else not access_config.get_attribute_value(DC.RECOVER) - log_level = DC.ERROR_LEVEL if not access_config \ - else access_config.get_attribute_value(DC.LOG_LEVEL) + mode = None + launch = True + log_level = DC.ERROR_LEVEL + if access_config: + (mode, launch, root_dir, log_level, communication, user, host, port, + key, agent, sudo, environment_setup, clean_root) \ + = get_access_config_params(access_config) + os.environ["NEPI_CONTROLLER_LOGLEVEL"] = log_level if not mode or mode == DC.MODE_SINGLE_PROCESS: @@ -221,8 +225,6 @@ def create_experiment_controller(xml, access_config = None): return controller elif mode == DC.MODE_DAEMON: - (root_dir, log_level, communication, user, host, port, key, agent, - sudo, environment_setup) = get_access_config_params(access_config) try: return ExperimentControllerProxy(root_dir, log_level, experiment_xml = xml, @@ -234,7 +236,8 @@ def create_experiment_controller(xml, access_config = None): agent = agent, sudo = sudo, launch = launch, - environment_setup = environment_setup) + environment_setup = environment_setup, + clean_root = clean_root) except: if not launch: # Maybe controller died, recover from persisted testbed information if possible @@ -248,7 +251,8 @@ def create_experiment_controller(xml, access_config = None): agent = agent, sudo = sudo, launch = True, - environment_setup = environment_setup) + environment_setup = environment_setup, + clean_root = clean_root) controller.recover() return controller else: @@ -256,17 +260,21 @@ def create_experiment_controller(xml, access_config = None): raise RuntimeError("Unsupported access configuration '%s'" % mode) def create_testbed_controller(testbed_id, testbed_version, access_config): - mode = None if not access_config \ - else access_config.get_attribute_value(DC.DEPLOYMENT_MODE) - launch = True if not access_config \ - else not access_config.get_attribute_value(DC.RECOVER) + mode = None + launch = True + log_level = DC.ERROR_LEVEL + if access_config: + (mode, launch, root_dir, log_level, communication, user, host, port, + key, agent, sudo, environment_setup, clean_root) \ + = get_access_config_params(access_config) + + os.environ["NEPI_CONTROLLER_LOGLEVEL"] = log_level + if not mode or mode == DC.MODE_SINGLE_PROCESS: if not launch: - raise ValueError, "Unsupported instantiation mode: %s with lanch=False" % (mode,) + raise ValueError, "Unsupported instantiation mode: %s with launch=False" % (mode,) return _build_testbed_controller(testbed_id, testbed_version) elif mode == DC.MODE_DAEMON: - (root_dir, log_level, communication, user, host, port, key, agent, - sudo, environment_setup) = get_access_config_params(access_config) return TestbedControllerProxy(root_dir, log_level, testbed_id = testbed_id, testbed_version = testbed_version, @@ -278,7 +286,8 @@ def create_testbed_controller(testbed_id, testbed_version, access_config): agent = agent, sudo = sudo, launch = launch, - environment_setup = environment_setup) + environment_setup = environment_setup, + clean_root = clean_root) raise RuntimeError("Unsupported access configuration '%s'" % mode) def _build_testbed_controller(testbed_id, testbed_version): @@ -497,9 +506,10 @@ class BaseServer(server.Server): return reply class TestbedControllerServer(BaseServer): - def __init__(self, root_dir, log_level, testbed_id, testbed_version, environment_setup): + def __init__(self, root_dir, log_level, testbed_id, testbed_version, + environment_setup, clean_root): super(TestbedControllerServer, self).__init__(root_dir, log_level, - environment_setup = environment_setup ) + environment_setup = environment_setup, clean_root = clean_root) self._testbed_id = testbed_id self._testbed_version = testbed_version self._testbed = None @@ -734,9 +744,10 @@ class TestbedControllerServer(BaseServer): class ExperimentControllerServer(BaseServer): - def __init__(self, root_dir, log_level, experiment_xml, environment_setup): + def __init__(self, root_dir, log_level, experiment_xml, environment_setup, + clean_root): super(ExperimentControllerServer, self).__init__(root_dir, log_level, - environment_setup = environment_setup ) + environment_setup = environment_setup, clean_root = clean_root) self._experiment_xml = experiment_xml self._experiment = None @@ -866,7 +877,8 @@ class BaseProxy(object): ident_key = None, agent = None, sudo = False, - environment_setup = ""): + environment_setup = "", + clean_root = False): if launch: python_code = ( "from %(classmodule)s import %(classname)s;" @@ -1101,12 +1113,14 @@ class TestbedControllerProxy(BaseProxy): ident_key = None, agent = None, sudo = False, - environment_setup = ""): + environment_setup = "", + clean_root = False): if launch and (testbed_id == None or testbed_version == None): raise RuntimeError("To launch a TesbedControllerServer a " "testbed_id and testbed_version are required") super(TestbedControllerProxy,self).__init__( - ctor_args = (root_dir, log_level, testbed_id, testbed_version, environment_setup), + ctor_args = (root_dir, log_level, testbed_id, testbed_version, + environment_setup, clean_root), root_dir = root_dir, launch = launch, communication = communication, @@ -1144,9 +1158,11 @@ class ExperimentControllerProxy(BaseProxy): ident_key = None, agent = None, sudo = False, - environment_setup = ""): + environment_setup = "", + clean_root = False): super(ExperimentControllerProxy,self).__init__( - ctor_args = (root_dir, log_level, experiment_xml, environment_setup), + ctor_args = (root_dir, log_level, experiment_xml, environment_setup, + clean_root), root_dir = root_dir, launch = launch, communication = communication, @@ -1156,7 +1172,8 @@ class ExperimentControllerProxy(BaseProxy): ident_key = ident_key, agent = agent, sudo = sudo, - environment_setup = environment_setup) + environment_setup = environment_setup, + clean_root = clean_root) locals().update( BaseProxy._make_stubs( server_class = ExperimentControllerServer, diff --git a/src/nepi/util/server.py b/src/nepi/util/server.py index a084705f..51397562 100644 --- a/src/nepi/util/server.py +++ b/src/nepi/util/server.py @@ -9,14 +9,14 @@ import os import os.path import resource import select -import socket +import shutil import signal +import socket import sys import subprocess import threading import time import traceback -import signal import re import tempfile import defer @@ -76,8 +76,10 @@ def eintr_retry(func): return rv class Server(object): - def __init__(self, root_dir = ".", log_level = DC.ERROR_LEVEL, environment_setup = ""): + def __init__(self, root_dir = ".", log_level = DC.ERROR_LEVEL, + environment_setup = "", clean_root = False): self._root_dir = root_dir + self._clean_root = clean_root self._stop = False self._ctrl_sock = None self._log_level = log_level @@ -110,6 +112,8 @@ class Server(object): # build root folder root = os.path.normpath(self._root_dir) + if os.path.exists(root) and self._clean_root: + shutil.rmtree(root) if not os.path.exists(root): os.makedirs(root, 0755) diff --git a/test/testbeds/netns/integration.py b/test/testbeds/netns/integration.py index f26206d2..ae563757 100755 --- a/test/testbeds/netns/integration.py +++ b/test/testbeds/netns/integration.py @@ -178,8 +178,7 @@ class NetnsIntegrationTestCase(unittest.TestCase): def tearDown(self): try: - #shutil.rmtree(self.root_dir) - pass + shutil.rmtree(self.root_dir) except: # retry time.sleep(0.1)