
    Vh
O                         d Z ddlmZmZmZ eZdZdZdZ	ddl
mZ ddlmZ  ej                  d      Zd	Z G d
 de      Zd Zd Zd Zd Zedk(  r e        yy)z/Ansible module for managing NFS server on Unity    )absolute_importdivisionprint_functiona%  
module: nfsserver
version_added: '1.4.0'
short_description: Manage NFS server on Unity storage system
description:
- Managing the NFS server on the Unity storage system includes creating NFS server, getting NFS server details
  and deleting NFS server attributes.

extends_documentation_fragment:
  - dellemc.unity.unity

author:
- Meenakshi Dembi (@dembim) <ansible.team@dell.com>

options:
  nas_server_name:
    description:
    - Name of the NAS server on which NFS server will be hosted.
    type: str
  nas_server_id:
    description:
    - ID of the NAS server on which NFS server will be hosted.
    type: str
  nfs_server_id:
    description:
    - ID of the NFS server.
    type: str
  host_name:
    description:
    - Host name of the NFS server.
    type: str
  nfs_v4_enabled:
    description:
    - Indicates whether the NFSv4 is enabled on the NAS server.
    type: bool
  is_secure_enabled:
    description:
    - Indicates whether the secure NFS is enabled.
    type: bool
  kerberos_domain_controller_type:
    description:
    - Type of Kerberos Domain Controller used for secure NFS service.
    choices: [CUSTOM, UNIX, WINDOWS]
    type: str
  kerberos_domain_controller_username:
    description:
    - Kerberos Domain Controller administrator username.
    type: str
  kerberos_domain_controller_password:
    description:
    - Kerberos Domain Controller administrator password.
    type: str
  is_extended_credentials_enabled:
    description:
    - Indicates whether support for more than 16 unix groups in a Unix credential.
    type: bool
  remove_spn_from_kerberos:
    description:
    - Indicates whether to remove the SPN from Kerberos Domain Controller.
    default: true
    type: bool
  state:
    description:
    - Define whether the NFS server should exist or not.
    choices: [absent, present]
    required: true
    type: str
