Пример #1
0
def delete_firewall_rule(module, client):
    """
    Removes a firewall rule

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        True if the firewall rule was removed, false otherwise
    """
    datacenter = module.params.get('datacenter')
    server = module.params.get('server')
    nic = module.params.get('nic')
    name = module.params.get('name')
    datacenter_server = ionoscloud.DataCenterApi(client)
    server_server = ionoscloud.ServerApi(client)
    nic_server = ionoscloud.NicApi(client)

    # Locate UUID for virtual datacenter
    datacenter_list = datacenter_server.datacenters_get(depth=2)
    datacenter_id = _get_resource_id(datacenter_list, datacenter, module,
                                     "Datacenter")

    # Locate UUID for server
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    server_id = _get_resource_id(server_list, server, module, "Server")

    # Locate UUID for NIC
    nic_list = nic_server.datacenters_servers_nics_get(
        datacenter_id=datacenter_id, server_id=server_id, depth=2)
    nic_id = _get_resource_id(nic_list, nic, module, "NIC")

    # Locate UUID for firewall rule
    firewall_rule_list = nic_server.datacenters_servers_nics_firewallrules_get(
        datacenter_id=datacenter_id,
        server_id=server_id,
        nic_id=nic_id,
        depth=2)
    firewall_rule_id = _get_resource(firewall_rule_list, name)
    if not firewall_rule_id:
        module.exit_json(changed=False)

    if module.check_mode:
        module.exit_json(changed=True)

    try:
        nic_server.datacenters_servers_nics_firewallrules_delete(
            datacenter_id=datacenter_id,
            server_id=server_id,
            nic_id=nic_id,
            firewallrule_id=firewall_rule_id)

        return {'changed': True, 'action': 'delete', 'id': firewall_rule_id}
    except Exception as e:
        module.fail_json(msg="failed to remove the firewall rule: %s" %
                         to_native(e))
Пример #2
0
def delete_nic(module, client):
    """
    Removes a NIC

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        True if the NIC was removed, false otherwise
    """
    datacenter = module.params.get('datacenter')
    server = module.params.get('server')
    name = module.params.get('name')
    wait = module.params.get('wait')
    wait_timeout = module.params.get('wait_timeout')

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(api_client=client)
    nic_server = ionoscloud.NicApi(api_client=client)

    # Locate UUID for Datacenter
    if not (uuid_match.match(datacenter)):
        datacenter_list = datacenter_server.datacenters_get(depth=2)
        for d in datacenter_list.items:
            dc = datacenter_server.datacenters_find_by_id(datacenter_id=d.id)
            if datacenter == dc.properties.name:
                datacenter = d.id
                break

    # Locate UUID for Server
    server_found = False
    if not (uuid_match.match(server)):
        server_list = server_server.datacenters_servers_get(datacenter,
                                                            depth=2)
        for s in server_list.items:
            if server == s.properties.name:
                server_found = True
                server = s.id
                break

        if not server_found:
            return {'action': 'delete', 'changed': False, 'id': name}

    # Locate UUID for NIC
    nic_found = False
    if not (uuid_match.match(name)):
        nic_list = nic_server.datacenters_servers_nics_get(
            datacenter_id=datacenter, server_id=server, depth=2)
        for n in nic_list.items:
            if name == n.properties.name:
                nic_found = True
                name = n.id
                break

        if not nic_found:
            module.exit_json(changed=False)

    if module.check_mode:
        module.exit_json(changed=True)
    try:
        response = nic_server.datacenters_servers_nics_delete_with_http_info(
            datacenter_id=datacenter, server_id=server, nic_id=name)
        (nic_response, _, headers) = response

        if wait:
            request_id = _get_request_id(headers['Location'])
            client.wait_for_completion(request_id=request_id,
                                       timeout=wait_timeout)

        return {'action': 'delete', 'changed': True, 'id': name}
    except Exception as e:
        module.fail_json(msg="failed to remove the NIC: %s" % to_native(e))
