def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        description=dict(default=None),
        enabled=dict(default=True, type='bool'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params['name']
    description = module.params['description']
    enabled = module.params['enabled']
    state = module.params['state']

    sdk, cloud = openstack_cloud_from_module(module)
    try:

        domains = cloud.search_domains(filters=dict(name=name))

        if len(domains) > 1:
            module.fail_json(msg='Domain name %s is not unique' % name)
        elif len(domains) == 1:
            domain = domains[0]
        else:
            domain = None

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, domain))

        if state == 'present':
            if domain is None:
                domain = cloud.create_domain(name=name,
                                             description=description,
                                             enabled=enabled)
                changed = True
            else:
                if _needs_update(module, domain):
                    domain = cloud.update_domain(domain.id,
                                                 name=name,
                                                 description=description,
                                                 enabled=enabled)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, domain=domain, id=domain.id)

        elif state == 'absent':
            if domain is None:
                changed = False
            else:
                cloud.delete_domain(domain.id)
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #2
0
def main():
    argument_spec = openstack_full_argument_spec(
        display_name=dict(required=True, aliases=['name']),
        display_description=dict(default=None, aliases=['description']),
        volume=dict(required=True),
        force=dict(required=False, default=False, type='bool'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    sdk, cloud = openstack_cloud_from_module(module)

    state = module.params['state']

    try:
        if cloud.volume_exists(module.params['volume']):
            if module.check_mode:
                module.exit_json(changed=_system_state_change(module, cloud))
            if state == 'present':
                _present_volume_snapshot(module, cloud)
            if state == 'absent':
                _absent_volume_snapshot(module, cloud)
        else:
            module.fail_json(msg="No volume with name or id '{0}' was found.".
                             format(module.params['volume']))
    except (sdk.exceptions.OpenStackCloudException,
            sdk.exceptions.ResourceTimeout) as e:
        module.fail_json(msg=e.message)
예제 #3
0
def main():

    argument_spec = openstack_full_argument_spec(
        image=dict(required=False),
        properties=dict(default=None, type='dict'),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)
    is_old_facts = module._name == 'os_image_facts'
    if is_old_facts:
        module.deprecate("The 'os_image_facts' module has been renamed to 'os_image_info', "
                         "and the renamed one no longer returns ansible_facts", version='2.13')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if module.params['image']:
            image = cloud.get_image(module.params['image'])
            if is_old_facts:
                module.exit_json(changed=False, ansible_facts=dict(
                    openstack_image=image))
            else:
                module.exit_json(changed=False, openstack_image=image)
        else:
            images = cloud.search_images(filters=module.params['properties'])
            if is_old_facts:
                module.exit_json(changed=False, ansible_facts=dict(
                    openstack_image=images))
            else:
                module.exit_json(changed=False, openstack_image=images)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        port=dict(required=False),
        filters=dict(type='dict', required=False),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)
    is_old_facts = module._name == 'os_port_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_port_facts' module has been renamed to 'os_port_info', "
            "and the renamed one no longer returns ansible_facts",
            version='2.13')

    port = module.params.get('port')
    filters = module.params.get('filters')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        ports = cloud.search_ports(port, filters)
        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_ports=ports))
        else:
            module.exit_json(changed=False, openstack_ports=ports)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():

    argument_spec = openstack_full_argument_spec(name=dict(required=False,
                                                           default=None,
                                                           aliases=['subnet']),
                                                 filters=dict(required=False,
                                                              type='dict',
                                                              default=None))
    module = AnsibleModule(argument_spec)
    is_old_facts = module._name == 'os_subnets_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_subnets_facts' module has been renamed to 'os_subnets_info', "
            "and the renamed one no longer returns ansible_facts",
            version='2.13')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        subnets = cloud.search_subnets(module.params['name'],
                                       module.params['filters'])
        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_subnets=subnets))
        else:
            module.exit_json(changed=False, openstack_subnets=subnets)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #6
