cleanup_gce.py 2.53 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
'''
Find and delete GCE resources matching the provided --match string.  Unless
--yes|-y is provided, the prompt for confirmation prior to deleting resources.
Please use caution, you can easily delete your *ENTIRE* GCE infrastructure.
'''

import os
import re
import sys
import optparse
import yaml

try:
    from libcloud.compute.types import Provider
    from libcloud.compute.providers import get_driver
    from libcloud.common.google import GoogleBaseError, QuotaExceededError, \
            ResourceExistsError, ResourceInUseError, ResourceNotFoundError
    _ = Provider.GCE
except ImportError:
    print("failed=True " + \
        "msg='libcloud with GCE support (0.13.3+) required for this module'")
    sys.exit(1)

24 25
import gce_credentials

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

def delete_gce_resources(get_func, attr, opts):
    for item in get_func():
        val = getattr(item, attr)
        if re.search(opts.match_re, val, re.IGNORECASE):
            prompt_and_delete(item, "Delete matching %s? [y/n]: " % (item,), opts.assumeyes)

def prompt_and_delete(item, prompt, assumeyes):
    if not assumeyes:
        assumeyes = raw_input(prompt).lower() == 'y'
    assert hasattr(item, 'destroy'), "Class <%s> has no delete attribute" % item.__class__
    if assumeyes:
        item.destroy()
        print ("Deleted %s" % item)

def parse_args():
    parser = optparse.OptionParser(usage="%s [options]" % (sys.argv[0],),
                description=__doc__)
44
    gce_credentials.add_credentials_options(parser)
45 46 47 48 49 50 51 52 53 54
    parser.add_option("--yes", "-y",
        action="store_true", dest="assumeyes",
        default=False,
        help="Don't prompt for confirmation")
    parser.add_option("--match",
        action="store", dest="match_re",
        default="^ansible-testing-",
        help="Regular expression used to find GCE resources (default: %default)")

    (opts, args) = parser.parse_args()
55
    gce_credentials.check_required(opts, parser)
56 57 58 59 60 61 62
    return (opts, args)

if __name__ == '__main__':

    (opts, args) = parse_args()

    # Connect to GCE
63
    gce = gce_credentials.get_gce_driver(opts)
64 65 66 67

    try:
      # Delete matching instances
      delete_gce_resources(gce.list_nodes, 'name', opts)
68 69 70 71 72 73
      # Delete matching snapshots
      def get_snapshots():
        for volume in gce.list_volumes():
          for snapshot in gce.list_volume_snapshots(volume):
            yield snapshot
      delete_gce_resources(get_snapshots, 'name', opts)
74 75
      # Delete matching disks
      delete_gce_resources(gce.list_volumes, 'name', opts)
76 77
    except KeyboardInterrupt, e:
        print "\nExiting on user command."