Bug fixing Netns emulation
[nepi.git] / src / nepi / resources / netns / netnsbase.py
1 #
2 #    NEPI, a framework to manage network experiments
3 #    Copyright (C) 2014 INRIA
4 #
5 #    This program is free software: you can redistribute it and/or modify
6 #    it under the terms of the GNU General Public License as published by
7 #    the Free Software Foundation, either version 3 of the License, or
8 #    (at your option) any later version.
9 #
10 #    This program is distributed in the hope that it will be useful,
11 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #    GNU General Public License for more details.
14 #
15 #    You should have received a copy of the GNU General Public License
16 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19
20 from nepi.execution.resource import ResourceManager, clsinit_copy, \
21         ResourceState
22 from nepi.execution.attribute import Flags
23 from nepi.execution.trace import TraceAttr
24
25 @clsinit_copy
26 class NetNSBase(ResourceManager):
27     _rtype = "abstract::netns::Object"
28     _platform = "netns"
29
30     def __init__(self, ec, guid):
31         super(NetNSBase, self).__init__(ec, guid)
32         self._uuid = None
33         self._connected = set()
34         self._trace_filename = dict()
35
36     @property
37     def connected(self):
38         return self._connected
39
40     @property
41     def uuid(self):
42         return self._uuid
43
44     def trace(self, name, attr = TraceAttr.ALL, block = 512, offset = 0):
45         filename = self._trace_filename.get(name)
46         if not filename:
47             self.error("Can not resolve trace %s. Did you enabled it?" % name)
48             return ""
49
50         return self.emulation.trace(filename, attr, block, offset)
51
52     @property
53     def _rms_to_wait(self):
54         """ Returns the collection of RMs that this RM needs to
55         wait for before start
56
57         This method should be overriden to wait for other
58         objects to be deployed before proceeding with the deployment
59
60         """
61         raise RuntimeError, "No dependencies defined!"
62
63     def _instantiate_object(self):
64         pass
65
66     def _wait_rms(self):
67         rms = set()
68         for rm in self._rms_to_wait:
69             if rm is not None:
70                 rms.add(rm)
71
72         """ Returns True if dependent RMs are not yer READY, False otherwise"""
73         for rm in rms:
74             if rm.state < ResourceState.READY:
75                 return True
76         return False
77
78     def do_provision(self):
79         self._instantiate_object()
80       
81         self.info("Provisioning finished")
82
83         super(NetNSBase, self).do_provision()
84
85     def do_deploy(self):
86         if self._wait_rms():
87             self.debug("---- RESCHEDULING DEPLOY ----" )
88             self.ec.schedule(self.reschedule_delay, self.deploy)
89         else:
90             self.do_discover()
91             self.do_provision()
92
93             self.set_ready()
94
95     def do_start(self):
96         if self.state == ResourceState.READY:
97             # No need to do anything, emulation.Run() will start every object
98             self.info("Starting")
99             self.set_started()
100         else:
101             msg = " Failed "
102             self.error(msg, out, err)
103             raise RuntimeError, msg
104
105     def do_stop(self):
106         if self.state == ResourceState.STARTED:
107             # No need to do anything, emulation.Destroy() will stop every object
108             self.set_stopped()
109     
110     @property
111     def state(self):
112         return self._state
113
114     def get(self, name):
115         #flags = Flags.NoWrite | Flags.NoRead | Flags.Design
116         flags = Flags.Design
117         if self.state in [ResourceState.READY, ResourceState.STARTED] \
118                 and not self.has_flag(name, flags):
119             return self.emulation.emu_get(self.uuid, name)
120         
121         value = super(NetNSBase, self).get(name)
122         return value
123
124     def set(self, name, value):
125         flags = Flags.Design
126         if (self.state > ResourceState.NEW and \
127                 self.has_flag(name, Flags.Design)) or \
128                 self.has_flag(name, Flags.NoWrite):
129             out = err = ""
130             msg = " Cannot change Design only attribue %s" % name
131             self.error(msg, out, err)
132             return 
133
134         if self.state in [ResourceState.READY, ResourceState.STARTED]:
135             self.emulation.emu_set(self.uuid, name, value)
136         
137         value = super(NetNSBase, self).set(name, value)
138
139         return value
140