NEPI DCE integration with CCN example
[nepi.git] / src / nepi / resources / ns3 / ns3node.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.attribute import Attribute, Flags, Types
21 from nepi.execution.resource import clsinit_copy
22 from nepi.resources.ns3.ns3base import NS3Base
23
24 @clsinit_copy
25 class NS3BaseNode(NS3Base):
26     _rtype = "abstract::ns3::Node"
27
28     @property
29     def simulation(self):
30         from nepi.resources.ns3.ns3simulation import NS3Simulation
31         for guid in self.connections:
32             rm = self.ec.get_resource(guid)
33             if isinstance(rm, NS3Simulation):
34                 return rm
35
36         msg = "Node not connected to simulation"
37         self.error(msg)
38         raise RuntimeError, msg
39  
40     @property
41     def ipv4(self):
42         from nepi.resources.ns3.ns3ipv4l3protocol import NS3BaseIpv4L3Protocol
43         ipv4s = self.get_connected(NS3BaseIpv4L3Protocol.get_rtype())
44         if ipv4s: return ipv4s[0]
45         return None
46
47     @property
48     def mobility(self):
49         from nepi.resources.ns3.ns3mobilitymodel import NS3BaseMobilityModel
50         mobility = self.get_connected(NS3BaseMobilityModel.get_rtype())
51         if mobility: return mobility[0]
52         return None
53
54     @property
55     def devices(self):
56         from nepi.resources.ns3.ns3netdevice import NS3BaseNetDevice
57         devices = self.get_connected(NS3BaseNetDevice.get_rtype())
58
59         if not devices: 
60             msg = "Node not connected to devices"
61             self.error(msg)
62             raise RuntimeError, msg
63
64         return devices
65
66     @property
67     def dceapplications(self):
68         from nepi.resources.ns3.ns3dceapplication import NS3BaseDceApplication
69         dceapplications = self.get_connected(NS3BaseDceApplication.get_rtype())
70
71         return dceapplications
72
73     @property
74     def _rms_to_wait(self):
75         rms = set()
76         rms.add(self.simulation)
77
78         ipv4 = self.ipv4
79         if ipv4:
80             rms.add(ipv4)
81
82         mobility = self.mobility
83         if mobility:
84             rms.add(mobility)
85
86         return rms
87
88     def _configure_object(self):
89         ### node.AggregateObject(PacketSocketFactory())
90         uuid_packet_socket_factory = self.simulation.create("PacketSocketFactory")
91         self.simulation.invoke(self.uuid, "AggregateObject", uuid_packet_socket_factory)
92
93         dceapplications = self.dceapplications
94         if dceapplications:
95             self._add_dce(dceapplications)
96
97     def _connect_object(self):
98         ipv4 = self.ipv4
99         if ipv4:
100             self.simulation.invoke(self.uuid, "AggregateObject", ipv4.uuid)
101
102         mobility = self.mobility
103         if mobility:
104             self.simulation.invoke(self.uuid, "AggregateObject", mobility.uuid)
105
106     def _add_dce(self, dceapplications):
107         dceapp = dceapplications[0]
108
109         container_uuid = self.simulation.create("NodeContainer")
110         self.simulation.invoke(container_uuid, "Add", self.uuid)
111         with dceapp.dce_manager_lock:
112             self.simulation.invoke(dceapp.dce_manager_helper_uuid, 
113                     "Install", container_uuid)
114