d1904b0047e84caf002c1fdfbc3d1d92350f019e
[nepi.git] / src / nepi / testbeds / netns / 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 TestbedInstance(testbed_impl.TestbedInstance):
9     def __init__(self, testbed_version):
10         super(TestbedInstance, self).__init__(TESTBED_ID, testbed_version)
11         self._netns = None
12         self._home_directory = None
13         self._traces = dict()
14
15     @property
16     def home_directory(self):
17         return self._home_directory
18
19     @property
20     def netns(self):
21         return self._netns
22
23     def do_setup(self):
24         self._home_directory = self._attributes.\
25             get_attribute_value("homeDirectory")
26         self._netns = self._load_netns_module()
27
28     def set(self, time, guid, name, value):
29         super(TestbedInstance, self).set(time, guid, name, value)
30         
31         # TODO: take on account schedule time for the task 
32         element = self._elements.get(guid)
33         if element:
34             setattr(element, name, value)
35
36     def get(self, time, guid, name):
37         # TODO: take on account schedule time for the task
38         element = self._elements.get(guid)
39         if element:
40             try:
41                 if hasattr(element, name):
42                     # Runtime attribute
43                     return getattr(element, name)
44                 else:
45                     # Try design-time attributes
46                     return self.box_get(time, guid, name)
47             except KeyError, AttributeError:
48                 return None
49
50     def get_route(self, guid, index, attribute):
51         # TODO: fetch real data from netns
52         try:
53             return self.box_get_route(guid, int(index), attribute)
54         except KeyError, AttributeError:
55             return None
56
57     def get_address(self, guid, index, attribute='Address'):
58         # TODO: fetch real data from netns
59         try:
60             return self.box_get_address(guid, int(index), attribute)
61         except KeyError, AttributeError:
62             return None
63
64
65     def action(self, time, guid, action):
66         raise NotImplementedError
67
68     def shutdown(self):
69         for trace in self._traces.values():
70             trace.close()
71         for element in self._elements.values():
72             element.destroy()
73
74     def trace_filename(self, guid, trace_id):
75         # TODO: Need to be defined inside a home!!!! with and experiment id_code
76         return os.path.join(self.home_directory, "%d_%s" % (guid, trace_id))
77
78     def follow_trace(self, trace_id, trace):
79         self._traces[trace_id] = trace
80
81     def _load_netns_module(self):
82         # TODO: Do something with the configuration!!!
83         import sys
84         __import__("netns")
85         netns_mod = sys.modules["netns"]
86         # enable debug
87         enable_debug = self._attributes.get_attribute_value("enableDebug")
88         if enable_debug:
89             netns_mod.environ.set_log_level(netns_mod.environ.LOG_DEBUG)
90         return netns_mod
91