From: Alina Quereilhac Date: Wed, 9 Mar 2011 17:44:18 +0000 (+0100) Subject: proxy class created X-Git-Tag: nepi_v2~192 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=db8922c4013c6ff68b53e2c079b402bdfd4c77ce;p=nepi.git proxy class created --- diff --git a/src/nepi/core/attributes.py b/src/nepi/core/attributes.py index d5dd4fd5..e57ba190 100644 --- a/src/nepi/core/attributes.py +++ b/src/nepi/core/attributes.py @@ -105,7 +105,8 @@ class Attribute(object): return not self.allowed or value in self._allowed def _is_valid(self, value): - return not self._validation_function or self._validation_function(value) + return not self._validation_function or \ + self._validation_function(self, value) class AttributesMap(object): """AttributesMap is the base class for every object whose attributes diff --git a/src/nepi/core/execute.py b/src/nepi/core/execute.py index e333940c..f39118e6 100644 --- a/src/nepi/core/execute.py +++ b/src/nepi/core/execute.py @@ -2,9 +2,9 @@ # -*- coding: utf-8 -*- from nepi.core.attributes import Attribute, AttributesMap +from nepi.util import proxy, validation from nepi.util.constants import STATUS_FINISHED from nepi.util.parser._xml import XmlExperimentParser -from nepi.util import validation import sys class ConnectorType(object): @@ -255,8 +255,8 @@ class ExperimentController(object): def testbed_instance(self, guid): return self._testbeds[guid] - def set_testbed_access_config(self, guid, access_config): - self._access_config[guid] = access_config + def set_access_configuration(self, testbed_guid, access_config): + self._access_config[testbed_guid] = access_config def trace(self, testbed_guid, guid, trace_id): return self._testbeds[testbed_guid].trace(guid, trace_id) @@ -289,13 +289,6 @@ class ExperimentController(object): for instance in self._testbeds.values(): instance.shutdown() - def _build_testbed_instance(self, testbed_id, testbed_version): - mod_name = "nepi.testbeds.%s" % (testbed_id.lower()) - if not mod_name in sys.modules: - __import__(mod_name) - module = sys.modules[mod_name] - return module.TestbedInstance(testbed_version) - def _create_testbed_instances(self): parser = XmlExperimentParser() data = parser.from_xml_to_data(self._experiment_xml) @@ -303,8 +296,10 @@ class ExperimentController(object): for guid in data.guids: if data.is_testbed_data(guid): (testbed_id, testbed_version) = data.get_testbed_data(guid) - instance = self._build_testbed_instance(testbed_id, - testbed_version) + access_config = None if guid not in self._access_config else\ + self._access_config[guid] + instance = proxy.create_testbed_instance(testbed_id, + testbed_version, access_config) for (name, value) in data.get_attribute_data(guid): instance.configure(name, value) self._testbeds[guid] = instance diff --git a/src/nepi/util/proxy.py b/src/nepi/util/proxy.py new file mode 100644 index 00000000..7cfd1350 --- /dev/null +++ b/src/nepi/util/proxy.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from nepi.core.attributes import AttributesMap, Attribute +from nepi.util import validation +import sys + +class AccessConfiguration(AttributesMap): + MODE_SINGLE_PROCESS = "SINGLE" + MODE_DAEMON = "DAEMON" + ACCESS_SSH = "SSH" + ACCESS_LOCAL = "LOCAL" + + def __init__(self): + super(AccessConfiguration, self).__init__() + self.add_attribute(name = "Mode", + help = "Instance execution mode", + type = Attribute.ENUM, + value = AccessConfiguration.MODE_SINGLE_PROCESS, + allowed = [AccessConfiguration.MODE_DAEMON, + AccessConfiguration.MODE_SINGLE_PROCESS], + validation_function = validation.is_enum) + self.add_attribute(name = "Communication", + help = "Instance communication mode", + type = Attribute.ENUM, + value = AccessConfiguration.ACCESS_LOCAL, + allowed = [AccessConfiguration.ACCESS_LOCAL, + AccessConfiguration.ACCESS_SSH], + validation_function = validation.is_enum) + self.add_attribute(name = "Host", + help = "Host where the instance will be executed", + type = Attribute.STRING, + value = "localhost", + validation_function = validation.is_string) + self.add_attribute(name = "User", + help = "User on the Host to execute the instance", + type = Attribute.STRING, + validation_function = validation.is_string) + self.add_attribute(name = "Port", + help = "Port on the Host", + type = Attribute.INTEGER, + value = 22, + validation_function = validation.is_integer) + self.add_attribute(name = "useAgent", + help = "Use -A option for forwarding of the authentication agent, if ssh access is used", + type = Attribute.BOOL, + value = False, + validation_function = validation.is_bool) + +def create_controller(xml, access_config): + from nepi.core.execute import ExperimentController + if not access_config or access_config.get_attribute_value("Mode") \ + == AccessConfiguration.MODE_SINGLE_PROCESS: + return ExperimentController(xml) + # TODO!! + return None + +def create_testbed_instance(testbed_id, testbed_version, access_config): + if not access_config or access_config.get_attribute_value("Mode") \ + == AccessConfiguration.MODE_SINGLE_PROCESS: + return _build_testbed_instance(testbed_id, testbed_version) + # TODO!! + return None + +def _build_testbed_instance(testbed_id, testbed_version): + mod_name = "nepi.testbeds.%s" % (testbed_id.lower()) + if not mod_name in sys.modules: + __import__(mod_name) + module = sys.modules[mod_name] + return module.TestbedInstance(testbed_version) + + diff --git a/src/nepi/util/server.py b/src/nepi/util/server.py index 1571c50a..271bf77c 100644 --- a/src/nepi/util/server.py +++ b/src/nepi/util/server.py @@ -1,5 +1,6 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- -# vim:ts=4:sw=4:et:ai:sts=4 + import errno import os import select diff --git a/src/nepi/util/validation.py b/src/nepi/util/validation.py index 8e0e94b8..6f8a25b1 100644 --- a/src/nepi/util/validation.py +++ b/src/nepi/util/validation.py @@ -4,30 +4,33 @@ import ipaddr import re -def is_bool(value): +def is_enum(attribute, value): + return isinstance(value, str) and value in attribute.allowed + +def is_bool(attribute, value): return isinstance(value, bool) -def is_integer(value): +def is_integer(attribute, value): return isinstance(value, int) -def is_string(value): +def is_string(attribute, value): return isinstance(value, str) -def is_ip4_address(value): +def is_ip4_address(attribute, value): try: ipaddr.IPv4Address(value) except ipaddr.AddressValueError: return False return True -def is_ip6_address(value): +def is_ip6_address(attribute, value): try: ipaddr.IPv6Address(value) except ipaddr.AddressValueError: return False return True -def is_mac_address(value): +def is_mac_address(attribute, value): regex = r'^([0-9a-zA-Z]{0,2}:)*[0-9a-zA-Z]{0,2}' found = re.search(regex, value) if not found or value.count(':') != 5: diff --git a/test/core/integration.py b/test/core/integration.py index e6b82fcf..1c004721 100755 --- a/test/core/integration.py +++ b/test/core/integration.py @@ -1,9 +1,9 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from nepi.core.execute import ExperimentController from nepi.core.design import ExperimentDescription, FactoriesProvider from nepi.util.constants import STATUS_FINISHED +from nepi.util import proxy import mock import mock.metadata_v01 import sys @@ -36,7 +36,8 @@ class ExecuteTestCase(unittest.TestCase): app.enable_trace("fake") xml = exp_desc.to_xml() - controller = ExperimentController(xml) + access_config = None + controller = proxy.create_controller(xml, access_config) controller.start() while not controller.is_finished(app.guid): time.sleep(0.5)