# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-import sys
+import argparse
import os
import subprocess
+import sys
+import time
+
+import ansible.inventory
+import ansible.runner
-import argparse
import lib
def cmdline (subparsers):
help='power off a node (or nodes)'
)
p.add_argument (
- '--all', action='store_const', const=True,
- help='power off all nodes'
- )
- p.add_argument (
- 'nodes', nargs='*',
- help='node name to be powered off'
+ 'wildcard',
+ help='node name(s) to be powered off (wildcard may be used)'
)
p.set_defaults (run=run)
-def run (c, args, all_nodes):
- nodes = lib.get_nodes_by_name (all_nodes, args.nodes, args.all)
+def run (c, args):
+ inventory = ansible.inventory.Inventory ()
+ inventory.subset (subset_pattern = args.wildcard)
+ nodes = inventory.get_hosts (c['nodes_group'])
# Check the nodes have no guests.
+ running, _ = lib.get_all_guests (c)
for node in nodes:
- guests = node.guests ()
- if guests != []:
- names = map (lambda x : x.name(), guests)
- sys.exit ("error: node %s has running guests %s, migrate them off or stop them first" % (node.name, names))
+ for vm in running.values():
+ if vm['node'] == node.name:
+ sys.exit ("error: node %s has running guests, migrate them off or stop them first" % node.name)
# Power them off.
- up = 0
- for node in nodes:
- if node.ping (force=True):
- node.shutdown ()
- up += 1
+ runner = ansible.runner.Runner (
+ remote_user = 'root',
+ module_name = 'command',
+ module_args = '/sbin/poweroff',
+ inventory = inventory,
+ pattern = c['nodes_group'],
+ )
+ data = runner.run ()
+ # Wait for them to power off.
pings = 60
- while pings > 0 and up > 0:
- if not node.up:
- if not node.ping (force=True):
- up -= 1
+ runner = ansible.runner.Runner (
+ remote_user = 'root',
+ module_name = 'ping',
+ inventory = inventory,
+ pattern = c['nodes_group'],
+ )
+ while pings > 0:
+ data = runner.run ()
+ if len (data['contacted']) == 0:
+ break
pings -= 1
+ time.sleep (1)
if pings == 0:
sys.exit ('warning: some nodes did not power off')