X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fnode.py;h=d51725eebb3a904e73231b83fa2ed3c7123380cb;hb=e55924b6886bd7382a28e1ae235c4810f852e163;hp=4229f4403d0f5b4c899480cd54da3348a75e792e;hpb=09ac796bac9aa2c41c5ad830f404fe128fffb22d;p=nepi.git diff --git a/src/nepi/resources/omf/node.py b/src/nepi/resources/omf/node.py index 4229f440..d51725ee 100644 --- a/src/nepi/resources/omf/node.py +++ b/src/nepi/resources/omf/node.py @@ -3,9 +3,8 @@ # 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. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,14 +17,18 @@ # Author: Alina Quereilhac # Julien Tribino +from nepi.util.timefuncs import tnow from nepi.execution.resource import ResourceManager, clsinit_copy, \ - ResourceState, reschedule_delay + ResourceState from nepi.execution.attribute import Attribute, Flags from nepi.resources.omf.omf_resource import ResourceGateway, OMFResource -from nepi.resources.omf.omf_api import OMFAPIFactory +from nepi.resources.omf.omf_api_factory import OMFAPIFactory import time +reschedule_check = "1s" +confirmation_counter = 3600 + @clsinit_copy class OMFNode(OMFResource): """ @@ -38,13 +41,9 @@ class OMFNode(OMFResource): :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 = "OMFNode" - _authorized_connections = ["OMFApplication" , "OMFWifiInterface"] + _rtype = "omf::Node" + _authorized_connections = ["omf::Application" , "omf::WifiInterface"] @classmethod def _register_attributes(cls): @@ -69,6 +68,11 @@ class OMFNode(OMFResource): self._omf_api = None + # For performance tests + self.perf = True + self.begin_deploy_time = None + + @property def exp_id(self): return self.ec.exp_id @@ -83,59 +87,90 @@ class OMFNode(OMFResource): """ rm = self.ec.get_resource(guid) - if rm.rtype() in self._authorized_connections: + if rm.get_rtype() in self._authorized_connections: msg = "Connection between %s %s and %s %s accepted" % ( - self.rtype(), self._guid, rm.rtype(), guid) + 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) - self.debug(msg) + self.get_rtype(), self._guid, rm.get_rtype(), guid) + self.error(msg) return False def do_deploy(self): """ Deploy the RM. It means : Send Xmpp Message Using OMF protocol to enroll the node into the experiment. - It becomes DEPLOYED after sending messages to enroll the node """ - 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) + ## For performance test + if self.perf: + self.begin_deploy_time = tnow() + self.perf = False - if not self._omf_api : - 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 RuntimeError, msg + if not self.get('version'): + msg = "Version of OMF is not indicated" + self.error(msg) + raise RuntimeError, msg + + 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) + + 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) + if not self.get('hostname') : msg = "Hostname's value is not initialized" self.error(msg) raise RuntimeError, msg - try: + if self.get('version') == "5": self._omf_api.enroll_host(self.get('hostname')) - except AttributeError: - msg = "Credentials are not initialzed. XMPP Connections impossible" - self.error(msg) - raise + else: + self._omf_api.enroll_topic(self.get('hostname')) super(OMFNode, self).do_deploy() def do_release(self): - """ Clean the RM at the end of the experiment + """ Clean the RM at the end of the experiment by unenrolling + the node from the topic """ - if self._omf_api: - self._omf_api.release(self.get('hostname')) + from nepi.resources.omf.application import OMFApplication + rm_list = self.get_connected(OMFApplication.get_rtype()) + if rm_list: + for rm in rm_list: + if rm.state < ResourceState.RELEASED: + self.ec.schedule(self.reschedule_delay, self.release) + return + + from nepi.resources.omf.interface import OMFWifiInterface + rm_list = self.get_connected(OMFWifiInterface.get_rtype()) + if rm_list: + for rm in rm_list: + if rm.state < ResourceState.RELEASED: + self.ec.schedule(self.reschedule_delay, self.release) + return - OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), - self.get('xmppPassword'), exp_id = self.exp_id) + if self._omf_api: + if self.get('version') == "5": + self._omf_api.release(self.get('hostname')) + else: + self._omf_api.unenroll_topic(self.get('hostname')) + + OMFAPIFactory.release_api(self.get('version'), + self.get('xmppServer'), self.get('xmppUser'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.exp_id) super(OMFNode, self).do_release()