X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fnode.py;h=0bef4ada69263b17e733e6f3d09d10c85318eb1c;hb=7fed767f9f18ee81807950771145969cbb27b8a7;hp=232a9df5824b7a1b7c570f0e198c1d6ff05d37c3;hpb=a55b5cf0818ced6ab8dc3e88fad7f6616675e826;p=nepi.git diff --git a/src/nepi/resources/linux/node.py b/src/nepi/resources/linux/node.py index 232a9df5..0bef4ada 100644 --- a/src/nepi/resources/linux/node.py +++ b/src/nepi/resources/linux/node.py @@ -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