Implementing PlanetLab testbed
[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.slicename = None
13         self._traces = dict()
14         
15         import node, interfaces
16         self._node = node
17         self._interfaces = interfaces
18
19     @property
20     def home_directory(self):
21         return self._home_directory
22
23     def do_setup(self):
24         self._home_directory = self._attributes.\
25             get_attribute_value("homeDirectory")
26         self.slicename = self._attributes.\
27             get_attribute_value("slice")
28
29     def do_create(self):
30         # Create node elements per XML data
31         super(TestbedController, self).do_create()
32         
33         # Perform resource discovery if we don't have
34         # specific resources assigned yet
35         self.do_resource_discovery()
36         
37         # Create PlanetLab slivers
38         self.do_provisioning()
39         
40         # Wait for all nodes to be ready
41         self.wait_nodes()
42
43     def set(self, time, guid, name, value):
44         super(TestbedController, self).set(time, guid, name, value)
45         # TODO: take on account schedule time for the task 
46         element = self._elements[guid]
47         if element:
48             setattr(element, name, value)
49
50     def get(self, time, guid, name):
51         # TODO: take on account schedule time for the task
52         element = self._elements.get(guid)
53         if element:
54             try:
55                 if hasattr(element, name):
56                     # Runtime attribute
57                     return getattr(element, name)
58                 else:
59                     # Try design-time attributes
60                     return self.box_get(time, guid, name)
61             except KeyError, AttributeError:
62                 return None
63
64     def get_route(self, guid, index, attribute):
65         # TODO: fetch real data from planetlab
66         try:
67             return self.box_get_route(guid, int(index), attribute)
68         except KeyError, AttributeError:
69             return None
70
71     def get_address(self, guid, index, attribute='Address'):
72         # TODO: fetch real data from planetlab
73         try:
74             return self.box_get_address(guid, int(index), attribute)
75         except KeyError, AttributeError:
76             return None
77
78
79     def action(self, time, guid, action):
80         raise NotImplementedError
81
82     def shutdown(self):
83         for trace in self._traces.values():
84             trace.close()
85         for element in self._elements.values():
86             element.destroy()
87
88     def trace_filename(self, guid, trace_id):
89         # TODO: Need to be defined inside a home!!!! with and experiment id_code
90         return os.path.join(self.home_directory, "%d_%s" % (guid, trace_id))
91
92     def follow_trace(self, trace_id, trace):
93         self._traces[trace_id] = trace
94
95     def _make_node(self, parameters):
96         node = self._node.Node()
97         
98         # Note: there is 1-to-1 correspondence between attribute names
99         #   If that changes, this has to change as well
100         for attr in parameters.get_attribute_names():
101             setattr(node, attr, parameters.get_attribute_value(attr))
102         
103         return node
104     
105     def _make_node_iface(self, parameters):
106         iface = self._interfaces.NodeIface()
107         
108         # Note: there is 1-to-1 correspondence between attribute names
109         #   If that changes, this has to change as well
110         for attr in parameters.get_attribute_names():
111             setattr(iface, attr, parameters.get_attribute_value(attr))
112         
113         return iface
114     
115     def _make_tun_iface(self, parameters):
116         iface = self._interfaces.TunIface()
117         
118         # Note: there is 1-to-1 correspondence between attribute names
119         #   If that changes, this has to change as well
120         for attr in parameters.get_attribute_names():
121             setattr(iface, attr, parameters.get_attribute_value(attr))
122         
123         return iface
124     
125     def _make_internet(self, parameters):
126         return self._node.Internet()
127