notes:
- The I(check_mode) is supported.
- Modify operation for NFS Server is not supported.
- When I(kerberos_domain_controller_type) is C(UNIX), I(kdc_type) in I(nfs_server_details) output is displayed as C(null).
a`  

- name: Create NFS server with kdctype as Windows
  dellemc.unity.nfsserver:
    unispherehost: "{{unispherehost}}"
    username: "{{username}}"
    password: "{{password}}"
    validate_certs: "{{validate_certs}}"
    nas_server_name: "dummy_nas"
    host_name: "dummy_nas23"
    is_secure_enabled: true
    kerberos_domain_controller_type: "WINDOWS"
    kerberos_domain_controller_username: "administrator"
    kerberos_domain_controller_password: "Password123!"
    is_extended_credentials_enabled: true
    nfs_v4_enabled: true
    state: "present"

- name: Create NFS server with kdctype as Unix
  dellemc.unity.nfsserver:
    unispherehost: "{{unispherehost}}"
    username: "{{username}}"
    password: "{{password}}"
    validate_certs: "{{validate_certs}}"
    nas_server_name: "dummy_nas"
    host_name: "dummy_nas23"
    is_secure_enabled: true
    kerberos_domain_controller_type: "UNIX"
    is_extended_credentials_enabled: true
    nfs_v4_enabled: true
    state: "present"

- name: Get NFS server details
  dellemc.unity.nfsserver:
    unispherehost: "{{unispherehost}}"
    username: "{{username}}"
    password: "{{password}}"
    validate_certs: "{{validate_certs}}"
    nas_server_name: "dummy_nas"
    state: "present"

- name: Delete NFS server
  dellemc.unity.nfsserver:
    unispherehost: "{{unispherehost}}"
    username: "{{username}}"
    password: "{{password}}"
    validate_certs: "{{validate_certs}}"
    nas_server_name: "dummy_nas"
    kerberos_domain_controller_username: "administrator"
    kerberos_domain_controller_password: "Password123!"
    unjoin_server_account: false
    state: "absent"
a  
changed:
    description: Whether or not the resource has changed.
    returned: always
    type: bool
    sample: true
nfs_server_details:
    description: Details of the NFS server.
    returned: When NFS server exists
    type: dict
    contains:
        credentials_cache_ttl:
            description: Credential cache refresh timeout. Resolution is in minutes. Default value is 15 minutes.
            type: str
        existed:
            description: Indicates if NFS Server exists.
            type: bool
        host_name:
            description: Host name of the NFS server.
            type: str
        id:
            description: Unique identifier of the NFS Server instance.
            type: str
        is_extended_credentials_enabled:
            description: Indicates whether the NFS server supports more than 16 Unix groups in a Unix credential.
            type: bool
        is_secure_enabled:
            description: Indicates whether secure NFS is enabled on the NFS server.
            type: bool
        kdc_type:
            description: Type of Kerberos Domain Controller used for secure NFS service.
            type: str
        nfs_v4_enabled:
            description: Indicates whether NFSv4 is enabled on the NAS server.
            type: bool
        servicee_principal_name:
            description: The Service Principal Name (SPN) for the NFS Server.
            type: str
    sample: {
        "credentials_cache_ttl": "0:15:00",
        "existed": true,
        "file_interfaces": {
            "UnityFileInterfaceList": [
                {
                    "UnityFileInterface": {
                        "hash": 8778980109421,
                        "id": "if_37"
                    }
                }
            ]
        },
        "hash": 8778980109388,
        "host_name": "dummy_nas23.pie.lab.emc.com",
        "id": "nfs_51",
        "is_extended_credentials_enabled": true,
        "is_secure_enabled": true,
        "kdc_type": "KdcTypeEnum.WINDOWS",
        "nas_server": {
            "UnityNasServer": {
                "hash": 8778980109412
            }
        },
        "nfs_v4_enabled": true,
        "servicee_principal_name": null
    }
)AnsibleModule)utils	nfsserverzAnsible/1.7.1c                   R    e Zd ZdZd ZddZd ZddZd Zd Z		 	 	 dd	Z
d
 Zd Zy)	NFSServerz Class with NFS server operationsc                    t        j                         | _        | j                  j                  t	                      ddgg}g dg}t        | j                  d||      | _        t        j                  | j                         t        j                  | j                  j                  t              | _        t        j                  d| j                  j                         y)z-Define all parameters required by this modulenas_server_namenas_server_id)nfs_server_idr   r   T)argument_specsupports_check_modemutually_exclusiverequired_one_ofzCheck Mode Flag %sN)r   $get_unity_management_host_parametersmodule_paramsupdateget_nfs_server_parametersr   moduleensure_required_libsget_unity_unisphere_connectionparamsapplication_type
unity_connLOGinfo
check_mode)selfr   r   s      k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/dellemc/unity/plugins/modules/nfsserver.py__init__zNFSServer.__init__   s    "GGI!!";"=>0/BCPQ $,, $1+	
 	""4;;/>>KK 02%t{{'='=>    Nc                    t         j                  d       	 |r,| j                  j                  |      }|j	                         S |rD| j                  j                  |      }t        |      dkD  rt        |j	                               S yy# t        j                  $ r}|j                  dk(  r4d}t         j                  |       | j                  j                  |       nPd	j                  t        |            }t         j                  |       | j                  j                  |       Y d}~yY d}~yd}~wt        j                  $ r9}d	j                  t        |            }t         j                  |       Y d}~yd}~ww xY w)
zGet NFS server details.
            :param: nfs_server_id: The ID of the NFS server
            :param: nas_server_id: The name of the NAS server
            :return: Dict containing NFS server details if exists
        zGetting NFS server details_id)
nas_serverr   Ni  z(Incorrect username or password provided.msgz2Failed to get details of NFS Server with error {0})r   r   r   get_nfs_server_get_propertieslenprocess_dictr   	HttpErrorhttp_statuserrorr   	fail_jsonformatstrUnityResourceNotFoundError)r    r   r   nfs_server_detailser)   err_msgs          r!   get_nfs_server_detailsz NFSServer.get_nfs_server_details   sD    	-.	%)__%C%C%C%V")99;;%)__%C%C}%C%]")*Q.'(:(J(J(LMM	 
  		3}}#@		#%%#%.,,2F3q6N 		'"%%'%22 / // 	((.s1v IIg		s+   -B AB FBD77F/FFc                     	 | j                   j                  |      }|S # t        $ rL}d|dt        |      }t        j                  |       | j                  j                  |       Y d}~yd}~ww xY w)zGet NFS server instance.
            :param: nfs_server_id: The ID of the NFS server
            :return: Return NFS server instance if exists
        r%   zFailed to get the NFS server z instance with error r(   N)r   r*   	Exceptionr3   r   r0   r   r1   )r    r   nfs_server_objr6   	error_msgs        r!   get_nfs_server_instancez!NFSServer.get_nfs_server_instance  si    	1!__;;;NN!! 	1,93q6CIIIi KK!!i!00		1s     	A5AA00A5c                 X   t         j                  d       	 | j                  j                  s&| j	                  |      }|j                  |||       y# t        $ rL}d|dt        |      }t         j                  |       | j                  j                  |       Y d}~yd}~ww xY w)	aq  Delete NFS server.
            :param: nfs_server_id: The ID of the NFS server
            :param: skip_unjoin: Flag indicating whether to unjoin SMB server account from AD before deletion
            :param: domain_username: The domain username
            :param: domain_password: The domain password
            :return: Return True if NFS server is deleted
        zDeleting NFS server)r   )skip_kdc_unjoinusernamepasswordTzFailed to delete NFS server:  with error: r(   N)
r   r   r   r   r=   deleter:   r3   r0   r1   )r    r   skip_unjoindomain_usernamedomain_passwordnfs_objr6   r)   s           r!   delete_nfs_serverzNFSServer.delete_nfs_server  s     	&'	+;;))66]6S{__no 	+FSUXYZU[\CIIcNKK!!c!**	+s   <A 	B)AB$$B)c                 6   t         j                  d       	 | j                  j                  |      }|j	                         S # t
        $ rL}d|dt        |      }t         j                  |       | j                  j                  |       Y d}~yd}~ww xY w)zGet NAS server ID.
            :param: nas_server_name: The name of NAS server
            :return: Return NAS server ID if exists
        zGetting NAS server ID)namez%Failed to get details of NAS server: rB   r(   N)
r   r   r   get_nas_serverget_idr:   r3   r0   r   r1   )r    r   obj_nasr6   r)   s        r!   get_nas_server_idzNFSServer.get_nas_server_id3  s~     	()	+oo44/4JG>>## 	+N]_bcd_efCIIcNKK!!c!**	+s   +A 	BABBc                 F    t         j                  d       |
||d   k7  ryyy)a@  Check if modification is required in existing NFS server
            :param: is_extended_credentials_enabled: Indicates whether the NFS server supports more than 16 Unix groups in a Unix credential.
            :param: nfs_server_details: NFS server details
            :return: True if modification is required
        z(Checking if any modification is requiredNis_extended_credentials_enabledT)r   r   )r    rP   r5   s      r!   is_modification_requiredz"NFSServer.is_modification_requiredB  s4     	;<*6/3EFg3hh i 7r#   c	                    t         j                  d       	 | j                  j                  sPt	        |      }	|dk(  rd}d}t
        j                  j                  | j                  j                  |||||	|||	       y# t        $ rL}
d|dt        |
      }t         j                  |       | j                  j                  |       Y d}
~
yd}
~
ww xY w)	a  Create NFS server.
            :param: nas_server_id: The ID of NAS server.
            :param: host_name: Name of NFS Server.
            :param: nfs_v4_enabled: Indicates whether the NFSv4 is enabled on the NAS server.
            :param: is_secure_enabled: Indicates whether the secure NFS is enabled.
            :param: kerberos_domain_controller_type: Type of Kerberos Domain Controller used for secure NFS service.
            :param: kerberos_domain_controller_username: Kerberos Domain Controller administrator username.
            :param: kerberos_domain_controller_password: Kerberos Domain Controller administrator password.
            :param: is_extended_credentials_enabled: Indicates whether support for more than 16 unix groups in a Unix credential.
        zCreating NFS serverUNIXN)	clir'   	host_namenfs_v4_enabledis_secure_enabledkdc_typekdc_usernamekdc_passwordrP   Tz/Failed to create NFS server with on NAS Server rB   r(   )r   r   r   r   get_enum_kdctyper   UnityNfsServercreater   _clir:   r3   r0   r1   )r    r   rU   rV   rW   kerberos_domain_controller_type#kerberos_domain_controller_username#kerberos_domain_controller_passwordrP   kdc_enum_typer6   r)   s               r!   create_nfs_serverzNFSServer.create_nfs_serverO  s     	&'	+;;)) 01P Q2f<6:3(,%$$++0D0DQ^js;I>OZg9\9\Lk , m  	+XegjklgmnCIIcNKK!!c!**	+s   A&A> >	CACCc                    g d}|D ]  }d|z  }| j                   j                  |   "t        | j                   j                  |   j                               dk(  sV|j	                  |      }| j                   j                  |        y )N)r   r   r   rU   r`   ra   z"Please provide valid value for: %sr   r(   )r   r   r,   stripr2   r1   )r    
