2 # NEPI, a framework to manage network experiments
3 # Copyright (C) 2013 INRIA
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.
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.
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/>.
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19 # Julien Tribino <julien.tribino@inria.fr>
22 from nepi.execution.resource import ResourceManager, clsinit, ResourceState
23 from nepi.execution.attribute import Attribute, Flags
25 from nepi.resources.omf.omf_api import OMFAPIFactory
29 reschedule_delay = "0.5s"
32 class OMFNode(ResourceManager):
34 .. class:: Class Args :
36 :param ec: The Experiment controller
37 :type ec: ExperimentController
38 :param guid: guid of the RM
40 :param creds: Credentials to communicate with the rm (XmppClient for OMF)
45 This class is used only by the Experiment Controller through the Resource Factory
49 _authorized_connections = ["OMFApplication" , "OMFWifiInterface"]
52 def _register_attributes(cls):
53 """Register the attributes of an OMF Node
56 hostname = Attribute("hostname", "Hostname of the machine")
57 cpu = Attribute("cpu", "CPU of the node")
58 ram = Attribute("ram", "RAM of the node")
59 xmppSlice = Attribute("xmppSlice","Name of the slice",
60 flags = Flags.Credential)
61 xmppHost = Attribute("xmppHost", "Xmpp Server",
62 flags = Flags.Credential)
63 xmppPort = Attribute("xmppPort", "Xmpp Port",
64 flags = Flags.Credential)
65 xmppPassword = Attribute("xmppPassword", "Xmpp Port",
66 flags = Flags.Credential)
68 host = Attribute("host", "Hostname of the machine",
70 gateway = Attribute("gateway", "Gateway",
72 granularity = Attribute("granularity", "Granularity of the reservation time",
74 hardware_type = Attribute("hardware_type", "Hardware type of the machine",
77 cls._register_attribute(hostname)
78 cls._register_attribute(ram)
79 cls._register_attribute(cpu)
80 cls._register_attribute(xmppSlice)
81 cls._register_attribute(xmppHost)
82 cls._register_attribute(xmppPort)
83 cls._register_attribute(xmppPassword)
85 cls._register_attribute(host)
86 cls._register_attribute(gateway)
87 cls._register_attribute(granularity)
88 cls._register_attribute(hardware_type)
90 # XXX: We don't necessary need to have the credentials at the
91 # moment we create the RM
92 def __init__(self, ec, guid):
94 :param ec: The Experiment controller
95 :type ec: ExperimentController
96 :param guid: guid of the RM
98 :param creds: Credentials to communicate with the rm (XmppClient for OMF)
102 super(OMFNode, self).__init__(ec, guid)
108 def _validate_connection(self, guid):
109 """Check if the connection is available.
111 :param guid: Guid of the current RM
116 rm = self.ec.get_resource(guid)
117 if rm.rtype() in self._authorized_connections:
118 msg = "Connection between %s %s and %s %s accepted" % (self.rtype(), self._guid, rm.rtype(), guid)
121 msg = "Connection between %s %s and %s %s refused" % (self.rtype(), self._guid, rm.rtype(), guid)
129 if not self._omf_api :
130 self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'),
131 self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'))
132 self._omf_api.enroll_host(self.get('hostname'))
134 super(OMFNode, self).deploy()
137 """ Discover the availables nodes
143 """ Provision some availables nodes
149 """Send Xmpp Message Using OMF protocol to enroll the node into the experiment
152 super(OMFNode, self).start()
156 """Send Xmpp Message Using OMF protocol to disconnect the node
159 super(OMFNode, self).stop()
162 """Clean the RM at the end of the experiment
165 self._omf_api.release(self.get('hostname'))
166 OMFAPIFactory.release_api(self.get('xmppSlice'),
167 self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'))
171 #routes = self.tc._add_route.get(self.guid, [])
172 #iface_guids = self.tc.get_connected(self.guid, "devs", "node")
175 (destination, netprefix, nexthop, metric, device) = route
176 netmask = ipaddr2.ipv4_mask2dot(netprefix)
178 # Validate that the interface is associated to the node
179 for iface_guid in iface_guids:
180 iface = self.tc.elements.get(iface_guid)
181 if iface.devname == device:
182 self._omf_api.execute(self.get('hostname'),
183 "Id#%s" % str(random.getrandbits(128)),
184 "add -net %s netmask %s dev %s" % (destination, netmask, iface.devname),
185 "/sbin/route", # path