X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fchannel.py;h=3abbc14d7e91c606807c992713c27a62563997f0;hb=f025a30a215310a9803067a25e244137b71f56f2;hp=deb2dfaa40311d3275aad4215d629bb5c8e116d4;hpb=3a6069462cde81bae78eee971c6a4cb50b2d60d7;p=nepi.git diff --git a/src/nepi/resources/omf/channel.py b/src/nepi/resources/omf/channel.py index deb2dfaa..3abbc14d 100644 --- a/src/nepi/resources/omf/channel.py +++ b/src/nepi/resources/omf/channel.py @@ -1,31 +1,33 @@ -""" - NEPI, a framework to manage network experiments - Copyright (C) 2013 INRIA - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -""" - -from nepi.execution.resource import ResourceManager, clsinit, ResourceState, \ - reschedule_delay +# +# NEPI, a framework to manage network experiments +# Copyright (C) 2013 INRIA +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Author: Alina Quereilhac +# Julien Tribino + +from nepi.execution.resource import ResourceManager, clsinit_copy, \ + ResourceState, reschedule_delay from nepi.execution.attribute import Attribute, Flags -from nepi.resources.omf.omf_api import OMFAPIFactory +from nepi.resources.omf.omf_resource import ResourceGateway, OMFResource +from nepi.resources.omf.omf_api_factory import OMFAPIFactory -@clsinit -class OMFChannel(ResourceManager): +@clsinit_copy +class OMFChannel(OMFResource): """ .. class:: Class Args : @@ -36,29 +38,33 @@ class OMFChannel(ResourceManager): :param creds: Credentials to communicate with the rm (XmppClient for OMF) :type creds: dict - .. note:: - - This class is used only by the Experiment Controller through the Resource Factory - """ _rtype = "OMFChannel" _authorized_connections = ["OMFWifiInterface", "OMFNode"] + ChannelToFreq = dict({ + "1" : "2412", + "2" : "2417", + "3" : "2422", + "4" : "2427", + "5" : "2432", + "6" : "2437", + "7" : "2442", + "8" : "2447", + "9" : "2452", + "10" : "2457", + "11" : "2462", + "12" : "2467", + "13" : "2472", + }) @classmethod def _register_attributes(cls): """Register the attributes of an OMF channel + """ channel = Attribute("channel", "Name of the application") - xmppSlice = Attribute("xmppSlice","Name of the slice", flags = Flags.Credential) - xmppHost = Attribute("xmppHost", "Xmpp Server",flags = Flags.Credential) - xmppPort = Attribute("xmppPort", "Xmpp Port",flags = Flags.Credential) - xmppPassword = Attribute("xmppPassword", "Xmpp Port",flags = Flags.Credential) cls._register_attribute(channel) - cls._register_attribute(xmppSlice) - cls._register_attribute(xmppHost) - cls._register_attribute(xmppPort) - cls._register_attribute(xmppPassword) def __init__(self, ec, guid): """ @@ -66,24 +72,22 @@ class OMFChannel(ResourceManager): :type ec: ExperimentController :param guid: guid of the RM :type guid: int - :param creds: Credentials to communicate with the rm (XmppClient for OMF) - :type creds: dict """ super(OMFChannel, self).__init__(ec, guid) self._nodes_guid = list() + self.frequency = None self._omf_api = None @property def exp_id(self): - if self.ec.exp_id.startswith('exp-'): - return None return self.ec.exp_id def valid_connection(self, guid): - """Check if the connection with the guid in parameter is possible. Only meaningful connections are allowed. + """ Check if the connection with the guid in parameter is possible. + Only meaningful connections are allowed. :param guid: Guid of the current RM :type guid: int @@ -91,11 +95,13 @@ class OMFChannel(ResourceManager): """ rm = self.ec.get_resource(guid) - if rm.rtype() in self._authorized_connections: - msg = "Connection between %s %s and %s %s accepted" % (self.rtype(), self._guid, rm.rtype(), guid) + if rm.get_rtype() in self._authorized_connections: + msg = "Connection between %s %s and %s %s accepted" % ( + self.get_rtype(), self._guid, rm.get_rtype(), guid) self.debug(msg) return True - msg = "Connection between %s %s and %s %s refused" % (self.rtype(), self._guid, rm.rtype(), guid) + msg = "Connection between %s %s and %s %s refused" % ( + self.get_rtype(), self._guid, rm.get_rtype(), guid) self.debug(msg) return False @@ -114,88 +120,73 @@ class OMFChannel(ResourceManager): rm_iface = self.ec.get_resource(elt) for conn in rm_iface.connections: rm_node = self.ec.get_resource(conn) - if rm_node.rtype() == "OMFNode" and rm_node.get('hostname'): - if rm_iface.state < ResourceState.READY or rm_node.state < ResourceState.READY: + if rm_node.get_rtype() == "OMFNode" and rm_node.get('hostname'): + if rm_iface.state < ResourceState.PROVISIONED or \ + rm_node.state < ResourceState.READY: return "reschedule" - couple = [rm_node.get('hostname'), rm_iface.get('alias')] - #print couple + couple = [rm_node.get('hostname'), rm_iface.alias] res.append(couple) return res - def discover(self): - """ Discover the availables channels + def get_frequency(self, channel): + """ Returns the frequency of a specific channel number - """ - pass - - def provision(self): - """ Provision some availables channels - - """ - pass + """ + return OMFChannel.ChannelToFreq[channel] - def deploy(self): - """Deploy the RM. It means : Get the xmpp client and send messages using OMF 5.4 protocol to configure the channel - It becomes DEPLOYED after sending messages to configure the channel - - """ - if not self._omf_api : - self._omf_api = OMFAPIFactory.get_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'), exp_id = self.exp_id) - - if not self._omf_api : - self._state = ResourceState.FAILED - msg = "Credentials are not initialzed. XMPP Connections impossible" - self.error(msg) - return + def do_deploy(self): + """ Deploy the RM. It means : Get the xmpp client and send messages + using OMF 5.4 or 6 protocol to configure the channel. + """ if not self.get('channel'): - self._state = ResourceState.FAILED msg = "Channel's value is not initialized" self.error(msg) - raise + raise RuntimeError, msg - self._nodes_guid = self._get_target(self._connections) - if self._nodes_guid == "reschedule" : - self.ec.schedule("2s", self.deploy) - return False + if self.get('version') == "6": + self.frequency = self.get_frequency(self.get('channel')) + super(OMFChannel, self).do_deploy() + return - try: - for couple in self._nodes_guid: - #print "Couple node/alias : " + couple[0] + " , " + couple[1] - attrval = self.get('channel') - attrname = "net/%s/%s" % (couple[1], 'channel') - self._omf_api.configure(couple[0], attrname, attrval) - except AttributeError: - self._state = ResourceState.FAILED - msg = "Credentials are not initialzed. XMPP Connections impossible" + + if not self.get('xmppServer'): + msg = "XmppServer is not initialzed. XMPP Connections impossible" self.error(msg) - raise + raise RuntimeError, msg - super(OMFChannel, self).deploy() + if not (self.get('xmppUser') or self.get('xmppPort') + or self.get('xmppPassword')): + msg = "Credentials are not all initialzed. Default values will be used" + self.warn(msg) - def start(self): - """Start the RM. It means nothing special for a channel for now - It becomes STARTED as soon as this method starts. + if not self._omf_api : + self._omf_api = OMFAPIFactory.get_api(self.get('version'), + self.get('xmppServer'), self.get('xmppUser'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.exp_id) - """ + self._nodes_guid = self._get_target(self._connections) - super(OMFChannel, self).start() - def stop(self): - """Stop the RM. It means nothing special for a channel for now - It becomes STOPPED as soon as this method is called - """ - super(OMFChannel, self).stop() + if self._nodes_guid == "reschedule" : + self.ec.schedule("1s", self.deploy) + else: + for couple in self._nodes_guid: + attrval = self.get('channel') + attrname = "net/%s/%s" % (couple[1], 'channel') + self._omf_api.configure(couple[0], attrname, attrval) + + super(OMFChannel, self).do_deploy() - def release(self): - """Clean the RM at the end of the experiment and release the API + def do_release(self): + """ Clean the RM at the end of the experiment and release the API """ if self._omf_api : - OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword'), exp_id = self.exp_id) + OMFAPIFactory.release_api(self.get('version'), + self.get('xmppServer'), self.get('xmppUser'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.exp_id) - super(OMFChannel, self).release() + super(OMFChannel, self).do_release()