
    Vh*                         d dl Z d dlZd dlZd dlmZ 	 d dlZd dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d	 Zd
 Zd Zd Zd Zd Zd Zd Zy# e$ r Y Dw xY w)    N)deepcopy)camel_dict_to_snake_dict)string_types)is_boto3_error_code)ansible_dict_to_boto3_tag_list)boto3_tag_list_to_ansible_dict)compare_aws_tagsc                    	 | j                  |      }|d   S # t        d      $ r Y yt        j                  j                  t        j                  j
                  f$ r$}|j                  |d|        Y d}~d   S d}~ww xY w)z;
    Get the status of an existing OpenSearch cluster.
    
DomainNameResourceNotFoundExceptionNCouldn't get domain msgDomainStatus)describe_domainr   botocore
exceptionsBotoCoreErrorClientErrorfail_json_aws)clientmoduledomain_nameresponsees        q/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/aws/plugins/module_utils/opensearch.pyget_domain_statusr      s    J))[)A N## :; ))'' J 	Q&:;-$HIIN##Js    B6BA>>Bc                    	 | j                  |      }i }d}|d   D ]  }d|d   |   v s|d   |   d   ||<    ||d	<   d
|v r=i }d|d
   v rt        |d
   d         |d<   d|d
   v rt        |d
   d         |d<   ||d
<   |d   d   D ]7  }	t        |	d   t        j                        s!|	d   j                  d      |	d<   9 |j                  dd       t        | ||      }
|
|
d   }||fS # t        d      $ r Y yt        j                  j                  t        j                  j
                  f$ r!}|j                  |d|        Y d}~=d}~ww xY w)a  
    Get the configuration of an existing OpenSearch cluster, convert the data
    such that it can be used as input parameter to client.update_domain().
    The status info is removed.
    The returned config includes the 'EngineVersion' property, it needs to be removed
    from the dict before invoking client.update_domain().

    Return (domain_config, domain_arn) or (None, None) if the domain does not exist.
    r   r   )NNr   r   NDomainConfigOptionsr   
VPCOptions	SubnetIdsSecurityGroupIdsAutoTuneOptionsMaintenanceSchedulesStartAtz%Y-%m-%dAdvancedOptionsARN)describe_domain_configr   r   r   r   r   r   r   
isinstancedatetimestrftimepopr   )r   r   r   r   r   domain_configarnkdcsdomains              r   get_domain_configr5   )   s   J00K0H M
C.) 	JAH^4Q77#+N#;A#>y#Ia 	J '2l#=( BmL99"*=+F{+S"T;!]<%@@)1-2MN`2a)b%&*,M,' 012HI 	AA!I,(9(9: |44Z@)	A 	+T2 #66;?-C3I :; ))'' J 	Q&:;-$HII	Js   C/ /E?6E5EEc                 l   	 t        | j                  |d   d      d         |d<   t        |dg
      S # t        j                  j                  t        j                  j
                  f$ r"}|j                  |d|d           Y d}~bd}~wt        $ r |j                  t        |      	       Y w xY w)z
    Merge the input domain object with tags associated with the domain,
    convert the attributes from camel case to snake case, and return the object.
    r)   T)r)   	aws_retryTagListTagszCouldn't get tags for domain r   Nr   )ignore_list)r   	list_tagsr   r   r   r   r   KeyError	fail_jsonstrr   )r   r   r4   r   s       r   normalize_opensearchr?   \   s    
*78H8HVTY]fj8H8klu8vwv $FAA ++X-@-@-N-NO YQ"?}@U?V WXX *S[)*s   %5 7B3,B		'B32B3c                    |j                   d   sy |j                   d   }t        j                         |z   }d}t        j                         |k  rut        | ||      }|d}|dk(  r2y dj                  |d   |d   |d	         }|d
k(  r|d   r|d   s|d	   sy t        j                  d       t        j                         |k  ru|j                  d| d|        y )Nwaitwait_timeout z	Not Founddomain_deletedz5Created: {0}. Processing: {1}. UpgradeProcessing: {2}Created
ProcessingUpgradeProcessingdomain_available   z Timeout waiting for wait state 'z'. r   )paramstimer   formatsleepr=   )r   r   r   waiter_nametimeoutdeadline
status_msgstatuss           r   wait_for_domain_statusrS   k   s    == mmN+Gyy{W$HJ
))+
 "66;?>$J..PWWy!|$*+J 119%|,23