0
def main():
    argument_spec = openstack_full_argument_spec(
        size=dict(default=None, type='int'),
        volume_type=dict(default=None),
        display_name=dict(required=True, aliases=['name']),
        display_description=dict(default=None, aliases=['description']),
        image=dict(default=None),
        snapshot_id=dict(default=None),
        volume=dict(default=None),
        state=dict(default='present', choices=['absent', 'present']),
        scheduler_hints=dict(default=None, type='dict'),
        metadata=dict(default=None, type='dict'),
        bootable=dict(type='bool', default=False))
    module_kwargs = openstack_module_kwargs(mutually_exclusive=[
        ['image', 'snapshot_id', 'volume'],
    ], )
    module = AnsibleModule(argument_spec=argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    state = module.params['state']

    if state == 'present' and not module.params['size']:
        module.fail_json(msg="Size is required when state is 'present'")

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if state == 'present':
            _present_volume(module, cloud)
        if state == 'absent':
            _absent_volume(module, cloud, sdk)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #7
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        public_key=dict(default=None),
        public_key_file=dict(default=None),
        state=dict(default='present', choices=['absent', 'present',
                                               'replace']),
    )

    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[['public_key', 'public_key_file']])

    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    state = module.params['state']
    name = module.params['name']
    public_key = module.params['public_key']

    if module.params['public_key_file']:
        with open(module.params['public_key_file']) as public_key_fh:
            public_key = public_key_fh.read().rstrip()

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        keypair = cloud.get_keypair(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, keypair))

        if state in ('present', 'replace'):
            if keypair and keypair['name'] == name:
                if public_key and (public_key != keypair['public_key']):
                    if state == 'present':
                        module.fail_json(
                            msg="Key name %s present but key hash not the same"
                            " as offered. Delete key first." % name)
                    else:
                        cloud.delete_keypair(name)
                        keypair = cloud.create_keypair(name, public_key)
                        changed = True
                else:
                    changed = False
            else:
                keypair = cloud.create_keypair(name, public_key)
                changed = True

            module.exit_json(changed=changed, key=keypair, id=keypair['id'])

        elif state == 'absent':
            if keypair:
                cloud.delete_keypair(name)
                module.exit_json(changed=True)
            module.exit_json(changed=False)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #8
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        pool=dict(required=True),
        address=dict(default=None),
        protocol_port=dict(default=80, type='int'),
        subnet_id=dict(default=None),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)
    sdk, cloud = openstack_cloud_from_module(module)
    name = module.params['name']
    pool = module.params['pool']

    try:
        changed = False

        pool_ret = cloud.load_balancer.find_pool(name_or_id=pool)
        if not pool_ret:
            module.fail_json(msg='pool %s is not found' % pool)

        pool_id = pool_ret.id
        member = cloud.load_balancer.find_member(name, pool_id)

        if module.params['state'] == 'present':
            if not member:
                member = cloud.load_balancer.create_member(
                    pool_ret,
                    address=module.params['address'],
                    name=name,
                    protocol_port=module.params['protocol_port'],
                    subnet_id=module.params['subnet_id'])
                changed = True

                if not module.params['wait']:
                    module.exit_json(changed=changed,
                                     member=member.to_dict(),
                                     id=member.id)

            if module.params['wait']:
                member = _wait_for_member_status(module, cloud, pool_id,
                                                 member.id, "ACTIVE",
                                                 ["ERROR"])

            module.exit_json(changed=changed,
                             member=member.to_dict(),
                             id=member.id)

        elif module.params['state'] == 'absent':
            if member:
                cloud.load_balancer.delete_member(member, pool_ret)
                changed = True

            module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
def main():
    argument_spec = openstack_full_argument_spec(
        cluster_template_id=dict(required=True),
        discovery_url=dict(default=None),
        docker_volume_size=dict(type='int'),
        flavor_id=dict(default=None),
        keypair=dict(default=None),
        labels=dict(default=None, type='raw'),
        master_count=dict(type='int', default=1),
        master_flavor_id=dict(default=None),
        name=dict(required=True),
        node_count=dict(type='int', default=1),
        state=dict(default='present', choices=['absent', 'present']),
        timeout=dict(type='int', default=60),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    params = module.params.copy()

    state = module.params['state']
    name = module.params['name']
    cluster_template_id = module.params['cluster_template_id']

    kwargs = dict(
        discovery_url=module.params['discovery_url'],
        docker_volume_size=module.params['docker_volume_size'],
        flavor_id=module.params['flavor_id'],
        keypair=module.params['keypair'],
        labels=_parse_labels(params['labels']),
        master_count=module.params['master_count'],
        master_flavor_id=module.params['master_flavor_id'],
        node_count=module.params['node_count'],
        create_timeout=module.params['timeout'],
    )

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        changed = False
        cluster = cloud.get_coe_cluster(name_or_id=name, filters={'cluster_template_id': cluster_template_id})

        if state == 'present':
            if not cluster:
                cluster = cloud.create_coe_cluster(name, cluster_template_id=cluster_template_id, **kwargs)
                changed = True
            else:
                changed = False

            module.exit_json(changed=changed, cluster=cluster, id=cluster['uuid'])
        elif state == 'absent':
            if not cluster:
                module.exit_json(changed=False)
            else:
                cloud.delete_coe_cluster(name)
                module.exit_json(changed=True)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=False, default=None),
        ram=dict(required=False, default=None),
        vcpus=dict(required=False, default=None),
        limit=dict(required=False, default=None, type='int'),
        ephemeral=dict(required=False, default=None),
    )
    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[
            ['name', 'ram'],
            ['name', 'vcpus'],
            ['name', 'ephemeral']
        ]
    )
    module = AnsibleModule(argument_spec, **module_kwargs)
    is_old_facts = module._name == 'os_flavor_facts'
    if is_old_facts:
        module.deprecate("The 'os_flavor_facts' module has been renamed to 'os_flavor_info', "
                         "and the renamed one no longer returns ansible_facts", version='2.13')

    name = module.params['name']
    vcpus = module.params['vcpus']
    ram = module.params['ram']
    ephemeral = module.params['ephemeral']
    limit = module.params['limit']

    filters = {}
    if vcpus:
        filters['vcpus'] = vcpus
    if ram:
        filters['ram'] = ram
    if ephemeral:
        filters['ephemeral'] = ephemeral

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if name:
            flavors = cloud.search_flavors(filters={'name': name})

        else:
            flavors = cloud.list_flavors()
            if filters:
                flavors = cloud.range_search(flavors, filters)

        if limit is not None:
            flavors = flavors[:limit]

        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_flavors=flavors))
        else:
            module.exit_json(changed=False,
                             openstack_flavors=flavors)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #11
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        description=dict(required=False, default=None),
        domain_id=dict(required=False, default=None),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params.get('name')
    description = module.params.get('description')
    state = module.params.get('state')

    domain_id = module.params.pop('domain_id')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if domain_id:
            group = cloud.get_group(name, filters={'domain_id': domain_id})
        else:
            group = cloud.get_group(name)

        if module.check_mode:
            module.exit_json(
                changed=_system_state_change(state, description, group))

        if state == 'present':
            if group is None:
                group = cloud.create_group(name=name,
                                           description=description,
                                           domain=domain_id)
                changed = True
            else:
                if description is not None and group.description != description:
                    group = cloud.update_group(group.id,
                                               description=description)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, group=group)

        elif state == 'absent':
            if group is None:
                changed = False
            else:
                cloud.delete_group(group.id)
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=False, default=None),
        domain=dict(required=False, default=None),
        filters=dict(required=False, type='dict', default=None),
    )

    module = AnsibleModule(argument_spec)
    is_old_facts = module._name == 'os_project_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_project_facts' module has been renamed to 'os_project_info', "
            "and the renamed one no longer returns ansible_facts",
            version='2.13')

    sdk, opcloud = openstack_cloud_from_module(module)
    try:
        name = module.params['name']
        domain = module.params['domain']
        filters = module.params['filters']

        if domain:
            try:
                # We assume admin is passing domain id
                dom = opcloud.get_domain(domain)['id']
                domain = dom
            except Exception:
                # If we fail, maybe admin is passing a domain name.
                # Note that domains have unique names, just like id.
                dom = opcloud.search_domains(filters={'name': domain})
                if dom:
                    domain = dom[0]['id']
                else:
                    module.fail_json(msg='Domain name or ID does not exist')

            if not filters:
                filters = {}

            filters['domain_id'] = domain

        projects = opcloud.search_projects(name, filters)
        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_projects=projects))
        else:
            module.exit_json(changed=False, openstack_projects=projects)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #13
