Rewrite to use ansible.
[mclu.git] / mclu_off.py
index 10ae06a..3851545 100644 (file)
 # 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):
@@ -29,38 +33,47 @@ 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')