32214600275619d0dd32cc40de62e53770313050
[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, reschedule_delay
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     _backend_type = "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(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, simulation.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, simulation.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         if name != "critical":
123             print name, value, "lalal"
124         return value
125
126     def set(self, name, value):
127         #flags = Flags.NoWrite | Flags.NoRead | Flags.Design
128         flags = Flags.Design
129         if self.has_flag(name, flags):
130             out = err = ""
131             msg = " Cannot change Design only attribue %s" % name
132             self.error(msg, out, err)
133             return 
134
135         if self.state in [ResourceState.READY, ResourceState.STARTED]:
136             self.emulation.emu_set(self.uuid, name, value)
137         
138         value = super(NetNSBase, self).set(name, value)
139         if name != "critical":
140             print name, value, "IEEEEEEEE:"
141
142         return value
143