Skip to content

Instantly share code, notes, and snippets.

@drwahl
Created February 5, 2016 22:32
Show Gist options
  • Save drwahl/ec08a364dcf6e29070cb to your computer and use it in GitHub Desktop.
Save drwahl/ec08a364dcf6e29070cb to your computer and use it in GitHub Desktop.
#!/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