Bug fixing and ordering openvswitch code
[nepi.git] / src / nepi / resources / linux / node.py
index 232a9df..0bef4ad 100644 (file)
@@ -19,7 +19,7 @@
 
 from nepi.execution.attribute import Attribute, Flags, Types
 from nepi.execution.resource import ResourceManager, clsinit_copy, \
-        ResourceState, reschedule_delay
+        ResourceState
 from nepi.resources.linux import rpmfuncs, debfuncs 
 from nepi.util import sshfuncs, execfuncs
 from nepi.util.sshfuncs import ProcStatus
@@ -28,7 +28,6 @@ import collections
 import os
 import random
 import re
-import socket
 import tempfile
 import time
 import threading
@@ -51,12 +50,12 @@ class OSType:
     """
     Supported flavors of Linux OS
     """
-    FEDORA_8 = "f8"
-    FEDORA_12 = "f12"
-    FEDORA_14 = "f14"
-    FEDORA = "fedora"
-    UBUNTU = "ubuntu"
-    DEBIAN = "debian"
+    DEBIAN = 1 
+    UBUNTU = 1 << 1 
+    FEDORA = 1 << 2
+    FEDORA_8 = 1 << 3 | FEDORA 
+    FEDORA_12 = 1 << 4 | FEDORA 
+    FEDORA_14 = 1 << 5 | FEDORA 
 
 @clsinit_copy
 class LinuxNode(ResourceManager):
@@ -142,10 +141,10 @@ class LinuxNode(ResourceManager):
                     source compilation, file download, etc)
 
     """
-    _rtype = "LinuxNode"
+    _rtype = "linux::Node"
     _help = "Controls Linux host machines ( either localhost or a host " \
             "that can be accessed using a SSH key)"
-    _backend_type = "linux"
+    _platform = "linux"
 
     @classmethod
     def _register_attributes(cls):
@@ -291,18 +290,18 @@ class LinuxNode(ResourceManager):
 
         out = self.get_os()
 
-        if out.find("Fedora release 8") == 0:
-            self._os = OSType.FEDORA_8
-        elif out.find("Fedora release 12") == 0:
-            self._os = OSType.FEDORA_12
-        elif out.find("Fedora release 14") == 0:
-            self._os = OSType.FEDORA_14
-        elif out.find("Fedora release") == 0:
-            self._os = OSType.FEDORA
-        elif out.find("Debian") == 0: 
+        if out.find("Debian") == 0: 
             self._os = OSType.DEBIAN
         elif out.find("Ubuntu") ==0:
             self._os = OSType.UBUNTU
+        elif out.find("Fedora release") == 0:
+            self._os = OSType.FEDORA
+            if out.find("Fedora release 8") == 0:
+                self._os = OSType.FEDORA_8
+            elif out.find("Fedora release 12") == 0:
+                self._os = OSType.FEDORA_12
+            elif out.find("Fedora release 14") == 0:
+                self._os = OSType.FEDORA_14
         else:
             msg = "Unsupported OS"
             self.error(msg, out)
@@ -329,12 +328,11 @@ class LinuxNode(ResourceManager):
 
     @property
     def use_deb(self):
-        return self.os in [OSType.DEBIAN, OSType.UBUNTU]
+        return (self.os & (OSType.DEBIAN|OSType.UBUNTU))
 
     @property
     def use_rpm(self):
-        return self.os in [OSType.FEDORA_12, OSType.FEDORA_14, OSType.FEDORA_8,
-                OSType.FEDORA]
+        return (self.os & OSType.FEDORA)
 
     @property
     def localhost(self):
@@ -367,12 +365,13 @@ class LinuxNode(ResourceManager):
 
         self.mkdir(paths)
 
-        # Get Public IP address
+        # Get Public IP address if possible
         if not self.get("ip"):
-            if self.localhost:
-                ip = socket.gethostbyname(socket.gethostname())
-            else:
-                ip = socket.gethostbyname(self.get("hostname"))
+            try:
+                ip = sshfuncs.gethostbyname(self.get("hostname"))
+            except:
+                msg = "DNS can not resolve hostname %s" % self.get("hostname") 
+                self.debug(msg)
 
             self.set("ip", ip)
 
@@ -390,7 +389,7 @@ class LinuxNode(ResourceManager):
         ifaces = self.get_connected(LinuxInterface.get_rtype())
         for iface in ifaces:
             if iface.state < ResourceState.READY:
-                self.ec.schedule(reschedule_delay, self.deploy)
+                self.ec.schedule(self.reschedule_delay, self.deploy)
                 return 
 
         super(LinuxNode, self).do_deploy()
@@ -401,7 +400,7 @@ class LinuxNode(ResourceManager):
             # Node needs to wait until all associated RMs are released
             # before it can be released
             if rm.state != ResourceState.RELEASED:
-                self.ec.schedule(reschedule_delay, self.release)
+                self.ec.schedule(self.reschedule_delay, self.release)
                 return 
 
         tear_down = self.get("tearDown")
@@ -424,6 +423,7 @@ class LinuxNode(ResourceManager):
         
         if self.get("username") != 'root':
             cmd = ("sudo -S killall tcpdump || /bin/true ; " +
+                "sudo -S kill -9 $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; " +
                 "sudo -S killall -u %s || /bin/true ; " % self.get("username"))
         else:
             if self.state >= ResourceState.READY:
@@ -440,14 +440,14 @@ class LinuxNode(ResourceManager):
                     kill_pids = ' '.join(dict(kill_pids).keys())
 
                     cmd = ("killall tcpdump || /bin/true ; " +
-                        "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; " +
+                        "kill $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; " +
                         "kill %s || /bin/true ; " % kill_pids)
                 else:
                     cmd = ("killall tcpdump || /bin/true ; " +
-                        "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; ")
+                        "kill $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; ")
             else:
                 cmd = ("killall tcpdump || /bin/true ; " +
-                    "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; ")
+                    "kill $(ps aux | grep '[.]nepi' | awk '{print $2}') || /bin/true ; ")
 
         (out, err), proc = self.execute(cmd, retry = 1, with_lock = True)
 
@@ -838,17 +838,18 @@ class LinuxNode(ResourceManager):
         return self.execute(cmd, with_lock = True)
         
     def run_and_wait(self, command, home, 
-            shfile = "cmd.sh",
-            env = None,
-            overwrite = True,
-            pidfile = "pidfile", 
-            ecodefile = "exitcode", 
-            stdin = None, 
-            stdout = "stdout", 
-            stderr = "stderr", 
-            sudo = False,
-            tty = False,
-            raise_on_error = True):
+            shfile="cmd.sh",
+            env=None,
+            overwrite=True,
+            wait_run=True,
+            pidfile="pidfile", 
+            ecodefile="exitcode", 
+            stdin=None, 
+            stdout="stdout", 
+            stderr="stderr", 
+            sudo=False,
+            tty=False,
+            raise_on_error=True):
         """
         Uploads the 'command' to a bash script in the host.
         Then runs the script detached in background in the host, and
@@ -887,25 +888,26 @@ class LinuxNode(ResourceManager):
                 pidfile = pidfile, 
                 raise_on_error = raise_on_error)
 
-        # wait until command finishes to execute
-        self.wait_run(pid, ppid)
-      
-        (eout, err), proc = self.check_errors(home,
-            ecodefile = ecodefile,
-            stderr = stderr)
+        if wait_run:
+            # wait until command finishes to execute
+            self.wait_run(pid, ppid)
+          
+            (eout, err), proc = self.check_errors(home,
+                ecodefile = ecodefile,
+                stderr = stderr)
 
-        # Out is what was written in the stderr file
-        if err:
-            msg = " Failed to run command '%s' " % command
-            self.error(msg, eout, err)
+            # Out is what was written in the stderr file
+            if err:
+                msg = " Failed to run command '%s' " % command
+                self.error(msg, eout, err)
 
-            if raise_on_error:
-                raise RuntimeError, msg
+                if raise_on_error:
+                    raise RuntimeError, msg
 
         (out, oerr), proc = self.check_output(home, stdout)
         
         return (out, err), proc
-
+        
     def exitcode(self, home, ecodefile = "exitcode"):
         """
         Get the exit code of an application.
@@ -929,10 +931,10 @@ class LinuxNode(ResourceManager):
         return ExitCode.ERROR
 
     def upload_command(self, command, 
-            shfile = "cmd.sh",
-            ecodefile = "exitcode",
-            overwrite = True,
-            env = None):
+            shfile="cmd.sh",
+            ecodefile="exitcode",
+            overwrite=True,
+            env=None):
         """ Saves the command as a bash script file in the remote host, and
         forces to save the exit code of the command execution to the ecodefile
         """
@@ -952,9 +954,9 @@ class LinuxNode(ResourceManager):
         # Add environ to command
         command = environ + command
 
-        return self.upload(command, shfile, text = True, overwrite = overwrite)
+        return self.upload(command, shfile, text=True, overwrite=overwrite)
 
-    def format_environment(self, env, inline = False):
+    def format_environment(self, env, inline=False):
         """ Formats the environment variables for a command to be executed
         either as an inline command
         (i.e. export PYTHONPATH=src/..; export LALAL= ..;python script.py) or