Ejemplo n.º 1
0
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))
Ejemplo n.º 2
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))
Ejemplo n.º 3
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))
Ejemplo n.º 4
0
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))
Ejemplo n.º 5
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)
Ejemplo n.º 6
0
def main():

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

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

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 7
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)
Ejemplo n.º 8
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))
Ejemplo n.º 9
0
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))
Ejemplo n.º 10
0
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_user_facts'
    if is_old_facts:
        module.deprecate(
            "The 'os_user_facts' module has been renamed to 'os_user_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

        users = opcloud.search_users(name, filters)
        if is_old_facts:
            module.exit_json(changed=False,
                             ansible_facts=dict(openstack_users=users))
        else:
            module.exit_json(changed=False, openstack_users=users)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 11
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())
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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))
Ejemplo n.º 14
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))
Ejemplo n.º 15
0
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))
Ejemplo n.º 16
0
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))
Ejemplo n.º 18
0
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))
Ejemplo n.º 19
0
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)
Ejemplo n.º 20
0
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))
Ejemplo n.º 21
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        state=dict(default='present', choices=['absent', 'present']),
        backup_gigabytes=dict(required=False, type='int', default=None),
        backups=dict(required=False, type='int', default=None),
        cores=dict(required=False, type='int', default=None),
        fixed_ips=dict(required=False, type='int', default=None),
        floating_ips=dict(required=False,
                          type='int',
                          default=None,
                          aliases=['compute_floating_ips']),
        floatingip=dict(required=False,
                        type='int',
                        default=None,
                        aliases=['network_floating_ips']),
        gigabytes=dict(required=False, type='int', default=None),
        gigabytes_types=dict(required=False, type='dict', default={}),
        injected_file_size=dict(required=False, type='int', default=None),
        injected_files=dict(required=False, type='int', default=None),
        injected_path_size=dict(required=False, type='int', default=None),
        instances=dict(required=False, type='int', default=None),
        key_pairs=dict(required=False, type='int', default=None),
        loadbalancer=dict(required=False, type='int', default=None),
        network=dict(required=False, type='int', default=None),
        per_volume_gigabytes=dict(required=False, type='int', default=None),
        pool=dict(required=False, type='int', default=None),
        port=dict(required=False, type='int', default=None),
        project=dict(required=False, type='int', default=None),
        properties=dict(required=False, type='int', default=None),
        ram=dict(required=False, type='int', default=None),
        rbac_policy=dict(required=False, type='int', default=None),
        router=dict(required=False, type='int', default=None),
        security_group_rule=dict(required=False, type='int', default=None),
        security_group=dict(required=False, type='int', default=None),
        server_group_members=dict(required=False, type='int', default=None),
        server_groups=dict(required=False, type='int', default=None),
        snapshots=dict(required=False, type='int', default=None),
        snapshots_types=dict(required=False, type='dict', default={}),
        subnet=dict(required=False, type='int', default=None),
        subnetpool=dict(required=False, type='int', default=None),
        volumes=dict(required=False, type='int', default=None),
        volumes_types=dict(required=False, type='dict', default={}))

    module = AnsibleModule(argument_spec, supports_check_mode=True)

    if not HAS_KEYSTONEAUTH1:
        module.fail_json(msg=missing_required_lib("keystoneauth1"),
                         exception=KEYSTONEAUTH1_IMP_ERR)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        cloud_params = dict(module.params)

        # In order to handle the different volume types we update module params after.
        dynamic_types = [
            'gigabytes_types',
            'snapshots_types',
            'volumes_types',
        ]

        for dynamic_type in dynamic_types:
            for k, v in module.params[dynamic_type].items():
                module.params[k] = int(v)

        # Get current quota values
        project_quota_output = _get_quotas(sdk, module, cloud,
                                           cloud_params['name'])
        changes_required = False

        if module.params['state'] == "absent":
            # If a quota state is set to absent we should assume there will be changes.
            # The default quota values are not accessible so we can not determine if
            # no changes will occur or not.
            if module.check_mode:
                module.exit_json(changed=True)

            # Calling delete_network_quotas when a quota has not been set results
            # in an error, according to the sdk docs it should return the
            # current quota.
            # The following error string is returned:
            # network client call failed: Quota for tenant 69dd91d217e949f1a0b35a4b901741dc could not be found.
            neutron_msg1 = "network client call failed: Quota for tenant"
            neutron_msg2 = "could not be found"

            for quota_type in project_quota_output.keys():
                quota_call = getattr(cloud, 'delete_%s_quotas' % (quota_type))
                try:
                    quota_call(cloud_params['name'])
                except sdk.exceptions.OpenStackCloudException as e:
                    error_msg = str(e)
                    if error_msg.find(neutron_msg1) > -1 and error_msg.find(
                            neutron_msg2) > -1:
                        pass
                    else:
                        module.fail_json(msg=str(e), extra_data=e.extra_data)

            project_quota_output = _get_quotas(sdk, module, cloud,
                                               cloud_params['name'])
            changes_required = True

        elif module.params['state'] == "present":
            if module.check_mode:
                module.exit_json(
                    changed=_system_state_change(module, project_quota_output))

            changes_required, quota_change_request = _system_state_change_details(
                module, project_quota_output)

            if changes_required:
                for quota_type in quota_change_request.keys():
                    quota_call = getattr(cloud, 'set_%s_quotas' % (quota_type))
                    quota_call(cloud_params['name'],
                               **quota_change_request[quota_type])

                # Get quota state post changes for validation
                project_quota_update = _get_quotas(sdk, module, cloud,
                                                   cloud_params['name'])

                if project_quota_output == project_quota_update:
                    module.fail_json(msg='Could not apply quota update')

                project_quota_output = project_quota_update

        module.exit_json(changed=changes_required,
                         openstack_quotas=project_quota_output)

    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),
        metadata=dict(required=False, default=None, type='dict'),
        availability_zone=dict(required=False, default=None),
        hosts=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['name']
    metadata = module.params['metadata']
    availability_zone = module.params['availability_zone']
    hosts = module.params['hosts']
    state = module.params['state']

    if metadata is not None:
        metadata.pop('availability_zone', None)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        aggregates = cloud.search_aggregates(name_or_id=name)

        if len(aggregates) == 1:
            aggregate = aggregates[0]
        elif len(aggregates) == 0:
            aggregate = None
        else:
            raise Exception("Should not happen")

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

        if state == 'present':
            if aggregate is None:
                aggregate = cloud.create_aggregate(name=name,
                                                   availability_zone=availability_zone)
                if hosts:
                    for h in hosts:
                        cloud.add_host_to_aggregate(aggregate.id, h)
                if metadata:
                    cloud.set_aggregate_metadata(aggregate.id, metadata)
                changed = True
            else:
                if _needs_update(module, aggregate):
                    if availability_zone is not None:
                        aggregate = cloud.update_aggregate(aggregate.id, name=name,
                                                           availability_zone=availability_zone)
                    if metadata is not None:
                        metas = metadata
                        for i in (set(aggregate.metadata.keys()) - set(metadata.keys())):
                            if i != 'availability_zone':
                                metas[i] = None
                        cloud.set_aggregate_metadata(aggregate.id, metas)
                    if hosts is not None:
                        for i in (set(aggregate.hosts) - set(hosts)):
                            cloud.remove_host_from_aggregate(aggregate.id, i)
                        for i in (set(hosts) - set(aggregate.hosts)):
                            cloud.add_host_to_aggregate(aggregate.id, i)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed)

        elif state == 'absent':
            if aggregate is None:
                changed = False
            else:
                if hosts:
                    for h in hosts:
                        cloud.remove_host_from_aggregate(aggregate.id, h)
                cloud.delete_aggregate(aggregate.id)
                changed = True
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 23
0
def main():
    argument_spec = openstack_full_argument_spec(
        network=dict(required=False),
        name=dict(required=False),
        fixed_ips=dict(type='list', default=None),
        admin_state_up=dict(type='bool', default=None),
        mac_address=dict(default=None),
        security_groups=dict(default=None, type='list'),
        no_security_groups=dict(default=False, type='bool'),
        allowed_address_pairs=dict(type='list', default=None),
        extra_dhcp_opts=dict(type='list', default=None),
        device_owner=dict(default=None),
        device_id=dict(default=None),
        state=dict(default='present', choices=['absent', 'present']),
        vnic_type=dict(default=None,
                       choices=[
                           'normal', 'direct', 'direct-physical', 'macvtap',
                           'baremetal', 'virtio-forwarder'
                       ]),
        port_security_enabled=dict(default=None, type='bool'))

    module_kwargs = openstack_module_kwargs(mutually_exclusive=[
        ['no_security_groups', 'security_groups'],
    ])

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

    if not HAS_ORDEREDDICT:
        module.fail_json(msg=missing_required_lib('ordereddict'))

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

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        if module.params['security_groups']:
            # translate security_groups to UUID's if names where provided
            module.params['security_groups'] = [
                get_security_group_id(module, cloud, v)
                for v in module.params['security_groups']
            ]

        # Neutron API accept 'binding:vnic_type' as an argument
        # for the port type.
        module.params['binding:vnic_type'] = module.params.pop('vnic_type')

        port = None
        network_id = None
        if name:
            port = cloud.get_port(name)

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

        changed = False
        if state == 'present':
            if not port:
                network = module.params['network']
                if not network:
                    module.fail_json(
                        msg="Parameter 'network' is required in Port Create")
                port_kwargs = _compose_port_args(module, cloud)
                network_object = cloud.get_network(network)

                if network_object:
                    network_id = network_object['id']
                else:
                    module.fail_json(msg="Specified network was not found.")

                port = cloud.create_port(network_id, **port_kwargs)
                changed = True
            else:
                if _needs_update(module, port, cloud):
                    port_kwargs = _compose_port_args(module, cloud)
                    port = cloud.update_port(port['id'], **port_kwargs)
                    changed = True
            module.exit_json(changed=changed, id=port['id'], port=port)

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

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 24
0
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))
Ejemplo n.º 25
0
def main():
    argument_spec = openstack_full_argument_spec(
        server=dict(required=True),
        action=dict(required=True,
                    choices=[
                        'stop', 'start', 'pause', 'unpause', 'lock', 'unlock',
                        'suspend', 'resume', 'rebuild'
                    ]),
        image=dict(required=False),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(argument_spec,
                           supports_check_mode=True,
                           required_if=[('action', 'rebuild', ['image'])],
                           **module_kwargs)

    action = module.params['action']
    wait = module.params['wait']
    timeout = module.params['timeout']
    image = module.params['image']

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        server = cloud.get_server(module.params['server'])
        if not server:
            module.fail_json(msg='Could not find server %s' % server)
        status = server.status

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

        if action == 'stop':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'os-stop': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        if action == 'start':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'os-start': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        if action == 'pause':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'pause': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        elif action == 'unpause':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'unpause': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        elif action == 'lock':
            # lock doesn't set a state, just do it
            cloud.compute.post(_action_url(server.id), json={'lock': None})
            module.exit_json(changed=True)

        elif action == 'unlock':
            # unlock doesn't set a state, just do it
            cloud.compute.post(_action_url(server.id), json={'unlock': None})
            module.exit_json(changed=True)

        elif action == 'suspend':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'suspend': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        elif action == 'resume':
            if not _system_state_change(action, status):
                module.exit_json(changed=False)

            cloud.compute.post(_action_url(server.id), json={'resume': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

        elif action == 'rebuild':
            image = cloud.get_image(image)

            if image is None:
                module.fail_json(msg="Image does not exist")

            # rebuild doesn't set a state, just do it
            cloud.compute.post(_action_url(server.id), json={'rebuild': None})
            if wait:
                _wait(timeout, cloud, server, action, module, sdk)
            module.exit_json(changed=True)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e), extra_data=e.extra_data)
Ejemplo n.º 26
0
def main():

    argument_spec = openstack_full_argument_spec(
        name=dict(required=True),
        tag=dict(required=False, default=None),
        template=dict(default=None),
        environment=dict(default=None, type='list'),
        parameters=dict(default={}, type='dict'),
        rollback=dict(default=False, type='bool'),
        timeout=dict(default=3600, type='int'),
        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']
    name = module.params['name']
    # Check for required parameters when state == 'present'
    if state == 'present':
        for p in ['template']:
            if not module.params[p]:
                module.fail_json(msg='%s required with present state' % p)

    sdk, cloud = openstack_cloud_from_module(module)
    try:
        stack = cloud.get_stack(name)

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

        if state == 'present':
            parameters = module.params['parameters']
            if module.params['tag']:
                parameters['tags'] = module.params['tag']
                from distutils.version import StrictVersion
                min_version = '0.28.0'
                if StrictVersion(sdk.version.__version__) < StrictVersion(
                        min_version) and stack:
                    module.warn("To update tags using os_stack module, the"
                                "installed version of the openstacksdk"
                                "library MUST be >={min_version}"
                                "".format(min_version=min_version))
            if not stack:
                stack = _create_stack(module, stack, cloud, sdk, parameters)
            else:
                stack = _update_stack(module, stack, cloud, sdk, parameters)
            module.exit_json(changed=True, stack=stack, id=stack.id)
        elif state == 'absent':
            if not stack:
                changed = False
            else:
                changed = True
                if not cloud.delete_stack(name, wait=module.params['wait']):
                    module.fail_json(msg='delete stack failed for stack: %s' %
                                     name)
            module.exit_json(changed=changed)
    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=to_native(e))
Ejemplo n.º 27
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)
Ejemplo n.º 28
0
def main():
    argument_spec = openstack_full_argument_spec(
        state=dict(default='present', choices=['absent', 'present']),
        name=dict(required=True),
        admin_state_up=dict(type='bool', default=True),
        enable_snat=dict(type='bool'),
        network=dict(default=None),
        interfaces=dict(type='list', default=None),
        external_fixed_ips=dict(type='list', default=None),
        project=dict(default=None))

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

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

    if module.params['external_fixed_ips'] and not network:
        module.fail_json(
            msg='network is required when supplying external_fixed_ips')

    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']
            filters = {'tenant_id': project_id}
        else:
            project_id = None
            filters = None

        router = cloud.get_router(name, filters=filters)
        net = None
        if network:
            net = cloud.get_network(network)
            if not net:
                module.fail_json(msg='network %s not found' % network)

        # Validate and cache the subnet IDs so we can avoid duplicate checks
        # and expensive API calls.
        external_ids, subnet_internal_ids, internal_portids = _validate_subnets(
            module, cloud, filters)
        if module.check_mode:
            module.exit_json(changed=_system_state_change(
                cloud, module, router, net, subnet_internal_ids,
                internal_portids, filters))

        if state == 'present':
            changed = False

            if not router:
                kwargs = _build_kwargs(cloud, module, router, net)
                if project_id:
                    kwargs['project_id'] = project_id
                router = cloud.create_router(**kwargs)
                for int_s_id in subnet_internal_ids:
                    cloud.add_router_interface(router, subnet_id=int_s_id)
                changed = True
                # add interface by port id as well
                for int_p_id in internal_portids:
                    cloud.add_router_interface(router, port_id=int_p_id)
                changed = True
            else:
                if _needs_update(cloud, module, router, net,
                                 subnet_internal_ids, internal_portids,
                                 filters):
                    kwargs = _build_kwargs(cloud, module, router, net)
                    updated_router = cloud.update_router(**kwargs)

                    # Protect against update_router() not actually
                    # updating the router.
                    if not updated_router:
                        changed = False

                    # On a router update, if any internal interfaces were supplied,
                    # just detach all existing internal interfaces and attach the new.
                    if internal_portids or subnet_internal_ids:
                        router = updated_router
                        ports = _router_internal_interfaces(cloud, router)
                        for port in ports:
                            cloud.remove_router_interface(router,
                                                          port_id=port['id'])
                    if internal_portids:
                        external_ids, subnet_internal_ids, internal_portids = _validate_subnets(
                            module, cloud, filters)
                        for int_p_id in internal_portids:
                            cloud.add_router_interface(router,
                                                       port_id=int_p_id)
                        changed = True
                    if subnet_internal_ids:
                        for s_id in subnet_internal_ids:
                            cloud.add_router_interface(router, subnet_id=s_id)
                        changed = True

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

        elif state == 'absent':
            if not router:
                module.exit_json(changed=False)
            else:
                # We need to detach all internal interfaces on a router before
                # we will be allowed to delete it.
                ports = _router_internal_interfaces(cloud, router)
                router_id = router['id']
                for port in ports:
                    cloud.remove_router_interface(router, port_id=port['id'])
                cloud.delete_router(router_id)
                module.exit_json(changed=True)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 29