0
def main():

    argument_spec = openstack_full_argument_spec()
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        module.exit_json(changed=False,
                         ansible_facts=dict(
                             auth_token=cloud.auth_token,
                             service_catalog=cloud.service_catalog))
    except Exception as e:
        module.fail_json(msg=str(e), exception=traceback.format_exc())
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True, aliases=['name']),
        meta=dict(required=True, type='dict'),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    state = module.params['state']
    server_param = module.params['server']
    meta_param = module.params['meta']
    changed = False

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        server = cloud.get_server(server_param)
        if not server:
            module.fail_json(
                msg='Could not find server {0}'.format(server_param))

        if state == 'present':
            # check if it needs update
            if _needs_update(server_metadata=server.metadata,
                             metadata=meta_param):
                if not module.check_mode:
                    cloud.set_server_metadata(server_param, meta_param)
                changed = True
        elif state == 'absent':
            # remove from params the keys that do not exist in the server
            keys_to_delete = _get_keys_to_delete(server.metadata.keys(),
                                                 meta_param.keys())
            if len(keys_to_delete) > 0:
                if not module.check_mode:
                    cloud.delete_server_metadata(server_param, keys_to_delete)
                changed = True

        if changed:
            server = cloud.get_server(server_param)

        module.exit_json(
            changed=changed, server_id=server.id, metadata=server.metadata)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=e.message, extra_data=e.extra_data)