param_listparamr)   errmsgs        r!   validate_input_paramszNFSServer.validate_input_paramsp  s    =
   	2E6>C{{!!%(4T[[=O=OPU=V=\=\=^9_cd9dE*%%&%1		2r#   c           
         | j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d   }| j                   j                  d	   }	| j                   j                  d
   }
| j                   j                  d   }| j                   j                  d   }t        di       }d}| j                          |r| j	                  |      }| j                  ||      }|r5|dk(  r0| j                  |
|      }|r| j                   j                  d       |s>|dk(  r9|s| j                   j                  d       | j                  |||||||	|
      |d<   |dk(  r|r| }| j                  |d   |||	      |d<   |dk(  r| j                  ||      |d<    | j                   j                  di | y)zs
        Perform different actions on NFS server module based on parameters
        passed in the playbook
        r   r   r   rU   rV   rW   r_   r`   ra   rP   remove_spn_from_kerberosstateF)changedr5   )r   r   presentzMModification of NFS Server parameters is not supported through Ansible moduler(   z7Please provide nas server id/name to create NFS server.rm   absentidr5   N )r   r   dictri   rN   r8   rQ   r1   rc   rH   	exit_json)r    r   r   r   rU   rV   rW   r_   r`   ra   rP   rk   rl   resultmodify_flagr5   rD   s                    r!   perform_module_operationz"NFSServer.perform_module_operationz  s^   
 **?;**?;++,,->?KK&&{3	++,<= KK../BC*.++*<*<=^*_'.2kk.@.@Af.g+.2kk.@.@Af.g+*.++*<*<=^*_'#';;#5#56P#Q ""7+ !

 ""$ 22?CM!88}GT 9 V %9"4778WYklK%%*y%z!ey&8 %%*c%d $ 6 6}iQ_7HJi7Z7Z7V	!XF9 H!366K $ 6 67I$7OQ\7Z7Z!\F9 I+/+F+FUbUb ,G ,dF'(''r#   )NN)NNN)NNNNNNN)__name__
__module____qualname____doc__r"   r8   r=   rH   rN   rQ   rc   ri   rv   rq   r#   r!   r
   r
      sA    *?*B1+(+ gkdhdh+B2;(r#   r
   c                  2   t        t        d      t        d      t        d      t        d      t        dg d      t        d      t        dd      t        d      t        d      t        d      t        dd      t        ddd	d
g            S )zYThis method provide parameters required for the ansible
       NFS server module on Unityr3   )typebool)rS   WINDOWSCUSTOM)r|   choicesT)r|   no_log)defaultr|   rn   ro   )requiredr|   r   )r   rU   rV   rW   r_   r`   ra   r   r   rP   rk   rl   )rr   rq   r#   r!   r   r     s     &E"(F+(,%A^(_,0e,<,0eD,I%(&(,&(9!%d!@Duy(6KL r#   c                 T    t         j                  |    rt         j                  |    } | S y)zGetting correct enum values for kerberos_domain_controller_type
        :param: kerberos_domain_controller_type: Type of Kerberos Domain Controller used for secure NFS service.
        :return: enum value for kerberos_domain_controller_type.
    N)r   KdcTypeEnum)r_   s    r!   r[   r[     s0     89*/*;*;<[*\'.. :r#   c                 n    g d}|D ]+  }|| v r|dk(  rt        | |   d         | |<   !| |   d   | |<   - | S )zProcess NFS server details.
        :param: nfs_server_details: Dict containing NFS server details
        :return: Processed dict containing NFS server details
    )
credentials_cache_ttlfile_interfacesrU   rp   rX   r'   rW   rP   rV   servicee_principal_namer   r   )r3   )r5   rf   rg   s      r!   r-   r-     sf    
bJ  E&&54K+K(+,>u,Ea,H(Iu%(:5(A!(Du%	E
 r#   c                  8    t               } | j                          y)z`Create Unity NFS server object and perform action on it
       based on user input from playbookN)r
   rv   )objs    r!   mainr     s     +C  "r#   __main__N)rz   
__future__r   r   r   r|   __metaclass__DOCUMENTATIONEXAMPLESRETURNansible.module_utils.basicr   Cansible_collections.dellemc.unity.plugins.module_utils.storage.dellr   
get_loggerr   r   objectr
   r   r[   r-   r   rw   rq   r#   r!   <module>r      s    6 @ @GR4lA
F 5 e{#" ^( ^(B&/ # zF r#   