Пример #3
0
def update_nic(module, client):
    """
    Updates a NIC.

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        The NIC instance being updated
    """
    datacenter = module.params.get('datacenter')
    server = module.params.get('server')
    lan = module.params.get('lan')
    nat = module.params.get('nat')
    dhcp = module.params.get('dhcp')
    firewall_active = module.params.get('firewall_active')
    ips = module.params.get('ips')
    id = module.params.get('id')
    name = module.params.get('name')
    wait = module.params.get('wait')
    wait_timeout = module.params.get('wait_timeout')

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(api_client=client)
    nic_server = ionoscloud.NicApi(api_client=client)

    # Locate UUID for Datacenter
    if not (uuid_match.match(datacenter)):
        datacenter_list = datacenter_server.datacenters_get(depth=2)
        for d in datacenter_list.items:
            dc = datacenter_server.datacenters_find_by_id(datacenter_id=d.id)
            if datacenter == dc.properties.name:
                datacenter = d.id
                break

    # Locate UUID for Server
    if not (uuid_match.match(server)):
        server_list = server_server.datacenters_servers_get(datacenter,
                                                            depth=2)
        for s in server_list.items:
            if server == s.properties.name:
                server = s.id
                break

    nic = None
    # Locate NIC to update
    nic_list = nic_server.datacenters_servers_nics_get(
        datacenter_id=datacenter, server_id=server, depth=2)
    for n in nic_list.items:
        if name == n.properties.name or id == n.id:
            nic = n
            break

    if not nic:
        module.fail_json(msg="NIC could not be found.")

    if module.check_mode:
        module.exit_json(changed=True)

    try:
        if lan is None:
            lan = nic.properties.lan
        if firewall_active is None:
            firewall_active = nic.properties.firewall_active
        if nat is None:
            nat = nic.properties.nat
        if dhcp is None:
            dhcp = nic.properties.dhcp

        nic_properties = NicProperties(ips=ips,
                                       dhcp=dhcp,
                                       lan=lan,
                                       firewall_active=firewall_active,
                                       nat=nat,
                                       name=name)

        response = nic_server.datacenters_servers_nics_patch_with_http_info(
            datacenter_id=datacenter,
            server_id=server,
            nic_id=nic.id,
            nic=nic_properties)
        (nic_response, _, headers) = response

        if wait:
            request_id = _get_request_id(headers['Location'])
            client.wait_for_completion(request_id=request_id,
                                       timeout=wait_timeout)
            nic_response = nic_server.datacenters_servers_nics_find_by_id(
                datacenter_id=datacenter,
                server_id=server,
                nic_id=nic_response.id)

        return {
            'changed': True,
            'failed': False,
            'action': 'update',
            'nic': nic_response.to_dict()
        }

    except Exception as e:
        module.fail_json(msg="failed to update the NIC: %s" % to_native(e))
Пример #4
0
def create_virtual_machine(module, client):
    """
    Create new virtual machine

    module : AnsibleModule object
    client: authenticated ionos-cloud object

    Returns:
        True if a new virtual machine was created, false otherwise
    """
    datacenter = module.params.get('datacenter')
    name = module.params.get('name')
    auto_increment = module.params.get('auto_increment')
    count = module.params.get('count')
    lan = module.params.get('lan')
    wait_timeout = module.params.get('wait_timeout')
    datacenter_found = False

    virtual_machines = []

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(api_client=client)
    nic_server = ionoscloud.NicApi(api_client=client)

    # Locate UUID for datacenter if referenced by name.
    datacenter_list = datacenter_server.datacenters_get(depth=2)
    datacenter_id = _get_datacenter_id(datacenter_list, datacenter)
    if datacenter_id:
        datacenter_found = True

    if not datacenter_found:
        datacenter_response = _create_datacenter(module, client)
        datacenter_id = datacenter_response.id

    if auto_increment:
        numbers = set()
        count_offset = 1

        try:
            name % 0
        except TypeError as e:
            if (hasattr(e, 'message') and e.message.startswith('not all')
                    or to_native(e).startswith('not all')):
                name = '%s%%d' % name
            else:
                module.fail_json(msg=e, exception=traceback.format_exc())

        number_range = xrange(count_offset,
                              count_offset + count + len(numbers))

        available_numbers = list(set(number_range).difference(numbers))
        names = []
        numbers_to_use = available_numbers[:count]
        for number in numbers_to_use:
            names.append(name % number)
    else:
        names = [name]

    changed = False

    # Prefetch a list of servers for later comparison.
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=3)
    for name in names:
        # Skip server creation if the server already exists.
        server = _get_instance(server_list, name)
        if server is not None:
            virtual_machines.append(server)
            continue

        create_response = _create_machine(module, client, str(datacenter_id),
                                          name)
        changed = True

        virtual_machines.append(create_response)

    return {
        'changed': changed,
        'failed': False,
        'machines': [v.to_dict() for v in virtual_machines],
        'action': 'create'
    }
