Пример #1
0
def startstop_machine(module, client, state):
    """
    Starts or Stops a virtual machine.

    module : AnsibleModule object
    client: authenticated ionos-cloud object.

    Returns:
        True when the servers process the action successfully, false otherwise.
    """
    if not isinstance(module.params.get('instance_ids'),
                      list) or len(module.params.get('instance_ids')) < 1:
        module.fail_json(
            msg=
            'instance_ids should be a list of virtual machine ids or names, aborting'
        )

    datacenter = module.params.get('datacenter')
    instance_ids = module.params.get('instance_ids')

    datacenter_server = ionoscloud.DataCenterApi(api_client=client)
    server_server = ionoscloud.ServerApi(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 not datacenter_id:
        module.fail_json(msg='Virtual data center \'%s\' not found.' %
                         str(datacenter))

    # Prefetch server list for later comparison.
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    matched_instances = []
    for instance in instance_ids:
        # Locate UUID of server if referenced by name.
        server_id = _get_server_id(server_list, instance)
        if server_id:
            if module.check_mode:
                module.exit_json(changed=True)

            server = _get_instance(server_list, server_id)
            state = server.properties.vm_state
            changed, server = _startstop_machine(module, client, datacenter_id,
                                                 server_id, state)
            if changed:
                matched_instances.append(server)

    if len(matched_instances) == 0:
        changed = False
    else:
        changed = True

    return {
        'action': state,
        'changed': changed,
        'failed': False,
        'machines': [m.to_dict() for m in matched_instances]
    }
Пример #2
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))
Пример #3
0
    def fetch_resources(self, resource):
        instance_data = {}

        datacenter_server = ionoscloud.DataCenterApi(self.client)
        lan_server = ionoscloud.LanApi(self.client)
        location_server = ionoscloud.LocationApi(self.client)
        image_server = ionoscloud.ImageApi(self.client)
        server_server = ionoscloud.ServerApi(self.client)
        volume_server = ionoscloud.VolumeApi(self.client)

        datacenters = datacenter_server.datacenters_get(depth=3).items
        if resource == 'datacenters' or resource == 'all':
            instance_data['datacenters'] = datacenters

        if resource == 'lans' or resource == 'servers' or resource == 'all':
            lans = []
            for datacenter in datacenters:
                lans += lan_server.datacenters_lans_get(datacenter_id=datacenter.id, depth=3).items
            instance_data['lans'] = lans

        if resource == 'locations' or resource == 'all':
            instance_data['locations'] = location_server.locations_get().items

        if resource == 'images' or resource == 'all':
            instance_data['images'] = image_server.images_get().items

        if resource == 'servers' or resource == 'all' or resource == 'nics' or resource == 'fwrules':
            servers = []
            nics = []
            fwrules = []
            for datacenter in datacenters:
                servers_list = server_server.datacenters_servers_get(datacenter_id=datacenter.id, depth=5).items
                if resource == 'all' or resource == 'nics' or resource == 'fwrules':
                    for server in servers_list:
                        if len(server.entities.nics.items) > 0:
                            servers.append(server)
                            nics += server.entities.nics.items
                            if resource == 'all' or resource == 'fwrules':
                                for nic in server.entities.nics.items:
                                    fwrules += nic.entities.firewallrules.items

            if resource == 'servers' or resource == 'all':
                instance_data['servers'] = servers
            if resource == 'nics' or resource == 'all':
                instance_data['nics'] = nics
            if resource == 'fwrules' or resource == 'all':
                instance_data['firewallrules'] = fwrules

        if resource == 'volumes' or resource == 'all':
            volumes = []
            for datacenter in datacenters:
                volumes += volume_server.datacenters_volumes_get(datacenter_id=datacenter.id, depth=3).items
            instance_data['volumes'] = volumes

        return instance_data
