8636677b27ffae3f5e49799d19b4e7147f08bc1c
[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 AF_INET, AF_INET6
7 import os
8
9 class TestbedInstance(testbed_impl.TestbedInstance):
10     def __init__(self, testbed_version):
11         super(TestbedInstance, self).__init__(TESTBED_ID, testbed_version)
12         self._netns = None
13         self._home_directory = None
14         self._traces = dict()
15
16     @property
17     def home_directory(self):
18         return self._home_directory
19
20     @property
21     def netns(self):
22         return self._netns
23
24     def do_setup(self):
25         self._home_directory = self._attributes.\
26             get_attribute_value("homeDirectory")
27         self._netns = self._load_netns_module()
28
29     def do_configure(self):
30         # TODO: add traces!
31         # configure addressess
32         for guid, addresses in self._add_address.iteritems():
33             element = self._elements[guid]
34             for address in addresses:
35                 (family, address, netprefix, broadcast) = address
36                 if family == AF_INET:
37                     element.add_v4_address(address, netprefix)
38         # configure routes
39         for guid, routes in self._add_route.iteritems():
40             element = self._elements[guid]
41             for route in routes:
42                 (destination, netprefix, nexthop) = route
43                 element.add_route(prefix = destination, prefix_len = netprefix,
44                         nexthop = nexthop)
45
46     def set(self, time, guid, name, value):
47         super(TestbedInstance, self).set(time, guid, name, value)
48         # TODO: take on account schedule time for the task 
49         element = self._elements[guid]
50         if element:
51             setattr(element, name, value)
52
53     def get(self, time, guid, name):
54         # TODO: take on account schedule time for the task
55         element = self._elements[guid]
56         return getattr(element, name)
57
58     def action(self, time, guid, action):
59         raise NotImplementedError
60
61     def trace(self, guid, trace_id):
62         f = open(self.trace_filename(guid, trace_id), "r")
63         content = f.read()
64         f.close()
65         return content
66
67     def shutdown(self):
68         for trace in self._traces.values():
69             trace.close()
70         for element in self._elements.values():
71             element.destroy()
72
73     def trace_filename(self, guid, trace_id):
74         # TODO: Need to be defined inside a home!!!! with and experiment id_code
75         return os.path.join(self.home_directory, "%d_%s" % (guid, trace_id))
76
77     def follow_trace(self, trace_id, trace):
78         self._traces[trace_id] = trace
79
80     def _load_netns_module(self):
81         # TODO: Do something with the configuration!!!
82         import sys
83         __import__("netns")
84         netns_mod = sys.modules["netns"]
85         # enable debug
86         enable_debug = self._attributes.get_attribute_value("enableDebug")
87         if enable_debug:
88             netns_mod.environ.set_log_level(netns_mod.environ.LOG_DEBUG)
89         return netns_mod
90