X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fnode.py;h=6ac01de9139eba88bf3efa69cb4b786882b4774e;hb=ecdd7ec5a216f5faf46ec9f1c7eb5c2454c14d27;hp=840cfe1839650a5fc7cffcfacfd498e37ec42806;hpb=96413965c9502aa92248775e83d6e864b53692bc;p=nepi.git diff --git a/src/nepi/resources/omf/node.py b/src/nepi/resources/omf/node.py index 840cfe18..6ac01de9 100644 --- a/src/nepi/resources/omf/node.py +++ b/src/nepi/resources/omf/node.py @@ -18,15 +18,17 @@ # Author: Alina Quereilhac # Julien Tribino - -from nepi.execution.resource import ResourceManager, clsinit_copy, ResourceState, \ - reschedule_delay +from nepi.util.timefuncs import tnow +from nepi.execution.resource import ResourceManager, clsinit_copy, \ + ResourceState, reschedule_delay 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 = "0.2s" +confirmation_counter = 3000 @clsinit_copy class OMFNode(OMFResource): @@ -40,10 +42,6 @@ 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"] @@ -71,6 +69,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 @@ -85,89 +88,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 deploy(self): + 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) - self.fail() - return + raise RuntimeError, msg - if not self.get('hostname') : - msg = "Hostname's value is not initialized" + if not self.get('version'): + msg = "Version of OMF is not indicated" self.error(msg) - self.fail() - return False - - try: - self._omf_api.enroll_host(self.get('hostname')) - except AttributeError: - msg = "Credentials are not initialzed. XMPP Connections impossible" - self.error(msg) - self.fail() - #raise AttributeError, msg - - super(OMFNode, self).deploy() + raise RuntimeError, msg - def discover(self): - """ Discover the availables nodes + 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) - """ - pass - - def provision(self): - """ Provision some availables nodes - - """ - pass - - def start(self): - """Start the RM. It means nothing special for an interface 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) - super(OMFNode, self).start() + if not self.get('hostname') : + msg = "Hostname's value is not initialized" + self.error(msg) + raise RuntimeError, msg - def stop(self): - """Stop the RM. It means nothing special for an interface for now - It becomes STOPPED as soon as this method stops + if self.get('version') == "5": + self._omf_api.enroll_host(self.get('hostname')) + else: + self._omf_api.enroll_topic(self.get('hostname')) - """ - super(OMFNode, self).stop() + super(OMFNode, self).do_deploy() - def release(self): - """Clean the RM at the end of the experiment + def do_release(self): + """ 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')) - - OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), - self.get('xmppPassword'), exp_id = self.exp_id) - - super(OMFNode, self).release() + 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(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(reschedule_delay, self.release) + return + + 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()