
    Vh%H                         d dl Z d dlZd dlmZ 	 d dlmZ d dl	Z	d dl
Z
d dlmZ i ZddgZdZdZdd	Zd
 Zd Zd ZddZ G d d      Zy# e$ r, 	 d dlmZ n!# e$ rZ e ed      e       Y dZ[ndZ[ww xY wY dw xY w)    N)
raise_from)StrictVersionzsTo use this plugin or module with ansible-core < 2.11, you need to use Python < 3.12 with distutils.version present)AnsibleModulemin_vermax_verz1.0.0c                    |r)t         r#t        t        t               t        |            }nt         rt        t               }|r)t        r#t	        t        t              t        |            }nt        rt        t              }|r+t        |       |k  rt        dj                  | ||            |r,t        |       |kD  rt        dj                  | ||            yy)zo Raises ImportError if the specified version does not
        meet the minimum and maximum version requirementszpVersion MUST be >={min_version} and <={max_version}, but {version} is smaller than minimum version {min_version}versionmin_versionmax_versionzoVersion MUST be >={min_version} and <={max_version}, but {version} is larger than maximum version {max_version}N)MINIMUM_SDK_VERSIONmaxr   MAXIMUM_SDK_VERSIONminImportErrorformatr	   s      r/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/openstack/cloud/plugins/module_utils/openstack.pyensure_compatibilityr   :   s     *-(;<'46	#$78*-(;<'46	#$78}W-;GVG + +  -. 	. }W-;FVG + +  -. 	. <{    c                  $   t         j                  j                  dd      } t         j                  j                  dd       }t         j                  j                  dd       }t         j                  j                  dd      }t         j                  j                  d|      }t        t        |      t        |       t        |      	      }|rt        |      |d
<   nt        d      |d
<   |rt        |      |d<   |S t        d      |d<   |S )NOS_AUTH_URLzhttp://127.0.0.1:35357/v2.0/OS_PASSWORDOS_REGION_NAMEOS_USERNAMEadminOS_TENANT_NAME)default)login_usernameauth_urlregion_namelogin_passwordT)requiredlogin_tenant_name)osenvirongetdict)r   r   r   r   r   specs         r   openstack_argument_specr)   [   s     **..0NOK**..5KZZ^^$4d;N**..8KZZ^^$4kBNK0k*0D
 !%k!:!%t!4$($@ ! K %)$$7 !Kr   c                     t        t        d      t               t        dd      t               t        ddg      t        d	g
      t        dg
      t        ddg      t        dd      t        dd      t        d      t        dg ddg      t               t        dddg            }t        j                  |       }|j                         D ]  }t        D ]  }|j                  |d         ! |j                  |       |S )Nraw)typer'   T)r,   no_logboolverify)r,   aliasescacert)r0   certkey)r-   r0   )r   r,      intpublic)r6   internalr   endpoint_type)r   choicesr0   INFODEBUG)r   r9   )cloud	auth_typeauthr    validate_certsca_certclient_cert
client_keywaittimeoutapi_timeout	interfacesdk_log_pathsdk_log_level)r'   copydeepcopyvaluesCUSTOM_VAR_PARAMSpopupdate)kwargsr(   kwargs_copyvcs        r   openstack_full_argument_specrS   x   s    &vd+F(<hZ(&*teW5$V,Su-e$&E$%' VVW$57!D( --'K! " 	AEE!TN	 	KKKr   c                  j    i }dD ]+  }|| v s||v r||   j                  | |          $| |   ||<   - |S )N)mutually_exclusiverequired_togetherrequired_one_of)extend)rO   retr3   s      r   openstack_module_kwargsrZ      sL    
CM '&=czCs,!#;C' Jr   c                 @   	 t        j                  d      }	 t	        j
                  j                  ||       | j                  j                  dd       }	 t        |t              rd}dD ]4  }| j                  |   | j                  |j                  |	             6 | j                  d
   dk7  r"| j                  |j                  d
	              |j                  di |fS |j                  || j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d
   
      fS # t        $ r | j                  d       Y w xY w# t        $ r6}| j                  dj                  t        |                   Y d }~d }~ww xY w# j                  j                  $ r%}| j                  t        |             Y d }~y d }~ww xY w)N	openstack(openstacksdk is required for this modulemsg1Incompatible openstacksdk library found: {error}.errorr<   A cloud config dict was provided to the cloud parameter but also a value was provided for {param}. If a cloud config dict is provided, {param} should be excluded.r>   r    r?   r@   rA   rB   rE   r=   paramrF   r6   r=   r>   r    r?   r@   rB   rA   rE   
