X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Fomf%2Fnode.py;h=79c04f2026b43f50466fd045266574f04dca5b67;hb=450b5dd0a993f63eb2ec34bbc656c558572eb44c;hp=fbea0dbb720eb0a25bff6fa472cbd48553df4938;hpb=62a8f5c90afe9033f532206c811cff8ea76b2c09;p=nepi.git diff --git a/src/nepi/resources/omf/node.py b/src/nepi/resources/omf/node.py index fbea0dbb..79c04f20 100644 --- a/src/nepi/resources/omf/node.py +++ b/src/nepi/resources/omf/node.py @@ -18,18 +18,16 @@ # Author: Alina Quereilhac # Julien Tribino - -from nepi.execution.resource import ResourceManager, clsinit, ResourceState +from nepi.execution.resource import ResourceManager, clsinit_copy, \ + ResourceState, reschedule_delay, failtrap from nepi.execution.attribute import Attribute, Flags - +from nepi.resources.omf.omf_resource import ResourceGateway, OMFResource from nepi.resources.omf.omf_api import OMFAPIFactory import time -reschedule_delay = "0.5s" - -@clsinit -class OMFNode(ResourceManager): +@clsinit_copy +class OMFNode(OMFResource): """ .. class:: Class Args : @@ -54,38 +52,8 @@ class OMFNode(ResourceManager): """ hostname = Attribute("hostname", "Hostname of the machine") - cpu = Attribute("cpu", "CPU of the node") - ram = Attribute("ram", "RAM of the node") - 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) - - host = Attribute("host", "Hostname of the machine", - flags = Flags.Filter) - gateway = Attribute("gateway", "Gateway", - flags = Flags.Filter) - granularity = Attribute("granularity", "Granularity of the reservation time", - flags = Flags.Filter) - hardware_type = Attribute("hardware_type", "Hardware type of the machine", - flags = Flags.Filter) cls._register_attribute(hostname) - cls._register_attribute(ram) - cls._register_attribute(cpu) - cls._register_attribute(xmppSlice) - cls._register_attribute(xmppHost) - cls._register_attribute(xmppPort) - cls._register_attribute(xmppPassword) - - cls._register_attribute(host) - cls._register_attribute(gateway) - cls._register_attribute(granularity) - cls._register_attribute(hardware_type) # XXX: We don't necessary need to have the credentials at the # moment we create the RM @@ -95,18 +63,19 @@ class OMFNode(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(OMFNode, self).__init__(ec, guid) self._omf_api = None - # XXX: TO DISCUSS + @property + def exp_id(self): + return self.ec.exp_id - def _validate_connection(self, guid): - """Check if the connection is available. + def valid_connection(self, guid): + """ 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 @@ -115,74 +84,64 @@ class OMFNode(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) + msg = "Connection between %s %s and %s %s accepted" % ( + self.rtype(), self._guid, rm.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.rtype(), self._guid, rm.rtype(), guid) self.debug(msg) + return False + @failtrap def deploy(self): - """Deploy the RM + """ 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')) - self._omf_api.enroll_host(self.get('hostname')) - - super(OMFNode, self).deploy() - - def discover(self): - """ Discover the availables nodes + self.get('xmppHost'), self.get('xmppPort'), + self.get('xmppPassword'), exp_id = self.exp_id) - """ - pass - - def provision(self): - """ Provision some availables nodes + if not self._omf_api : + msg = "Credentials are not initialzed. XMPP Connections impossible" + self.error(msg) + raise RuntimeError, msg + + if not self.get('hostname') : + msg = "Hostname's value is not initialized" + self.error(msg) + raise RuntimeError, msg + + try: + self._omf_api.enroll_host(self.get('hostname')) + except AttributeError: + msg = "Credentials are not initialzed. XMPP Connections impossible" + self.error(msg) + raise - """ - pass + super(OMFNode, self).deploy() - def start(self): - """Send Xmpp Message Using OMF protocol to enroll the node into the experiment + def release(self): + """Clean the RM at the end of the experiment """ - super(OMFNode, self).start() + try: + 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) + except: + import traceback + err = traceback.format_exc() + self.error(err) - def stop(self): - """Send Xmpp Message Using OMF protocol to disconnect the node + super(OMFNode, self).release() - """ - super(OMFNode, self).stop() - - def release(self): - """Clean the RM at the end of the experiment - - """ - self._omf_api.release(self.get('hostname')) - OMFAPIFactory.release_api(self.get('xmppSlice'), - self.get('xmppHost'), self.get('xmppPort'), self.get('xmppPassword')) - - - def configure(self): - #routes = self.tc._add_route.get(self.guid, []) - #iface_guids = self.tc.get_connected(self.guid, "devs", "node") - - for route in routes: - (destination, netprefix, nexthop, metric, device) = route - netmask = ipaddr2.ipv4_mask2dot(netprefix) - - # Validate that the interface is associated to the node - for iface_guid in iface_guids: - iface = self.tc.elements.get(iface_guid) - if iface.devname == device: - self._omf_api.execute(self.get('hostname'), - "Id#%s" % str(random.getrandbits(128)), - "add -net %s netmask %s dev %s" % (destination, netmask, iface.devname), - "/sbin/route", # path - None, # env - ) - break