예제 #15
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=False, default=None),
        container=dict(required=True),
        filename=dict(required=False, default=None),
        container_access=dict(default='private', choices=['private', 'public']),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        changed = process_object(cloud, **module.params)

        module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        auth_type=dict(required=False),
        uuid=dict(required=False),
        name=dict(required=False),
        mac=dict(required=False),
        ironic_url=dict(required=False),
        timeout=dict(default=1200, type='int', required=False),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)

    if (module.params['auth_type'] in [None, 'None']
            and module.params['ironic_url'] is None):
        module.fail_json(msg="Authentication appears to be disabled, "
                         "Please define an ironic_url parameter")

    if (module.params['ironic_url']
            and module.params['auth_type'] in [None, 'None']):
        module.params['auth'] = dict(endpoint=module.params['ironic_url'])

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if module.params['name'] or module.params['uuid']:
            server = cloud.get_machine(_choose_id_value(module))
        elif module.params['mac']:
            server = cloud.get_machine_by_mac(module.params['mac'])
        else:
            module.fail_json(msg="The worlds did not align, "
                             "the host was not found as "
                             "no name, uuid, or mac was "
                             "defined.")
        if server:
            cloud.inspect_machine(server['uuid'], module.params['wait'])
            # TODO(TheJulia): diff properties, ?and ports? and determine
            # if a change occurred.  In theory, the node is always changed
            # if introspection is able to update the record.
            module.exit_json(changed=True, ansible_facts=server['properties'])

        else:
            module.fail_json(msg="node not found.")

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():

    argument_spec = openstack_full_argument_spec(
        server=dict(required=False),
        detailed=dict(required=False, type='bool', default=False),
        filters=dict(required=False, type='dict', default=None),
        all_projects=dict(required=False, type='bool', default=False),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)
    is_old_facts = module._name == 'os_server_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_server_facts' module has been renamed to 'os_server_info', "
            "and the renamed one no longer returns ansible_facts",
            version='2.13')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        openstack_servers = cloud.search_servers(
            detailed=module.params['detailed'],
            filters=module.params['filters'],
            all_projects=module.params['all_projects'])

        if module.params['server']:
            # filter servers by name
            pattern = module.params['server']
            # TODO(mordred) This is handled by sdk now
            openstack_servers = [
                server for server in openstack_servers
                if fnmatch.fnmatch(server['name'], pattern)
                or fnmatch.fnmatch(server['id'], pattern)
            ]
        if is_old_facts:
            module.exit_json(
                changed=False,
                ansible_facts=dict(openstack_servers=openstack_servers))
        else:
            module.exit_json(changed=False,
                             openstack_servers=openstack_servers)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        policies=dict(required=False, type='list'),
        state=dict(default='present', choices=['absent', 'present']),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params['name']
    policies = module.params['policies']
    state = module.params['state']

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        server_group = cloud.get_server_group(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(state, server_group))

        changed = False
        if state == 'present':
            if not server_group:
                if not policies:
                    module.fail_json(
                        msg="Parameter 'policies' is required in Server Group "
                        "Create")
                server_group = cloud.create_server_group(name, policies)
                changed = True

            module.exit_json(changed=changed,
                             id=server_group['id'],
                             server_group=server_group)
        if state == 'absent':
            if server_group:
                cloud.delete_server_group(server_group['id'])
                changed = True
            module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=False, default=None),
        filters=dict(required=False, type='dict', default=None),
    )
    module_kwargs = openstack_module_kwargs(mutually_exclusive=[
        ['name', 'filters'],
    ])
    module = AnsibleModule(argument_spec, **module_kwargs)
    is_old_facts = module._name == 'os_keystone_domain_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_keystone_domain_facts' module has been renamed to 'os_keystone_domain_info', "
            "and the renamed one no longer returns ansible_facts",
            version='2.13')

    sdk, opcloud = openstack_cloud_from_module(module)
    try:
        name = module.params['name']
        filters = module.params['filters']

        if name:
            # Let's suppose user is passing domain ID
            try:
                domains = opcloud.get_domain(name)
            except Exception:
                domains = opcloud.search_domains(filters={'name': name})

        else:
            domains = opcloud.search_domains(filters)

        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_domains=domains))
        else:
            module.exit_json(changed=False, openstack_domains=domains)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params.get('name')
    state = module.params.get('state')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        role = cloud.get_role(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(state, role))

        if state == 'present':
            if role is None:
                role = cloud.create_role(name)
                changed = True
            else:
                changed = False
            module.exit_json(changed=changed, role=role)
        elif state == 'absent':
            if role is None:
                changed = False
            else:
                cloud.delete_role(name)
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=False, default=None),
        domain=dict(required=False, default=None),
        filters=dict(required=False, type='dict', default=None),
    )

    module = AnsibleModule(argument_spec)

    sdk, opcloud = openstack_cloud_from_module(module)
    try:
        name = module.params['name']
        domain = module.params['domain']
        filters = module.params['filters']

        if domain:
            try:
                # We assume admin is passing domain id
                dom = opcloud.get_domain(domain)['id']
                domain = dom
            except Exception:
                # If we fail, maybe admin is passing a domain name.
                # Note that domains have unique names, just like id.
                dom = opcloud.search_domains(filters={'name': domain})
                if dom:
                    domain = dom[0]['id']
                else:
                    module.fail_json(msg='Domain name or ID does not exist')

            if not filters:
                filters = {}

        groups = opcloud.search_groups(name, filters, domain_id=domain)
        module.exit_json(changed=False, groups=groups)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        user=dict(required=True),
        group=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    user = module.params['user']
    group = module.params['group']
    state = module.params['state']

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        in_group = cloud.is_user_in_group(user, group)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(state, in_group))

        changed = False
        if state == 'present':
            if not in_group:
                cloud.add_user_to_group(user, group)
                changed = True

        elif state == 'absent':
            if in_group:
                cloud.remove_user_from_group(user, group)
                changed = True

        module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
