Ticket #23: rename TestbedInstance -> TestbedController
[nepi.git] / src / nepi / testbeds / planetlab / execute.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from constants import TESTBED_ID
5 from nepi.core import testbed_impl
6 import os
7
8 class TestbedController(testbed_impl.TestbedController):
9     def __init__(self, testbed_version):
10         super(TestbedController, self).__init__(TESTBED_ID, testbed_version)
11         self._home_directory = None
12         self._traces = dict()
13
14     @property
15     def home_directory(self):
16         return self._home_directory
17
18     def do_setup(self):
19         self._home_directory = self._attributes.\
20             get_attribute_value("homeDirectory")
21
22     def set(self, time, guid, name, value):
23         super(TestbedController, self).set(time, guid, name, value)
24         # TODO: take on account schedule time for the task 
25         element = self._elements[guid]
26         if element:
27             setattr(element, name, value)
28
29     def get(self, time, guid, name):
30         # TODO: take on account schedule time for the task
31         element = self._elements.get(guid)
32         if element:
33             try:
34                 if hasattr(element, name):
35                     # Runtime attribute
36                     return getattr(element, name)
37                 else:
38                     # Try design-time attributes
39                     return self.box_get(time, guid, name)
40             except KeyError, AttributeError:
41                 return None
42
43     def get_route(self, guid, index, attribute):
44         # TODO: fetch real data from planetlab
45         try:
46             return self.box_get_route(guid, int(index), attribute)
47         except KeyError, AttributeError:
48             return None
49
50     def get_address(self, guid, index, attribute='Address'):
51         # TODO: fetch real data from planetlab
52         try:
53             return self.box_get_address(guid, int(index), attribute)
54         except KeyError, AttributeError:
55             return None
56
57
58     def action(self, time, guid, action):
59         raise NotImplementedError
60
61     def shutdown(self):
62         for trace in self._traces.values():
63             trace.close()
64         for element in self._elements.values():
65             element.destroy()
66
67     def trace_filename(self, guid, trace_id):
68         # TODO: Need to be defined inside a home!!!! with and experiment id_code
69         return os.path.join(self.home_directory, "%d_%s" % (guid, trace_id))
70
71     def follow_trace(self, trace_id, trace):
72         self._traces[trace_id] = trace
73
74