X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Fresources%2Flinux%2Fnode.py;h=e63a92e9c655c203d99715f02321db632c48885a;hb=23d041fe2f0d9badf6d637009e2d42a4794325c1;hp=6de7cd97e104c46eeefbf5b4c4d39c2e396ab656;hpb=dc2d5a25aa7ea09fb69960f871ba26e0c383929a;p=nepi.git diff --git a/src/nepi/resources/linux/node.py b/src/nepi/resources/linux/node.py index 6de7cd97..e63a92e9 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,6 +28,7 @@ import collections import os import random import re +import socket import tempfile import time import threading @@ -141,10 +142,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): @@ -194,6 +195,10 @@ class LinuxNode(ResourceManager): gateway = Attribute("gateway", "Hostname of the gateway machine", flags = Flags.Design) + ip = Attribute("ip", "Linux host public IP address. " + "Must not be modified by the user unless hostname is 'localhost'", + flags = Flags.Design) + cls._register_attribute(hostname) cls._register_attribute(username) cls._register_attribute(port) @@ -206,6 +211,7 @@ class LinuxNode(ResourceManager): cls._register_attribute(tear_down) cls._register_attribute(gateway_user) cls._register_attribute(gateway) + cls._register_attribute(ip) def __init__(self, ec, guid): super(LinuxNode, self).__init__(ec, guid) @@ -278,8 +284,7 @@ class LinuxNode(ResourceManager): if self._os: return self._os - if self.get("hostname") not in ["localhost", "127.0.0.1"] and \ - not self.get("username"): + if not self.localhost and not self.get("username"): msg = "Can't resolve OS, insufficient data " self.error(msg) raise RuntimeError, msg @@ -333,7 +338,7 @@ class LinuxNode(ResourceManager): @property def localhost(self): - return self.get("hostname") in ['localhost', '127.0.0.7', '::1'] + return self.get("hostname") in ['localhost', '127.0.0.1', '::1'] def do_provision(self): # check if host is alive @@ -362,6 +367,21 @@ class LinuxNode(ResourceManager): self.mkdir(paths) + # Get Public IP address if possible + if not self.get("ip"): + ip = None + + if self.localhost: + ip = socket.gethostbyname(socket.gethostname()) + else: + try: + ip = socket.gethostbyname(self.get("hostname")) + except: + msg = "DNS can not resolve hostname %s" % self.get("hostname") + self.debug(msg) + + self.set("ip", ip) + super(LinuxNode, self).do_provision() def do_deploy(self): @@ -376,7 +396,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() @@ -387,7 +407,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") @@ -404,8 +424,8 @@ class LinuxNode(ResourceManager): def clean_processes(self): self.info("Cleaning up processes") - - if self.get("hostname") in ["localhost", "127.0.0.2"]: + + if self.localhost: return if self.get("username") != 'root': @@ -418,15 +438,19 @@ class LinuxNode(ResourceManager): pids_temp = dict() ps_aux = "ps aux |awk '{print $2,$11}'" (out, err), proc = self.execute(ps_aux) - for line in out.strip().split("\n"): - parts = line.strip().split(" ") - pids_temp[parts[0]] = parts[1] - kill_pids = set(pids_temp.items()) - set(pids.items()) - kill_pids = ' '.join(dict(kill_pids).keys()) - - cmd = ("killall tcpdump || /bin/true ; " + - "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; " + - "kill %s || /bin/true ; " % kill_pids) + if len(out) != 0: + for line in out.strip().split("\n"): + parts = line.strip().split(" ") + pids_temp[parts[0]] = parts[1] + kill_pids = set(pids_temp.items()) - set(pids.items()) + kill_pids = ' '.join(dict(kill_pids).keys()) + + cmd = ("killall tcpdump || /bin/true ; " + + "kill $(ps aux | grep '[n]epi' | 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 ; ") else: cmd = ("killall tcpdump || /bin/true ; " + "kill $(ps aux | grep '[n]epi' | awk '{print $2}') || /bin/true ; ") @@ -535,7 +559,8 @@ class LinuxNode(ResourceManager): stdout = 'stdout', stderr = 'stderr', sudo = False, - tty = False): + tty = False, + strict_host_checking = False): self.debug("Running command '%s'" % command) @@ -566,7 +591,8 @@ class LinuxNode(ResourceManager): agent = True, identity = self.get("identity"), server_key = self.get("serverKey"), - tty = tty + tty = tty, + strict_host_checking = strict_host_checking ) return (out, err), proc @@ -585,7 +611,8 @@ class LinuxNode(ResourceManager): gw = self.get("gateway"), agent = True, identity = self.get("identity"), - server_key = self.get("serverKey") + server_key = self.get("serverKey"), + strict_host_checking = False ) return pidtuple @@ -604,7 +631,8 @@ class LinuxNode(ResourceManager): gw = self.get("gateway"), agent = True, identity = self.get("identity"), - server_key = self.get("serverKey") + server_key = self.get("serverKey"), + strict_host_checking = False ) return status @@ -629,7 +657,8 @@ class LinuxNode(ResourceManager): agent = True, sudo = sudo, identity = self.get("identity"), - server_key = self.get("serverKey") + server_key = self.get("serverKey"), + strict_host_checking = False ) return (out, err), proc