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))
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))
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))
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' }
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))
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))