
    Vh,.              	       8   d dl mZmZmZ eZd dlZd dlZd dlZd dl	m
Z d dlmZ d dlmZ d Zd Z G d d	e      Zd
 Z e ed       edd       ed       edd       ed       e             Zd Zd Zd ZdZdZdZdZdZdZdZ d Z! G d  d!      Z"y)"    )absolute_importdivisionprint_functionN)error)	urlencode)open_urlc                 T    | j                   d| j                  d| j                  dS )N://:/v1)schemehostportconfigurations    q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/module_utils/consul.pyget_consul_urlr      s'         c                 :    | j                   i S d| j                   iS )NX-Consul-Token)tokenr   s    r   get_auth_headersr      s$    "	 -"5"566r   c                       e Zd ZddZd Zy)RequestErrorNc                      || _         || _        y N)statusresponse_data)selfr   r   s      r   __init__zRequestError.__init__$   s    *r   c                 h    | j                   | j                  S d| j                  | j                   fz  S )NzHTTP %d: %s)r   r   )r   s    r   __str__zRequestError.__str__(   s2    %;;T-?-?@@@r   r   )__name__
__module____qualname__r    r"    r   r   r   r   #   s    +Ar   r   c                 |    d| j                   cxk  rdk  r'n y t        d| j                   | j                  fz        y )N  X  z%d %s)status_coder   content)responses    r   handle_consul_response_errorr-   /   s;    
h""(S(7h&:&:H<L<L%MMNN )r   	localhost)defaultinti4!  )typer/   httpboolT)no_log)r   r   r   validate_certsr   ca_pathc                     g }| j                  d      D ]E  }|dv r |j                  |j                                '|j                  |j                                G dj	                  |      S )N_>   idiamjwtststtljwksoidc )splitappendupper
capitalizejoin)keypartsparts      r   camel_case_keyrI   >   s\    E		# ,EELL&LL*+	,
 775>r   c                     g d}d}| j                  d      &t        j                  || d         }|st        d      |D ]  }|| v s| |   t	        | |         | |<     y )N)IntervalTtlTimeoutz"(?P<host>.*):(?P<port>(?:[0-9]+))$Tcpz%tcp check must be in host:port format)getrematch	Exceptionvalidate_duration)checkvalidate_duration_keysvalidate_tcp_regexrQ   durations        r   validate_checkrX   H   su    ;>yy#+U5\:CDD* Aux!</h@E(OAr   c                 X    | r't        j                  d|       sdj                  |       } | S )Nz\d+(?:ns|us|ms|s|m|h)z{0}s)rP   searchformat)rW   s    r   rS   rS   T   s'    yy18<}}X.HOr   statepresentabsentreadcreateupdateremovec           	         i }| j                         D ]  \  }}||vs|||   }|j                  d      dk(  rD|j                  d      dk(  r0|j                  d      r|r|D cg c]  }t        ||d          }}n6|j                  d      dk(  r"|j                  d      r|rt        ||d         }|||<    |S c c}w Nr1   listelementsdictoptions)itemsrO   _normalize_params)paramsarg_specfinal_paramskvspecds          r   rj   rj   e   s    L 1H	{HHV&$.#@AB1"1d9o6BABXXf'DHHY,?A!!T)_5AQ 	 Cs   $B<c                       e Zd ZdZdZdZdZ e       Z e       Z	i Z
d Zd Zd Zd Zd Zd Zd	 Zdd
ZddZd Zd Zd Zd ZddZd Zd Zd Zy)_ConsulModulezBase class for Consul modules.

    This class is considered private, till the API is fully fleshed out.
    As such backwards incompatible changes can occur even in bugfix releases.
    Nc                    || _         t        |j                  |j                        | _        | j                  D ci c]  }|t        vr|t
        vr|t        |        c}| _        | j                  j                  h d       y c c}w )N>   Hash
CreateTimeCreateIndexModifyIndex)
_modulerj   rk   argument_specSTATE_PARAMETERAUTH_ARGUMENTS_SPECrI   
api_paramsoperational_attributesra   )r   modulern   s      r   r    z_ConsulModule.__init__   sw    'v7K7KL [[
'A5H,H ~a  
 	##**+_`