Пример #5
0
def update_firewall_rule(module, client):
    """
    Updates a firewall rule.

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        The firewall rule instance being updated
    """
    datacenter = module.params.get('datacenter')
    server = module.params.get('server')
    nic = module.params.get('nic')
    name = module.params.get('name')
    source_mac = module.params.get('source_mac')
    source_ip = module.params.get('source_ip')
    target_ip = module.params.get('target_ip')
    port_range_start = module.params.get('port_range_start')
    port_range_end = module.params.get('port_range_end')
    icmp_type = module.params.get('icmp_type')
    icmp_code = module.params.get('icmp_code')
    wait = module.params.get('wait')
    wait_timeout = module.params.get('wait_timeout')

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(api_client=client)
    nic_server = ionoscloud.NicApi(api_client=client)

    # Locate UUID for virtual datacenter
    datacenter_list = datacenter_server.datacenters_get(depth=2)
    datacenter_id = _get_resource_id(datacenter_list, datacenter, module,
                                     "Data center")

    # Locate UUID for server
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    server_id = _get_resource_id(server_list, server, module, "Server")

    # Locate UUID for NIC
    nic_list = nic_server.datacenters_servers_nics_get(
        datacenter_id=datacenter_id, server_id=server_id, depth=2)
    nic_id = _get_resource_id(nic_list, nic, module, "NIC")

    # Locate UUID for firewall rule
    fw_list = nic_server.datacenters_servers_nics_firewallrules_get(
        datacenter_id=datacenter_id,
        server_id=server_id,
        nic_id=nic_id,
        depth=2)
    fw_id = _get_resource_id(fw_list, name, module, "Firewall rule")

    if module.check_mode:
        module.exit_json(changed=True)

    try:
        firewall_rule_properties = FirewallruleProperties(
            source_mac=source_mac, source_ip=source_ip, target_ip=target_ip)

        if port_range_start or port_range_end:
            firewall_rule_properties.port_range_start = port_range_start
            firewall_rule_properties.port_range_end = port_range_end

        if icmp_type or icmp_code:
            firewall_rule_properties.icmp_code = icmp_code
            firewall_rule_properties.icmp_type = icmp_type

        response = nic_server.datacenters_servers_nics_firewallrules_patch_with_http_info(
            datacenter_id=datacenter_id,
            server_id=server_id,
            nic_id=nic_id,
            firewallrule_id=fw_id,
            firewallrule=firewall_rule_properties)

        (firewall_rule_response, _, headers) = response
        if wait:
            request_id = _get_request_id(headers['Location'])
            client.wait_for_completion(request_id=request_id,
                                       timeout=wait_timeout)

        return {
            'changed': True,
            'failed': False,
            'action': 'update',
            'firewall_rule': firewall_rule_response.to_dict()
        }

    except Exception as e:
        module.fail_json(msg="failed to update the firewall rule: %s" %
                         to_native(e))
Пример #6
0
def create_firewall_rule(module, client):
    """
    Creates a firewall rule.

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        The firewall rule instance being created
    """
    datacenter = module.params.get('datacenter')
    server = module.params.get('server')
    nic = module.params.get('nic')
    name = module.params.get('name')
    protocol = module.params.get('protocol')
    source_mac = module.params.get('source_mac')
    source_ip = module.params.get('source_ip')
    target_ip = module.params.get('target_ip')
    port_range_start = module.params.get('port_range_start')
    port_range_end = module.params.get('port_range_end')
    icmp_type = module.params.get('icmp_type')
    icmp_code = module.params.get('icmp_code')
    wait = module.params.get('wait')
    wait_timeout = module.params.get('wait_timeout')

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(api_client=client)
    nic_server = ionoscloud.NicApi(api_client=client)

    # Locate UUID for virtual datacenter
    datacenter_list = datacenter_server.datacenters_get(depth=2)
    datacenter_id = _get_resource_id(datacenter_list, datacenter, module,
                                     "Data center")

    # Locate UUID for server
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    server_id = _get_resource_id(server_list, server, module, "Server")

    # Locate UUID for NIC
    nic_list = nic_server.datacenters_servers_nics_get(
        datacenter_id=datacenter_id, server_id=server_id, depth=2)
    nic_id = _get_resource_id(nic_list, nic, module, "NIC")

    fw_list = nic_server.datacenters_servers_nics_firewallrules_get(
        datacenter_id=datacenter_id,
        server_id=server_id,
        nic_id=nic_id,
        depth=2)
    f = None
    for fw in fw_list.items:
        if name == fw.properties.name:
            f = fw
            break

    should_change = f is None

    if module.check_mode:
        module.exit_json(changed=should_change)

    if not should_change:
        return {
            'changed': should_change,
            'failed': False,
            'action': 'create',
            'firewall_rule': f.to_dict()
        }

    try:

        current_nic = nic_server.datacenters_servers_nics_find_by_id(
            datacenter_id=datacenter_id, server_id=server_id, nic_id=nic_id)
        nic = Nic(properties=NicProperties(firewall_active=True,
                                           lan=current_nic.properties.lan))
        nic_server.datacenters_servers_nics_put(datacenter_id=datacenter_id,
                                                server_id=server_id,
                                                nic_id=nic_id,
                                                nic=nic)

    except Exception as e:
        module.fail_json(msg='Unable to activate the NIC firewall.' %
                         to_native(e))

    firewall_properties = FirewallruleProperties(
        name=name,
        protocol=protocol,
        source_mac=source_mac,
        source_ip=source_ip,
        target_ip=target_ip,
        icmp_code=icmp_code,
        icmp_type=icmp_type,
        port_range_start=port_range_start,
        port_range_end=port_range_end)

    firewall_rule = FirewallRule(properties=firewall_properties)

    try:
        response = nic_server.datacenters_servers_nics_firewallrules_post_with_http_info(
            datacenter_id=datacenter_id,
            server_id=server_id,
            nic_id=nic_id,
            firewallrule=firewall_rule)
        (firewall_rule_response, _, headers) = response
        if wait:
            request_id = _get_request_id(headers['Location'])
            client.wait_for_completion(request_id=request_id,
                                       timeout=wait_timeout)

        return {
            'changed': True,
            'failed': False,
            'action': 'create',
            'firewall_rule': firewall_rule_response.to_dict()
        }

    except Exception as e:
        module.fail_json(msg="failed to create the firewall rule: %s" %
                         to_native(e))