Making CCN FIBEntry issue ccndc with hostname resolved to IP, since PlanetLab name...
authorAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 26 Jul 2013 01:48:39 +0000 (18:48 -0700)
committerAlina Quereilhac <alina.quereilhac@inria.fr>
Fri, 26 Jul 2013 01:48:39 +0000 (18:48 -0700)
src/nepi/resources/linux/ccn/ccncontent.py
src/nepi/resources/linux/ccn/ccnd.py
src/nepi/resources/linux/ccn/fibentry.py
src/nepi/util/sshfuncs.py

index 9d531de..5b9d925 100644 (file)
@@ -118,8 +118,8 @@ class LinuxCCNContent(LinuxApplication):
         env = self.replace_paths(env)
         command = self.replace_paths(command)
 
-        (out, err), proc = self.execute_command(command, env, 
-                blocking = True)
+        (out, err), proc = self.execute_command(command, 
+                env, blocking = True)
 
         if proc.poll():
             self.fail()
index d2358a4..20c04fc 100644 (file)
@@ -188,22 +188,21 @@ class LinuxCCND(LinuxApplication):
         command = self.get("command")
         env = self.get("env")
 
-        if command:
-            # We want to make sure the ccnd is running
-            # before the experiment starts.
-            # Run the command as a bash script in background,
-            # in the host ( but wait until the command has
-            # finished to continue )
-            env = self.replace_paths(env)
-            command = self.replace_paths(command)
+        # We want to make sure the ccnd is running
+        # before the experiment starts.
+        # Run the command as a bash script in background,
+        # in the host ( but wait until the command has
+        # finished to continue )
+        env = self.replace_paths(env)
+        command = self.replace_paths(command)
+
+        shfile = os.path.join(self.app_home, "start.sh")
+        self.node.run_and_wait(command, self.run_home,
+                shfile = shfile,
+                overwrite = False,
+                env = env,
+                raise_on_error = True)
 
-            shfile = os.path.join(self.app_home, "start.sh")
-            self.node.run_and_wait(command, self.run_home,
-                    shfile = shfile,
-                    overwrite = False,
-                    env = env,
-                    raise_on_error = True)
-    
     def start(self):
         if self._state == ResourceState.READY:
             command = self.get("command")
index 1f39a98..62d9049 100644 (file)
@@ -26,6 +26,8 @@ from nepi.resources.linux.ccn.ccnd import LinuxCCND
 from nepi.util.timefuncs import tnow
 
 import os
+import socket
+import time
 
 
 # TODO: Add rest of options for ccndc!!!
@@ -51,7 +53,7 @@ class LinuxFIBEntry(LinuxApplication):
                 flags = Flags.ExecReadOnly)
 
         host = Attribute("host",
-                "Peer host used in network connection for this FIB entry. ",
+                "Peer hostname used in network connection for this FIB entry. ",
                 flags = Flags.ExecReadOnly)
 
         port = Attribute("port",
@@ -59,10 +61,15 @@ class LinuxFIBEntry(LinuxApplication):
                 "for this FIB entry.",
                 flags = Flags.ExecReadOnly)
 
+        ip = Attribute("ip",
+                "Peer host public IP used in network connection for this FIB entry. ",
+                flags = Flags.ReadOnly)
+
         cls._register_attribute(uri)
         cls._register_attribute(protocol)
         cls._register_attribute(host)
         cls._register_attribute(port)
+        cls._register_attribute(ip)
 
     @classmethod
     def _register_traces(cls):
@@ -109,6 +116,11 @@ class LinuxFIBEntry(LinuxApplication):
             self.ec.schedule(reschedule_delay, self.deploy)
         else:
             try:
+                if not self.get("ip"):
+                    host = self.get("host")
+                    ip = socket.gethostbyname(host)
+                    self.set("ip", ip)
+
                 if not self.get("command"):
                     self.set("command", self._start_command)
 
@@ -142,14 +154,17 @@ class LinuxFIBEntry(LinuxApplication):
         env = env and self.replace_paths(env)
         command = self.replace_paths(command)
 
-        (out, err), proc = self.execute_command(command, env)
+        # ccndc seems to return exitcode OK even if a (dns) error
+        # occurred, so we need to account for this case here. 
+        (out, err), proc = self.execute_command(command, 
+                env, blocking = True)
 
         if proc.poll():
             self._state = ResourceState.FAILED
             msg = "Failed to execute command"
             self.error(msg, out, err)
             raise RuntimeError, msg
-
+        
     def configure(self):
         if self.trace_enabled("ping"):
             self.info("Configuring PING trace")
@@ -218,14 +233,14 @@ class LinuxFIBEntry(LinuxApplication):
     def _start_command(self):
         uri = self.get("uri") or ""
         protocol = self.get("protocol") or ""
-        host = self.get("host") or ""
+        ip = self.get("ip") or "" 
         port = self.get("port") or ""
 
         # add ccnx:/example.com/ udp 224.0.0.204 52428
         return "ccndc add %(uri)s %(protocol)s %(host)s %(port)s" % ({
             "uri" : uri,
             "protocol": protocol,
-            "host": host,
+            "host": ip,
             "port": port
             })
 
@@ -233,14 +248,14 @@ class LinuxFIBEntry(LinuxApplication):
     def _stop_command(self):
         uri = self.get("uri") or ""
         protocol = self.get("protocol") or ""
-        host = self.get("host") or ""
+        ip = self.get("ip") or ""
         port = self.get("port") or ""
 
         # add ccnx:/example.com/ udp 224.0.0.204 52428
         return "ccndc del %(uri)s %(protocol)s %(host)s %(port)s" % ({
             "uri" : uri,
             "protocol": protocol,
-            "host": host,
+            "host": ip,
             "port": port
             })
 
index cc30348..43ca61c 100644 (file)
@@ -292,9 +292,8 @@ def rexec(command, host, user,
             if blocking:
                 out, err = _communicate(proc, stdin, timeout, err_on_timeout)
             else:
-                out = err = ""
-                if proc.poll():
-                    err = proc.stderr.read()
+                err = proc.stderr.read()
+                out = proc.stdout.read()
 
             msg = " rexec - host %s - command %s " % (host, " ".join(args))
             log(msg, logging.DEBUG, out, err)