diff --git a/lib/ansible/modules/cloud/ovirt/ovirt_tags.py b/lib/ansible/modules/cloud/ovirt/ovirt_tags.py index 7f0a9e15b3..8c382f07a3 100644 --- a/lib/ansible/modules/cloud/ovirt/ovirt_tags.py +++ b/lib/ansible/modules/cloud/ovirt/ovirt_tags.py @@ -40,8 +40,9 @@ options: required: true state: description: - - "Should the tag be present or absent." - choices: ['present', 'absent'] + - "Should the tag be present/absent/attached/detached." + - "C(Note): I(attached) and I(detached) states are supported since version 2.4." + choices: ['present', 'absent', 'attached', 'detached'] default: present description: description: @@ -69,6 +70,20 @@ EXAMPLES = ''' - vm1 - vm2 +# Attach a tag to VM 'vm1', keeping the rest already attached tags on VM: +- ovirt_tags: + name: mytag + state: attached + vms: + - vm3 + +# Detach a tag from VM 'vm1', keeping the rest already attached tags on VM: +- ovirt_tags: + name: mytag + state: detached + vms: + - vm3 + # To detach all VMs from tag: - ovirt_tags: name: mytag @@ -106,8 +121,8 @@ from ansible.module_utils.ovirt import ( check_sdk, create_connection, equal, + get_id_by_name, ovirt_full_argument_spec, - search_by_name, ) @@ -129,34 +144,45 @@ class TagsModule(BaseModule): if self._module.params[name] is None: return + state = self.param('state') entities_service = getattr(self._connection.system_service(), '%s_service' % name)() current_vms = [ vm.name for vm in entities_service.list(search='tag=%s' % self._module.params['name']) ] # Assign tags: - for entity_name in self._module.params[name]: - entity = search_by_name(entities_service, entity_name) - tags_service = entities_service.service(entity.id).tags_service() - current_tags = [tag.name for tag in tags_service.list()] - # Assign the tag: - if self._module.params['name'] not in current_tags: - if not self._module.check_mode: - tags_service.add( - tag=otypes.Tag( - name=self._module.params['name'], - ), - ) - self.changed = True + if state in ['present', 'attached', 'detached']: + for entity_name in self._module.params[name]: + entity_id = get_id_by_name(entities_service, entity_name) + tags_service = entities_service.service(entity_id).tags_service() + current_tags = [tag.name for tag in tags_service.list()] + # Assign the tag: + if state in ['attached', 'present']: + if self._module.params['name'] not in current_tags: + if not self._module.check_mode: + tags_service.add( + tag=otypes.Tag( + name=self._module.params['name'], + ), + ) + self.changed = True + # Detach the tag: + elif state == 'detached': + if self._module.params['name'] in current_tags: + tag_id = get_id_by_name(tags_service, self.param('name')) + if not self._module.check_mode: + tags_service.tag_service(tag_id).remove() + self.changed = True # Unassign tags: - for entity_name in [e for e in current_vms if e not in self._module.params[name]]: - if not self._module.check_mode: - entity = search_by_name(entities_service, entity_name) - tags_service = entities_service.service(entity.id).tags_service() - tag_id = [tag.id for tag in tags_service.list() if tag.name == self._module.params['name']][0] - tags_service.tag_service(tag_id).remove() - self.changed = True + if state == 'present': + for entity_name in [e for e in current_vms if e not in self._module.params[name]]: + if not self._module.check_mode: + entity_id = get_id_by_name(entities_service, entity_name) + tags_service = entities_service.service(entity_id).tags_service() + tag_id = get_id_by_name(tags_service, self.param('name')) + tags_service.tag_service(tag_id).remove() + self.changed = True def _get_parent(self, entity): parent = None @@ -176,7 +202,7 @@ class TagsModule(BaseModule): def main(): argument_spec = ovirt_full_argument_spec( state=dict( - choices=['present', 'absent'], + choices=['present', 'absent', 'attached', 'detached'], default='present', ), name=dict(default=None, required=True), @@ -202,7 +228,7 @@ def main(): ) state = module.params['state'] - if state == 'present': + if state in ['present', 'attached', 'detached']: ret = tags_module.create() elif state == 'absent': ret = tags_module.remove()