Almost working local example for linux ns-3 simulator
[nepi.git] / src / nepi / resources / planetlab / node.py
index a18886d..7782bd8 100644 (file)
@@ -28,6 +28,7 @@ from nepi.util import sshfuncs
 
 from random import randint
 import time
+import socket
 import threading
 import datetime
 
@@ -43,7 +44,7 @@ class PlanetlabNode(LinuxNode):
     @classmethod
     def _register_attributes(cls):
         ip = Attribute("ip", "PlanetLab host public IP address",
-                flags = Flags.ReadOnly)
+                    flags = Flags.Design)
 
         pl_url = Attribute("plcApiUrl", "URL of PlanetLab PLCAPI host \
                     (e.g. www.planet-lab.eu or www.planet-lab.org) ",
@@ -53,7 +54,7 @@ class PlanetlabNode(LinuxNode):
         pl_ptn = Attribute("plcApiPattern", "PLC API service regexp pattern \
                     (e.g. https://%(hostname)s:443/PLCAPI/ ) ",
                     default = "https://%(hostname)s:443/PLCAPI/",
-                    flags = Flags.ExecReadOnly)
+                    flags = Flags.Design)
     
         pl_user = Attribute("pluser", "PlanetLab account user, as the one to \
                     authenticate in the website) ",
@@ -195,6 +196,7 @@ class PlanetlabNode(LinuxNode):
         self._plapi = None
         self._node_to_provision = None
         self._slicenode = False
+        self._hostname = False
 
     def _skip_provision(self):
         pl_user = self.get("pluser")
@@ -231,7 +233,8 @@ class PlanetlabNode(LinuxNode):
         hostname = self._get_hostname()
         if hostname:
             # the user specified one particular node to be provisioned
-            # check with PLCAPI if it is alvive
+            # check with PLCAPI if it is alive
+            self._hostname = True
             node_id = self._query_if_alive(hostname=hostname)
             node_id = node_id.pop()
 
@@ -252,10 +255,9 @@ class PlanetlabNode(LinuxNode):
                             self._slicenode = True
                         self._put_node_in_provision(node_id)
                         self._node_to_provision = node_id
-                        super(PlanetlabNode, self).do_discover()
-                
                 else:
                     self.fail_node_not_available(hostname)
+            super(PlanetlabNode, self).do_discover()
         
         else:
             # the user specifies constraints based on attributes, zero, one or 
@@ -285,12 +287,11 @@ class PlanetlabNode(LinuxNode):
                 try:
                     self._set_hostname_attr(node_id)
                     self.info(" Selected node to provision ")
+                    super(PlanetlabNode, self).do_discover()
                 except:
                     with PlanetlabNode.lock:
                         self._blacklist_node(node_id)
-                        self.do_discover()
-                super(PlanetlabNode, self).do_discover()
+                    self.do_discover()
             else:
                self.fail_not_enough_nodes() 
             
@@ -340,7 +341,7 @@ class PlanetlabNode(LinuxNode):
                     self.warn(" Could not SSH login ")
                     self._blacklist_node(node)
                     #self._delete_node_from_slice(node)
-                self.set('hostname', None)
+                #self.set('hostname', None)
                 self.do_discover()
                 continue
             
@@ -353,12 +354,14 @@ class PlanetlabNode(LinuxNode):
                         self.warn(" Could not find directory /proc ")
                         self._blacklist_node(node)
                         #self._delete_node_from_slice(node)
-                    self.set('hostname', None)
+                    #self.set('hostname', None)
                     self.do_discover()
                     continue
             
                 else:
                     provision_ok = True
+                    if not self.get('hostname'):
+                        self._set_hostname_attr(node)            
                     # set IP attribute
                     ip = self._get_ip(node)
                     self.set("ip", ip)
@@ -563,7 +566,7 @@ class PlanetlabNode(LinuxNode):
                         self._set_hostname_attr(node_id)
                         self.warn(" Node not responding PING ")
                         self._blacklist_node(node_id)
-                        self.set('hostname', None)
+                        #self.set('hostname', None)
                     else:
                         # discovered node for provision, added to provision list
                         self._put_node_in_provision(node_id)
@@ -591,7 +594,8 @@ class PlanetlabNode(LinuxNode):
         if hostname:
             return hostname
         elif ip:
-            hostname = sshfuncs.gethostbyname(ip)
+            hostname = socket.gethostbyaddr(ip)[0]
+            self.set('hostname', hostname)
             return hostname
         else:
             return None
@@ -636,14 +640,16 @@ class PlanetlabNode(LinuxNode):
         Add node mal functioning node to blacklist
         """
         self.warn(" Blacklisting malfunctioning node ")
-        self._plapi.blacklist_host(node)
+        self.plapi.blacklist_host(node)
+        if not self._hostname:
+            self.set('hostname', None)
 
     def _put_node_in_provision(self, node):
         """
         Add node to the list of nodes being provisioned, in order for other RMs
         to not try to provision the same one again
         """
-        self._plapi.reserve_host(node)
+        self.plapi.reserve_host(node)
 
     def _get_ip(self, node_id):
         """