예제 #23
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        zone_type=dict(required=False, choices=['primary', 'secondary']),
        email=dict(required=False, default=None),
        description=dict(required=False, default=None),
        ttl=dict(required=False, default=None, type='int'),
        masters=dict(required=False, default=None, type='list'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params.get('name')
    state = module.params.get('state')
    wait = module.params.get('wait')
    timeout = module.params.get('timeout')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        zone = cloud.get_zone(name)

        if state == 'present':
            zone_type = module.params.get('zone_type')
            email = module.params.get('email')
            description = module.params.get('description')
            ttl = module.params.get('ttl')
            masters = module.params.get('masters')

            if module.check_mode:
                module.exit_json(changed=_system_state_change(state, email,
                                                              description, ttl,
                                                              masters, zone))

            if zone is None:
                zone = cloud.create_zone(
                    name=name, zone_type=zone_type, email=email,
                    description=description, ttl=ttl, masters=masters)
                changed = True
            else:
                if masters is None:
                    masters = []

                pre_update_zone = zone
                changed = _system_state_change(state, email,
                                               description, ttl,
                                               masters, pre_update_zone)
                if changed:
                    zone = cloud.update_zone(
                        name, email=email,
                        description=description,
                        ttl=ttl, masters=masters)

            if wait:
                _wait(timeout, cloud, zone, state, module, sdk)

            module.exit_json(changed=changed, zone=zone)

        elif state == 'absent':
            if module.check_mode:
                module.exit_json(changed=_system_state_change(state, None,
                                                              None, None,
                                                              None, zone))

            if zone is None:
                changed = False
            else:
                cloud.delete_zone(name)
                changed = True

            if wait:
                _wait(timeout, cloud, zone, state, module, sdk)

            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        state=dict(required=False,
                   default='present',
                   choices=['absent', 'present']),
        name=dict(required=False),

        # required when state is 'present'
        ram=dict(required=False, type='int'),
        vcpus=dict(required=False, type='int'),
        disk=dict(required=False, default=0, type='int'),
        ephemeral=dict(required=False, default=0, type='int'),
        swap=dict(required=False, default=0, type='int'),
        rxtx_factor=dict(required=False, default=1.0, type='float'),
        is_public=dict(required=False, default=True, type='bool'),
        flavorid=dict(required=False, default="auto"),
        extra_specs=dict(required=False, default=None, type='dict'),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           required_if=[('state', 'present',
                                         ['ram', 'vcpus', 'disk'])],
                           **module_kwargs)

    state = module.params['state']
    name = module.params['name']
    extra_specs = module.params['extra_specs'] or {}

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        flavor = cloud.get_flavor(name)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, flavor))

        if state == 'present':
            old_extra_specs = {}
            require_update = False

            if flavor:
                old_extra_specs = flavor['extra_specs']
                for param_key in [
                        'ram', 'vcpus', 'disk', 'ephemeral', 'swap',
                        'rxtx_factor', 'is_public'
                ]:
                    if module.params[param_key] != flavor[param_key]:
                        require_update = True
                        break

            if flavor and require_update:
                cloud.delete_flavor(name)
                flavor = None

            if not flavor:
                flavor = cloud.create_flavor(
                    name=name,
                    ram=module.params['ram'],
                    vcpus=module.params['vcpus'],
                    disk=module.params['disk'],
                    flavorid=module.params['flavorid'],
                    ephemeral=module.params['ephemeral'],
                    swap=module.params['swap'],
                    rxtx_factor=module.params['rxtx_factor'],
                    is_public=module.params['is_public'])
                changed = True
            else:
                changed = False

            new_extra_specs = dict([(k, str(v))
                                    for k, v in extra_specs.items()])
            unset_keys = set(old_extra_specs.keys()) - set(extra_specs.keys())

            if unset_keys and not require_update:
                cloud.unset_flavor_specs(flavor['id'], unset_keys)

            if old_extra_specs != new_extra_specs:
                cloud.set_flavor_specs(flavor['id'], extra_specs)

            changed = (changed or old_extra_specs != new_extra_specs)

            module.exit_json(changed=changed, flavor=flavor, id=flavor['id'])

        elif state == 'absent':
            if flavor:
                cloud.delete_flavor(name)
                module.exit_json(changed=True)
            module.exit_json(changed=False)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #25
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        vip_network=dict(required=False),
        vip_subnet=dict(required=False),
        vip_port=dict(required=False),
        vip_address=dict(required=False),
        listeners=dict(type='list', default=[]),
        public_ip_address=dict(required=False, default=None),
        auto_public_ip=dict(required=False, default=False, type='bool'),
        public_network=dict(required=False),
        delete_public_ip=dict(required=False, default=False, type='bool'),
    )
    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec, **module_kwargs)
    sdk, cloud = openstack_cloud_from_module(module)

    vip_network = module.params['vip_network']
    vip_subnet = module.params['vip_subnet']
    vip_port = module.params['vip_port']
    listeners = module.params['listeners']
    public_vip_address = module.params['public_ip_address']
    allocate_fip = module.params['auto_public_ip']
    delete_fip = module.params['delete_public_ip']
    public_network = module.params['public_network']

    vip_network_id = None
    vip_subnet_id = None
    vip_port_id = None

    try:
        changed = False
        lb = cloud.load_balancer.find_load_balancer(
            name_or_id=module.params['name'])

        if module.params['state'] == 'present':
            if not lb:
                if not (vip_network or vip_subnet or vip_port):
                    module.fail_json(
                        msg="One of vip_network, vip_subnet, or vip_port must "
                        "be specified for load balancer creation")

                if vip_network:
                    network = cloud.get_network(vip_network)
                    if not network:
                        module.fail_json(msg='network %s is not found' %
                                         vip_network)
                    vip_network_id = network.id
                if vip_subnet:
                    subnet = cloud.get_subnet(vip_subnet)
                    if not subnet:
                        module.fail_json(msg='subnet %s is not found' %
                                         vip_subnet)
                    vip_subnet_id = subnet.id
                if vip_port:
                    port = cloud.get_port(vip_port)
                    if not port:
                        module.fail_json(msg='port %s is not found' % vip_port)
                    vip_port_id = port.id

                lb = cloud.load_balancer.create_load_balancer(
                    name=module.params['name'],
                    vip_network_id=vip_network_id,
                    vip_subnet_id=vip_subnet_id,
                    vip_port_id=vip_port_id,
                    vip_address=module.params['vip_address'],
                )
                changed = True

            if not listeners and not module.params['wait']:
                module.exit_json(changed=changed,
                                 loadbalancer=lb.to_dict(),
                                 id=lb.id)

            _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"])

            for listener_def in listeners:
                listener_name = listener_def.get("name")
                pool_def = listener_def.get("pool")

                if not listener_name:
                    module.fail_json(msg='listener name is required')

                listener = cloud.load_balancer.find_listener(
                    name_or_id=listener_name)

                if not listener:
                    _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"])

                    protocol = listener_def.get("protocol", "HTTP")
                    protocol_port = listener_def.get("protocol_port", 80)

                    listener = cloud.load_balancer.create_listener(
                        name=listener_name,
                        loadbalancer_id=lb.id,
                        protocol=protocol,
                        protocol_port=protocol_port,
                    )
                    changed = True

                # Ensure pool in the listener.
                if pool_def:
                    pool_name = pool_def.get("name")
                    members = pool_def.get('members', [])

                    if not pool_name:
                        module.fail_json(msg='pool name is required')

                    pool = cloud.load_balancer.find_pool(name_or_id=pool_name)

                    if not pool:
                        _wait_for_lb(module, cloud, lb, "ACTIVE", ["ERROR"])

                        protocol = pool_def.get("protocol", "HTTP")
                        lb_algorithm = pool_def.get("lb_algorithm",
                                                    "ROUND_ROBIN")

                        pool = cloud.load_balancer.create_pool(
                            name=pool_name,
                            listener_id=listener.id,
                            protocol=protocol,
                            lb_algorithm=lb_algorithm)
                        changed = True

                    # Ensure members in the pool
                    for member_def in members:
                        member_name = member_def.get("name")
                        if not member_name:
                            module.fail_json(msg='member name is required')

                        member = cloud.load_balancer.find_member(
                            member_name, pool.id)

                        if not member:
                            _wait_for_lb(module, cloud, lb, "ACTIVE",
                                         ["ERROR"])

                            address = member_def.get("address")
                            if not address:
                                module.fail_json(
                                    msg='member address for member %s is '
                                    'required' % member_name)

                            subnet_id = member_def.get("subnet")
                            if subnet_id:
                                subnet = cloud.get_subnet(subnet_id)
                                if not subnet:
                                    module.fail_json(
                                        msg='subnet %s for member %s is not '
                                        'found' % (subnet_id, member_name))
                                subnet_id = subnet.id

                            protocol_port = member_def.get("protocol_port", 80)

                            member = cloud.load_balancer.create_member(
                                pool,
                                name=member_name,
                                address=address,
                                protocol_port=protocol_port,
                                subnet_id=subnet_id)
                            changed = True

            # Associate public ip to the load balancer VIP. If
            # public_vip_address is provided, use that IP, otherwise, either
            # find an available public ip or create a new one.
            fip = None
            orig_public_ip = None
            new_public_ip = None
            if public_vip_address or allocate_fip:
                ips = cloud.network.ips(port_id=lb.vip_port_id,
                                        fixed_ip_address=lb.vip_address)
                ips = list(ips)
                if ips:
                    orig_public_ip = ips[0]
                    new_public_ip = orig_public_ip.floating_ip_address

            if public_vip_address and public_vip_address != orig_public_ip:
                fip = cloud.network.find_ip(public_vip_address)
                if not fip:
                    module.fail_json(msg='Public IP %s is unavailable' %
                                     public_vip_address)

                # Release origin public ip first
                cloud.network.update_ip(orig_public_ip,
                                        fixed_ip_address=None,
                                        port_id=None)

                # Associate new public ip
                cloud.network.update_ip(fip,
                                        fixed_ip_address=lb.vip_address,
                                        port_id=lb.vip_port_id)

                new_public_ip = public_vip_address
                changed = True
            elif allocate_fip and not orig_public_ip:
                fip = cloud.network.find_available_ip()
                if not fip:
                    if not public_network:
                        module.fail_json(msg="Public network is not provided")

                    pub_net = cloud.network.find_network(public_network)
                    if not pub_net:
                        module.fail_json(msg='Public network %s not found' %
                                         public_network)
                    fip = cloud.network.create_ip(
                        floating_network_id=pub_net.id)

                cloud.network.update_ip(fip,
                                        fixed_ip_address=lb.vip_address,
                                        port_id=lb.vip_port_id)

                new_public_ip = fip.floating_ip_address
                changed = True

            # Include public_vip_address in the result.
            lb = cloud.load_balancer.find_load_balancer(name_or_id=lb.id)
            lb_dict = lb.to_dict()
            lb_dict.update({"public_vip_address": new_public_ip})

            module.exit_json(changed=changed, loadbalancer=lb_dict, id=lb.id)
        elif module.params['state'] == 'absent':
            changed = False
            public_vip_address = None

            if lb:
                if delete_fip:
                    ips = cloud.network.ips(port_id=lb.vip_port_id,
                                            fixed_ip_address=lb.vip_address)
                    ips = list(ips)
                    if ips:
                        public_vip_address = ips[0]

                # Deleting load balancer with `cascade=False` does not make
                # sense because the deletion will always fail if there are
                # sub-resources.
                cloud.load_balancer.delete_load_balancer(lb, cascade=True)
                changed = True

                if module.params['wait']:
                    _wait_for_lb(module, cloud, lb, "DELETED", ["ERROR"])

            if delete_fip and public_vip_address:
                cloud.network.delete_ip(public_vip_address)
                changed = True

            module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
