diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-18 05:52:35 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-18 05:52:35 +0000 |
commit | 7fec0b69a082aaeec72fee0612766aa42f6b1b4d (patch) | |
tree | efb569b86ca4da888717f5433e757145fa322e08 /ansible_collections/community/digitalocean/plugins | |
parent | Releasing progress-linux version 7.7.0+dfsg-3~progress7.99u1. (diff) | |
download | ansible-7fec0b69a082aaeec72fee0612766aa42f6b1b4d.tar.xz ansible-7fec0b69a082aaeec72fee0612766aa42f6b1b4d.zip |
Merging upstream version 9.4.0+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/community/digitalocean/plugins')
30 files changed, 294 insertions, 124 deletions
diff --git a/ansible_collections/community/digitalocean/plugins/doc_fragments/digital_ocean.py b/ansible_collections/community/digitalocean/plugins/doc_fragments/digital_ocean.py index bc65ad386..7f9e067ad 100644 --- a/ansible_collections/community/digitalocean/plugins/doc_fragments/digital_ocean.py +++ b/ansible_collections/community/digitalocean/plugins/doc_fragments/digital_ocean.py @@ -22,7 +22,7 @@ options: description: - DigitalOcean OAuth token. - "There are several other environment variables which can be used to provide this value." - - "i.e., - 'DO_API_TOKEN', 'DO_API_KEY', 'DO_OAUTH_TOKEN' and 'OAUTH_TOKEN'" + - "i.e., - C(DO_API_TOKEN), C(DO_API_KEY), C(DO_OAUTH_TOKEN) and C(OAUTH_TOKEN)." type: str aliases: [ api_token ] timeout: @@ -35,5 +35,5 @@ options: - If set to C(no), the SSL certificates will not be validated. - This should only set to C(no) used on personally controlled sites using self-signed certificates. type: bool - default: yes + default: true """ diff --git a/ansible_collections/community/digitalocean/plugins/inventory/digitalocean.py b/ansible_collections/community/digitalocean/plugins/inventory/digitalocean.py index 6aafb5f45..b886fc114 100644 --- a/ansible_collections/community/digitalocean/plugins/inventory/digitalocean.py +++ b/ansible_collections/community/digitalocean/plugins/inventory/digitalocean.py @@ -30,15 +30,6 @@ options: this should always be C(community.digitalocean.digitalocean). required: true choices: ['community.digitalocean.digitalocean'] - api_token: - description: - - DigitalOcean OAuth token. - - Template expressions can be used in this field. - required: true - type: str - aliases: [ oauth_token ] - env: - - name: DO_API_TOKEN attributes: description: >- Droplet attributes to add as host vars to each inventory host. @@ -78,7 +69,7 @@ options: EXAMPLES = r""" # Using keyed groups and compose for hostvars plugin: community.digitalocean.digitalocean -api_token: '{{ lookup("pipe", "./get-do-token.sh" }}' +oauth_token: '{{ lookup("pipe", "./get-do-token.sh" }}' attributes: - id - name @@ -108,7 +99,6 @@ filters: - 'do_region.slug == "fra1"' """ -import re import json from ansible.errors import AnsibleError, AnsibleParserError from ansible.inventory.group import to_safe_group_name @@ -119,7 +109,6 @@ from ansible.plugins.inventory import BaseInventoryPlugin, Constructable, Cachea class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): - NAME = "community.digitalocean.digitalocean" # Constructable methods use the following function to construct group names. By @@ -160,7 +149,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): def _get_payload(self): # request parameters - api_token = self._template_option("api_token") + api_token = self._template_option("oauth_token") headers = { "Content-Type": "application/json", "Authorization": "Bearer {0}".format(api_token), @@ -195,7 +184,6 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): strict = self.get_option("strict") host_filters = self.get_option("filters") for record in records: - host_name = record.get("name") if not host_name: continue diff --git a/ansible_collections/community/digitalocean/plugins/module_utils/digital_ocean.py b/ansible_collections/community/digitalocean/plugins/module_utils/digital_ocean.py index 44ca3ccd1..f7bb42042 100644 --- a/ansible_collections/community/digitalocean/plugins/module_utils/digital_ocean.py +++ b/ansible_collections/community/digitalocean/plugins/module_utils/digital_ocean.py @@ -12,10 +12,9 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type import json -import os -from ansible.module_utils.urls import fetch_url from ansible.module_utils._text import to_text from ansible.module_utils.basic import env_fallback +from ansible.module_utils.urls import fetch_url class Response(object): @@ -224,6 +223,42 @@ class DigitalOceanProjects: return "Unexpected error; more than one project with the same name", {} return "", project[0] + def get_resources_by_id(self, id): + """Fetches the project resources with the given id. + + Returns: + error_message -- project fetch error message (or "" if no error) + resources -- resources dictionary representation (or {} if error) + """ + resources = self.rest.get_paginated_data( + base_url="projects/{0}/resources?".format(id), data_key_name="resources" + ) + return "", dict(resources=resources) + + def get_resources_by_name(self, name): + """Fetches the project resources with the given name. + + Returns: + error_message -- project fetch error message (or "" if no error) + resources -- resources dictionary representation (or {} if error) + """ + err_msg, project = self.get_by_name(name) + if err_msg: + return err_msg, {} + return self.get_resources_by_id(project.get("id")) + + def get_resources_of_default(self): + """Fetches default project resources. + + Returns: + error_message -- project fetch error message (or "" if no error) + resources -- resources dictionary representation (or {} if error) + """ + err_msg, project = self.get_default() + if err_msg: + return err_msg, {} + return self.get_resources_by_id(project.get("id")) + def assign_to_project(self, project_name, urn): """Assign resource (urn) to project (name). @@ -248,6 +283,7 @@ class DigitalOceanProjects: Domain | do:domain:example.com Droplet | do:droplet:4126873 Floating IP | do:floatingip:192.168.99.100 + Kubernetes | do:kubernetes:bd5f5959-5e1e-4205-a714-a914373942af Load Balancer | do:loadbalancer:39052d89-8dd4-4d49-8d5a-3c3b6b365b5b Space | do:space:my-website-assets Volume | do:volume:6fc4c277-ea5c-448a-93cd-dd496cfef71f diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean.py index 1c33f2c79..4f3d7b146 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean.py @@ -185,7 +185,6 @@ EXAMPLES = r""" image_id: fedora-19-x64 """ -import os import time import traceback @@ -198,7 +197,7 @@ except ImportError: try: # Imported as a dependency for dopy - import ansible.module_utils.six + import ansible.module_utils.six # pylint: disable=unused-import HAS_SIX = True except ImportError: @@ -398,7 +397,6 @@ def core(module): if command == "droplet": Droplet.setup(api_token) if state in ("active", "present"): - # First, try to find a droplet by id. droplet = Droplet.find(id=module.params["id"]) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_block_storage.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_block_storage.py index 8597eb1ee..58bc546f9 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_block_storage.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_block_storage.py @@ -182,7 +182,7 @@ class DOBlockStorage(object): def __init__(self, module): self.module = module self.rest = DigitalOceanHelper(module) - if self.module.params.get("project"): + if self.module.params.get("project_name"): # only load for non-default project assignments self.projects = DigitalOceanProjects(module, self.rest) @@ -295,7 +295,7 @@ class DOBlockStorage(object): status = response.status_code json = response.json if status == 201: - project_name = self.module.params.get("project") + project_name = self.module.params.get("project_name") if ( project_name ): # empty string is the default project, skip project assignment diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints.py index d36177586..c01735b68 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints.py @@ -43,11 +43,13 @@ options: description: - The ID of a DigitalOcean managed TLS certificate used for SSL when a custom subdomain is provided. type: str + default: "" required: false custom_domain: description: - The fully qualified domain name (FQDN) of the custom subdomain used with the CDN endpoint. type: str + default: "" required: false extends_documentation_fragment: - community.digitalocean.digital_ocean.documentation @@ -92,7 +94,7 @@ data: """ -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, ) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints_info.py index 7c8de494f..46e75affc 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_cdn_endpoints_info.py @@ -54,7 +54,7 @@ data: """ -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, ) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database.py index ffae82dbb..9fc035279 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database.py @@ -196,9 +196,8 @@ resources: """ -import json import time -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, DigitalOceanProjects, @@ -209,7 +208,7 @@ class DODatabase(object): def __init__(self, module): self.module = module self.rest = DigitalOceanHelper(module) - if self.module.params.get("project"): + if self.module.params.get("project_name"): # only load for non-default project assignments self.projects = DigitalOceanProjects(module, self.rest) # pop wait and wait_timeout so we don't include it in the POST data @@ -336,7 +335,7 @@ class DODatabase(object): if self.wait: json_data = self.ensure_online(database_id) - project_name = self.module.params.get("project") + project_name = self.module.params.get("project_name") if project_name: # empty string is the default project, skip project assignment urn = "do:dbaas:{0}".format(database_id) assign_status, error_message, resources = self.projects.assign_to_project( diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database_info.py index cc5996613..c2c987eb0 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_database_info.py @@ -93,7 +93,7 @@ data: """ -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, ) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain.py index 234c6cf21..502420df5 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain.py @@ -119,7 +119,7 @@ class DoManager(DigitalOceanHelper, object): return response.status_code, response.json def all_domains(self): - resp = self.get("domains/") + resp = self.get_paginated_data(base_url="domains?", data_key_name="domains") return resp def find(self): @@ -127,8 +127,7 @@ class DoManager(DigitalOceanHelper, object): return None domains = self.all_domains() - status, json = self.jsonify(domains) - for domain in json["domains"]: + for domain in domains: if domain["name"] == self.domain_name: return domain return None @@ -193,7 +192,7 @@ def run(module): do_manager = DoManager(module) state = module.params.get("state") - if module.params.get("project"): + if module.params.get("project_name"): # only load for non-default project assignments projects = DigitalOceanProjects(module, do_manager) @@ -215,7 +214,7 @@ def run(module): # few times before giving up and returning null. domain_name = module.params.get("name") - project_name = module.params.get("project") + project_name = module.params.get("project_name") urn = "do:domain:{0}".format(domain_name) for i in range(ZONE_FILE_ATTEMPTS): diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record.py index 05bc4a457..9fa5bd572 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record.py @@ -45,7 +45,6 @@ options: data: description: - This is the value of the record, depending on the record type. - default: "" type: str name: description: @@ -116,7 +115,7 @@ EXAMPLES = """ type: A name: www data: 127.0.0.2 - force_update: yes + force_update: true - name: Update A record for www based on record_id community.digitalocean.digital_ocean_domain_record: @@ -127,7 +126,7 @@ EXAMPLES = """ type: A name: www data: 127.0.0.2 - force_update: yes + force_update: true - name: Remove www record based on name/type/data community.digitalocean.digital_ocean_domain_record: @@ -145,6 +144,19 @@ EXAMPLES = """ domain: example.com record_id: 1234567 +- name: Create CNAME records for www, git and status subdomains + community.digitalocean.digital_ocean_domain_record: + state: present + oauth_token: "{{ lookup('ansible.builtin.env', 'DO_API_TOKEN') }}" + domain: example.com + type: CNAME + name: "{{ item }}" + data: example.com + with_items: + - www + - git + - status + - name: Create MX record with priority 10 for example.com community.digitalocean.digital_ocean_domain_record: state: present @@ -218,7 +230,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): ) def __get_all_records(self): - records = [] page = 1 while True: @@ -315,7 +326,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): ) def create_or_update_record(self): - # if record_id is given we need to update the record no matter what if self.record_id: changed, result = self.__update_record(self.record_id) @@ -394,7 +404,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): ) def __build_payload(self): - payload = dict( data=self.module.params.get("data"), flags=self.module.params.get("flags"), @@ -418,7 +427,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): return payload def delete_record(self): - # if record_id is given, try to find the record based on the id if self.record_id: record = self.__find_record_by_id(self.record_id) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record_info.py index b42a7aaaf..d28af6fdd 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_domain_record_info.py @@ -89,7 +89,6 @@ data: """ -from ansible.module_utils.basic import env_fallback from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, @@ -116,7 +115,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): ) def __get_all_records(self): - records = [] page = 1 while True: @@ -176,7 +174,6 @@ class DigitalOceanDomainRecordManager(DigitalOceanHelper, object): return None def __build_payload(self): - payload = dict( name=self.module.params.get("name"), type=self.module.params.get("type"), diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet.py index 791f2891b..495aca7b1 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet.py @@ -287,7 +287,7 @@ resources: """ import time -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, DigitalOceanProjects, @@ -295,7 +295,6 @@ from ansible_collections.community.digitalocean.plugins.module_utils.digital_oce class DODroplet(object): - failure_message = { "empty_response": "Empty response from the DigitalOcean API; please try again or open a bug if it never " "succeeds.", @@ -320,7 +319,7 @@ class DODroplet(object): self.name = None self.size = None self.status = None - if self.module.params.get("project"): + if self.module.params.get("project_name"): # only load for non-default project assignments self.projects = DigitalOceanProjects(module, self.rest) self.firewalls = self.get_firewalls() @@ -780,7 +779,7 @@ class DODroplet(object): if json_data: droplet = json_data.get("droplet", droplet) - project_name = self.module.params.get("project") + project_name = self.module.params.get("project_name") if project_name: # empty string is the default project, skip project assignment urn = "do:droplet:{0}".format(droplet_id) assign_status, error_message, resources = self.projects.assign_to_project( diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet_info.py index 474b9af27..65032301a 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_droplet_info.py @@ -210,7 +210,6 @@ data: type: list """ -from traceback import format_exc from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_firewall.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_firewall.py index 24b7c4203..61ccea01c 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_firewall.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_firewall.py @@ -544,7 +544,7 @@ def main(): outbound_rules=dict( type="list", elements="dict", options=outbound_spec, required=False ), - ), + ) module = AnsibleModule( argument_spec=argument_spec, required_if=[("state", "present", ["inbound_rules", "outbound_rules"])], diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_floating_ip.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_floating_ip.py index d4d6ff263..ed84d2841 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_floating_ip.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_floating_ip.py @@ -435,11 +435,11 @@ def create_floating_ips(module, rest): json_data = response.json if status_code == 202: if module.params.get( - "project" + "project_name" ): # only load for non-default project assignments rest = DigitalOceanHelper(module) projects = DigitalOceanProjects(module, rest) - project_name = module.params.get("project") + project_name = module.params.get("project_name") if ( project_name ): # empty string is the default project, skip project assignment diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes.py index eda9c4241..b286930f7 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes.py @@ -155,6 +155,14 @@ options: - Highly available control planes incur less downtime. type: bool default: false + project_name: + aliases: ["project"] + description: + - Project to assign the resource to (project name, not UUID). + - Defaults to the default project of the account (empty string). + type: str + required: false + default: "" """ @@ -169,9 +177,9 @@ EXAMPLES = r""" - name: hacktoberfest-workers size: s-1vcpu-2gb count: 3 - return_kubeconfig: yes + return_kubeconfig: true wait_timeout: 600 - register: my_cluster + register: my_cluster - name: Show the kubeconfig for the cluster we just created debug: @@ -182,6 +190,21 @@ EXAMPLES = r""" state: absent oauth_token: "{{ lookup('env', 'DO_API_TOKEN') }}" name: hacktoberfest + +- name: Create a new DigitalOcean Kubernetes cluster assigned to Project "test" + community.digitalocean.digital_ocean_kubernetes: + state: present + oauth_token: "{{ lookup('env', 'DO_API_TOKEN') }}" + name: hacktoberfest + region: nyc1 + node_pools: + - name: hacktoberfest-workers + size: s-1vcpu-2gb + count: 3 + return_kubeconfig: true + project: test + wait_timeout: 600 + register: my_cluster """ @@ -212,62 +235,58 @@ data: - name: do-nyc1-hacktoberfest-admin user: token: REDACTED - kubernetes_cluster: - auto_upgrade: false - cluster_subnet: 10.244.0.0/16 - created_at: '2020-09-27T00:55:37Z' - endpoint: https://REDACTED.k8s.ondigitalocean.com + auto_upgrade: false + cluster_subnet: 10.244.0.0/16 + created_at: '2020-09-27T00:55:37Z' + endpoint: https://REDACTED.k8s.ondigitalocean.com + id: REDACTED + ipv4: REDACTED + maintenance_policy: + day: any + duration: 4h0m0s + start_time: '15:00' + name: hacktoberfest + node_pools: + - auto_scale: false + count: 1 id: REDACTED - ipv4: REDACTED - maintenance_policy: - day: any - duration: 4h0m0s - start_time: '15:00' - name: hacktoberfest - node_pools: - - auto_scale: false - count: 1 + labels: null + max_nodes: 0 + min_nodes: 0 + name: hacktoberfest-workers + nodes: + - created_at: '2020-09-27T00:55:37Z' + droplet_id: '209555245' id: REDACTED - labels: null - max_nodes: 0 - min_nodes: 0 - name: hacktoberfest-workers - nodes: - - created_at: '2020-09-27T00:55:37Z' - droplet_id: '209555245' - id: REDACTED - name: hacktoberfest-workers-3tdq1 - status: - state: running - updated_at: '2020-09-27T00:58:36Z' - size: s-1vcpu-2gb - tags: - - k8s - - k8s:REDACTED - - k8s:worker - taints: [] - region: nyc1 - service_subnet: 10.245.0.0/16 - status: - state: running - surge_upgrade: false + name: hacktoberfest-workers-3tdq1 + status: + state: running + updated_at: '2020-09-27T00:58:36Z' + size: s-1vcpu-2gb tags: - k8s - k8s:REDACTED - updated_at: '2020-09-27T01:00:37Z' - version: 1.18.8-do.1 - vpc_uuid: REDACTED + - k8s:worker + taints: [] + region: nyc1 + service_subnet: 10.245.0.0/16 + status: + state: running + surge_upgrade: false + tags: + - k8s + - k8s:REDACTED + updated_at: '2020-09-27T01:00:37Z' + version: 1.18.8-do.1 + vpc_uuid: REDACTED """ -import traceback import time -import json -from traceback import format_exc -from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, + DigitalOceanProjects, ) @@ -281,6 +300,8 @@ class DOKubernetes(object): self.wait_timeout = self.module.params.pop("wait_timeout", 600) self.module.params.pop("oauth_token") self.cluster_id = None + if self.module.params.get("project_name"): + self.projects = DigitalOceanProjects(module, self.rest) def get_by_id(self): """Returns an existing DigitalOcean Kubernetes cluster matching on id""" @@ -379,16 +400,32 @@ class DOKubernetes(object): node_pool["size"], ", ".join(valid_sizes) ) ) - + if self.module.check_mode: + self.module.exit_json(changed=True) # Create the Kubernetes cluster json_data = self.get_kubernetes() if json_data: # Add the kubeconfig to the return if self.return_kubeconfig: json_data["kubeconfig"] = self.get_kubernetes_kubeconfig() + # Assign kubernetes to project + project_name = self.module.params.get("project_name") + # empty string is the default project, skip project assignment + if project_name: + urn = "do:kubernetes:{0}".format(self.cluster_id) + ( + assign_status, + error_message, + resources, + ) = self.projects.assign_to_project(project_name, urn) + if assign_status not in {"ok", "assigned", "already_assigned"}: + self.module.fail_json( + changed=False, + msg=error_message, + assign_status=assign_status, + resources=resources, + ) self.module.exit_json(changed=False, data=json_data) - if self.module.check_mode: - self.module.exit_json(changed=True) request_params = dict(self.module.params) response = self.rest.post("kubernetes/clusters", data=request_params) json_data = response.json @@ -401,6 +438,24 @@ class DOKubernetes(object): # Add the kubeconfig to the return if self.return_kubeconfig: json_data["kubeconfig"] = self.get_kubernetes_kubeconfig() + # Assign kubernetes to project + project_name = self.module.params.get("project_name") + # empty string is the default project, skip project assignment + if project_name: + urn = "do:kubernetes:{0}".format(self.cluster_id) + assign_status, error_message, resources = self.projects.assign_to_project( + project_name, urn + ) + if assign_status not in {"ok", "assigned", "already_assigned"}: + self.module.fail_json( + changed=True, + msg=error_message, + assign_status=assign_status, + resources=resources, + ) + json_data["kubernetes_cluster"][ + "kubeconfig" + ] = self.get_kubernetes_kubeconfig() self.module.exit_json(changed=True, data=json_data["kubernetes_cluster"]) def delete(self): @@ -477,6 +532,9 @@ def main(): wait=dict(type="bool", default=True), wait_timeout=dict(type="int", default=600), ha=dict(type="bool", default=False), + project_name=dict( + type="str", aliases=["project"], required=False, default="" + ), ), required_if=( [ diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes_info.py index d60e9b4ad..2780d5a2b 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_kubernetes_info.py @@ -42,7 +42,7 @@ EXAMPLES = r""" community.digitalocean.digital_ocean_kubernetes_info: oauth_token: "{{ lookup('ansible.builtin.env', 'DO_API_TOKEN') }}" name: hacktoberfest - return_kubeconfig: yes + return_kubeconfig: true register: my_cluster - ansible.builtin.debug: @@ -127,11 +127,6 @@ data: """ -import traceback -import time -import json -from traceback import format_exc -from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_load_balancer.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_load_balancer.py index ecc9efa43..d0da6f7dc 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_load_balancer.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_load_balancer.py @@ -407,8 +407,7 @@ resources: import time -from ansible.module_utils._text import to_native -from ansible.module_utils.basic import AnsibleModule, env_fallback +from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, DigitalOceanProjects, @@ -416,7 +415,6 @@ from ansible_collections.community.digitalocean.plugins.module_utils.digital_oce class DOLoadBalancer(object): - # Regions which use 'size' versus 'size_unit' size_regions = {"ams2", "nyc2", "sfo1"} all_sizes = {"lb-small", "lb-medium", "lb-large"} @@ -469,7 +467,7 @@ class DOLoadBalancer(object): self.module.params.pop("oauth_token") self.wait = self.module.params.pop("wait", True) self.wait_timeout = self.module.params.pop("wait_timeout", 600) - if self.module.params.get("project"): + if self.module.params.get("project_name"): # only load for non-default project assignments self.projects = DigitalOceanProjects(module, self.rest) @@ -718,7 +716,7 @@ class DOLoadBalancer(object): if self.wait: self.ensure_active() - project_name = self.module.params.get("project") + project_name = self.module.params.get("project_name") if project_name: # empty string is the default project, skip project assignment urn = "do:loadbalancer:{0}".format(self.id) ( diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts.py index 67825ccc5..039940b97 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts.py @@ -144,7 +144,6 @@ data: """ -from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, @@ -247,7 +246,6 @@ class DOMonitoringAlerts(object): def delete(self): uuid = self.module.params.get("uuid", None) if uuid is not None: - # Check mode if self.module.check_mode: self.module.exit_json(changed=True) diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts_info.py index a5d87ad60..54c4402c2 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_monitoring_alerts_info.py @@ -77,7 +77,6 @@ data: """ -from ansible.module_utils._text import to_native from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project.py index e0333883e..7799ec019 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project.py @@ -135,8 +135,6 @@ data: } """ -import time -import json from ansible.module_utils.basic import AnsibleModule, env_fallback from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_info.py index 0c6ac670c..a3bfb4eeb 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_info.py @@ -66,7 +66,6 @@ data: updated_at: "2021-03-11T00:00:00Z" """ -from traceback import format_exc from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_resource_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_resource_info.py new file mode 100644 index 000000000..13c1404b7 --- /dev/null +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_project_resource_info.py @@ -0,0 +1,104 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright: (c) 2023, Raman Babich <ramanbabich@gmail.com> +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function + +__metaclass__ = type + +DOCUMENTATION = r""" +--- +module: digital_ocean_project_resource_info +short_description: Gather information about DigitalOcean Project Resources +description: + - This module can be used to gather information about Project Resources. +author: "Raman Babich (@raman-babich)" +version_added: 1.25.0 + +options: + id: + description: + - Project ID that can be used to identify and reference a project. + - If C(id) and C(name) are not specified default project will be used. + type: str + name: + description: + - Project name that can be used to identify and reference a project. + - If C(id) and C(name) are not specified default project will be used. + type: str + +extends_documentation_fragment: +- community.digitalocean.digital_ocean +""" + +EXAMPLES = r""" +- name: Get project resources by id + community.digitalocean.digital_ocean_project_resource_info: + id: cb1ef55e-3cd8-4c7c-aa5d-07c32bf41627 + +- name: Get project resources by name + community.digitalocean.digital_ocean_project_resource_info: + name: my-project-name + +- name: Get default project resources + community.digitalocean.digital_ocean_project_resource_info: +""" + +RETURN = r""" +data: + description: "DigitalOcean project resources information" + elements: dict + returned: success + type: list + sample: + - urn: "do:droplet:13457723" + assigned_at: "2018-09-28T19:26:37Z" + links: + self: "https://api.digitalocean.com/v2/droplets/13457723" + status: "ok" + - urn: "do:domain:example.com" + assigned_at: "2019-03-31T16:24:14Z" + links: + self: "https://api.digitalocean.com/v2/domains/example.com" + status: "ok" +""" + +from ansible.module_utils.basic import AnsibleModule +from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( + DigitalOceanHelper, + DigitalOceanProjects, +) + + +def run(module): + rest = DigitalOceanHelper(module) + projects = DigitalOceanProjects(module, rest) + if module.params["id"]: + err_msg, resources = projects.get_resources_by_id(module.params["id"]) + elif module.params["name"]: + err_msg, resources = projects.get_resources_by_name(module.params["name"]) + else: + err_msg, resources = projects.get_resources_of_default() + + if err_msg: + module.fail_json(msg=err_msg) + module.exit_json(data=resources["resources"]) + + +def main(): + argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() + argument_spec.update( + name=dict(type="str"), + id=dict(type="str"), + ) + module = AnsibleModule( + argument_spec=argument_spec, + mutually_exclusive=[("id", "name")], + supports_check_mode=True, + ) + run(module) + + +if __name__ == "__main__": + main() diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_snapshot.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_snapshot.py index 67dc01000..241d6621e 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_snapshot.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_snapshot.py @@ -46,6 +46,7 @@ options: - Only applies to volume snapshots (not Droplets). type: list elements: str + default: [] droplet_id: description: - Droplet ID to snapshot. diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces.py index 0d101b501..1a2ac272b 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces.py @@ -208,7 +208,6 @@ def run(module): def main(): - argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( state=dict(type="str", choices=["present", "absent"], default="present"), diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces_info.py index 50f050020..aeab3ce9b 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_spaces_info.py @@ -128,7 +128,6 @@ def run(module): def main(): - argument_spec = DigitalOceanHelper.digital_ocean_argument_spec() argument_spec.update( state=dict(type="str", choices=["present"], default="present"), diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_sshkey.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_sshkey.py index 3a7e662ba..8d09c1dd3 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_sshkey.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_sshkey.py @@ -82,7 +82,6 @@ import json import hashlib import base64 -from ansible.module_utils.basic import env_fallback from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import fetch_url diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc.py index 598ec2bf3..473b0bc9f 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc.py @@ -117,7 +117,6 @@ data: """ -import time from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, diff --git a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc_info.py b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc_info.py index c2b11078d..5d8915969 100644 --- a/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc_info.py +++ b/ansible_collections/community/digitalocean/plugins/modules/digital_ocean_vpc_info.py @@ -66,7 +66,6 @@ data: """ -import time from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.digitalocean.plugins.module_utils.digital_ocean import ( DigitalOceanHelper, |