def core(module): domain_name = module.params.get('domain_name', None) rest = DigitalOceanHelper(module) domain_results = [] if domain_name is not None: response = rest.get("domains/%s" % domain_name) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve domain for DigitalOcean") resp_json = response.json domains = [resp_json['domain']] else: domains = rest.get_paginated_data(base_url="domains?", data_key_name='domains') for temp_domain in domains: temp_domain_dict = { "name": temp_domain['name'], "ttl": temp_domain['ttl'], "zone_file": temp_domain['zone_file'], "domain_records": list(), } base_url = "domains/%s/records?" % temp_domain['name'] temp_domain_dict["domain_records"] = rest.get_paginated_data( base_url=base_url, data_key_name='domain_records') domain_results.append(temp_domain_dict) module.exit_json(changed=False, data=domain_results)
def core(module): api_token = module.params['oauth_token'] state = module.params['state'] ip = module.params['ip'] droplet_id = module.params['droplet_id'] rest = DigitalOceanHelper(module) if state in ('present'): if droplet_id is not None and module.params['ip'] is not None: # Lets try to associate the ip to the specified droplet associate_floating_ips(module, rest) else: create_floating_ips(module, rest) elif state in ('absent'): response = rest.delete("floating_ips/{0}".format(ip)) status_code = response.status_code json_data = response.json if status_code == 204: module.exit_json(changed=True) elif status_code == 404: module.exit_json(changed=False) else: module.exit_json(changed=False, data=json_data)
def __init__(self, module): self.ops = [] if module._verbosity >= 1: self.ops.append('{0} module start'.format(time.time())) self.module = module self._id = self.module.params['id'] self._name = self.module.params['name'] self._droplet = None # == _id if found by _id, _name otherwise. For diagnostic messages. self.rest = DigitalOceanHelper(module) # pop all the parameters which we never POST as data self.rebuild = self.module.params.pop('rebuild') self.wait = self.module.params.pop('wait') self.wait_timeout = self.module.params.pop('wait_timeout') self.wait_step = self.module.params.pop('wait_step') self.wait_build = self.module.params.pop('wait_build') self.module.params.pop('timeout') self.module.params.pop('validate_certs') self.module.params.pop('oauth_token') if self.module.params.pop('unique_name', None) is not None: self.module.warn( "Parameter `unique_name` is deprecated. Consider it always True." ) if self._id and self._name: self.module.warn( "Both id {0} and name {1} supplied. Your play may turn unexpectedly!" .format(self._id, self._name))
def core(module): rest = DigitalOceanHelper(module) base_url = 'regions?' regions = rest.get_paginated_data(base_url=base_url, data_key_name='regions') module.exit_json(changed=False, data=regions)
def core(module): snapshot_type = module.params['snapshot_type'] rest = DigitalOceanHelper(module) base_url = 'snapshots?' snapshot = [] if snapshot_type == 'by_id': base_url += "/{0}".format(module.params.get('snapshot_id')) response = rest.get(base_url) status_code = response.status_code if status_code != 200: module.fail_json( msg="Failed to fetch snapshot information due to error : %s" % response.json['message']) snapshot.extend(response.json["snapshot"]) else: if snapshot_type == 'droplet': base_url += "resource_type=droplet&" elif snapshot_type == 'volume': base_url += "resource_type=volume&" snapshot = rest.get_paginated_data(base_url=base_url, data_key_name='snapshots') module.exit_json(changed=False, data=snapshot)
def core(module): domain_name = module.params.get('domain_name', None) rest = DigitalOceanHelper(module) domain_results = [] if domain_name is not None: response = rest.get("domains/%s" % domain_name) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve domain for DigitalOcean") resp_json = response.json domains = [resp_json['domain']] else: domains = rest.get_paginated_data(base_url="domains?", data_key_name='domains') for temp_domain in domains: temp_domain_dict = { "name": temp_domain['name'], "ttl": temp_domain['ttl'], "zone_file": temp_domain['zone_file'], "domain_records": list(), } base_url = "domains/%s/records?" % temp_domain['name'] temp_domain_dict["domain_records"] = rest.get_paginated_data(base_url=base_url, data_key_name='domain_records') domain_results.append(temp_domain_dict) module.exit_json(changed=False, data=domain_results)
def __init__(self, module): self.rest = DigitalOceanHelper(module) self.module = module self.wait = self.module.params.pop('wait', True) self.wait_timeout = self.module.params.pop('wait_timeout', 120) self.unique_name = self.module.params.pop('unique_name', False) # pop the oauth token so we don't include it in the POST data self.module.params.pop('oauth_token')
def core(module): rest = DigitalOceanHelper(module) response = rest.get("account") if response.status_code != 200: module.fail_json(msg="Failed to fetch 'account' facts due to error : %s" % response.json['message']) module.exit_json(changed=False, data=response.json["account"])
def core(module): state = module.params['state'] name = module.params['name'] rest = DigitalOceanHelper(module) results = dict(changed=False) response = rest.get('certificates') status_code = response.status_code resp_json = response.json if status_code != 200: module.fail_json(msg="Failed to retrieve certificates for DigitalOcean") if state == 'present': for cert in resp_json['certificates']: if cert['name'] == name: module.fail_json(msg="Certificate name %s already exists" % name) # Certificate does not exist, let us create it cert_data = dict(name=name, private_key=module.params['private_key'], leaf_certificate=module.params['leaf_certificate']) if module.params['certificate_chain'] is not None: cert_data.update(certificate_chain=module.params['certificate_chain']) response = rest.post("certificates", data=cert_data) status_code = response.status_code if status_code == 500: module.fail_json(msg="Failed to upload certificates as the certificates are malformed.") resp_json = response.json if status_code == 201: results.update(changed=True, response=resp_json) elif status_code == 422: results.update(changed=False, response=resp_json) elif state == 'absent': cert_id_del = None for cert in resp_json['certificates']: if cert['name'] == name: cert_id_del = cert['id'] if cert_id_del is not None: url = "certificates/{0}".format(cert_id_del) response = rest.delete(url) if response.status_code == 204: results.update(changed=True) else: results.update(changed=False) else: module.fail_json(msg="Failed to find certificate %s" % name) module.exit_json(**results)
def core(module): rest = DigitalOceanHelper(module) response = rest.get('sizes') if response.status_code != 200: module.fail_json( msg="Failed to fetch 'sizes' facts due to error : %s" % response.json['message']) module.exit_json(changed=False, data=response.json['sizes'])
def core(module): rest = DigitalOceanHelper(module) response = rest.get("account") if response.status_code != 200: module.fail_json( msg="Failed to fetch 'account' information due to error : %s" % response.json['message']) module.exit_json(changed=False, data=response.json["account"])
def core(module): rest = DigitalOceanHelper(module) response = rest.get("account/keys") status_code = response.status_code json = response.json if status_code == 200: module.exit_json(changed=False, ansible_facts=json) else: module.fail_json(msg='Error fetching facts [{0}: {1}]'.format( status_code, response.json['message']))
def core(module): rest = DigitalOceanHelper(module) response = rest.get("account/keys") status_code = response.status_code json = response.json if status_code == 200: module.exit_json(changed=False, ansible_facts=json) else: module.fail_json(msg='Error fecthing facts [{0}: {1}]'.format( status_code, response.json['message']))
def core(module): rest = DigitalOceanHelper(module) response = rest.get("account/keys") status_code = response.status_code json = response.json if status_code == 200: module.exit_json(changed=False, data=json['ssh_keys']) else: module.fail_json( msg='Error fetching SSH Key information [{0}: {1}]'.format( status_code, response.json['message']))
def core(module): region_name = module.params.get('region_name', None) rest = DigitalOceanHelper(module) base_url = 'volumes?' if region_name is not None: base_url += "region=%s&" % region_name volumes = rest.get_paginated_data(base_url=base_url, data_key_name='volumes') module.exit_json(changed=False, data=volumes)
def core(module): image_type = module.params['image_type'] rest = DigitalOceanHelper(module) base_url = 'images?' if image_type == 'distribution': base_url += "type=distribution&" elif image_type == 'application': base_url += "type=application&" elif image_type == 'private': base_url += "private=true&" images = rest.get_paginated_data(base_url=base_url, data_key_name='images') module.exit_json(changed=False, data=images)
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( state=dict(choices=['present', 'absent'], default='present'), name=dict(type='str'), size=dict(aliases=['size_id']), image=dict(aliases=['image_id']), rebuild=dict(type='bool', default=False), region=dict(aliases=['region_id']), ssh_keys=dict(type='list'), private_networking=dict(type='bool', default=False), backups=dict(type='bool', default=False), monitoring=dict(type='bool', default=False), id=dict(aliases=['droplet_id'], type='int'), user_data=dict(default=None), ipv6=dict(type='bool', default=False), volumes=dict(type='list'), tags=dict(type='list'), wait=dict(type='bool', default=True), wait_timeout=dict(default=120, type='int'), wait_step=dict(default=2.0, type='float'), wait_build=dict(default=30, type='int'), unique_name=dict(), ) module = AnsibleModule( argument_spec=argument_spec, required_one_of=(['id', 'name'], ), supports_check_mode=True, ) state = module.params.pop('state') droplet = DODroplet(module) if state == 'present': droplet.get() elif state == 'absent': droplet.delete()
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): module = AnsibleModule( argument_spec=DigitalOceanHelper.digital_ocean_argument_spec(), supports_check_mode=False, ) core(module)
def main(): module = AnsibleModule( argument_spec=DigitalOceanHelper.digital_ocean_argument_spec(), supports_check_mode=True, ) core(module)
def core(module): certificate_id = module.params.get('certificate_id', None) rest = DigitalOceanHelper(module) base_url = 'certificates?' if certificate_id is not None: response = rest.get("%s/%s" % (base_url, certificate_id)) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve certificates for DigitalOcean") resp_json = response.json certificate = resp_json['certificate'] else: certificate = rest.get_paginated_data(base_url=base_url, data_key_name='certificates') module.exit_json(changed=False, data=certificate)
def core(module): load_balancer_id = module.params.get('load_balancer_id', None) rest = DigitalOceanHelper(module) base_url = 'load_balancers?' if load_balancer_id is not None: response = rest.get("%s/%s" % (base_url, load_balancer_id)) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve load balancers for DigitalOcean") resp_json = response.json load_balancer = resp_json['load_balancer'] else: load_balancer = rest.get_paginated_data(base_url=base_url, data_key_name='load_balancers') module.exit_json(changed=False, data=load_balancer)
def core(module): tag_name = module.params.get('tag_name', None) rest = DigitalOceanHelper(module) base_url = 'tags?' if tag_name is not None: response = rest.get("%s/%s" % (base_url, tag_name)) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve tags for DigitalOcean") resp_json = response.json tag = resp_json['tag'] else: tag = rest.get_paginated_data(base_url=base_url, data_key_name='tags') module.exit_json(changed=False, data=tag)
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(tag_name=dict(type='str', required=False), ) module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def core(module): firewall_name = module.params.get('name', None) rest = DigitalOceanHelper(module) base_url = 'firewalls?' response = rest.get("%s" % base_url) status_code = response.status_code if status_code != 200: module.fail_json(msg="Failed to retrieve firewalls from Digital Ocean") firewalls = rest.get_paginated_data(base_url=base_url, data_key_name='firewalls') if firewall_name is not None: rule = {} for firewall in firewalls: if firewall['name'] == firewall_name: rule.update(firewall) module.exit_json(changed=False, data=rule) else: module.exit_json(changed=False, data=firewalls)
def main(): module = AnsibleModule( argument_spec=DigitalOceanHelper.digital_ocean_argument_spec(), supports_check_mode=False, ) module.deprecate( "The 'digital_ocean_sshkey_facts' module has been deprecated, use the new 'digital_ocean_sshkey_info' module", version='2.13') core(module)
def core(module): certificate_id = module.params.get('certificate_id', None) rest = DigitalOceanHelper(module) base_url = 'certificates?' if certificate_id is not None: response = rest.get("%s/%s" % (base_url, certificate_id)) status_code = response.status_code if status_code != 200: module.fail_json( msg="Failed to retrieve certificates for DigitalOcean") resp_json = response.json certificate = resp_json['certificate'] else: certificate = rest.get_paginated_data(base_url=base_url, data_key_name='certificates') module.exit_json(changed=False, data=certificate)
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() module = AnsibleModule(argument_spec=argument_spec) if module._name == 'digital_ocean_account_facts': module.deprecate( "The 'digital_ocean_account_facts' module has been renamed to 'digital_ocean_account_info'", version='2.13') try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( domain_name=dict(type='str', required=False), ) module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def core(module): rest = DigitalOceanHelper(module) page = 1 has_next = True floating_ips = [] while has_next or 200 != status_code: response = rest.get("floating_ips?page={0}&per_page=20".format(page)) status_code = response.status_code # stop if any error during pagination if 200 != status_code: break page = page + 1 floating_ips.extend(response.json["floating_ips"]) has_next = "pages" in response.json[ "links"] and "next" in response.json["links"]["pages"] if status_code == 200: module.exit_json(changed=False, floating_ips=floating_ips) else: module.fail_json(msg="Error fecthing facts [{0}: {1}]".format( status_code, response.json["message"]))
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(load_balancer_id=dict(type='str', required=False), ) module = AnsibleModule(argument_spec=argument_spec) if module._name == 'digital_ocean_load_balancer_facts': module.deprecate( "The 'digital_ocean_load_balancer_facts' module has been renamed to 'digital_ocean_load_balancer_info'", version='2.13') try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(image_type=dict( type='str', required=False, choices=['all', 'application', 'distribution', 'private'], default='all')) module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( name=dict(type='str', required=True), resource_id=dict(aliases=['droplet_id'], type='str'), resource_type=dict(choices=['droplet'], default='droplet'), state=dict(choices=['present', 'absent'], default='present'), ) module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( image_type=dict(type='str', required=False, choices=['all', 'application', 'distribution', 'private'], default='all' ) ) module = AnsibleModule(argument_spec=argument_spec) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(state=dict(choices=['present', 'absent'], default='present'), name=dict(type='str'), id=dict(aliases=['droplet_id'], type='int'), ip=dict(type='str')) module = AnsibleModule( argument_spec=argument_spec, required_one_of=(['id', 'name'], ), ) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=traceback.format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(image_type=dict( type='str', required=False, choices=['all', 'application', 'distribution', 'private'], default='all')) module = AnsibleModule(argument_spec=argument_spec) if module._name == 'digital_ocean_image_facts': module.deprecate( "The 'digital_ocean_image_facts' module has been renamed to 'digital_ocean_image_info'", version='2.13') try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( snapshot_type=dict(type='str', required=False, choices=['all', 'droplet', 'volume', 'by_id'], default='all'), snapshot_id=dict(type='str', required=False), ) module = AnsibleModule( argument_spec=argument_spec, required_if=[ ['snapshot_type', 'by_id', ['snapshot_id']], ], ) try: core(module) except Exception as e: module.fail_json(msg=to_native(e), exception=format_exc())
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update(name=dict(type='str'), leaf_certificate=dict(type='str'), private_key=dict(type='str', no_log=True), state=dict(choices=['present', 'absent'], default='present'), certificate_chain=dict(type='str')) module = AnsibleModule( argument_spec=argument_spec, required_if=[('state', 'present', ['name', 'leaf_certificate', 'private_key']), ('state', 'absent', ['name'])], ) try: core(module) except Exception as e: module.fail_json(msg=to_native(e))
def main(): argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( name=dict(type='str'), leaf_certificate=dict(type='str'), private_key=dict(type='str', no_log=True), state=dict(choices=['present', 'absent'], default='present'), certificate_chain=dict(type='str') ) module = AnsibleModule( argument_spec=argument_spec, required_if=[('state', 'present', ['name', 'leaf_certificate', 'private_key']), ('state', 'absent', ['name']) ], ) try: core(module) except Exception as e: module.fail_json(msg=to_native(e))
def __init__(self, module): self.module = module self.rest = DigitalOceanHelper(module)
class DOBlockStorage(object): def __init__(self, module): self.module = module self.rest = DigitalOceanHelper(module) def get_key_or_fail(self, k): v = self.module.params[k] if v is None: self.module.fail_json(msg='Unable to load %s' % k) return v def poll_action_for_complete_status(self, action_id): url = 'actions/{}'.format(action_id) end_time = time.time() + self.module.params['timeout'] while time.time() < end_time: time.sleep(2) response = self.rest.get(url) status = response.status_code json = response.json if status == 200: if json['action']['status'] == 'completed': return True elif json['action']['status'] == 'errored': raise DOBlockStorageException(json['message']) raise DOBlockStorageException('Unable to reach api.digitalocean.com') def get_attached_droplet_ID(self, volume_name, region): url = 'volumes?name={}®ion={}'.format(volume_name, region) response = self.rest.get(url) status = response.status_code json = response.json if status == 200: volumes = json['volumes'] if len(volumes) > 0: droplet_ids = volumes[0]['droplet_ids'] if len(droplet_ids) > 0: return droplet_ids[0] return None else: raise DOBlockStorageException(json['message']) def attach_detach_block_storage(self, method, volume_name, region, droplet_id): data = { 'type': method, 'volume_name': volume_name, 'region': region, 'droplet_id': droplet_id } response = self.rest.post('volumes/actions', data=data) status = response.status_code json = response.json if status == 202: return self.poll_action_for_complete_status(json['action']['id']) elif status == 200: return True elif status == 422: return False else: raise DOBlockStorageException(json['message']) def create_block_storage(self): block_size = self.get_key_or_fail('block_size') volume_name = self.get_key_or_fail('volume_name') region = self.get_key_or_fail('region') description = self.module.params['description'] data = { 'size_gigabytes': block_size, 'name': volume_name, 'description': description, 'region': region } response = self.rest.post("volumes", data=data) status = response.status_code json = response.json if status == 201: self.module.exit_json(changed=True, id=json['volume']['id']) elif status == 409 and json['id'] == 'already_exists': self.module.exit_json(changed=False) else: raise DOBlockStorageException(json['message']) def delete_block_storage(self): volume_name = self.get_key_or_fail('volume_name') region = self.get_key_or_fail('region') url = 'volumes?name={}®ion={}'.format(volume_name, region) attached_droplet_id = self.get_attached_droplet_ID(volume_name, region) if attached_droplet_id is not None: self.attach_detach_block_storage('detach', volume_name, region, attached_droplet_id) response = self.rest.delete(url) status = response.status_code json = response.json if status == 204: self.module.exit_json(changed=True) elif status == 404: self.module.exit_json(changed=False) else: raise DOBlockStorageException(json['message']) def attach_block_storage(self): volume_name = self.get_key_or_fail('volume_name') region = self.get_key_or_fail('region') droplet_id = self.get_key_or_fail('droplet_id') attached_droplet_id = self.get_attached_droplet_ID(volume_name, region) if attached_droplet_id is not None: if attached_droplet_id == droplet_id: self.module.exit_json(changed=False) else: self.attach_detach_block_storage('detach', volume_name, region, attached_droplet_id) changed_status = self.attach_detach_block_storage('attach', volume_name, region, droplet_id) self.module.exit_json(changed=changed_status) def detach_block_storage(self): volume_name = self.get_key_or_fail('volume_name') region = self.get_key_or_fail('region') droplet_id = self.get_key_or_fail('droplet_id') changed_status = self.attach_detach_block_storage('detach', volume_name, region, droplet_id) self.module.exit_json(changed=changed_status)
def core(module): state = module.params['state'] name = module.params['name'] resource_id = module.params['resource_id'] resource_type = module.params['resource_type'] rest = DigitalOceanHelper(module) # Check if api_token is valid or not response = rest.get('account') if response.status_code == 401: module.fail_json(msg='Failed to login using api_token, please verify ' 'validity of api_token') if state == 'present': response = rest.get('tags/{0}'.format(name)) status_code = response.status_code resp_json = response.json changed = False if status_code == 200 and resp_json['tag']['name'] == name: changed = False else: # Ensure Tag exists response = rest.post("tags", data={'name': name}) status_code = response.status_code resp_json = response.json if status_code == 201: changed = True elif status_code == 422: changed = False else: module.exit_json(changed=False, data=resp_json) if resource_id is None: # No resource defined, we're done. module.exit_json(changed=changed, data=resp_json) else: # Check if resource is already tagged or not found = False url = "{0}?tag_name={1}".format(resource_type, name) if resource_type == 'droplet': url = "droplets?tag_name={0}".format(name) response = rest.get(url) status_code = response.status_code resp_json = response.json if status_code == 200: for resource in resp_json['droplets']: if not found and resource['id'] == int(resource_id): found = True break if not found: # If resource is not tagged, tag a resource url = "tags/{0}/resources".format(name) payload = { 'resources': [{ 'resource_id': resource_id, 'resource_type': resource_type}]} response = rest.post(url, data=payload) if response.status_code == 204: module.exit_json(changed=True) else: module.fail_json(msg="error tagging resource '{0}': {1}".format(resource_id, response.json["message"])) else: # Already tagged resource module.exit_json(changed=False) else: # Unable to find resource specified by user module.fail_json(msg=resp_json['message']) elif state == 'absent': if resource_id: url = "tags/{0}/resources".format(name) payload = { 'resources': [{ 'resource_id': resource_id, 'resource_type': resource_type}]} response = rest.delete(url, data=payload) else: url = "tags/{0}".format(name) response = rest.delete(url) if response.status_code == 204: module.exit_json(changed=True) else: module.exit_json(changed=False, data=response.json)