node trace added to netns:Node. Bug: netns doesn't properly close subprocesses not...
[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 from nepi.util.constants import TIME_NOW
7 import os
8
9 class TestbedController(testbed_impl.TestbedController):
10     from nepi.util.tunchannel_impl import TunChannel
11
12     def __init__(self, testbed_version):
13         super(TestbedController, self).__init__(TESTBED_ID, testbed_version)
14         self._netns = None
15         self._home_directory = None
16         self._traces = dict()
17
18     @property
19     def home_directory(self):
20         return self._home_directory
21
22     @property
23     def netns(self):
24         return self._netns
25
26     def do_setup(self):
27         self._home_directory = self._attributes.\
28             get_attribute_value("homeDirectory")
29         self._netns = self._load_netns_module()
30         super(TestbedController, self).do_setup()
31
32     def set(self, guid, name, value, time = TIME_NOW):
33         super(TestbedController, self).set(guid, name, value, time)
34         # TODO: take on account schedule time for the task 
35         factory_id = self._create[guid]
36         factory = self._factories[factory_id]
37         if factory.box_attributes.is_attribute_design_only(name):
38             return
39         element = self._elements.get(guid)
40         if element:
41             setattr(element, name, value)
42
43     def get(self, guid, name, time = TIME_NOW):
44         value = super(TestbedController, self).get(guid, name, time)
45         # TODO: take on account schedule time for the task
46         factory_id = self._create[guid]
47         factory = self._factories[factory_id]
48         if factory.box_attributes.is_attribute_design_only(name):
49             return value
50         element = self._elements.get(guid)
51         try:
52             return getattr(element, name)
53         except KeyError, AttributeError:
54             return value
55
56     def action(self, time, guid, action):
57         raise NotImplementedError
58
59     def shutdown(self):
60         for guid, traces in self._traces.iteritems():
61             for trace_id, (trace, filename) in traces.iteritems():
62                 if hasattr(trace, "close"):
63                     trace.close()
64         for guid, element in self._elements.iteritems():
65             if isinstance(element, self.TunChannel):
66                 element.Cleanup()
67             else:
68                 factory_id = self._create[guid]
69                 if factory_id == "Node":
70                     element.destroy()
71         self._elements.clear()
72
73     def trace_filename(self, guid, trace_id, filename = None):
74         if not filename:
75             (trace, filename) = self._traces[guid][trace_id]
76         return os.path.join(self.home_directory, filename)
77
78     def follow_trace(self, guid, trace_id, trace, filename):
79         if not guid in self._traces:
80             self._traces[guid] = dict()
81         self._traces[guid][trace_id] = (trace, filename)
82
83     def _load_netns_module(self):
84         # TODO: Do something with the configuration!!!
85         import sys
86         __import__("netns")
87         netns_mod = sys.modules["netns"]
88         # enable debug
89         enable_debug = self._attributes.get_attribute_value("enableDebug")
90         if enable_debug:
91             netns_mod.environ.set_log_level(netns_mod.environ.LOG_DEBUG)
92         return netns_mod
93