Пример #4
0
    def get_host_info(self):
        """Generate a JSON response to a --host call"""
        host = self.args.host
        # Check if host is specified by UUID
        if re.match('[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}', host, re.I):
            for server in self.data['servers']:
                if host == server.id:
                    datacenter_id = self._parse_id_from_href(server['href'], 2)
                    return ionoscloud.ServerApi(self.client).datacenters_servers_get(datacenter_id=datacenter_id, depth=5)
        else:
            for server in self.data.servers:
                for nic in server.entities.nics.items:
                    for ip in nic.properties.ips:
                        if host == ip:
                            datacenter_id = self._parse_id_from_href(server['href'], 2)
                            server_id = self._parse_id_from_href(server['href'], 0)
                            return ionoscloud.ServerApi(self.client).datacenters_servers_get(datacenter_id=datacenter_id,
                                                                                           depth=5)

        return {}
Пример #5
0
def _remove_boot_volume(module, client, datacenter_id, server_id):
    """
    Remove the boot volume from the server
    """
    server_server = ionoscloud.ServerApi(api_client=client)
    try:
        server = server_server.datacenters_servers_find_by_id(datacenter_id,
                                                              server_id,
                                                              depth=2)
        volume = server.properties.boot_volume
        if volume:
            server_server.datacenters_servers_volumes_delete(
                datacenter_id, server_id, volume.id)
    except Exception as e:
        module.fail_json(msg="failed to remove the server's boot volume: %s" %
                         to_native(e),
                         exception=traceback.format_exc())
Пример #6
0
def _startstop_machine(module, client, datacenter_id, server_id,
                       current_state):
    state = module.params.get('state')
    server_server = ionoscloud.ServerApi(api_client=client)
    server = None
    changed = False
    try:
        if state == 'running':
            if current_state != 'RUNNING':
                response = server_server.datacenters_servers_start_post_with_http_info(
                    datacenter_id, server_id)
                (_, _, headers) = response
                request_id = _get_request_id(headers['Location'])
                client.wait_for_completion(request_id=request_id)

                server_response = server_server.datacenters_servers_find_by_id(
                    datacenter_id, server_id)
                if server_response.properties.vm_state == 'RUNNING':
                    changed = True
                    server = server_response
        else:
            if current_state != 'SHUTOFF':
                response = server_server.datacenters_servers_stop_post_with_http_info(
                    datacenter_id, server_id)
                (_, _, headers) = response
                request_id = _get_request_id(headers['Location'])
                client.wait_for_completion(request_id=request_id)

                server_response = server_server.datacenters_servers_find_by_id(
                    datacenter_id, server_id)
                if server_response.properties.vm_state == 'SHUTOFF':
                    changed = True
                    server = server_response

    except Exception as e:
        module.fail_json(
            msg="failed to start or stop the virtual machine %s at %s: %s" %
            (server_id, datacenter_id, to_native(e)))

    return changed, server
Пример #7
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))
Пример #8
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))
Пример #9
0
def create_volume(module, client):
    """
    Create volumes.

    This will create one or more volumes in a datacenter.

    module : AnsibleModule object
    client: authenticated ionoscloud object.

    Returns:
        dict of created volumes
    """
    datacenter = module.params.get('datacenter')
    name = module.params.get('name')
    auto_increment = module.params.get('auto_increment')
    count = module.params.get('count')

    volume_server = ionoscloud.VolumeApi(client)
    datacenter_server = ionoscloud.DataCenterApi(client)
    servers_server = ionoscloud.ServerApi(client)

    datacenter_found = False
    volumes = []
    instance_ids = []

    datacenter_list = datacenter_server.datacenters_get(depth=2)
    for d in datacenter_list.items:
        dc = datacenter_server.datacenters_find_by_id(d.id)
        if datacenter in [dc.properties.name, dc.id]:
            datacenter = d.id
            datacenter_found = True
            break

    if not datacenter_found:
        module.fail_json(msg='datacenter could not be found.')

    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.message, 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] * count

    changed = False

    # Prefetch a list of volumes for later comparison.
    volume_list = volume_server.datacenters_volumes_get(datacenter, depth=2)

    for name in names:
        # Skip volume creation if a volume with the same name already exists.
        if _get_instance_id(volume_list, name):
            volumes.append(_get_resource(volume_list, name))
            continue

        create_response = _create_volume(module, volume_server, str(datacenter), name, client)
        volumes.append(create_response)
        instance_ids.append(create_response.id)
        _attach_volume(module, servers_server, datacenter, create_response.id)
        changed = True

    results = {
        'changed': changed,
        'failed': False,
        'volumes': [v.to_dict() for v in volumes],
        'action': 'create',
        'instance_ids': instance_ids
    }

    return results