0
def main():
    ipv6_mode_choices = ['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac']
    argument_spec = openstack_full_argument_spec(
        name=dict(type='str', required=True),
        network_name=dict(type='str'),
        cidr=dict(type='str'),
        ip_version=dict(type='str', default='4', choices=['4', '6']),
        enable_dhcp=dict(type='bool', default=True),
        gateway_ip=dict(type='str'),
        no_gateway_ip=dict(type='bool', default=False),
        dns_nameservers=dict(type='list', default=None),
        allocation_pool_start=dict(type='str'),
        allocation_pool_end=dict(type='str'),
        host_routes=dict(type='list', default=None),
        ipv6_ra_mode=dict(type='str', choices=ipv6_mode_choices),
        ipv6_address_mode=dict(type='str', choices=ipv6_mode_choices),
        use_default_subnetpool=dict(type='bool', default=False),
        extra_specs=dict(type='dict', default=dict()),
        state=dict(type='str',
                   default='present',
                   choices=['absent', 'present']),
        project=dict(type='str'),
    )

    module_kwargs = openstack_module_kwargs()
    module = AnsibleModule(
        argument_spec,
        supports_check_mode=True,
        required_together=[
            ['allocation_pool_end', 'allocation_pool_start'],
        ],
        **module_kwargs)

    state = module.params['state']
    network_name = module.params['network_name']
    cidr = module.params['cidr']
    ip_version = module.params['ip_version']
    enable_dhcp = module.params['enable_dhcp']
    subnet_name = module.params['name']
    gateway_ip = module.params['gateway_ip']
    no_gateway_ip = module.params['no_gateway_ip']
    dns = module.params['dns_nameservers']
    pool_start = module.params['allocation_pool_start']
    pool_end = module.params['allocation_pool_end']
    host_routes = module.params['host_routes']
    ipv6_ra_mode = module.params['ipv6_ra_mode']
    ipv6_a_mode = module.params['ipv6_address_mode']
    use_default_subnetpool = module.params['use_default_subnetpool']
    project = module.params.pop('project')
    extra_specs = module.params['extra_specs']

    # Check for required parameters when state == 'present'
    if state == 'present':
        if not module.params['network_name']:
            module.fail_json(msg='network_name required with present state')
        if (not module.params['cidr'] and not use_default_subnetpool
                and not extra_specs.get('subnetpool_id', False)):
            module.fail_json(msg='cidr or use_default_subnetpool or '
                             'subnetpool_id required with present state')

    if pool_start and pool_end:
        pool = [dict(start=pool_start, end=pool_end)]
    else:
        pool = None

    if no_gateway_ip and gateway_ip:
        module.fail_json(msg='no_gateway_ip is not allowed with gateway_ip')

    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']
            filters = {'tenant_id': project_id}
        else:
            project_id = None
            filters = None

        subnet = cloud.get_subnet(subnet_name, filters=filters)

        if module.check_mode:
            module.exit_json(
                changed=_system_state_change(module, subnet, cloud, filters))

        if state == 'present':
            if not subnet:
                kwargs = dict(cidr=cidr,
                              ip_version=ip_version,
                              enable_dhcp=enable_dhcp,
                              subnet_name=subnet_name,
                              gateway_ip=gateway_ip,
                              disable_gateway_ip=no_gateway_ip,
                              dns_nameservers=dns,
                              allocation_pools=pool,
                              host_routes=host_routes,
                              ipv6_ra_mode=ipv6_ra_mode,
                              ipv6_address_mode=ipv6_a_mode,
                              tenant_id=project_id)
                dup_args = set(kwargs.keys()) & set(extra_specs.keys())
                if dup_args:
                    raise ValueError(
                        'Duplicate key(s) {0} in extra_specs'.format(
                            list(dup_args)))
                if use_default_subnetpool:
                    kwargs['use_default_subnetpool'] = use_default_subnetpool
                kwargs = dict(kwargs, **extra_specs)
                subnet = cloud.create_subnet(network_name, **kwargs)
                changed = True
            else:
                if _needs_update(subnet, module, cloud, filters):
                    cloud.update_subnet(subnet['id'],
                                        subnet_name=subnet_name,
                                        enable_dhcp=enable_dhcp,
                                        gateway_ip=gateway_ip,
                                        disable_gateway_ip=no_gateway_ip,
                                        dns_nameservers=dns,
                                        allocation_pools=pool,
                                        host_routes=host_routes)
                    changed = True
                else:
                    changed = False
            module.exit_json(changed=changed, subnet=subnet, id=subnet['id'])

        elif state == 'absent':
            if not subnet:
                changed = False
            else:
                changed = True
                cloud.delete_subnet(subnet_name)
            module.exit_json(changed=changed)

    except sdk.exceptions.OpenStackCloudException as e:
        module.fail_json(msg=str(e))
Ejemplo n.º 30
0
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))