proxy class created
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 9 Mar 2011 17:44:18 +0000 (18:44 +0100)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Wed, 9 Mar 2011 17:44:18 +0000 (18:44 +0100)
src/nepi/core/attributes.py
src/nepi/core/execute.py
src/nepi/util/proxy.py [new file with mode: 0644]
src/nepi/util/server.py
src/nepi/util/validation.py
test/core/integration.py

index d5dd4fd..e57ba19 100644 (file)
@@ -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 
index e333940..f39118e 100644 (file)
@@ -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 (file)
index 0000000..7cfd135
--- /dev/null
@@ -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)
+
+
index 1571c50..271bf77 100644 (file)
@@ -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
index 8e0e94b..6f8a25b 100644 (file)
@@ -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:
index e6b82fc..1c00472 100755 (executable)
@@ -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)