s   #Bc                    | j                         }d}i }| j                  t           t        k(  ri| j	                  |d u      }|t
        }| j                  |      }i |d}d}nt        }| j                  ||      r| j                  ||      }||d}d}nQ|}nN| j                  t           t        k(  r)t        }|| j                  |       d}|i d}ni i d}d }nt        d      d|i}|r ||d<   | j                  j                  r||d<   | j                   r||| j                   <    | j                  j"                  di | y )	NF)beforeafterTzUnknown state supplied.changed	operationdiffr&   )read_objectrk   r{   STATE_PRESENTmodule_to_objOPERATION_CREATEcreate_objectOPERATION_UPDATE_needs_updateupdate_objectSTATE_ABSENTOPERATION_DELETEdelete_objectRuntimeErrorry   _diff
result_key	exit_json)r   objr   r   obj_from_moduler   new_objresults           r   executez_ConsulModule.execute   sO    ;;'=8"00DAO{,	,,_="$w7,	%%c?;"00oFG&)G<D"G!G[[)\9(I""3'"%3"$r2G899W%"+F;||!!!%v??&-F4??#((r   c                     i }| j                   j                         D ]&  \  }}| j                  |||      }|s|d   ||d   <   ( |S )N   r   )rk   ri   	map_param)r   	is_updater   rn   ro   r   s         r   r   z_ConsulModule.module_to_obj   sT    KK%%' 	+DAq^^Aq)4F!'F1I	+ 
r   c                 &    d } fd}| j                   v ru|rt        |t              r ||      r	 ||      }n3t        |t        t        f      r ||      r|D cg c]
  } ||       }}|r| j
                  v ry t        |      |fS y y c c}w )Nc                 h    | j                         D ci c]  \  }}t        |      | c}}S c c}}w r   )ri   rI   )itemrn   ro   s      r   helperz'_ConsulModule.map_param.<locals>.helper   s*    59ZZ\BTQN1%q(BBBs   .c                    j                   j                  |    }|j                  d      dk(  xr' |j                  d      dk(  xr |j                  d      xs' |j                  d      dk(  xr |j                  d      S rd   )ry   rz   rO   )rn   rp   r   s     r   needs_camel_casez1_ConsulModule.map_param.<locals>.needs_camel_case   s|    <<--a0D F* (HHZ(F2(HHY'F ((6"f,D)1D	Fr   )r}   
isinstancerg   re   tuplecreate_only_fieldsrI   )r   rn   ro   r   r   r   is   `      r   r   z_ConsulModule.map_param   s    	C	F AM!T"'7':1IAe}-2B12E()*1VAY**Q$"9"99!!$a'' %2 +s   Bc                 z    t        j                  |      }t        j                  |      }| j                  ||      S r   )copydeepcopyneeds_update)r   api_obj
module_objs      r   r   z_ConsulModule._needs_update   s1    --(]]:.
  *55r   c                 T    |j                         D ]  \  }}||vr y||   |k7  s y y)NTF)ri   )r   r   r   rn   ro   s        r   r   z_ConsulModule.needs_update   s<    $$& 	DAqqzQ		
 r   c                     |j                         D ci c]  \  }}|| j                  vs|| }}}|j                         D ]
  \  }}|||<    |S c c}}w r   )ri   r~   )r   existingr   rn   ro   s        r   prepare_objectz_ConsulModule.prepare_object   sf    %^^-
Q$:U:U1UAqD
 
 IIK 	DAqHQK	
s
   AAc                 p    fd}| j                   r$| j                   D ]  } ||      }||v s||   c S  y )Nc                 "    rt        |       S | S r   )rI   )rF   
camel_cases    r   key_funcz+_ConsulModule.id_from_obj.<locals>.key_func   s    *4>#&=#=r   )unique_identifiers)r   r   r   r   
identifiers     `  r   id_from_objz_ConsulModule.id_from_obj   sI    	> """55 +
%j1
$z?*+ r   c                     |t         k(  r| j                  S |rdj                  | j                  |g      S t        d      )N/zinvalid arguments passed)r   api_endpointrE   r   )r   r   r   s      r   endpoint_urlz_ConsulModule.endpoint_url   s@    (($$$88T..
;<<566r   c                    | j                  | j                        }| j                  t        |      }	 | j	                  |      S # t
        $ r<}|j                  dk(  rY d }~y |j                  dk(  rd|j                  v rY d }~y  d }~ww xY w)Ni  i  s   ACL not found)r   rk   r   OPERATION_READrO   r   r   r   )r   r   urles       r   r   z_ConsulModule.read_object   sv    %%dkk2

;	88C=  	xx3S%5%H	s#   A 	B	B!BBB	c                     | j                   j                  r|S | j                  t              }| j	                  || j                  i |            }|| j                         }|S )Ndata)ry   
check_moder   r   putr   r   )r   r   r   created_objs       r   r   z_ConsulModule.create_object
  s^    <<""J##$45C((3T-@-@S-I(JK""..0r   c                     | j                  ||      }| j                  j                  r|S | j                  t        | j                  |d            }| j                  ||      }|| j                         }|S )NTr   r   )r   ry   r   r   r   r   r   r   )r   r   r   merged_objectr   updated_objs         r   r   z_ConsulModule.update_object  sw    ++Hc:<<""  ##$4d6F6Fx\`6F6abC((3](;K""..0r   c                     | j                   j                  ri S | j                  t        | j	                  |d            }| j                  |      S )NTr   )ry   r   r   r   r   delete)r   r   r   s      r   r   z_ConsulModule.delete_object  sG    <<""I##$4d6F6FsW[6F6\]C;;s##r   c                    | j                   }t        |t        t        f      s|g}|r&|j	                         D ci c]  \  }}|	|| }}}|j                  d      }|d   d|d   d|d   d}	dj                  |	gt        |      z         }
i }| j                   j                  d	      }|r||d
<   	 |t        j                  |      }d|d<   |r|
dt        |      }
t        |
||||d   |      }|j                         }t        |d      r|j                  n|j                         }d|cxk  rdk  rn nt/        ||      |rt        j0                  |      S y c c}}w # t        j                   $ r}t        |t        j"                        r'|j$                  }|j&                  j                         }n5| j(                  j+                  d|d   d|d   dt-        |              Y d }~d }~ww xY w)Nr6   r   r
   r   r   r   r   r   r   r   zapplication/jsonzContent-Type?r5   )methodr   headersr5   r6   r   z%Could not connect to consul agent at z, error was )msgr(   r)   )rk   r   r   re   ri   rO   rE   jsondumpsr   r   r_   hasattrr   getcodeurllib_errorURLError	HTTPErrorcodefpry   	fail_jsonstrr   loads)r   r   	url_partsr   rk   module_paramsrn   ro   r6   base_urlr   r   r   r,   r   r   r   s                    r   _requestz_ConsulModule._request&  s   )eT]3"I'-||~Gtq!adGFG##I.(#&!&!

 hhzDO34((-G$%	zz$'*<'!$i&78,-=>H %MMOM#*8X#>HDTDTDV  &3v}55::m,,e HD $$ 		!\334 !		&&$V,mF.CSVM '   		s%   
E"E"6A:E( (G;;A6G66G;c                 *     | j                   d|fi |S )NGETr   r   r   kwargss      r   rO   z_ConsulModule.geta      t}}UI888r   c                 *     | j                   d|fi |S )NPUTr   r   s      r   r   z_ConsulModule.putd  r   r   c                 *     | j                   d|fi |S )NDELETEr   r   s      r   r   z_ConsulModule.deleteg  s    t}}Xy;F;;r   )Fr   )NN)r#   r$   r%   __doc__r   r   r   setr   r~   rk   r    r   r   r   r   r   r   r   r   r   r   r   r   r   rO   r   r   r&   r   r   rs   rs   x   s     LJ UF	a')R(*6
	7
	$9v99<r   rs   )#
__future__r   r   r   r1   __metaclass__r   r   rP   %ansible.module_utils.six.moves.urllibr   r   +ansible.module_utils.six.moves.urllib.parser   ansible.module_utils.urlsr   r   r   rR   r   r-   rg   r|   rI   rX   rS   r{   r   r   r   r   r   r   rj   rs   r&   r   r   <module>r      s    A @   	 G A .7	A9 	AO
 	k	"	5$	'VT2
d
F 	A    &p< p<r   