r<   r=   r>   r    r/   r1   r3   r2   rE   rF    )	importlibimport_moduler   	fail_jsonr   r
   __version__r   strparamsrM   
isinstancer'   connect
exceptionsSDKException)moduler   r   sdkecloud_configfail_messagerf   s           r   openstack_cloud_from_modulerx      s   I%%k2'S[[44(+	7 ==$$Wd3L%lD) 
X K =='3$$)<)<5)<)I$J	K }}[)X5  \%8%8{%8%K L3l333" --4]]6*"MM-8}}%56}}Y/MM,/]]=1"MM-8 --4 $   ;  IGHI  'Cc!f% 	 	' 	''F >>&& %SV$$%sN   E; !F &G =A+G )BG ;FF	G&+GGH8HHc                   x    e Zd ZdZdZi Zi ZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zej"                  d        Zd Zy)OpenStackModuleaR  Openstack Module is a base class for all Openstack Module classes.

    The class has `run` function that should be overriden in child classes,
    the provided methods include:

    Methods:
        params: Dictionary of Ansible module parameters.
        module_name: Module name (i.e. server_action)
        sdk_version: Version of used OpenstackSDK.
        results: Dictionary for return of Ansible module,
                 must include `changed` keyword.
        exit, exit_json: Exit module and return data inside, must include
                         changed` keyword in a data.
        fail, fail_json: Exit module with failure, has `msg` keyword to
                         specify a reason of failure.
        conn: Connection to SDK object.
        log: Print message to system log.
        debug: Print debug message to system log, prints if Ansible Debug is
               enabled or verbosity is more than 2.
        check_deprecated_names: Function that checks if module was called with
                                a deprecated name and prints the correct name
                                with deprecation warning.
        check_versioned: helper function to check that all arguments are known
                         in the current SDK version.
        run: method that executes and shall be overriden in inherited classes.

    Args:
        deprecated_names: Should specify deprecated modules names for current
                          module.
        argument_spec: Used for construction of Openstack common arguments.
        module_kwargs: Additional arguments for Ansible Module.
    rh   Nc                 Z   t        t        di | j                  fi | j                  | _        | j                  j
                  | _        | j                  j                  | _        | j                  j                  | _        d| _	        ddi| _
        | j                  j                  x| _        | _        | j                  j                  x| _        | _        | j                  j                  | _        | j!                         \  | _        | _        | j'                          | j)                          y)zInitialize Openstack base class.

        Set up variables, connection to SDK and check if there are
        deprecated names.
        NchangedFrh   )r   rS   argument_specmodule_kwargsansiblern   _namemodule_name
check_modesdk_versionresults	exit_jsonexitrk   failwarnrx   rt   conncheck_deprecated_namessetup_sdk_loggingselfs    r   __init__zOpenStackModule.__init__   s     %(>4+=+=>"  " ll))<<--,,11!5)%)\\%;%;;	DN%)\\%;%;;	DNLL%%	">>@$)##% r   c                 :    | j                   j                  |       y)zcPrints log message to system log.

        Arguments:
            msg {str} -- Log message
        N)r   logr   r_   s     r   r   zOpenStackModule.log  s     	r   c                     | j                   j                  s| j                   j                  dkD  r-| j                   j                  dj	                  d|g             yy)zgPrints debug message to system log

        Arguments:
            msg {str} -- Debug message.
            z[DEBUG]N)r   _debug
_verbosityr   joinr   s     r   debugzOpenStackModule.debug  sJ     <<$,,"9"9A"=LL)S)*, #>r   c                     | j                   j                  d      }|H| j                   j                  d      }| j                  j                  |dk(  rdnd|dk(  rdnd|       y y )NrG   rH   r;   TF)r   
http_debugpath)rn   r&   rt   enable_logging)r   log_path	log_levels      r   r   z!OpenStackModule.setup_sdk_logging"  sc    ;;??>28IHH##'72d#,#74U $   r   c                     t         j                  | j                        }| j                  | j                  v r5|r2| j                  j                  d| j                  d|d|dd       yyy)zMCheck deprecated module names if `deprecated_names` variable is set.
        zThe 'z' module has been renamed to 'z+' in openstack collection: openstack.cloud.z3.0.0zopenstack.cloud)r
   collection_nameN)	OVERRIDESr&   r   deprecated_namesr   	deprecate)r   new_module_names     r   r   z&OpenStackModule.check_deprecated_names,  sl     $--(8(89t444LL"" $$oH  1B	 # D :I4r   c                    	 t        j                  d      }|j                  j                  | _        	 t        | j                  | j                  | j                         | j                  D ]  }| j                  |   wd| j                  |   v rft        | j                        | j                  |   d   k  r>| j                  dj                  | j                  |   d   || j                  	             | j                  |   d
| j                  |   v st        | j                        | j                  |   d
   kD  s| j                  dj                  | j                  |   d
   || j                                | j                  j!                  dd      }t#        |t$              rpd}dD ]4  }| j                  |   | j                  |j                  |             6 | j                  d   dk7  r| j                  |j                  d             nt%        || j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   | j                  d   
      }	  |j&                  di |fS # t
        $ r | j                  d       Y w xY w# t
        $ r6}| j                  dj                  t        |                   Y d}~d}~ww xY w# j(                  j*                  $ r%}| j                  t        |             Y d}~yd}~ww xY w)zSets up connection to cloud using provided options. Checks if all
           provided variables are supported for the used SDK version.
        r\   r]   r^   r`   ra   Nr   z}To use parameter '{param}' with module '{module}', the installed version of the openstacksdk library MUST be >={min_version}.)r   rf   rs   r   z}To use parameter '{param}' with module '{module}', the installed version of the openstacksdk library MUST be <={max_version}.)r   rf   rs   r<   rc   rd   re   rF   r6   r=   r>   r    r?   r@   rB   rA   rE   rg   rh   )ri   rj   r
   rl   r   r   rk   r   module_min_sdk_versionmodule_max_sdk_versionr   rm   r}   rn   r   r   rM   ro   r'   rp   rq   rr   )r   rt   ru   rf   rv   rw   s         r   rx   z+OpenStackModule.openstack_cloud_from_module7  sF   	K))+6C"{{66D	+ !1!1!%!<!<!%!<!<> '' 	2EE".!3!3E!::%d&6&67$:L:LU:ST]:^^HHN$($6$6u$=i$H##// IO I1  2 E".!3!3E!::%d&6&67$:L:LU:ST]:^^HHN$($6$6u$=i$H##// IO I1  2	2( {{w5lD) 
