
    Vh<                         d dl mZmZmZ eZdZdZdZ	 d dl	m
Z
mZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d d	lmZ  G d
 de      Zd Zedk(  r e        yy# e$ r Y Ew xY w)    )absolute_importdivisionprint_functional  
---
module: vmware_vmkernel
short_description: Manages a VMware VMkernel Adapter of an ESXi host.
description:
    - This module can be used to manage the VMKernel adapters / VMKernel network interfaces of an ESXi host.
    - The module assumes that the host is already configured with the Port Group in case of a vSphere Standard Switch (vSS).
    - The module assumes that the host is already configured with the Distributed Port Group in case of a vSphere Distributed Switch (vDS).
    - The module automatically migrates the VMKernel adapter from vSS to vDS or vice versa if present.
author:
- Joseph Callen (@jcpowermac)
- Russell Teague (@mtnbikenc)
- Abhijeet Kasurde (@Akasurde)
- Christian Kotte (@ckotte)
- Nina Loser (@Nina2244)
notes:
    - The option O(device) need to be used with DHCP because otherwise it's not possible to check if a VMkernel device is already present
    - You can only change from DHCP to static, and vSS to vDS, or vice versa, in one step, without creating a new device, with O(device) specified.
    - You can only create the VMKernel adapter on a vDS if authenticated to vCenter and not if authenticated to ESXi.
options:
    vswitch_name:
      description:
      - The name of the vSwitch where to add the VMKernel interface.
      - Required parameter only if O(state=present).
      - Optional parameter from version 2.5 and onwards.
      type: str
      aliases: ['vswitch']
    dvswitch_name:
      description:
      - The name of the vSphere Distributed Switch (vDS) where to add the VMKernel interface.
      - Required parameter only if O(state=present).
      - Optional parameter from version 2.8 and onwards.
      type: str
      aliases: ['dvswitch']
    portgroup_name:
      description:
      - The name of the port group for the VMKernel interface.
      required: true
      aliases: ['portgroup']
      type: str
    network:
      description:
      - A dictionary of network details.
      suboptions:
        type:
            type: str
            description:
            - Type of IP assignment.
            choices: [ 'static', 'dhcp' ]
            default: 'static'
        ip_address:
            type: str
            description:
            - Static IPv4 address.
            - Required if O(network.type=static) and O(state=present).
        subnet_mask:
            type: str
            description:
            - Static IPv4 netmask.
            - Required if O(network.type=static) and O(state=present).
        default_gateway:
            type: str
            description: Default IPv4 gateway (Override default gateway for this adapter).
        tcpip_stack:
            type: str
            description:
            - The TCP/IP stack for the VMKernel interface.
            choices: [ 'default', 'provisioning', 'vmotion', 'vxlan' ]
            default: 'default'
      type: dict
      default: {
          type: 'static',
          tcpip_stack: 'default',
      }
    mtu:
      description:
      - The MTU for the VMKernel interface.
      - The default value of 1500 is valid from version 2.5 and onwards.
      default: 1500
      type: int
    device:
      description:
      - Search VMkernel adapter by device name.
      - The parameter is required only in case of O(network.type=dhcp).
      type: str
    enable_vsan:
      description:
      - Enable VSAN traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_vmotion:
      description:
      - Enable vMotion traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      - You cannot enable vMotion on an additional adapter if you already have an adapter with the vMotion TCP/IP stack configured.
      type: bool
      default: false
    enable_mgmt:
      description:
      - Enable Management traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_ft:
      description:
      - Enable Fault Tolerance traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_provisioning:
      description:
      - Enable Provisioning traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_replication:
      description:
      - Enable vSphere Replication traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_replication_nfc:
      description:
      - Enable vSphere Replication NFC traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    enable_backup_nfc:
      version_added: 4.2.0
      description:
      - Enable vSphere Backup NFC traffic on the VMKernel adapter.
      - This option is only allowed if the default TCP/IP stack is used.
      type: bool
      default: false
    state:
      description:
      - If set to V(present), the VMKernel adapter will be created with the given specifications.
      - If set to V(absent), the VMKernel adapter will be removed.
      - If set to V(present) and VMKernel adapter exists, the configurations will be updated.
      choices: [ present, absent ]
      default: present
      type: str
    esxi_hostname:
      description:
      - Name of ESXi host to which VMKernel is to be managed.
      required: true
      type: str
extends_documentation_fragment:
- community.vmware.vmware.documentation

a
  
-  name: Add Management vmkernel port using static network type
   community.vmware.vmware_vmkernel:
      hostname: '{{ esxi_hostname }}'
      username: '{{ esxi_username }}'
      password: '{{ esxi_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      vswitch_name: vSwitch0
      portgroup_name: PG_0001
      network:
        type: 'static'
        ip_address: 192.168.127.10
        subnet_mask: 255.255.255.0
      state: present
      enable_mgmt: true
   delegate_to: localhost

-  name: Add Management vmkernel port using DHCP network type
   community.vmware.vmware_vmkernel:
      hostname: '{{ esxi_hostname }}'
      username: '{{ esxi_username }}'
      password: '{{ esxi_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      vswitch_name: vSwitch0
      portgroup_name: PG_0002
      state: present
      network:
        type: 'dhcp'
      enable_mgmt: true
   delegate_to: localhost

-  name: Change IP allocation from static to dhcp
   community.vmware.vmware_vmkernel:
      hostname: '{{ esxi_hostname }}'
      username: '{{ esxi_username }}'
      password: '{{ esxi_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      vswitch_name: vSwitch0
      portgroup_name: PG_0002
      state: present
      device: vmk1
      network:
        type: 'dhcp'
      enable_mgmt: true
   delegate_to: localhost

-  name: Delete VMkernel port
   community.vmware.vmware_vmkernel:
      hostname: '{{ esxi_hostname }}'
      username: '{{ esxi_username }}'
      password: '{{ esxi_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      vswitch_name: vSwitch0
      portgroup_name: PG_0002
      state: absent
   delegate_to: localhost

-  name: Add Management vmkernel port to Distributed Switch
   community.vmware.vmware_vmkernel:
      hostname: '{{ vcenter_hostname }}'
      username: '{{ vcenter_username }}'
      password: '{{ vcenter_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      dvswitch_name: dvSwitch1
      portgroup_name: dvPG_0001
      network:
        type: 'static'
        ip_address: 192.168.127.10
        subnet_mask: 255.255.255.0
      state: present
      enable_mgmt: true
   delegate_to: localhost

-  name: Add vMotion vmkernel port with vMotion TCP/IP stack
   community.vmware.vmware_vmkernel:
      hostname: '{{ vcenter_hostname }}'
      username: '{{ vcenter_username }}'
      password: '{{ vcenter_password }}'
      esxi_hostname: '{{ esxi_hostname }}'
      dvswitch_name: dvSwitch1
      portgroup_name: dvPG_0001
      network:
        type: 'static'
        ip_address: 192.168.127.10
        subnet_mask: 255.255.255.0
        tcpip_stack: vmotion
      state: present
   delegate_to: localhost
a  
result:
    description: metadata about VMKernel name
    returned: always
    type: dict
    sample: {
        "changed": false,
        "msg": "VMkernel Adapter already configured properly",
        "device": "vmk1",
        "ipv4": "static",
        "ipv4_gw": "No override",
        "ipv4_ip": "192.168.1.15",
        "ipv4_sm": "255.255.255.0",
        "mtu": 9000,
        "services": "vMotion",
        "switch": "vDS"
    }
)vimvmodl)AnsibleModule)PyVmomi	TaskErrorwait_for_taskfind_dvspg_by_namefind_dvs_by_nameget_all_objs)base_argument_spec)	to_nativec                        e Zd ZdZ fdZd Zd ZddZd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZddZd Zd Zd Zed        Z xZS )PyVmomiHelperz=Class to manage VMkernel configuration of an ESXi host systemc                 	   t         t        |   |       | j                  d   r| j                  d   j	                  d      | _        | j                  d   j	                  dd       | _        | j                  d   j	                  dd       | _        | j                  d   j	                  dd       | _        | j                  d   j	                  d      | _	        | j                  d   | _
        | j
                  dk(  r| j                  s|j                  d	
       | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j                  d   | _        | j3                  | j0                        }|r|d   | _        n| j6                  j                  d
       | j
                  dk(  rZ| j6                  j                  d   dk(  rn=| j                  s|j                  d
       n| j                  s|j                  d
       | j*                  rq| j9                  | j4                  | j.                  | j*                         | _        | j:                  s|j                  d!| j.                  d"| j*                  d#
       n| j,                  rt=        | j>                  | j,                        | _         | j@                  s|j                  d$| j,                  z  
       tC        | j@                  | j.                        | _        | j:                  s-|j                  d!| j.                  d%| j,                  d#
       | j                  r"| jE                  | j                  &      | _#        y | jI                  | j.                  '      | _#        | jF                  s2| j
                  dk(  r"| jK                  | j                  (      | _#        y y y ))Nnetworktype
ip_addresssubnet_maskdefault_gatewaytcpip_stackdevicedhcpzAdevice is a required parameter when network type is set to 'dhcp'msgmtuenable_vsanenable_vmotionenable_mgmt	enable_ftenable_provisioningenable_replicationenable_replication_nfcenable_backup_nfcvswitch_namedvswitch_nameportgroup_nameesxi_hostname)esxi_host_namer   zCFailed to get details of ESXi server. Please specify esxi_hostname.staticstateabsentzGip_address is a required parameter when network type is set to 'static'zHsubnet_mask is a required parameter when network type is set to 'static')host_systemr)   r'   zPortgroup 'z' not found on vSS ''zvDS '%s' not foundz' not found on vDS 'device_name)port_group_name)r   )&superr   __init__paramsgetnetwork_typer   r   r   r   r   	fail_jsonr   r   r    r!   r"   r#   r$   r%   r&   r'   vds_namer3   r+   get_all_host_objsesxi_host_objmoduleget_port_group_by_nameport_group_objr   contentdv_switch_objr   get_vmkernel_by_devicevnicget_vmkernel_by_portgroup_newget_vmkernel_by_ip)selfr=   hosts	__class__s      t/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/vmware/plugins/modules/vmware_vmkernel.pyr5   zPyVmomiHelper.__init__%  s   mT+F3;;y! $I 6 : :6 BD"kk)488tLDO#{{9599-ND#';;y#9#=#=>OQU#VD #{{9599-HDkk(+&t{{!de;;u%;;}5"kk*:;;;}5[1#';;/D#E "&++.B"C&*kk2J&K#!%-@!A KK7O4#{{+;<"kk/:&&d6I6I&J!&qDKK!!Y "  ({{!!'*h6__  %n o%%  %o p "&"="= ..#33!.. #> #D
 &&  tOcOceievev%w x]]!1$,,!ND%%  %9DMM%I J"4T5G5GI]I]"^D&&  tOcOceierer%s t ;;333LDI ::4K_K_:`DI99!2!2h!> 33t3O	 "?9    c                     | j                  |      }|D ]9  }|j                  j                  |k(  s|j                  j                  |k(  s7|c S  y)a  
        Get specific port group by given name
        Args:
            host_system: Name of Host System
            portgroup_name: Name of Port Group
            vswitch_name: Name of the vSwitch

        Returns: List of port groups by given specifications

        r/   N)get_all_port_groups_by_hostspecvswitchNamename)rF   r/   r)   r'   
portgroups	portgroups         rI   r>   z$PyVmomiHelper.get_port_group_by_namej  sU     55+5N
# 	!I~~))\9inn>Q>QUc>c  	! rJ   c                    | j                   | j                  d| j                  | j                  dd}	  || j                  j
                  d      | j                                    y# t        j                  $ r9}| j                  j                  t        |j                               Y d}~yd}~wt        j                  $ r9}| j                  j                  t        |j                               Y d}~yd}~ww xY w)zJ
        Manage internal VMKernel management
        Returns: NA

        )presentr.   )r.   rT   r-   r   N)host_vmk_deletehost_vmk_unchangehost_vmk_updatehost_vmk_creater=   r6   check_stater   RuntimeFaultr9   r   r   MethodFault)rF   host_vmk_statesruntime_faultmethod_faults       rI   ensurezPyVmomiHelper.ensure|  s      //00
  //..	
	CLODKK..w789I9I9KLN!! 	DKK!!i0A0A&B!CC   	CKK!!i0@0@&A!BB	Cs#   2A( (C>;/B//C>/C99C>c                 2   | j                   j                  j                  j                  D ][  }|j                  j
                  |k(  r|c S 	 |j                  j                  j                  | j                  j                  k(  r|c S ] y# t        $ r Y jw xY w)z
        Check if vmkernel available or not
        Args:
            port_group_name: name of port group

        Returns: vmkernel managed object if vmkernel found, false if not

        F)r<   configr   rC   rN   rR   distributedVirtualPortportgroupKeyr?   keyAttributeError)rF   r3   rC   s      rI   rD   z+PyVmomiHelper.get_vmkernel_by_portgroup_new  s     &&--55:: 		Dyy""o59933@@DDWDWD[D[[K \		  " s   8B

	BBc                     | j                   j                  j                  j                  D ])  }|j                  j
                  j                  |k(  s'|c S  y)z
        Check if vmkernel available or not
        Args:
            ip_address: IP address of vmkernel device

        Returns: vmkernel managed object if vmkernel found, false if not

        N)r<   ra   r   rC   rN   ip	ipAddress)rF   r   rC   s      rI   rE   z PyVmomiHelper.get_vmkernel_by_ip  sK     &&--55:: 	Dyy||%%3	 rJ   c                     | j                   j                  j                  j                  D ]  }|j                  |k(  s|c S  y)z
        Check if vmkernel available or not
        Args:
            device_name: name of vmkernel device

        Returns: vmkernel managed object if vmkernel found, false if not

        N)r<   ra   r   rC   r   )rF   r2   rC   s      rI   rB   z$PyVmomiHelper.get_vmkernel_by_device  sA     &&--55:: 	D{{k)	 rJ   c                 "    | j                   rdS dS )zl
        Check internal state management
        Returns: Present if found and absent if not found

        rT   r.   )rC   rF   s    rI   rY   zPyVmomiHelper.check_state  s     !IIy383rJ   c                    t        dd      }| j                  j                  }	 | j                  j                  rd|d<   n4| j
                  j                  j                  j                  |       d|d<   d|d<   ||d	<    | j                  j                   di | y# t        j                  j                  $ r<}| j                  j                  d
t        |j                        z         Y d}~qd}~wt        j                  j                  $ r<}| j                  j                  dt        |j                        z         Y d}~d}~ww xY w)z6
        Delete VMKernel
        Returns: NA

        F changedr   z!VMkernel Adapter would be deletedr   zVMkernel Adapter deletedTro   r   z&Failed to find vmk to delete due to %sr   Nz0Failed to delete vmk due host config issues : %s )dictrC   r   r=   
check_moder<   configManagernetworkSystemRemoveVirtualNicr   faultNotFoundr9   r   r   HostConfigFault	exit_json)rF   results
vmk_device	not_foundhost_config_faults        rI   rU   zPyVmomiHelper.host_vmk_delete  s%    u"-YY%%
	{{%%!D""00>>OOPZ[!;!%GI *GH 	(( yy!! 	KK!!<)--() "   yy(( 	KK!!F+//01 "  	s$   AB E92C00 E2EEc                 <    | j                   j                  d       y)zC
        Denote no change in VMKernel
        Returns: NA

        F)ro   N)r=   ry   rk   s    rI   rV   zPyVmomiHelper.host_vmk_unchange  s     	e,rJ   c                 ,#   dx}x}x}x}x}x}x}x}x}	x}
x}}g }t        dd      }| j                  |d<   | j                  | j                        }| j                  j                  j
                  |k7  r| j                  j                  d       | j                  |d<   | j                  j                  j                  | j                  k7  r6d}|j                  d	       | j                  j                  j                  |d
<   | j                  |d<   | j                  |d<   | j                  |d<   | j                  r| j                  |d<   nd|d<   | j                  j                  j                  j                  r'| j                  dk(  rd}|j                  d       d|d<   | j                  j                  j                  j                  s?| j                  dk(  rd}|j                  d       d|d<   n| j                  dk(  r| j                  | j                  j                  j                  j                   k7  r@d}|j                  d       | j                  j                  j                  j                   |d<   | j                  | j                  j                  j                  j"                  k7  r@d}|j                  d       | j                  j                  j                  j"                  |d<   | j                  r	 | j                  | j                  j                  j$                  j&                  j(                  k7  rJd}|j                  d       | j                  j                  j$                  j&                  j(                  |d<   n	 | j                  j                  j$                  j&                  j(                  rJd}|j                  d       | j                  j                  j$                  j&                  j(                  |d<   | j,                  |d<   d}| j.                  r| j.                  |d<   	 | j                  j                  j0                  j2                  r=d}|j                  d       | j                  j                  j0                  j2                  }|r| j5                  |      |d<   t7        | j8                  |d         | _        | j=                  | j:                  | j                  j                  j0                  j>                        |d <   nH| j@                  r;| j@                  |d<   	 | j                  j                  j0                  j2                  | j:                  jB                  k7  r=d}|j                  d       | j                  j                  j0                  j2                  }|r| j5                  |      |d<   | j                  j                  jD                  |d <   | jG                  | jH                  !      }|D ]S  }|j                  jJ                  | j                  j                  jD                  k(  s;|j                  jL                  |d<   U | jO                         |d"<   | j                  j                  j
                  d#k(  r| jQ                         }| jR                  r| j                  jT                  |d$   vs'| jR                  s| j                  jT                  |d$   v rdx}}| jV                  r| j                  jT                  |d%   vs'| jV                  s| j                  jT                  |d%   v rdx}}| jX                  r| j                  jT                  |d&   vs'| jX                  s| j                  jT                  |d&   v rdx}}| jZ                  r| j                  jT                  |d'   vs'| jZ                  s| j                  jT                  |d'   v rdx}}| j\                  r| j                  jT                  |d(   vs'| j\                  s| j                  jT                  |d(   v rdx}}	| j^                  r| j                  jT                  |d)   vs'| j^                  s| j                  jT                  |d)   v rdx}}
| j`                  r| j                  jT                  |d*   vs'| j`                  s| j                  jT                  |d*   v rdx}}| jb                  r| j                  jT                  |d+   vs'| jb                  s| j                  jT                  |d+   v rdx}}|r|j                  d"       |s|s|r-d}| j                  jd                  rd,}nd-}tg        |      d.kD  r'd/ji                  |dd0       d1z   tk        |d0         z   }n3tg        |      d.k(  rd2ji                  |      }ntg        |      d3k(  r|d4   }d5z   |z   }|s|rytl        jn                  jp                  js                         }tl        jn                  ju                         }| j                  dk(  r	d|_        nd|_        | j                  |_        | j                  |_        | j                  rtl        jn                  jp                  jw                         |_        tl        jn                  jy                         |j$                  _        | j                  |j$                  j&                  _        nZtl        jn                  jp                  jw                         |_        tl        jn                  jy                         |j$                  _        ||_        | j                  |_        |r| j.                  r| j,                  |_"        ny| j@                  rmtl        jz                  j}                         |_        | j:                  jB                  |j0                  _        | j~                  j                  |j0                  _        	 | j                  jd                  sD| jH                  j                  j                  j                  | j                  jT                  |       |r!|j                  d:       g }| jH                  j                  j                  }|r[| j                  jT                  d%   v r|j                  d;       | jV                  rd<nd=}| j                  || j                  d%|>       |r[| j                  jT                  d$   v r|j                  d?       | jR                  rd<nd=}| j                  || j                  d$|>       |r[| j                  jT                  d&   v r|j                  d@       | jX                  rd<nd=}| j                  || j                  d&|>       |	r[| j                  jT                  d(   v r|j                  dA       | j\                  rd<nd=}| j                  || j                  d(|>       |
r[| j                  jT                  d)   v r|j                  dB       | j^                  rd<nd=}| j                  || j                  d)|>       |r[| j                  jT                  d*   v r|j                  dC       | j`                  rd<nd=}| j                  || j                  d*|>       |r[| j                  jT                  d+   v r|j                  dD       | jb                  rd<nd=}| j                  || j                  d+|>       |rJ| j                  jT                  d'   v r|j                  dE       | j                  | jZ                        |d'<   d/ji                  |      |dF<   ndG}||dH<   ||dI<   | j                  jT                  |dJ<    | j                  j                  dKi | y# t*        $ r d}|j                  d       d|d<   Y w xY w# t*        $ r Y w xY w# t*        $ r Y jw xY w# t*        $ r d}|j                  d       Y 
tw xY w# tl        j                  j                  $ r=}| j                  j                  d6t        |j                        z         Y d}~$d}~wtl        j                  j                  $ r=}| j                  j                  d7t        |j                        z         Y d}~|d}~wtl        j                  j                  $ r=}| j                  j                  d8t        |j                        z         Y d}~d}~wt        j                  j                  $ r=}| j                  j                  d9t        |j                        z         Y d}~,d}~ww xY w)LzL
        Update VMKernel with given parameters
        Returns: NA

        Frm   rn   r   zCThe TCP/IP stack cannot be changed on an existing VMkernel adapter!r   r   TMTUmtu_previousipv4ipv4_ipipv4_smipv4_gwNo overrider,   zIPv4 settingsDHCPipv4_previousr   IPipv4_ip_previousSMipv4_sm_previouszGW overrideipv4_gw_previousrR   NswitchzVirtual Portswitch_previousportgroup_previousrL   servicesdefaultTcpipStackvmotion
managementfaultToleranceLoggingvsanvSphereProvisioningvSphereReplicationvSphereReplicationNFCvSphereBackupNFCz would be updatedz updated   , z, and z and    r   zVMkernel Adapter zBFailed to update vmk as virtual network adapter cannot be found %sz3Failed to update vmk due to host config issues : %szMFailed to update vmk as ipv6 address is specified in an ipv4 only system : %szuFailed to update vmk as IP address or Subnet Mask in the IP configurationare invalid or PortGroup does not exist : %sServicesMgmtselectdeselect)vnic_managervmkservice_type	operationvMotionFTProvReplRepl_NFC
Backup_NFCVSANservices_previousz,VMkernel Adapter already configured properlyro   r   r   rp   )Prq   r   get_api_net_stack_instancerC   rN   netStackInstanceKeyr=   r9   r   appendr8   r   r   r   rg   r   rh   
subnetMaskipRouteSpecipRouteConfigdefaultGatewayre   r3   r'   rb   
switchUuidfind_dvs_by_uuidr   r@   rA   find_dvspg_by_keyrc   r:   uuidrR   rM   r<   rP   rO   create_enabled_services_stringget_all_vmks_by_service_typer    r   r!   r"   r   r#   r$   r%   r&   rr   lenjoinstrr   host
VirtualNicSpecificationIpConfigIpRouteSpecIpRouteConfigdvsPortConnectionr?   rd   rs   rt   UpdateVirtualNicrv   rw   r   r   rx   InvalidStater   InvalidArgumentvirtualNicManagerset_service_typeset_vsan_service_typery   )rF   ro   changed_settingschanged_vdschanged_serviceschanged_service_vmotionchanged_service_mgmtchanged_service_ftchanged_service_vsanchanged_service_provchanged_service_repchanged_service_rep_nfcchanged_service_backup_nfcchanged_listrz   net_stack_instance_keydvs_uuidrQ   rR   service_type_vmkschanged_suffixmessagevnic_configip_specr|   r}   invalid_stateinvalid_argr   r   r   s                                  rI   rW   zPyVmomiHelper.host_vmk_update  s_    HM	M 	M" 	M[ 	M3C 	M#	M&:	M=O	M 	M#7	M:M	MPg  kEu"-!%!1!1!%!@!@AQAQ!R99>>--1GGKK!!&k!l 99>>)#&&*iinn&8&8GN# ++!__	!--	!%!5!5GI!.GI99>>!!  H,#' ##O4+1(yy~~  %%  F*#' ##O4+3(""h.??diinn&7&7&A&AA'+$ ''-26))..2C2C2M2MG./##tyy~~'8'8'C'CC'+$ ''-26))..2C2C2N2NG./''D//499>>3M3M3[3[3j3jj/3,(//>:>))..:T:T:b:b:q:qG$6799>>55CCRR/3,(//>:>))..:T:T:b:b:q:qG$67
  $33 $ 1 1GH99>>88CC"&K ''7#yy~~DDOOH -1-B-B8-L)*%5dllGL]D^%_"040F0F&&		(M(M(Z(Z1,- ]] $GH499>>88CCtGYGYG^G^^"&K ''7#yy~~DDOOH -1-B-B8-L)*04		0H0H,-!==$J\J\=]
!+ PI ~~**diinn.F.FF5>^^5O5O 12P #AAC
99>>--1DD $ A A C##		(8(8@QR[@\(\,,1A1AEVW`Ea1a=AA #:  TYY%5%5=N|=\%\))dii.>.>BST`Ba.a:>> #7499#3#3;LMd;e#eDII,<,<@QRi@j,j8<< #5  TYY%5%5=Nv=V%V))dii.>.>BSTZB[.[:>> #7((TYY-=-=EVWlEm-m11dii6F6FJ[\qJr6r:>> #7''DII,<,<DUVjDk,k00TYY5E5EIZ[oIp5p9== #6++		0@0@HYZqHr0r449I9IM^_vMw9w=AA #:&&499+;+;CTUgCh+h//DII4D4DHYZlHm4m@DD #=##J/{.>G{{%%!4!+< 1$))L"$56ACUWHXDYY\"a'!,,|4\"a'&q/)G3nDG;!hh11??A((++-$$.#'GL#(GL(,G%)-)9)9G&++25((2E2E2Q2Q2S/@C@V@V@X//=OSOcOc//==L25((2E2E2Q2Q2S/@C@V@V@X//=!("&((((040D0D-=@WW=S=S=U:HLHZHZH_H_::EJNJ]J]JaJa::G;;11**88FFWWX\XaXaXhXhjuv,  ##J/$&!#11??QQ'yy''+<\+JJ)008,0,<,<*I))%1tyy|gp *  +yy''+<Y+GG)00;,0,?,?ZI))%1tyyydm *  &yy''+<=T+UU)006,0NN
I))%1tyyOfr{ *  (yy''+<=R+SS)008,0,D,D*I))%1tyyOdpy *  'yy''+<=Q+RR)008,0,C,CI))%1tyyOcox *  +yy''+<=T+UU)00<,0,G,GZI))%1tyyOfr{ *  .yy''+<=O+PP)00>,0,B,B
I))%1tyyOamv *  (yy''+<V+DD)008&*&@&@AQAQ&RGFO/3yy9J/K+,DG$	  II,,((E * D+/($++M:6C 23D *  "  " 4"##N34| yy)) KK))`!)--01 *   yy00 KK))Q!"3"7"789 *   yy-- KK))k!-"3"345 *   {{22 KK))GIRS^SbSbIcd *  s   B A>. 9A'> ;A>A@ AA@1 !+*+.	;:;>	A@@
A@@A@.@-A@.@1AFA2ABB AFB&2ACC AFC>2AD6D6 AFE2AFFAFc                     t        | j                  t        j                  g      }|D ])  }|j                  |k(  s|j
                  j                  c S  y)z<
        Find DVS by UUID
        Returns: DVS name
        N)r   r@   r   DistributedVirtualSwitchr   summaryrP   )rF   r   dvs_listr   s       rI   r   zPyVmomiHelper.find_dvs_by_uuid  sM    
  s/K/K.LM 	(Cxx4{{'''	( rJ   c                 d    |j                   }|D ]  }|j                  |k(  s|j                  c S  y)zK
        Find dvPortgroup by key
        Returns: dvPortgroup name
        N)rR   rd   rP   )rF   	dv_switchportgroup_keyrQ   rR   s        rI   r   zPyVmomiHelper.find_dvspg_by_key  s9     ((
# 	&I}}- ~~%	& rJ   c           	      x    d} j                   j                  j                  }|j                  }t        j
                  j                  j                         }|j                  |_        |j                  j                  D cg c]  }|j                   }}d}|rdndd j                  j                  d|d}|sW j                  j                  |v r*t        t         fd|j                  j                              |j                  _	        d	}n j                  j                  |vrt        j
                  j                  j                  j                  j                         }	 j                  j                  |	_
        |j                  Jt        j
                  j                  j                  j                         |_        |	g|j                  _	        n%|j                  j                  j!                  |	       d	} j"                  j$                  s/|r-	 |j'                  |      }
t)        |
      }|d
   r|dz  }n|dz  } j"                  j$                  r|dz  }|S c c}w # t*        $ rI} j"                  j-                  d j                  j                  dt/        |             Y d}~od}~ww xY w)zS
        Set VSAN service type
        Returns: result of UpdateVsan_Task

        NFEnableDisablez NIC z (currently enabled NICs: z) : c                 J    | j                   j                  j                   k7  S N)r   rC   )
portConfigrF   s    rI   <lambda>z5PyVmomiHelper.set_vsan_service_type.<locals>.<lambda>:  s    jN_N_cgclclcscsNs rJ   Tr   SuccessFailedz'Failed to set service type to vsan for z : r   zDry-run)r<   rs   
vsanSystemra   r   r   r   
ConfigInfonetworkInfoportr   rC   listfilterNetworkInfo
PortConfigr   r=   rr   UpdateVsan_Taskr   r
   r9   r   )rF   r   resultvsan_systemvsan_system_configvsan_configr   current_vsan_vnicsro   vsan_port_config	vsan_tasktask_resulttask_errs   `            rI   r   z#PyVmomiHelper.set_vsan_service_type(  s\    ((66AA(//hhmm..0"4"@"@BTB`B`BeBefJj//ffLW]f@fhlhqhqhxhx  {M  Nyy#55/3F;s  vA  vM  vM  vR  vR  5S  0T'',yy'99#&88==#;#;#G#G#R#R#T *.))*:*: '**2.1hhmm.F.F.R.R.TK+4D3EK++0++00778HI{{%%'
'77D	+I6q>i'Fh&F
 ;;!!iFC g6  %%LPIIL\L\^ghp^qr &  s   I",I' '	J90?J44J9c                    t        dd      }| j                  r| j                  |d<   n| j                  r| j                  |d<   | j                  |d<   t        j
                  j                  j                         }t        j
                  j                         }| j                  |d<   | j                  dk(  rd|_
        nd|_
        | j                  |d	<   | j                  |d
<   | j                  |_        | j                  |_        | j                  rt        j
                  j                  j!                         |_        t        j
                  j%                         |j"                  _        | j                  |j"                  j&                  _        ||_        | j,                  |d<   | j,                  |_        | j.                  |d<   | j1                  | j.                        |_        d}	 | j4                  j6                  rd|d<   n| j                  r;| j8                  j:                  j<                  j?                  | j                  |      }n| j                  rt        j@                  jC                         |_"        | jF                  jH                  |jD                  _%        | jL                  jN                  |jD                  _(        | j8                  j:                  j<                  j?                  d|      }d|d<   d|d<   ||d<   | j                  dk7  r!| j                  r| j                  |d<   nd|d<   | jS                         |d<   | j.                  dk(  rtg        d | jh                  | jj                  | jl                  | jn                  | jp                  | jr                  | jt                  | jv                  fD              s| jy                  |      | _=        | jh                  r| j}                  | jh                        |d<   | j8                  j:                  j~                  }	| jj                  r| j                  |	| jz                  d        | jl                  r| j                  |	| jz                  d!       | jn                  r| j                  |	| jz                  d"       | jp                  r| j                  |	| jz                  d#       | jr                  r| j                  |	| jz                  d$       | jt                  r| j                  |	| jz                  d%       | jv                  r| j                  |	| jz                  d&        | j4                  j                  d'i | y# t        jT                  jV                  $ r=}| j4                  jY                  dt[        |j\                        z         Y d}~md}~wt        jT                  j^                  $ r=}| j4                  jY                  dt[        |j\                        z         Y d}~d}~wt        jT                  j`                  $ r=}| j4                  jY                  dt[        |j\                        z         Y d}~d}~wtb        jT                  jd                  $ r=}| j4                  jY                  dt[        |j\                        z         Y d}~ud}~ww xY w)(z6
        Create VMKernel
        Returns: NA

        Frm   )ro   r   r   rR   r   r   Tr   r   r   r   Nz!VMkernel Adapter would be createdr   )rR   niczVMkernel Adapter createdro   r   r   r   r   zGFailed to add vmk as portgroup already has a virtual network adapter %sr   z0Failed to add vmk due to host config issues : %szJFailed to add vmk as ipv6 address is specified in an ipv4 only system : %szsFailed to add vmk as IP address or Subnet Mask in the IP configuration are invalid or PortGroup does not exist : %sdefaultc              3   $   K   | ]  }|d u  
 yw)FNrp   ).0options     rI   	<genexpr>z0PyVmomiHelper.host_vmk_create.<locals>.<genexpr>  s      5e$*%5es   r1   r   r   r   r   r   r   r   r   rp   )Brq   r'   r:   r3   r   r   r   r   r   r8   r   r   r   rh   r   r   r   r   r   r   r   rg   r   r   r   r   r=   rr   r<   rs   rt   AddVirtualNicr   r   rb   rA   r   r   r?   rd   rc   r   rv   AlreadyExistsr9   r   r   rx   r   r   r   allr   r    r!   r"   r#   r$   r%   r&   rB   rC   r   r   r   ry   )
rF   rz   r   r   r{   already_existsr}   r   r   host_vnic_managers
             rI   rX   zPyVmomiHelper.host_vmk_createX  s    ub1 $ 1 1GH]] $GH#33hh))779((##%++&GL GL!%GI!%!1!1GI $G!%!1!1G##*-((*=*=*I*I*K'8;8N8N8P''5GKG[G[''55D ((!%!1!1*.*I*I$JZJZ*['
*	{{%%!D$$!%!3!3!A!A!O!O!]!],,#"J ]]9<9O9O9QK6DHDVDVD[D[K66AFJFYFYF]F]K66C!%!3!3!A!A!O!O!]!]hjp{!]!|J!;!%GI *GH  F*'')-)=)=GI&)6GI&"&"E"E"GGJ. y( 5e/3/?/?ATAT/3/?/?/3/G/GI`I`/3/J/JDLbLb/d5e 2e
 33
3KDI "&"<"<T=M=M"N !% 2 2 @ @ R R""%%&7IN%%&7LQ~~%%&7D[\''%%&7DYZ&&%%&7DXY**%%&7D[\%%%%&7DVW((q yy&& 	KK!!].,,-. "   yy(( 	KK!!F+//01 "   yy%% 	KK!!`-++,- "   {{** 	KK!!?AJ;??A[\ "  	s=   +EU" "[?2V77 [2X [/2Y'' [2Z??[c                    	 |dk(  r3| j                   j                  sW|j                  ||j                         y|dk(  r4| j                   j                  s|j	                  ||j                         yyyy# t
        j                  j                  $ rO}| j                   j                  d|d|d|j                  dt        |j                               Y d}~yd}~ww xY w)	a(  
        Set service type to given VMKernel
        Args:
            vnic_manager: Virtual NIC manager object
            vmk: VMkernel managed object
            service_type: Name of service type
            operation: Select to select service type, deselect to deselect service type

        r   r   z
Failed to z VMK service type 'z' on 'z' due to : r   N)r=   rr   SelectVnicForNicTyper   DeselectVnicForNicTyper   rv   r   r9   r   r   )rF   r   r   r   r   r   s         rI   r   zPyVmomiHelper.set_service_type  s    	H${{-- 55lCJJOj({{-- 77cjjQ . ) .
 {{** 	KK!!L#**i6PR "  	s   7A5 7A5 5C!ACC!c           
      x    t        g g g g g g g g       }t        |      D ]  }| j                  |      }|||<    |S )z
        Return information about service types and VMKernel
        Returns: Dictionary of service type as key and VMKernel list as value

        )r   r   r   r   r   r   r   r   )rq   r   query_service_type_for_vmks)rF   service_type_vmkr   	vmks_lists       rI   r   z*PyVmomiHelper.get_all_vmks_by_service_type  sa      "$ "!"$	
 !!12 	7L88FI-6\*	7  rJ   c           	      ~   g }d}	 | j                   j                  j                  j                  |      }|j                  s|S |j                  D cg c]'  }|j                  |j                  v s|j                   ) }}|S # t        j
                  j                  $ r?}| j                  j                  d|dt        |j                               Y d}~d}~wt        j
                  j                  $ r?}| j                  j                  d|dt        |j                               Y d}~d}~ww xY wc c}w )z
        Return list of VMKernels
        Args:
            service_type: Name of service type

        Returns: List of VMKernel which belongs to that service type

        Nz(Failed to get all VMKs for service type z due to host config fault : r   z due to invalid arguments : )r<   rs   r   QueryNetConfigr   rv   rx   r=   r9   r   r   r   r   selectedVniccandidateVnicrd   r   )rF   r   r  queryconfig_faultinvalid_argumentrC   vnics_with_service_types           rI   r  z)PyVmomiHelper.query_service_type_for_vmks  s    		&&44FFUUVbcE !!;@;N;N"q4RVRZRZ^c^p^pRp4;;"q"q&& yy(( 	KK!!y)9)9:< "   {{** 	KK!!y)9)=)=>@ "  	 #rs/   /B D:/D:D75C D785D22D7c                    g }| j                   r|j                  d       | j                  r|j                  d       | j                  r|j                  d       | j                  r|j                  d       | j
                  r|j                  d       | j                  r|j                  d       | j                  r|j                  d       | j                  r|j                  d       d	j                  |      S )
zCreate services listr   r   r   r   r   r   r   r   r   )
r!   r   r    r"   r   r#   r$   r%   r&   r   )rF   r   s     rI   r   z,PyVmomiHelper.create_enabled_services_string  s    OOF#OOI&>>OOD!OOF###OOF#""OOF#&&OOJ'!!OOL)yy""rJ   c                 r    d}| dk(  rd}|S | dk(  rd}|S | dk(  rd}|S | dk(  rd}|S | dk(  rd}|S | dk(  rd}|S )z%Get TCP/IP stack instance name or keyNr  r   provisioningr   r   vxlanrp   )r   net_stack_instances     rI   r   z(PyVmomiHelper.get_api_net_stack_instance.  s     ")#!4 "! N*!6 "! I%!* "! G#!( "! //!* "! 11!/!!rJ   r   )r   )__name__
__module____qualname____doc__r5   r>   r_   rD   rE   rB   rY   rU   rV   rW   r   r   r   rX   r   r   r  r   staticmethodr   __classcell__)rH   s   @rI   r   r   "  s}    GCPJ$C0*4):-[)z	.`u)n. ,':#* " "rJ   r   c                  F   t               } | j                  t        d,i dt        dd      dt        dddg      dt        d	d
d      dt        d      dt        d	dd	      dt        d	dd	      dt        d	dd	      dt        d	dd	      dt        dd	      dt        dd	      dt        dd	      dt        dd	      dt        d	ddg      dt        d	ddg      dt        dt        t        dddd g!      t        d      t        d      t        d      t        dd"g d#!      $      t        dd"%      &      d't        dd(d)d(g!             t        | ddggddgddggd'd(dggd'd)dgggd*      }t	        |      }|j                          y+)-Mainr*   Tr   )requiredr   r)   rR   )r,  r   aliasesr   Finti  )r,  r   r  r   )r   r   boolr    r!   r"   r#   )r   r  r$   r%   r&   r'   vswitchr(   dvswitchr   rq   r,   r   )r   r  choicesr  )r  r!  r   r"  )r   r   r   r   r   )r   r   )r   optionsr  r-   rT   r.   )argument_specmutually_exclusiverequired_one_ofrequired_ifsupports_check_modeNrp   )r   updaterq   r   r   r_   )r4  r=   pyvs      rI   mainr;  C  s   &(M "Du5"T}M" %eT:" 	"
 %feD" UG" %feD" FEB" !fe<"  VU;"  $?" FE:" 5uykJ" E
|L" uh6@RSU+ e, $% 0 eYHwx %
": y)
;" "H  .@/ !/@ 0(;,
 !(5E4FG 'H:>( 045F 
CJJLrJ   __main__N)
__future__r   r   r   r   __metaclass__DOCUMENTATIONEXAMPLESRETURNpyVmomir   r   ImportErroransible.module_utils.basicr   @ansible_collections.community.vmware.plugins.module_utils.vmwarer	   r
   r   r   r   r   Hansible_collections.community.vmware.plugins.module_utils._argument_specr   ansible.module_utils._textr   r   r;  r$  rp   rJ   rI   <module>rH     s    A @WrXt
&	" 5  h 0^"G ^"B6r zF K  		s   A A"!A"