Пример #10
0
def remove_virtual_machine(module, client):
    """
    Removes a virtual machine.

    This will remove the virtual machine along with the bootVolume.

    module : AnsibleModule object
    client: authenticated ionos-cloud object.

    Not yet supported: handle deletion of attached data disks.

    Returns:
        True if a new virtual server was deleted, false otherwise
    """
    datacenter = module.params.get('datacenter')
    instance_ids = module.params.get('instance_ids')
    remove_boot_volume = module.params.get('remove_boot_volume')
    changed = False

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

    server_id = None

    if not isinstance(module.params.get('instance_ids'),
                      list) or len(module.params.get('instance_ids')) < 1:
        module.fail_json(
            msg=
            'instance_ids should be a list of virtual machine ids or names, aborting'
        )

    # 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 not datacenter_id:
        module.fail_json(msg='Virtual data center \'%s\' not found.' %
                         str(datacenter))

    # Prefetch server list for later comparison.
    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    for instance in instance_ids:
        # Locate UUID for server if referenced by name.
        server_id = _get_server_id(server_list, instance)
        if server_id:
            if module.check_mode:
                module.exit_json(changed=True)

            # Remove the server's boot volume
            if remove_boot_volume:
                _remove_boot_volume(module, client, datacenter_id, server_id)

            # Remove the server
            try:
                server_server.datacenters_servers_delete(
                    datacenter_id, server_id)
            except Exception as e:
                module.fail_json(
                    msg="failed to terminate the virtual server: %s" %
                    to_native(e),
                    exception=traceback.format_exc())
            else:
                changed = True

    return {'action': 'delete', 'changed': changed, 'id': server_id}
Пример #11
0
def update_server(module, client):
    """
    Update servers.

    This will update one or more servers.

    module : AnsibleModule object
    client: authenticated ionos-cloud object.

    Returns:
        dict of updated servers
    """
    datacenter = module.params.get('datacenter')
    instance_ids = module.params.get('instance_ids')

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

    if not isinstance(module.params.get('instance_ids'),
                      list) or len(module.params.get('instance_ids')) < 1:
        module.fail_json(
            msg=
            'instance_ids should be a list of virtual machine ids or names, aborting'
        )

    # 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 not datacenter_id:
        module.fail_json(msg='Virtual data center \'%s\' not found.' %
                         str(datacenter))

    updated_servers = []

    cores = module.params.get('cores')
    ram = module.params.get('ram')
    cpu_family = module.params.get('cpu_family')
    availability_zone = module.params.get('availability_zone')

    server_list = server_server.datacenters_servers_get(
        datacenter_id=datacenter_id, depth=2)
    for instance in instance_ids:
        server = None
        for s in server_list.items:
            if instance in (s.properties.name, s.id):
                server = s
                break

        if not server:
            module.fail_json(msg='Server \'%s\' not found.' % str(instance))

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

        try:
            server_properties = ServerProperties(
                cores=cores,
                ram=ram,
                availability_zone=availability_zone,
                cpu_family=cpu_family)
            new_server = Server(properties=server_properties)

            server_response = server_server.datacenters_servers_put(
                datacenter_id=datacenter_id,
                server_id=server.id,
                server=new_server)

        except Exception as e:
            module.fail_json(msg="failed to update the server: %s" %
                             to_native(e),
                             exception=traceback.format_exc())
        else:
            updated_servers.append(server_response)

    return {
        'failed': False,
        'changed': True,
        'machines': [s.to_dict() for s in updated_servers],
        'action': 'update'
    }
Пример #12
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'
    }