X I ;;u%1NN|':':':'GNH	I {{;'83<#6#6[#6#IJ"++k2[[( KK6{{#34{{9-KK-[[/ KK6++k2L	'3l333  	KNNINJ	K  	+NNGV#a&V)  + +	+r ~~** 	'NNs1vN&&	's@   0J; +K 'L ;KK	L&+LLM8MMc                 ,   i }|D ]  }d| j                   |   v r)t        | j                        | j                   |   d   k  r=d| j                   |   v r)t        | j                        | j                   |   d   kD  rw|j                  |||   i        |S )a)  Check that provided arguments are supported by current SDK version

        Returns:
            versioned_result {dict} dictionary of only arguments that are
                                    supported by current SDK version. All others
                                    are dropped.
        r   r   )r}   r   r   rN   )r   rO   versioned_resultvar_names       r   check_versionedzOpenStackModule.check_versioned  s      	BHT//99%d&6&67$:L:LX:VW`:aaT//99%d&6&67$:L:LX:VW`:aa##Xvh/?$@A	B  r   c                      y)zPFunction for overriding in inhetired classes, it's executed by default.
        Nrh   r   s    r   runzOpenStackModule.run  s     	r   c                    	 | j                         }|r,t        |t              r | j                  j                  d
i |  | j                  j                  d
i | j                   y	# | j
                  j                  j                  $ rd}t        |      t        |dd      t        |dd      t        t        |dd      dd      dd} | j                  j                  d
i | Y d	}~d	}~ww xY w)z7Execute `run` function when calling the class.
        
extra_dataNonedetailsresponse text)datar   r   )r_   r   Nrh   )r   ro   r'   r   r   rt   rq   OpenStackCloudExceptionrm   getattrrk   r   )r   r   ru   rn   s       r   __call__zOpenStackModule.__call__  s    	-hhjG:gt4&&&11 	.. xx"":: 
	-1v#A|V<&q)V< ':r(B(.!8F #DLL"",V,
	-s   >A' '#C.
AC))C.)__name__
__module____qualname____doc__r   r}   r~   r   r   r   r   r   r   r   rx   r   abcabstractmethodr   r   rh   r   r   rz   rz      sk    B MM!!!*,	DJ'Z & 	 
/r   rz   )NN)r   rI   ansible.module_utils.sixr   #ansible.module_utils.compat.versionr   r   distutils.versionexcri   r$   ansible.module_utils.basicr   r   rL   r   r   r   r)   rS   rZ   rx   rz   rh   r   r   <module>r      s   B   /BA  	 4		*   .B::/%d]/ ]/[  BB3 B;  ; <=@	B 	BBBs;   A
 
A;AA;A5A0+A;0A55A;:A;