a0db32937740d6d1cb441ade4c7e53e641bbdd79
[nepi.git] / src / nepi / core / experiment.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from nepi.util.guid import GuidGenerator
5 from nepi.util.parser.xml import XmlParser
6 import sys
7
8 class ExperimentDescription(object):
9     def __init__(self, guid = 0):
10         self._guid_generator = GuidGenerator(guid)
11         # testbed design instances
12         self._testbed_descriptions = dict()
13         self._testbed_providers = dict()
14
15     @property
16     def testbed_descriptions(self):
17         return self._testbed_descriptions.values()
18
19     @property
20     def xml_description(self):
21         parser = XmlParser()
22         return parser.to_xml(self)
23
24     def testbed_description(self, guid):
25         return self._testbed_descriptions[guid] \
26                 if guid in self._testbed_descriptions else None
27
28     def box(self, guid):
29         for testbed_description in self._testbed_descriptions.values():
30             box = testbed_description.box(guid)
31             if box: return box
32         return None
33
34     def add_testbed_description(self, testbed_id, testbed_version):
35         testbed_module = self._testbed_module(testbed_id)
36         testbed_provider = self._testbed_provider(testbed_id, testbed_version)
37         testbed_description = testbed_module.create_description_instance(
38                 self._guid_generator, testbed_version, testbed_provider)
39         guid = testbed_description.guid
40         self._testbed_descriptions[guid] = testbed_description
41         return testbed_description
42
43     def remove_testbed_description(self, testbed_description):
44         guid = testbed_description.guid
45         del self._testbed_descriptions[guid]
46
47     def _testbed_module(self, testbed_id):
48         mod_name = 'nepi.testbeds.%s' % testbed_id
49         if not mod_name in sys.modules:
50             __import__(mod_name)
51         return sys.modules[mod_name]
52
53     def _testbed_provider(self, testbed_id, testbed_version):
54         key = "%s_%s" % (testbed_id, testbed_version)
55         if key not in self._testbed_providers:
56             testbed_module = self._testbed_module(testbed_id)
57             testbed_provider = testbed_module.create_provider(testbed_version)
58             self._testbed_providers[key] = testbed_provider
59         return self._testbed_providers[key]
60