Пример #13
0
def _create_machine(module, client, datacenter, name):
    cores = module.params.get('cores')
    ram = module.params.get('ram')
    cpu_family = module.params.get('cpu_family')
    volume_size = module.params.get('volume_size')
    disk_type = module.params.get('disk_type')
    availability_zone = module.params.get('availability_zone')
    volume_availability_zone = module.params.get('volume_availability_zone')
    image_password = module.params.get('image_password')
    ssh_keys = module.params.get('ssh_keys')
    bus = module.params.get('bus')
    lan = module.params.get('lan')
    nat = module.params.get('nat')
    image = module.params.get('image')
    assign_public_ip = module.boolean(module.params.get('assign_public_ip'))
    nic_ips = module.params.get('nic_ips')
    wait = module.params.get('wait')
    wait_timeout = module.params.get('wait_timeout')

    server_server = ionoscloud.ServerApi(api_client=client)
    lan_server = ionoscloud.LanApi(api_client=client)

    nics = []

    if assign_public_ip:
        lans_list = lan_server.datacenters_lans_get(datacenter_id=datacenter,
                                                    depth=2).items
        public_lan = _get_lan_by_id_or_properties(lans_list, public=True)

        public_ip_lan_id = public_lan.id if public_lan is not None else None

        if public_ip_lan_id is None:
            lan_properties = LanPropertiesPost(name='public', public=True)
            lan_post = LanPost(properties=lan_properties)

            response = lan_server.datacenters_lans_post_with_http_info(
                datacenter_id=datacenter, lan=lan_post)
            (lan_response, _, headers) = response
            request_id = _get_request_id(headers['Location'])
            client.wait_for_completion(request_id=request_id,
                                       timeout=wait_timeout)

            public_ip_lan_id = lan_response.id

        nic = Nic(
            properties=NicProperties(name=str(uuid4()).replace('-', '')[:10],
                                     nat=nat,
                                     lan=int(public_ip_lan_id)))
        if nic_ips:
            nic.properties.ips = nic_ips
        nics.append(nic)

    if lan is not None:
        lans_list = lan_server.datacenters_lans_get(datacenter_id=datacenter,
                                                    depth=2).items
        matching_lan = _get_lan_by_id_or_properties(lans_list, lan, name=lan)

        if (not any(n.properties.lan == int(matching_lan.id)
                    for n in nics)) or len(nics) < 1:
            nic = Nic(properties=NicProperties(name=str(uuid4()).replace(
                '-', '')[:10],
                                               nat=nat,
                                               lan=int(int(matching_lan.id))))
            if nic_ips:
                nic.properties.ips = nic_ips
            nics.append(nic)

    volume_properties = VolumeProperties(
        name=str(uuid4()).replace('-', '')[:10],
        type=disk_type,
        size=volume_size,
        availability_zone=volume_availability_zone,
        image_password=image_password,
        ssh_keys=ssh_keys,
        bus=bus)

    if image:
        if uuid_match.match(image):
            volume_properties.image = image
        else:
            volume_properties.image_alias = image

    volume = Volume(properties=volume_properties)

    server_properties = ServerProperties(name=name,
                                         cores=cores,
                                         ram=ram,
                                         availability_zone=availability_zone,
                                         cpu_family=cpu_family)

    server_entities = ServerEntities(volumes=Volumes(items=[volume]),
                                     nics=Nics(items=nics))

    server = Server(properties=server_properties, entities=server_entities)

    try:
        response = server_server.datacenters_servers_post_with_http_info(
            datacenter_id=datacenter, server=server)
        (server_response, _, headers) = response
        request_id = _get_request_id(headers['Location'])
        client.wait_for_completion(request_id=request_id, timeout=wait_timeout)

        client.wait_for(
            fn_request=lambda: server_server.datacenters_servers_find_by_id(
                datacenter_id=datacenter,
                server_id=server_response.id,
                depth=2),
            fn_check=lambda r: (r.entities.volumes is not None) and
            (r.entities.volumes.items is not None) and
            (len(r.entities.volumes.items) > 0) and
            (r.entities.nics is not None) and
            (r.entities.nics.items is not None) and
            (len(r.entities.nics.items) == len(nics)),
            scaleup=10000)

        server = server_server.datacenters_servers_find_by_id(
            datacenter_id=datacenter, server_id=server_response.id, depth=2)

    except Exception as e:
        module.fail_json(msg="failed to create the new server: %s" %
                         to_native(e))
    else:
        if len(server.entities.nics.items) > 0:
            server.nic = server.entities.nics.items[0]
    return server
Пример #14
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))
Пример #15
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))