2' ))+
 * ;K=J<XY    c                 .   | j                  d      }t        |      dk7  ry|d   j                  d      }t        |      dk7  ry|d   }|dvry|d   j                         r|d   j                         syt        |d         }t        |d         }|||dS )	z
    Parse the engine version, which should be Elasticsearch_X.Y or OpenSearch_X.Y
    Return dict { 'engine_type': engine_type, 'major': major, 'minor': minor }
    _   N   .r   Elasticsearch
OpenSearch)engine_typemajorminor)splitlenisdigitint)engine_versionversionsemverr]   r^   r_   s         r   parse_versionrg      s    
 ""3'G
7|qQZc"F
6{a!*K991IF1I$5$5$7q	NEq	NE&GGrT   c                 P   ddd}t        | t              rt        |       } t        |t              rt        |      }| |y| |y| |y|j                  | j                  d            }|j                  |j                  d            }||k  ry||kD  ry| j                  d      |j                  d      k  ry| j                  d      |j                  d      kD  ry| j                  d      |j                  d      k  ry| j                  d      |j                  d      kD  ryy)	NrX   rW   rZ   r   r]   r^   r_   )r+   r   rg   get)version1version2supported_enginese1e2s        r   compare_domain_versionsrp      s!    (L) *(L) *H0		("2		h.			x||M:	;B			x||M:	;B	Bw	b<< 8<<#88\\'"X\\'%::||G$x||G'<<g&g)>>rT   c                    d}	 | j                  |      }|j                  d      }||j                  d|       t        |      dk(  r|j                  d|       |d   j                  d	      |j                  d
|       g }|d   j                  d	      D ]*  }||k(  r|c S t        |      }	|	|j                  |	       , t        |t        j                  t                    }t        |      D ]  }t        ||      dk  s|c S  y# t        j                  j                  t        j                  j                  f$ r!}|j                  |d|        Y d}~Ld}~ww xY w)a  
    Returns the highest compatible version which is less than or equal to target_version.
    When upgrading a domain from version V1 to V2, it may not be possible to upgrade
    directly from V1 to V2. The domain may have to be upgraded through intermediate versions.
    Return None if there is no such version.
    For example, it's not possible to upgrade directly from Elasticsearch 5.5 to 7.10.
    Nr   z,Couldn't get compatible versions for domain r   CompatibleVersionsz/Unable to determine list of compatible versions)compatible_versionsr   TargetVersionszNo compatible versions found)key)get_compatible_versionsr   r   r   r   r   rj   r=   ra   rg   appendsorted	functools
cmp_to_keyrp   reversed)
r   r   r   target_versionapi_compatible_versionsr   compatrs   vrf   s
             r   get_target_increment_versionr      s    #
"("@"@K"@"X %(()=>F~J`wx
6{aJ`wxay}}%&.7MdeAY]]+, /Q!!q!&&v./ !!4):N:NOf:gh)* "1n5:H 5 --x/B/B/N/NO 
>{mL 	 	
 	

s   D 7E'E""E'c                    |yt        |||      \  }}t        |xs |      }|r<|j                  r|j                  dd       	 | j	                  |t        |             |r5|j                  r|j                  dd       	 | j                  ||       |S |S # t        j                  j                  t        j                  j                  f$ r}	|j                  |	d|        Y d }	~	d }	~	ww xY w# t        j                  j                  t        j                  j                  f$ r }	|j                  |	d	|        Y d }	~	|S d }	~	ww xY w)
NFTz4Would have added tags to domain if not in check mode)changedr   )r)   r8   zCouldn't add tags to domain z,Would have removed tags if not in check mode)r)   TagKeysz!Couldn't remove tags from domain )r	   bool
check_mode	exit_jsonadd_tagsr   r   r   r   r   r   remove_tags)
r   r   resource_arnexisting_tagstags
purge_tagstags_to_addtags_to_remover   r   s
             r   ensure_tagsr      sZ   |"2=$
"SK;0.1GT/ef		SOO 6{C   T/]^	X<H N7N ++--
 	S   &B<.$QRR		S ++--
 	X   &G~$VWWN	Xs0   B C3 7C0C++C037E
*EE
)r,   ry   rK   copyr   r   ImportError0ansible.module_utils.common.dict_transformationsr   ansible.module_utils.sixr   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   ;ansible_collections.amazon.aws.plugins.module_utils.taggingr   r   r	   r   r5   r?   rS   rg   rp   r   r    rT   r   <module>r      ss       	 V 1 \ f f X$ 0 fBZ<H* F%Py  		s   A AA