예제 #26
0
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        loadbalancer=dict(default=None),
        listener=dict(default=None),
        protocol=dict(default='HTTP',
                      choices=['HTTP', 'HTTPS', 'TCP', 'UDP', 'PROXY']),
        lb_algorithm=dict(
            default='ROUND_ROBIN',
            choices=['ROUND_ROBIN', 'LEAST_CONNECTIONS', 'SOURCE_IP']
        )
    )
    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[['loadbalancer', 'listener']]
    )
    module = AnsibleModule(argument_spec, **module_kwargs)
    sdk, cloud = openstack_cloud_from_module(module)

    loadbalancer = module.params['loadbalancer']
    listener = module.params['listener']

    try:
        changed = False
        pool = cloud.load_balancer.find_pool(name_or_id=module.params['name'])

        if module.params['state'] == 'present':
            if not pool:
                loadbalancer_id = None
                if not (loadbalancer or listener):
                    module.fail_json(
                        msg="either loadbalancer or listener must be provided"
                    )

                if loadbalancer:
                    lb = cloud.load_balancer.find_load_balancer(loadbalancer)
                    if not lb:
                        module.fail_json(msg='load balancer %s is not '
                                             'found' % loadbalancer)
                    loadbalancer_id = lb.id

                listener_id = None
                if listener:
                    listener_ret = cloud.load_balancer.find_listener(listener)
                    if not listener_ret:
                        module.fail_json(msg='listener %s is not found'
                                             % listener)
                    listener_id = listener_ret.id

                pool = cloud.load_balancer.create_pool(
                    name=module.params['name'],
                    loadbalancer_id=loadbalancer_id,
                    listener_id=listener_id,
                    protocol=module.params['protocol'],
                    lb_algorithm=module.params['lb_algorithm']
                )
                changed = True

                if not module.params['wait']:
                    module.exit_json(changed=changed,
                                     pool=pool.to_dict(),
                                     id=pool.id)

            if module.params['wait']:
                pool = _wait_for_pool_status(module, cloud, pool.id, "ACTIVE",
                                             ["ERROR"])

            module.exit_json(changed=changed, pool=pool.to_dict(),
                             id=pool.id)

        elif module.params['state'] == 'absent':
            if pool:
                cloud.load_balancer.delete_pool(pool)
                changed = True

            module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
