|
Last change
on this file since 2826 was
2513,
checked in by adehnert, 16 years ago
|
|
Minor cleanup of monocast and LVM load balancer
|
|
File size:
1.1 KB
|
| Line | |
|---|
| 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 | |
|---|
| 7 | def 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.