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