From 26eb1122a57c4537f6d2db81a4803304158c550d Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Thu, 26 Apr 2012 22:34:39 +0000 Subject: Switch to using new config parsing for vm_vdi_cleaner.py Fixes bug 1018166 Also uses CONF.verbose instead of passing verbose flag everywhere Change-Id: Ifee832dd087cae8c36b7b7a4f08b2e22ef7f06a3 --- tools/xenserver/vm_vdi_cleaner.py | 119 ++++++++++++++------------------------ 1 file changed, 45 insertions(+), 74 deletions(-) (limited to 'tools/xenserver') diff --git a/tools/xenserver/vm_vdi_cleaner.py b/tools/xenserver/vm_vdi_cleaner.py index 43f2ad81e..b0e9d981c 100755 --- a/tools/xenserver/vm_vdi_cleaner.py +++ b/tools/xenserver/vm_vdi_cleaner.py @@ -32,40 +32,17 @@ from nova import context from nova import db from nova import exception from nova import flags +from nova.openstack.common import cfg from nova.openstack.common import timeutils from nova.virt.xenapi import connection as xenapi_conn +CONF = cfg.CONF flags.DECLARE("resize_confirm_window", "nova.compute.manager") -FLAGS = flags.FLAGS -# NOTE(sirp): Nova futzs with the sys.argv in order to provide default -# flagfile. To isolate this awful practice, we're supplying a dummy -# argument list. -dummy = ["fakearg"] -flags.parse_args(dummy) - -class UnrecognizedNameLabel(Exception): - pass - - -def parse_options(): - """Generate command line options.""" - - ALLOWED_COMMANDS = ["list-vdis", "clean-vdis", "list-instances", - "clean-instances", "test"] - arg_str = "|".join(ALLOWED_COMMANDS) - parser = optparse.OptionParser("%prog [options] [" + arg_str + "]") - parser.add_option("--verbose", action="store_true") - - options, args = parser.parse_args() - - if not args: - parser.print_usage() - sys.exit(1) - - return options, args +ALLOWED_COMMANDS = ["list-vdis", "clean-vdis", "list-instances", + "clean-instances", "test"] def call_xenapi(xenapi, method, *args): @@ -73,7 +50,7 @@ def call_xenapi(xenapi, method, *args): return xenapi._session.call_xenapi(method, *args) -def find_orphaned_instances(xenapi, verbose=False): +def find_orphaned_instances(xenapi): """Find and return a list of orphaned instances.""" ctxt = context.get_admin_context(read_deleted="only") @@ -86,8 +63,7 @@ def find_orphaned_instances(xenapi, verbose=False): except (KeyError, exception.InstanceNotFound): # NOTE(jk0): Err on the side of caution here. If we don't know # anything about the particular instance, ignore it. - print_xen_object("INFO: Ignoring VM", vm_rec, indent_level=0, - verbose=verbose) + print_xen_object("INFO: Ignoring VM", vm_rec, indent_level=0) continue # NOTE(jk0): This would be triggered if a VM was deleted but the @@ -99,7 +75,7 @@ def find_orphaned_instances(xenapi, verbose=False): # been updated in over the specified period. is_zombie_vm = (instance.vm_state != "active" and timeutils.is_older_than(instance.updated_at, - FLAGS.zombie_instance_updated_at_window)) + CONF.zombie_instance_updated_at_window)) if is_active_and_deleting or is_zombie_vm: orphaned_instances.append((vm_ref, vm_rec, instance)) @@ -129,15 +105,14 @@ def _get_applicable_vm_recs(xenapi): yield vm_ref, vm_rec -def print_xen_object(obj_type, obj, indent_level=0, spaces_per_indent=4, - verbose=False): +def print_xen_object(obj_type, obj, indent_level=0, spaces_per_indent=4): """Pretty-print a Xen object. Looks like: VM (abcd-abcd-abcd): 'name label here' """ - if not verbose: + if not CONF.verbose: return uuid = obj["uuid"] try: @@ -149,7 +124,7 @@ def print_xen_object(obj_type, obj, indent_level=0, spaces_per_indent=4, print "".join([indent, msg]) -def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=False): +def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids): """Find VDIs which are connected to VBDs which are connected to VMs.""" def _is_null_ref(ref): return ref == "OpaqueRef:NULL" @@ -161,8 +136,7 @@ def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=False): cur_vdi_rec = vdi_rec while True: cur_vdi_uuid = cur_vdi_rec["uuid"] - print_xen_object("VDI", vdi_rec, indent_level=indent_level, - verbose=verbose) + print_xen_object("VDI", vdi_rec, indent_level=indent_level) connected_vdi_uuids.add(cur_vdi_uuid) vdi_and_parent_uuids.append(cur_vdi_uuid) @@ -188,8 +162,7 @@ def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=False): for vm_ref, vm_rec in _get_applicable_vm_recs(xenapi): indent_level = 0 - print_xen_object("VM", vm_rec, indent_level=indent_level, - verbose=verbose) + print_xen_object("VM", vm_rec, indent_level=indent_level) vbd_refs = vm_rec["VBDs"] for vbd_ref in vbd_refs: @@ -201,8 +174,7 @@ def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=False): continue indent_level = 1 - print_xen_object("VBD", vbd_rec, indent_level=indent_level, - verbose=verbose) + print_xen_object("VBD", vbd_rec, indent_level=indent_level) vbd_vdi_ref = vbd_rec["VDI"] @@ -219,8 +191,7 @@ def _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=False): _add_vdi_and_parents_to_connected(vdi_rec, indent_level) -def _find_all_vdis_and_system_vdis(xenapi, all_vdi_uuids, connected_vdi_uuids, - verbose=False): +def _find_all_vdis_and_system_vdis(xenapi, all_vdi_uuids, connected_vdi_uuids): """Collects all VDIs and adds system VDIs to the connected set.""" def _system_owned(vdi_rec): vdi_name = vdi_rec["name_label"] @@ -241,42 +212,39 @@ def _find_all_vdis_and_system_vdis(xenapi, all_vdi_uuids, connected_vdi_uuids, # System owned and non-managed VDIs should be considered 'connected' # for our purposes. if _system_owned(vdi_rec): - print_xen_object("SYSTEM VDI", vdi_rec, indent_level=0, - verbose=verbose) + print_xen_object("SYSTEM VDI", vdi_rec, indent_level=0) connected_vdi_uuids.add(vdi_uuid) elif not vdi_rec["managed"]: - print_xen_object("UNMANAGED VDI", vdi_rec, indent_level=0, - verbose=verbose) + print_xen_object("UNMANAGED VDI", vdi_rec, indent_level=0) connected_vdi_uuids.add(vdi_uuid) -def find_orphaned_vdi_uuids(xenapi, verbose=False): +def find_orphaned_vdi_uuids(xenapi): """Walk VM -> VBD -> VDI change and accumulate connected VDIs.""" connected_vdi_uuids = set() - _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids, verbose=verbose) + _find_vdis_connected_to_vm(xenapi, connected_vdi_uuids) all_vdi_uuids = set() - _find_all_vdis_and_system_vdis(xenapi, all_vdi_uuids, connected_vdi_uuids, - verbose=verbose) + _find_all_vdis_and_system_vdis(xenapi, all_vdi_uuids, connected_vdi_uuids) orphaned_vdi_uuids = all_vdi_uuids - connected_vdi_uuids return orphaned_vdi_uuids -def list_orphaned_vdis(vdi_uuids, verbose=False): +def list_orphaned_vdis(vdi_uuids): """List orphaned VDIs.""" for vdi_uuid in vdi_uuids: - if verbose: + if CONF.verbose: print "ORPHANED VDI (%s)" % vdi_uuid else: print vdi_uuid -def clean_orphaned_vdis(xenapi, vdi_uuids, verbose=False): +def clean_orphaned_vdis(xenapi, vdi_uuids): """Clean orphaned VDIs.""" for vdi_uuid in vdi_uuids: - if verbose: + if CONF.verbose: print "CLEANING VDI (%s)" % vdi_uuid vdi_ref = call_xenapi(xenapi, 'VDI.get_by_uuid', vdi_uuid) @@ -286,19 +254,19 @@ def clean_orphaned_vdis(xenapi, vdi_uuids, verbose=False): print >> sys.stderr, "Skipping %s: %s" % (vdi_uuid, exc) -def list_orphaned_instances(orphaned_instances, verbose=False): +def list_orphaned_instances(orphaned_instances): """List orphaned instances.""" for vm_ref, vm_rec, orphaned_instance in orphaned_instances: - if verbose: + if CONF.verbose: print "ORPHANED INSTANCE (%s)" % orphaned_instance.name else: print orphaned_instance.name -def clean_orphaned_instances(xenapi, orphaned_instances, verbose=False): +def clean_orphaned_instances(xenapi, orphaned_instances): """Clean orphaned instances.""" for vm_ref, vm_rec, instance in orphaned_instances: - if verbose: + if CONF.verbose: print "CLEANING INSTANCE (%s)" % instance.name cleanup_instance(xenapi, instance, vm_ref, vm_rec) @@ -306,33 +274,36 @@ def clean_orphaned_instances(xenapi, orphaned_instances, verbose=False): def main(): """Main loop.""" - options, args = parse_options() - verbose = options.verbose - command = args[0] + args = CONF(args=sys.argv, + usage='%prog [options] [' + '|'.join(ALLOWED_COMMANDS) + ']') + if len(args) < 2: + CONF.print_usage() + sys.exit(1) + + command = args[1] - if FLAGS.zombie_instance_updated_at_window < FLAGS.resize_confirm_window: + if CONF.zombie_instance_updated_at_window < CONF.resize_confirm_window: raise Exception("`zombie_instance_updated_at_window` has to be longer" " than `resize_confirm_window`.") xenapi = xenapi_conn.XenAPIDriver() if command == "list-vdis": - if verbose: + if CONF.verbose: print "Connected VDIs:\n" - orphaned_vdi_uuids = find_orphaned_vdi_uuids(xenapi, verbose=verbose) - if verbose: + orphaned_vdi_uuids = find_orphaned_vdi_uuids(xenapi) + if CONF.verbose: print "\nOrphaned VDIs:\n" - list_orphaned_vdis(orphaned_vdi_uuids, verbose=verbose) + list_orphaned_vdis(orphaned_vdi_uuids) elif command == "clean-vdis": - orphaned_vdi_uuids = find_orphaned_vdi_uuids(xenapi, verbose=verbose) - clean_orphaned_vdis(xenapi, orphaned_vdi_uuids, verbose=verbose) + orphaned_vdi_uuids = find_orphaned_vdi_uuids(xenapi) + clean_orphaned_vdis(xenapi, orphaned_vdi_uuids) elif command == "list-instances": - orphaned_instances = find_orphaned_instances(xenapi, verbose=verbose) - list_orphaned_instances(orphaned_instances, verbose=verbose) + orphaned_instances = find_orphaned_instances(xenapi) + list_orphaned_instances(orphaned_instances) elif command == "clean-instances": - orphaned_instances = find_orphaned_instances(xenapi, verbose=verbose) - clean_orphaned_instances(xenapi, orphaned_instances, - verbose=verbose) + orphaned_instances = find_orphaned_instances(xenapi) + clean_orphaned_instances(xenapi, orphaned_instances) elif command == "test": doctest.testmod() else: -- cgit