Last change
on this file since 3005 was
2513,
checked in by adehnert, 15 years ago
|
Minor cleanup of monocast and LVM load balancer
|
File size:
1.1 KB
|
Rev | Line | |
---|
[2495] | 1 | from subprocess import PIPE, Popen |
---|
| 2 | from invirt.config import structs as config |
---|
| 3 | import random |
---|
| 4 | |
---|
| 5 | hostnames = [ h.hostname for h in config.hosts ] |
---|
| 6 | |
---|
[2513] | 7 | def monocast(args, hostnames = hostnames, randomize = True): |
---|
[2495] | 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): |
---|
[2513] | 20 | hostnames = random.sample(hostnames, len(hostnames)) |
---|
[2495] | 21 | hostsdown = [] |
---|
[2513] | 22 | for host in hostnames: |
---|
[2495] | 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.