예제 #27
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        id=dict(default=None),
        checksum=dict(default=None),
        disk_format=dict(default='qcow2', choices=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', 'vdi', 'iso', 'vhdx', 'ploop']),
        container_format=dict(default='bare', choices=['ami', 'aki', 'ari', 'bare', 'ovf', 'ova', 'docker']),
        owner=dict(default=None),
        min_disk=dict(type='int', default=0),
        min_ram=dict(type='int', default=0),
        is_public=dict(type='bool', default=False),
        protected=dict(type='bool', default=False),
        filename=dict(default=None),
        ramdisk=dict(default=None),
        kernel=dict(default=None),
        properties=dict(type='dict', default={}),
        volume=dict(default=None),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs(
        mutually_exclusive=[['filename', 'volume']],
    )
    module = AnsibleModule(argument_spec, **module_kwargs)

    sdk, cloud = openstack_cloud_from_module(module)
    try:

        changed = False
        if module.params['id']:
            image = cloud.get_image(name_or_id=module.params['id'])
        elif module.params['checksum']:
            image = cloud.get_image(name_or_id=module.params['name'], filters={'checksum': module.params['checksum']})
        else:
            image = cloud.get_image(name_or_id=module.params['name'])

        if module.params['state'] == 'present':
            if not image:
                kwargs = {}
                if module.params['id'] is not None:
                    kwargs['id'] = module.params['id']
                image = cloud.create_image(
                    name=module.params['name'],
                    filename=module.params['filename'],
                    disk_format=module.params['disk_format'],
                    container_format=module.params['container_format'],
                    wait=module.params['wait'],
                    timeout=module.params['timeout'],
                    is_public=module.params['is_public'],
                    protected=module.params['protected'],
                    min_disk=module.params['min_disk'],
                    min_ram=module.params['min_ram'],
                    volume=module.params['volume'],
                    **kwargs
                )
                changed = True
                if not module.params['wait']:
                    module.exit_json(changed=changed, image=image, id=image.id)

            cloud.update_image_properties(
                image=image,
                kernel=module.params['kernel'],
                ramdisk=module.params['ramdisk'],
                protected=module.params['protected'],
                **module.params['properties'])
            image = cloud.get_image(name_or_id=image.id)
            module.exit_json(changed=changed, image=image, id=image.id)

        elif module.params['state'] == 'absent':
            if not image:
                changed = False
            else:
                cloud.delete_image(
                    name_or_id=module.params['name'],
                    wait=module.params['wait'],
                    timeout=module.params['timeout'])
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
def main():
    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        description=dict(default=''),
        state=dict(default='present', choices=['absent', 'present']),
        project=dict(default=None),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    name = module.params['name']
    state = module.params['state']
    description = module.params['description']
    project = module.params['project']

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if project is not None:
            proj = cloud.get_project(project)
            if proj is None:
                module.fail_json(msg='Project %s could not be found' % project)
            project_id = proj['id']
        else:
            project_id = cloud.current_project_id

        if project_id:
            filters = {'tenant_id': project_id}
        else:
            filters = None

        secgroup = cloud.get_security_group(name, filters=filters)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(module, secgroup))

        changed = False
        if state == 'present':
            if not secgroup:
                kwargs = {}
                if project_id:
                    kwargs['project_id'] = project_id
                secgroup = cloud.create_security_group(name, description,
                                                       **kwargs)
                changed = True
            else:
                if _needs_update(module, secgroup):
                    secgroup = cloud.update_security_group(
                        secgroup['id'], description=description)
                    changed = True
            module.exit_json(
                changed=changed, id=secgroup['id'], secgroup=secgroup)

        if state == 'absent':
            if secgroup:
                cloud.delete_security_group(secgroup['id'])
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
예제 #29
0
def main():
    argument_spec = openstack_full_argument_spec(
        role=dict(required=True),
        user=dict(required=False),
        group=dict(required=False),
        project=dict(required=False),
        domain=dict(required=False),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs(
        required_one_of=[
            ['user', 'group']
        ])
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           **module_kwargs)

    role = module.params.get('role')
    user = module.params.get('user')
    group = module.params.get('group')
    project = module.params.get('project')
    domain = module.params.get('domain')
    state = module.params.get('state')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        filters = {}

        r = cloud.get_role(role)
        if r is None:
            module.fail_json(msg="Role %s is not valid" % role)
        filters['role'] = r['id']

        if domain:
            d = cloud.get_domain(name_or_id=domain)
            if d is None:
                module.fail_json(msg="Domain %s is not valid" % domain)
            filters['domain'] = d['id']
        if user:
            if domain:
                u = cloud.get_user(user, domain_id=filters['domain'])
            else:
                u = cloud.get_user(user)

            if u is None:
                module.fail_json(msg="User %s is not valid" % user)
            filters['user'] = u['id']
        if group:
            g = cloud.get_group(group)
            if g is None:
                module.fail_json(msg="Group %s is not valid" % group)
            filters['group'] = g['id']
        domain_id = None
        if project:
            if domain:
                p = cloud.get_project(project, domain_id=filters['domain'])
                # OpenStack won't allow us to use both a domain and project as
                # filter. Once we identified the project (using the domain as
                # a filter criteria), we need to remove the domain itself from
                # the filters list.
                domain_id = filters.pop('domain')
            else:
                p = cloud.get_project(project)

            if p is None:
                module.fail_json(msg="Project %s is not valid" % project)
            filters['project'] = p['id']

        assignment = cloud.list_role_assignments(filters=filters)

        if module.check_mode:
            module.exit_json(changed=_system_state_change(state, assignment))

        changed = False

        if state == 'present':
            if not assignment:
                kwargs = _build_kwargs(user, group, project, domain_id)
                cloud.grant_role(role, **kwargs)
                changed = True

        elif state == 'absent':
            if assignment:
                kwargs = _build_kwargs(user, group, project, domain_id)
                cloud.revoke_role(role, **kwargs)
                changed = True

        module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
