diff --git a/ci/roles/server/tasks/main.yml b/ci/roles/server/tasks/main.yml index ba0c70d4..2809a575 100644 --- a/ci/roles/server/tasks/main.yml +++ b/ci/roles/server/tasks/main.yml @@ -241,40 +241,6 @@ name: "{{ server_name }}" wait: true -- name: Create server with tags - openstack.cloud.server: - cloud: "{{ cloud }}" - state: present - name: "{{ server_name }}" - image: "{{ image_name }}" - flavor: "{{ flavor_name }}" - network: "{{ server_network }}" - auto_ip: false - tags: - - first - - second - wait: true - register: server - -- debug: var=server - -- name: Get info about tags - openstack.cloud.server_info: - cloud: "{{ cloud }}" - server: "{{ server_name }}" - register: info - -- name: Check filter results - assert: - that: info.servers[0].tags == ["first", "second"] - -- name: Delete server with tags - openstack.cloud.server: - cloud: "{{ cloud }}" - state: absent - name: "{{ server_name }}" - wait: true - - name: Create server from volume openstack.cloud.server: cloud: "{{ cloud }}" @@ -433,6 +399,9 @@ - port-id: "{{ port.port.id }}" reuse_ips: false state: present + tags: + - first + - second wait: true register: server @@ -447,6 +416,7 @@ |selectattr('OS-EXT-IPS:type', 'equalto', 'floating') |map(attribute='addr') |list|length == 0 + - server.server.tags == ["first", "second"] - name: Find all floating ips for debugging openstack.cloud.floating_ip_info: @@ -488,6 +458,8 @@ - '{{ server_security_group }}' - '{{ server_alt_security_group }}' state: present + tags: + - yellow wait: true register: server_updated @@ -509,6 +481,7 @@ - server_updated.server.addresses[server_network]|length == 2 - port.port.fixed_ips[0].ip_address in server_updated.server.addresses[server_network]|map(attribute='addr') + - server_updated.server.tags == ['yellow'] # TODO: Verify networks once openstacksdk's issue #2010352 has been solved # Ref.: https://storyboard.openstack.org/#!/story/2010352 #- server_updated.server.addresses.public|length > 0 @@ -543,6 +516,8 @@ - '{{ server_security_group }}' - '{{ server_alt_security_group }}' state: present + tags: + - yellow wait: true register: server_updated_again @@ -551,6 +526,7 @@ that: - server.server.id == server_updated_again.server.id - server_updated_again is not changed + - server_updated_again.server.tags == ['yellow'] # TODO: Drop failure test once openstacksdk's issue #2010352 has been solved # Ref.: https://storyboard.openstack.org/#!/story/2010352 diff --git a/plugins/modules/server.py b/plugins/modules/server.py index 50cbfaaa..532fdbae 100644 --- a/plugins/modules/server.py +++ b/plugins/modules/server.py @@ -210,6 +210,7 @@ options: - A list of tags should be added to instance type: list elements: str + default: [] terminate_volume: description: - If C(true), delete volume when deleting the instance and if it has @@ -831,7 +832,7 @@ class ServerModule(OpenStackModule): scheduler_hints=dict(type='dict'), security_groups=dict(default=[], type='list', elements='str'), state=dict(default='present', choices=['absent', 'present']), - tags=dict(type='list', elements='str'), + tags=dict(type='list', default=[], elements='str'), terminate_volume=dict(default=False, type='bool'), userdata=dict(), volume_size=dict(type='int'), @@ -897,7 +898,8 @@ class ServerModule(OpenStackModule): return { **self._build_update_ips(server), **self._build_update_security_groups(server), - **self._build_update_server(server)} + **self._build_update_server(server), + **self._build_update_tags(server)} def _build_update_ips(self, server): auto_ip = self.params['auto_ip'] @@ -1037,6 +1039,13 @@ class ServerModule(OpenStackModule): return update + def _build_update_tags(self, server): + required_tags = self.params.get('tags') + if set(server["tags"]) == set(required_tags): + return {} + update = dict(tags=required_tags) + return update + def _create(self): for k in ['auto_ip', 'floating_ips', 'floating_ip_pools']: if self.params[k] \ @@ -1111,6 +1120,7 @@ class ServerModule(OpenStackModule): def _update(self, server, update): server = self._update_ips(server, update) server = self._update_security_groups(server, update) + server = self._update_tags(server, update) server = self._update_server(server, update) # Refresh server attributes after security groups etc. have changed # @@ -1183,6 +1193,16 @@ class ServerModule(OpenStackModule): # be postponed until all updates have been applied. return server + def _update_tags(self, server, update): + tags = update.get('tags') + + self.conn.compute.put( + "/servers/{server_id}/tags".format(server_id=server['id']), + json={"tags": tags}, + microversion="2.26" + ) + return server + def _parse_metadata(self, metadata): if not metadata: return {}