#!/usr/bin/python # -*- coding: utf-8 -*- DOCUMENTATION = ''' --- module: nova_manage short_description: Initialize OpenStack Compute (nova) database description: Create the tables for the database backend used by nova options: action: description: - action to perform. Currently only dbsync is supported required: true requirements: [ nova ] ''' EXAMPLES = ''' nova_manage: action=dbsync ''' import subprocess try: from nova.db.sqlalchemy import migration from nova import config except ImportError: nova_found = False else: nova_found = True def load_config_file(): config.parse_args([]) def will_db_change(): """ Check if the database version will change after the sync. """ # Load the config file options current_version = migration.db_version() repository = migration._find_migrate_repo() repo_version = repository.latest return current_version != repo_version def do_dbsync(): """Do the dbsync. Returns (returncode, stdout, stderr)""" # We call nova-manage db_sync on the shell rather than trying to # do this in Python since we have no guarantees about changes to the # internals. args = ['nova-manage', 'db', 'sync'] call = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = call.communicate() return (call.returncode, out, err) def main(): module = AnsibleModule( argument_spec=dict( action=dict(required=True), ), supports_check_mode=True ) if not nova_found: module.fail_json(msg="nova package could not be found") action = module.params['action'] if action not in ['dbsync', 'db_sync']: module.fail_json(msg="Only supported action is 'dbsync'") load_config_file() changed = will_db_change() if module.check_mode: module.exit_json(changed=changed) (res, stdout, stderr) = do_dbsync() if res == 0: module.exit_json(changed=changed, stdout=stdout, stderr=stderr) else: module.fail_json(msg="nova-manage returned non-zero value: %d" % res, stdout=stdout, stderr=stderr) # this is magic, see lib/ansible/module_common.py #<> main()