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