Created
February 5, 2016 22:32
-
-
Save drwahl/ec08a364dcf6e29070cb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import ConfigParser | |
import argparse | |
import os | |
from novaclient.v1_1 import client as novaclient | |
from neutronclient.v2_0 import client as neutronclient | |
from keystoneclient.v2_0 import client as keystoneclient | |
parser = argparse.ArgumentParser(description='Nova Auditor') | |
parser.add_argument('--clean', action='store_true', default=False, | |
help='auto-clean orphans') | |
parser.add_argument('--os-tenant-name', action='store', | |
default=None, dest="OS_TENANT_NAME", | |
help='OpenStack tenant name used for authentication') | |
parser.add_argument('--os-username', action='store', | |
default=None, dest="OS_USERNAME", | |
help='OpenStack username used for authentication') | |
parser.add_argument('--os-password', action='store', | |
default=None, dest="OS_PASSWORD", | |
help='OpenStack user password used for authentication') | |
parser.add_argument('--os-auth-url', action='store', | |
default=None, dest="OS_AUTH_URL", | |
help='OpenStack auth-url used for authentication') | |
args = parser.parse_args() | |
def get_os_vars(): | |
"""Return a dict of variables used for OpenStack client authentication. | |
This will determine the values first by checking ~/.os.cfg, then next by | |
checking the OS_* environment variables, and finally, by checking CLI | |
params. Each step will overwrite the previous values learned.""" | |
os_vars = {'OS_PASSWORD': None, | |
'OS_AUTH_URL': None, | |
'OS_USERNAME': None, | |
'OS_TENANT_ID': None, | |
'OS_TENANT_NAME': None, | |
'OS_SERVICE_TENANT_NAME': 'service'} | |
for os_var in os_vars.keys(): | |
try: | |
config = ConfigParser.ConfigParser() | |
config.read(['os.cfg',os.path.expanduser('~/.os.cfg')]) | |
os_vars[os_var] = config.get('OPENSTACK', os_var.lower()) | |
except ConfigParser.NoOptionError: | |
continue | |
for os_var in os_vars.keys(): | |
try: | |
os_vars[os_var] = os.environ[os_var] | |
except KeyError: | |
continue | |
for os_var in os_vars.keys(): | |
try: | |
if getattr(args, os_var): | |
os_vars[os_var] = getattr(args, os_var) | |
except AttributeError: | |
continue | |
for os_var in os_vars.keys(): | |
if not os_vars[os_var]: | |
os_vars[os_var] = raw_input('%s: ' % os_var) | |
return os_vars | |
def get_service_tenant_id(osvars): | |
"""Return the ID of the service tenant""" | |
keystonec = keystoneclient.Client( | |
username=osvars['OS_USERNAME'], | |
password=osvars['OS_PASSWORD'], | |
tenant_name=osvars['OS_TENANT_NAME'], | |
auth_url=osvars['OS_AUTH_URL']) | |
return keystonec.tenants.find(name=osvars['OS_SERVICE_TENANT_NAME']).id | |
def get_routers_list(osvars): | |
"""Returns a list of neutron IDs as reported by neutron""" | |
neutronc = neutronclient.Client(username=osvars['OS_USERNAME'], | |
password=osvars['OS_PASSWORD'], | |
tenant_name=osvars['OS_TENANT_NAME'], | |
auth_url=osvars['OS_AUTH_URL']) | |
routers = neutronc.list_routers().get('routers', []) | |
router_ids = [] | |
for r in routers: | |
router_ids.append(r.get('id', '')) | |
return router_ids | |
def list_all_vms(osvars): | |
"""Returns a listing of all VM objects as reported by Nova""" | |
novac = novaclient.Client(osvars['OS_USERNAME'], | |
osvars['OS_PASSWORD'], | |
osvars['OS_TENANT_NAME'], | |
osvars['OS_AUTH_URL'], | |
service_type="compute") | |
return novac.servers.list(True, {'all_tenants': '1'}) | |
def check_vm_is_router(router_ids, vm): | |
vm_id = vm.name[3:] | |
if vm_id not in router_ids: | |
print "stray: %s (rid %s) created %s on %s (status: %s, %s)" % (vm.id, vm_id, vm.created, vm._info['OS-EXT-SRV-ATTR:hypervisor_hostname'], vm.status, vm._info['OS-EXT-STS:task_state']) | |
if args.clean: | |
print "Cleaning" | |
#novac.servers.delete(vm.id) | |
def main(): | |
osvars = get_os_vars() | |
service_tenant_id = get_service_tenant_id(osvars) | |
router_ids = get_routers_list(osvars) | |
for vm in list_all_vms(osvars): | |
if vm.tenant_id == service_tenant_id: | |
check_vm_is_router(router_ids, vm) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment