source: trunk/packages/invirt-remote/python/remote/monocast.py @ 2528

Last change on this file since 2528 was 2513, checked in by adehnert, 15 years ago

Minor cleanup of monocast and LVM load balancer

File size: 1.1 KB
Line 
1from subprocess import PIPE, Popen
2from invirt.config import structs as config
3import random
4
5hostnames = [ h.hostname for h in config.hosts ]
6
7def monocast(args, hostnames = hostnames, randomize = True):
8    """
9    Given a command and a list of hostnames or IPs, issue the command to each
10    node until it connects to one of the nodes.
11
12    Returns:
13        host the command ran on
14        hosts that could not be contacted
15        returncode of remctl
16        stdout of remctl
17        stderr of remctl
18    """
19    if(randomize):
20        hostnames = random.sample(hostnames, len(hostnames))
21    hostsdown = []
22    for host in hostnames:
23        pipe = Popen(['remctl', host, 'remote', 'web'] + args, stdout=PIPE, stderr=PIPE)
24        output = pipe.communicate()
25        if pipe.returncode != 0:
26            if output[1].startswith('remctl: cannot connect to %s' % host):
27                hostsdown.append(host)
28            else:
29                return (host, hostsdown, pipe.returncode,) + output
30        else:
31            return (host, hostsdown, pipe.returncode,) + output
32    raise RuntimeError("Failed to contact any hosts: tried %s" % (hostsdown, ))
Note: See TracBrowser for help on using the repository browser.