def main():
    argument_spec = openstack_full_argument_spec(
        zone=dict(required=True),
        name=dict(required=True),
        recordset_type=dict(required=False),
        records=dict(required=False, type='list'),
        description=dict(required=False, default=None),
        ttl=dict(required=False, default=None, type='int'),
        state=dict(default='present', choices=['absent', 'present']),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           required_if=[('state', 'present',
                                         ['recordset_type', 'records'])],
                           supports_check_mode=True,
                           **module_kwargs)

    zone = module.params.get('zone')
    name = module.params.get('name')
    state = module.params.get('state')

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        recordset_type = module.params.get('recordset_type')
        recordset_filter = {'type': recordset_type}

        recordsets = cloud.search_recordsets(zone,
                                             name_or_id=name,
                                             filters=recordset_filter)

        if len(recordsets) == 1:
            recordset = recordsets[0]
            try:
                recordset_id = recordset['id']
            except KeyError as e:
                module.fail_json(msg=str(e))
        else:
            # recordsets is filtered by type and should never be more than 1 return
            recordset = None

        if state == 'present':
            records = module.params.get('records')
            description = module.params.get('description')
            ttl = module.params.get('ttl')

            if module.check_mode:
                module.exit_json(changed=_system_state_change(
                    state, records, description, ttl, zone, recordset))

            if recordset is None:
                recordset = cloud.create_recordset(
                    zone=zone,
                    name=name,
                    recordset_type=recordset_type,
                    records=records,
                    description=description,
                    ttl=ttl)
                changed = True
            else:
                if records is None:
                    records = []

                pre_update_recordset = recordset
                changed = _system_state_change(state, records, description,
                                               ttl, zone, pre_update_recordset)
                if changed:
                    zone = cloud.update_recordset(zone,
                                                  recordset_id,
                                                  records=records,
                                                  description=description,
                                                  ttl=ttl)

            module.exit_json(changed=changed, recordset=recordset)

        elif state == 'absent':
            if module.check_mode:
                module.exit_json(changed=_system_state_change(
                    state, None, None, None, None, recordset))

            if recordset is None:
                changed = False
            else:
                cloud.delete_recordset(zone, recordset_id)
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))