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
# -*- 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):
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)
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)
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
--- /dev/null
+#!/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)
+
+
+#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# vim:ts=4:sw=4:et:ai:sts=4
+
import errno
import os
import select
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:
#!/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
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)