From 5feadbef4a75b38b450820c9c5cc6e55e71e65fe Mon Sep 17 00:00:00 2001 From: Frederic Date: Mon, 25 Mar 2019 15:29:15 +0100 Subject: [PATCH] VMware: Tag various VMware objects (#54033) * tag portgroups and dvs * Add support for datacenter tagging * Support for tagging clusters * Hostsystem tag option * pep recommendations * Remove Vmware from VmwareDistributedSwitch object type * Fix typos in example tasks of vmware_tag_manager --- .../cloud/vmware/vmware_tag_manager.py | 59 +++++++++++++++++-- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/lib/ansible/modules/cloud/vmware/vmware_tag_manager.py b/lib/ansible/modules/cloud/vmware/vmware_tag_manager.py index 828e5297ff0..e4b1914785b 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_tag_manager.py +++ b/lib/ansible/modules/cloud/vmware/vmware_tag_manager.py @@ -24,6 +24,7 @@ description: version_added: 2.8 author: - Abhijeet Kasurde (@Akasurde) +- Frederic Van Reet (@GBrawl) notes: - Tested on vSphere 6.5 requirements: @@ -49,10 +50,11 @@ options: description: - Type of object to work with. required: True - choices: [ VirtualMachine ] + choices: [ VirtualMachine, Datacenter, ClusterComputeResource, HostSystem, DistributedVirtualSwitch, DistributedVirtualPortgroup ] object_name: description: - Name of the object to work with. + - For DistributedVirtualPortgroups the format should be "switch_name:portgroup_name" required: True extends_documentation_fragment: vmware_rest_client.documentation ''' @@ -72,7 +74,7 @@ EXAMPLES = r''' state: add delegate_to: localhost -- name: Remove a tag to a virtual machine +- name: Remove a tag from a virtual machine vmware_tag_manager: hostname: '{{ vcenter_hostname }}' username: '{{ vcenter_username }}' @@ -84,6 +86,32 @@ EXAMPLES = r''' object_type: VirtualMachine state: remove delegate_to: localhost + +- name: Add tags to a distributed virtual switch + vmware_tag_manager: + hostname: '{{ vcenter_hostname }}' + username: '{{ vcenter_username }}' + password: '{{ vcenter_password }}' + validate_certs: no + tag_names: + - Sample_Tag_0003 + object_name: Switch_0001 + object_type: DistributedVirtualSwitch + state: add + delegate_to: localhost + +- name: Add tags to a distributed virtual portgroup + vmware_tag_manager: + hostname: '{{ vcenter_hostname }}' + username: '{{ vcenter_username }}' + password: '{{ vcenter_password }}' + validate_certs: no + tag_names: + - Sample_Tag_0004 + object_name: Switch_0001:Portgroup_0001 + object_type: DistributedVirtualPortgroup + state: add + delegate_to: localhost ''' RETURN = r''' @@ -105,10 +133,9 @@ tag_status: ] } ''' - from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.vmware_rest_client import VmwareRestClient -from ansible.module_utils.vmware import PyVmomi +from ansible.module_utils.vmware import (PyVmomi, find_dvs_by_name, find_dvspg_by_name) try: from com.vmware.vapi.std_client import DynamicID from com.vmware.cis.tagging_client import Tag, TagAssociation, Category @@ -131,6 +158,26 @@ class VmwareTagManager(VmwareRestClient): if self.object_type == 'VirtualMachine': self.managed_object = self.pyv.get_vm_or_template(self.object_name) + if self.object_type == 'Datacenter': + self.managed_object = self.pyv.find_datacenter_by_name(self.object_name) + + if self.object_type == 'ClusterComputeResource': + self.managed_object = self.pyv.find_cluster_by_name(self.object_name) + + if self.object_type == 'HostSystem': + self.managed_object = self.pyv.find_hostsystem_by_name(self.object_name) + + if self.object_type == 'DistributedVirtualSwitch': + self.managed_object = find_dvs_by_name(self.pyv.content, self.object_name) + self.object_type = 'VmwareDistributedVirtualSwitch' + + if self.object_type == 'DistributedVirtualPortgroup': + dvs_name, pg_name = self.object_name.split(":", 1) + dv_switch = find_dvs_by_name(self.pyv.content, dvs_name) + if dv_switch is None: + self.module.fail_json(msg="A distributed virtual switch with name %s does not exist" % dvs_name) + self.managed_object = find_dvspg_by_name(dv_switch, pg_name) + if self.managed_object is None: self.module.fail_json(msg="Failed to find the managed object for %s with type %s" % (self.object_name, self.object_type)) @@ -222,7 +269,9 @@ def main(): tag_names=dict(type='list', required=True), state=dict(type='str', choices=['absent', 'add', 'present', 'remove', 'set'], default='add'), object_name=dict(type='str', required=True), - object_type=dict(type='str', required=True, choices=['VirtualMachine']), + object_type=dict(type='str', required=True, choices=['VirtualMachine', 'Datacenter', 'ClusterComputeResource', + 'HostSystem', 'DistributedVirtualSwitch', + 'DistributedVirtualPortgroup']), ) module = AnsibleModule(argument_spec=argument_spec)