From 5b77519b89a51533ba4216fe42a3cb043a450aee Mon Sep 17 00:00:00 2001 From: Jakob Meng Date: Fri, 27 Jan 2023 15:02:30 +0100 Subject: [PATCH] Refactored coe_cluster{,_template} modules again Change-Id: If9e28cf236db9a617657f177c0a7176eabc752ea --- ci/roles/coe_cluster/defaults/main.yml | 22 +- ci/roles/coe_cluster/tasks/main.yml | 6 +- .../coe_cluster_template/defaults/main.yml | 15 +- ci/roles/coe_cluster_template/tasks/main.yml | 4 +- plugins/modules/coe_cluster.py | 214 ++++++++------- plugins/modules/coe_cluster_template.py | 250 ++++++++---------- 6 files changed, 243 insertions(+), 268 deletions(-) diff --git a/ci/roles/coe_cluster/defaults/main.yml b/ci/roles/coe_cluster/defaults/main.yml index fd61a2b2..7a0e2a2d 100644 --- a/ci/roles/coe_cluster/defaults/main.yml +++ b/ci/roles/coe_cluster/defaults/main.yml @@ -1,18 +1,26 @@ expected_fields: -# Magnum might return more fields according to its documentation [0] but -# openstacksdk normalizes coe cluster resources, moving most fields from -# top level into a 'properties' field [1]. -# [0] https://docs.openstack.org/api-ref/container-infrastructure-management/#create-new-cluster -# [1] https://opendev.org/openstack/openstacksdk/src/commit/d57c1fcab3b6cbe806cbae735fefa4983b200ab2/openstack/cloud/_normalize.py#L484 + - api_address - cluster_template_id + - coe_version - create_timeout + - created_at + - discovery_url + - fixed_network + - fixed_subnet + - flavor_id - id + - is_floating_ip_enabled + - is_master_lb_enabled - keypair - - location + - labels + - master_addresses - master_count + - master_flavor_id - name + - node_addresses - node_count - - properties - stack_id - status + - status_reason + - updated_at - uuid diff --git a/ci/roles/coe_cluster/tasks/main.yml b/ci/roles/coe_cluster/tasks/main.yml index ac2beb55..8b40028a 100644 --- a/ci/roles/coe_cluster/tasks/main.yml +++ b/ci/roles/coe_cluster/tasks/main.yml @@ -69,8 +69,8 @@ external_network_id: '{{ external_network.network.id }}' fixed_network: ansible_internal_network fixed_subnet: ansible_internal_subnet - floating_ip_enabled: true image_id: '{{ image_id }}' + is_floating_ip_enabled: true keypair_id: '{{ keypair.keypair.id }}' name: k8s state: present @@ -90,8 +90,8 @@ - name: Assert return values of coe_cluster module assert: that: - # openstack.cloud.coe_cluster will only return 'id' on cluster creation when wait is false - - "['id']|difference(coe_cluster.cluster.keys())|length == 0" + # allow new fields to be introduced but prevent fields from being removed + - expected_fields|difference(coe_cluster.cluster.keys())|length == 0 - name: Pause for 1 minutes to allow Magnum to create the Kubernetes cluster ansible.builtin.pause: diff --git a/ci/roles/coe_cluster_template/defaults/main.yml b/ci/roles/coe_cluster_template/defaults/main.yml index 13ea5fb0..1076328f 100644 --- a/ci/roles/coe_cluster_template/defaults/main.yml +++ b/ci/roles/coe_cluster_template/defaults/main.yml @@ -1,40 +1,33 @@ expected_fields: -# Magnum might return more fields according to its documentation [0] but -# openstacksdk normalizes coe cluster template resources, moving most -# fields from top level into a 'properties' field [1]. -# [0] https://docs.openstack.org/api-ref/container-infrastructure-management/#create-new-cluster -# [1] https://opendev.org/openstack/openstacksdk/src/commit/d57c1fcab3b6cbe806cbae735fefa4983b200ab2/openstack/cloud/_normalize.py#L522 - apiserver_port - cluster_distro - coe - created_at - dns_nameserver + - docker_storage_driver - docker_volume_size - external_network_id - fixed_network - fixed_subnet - flavor_id - - floating_ip_enabled - http_proxy - https_proxy - id - image_id - insecure_registry + - is_floating_ip_enabled + - is_hidden + - is_master_lb_enabled - is_public - is_registry_enabled - is_tls_disabled - keypair_id - labels - - location - master_flavor_id - name - network_driver - no_proxy - - properties - - public - - registry_enabled - server_type - - tls_disabled - updated_at - uuid - volume_driver diff --git a/ci/roles/coe_cluster_template/tasks/main.yml b/ci/roles/coe_cluster_template/tasks/main.yml index 8b61e156..f310ebb7 100644 --- a/ci/roles/coe_cluster_template/tasks/main.yml +++ b/ci/roles/coe_cluster_template/tasks/main.yml @@ -21,7 +21,7 @@ openstack.cloud.coe_cluster_template: cloud: "{{ cloud }}" coe: kubernetes - floating_ip_enabled: false + is_floating_ip_enabled: false image_id: '{{ image_id }}' keypair_id: '{{ keypair.keypair.id }}' name: k8s @@ -38,7 +38,7 @@ openstack.cloud.coe_cluster_template: cloud: "{{ cloud }}" coe: kubernetes - floating_ip_enabled: false + is_floating_ip_enabled: false image_id: '{{ image_id }}' keypair_id: '{{ keypair.keypair.id }}' name: k8s diff --git a/plugins/modules/coe_cluster.py b/plugins/modules/coe_cluster.py index 78cf7ba8..3234a574 100644 --- a/plugins/modules/coe_cluster.py +++ b/plugins/modules/coe_cluster.py @@ -22,25 +22,22 @@ options: description: - URL used for cluster node discovery. type: str - docker_volume_size: - description: - - The size in GB of the docker volume. - type: int flavor_id: description: - The flavor of the minion node for this cluster template. type: str - floating_ip_enabled: + is_floating_ip_enabled: description: - Indicates whether created cluster should have a floating ip. - Whether enable or not using the floating IP of cloud provider. Some cloud providers used floating IP, some used public IP, thus Magnum provide this option for specifying the choice of using floating IP. - - If not set, the value of I(floating_ip_enabled) of the cluster template + - If not set, the value of I(is_floating_ip_enabled) of the cluster template specified with I(cluster_template_id) will be used. - - When I(floating_ip_enabled) is set to C(true), then + - When I(is_floating_ip_enabled) is set to C(true), then I(external_network_id) in cluster template must be defined. type: bool + aliases: ['floating_ip_enabled'] keypair: description: - Name of the keypair to use. @@ -74,82 +71,131 @@ options: choices: [present, absent] default: present type: str -notes: - - Return values of this module are preliminary and will most likely change - when openstacksdk has finished its transition of cloud layer functions to - resource proxies. extends_documentation_fragment: - openstack.cloud.openstack ''' -# TODO: Update return values when coe related functions in openstacksdk -# have been ported to resource proxies. RETURN = r''' cluster: description: Dictionary describing the cluster. returned: On success when I(state) is C(present). - type: complex + type: dict contains: + api_address: + description: The endpoint URL of COE API exposed to end-users. + type: str + sample: https://172.24.4.30:6443 cluster_template_id: - description: The cluster_template UUID + description: The UUID of the cluster template. type: str sample: '7b1418c8-cea8-48fc-995d-52b66af9a9aa' + coe_version: + description: Version info of chosen COE in bay/cluster for helping + client in picking the right version of client. + type: str + sample: v1.11.1 create_timeout: description: Timeout for creating the cluster in minutes. Default to 60 if not set. type: int sample: 60 + created_at: + description: The date and time in UTC at which the cluster is created. + type: str + sample: "2018-08-16T10:29:45+00:00" + discovery_url: + description: The custom discovery url for node discovery. This is used + by the COE to discover the servers that have been created + to host the containers. The actual discovery mechanism + varies with the COE. In some cases, the service fills in + the server info in the discovery service. In other cases, + if the discovery_url is not specified, the service will + use the public discovery service at + U(https://discovery.etcd.io). In this case, the service + will generate a unique url here for each bay and store the + info for the servers. + type: str + sample: https://discovery.etcd.io/a42ee38e7113f31f4d6324f24367aae5 + fixed_network: + description: The name or ID of the network to provide connectivity to the + internal network for the bay/cluster. + type: str + fixed_subnet: + description: The fixed subnet to use when allocating network addresses + for nodes in bay/cluster. + type: str + flavor_id: + description: The flavor name or ID to use when booting the node servers. + Defaults to m1.small. + type: str id: description: Unique UUID for this cluster. type: str sample: '86246a4d-a16c-4a58-9e96ad7719fe0f9d' + is_floating_ip_enabled: + description: Indicates whether created clusters should have a + floating ip or not. + type: bool + sample: true + is_master_lb_enabled: + description: Indicates whether created clusters should have a load + balancer for master nodes or not. + type: bool + sample: true keypair: description: Name of the keypair to use. type: str sample: mykey - location: - description: The OpenStack location of this resource. - type: str + labels: + description: One or more key/value pairs. + type: dict + sample: {'key1': 'value1', 'key2': 'value2'} + master_addresses: + description: A list of floating IPs of all master nodes. + type: list + sample: ['172.24.4.5'] master_count: - description: The number of master nodes for this cluster. + description: The number of servers that will serve as master for the + bay/cluster. Set to more than 1 master to enable High + Availability. If the option master-lb-enabled is specified + in the baymodel/cluster template, the master servers will + be placed in a load balancer pool. Defaults to 1. type: int sample: 1 + master_flavor_id: + description: The flavor of the master node for this baymodel/cluster + template. + type: str + sample: c1.c1r1 name: description: Name that has to be given to the cluster. type: str sample: k8scluster + node_addresses: + description: A list of floating IPs of all servers that serve as nodes. + type: list + sample: ['172.24.4.8'] node_count: description: The number of master nodes for this cluster. type: int sample: 1 - properties: - description: Additional properties of the cluster template. - type: dict - sample: | - { - 'api_address': 'https://172.24.4.30:6443', - 'coe_version': 'v1.11.1', - 'container_version': '1.12.6', - 'created_at': '2018-08-16T10:29:45+00:00', - 'discovery_url': 'https://discovery.etcd.io/a42...aae5', - 'faults': {'0': 'ResourceInError: resources[0].resources...'}, - 'flavor_id': 'c1.c1r1', - 'floating_ip_enabled': true, - 'labels': {'key1': 'value1', 'key2': 'value2'}, - 'master_addresses': ['172.24.4.5'], - 'master_flavor_id': 'c1.c1r1', - 'node_addresses': ['172.24.4.8'], - 'status_reason': 'Stack CREATE completed successfully', - 'updated_at': '2018-08-16T10:39:25+00:00', - } stack_id: - description: Stack id of the Heat stack. + description: The reference UUID of orchestration stack from Heat + orchestration service. type: str sample: '07767ec6-85f5-44cb-bd63-242a8e7f0d9d' status: description: Status of the cluster from the heat stack. type: str sample: 'CREATE_COMLETE' + status_reason: + description: Status reason of the cluster from the heat stack + type: str + sample: 'Stack CREATE completed successfully' + updated_at: + description: The date and time in UTC at which the cluster was updated. + type: str + sample: '2018-08-16T10:39:25+00:00' uuid: description: Unique UUID for this cluster. type: str @@ -174,9 +220,9 @@ class COEClusterModule(OpenStackModule): argument_spec = dict( cluster_template_id=dict(), discovery_url=dict(), - docker_volume_size=dict(type='int'), flavor_id=dict(), - floating_ip_enabled=dict(type='bool'), + is_floating_ip_enabled=dict(type='bool', + aliases=['floating_ip_enabled']), keypair=dict(no_log=False), # := noqa no-log-needed labels=dict(type='raw'), master_count=dict(type='int'), @@ -204,10 +250,7 @@ class COEClusterModule(OpenStackModule): # Create cluster cluster = self._create() self.exit_json(changed=True, - # TODO: Add .to_dict(computed=False) when Munch - # object has been replaced with openstacksdk - # resource object. - cluster=cluster) + cluster=cluster.to_dict(computed=False)) elif state == 'present' and cluster: # Update cluster @@ -216,10 +259,7 @@ class COEClusterModule(OpenStackModule): cluster = self._update(cluster, update) self.exit_json(changed=bool(update), - # TODO: Add .to_dict(computed=False) when Munch - # object has been replaced with openstacksdk - # resource object. - cluster=cluster) + cluster=cluster.to_dict(computed=False)) elif state == 'absent' and cluster: # Delete cluster @@ -235,9 +275,8 @@ class COEClusterModule(OpenStackModule): # TODO: Implement support for updates. non_updateable_keys = [k for k in ['cluster_template_id', - 'discovery_url', - 'docker_volume_size', 'flavor_id', - 'floating_ip_enabled', 'keypair', + 'discovery_url', 'flavor_id', + 'is_floating_ip_enabled', 'keypair', 'master_count', 'master_flavor_id', 'name', 'node_count'] if self.params[k] is not None @@ -270,9 +309,8 @@ class COEClusterModule(OpenStackModule): # specifying names in addition to IDs. kwargs = dict((k, self.params[k]) for k in ['cluster_template_id', 'discovery_url', - 'docker_volume_size', 'flavor_id', - 'floating_ip_enabled', 'keypair', - 'master_count', 'master_flavor_id', + 'flavor_id', 'is_floating_ip_enabled', + 'keypair', 'master_count', 'master_flavor_id', 'name', 'node_count'] if self.params[k] is not None) @@ -285,57 +323,33 @@ class COEClusterModule(OpenStackModule): kwargs['create_timeout'] = self.params['timeout'] - # TODO: Replace with self.conn.container_infrastructure_management.\ - # create_cluster() when available in openstacksdk. - cluster = self.conn.create_coe_cluster(**kwargs) + cluster = self.conn.container_infrastructure_management.\ + create_cluster(**kwargs) if not self.params['wait']: - # openstacksdk's create_coe_cluster() returns a cluster's uuid only - # but we cannot use self.conn.get_coe_cluster(cluster_id) because - # it might return None as long as the cluster is being set up. + # openstacksdk's create_cluster() returns a cluster's id only + # but we cannot use self.conn.container_infrastructure_management.\ + # get_cluster(cluster_id) because it might return None as long as + # the cluster is being set up. return cluster - cluster_id = cluster['id'] - if self.params['wait']: - # TODO: Replace with self.sdk.resource.wait_for_status() when - # resource creation has been ported to self.conn.\ - # container_infrastructure_management.create_cluster() - for count in self.sdk.utils.iterate_timeout( - timeout=self.params['timeout'], - message="Timeout waiting for cluster to be present" - ): - # Fetch cluster again - cluster = self.conn.get_coe_cluster(cluster_id) - - if cluster is None: - continue - elif cluster.status.lower() == 'active': - break - elif cluster.status.lower() in ['error']: - self.fail_json(msg="{0} transitioned to failure state {1}" - .format(cluster.name, 'error')) + cluster = self.sdk.resource.wait_for_status( + self.conn.container_infrastructure_management, cluster, + status='active', + failures=['error'], + wait=self.params['timeout']) return cluster def _delete(self, cluster): - # TODO: Replace with self.conn.container_infrastructure_management.\ - # delete_cluster() when available in openstacksdk. - self.conn.delete_coe_cluster(cluster.name) + self.conn.container_infrastructure_management.\ + delete_cluster(cluster['id']) - # TODO: Replace with self.sdk.resource.wait_for_delete() when - # resource fetch has been ported to self.conn.\ - # container_infrastructure_management.find_cluster() if self.params['wait']: - for count in self.sdk.utils.iterate_timeout( - timeout=self.params['timeout'], - message="Timeout waiting for cluster to be absent" - ): - cluster = self.conn.get_coe_cluster(cluster.id) - if cluster is None: - break - elif cluster['status'].lower() == 'deleted': - break + self.sdk.resource.wait_for_delete( + self.conn.container_infrastructure_management, cluster, + interval=None, wait=self.params['timeout']) def _find(self): name = self.params['name'] @@ -345,18 +359,14 @@ class COEClusterModule(OpenStackModule): if cluster_template_id is not None: filters['cluster_template_id'] = cluster_template_id - # TODO: Replace with self.conn.container_infrastructure_management.\ - # find_cluster() when available in openstacksdk. return self.conn.get_coe_cluster(name_or_id=name, filters=filters) def _update(self, cluster, update): attributes = update.get('attributes') if attributes: # TODO: Implement support for updates. - # TODO: Replace with self.conn.\ - # container_infrastructure_management.\ - # update_cluster() when available in openstacksdk. - # cluster = self.conn.update_coe_cluster(...) + # cluster = self.conn.container_infrastructure_management.\ + # update_cluster(...) pass return cluster diff --git a/plugins/modules/coe_cluster_template.py b/plugins/modules/coe_cluster_template.py index d6f482d1..9704b862 100644 --- a/plugins/modules/coe_cluster_template.py +++ b/plugins/modules/coe_cluster_template.py @@ -36,7 +36,7 @@ options: external_network_id: description: - The external network to attach to the cluster. - - When I(floating_ip_enabled) is set to C(true), then + - When I(is_floating_ip_enabled) is set to C(true), then I(external_network_id) must be defined. type: str fixed_network: @@ -51,13 +51,41 @@ options: description: - The flavor of the minion node for this cluster template. type: str - floating_ip_enabled: + is_floating_ip_enabled: description: - Indicates whether created clusters should have a floating ip or not. - - When I(floating_ip_enabled) is set to C(true), then + - When I(is_floating_ip_enabled) is set to C(true), then I(external_network_id) must be defined. type: bool default: true + aliases: ['floating_ip_enabled'] + is_master_lb_enabled: + description: + - Indicates whether created clusters should have a load balancer + for master nodes or not. + - Magnum's default value for I(is_master_lb_enabled) is C(true), + ours is C(false). + type: bool + default: false + aliases: ['master_lb_enabled'] + is_public: + description: + - Indicates whether the cluster template is public or not. + - Magnum's default value for I(is_public) is C(false). + type: bool + aliases: ['public'] + is_registry_enabled: + description: + - Indicates whether the docker registry is enabled. + - Magnum's default value for I(is_registry_enabled) is C(false). + type: bool + aliases: ['registry_enabled'] + is_tls_disabled: + description: + - Indicates whether the TLS should be disabled. + - Magnum's default value for I(is_tls_disabled) is C(false). + type: bool + aliases: ['tls_disabled'] keypair_id: description: - Name or ID of the keypair to use. @@ -85,14 +113,6 @@ options: description: - The flavor of the master node for this cluster template. type: str - master_lb_enabled: - description: - - Indicates whether created clusters should have a load balancer - for master nodes or not. - - Magnum's default value for I(master_lb_enabled) is C(true), - ours is C(false). - type: bool - default: false name: description: - Name that has to be given to the cluster template. @@ -108,16 +128,6 @@ options: - A comma separated list of IPs for which proxies should not be used in the cluster. type: str - public: - description: - - Indicates whether the cluster template is public or not. - - Magnum's default value for I(public) is C(false). - type: bool - registry_enabled: - description: - - Indicates whether the docker registry is enabled. - - Magnum's default value for I(registry_enabled) is C(false). - type: bool server_type: description: - Server type for this cluster template. @@ -130,31 +140,20 @@ options: choices: [present, absent] default: present type: str - tls_disabled: - description: - - Indicates whether the TLS should be disabled. - - Magnum's default value for I(tls_disabled) is C(false). - type: bool volume_driver: description: - The name of the driver used for instantiating container volumes. choices: [cinder, rexray] type: str -notes: - - Return values of this module are preliminary and will most likely change - when openstacksdk has finished its transition of cloud layer functions to - resource proxies. extends_documentation_fragment: - openstack.cloud.openstack ''' -# TODO: Update return values when coe related functions in openstacksdk -# have been ported to resource proxies. RETURN = r''' cluster_template: description: Dictionary describing the template. returned: On success when I(state) is C(present). - type: complex + type: dict contains: apiserver_port: description: The exposed port of COE API server. @@ -165,26 +164,33 @@ cluster_template: type: str coe: description: The Container Orchestration Engine for this cluster - template. + template. Supported COEs include kubernetes, swarm, mesos. type: str sample: kubernetes created_at: description: The date and time when the resource was created. type: str dns_nameserver: - description: The DNS nameserver address + description: The DNS nameserver for the servers and containers in the + bay/cluster to use. type: str sample: '8.8.8.8' + docker_storage_driver: + description: "The name of a driver to manage the storage for the images + and the container's writable layer." + type: str docker_volume_size: - description: The size in GB of the docker volume + description: The size in GB for the local storage on each server for the + Docker daemon to cache the images and host the containers. type: int sample: 5 external_network_id: - description: The external network to attach to the cluster + description: The name or network ID of a Neutron network to provide + connectivity to the external internet for the bay/cluster. type: str sample: public fixed_network: - description: The fixed network name to attach to the cluster + description: The fixed network name to attach to the cluster. type: str sample: 07767ec6-85f5-44cb-bd63-242a8e7f0d9d fixed_subnet: @@ -192,14 +198,9 @@ cluster_template: type: str sample: 05567ec6-85f5-44cb-bd63-242a8e7f0d9d flavor_id: - description: The flavor of the minion node for this cluster template. + description: The nova flavor ID or name for booting the node servers. type: str sample: c1.c1r1 - floating_ip_enabled: - description: Indicates whether created clusters should have a - floating ip or not. - type: bool - sample: true http_proxy: description: Address of a proxy that will receive all HTTP requests and relay them. The format is a URL including a port @@ -216,13 +217,28 @@ cluster_template: description: The UUID of the cluster template. type: str image_id: - description: Image id the cluster will be based on. + description: The name or UUID of the base image in Glance to boot the + servers for the bay/cluster. type: str sample: 05567ec6-85f5-44cb-bd63-242a8e7f0e9d insecure_registry: description: "The URL pointing to users's own private insecure docker registry to deploy and run docker containers." type: str + is_floating_ip_enabled: + description: Indicates whether created clusters should have a + floating ip or not. + type: bool + sample: true + is_hidden: + description: Indicates whether the cluster template is hidden or not. + type: bool + sample: false + is_master_lb_enabled: + description: Indicates whether created clusters should have a load + balancer for master nodes or not. + type: bool + sample: true is_public: description: Access to a baymodel/cluster template is normally limited to the admin, owner or users within the same tenant as the @@ -230,6 +246,7 @@ cluster_template: template public and accessible by other users. The default is not public. type: bool + sample: false is_registry_enabled: description: "Docker images by default are pulled from the public Docker registry, but in some cases, users may want to use a @@ -238,6 +255,7 @@ cluster_template: local registry in the bay/cluster backed by swift to host the images. The default is to use the public registry." type: bool + sample: false is_tls_disabled: description: Transport Layer Security (TLS) is normally enabled to secure the bay/cluster. In some cases, users may want to disable @@ -246,33 +264,27 @@ cluster_template: will disable TLS so that users can access the COE endpoints without a certificate. The default is TLS enabled. type: bool + sample: false keypair_id: - description: Name or ID of the keypair to use. + description: Name of the SSH keypair to configure in the bay/cluster + servers for ssh access. type: str sample: mykey labels: description: One or more key/value pairs. type: dict sample: {'key1': 'value1', 'key2': 'value2'} - location: - description: The OpenStack location of this resource. - type: str master_flavor_id: description: The flavor of the master node for this cluster template. type: str sample: c1.c1r1 - master_lb_enabled: - description: Indicates whether created clusters should have a load - balancer for master nodes or not. - type: bool - sample: true name: description: Name that has to be given to the cluster template. type: str sample: k8scluster network_driver: - description: - - The name of the driver used for instantiating container networks + description: The name of a network driver for providing the networks for + the containers type: str sample: calico no_proxy: @@ -280,48 +292,10 @@ cluster_template: not be used in the cluster. type: str sample: 10.0.0.4,10.0.0.5 - properties: - description: Additional properties of the cluster template. - type: dict - sample: | - { - "docker_storage_driver": null, - "hidden": false, - "master_lb_enabled": false, - "project_id": "8fb245a1bd714d9a82e419f2b7bb69dd", - "tags": null, - "user_id": "51510ce12e294d5d9c7391bececcd1e8" - } - public: - description: Access to a baymodel/cluster template is normally limited - to the admin, owner or users within the same tenant as the - owners. Setting this flag makes the baymodel/cluster - template public and accessible by other users. The default - is not public. - type: bool - sample: false - registry_enabled: - description: "Docker images by default are pulled from the public Docker - registry, but in some cases, users may want to use a - private registry. This option provides an alternative - registry based on the Registry V2: Magnum will create a - local registry in the bay/cluster backed by swift to host - the images. The default is to use the public registry." - type: bool - sample: false server_type: - description: Server type for this cluster template. + description: The servers in the bay/cluster can be vm or baremetal. type: str sample: vm - tls_disabled: - description: Transport Layer Security (TLS) is normally enabled to secure - the bay/cluster. In some cases, users may want to disable - TLS in the bay/cluster, for instance during development or - to troubleshoot certain problems. Specifying this parameter - will disable TLS so that users can access the COE endpoints - without a certificate. The default is TLS enabled. - type: bool - sample: false updated_at: description: The date and time when the resource was updated. type: str @@ -329,8 +303,8 @@ cluster_template: description: The UUID of the cluster template. type: str volume_driver: - description: The name of the driver used for instantiating container - volumes. + description: The name of a volume driver for managing the persistent + storage for the containers. type: str sample: cinder ''' @@ -343,7 +317,7 @@ EXAMPLES = r''' image_id: 2a8c9888-9054-4b06-a1ca-2bb61f9adb72 keypair_id: mykey name: k8s - public: no + is_public: no ''' from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule @@ -360,22 +334,24 @@ class COEClusterTemplateModule(OpenStackModule): fixed_network=dict(), fixed_subnet=dict(), flavor_id=dict(), - floating_ip_enabled=dict(type='bool', default=True), http_proxy=dict(), https_proxy=dict(), image_id=dict(), + is_floating_ip_enabled=dict(type='bool', default=True, + aliases=['floating_ip_enabled']), keypair_id=dict(), labels=dict(type='raw'), master_flavor_id=dict(), - master_lb_enabled=dict(type='bool', default=False), + is_master_lb_enabled=dict(type='bool', default=False, + aliases=['master_lb_enabled']), + is_public=dict(type='bool', aliases=['public']), + is_registry_enabled=dict(type='bool', aliases=['registry_enabled']), + is_tls_disabled=dict(type='bool', aliases=['tls_disabled']), name=dict(required=True), network_driver=dict(choices=['flannel', 'calico', 'docker']), no_proxy=dict(), - public=dict(type='bool'), - registry_enabled=dict(type='bool'), server_type=dict(choices=['vm', 'bm']), state=dict(default='present', choices=['absent', 'present']), - tls_disabled=dict(type='bool'), volume_driver=dict(choices=['cinder', 'rexray']), ) module_kwargs = dict( @@ -398,9 +374,7 @@ class COEClusterTemplateModule(OpenStackModule): cluster_template = self._create() self.exit_json( changed=True, - # TODO: Add .to_dict(computed=False) when Munch object has - # been replaced with openstacksdk resource object. - cluster_template=cluster_template) + cluster_template=cluster_template.to_dict(computed=False)) elif state == 'present' and cluster_template: # Update cluster_template @@ -410,9 +384,7 @@ class COEClusterTemplateModule(OpenStackModule): self.exit_json( changed=bool(update), - # TODO: Add .to_dict(computed=False) when Munch object has - # been replaced with openstacksdk resource object. - cluster_template=cluster_template) + cluster_template=cluster_template.to_dict(computed=False)) elif state == 'absent' and cluster_template: # Delete cluster_template @@ -426,9 +398,9 @@ class COEClusterTemplateModule(OpenStackModule): def _build_update(self, cluster_template): update = {} - if self.params['floating_ip_enabled'] \ + if self.params['is_floating_ip_enabled'] \ and self.params['external_network_id'] is None: - raise ValueError('floating_ip_enabled is True' + raise ValueError('is_floating_ip_enabled is True' ' but external_network_id is missing') # TODO: Implement support for updates. @@ -438,18 +410,16 @@ class COEClusterTemplateModule(OpenStackModule): 'external_network_id', 'fixed_network', 'fixed_subnet', 'flavor_id', - 'floating_ip_enabled', 'http_proxy', 'https_proxy', - 'image_id', 'keypair_id', - 'master_flavor_id', - 'master_lb_enabled', 'name', + 'image_id', + 'is_floating_ip_enabled', + 'is_master_lb_enabled', + 'is_public', 'is_registry_enabled', + 'is_tls_disabled', 'keypair_id', + 'master_flavor_id', 'name', 'network_driver', 'no_proxy', - 'public', 'registry_enabled', - 'server_type', 'tls_disabled', - 'volume_driver'] + 'server_type', 'volume_driver'] if self.params[k] is not None - and k in cluster_template # drop when - # cluster_template got ported to resource proxy and self.params[k] != cluster_template[k]] labels = self.params['labels'] @@ -475,9 +445,9 @@ class COEClusterTemplateModule(OpenStackModule): return update def _create(self): - if self.params['floating_ip_enabled'] \ + if self.params['is_floating_ip_enabled'] \ and self.params['external_network_id'] is None: - raise ValueError('floating_ip_enabled is True' + raise ValueError('is_floating_ip_enabled is True' ' but external_network_id is missing') # TODO: Complement *_id parameters with find_* functions to allow @@ -486,13 +456,14 @@ class COEClusterTemplateModule(OpenStackModule): for k in ['coe', 'dns_nameserver', 'docker_storage_driver', 'docker_volume_size', 'external_network_id', 'fixed_network', - 'fixed_subnet', 'flavor_id', - 'floating_ip_enabled', 'http_proxy', - 'https_proxy', 'image_id', 'keypair_id', - 'master_flavor_id', 'master_lb_enabled', - 'name', 'network_driver', 'no_proxy', 'public', - 'registry_enabled', 'server_type', - 'tls_disabled', 'volume_driver'] + 'fixed_subnet', 'flavor_id', 'http_proxy', + 'https_proxy', 'image_id', + 'is_floating_ip_enabled', + 'is_master_lb_enabled', 'is_public', + 'is_registry_enabled', 'is_tls_disabled', + 'keypair_id', 'master_flavor_id', 'name', + 'network_driver', 'no_proxy', 'server_type', + 'volume_driver'] if self.params[k] is not None) labels = self.params['labels'] @@ -502,14 +473,12 @@ class COEClusterTemplateModule(OpenStackModule): for kv in labels.split(",")]) kwargs['labels'] = labels - # TODO: Replace with self.conn.container_infrastructure_management.\ - # create_cluster_template() when available in openstacksdk. - return self.conn.create_cluster_template(**kwargs) + return self.conn.container_infrastructure_management.\ + create_cluster_template(**kwargs) def _delete(self, cluster_template): - # TODO: Replace with self.conn.container_infrastructure_management.\ - # delete_cluster_template() when available in openstacksdk. - self.conn.delete_cluster_template(cluster_template.name) + self.conn.container_infrastructure_management.\ + delete_cluster_template(cluster_template['id']) def _find(self): name = self.params['name'] @@ -523,20 +492,15 @@ class COEClusterTemplateModule(OpenStackModule): if coe is not None: filters['coe'] = coe - # TODO: Replace with self.conn.container_infrastructure_management.\ - # find_cluster_template() when available in openstacksdk. return self.conn.get_cluster_template(name_or_id=name, - filters=filters, - detail=True) + filters=filters) def _update(self, cluster_template, update): attributes = update.get('attributes') if attributes: # TODO: Implement support for updates. - # TODO: Replace with self.conn.\ - # container_infrastructure_management.\ - # update_cluster_template() when available in openstacksdk. - # cluster_template = self.conn.update_cluster_template(...) + # cluster_template = self.conn.\ + # container_infrastructure_management.update_cluster_template(...) pass return cluster_template