From a6b095756c3131a7493a48b4f5107f8a26f10d0c Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Wed, 26 Sep 2018 11:53:45 +0530 Subject: [PATCH] VMware: Add support for service type (#40651) * Add support for - Replication, Provisioning * Update documentation * Update example Fixes: #40529 Signed-off-by: Abhijeet Kasurde --- .../modules/cloud/vmware/vmware_vmkernel.py | 218 +++++++++++------- 1 file changed, 140 insertions(+), 78 deletions(-) diff --git a/lib/ansible/modules/cloud/vmware/vmware_vmkernel.py b/lib/ansible/modules/cloud/vmware/vmware_vmkernel.py index 5802ccf56e1..1a8bfb1ef6f 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_vmkernel.py +++ b/lib/ansible/modules/cloud/vmware/vmware_vmkernel.py @@ -26,7 +26,7 @@ version_added: 2.0 author: - Joseph Callen (@jcpowermac) - Russell Teague (@mtnbikenc) -- Abhijeet Kasurde (@Akasurde) +- Abhijeet Kasurde (@Akasurde) notes: - Tested on vSphere 5.5, 6.5 requirements: @@ -34,82 +34,89 @@ requirements: - PyVmomi options: vswitch_name: - description: - - The name of the vSwitch where to add the VMKernel interface. - - Required parameter only if C(state) is set to C(present). - - Optional parameter from version 2.5 and onwards. - required: False + description: + - The name of the vSwitch where to add the VMKernel interface. + - Required parameter only if C(state) is set to C(present). + - Optional parameter from version 2.5 and onwards. portgroup_name: - description: - - The name of the port group for the VMKernel interface. - required: True + description: + - The name of the port group for the VMKernel interface. + required: True network: - description: - - A dictionary of network details. - - 'Following parameter is required:' - - ' - C(type) (string): Type of IP assignment (either C(dhcp) or C(static)).' - - 'Following parameters are required in case of C(type) is set to C(static)' - - ' - C(ip_address) (string): Static IP address (implies C(type: static)).' - - ' - C(subnet_mask) (string): Static netmask required for C(ip).' - version_added: 2.5 + description: + - A dictionary of network details. + - 'Following parameter is required:' + - ' - C(type) (string): Type of IP assignment (either C(dhcp) or C(static)).' + - 'Following parameters are required in case of C(type) is set to C(static)' + - ' - C(ip_address) (string): Static IP address (implies C(type: static)).' + - ' - C(subnet_mask) (string): Static netmask required for C(ip).' + version_added: 2.5 ip_address: - description: - - The IP Address for the VMKernel interface. - - Use C(network) parameter with C(ip_address) instead. - - Deprecated option, will be removed in version 2.9. + description: + - The IP Address for the VMKernel interface. + - Use C(network) parameter with C(ip_address) instead. + - Deprecated option, will be removed in version 2.9. subnet_mask: - description: - - The Subnet Mask for the VMKernel interface. - - Use C(network) parameter with C(subnet_mask) instead. - - Deprecated option, will be removed in version 2.9. + description: + - The Subnet Mask for the VMKernel interface. + - Use C(network) parameter with C(subnet_mask) instead. + - Deprecated option, will be removed in version 2.9. vlan_id: - description: - - The VLAN ID for the VMKernel interface. - - Required parameter only if C(state) is set to C(present). - - Optional parameter from version 2.5 and onwards. - required: False - version_added: 2.0 + description: + - The VLAN ID for the VMKernel interface. + - Required parameter only if C(state) is set to C(present). + - Optional parameter from version 2.5 and onwards. + version_added: 2.0 mtu: - description: - - The MTU for the VMKernel interface. - - The default value of 1500 is valid from version 2.5 and onwards. - required: False - default: 1500 + description: + - The MTU for the VMKernel interface. + - The default value of 1500 is valid from version 2.5 and onwards. + default: 1500 enable_vsan: - description: - - Enable the VMKernel interface for VSAN traffic. - required: False - type: bool + description: + - Enable the VMKernel interface for VSAN traffic. + type: bool enable_vmotion: - description: - - Enable the VMKernel interface for vMotion traffic. - required: False - type: bool + description: + - Enable the VMKernel interface for vMotion traffic. + type: bool enable_mgmt: - description: - - Enable the VMKernel interface for Management traffic. - required: False - type: bool + description: + - Enable the VMKernel interface for Management traffic. + type: bool enable_ft: - description: - - Enable the VMKernel interface for Fault Tolerance traffic. - required: False - type: bool + description: + - Enable the VMKernel interface for Fault Tolerance traffic. + type: bool + enable_provisioning: + description: + - Enable the VMKernel interface for provisioning service. + type: bool + version_added: 2.8 + enable_replication: + description: + - Enable the VMKernel interface for vSphere replication service. + type: bool + version_added: 2.8 + enable_replication_nfc: + description: + - Enable the VMKernel interface for vSphere replication NFC service. + type: bool + version_added: 2.8 state: - description: - - If set to C(present), VMKernel is created with the given specifications. - - If set to C(absent), VMKernel is removed from the given configurations. - - If set to C(present) and VMKernel exists then VMKernel configurations are updated. - required: False - choices: [ present, absent ] - default: present - version_added: 2.5 + description: + - If set to C(present), VMKernel is created with the given specifications. + - If set to C(absent), VMKernel is removed from the given configurations. + - If set to C(present) and VMKernel exists then VMKernel configurations are updated. + choices: [ present, absent ] + default: present + version_added: 2.5 esxi_hostname: - description: - - Name of ESXi host to which VMKernel is to be managed. - - "From version 2.5 onwards, this parameter is required." - required: True - version_added: 2.5 + description: + - Name of ESXi host to which VMKernel is to be managed. + - "From version 2.5 onwards, this parameter is required." + required: True + version_added: 2.5 extends_documentation_fragment: vmware.documentation ''' @@ -161,7 +168,9 @@ result: description: metadata about VMKernel name returned: always type: dict - sample: { results : "vmk1" } + sample: { + results : "vmk1" + } ''' try: @@ -186,6 +195,10 @@ class PyVmomiHelper(PyVmomi): self.enable_vmotion = self.params['enable_vmotion'] self.enable_mgmt = self.params['enable_mgmt'] self.enable_ft = self.params['enable_ft'] + self.enable_provisioning = self.params['enable_provisioning'] + self.enable_replication = self.params['enable_replication'] + self.enable_replication_nfc = self.params['enable_replication_nfc'] + self.vswitch_name = self.params['vswitch_name'] self.vlan_id = self.params['vlan_id'] @@ -210,7 +223,7 @@ class PyVmomiHelper(PyVmomi): def get_port_group_by_name(self, host_system, portgroup_name): """ - Function to get specific port group by given name + Get specific port group by given name Args: host_system: Name of Host System portgroup_name: Name of Port Group @@ -227,7 +240,7 @@ class PyVmomiHelper(PyVmomi): def ensure(self): """ - Function to manage internal VMKernel management + Manage internal VMKernel management Returns: NA """ @@ -255,7 +268,7 @@ class PyVmomiHelper(PyVmomi): def get_vmkernel(self, port_group_name=None): """ - Function to check if vmkernel + Check if vmkernel available or not Args: port_group_name: name of port group @@ -270,7 +283,7 @@ class PyVmomiHelper(PyVmomi): def check_state(self): """ - Function to check internal state management + Check internal state management Returns: Present if found, absent if not, update if change in fields """ @@ -308,11 +321,24 @@ class PyVmomiHelper(PyVmomi): if (self.enable_vsan and self.vnic.device not in service_type_vmks['vsan']) or \ (not self.enable_vsan and self.vnic.device in service_type_vmks['vsan']): state = 'update' + + if (self.enable_provisioning and self.vnic.device not in service_type_vmks['vSphereProvisioning']) or \ + (not self.enable_provisioning and self.vnic.device in service_type_vmks['vSphereProvisioning']): + state = 'update' + + if (self.enable_replication and self.vnic.device not in service_type_vmks['vSphereReplication']) or \ + (not self.enable_provisioning and self.vnic.device in service_type_vmks['vSphereReplication']): + state = 'update' + + if (self.enable_replication_nfc and self.vnic.device not in service_type_vmks['vSphereReplicationNFC']) or \ + (not self.enable_provisioning and self.vnic.device in service_type_vmks['vSphereReplicationNFC']): + state = 'update' + return state def host_vmk_delete(self): """ - Function to delete VMKernel + Delete VMKernel Returns: NA """ @@ -336,7 +362,7 @@ class PyVmomiHelper(PyVmomi): def host_vmk_unchange(self): """ - Function to denote no change in VMKernel + Denote no change in VMKernel Returns: NA """ @@ -402,6 +428,21 @@ class PyVmomiHelper(PyVmomi): elif not self.enable_ft and self.vnic.device in service_type_vmk['faultToleranceLogging']: results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='faultToleranceLogging', operation='deselect') + if self.enable_provisioning and self.vnic.device not in service_type_vmk['vSphereProvisioning']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereProvisioning') + elif not self.enable_provisioning and self.vnic.device in service_type_vmk['vSphereProvisioning']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereProvisioning', operation='deselect') + + if self.enable_replication and self.vnic.device not in service_type_vmk['vSphereReplication']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereReplication') + elif not self.enable_replication and self.vnic.device in service_type_vmk['vSphereReplication']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereReplication', operation='deselect') + + if self.enable_replication_nfc and self.vnic.device not in service_type_vmk['vSphereReplicationNFC']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereReplicationNFC') + elif not self.enable_replication_nfc and self.vnic.device in service_type_vmk['vSphereReplicationNFC']: + results['changed'] = self.set_service_type(vnic_manager=vnic_manager, vmk=self.vnic, service_type='vSphereReplicationNFC', operation='deselect') + if self.enable_vsan and self.vnic.device not in service_type_vmk['vsan']: results['changed'], results['result'] = self.set_vsan_service_type() elif not self.enable_vsan and self.vnic.device in service_type_vmk['vsan']: @@ -412,7 +453,7 @@ class PyVmomiHelper(PyVmomi): def set_vsan_service_type(self): """ - Function to set VSAN service type + Set VSAN service type Returns: True and result for success, False and result for failure """ @@ -435,7 +476,7 @@ class PyVmomiHelper(PyVmomi): def host_vmk_create(self): """ - Function to create VMKernel + Create VMKernel Returns: NA """ @@ -489,11 +530,20 @@ class PyVmomiHelper(PyVmomi): if self.enable_ft: results['changed'] = self.set_service_type(host_vnic_manager, self.vnic, 'faultToleranceLogging') + if self.enable_provisioning: + results['changed'] = self.set_service_type(host_vnic_manager, self.vnic, 'vSphereProvisioning') + + if self.enable_replication: + results['changed'] = self.set_service_type(host_vnic_manager, self.vnic, 'vSphereReplication') + + if self.enable_replication_nfc: + results['changed'] = self.set_service_type(host_vnic_manager, self.vnic, 'vSphereReplicationNFC') + self.module.exit_json(**results) def set_service_type(self, vnic_manager, vmk, service_type, operation='select'): """ - Function to set service type to given VMKernel + Set service type to given VMKernel Args: vnic_manager: Virtual NIC manager object vmk: VMkernel managed object @@ -521,11 +571,20 @@ class PyVmomiHelper(PyVmomi): def get_all_vmks_by_service_type(self): """ - Function to return information about service types and VMKernel + Return information about service types and VMKernel Returns: Dictionary of service type as key and VMKernel list as value """ - service_type_vmk = dict(vmotion=[], vsan=[], management=[], faultToleranceLogging=[]) + service_type_vmk = dict( + vmotion=[], + vsan=[], + management=[], + faultToleranceLogging=[], + vSphereProvisioning=[], + vSphereReplication=[], + vSphereReplicationNFC=[], + ) + for service_type in service_type_vmk.keys(): vmks_list = self.query_service_type_for_vmks(service_type) service_type_vmk[service_type] = vmks_list @@ -533,7 +592,7 @@ class PyVmomiHelper(PyVmomi): def query_service_type_for_vmks(self, service_type): """ - Function to return list of VMKernels + Return list of VMKernels Args: service_type: Name of service type @@ -573,6 +632,9 @@ def main(): enable_vmotion=dict(required=False, type='bool'), enable_mgmt=dict(required=False, type='bool'), enable_ft=dict(required=False, type='bool'), + enable_provisioning=dict(type='bool'), + enable_replication=dict(type='bool'), + enable_replication_nfc=dict(type='bool'), vswitch_name=dict(required=False, type='str'), vlan_id=dict(required=False, type='int'), state=dict(type='str',