description classes are generic classes with no testbed specific code.
[nepi.git] / src / nepi / core / experiment.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from nepi.utils.guid import GuidGenerator 
5 import sys
6
7 class ExperimentDescription(object):
8     def __init__(self, guid = 0):
9         self._guid_generator = GuidGenerator(guid)
10         # testbed design instances
11         self._testbed_descriptions = dict()
12         self._testbed_providers = dict()
13
14     @property
15     def xml_description(self):
16         raise NotImplementedError
17
18     def add_testbed_description(self, testbed_id, testbed_version):
19         testbed_module = self._testbed_module(testbed_id)
20         testbed_provider = self._testbed_provider(testbed_id, testbed_version)
21         testbed_description = testbed_module.create_description_instance(
22                 self._guid_generator, tesbed_id, testbed_version, 
23                 testbed_provider)
24         guid = testbed_description.guid
25         self._testbed_descriptions[guid] = testbed_description
26
27     def remove_testbed_description(self, testbed_description):
28         guid = testbed_description.guid
29         del self._testbed_descriptions[guid]
30
31     def _testbed_module(self, testbed_id):
32         mod_name = 'nepi.testbeds.%s' % testbed_id
33         if not mod_name in sys.modules:
34             __import__(mod_name)
35         return sys.modules[mod_name]
36
37     def _testbed_provider(self, testbed_id, testbed_version):
38         key = "%s_%s" % (testbed_id, testbed_version)
39         if key not in self._testbed_providers:
40             testbed_module = self._testbed_module(testbed_id)
41             testbed_provider = testbed_module.create_provider(testbed_version)
42             self._testbed_providers[key] = testbed_provider
43         return self._testbed_providers[key]
44