
    VhN                     \   d Z dZd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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dlmZ  G d de      Zd Zd Zd Zd Zd Zd Zd Zd Z  ejB                         d        Z"d Z#d Z$d Z%d Z&d Z'e(dk(  r e'        yy# e$ r Y w xY w) aK	  
---
module: ssm_parameter
version_added: 1.0.0
short_description: Manage key-value pairs in AWS Systems Manager Parameter Store
description:
  - Manage key-value pairs in AWS Systems Manager (SSM) Parameter Store.
  - Prior to release 5.0.0 this module was called C(community.aws.aws_ssm_parameter_store).
    The usage did not change.
options:
  name:
    description:
      - Parameter key name.
    required: true
    type: str
  description:
    description:
      - Parameter key description.
    required: false
    type: str
  value:
    description:
      - Parameter value.
    required: false
    type: str
  state:
    description:
      - Creates or modifies an existing parameter.
      - Deletes a parameter.
    required: false
    choices: ['present', 'absent']
    default: present
    type: str
  string_type:
    description:
      - Parameter String type.
    required: false
    choices: ['String', 'StringList', 'SecureString']
    default: String
    type: str
    aliases: ['type']
  decryption:
    description:
      - Work with SecureString type to get plain text secrets
    type: bool
    required: false
    default: true
  key_id:
    description:
      - AWS KMS key to decrypt the secrets.
      - The default key (C(alias/aws/ssm)) is automatically generated the first
        time it's requested.
    required: false
    default: alias/aws/ssm
    type: str
  overwrite_value:
    description:
      - Option to overwrite an existing value if it already exists.
    required: false
    choices: ['never', 'changed', 'always']
    default: changed
    type: str
  tier:
    description:
      - Parameter store tier type.
    required: false
    choices: ['Standard', 'Advanced', 'Intelligent-Tiering']
    default: Standard
    type: str
    version_added: 1.5.0
seealso:
  - ref: amazon.aws.aws_ssm lookup <ansible_collections.amazon.aws.aws_ssm_lookup>
    description: The documentation for the C(amazon.aws.aws_ssm) lookup plugin.

author:
  - "Davinder Pal (@116davinder) <dpsangwal@gmail.com>"
  - "Nathan Webster (@nathanwebsterdotme)"
  - "Bill Wang (@ozbillwang) <ozbillwang@gmail.com>"
  - "Michael De La Rue (@mikedlr)"

notes:
  - Support for I(tags) and I(purge_tags) was added in release 5.3.0.

extends_documentation_fragment:
  - amazon.aws.common.modules
  - amazon.aws.region.modules
  - amazon.aws.tags
  - amazon.aws.boto3
a  
- name: Create or update key/value pair in AWS SSM parameter store
  community.aws.ssm_parameter:
    name: "Hello"
    description: "This is your first key"
    value: "World"

- name: Delete the key
  community.aws.ssm_parameter:
    name: "Hello"
    state: absent

- name: Create or update secure key/value pair with default KMS key (aws/ssm)
  community.aws.ssm_parameter:
    name: "Hello"
    description: "This is your first key"
    string_type: "SecureString"
    value: "World"

- name: Create or update secure key/value pair with nominated KMS key
  community.aws.ssm_parameter:
    name: "Hello"
    description: "This is your first key"
    string_type: "SecureString"
    key_id: "alias/demo"
    value: "World"

- name: Always update a parameter store value and create a new version
  community.aws.ssm_parameter:
    name: "overwrite_example"
    description: "This example will always overwrite the value"
    string_type: "String"
    value: "Test1234"
    overwrite_value: "always"

- name: Create or update key/value pair in AWS SSM parameter store with tier
  community.aws.ssm_parameter:
    name: "Hello"
    description: "This is your first key"
    value: "World"
    tier: "Advanced"

- name: recommend to use with aws_ssm lookup plugin
  ansible.builtin.debug:
    msg: "{{ lookup('amazon.aws.aws_ssm', 'Hello') }}"

- name: Create or update key/value pair in AWS SSM parameter store w/ tags
  community.aws.ssm_parameter:
    name: "Hello"
    description: "This is your first key"
    value: "World"
    tags:
      Environment: "dev"
      Version: "1.0"
      Confidentiality: "low"
      Tag With Space: "foo bar"

- name: Add or update a tag on an existing parameter w/o removing existing tags
  community.aws.ssm_parameter:
    name: "Hello"
    purge_tags: false
    tags:
      Contact: "person1"

- name: Delete all tags on an existing parameter
  community.aws.ssm_parameter:
    name: "Hello"
    tags: {}
a5  
parameter_metadata:
  type: dict
  description:
    - Information about a parameter.
    - Does not include the value of the parameter as this can be sensitive
      information.
  returned: success
  contains:
    data_type:
      type: str
      description: Parameter Data type.
      example: text
      returned: success
    description:
      type: str
      description: Parameter key description.
      example: This is your first key
      returned: success
    last_modified_date:
      type: str
      description: Time and date that the parameter was last modified.
      example: '2022-06-20T09:56:58.573000+00:00'
      returned: success
    last_modified_user:
      type: str
      description: ARN of the last user to modify the parameter.
      example: 'arn:aws:sts::123456789012:assumed-role/example-role/session=example'
      returned: success
    name:
      type: str
      description: Parameter key name.
      example: Hello
      returned: success
    policies:
      type: list
      description: A list of policies associated with a parameter.
      elements: dict
      returned: success
      contains:
        policy_text:
          type: str
          description: The JSON text of the policy.
          returned: success
        policy_type:
          type: str
          description: The type of policy.
          example: Expiration
          returned: success
        policy_status:
          type: str
          description: The status of the policy.
          example: Pending
          returned: success
    tier:
      type: str
      description: Parameter tier.
      example: Standard
      returned: success
    type:
      type: str
      description: Parameter type
      example: String
      returned: success
    version:
      type: int
      description: Parameter version number
      example: 3
      returned: success
    tags:
      description: A dictionary representing the tags associated with the parameter.
      type: dict
      returned: when the parameter has tags
      example: {'MyTagName': 'Some Value'}
      version_added: 5.3.0
    N)BotoCoreError)ClientError)camel_dict_to_snake_dict)is_boto3_error_code)AWSRetry)ansible_dict_to_boto3_tag_list)boto3_tag_list_to_ansible_dict)compare_aws_tags)BaseWaiterFactory)AnsibleCommunityAWSModulec                   2     e Zd Z fdZe fd       Z xZS )ParameterWaiterFactoryc                 P    |j                  d      }t        t        |   ||       y )Nssm)clientsuperr   __init__)selfmoduler   	__class__s      o/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/aws/plugins/modules/ssm_parameter.pyr   zParameterWaiterFactory.__init__
  s#    u%$d4VVD    c                 8   t         t        | 
  }t        t        dddt        ddd      t        ddd	d
      t        ddd	d      g      t        dddt        ddd	d      t        ddd	d      t        ddd      g            }|j	                  |       |S )NDescribeParameters      retryerrorParameterNotFound)statematcherexpectedpathTz length(Parameters[].Name) == `0`)r    r!   r"   argumentsuccesszlength(Parameters[].Name) > `0`)	operationdelaymaxAttempts	acceptorszlength(Parameters[]) == `0`)parameter_existsparameter_deleted)r   r   _waiter_model_datadictupdate)r   datassm_datar   s      r   r,   z)ParameterWaiterFactory._waiter_model_data  s    +TE!.wBUVwPrsy&4Rst		 #.wPqry&4Ropy'DWX		
, 	Hr   )__name__
__module____qualname__r   propertyr,   __classcell__)r   s   @r   r   r   	  s    E  r   r   c                    |j                   ry t        |      }|j                  d      }	 |j                  d|gdg       y # t        j
                  j                  $ r |j                  d       Y y t        j
                  j                  t        j
                  j                  f$ r}|j                  |d       Y d }~y d }~ww xY w)Nr*   NameKeyValuesParameterFilters&Timeout waiting for parameter to existz7Failed to describe parameter while waiting for creationmsg
check_moder   
get_waiterwaitbotocore
exceptionsWaiterErrorwarnr   r   fail_json_awsr   r   namewfwaiteres         r   _wait_existsrN   +  s    		'B]]-.F_&,?@ 	 	
 ** ><=++X-@-@-N-NO _Q$]^^_   A .C36C)CCc                 p   |j                   ry t        dd      D ]C  }	 t        | |d|gdg      }|j                  dd      |kD  r y 	 t        j                  d       E y # t        j
                  j                  t        j
                  j                  f$ r}|j                  |d	       Y d }~gd }~ww xY w)
Nr   
   r7   r8   r;   Versionr   z5Failed to describe parameter while waiting for updater>   )rA   rangedescribe_parametergetrD   rE   r   r   rH   timesleep)r   r   rJ   versionx	parameterrM   s          r   _wait_updatedr[   :  s    1b\ 	a*66U[hlgmMnLopI}}Y*W4 5 	

1
 ##//1D1D1R1RS 	a  (_ ``	as   (A!!7B5B00B5c                    |j                   ry t        |      }|j                  d      }	 |j                  d|gdg       y # t        j
                  j                  $ r |j                  d       Y y t        j
                  j                  t        j
                  j                  f$ r}|j                  |d       Y d }~y d }~ww xY w)Nr+   r7   r8   r;   r=   z7Failed to describe parameter while waiting for deletionr>   r@   rI   s         r   _wait_deletedr]   H  s    		'B]]./F_&,?@ 	 	
 ** ><=++X-@-@-N-NO _Q$]^^_rO   c                     	 | j                  dd||      S # t        t        f$ r}|j                  |d       Y d }~y d }~ww xY w)NT	Parameter)	aws_retryResourceType
ResourceIdTagsz!Failed to add tag(s) to parameterr>   )add_tags_to_resourcer   r   rH   )r   r   parameter_nametagsrM   s        r   tag_parameterrg   W  sZ    I**VZ + 
 	
 ;' IQ$GHHI    A>Ac                     	 | j                  dd||      S # t        t        f$ r}|j                  |d       Y d }~y d }~ww xY w)NTr_   )r`   ra   rb   TagKeysz&Failed to remove tag(s) from parameterr>   )remove_tags_from_resourcer   r   rH   )r   r   re   tag_keysrM   s        r   untag_parameterrm   `  sZ    N//Ya 0 
 	
 ;' NQ$LMMNrh   c                     	 | j                  dd|      d   }t        |      }|S # t        t        f$ r}|j	                  |d       Y d }~y d }~ww xY w)NTr_   )r`   ra   rb   TagListz!Unable to retrieve parameter tagsr>   )list_tags_for_resourcer	   r   r   rH   )r   r   re   rf   	tags_dictrM   s         r   get_parameter_tagsrr   i  sh    I,,t+bp,q
 348	;' IQ$GHHIs   #& AAAc                 $   d}i }|d|fS t        | ||      }t        |||j                  j                  d            \  }}|r)|j                  rd|fS t        | ||t        |            }d}|r |j                  rd|fS t        | |||      }d}||fS )NF
purge_tagsT)rr   r
   paramsrU   rA   rg   r   rm   )	r   r   re   supplied_tagschangedresponsecurrent_tagstags_to_addtags_to_removes	            r   update_parameter_tagsr|   t  s    GHh%ffnEL"2<PVP]P]PaPabnPo"pK>! A_`kAlm>!"66>>RHr   c                    d}i }|j                   rd|fS 	  | j                  dddi|}d}||fS # t        j                  j                  t        j                  j
                  f$ r }|j                  |d       Y d }~||fS d }~ww xY w)NFTr`   setting parameterr>    )rA   put_parameterrD   rE   r   r   rH   )r   r   argsrw   rx   excs         r   update_parameterr     s    GHX~;'6''?$?$? H ++X-@-@-N-NO ;S&9::H;s   0 7B'BBc                     | j                  d      } |j                  di |j                         }|d   sy t        | ||j                  j                  d            }||d   d   d<   |d   d   S )Ndescribe_parameters
ParametersrJ   r   rf   r   )get_paginatorpaginatebuild_full_resultrr   ru   rU   )r   r   r   	paginatorexisting_parameterrq   s         r   rT   rT     s    $$%:;I+++3d3EEGl+"666==3D3DV3LMI2;|$Q'/l+A..r   c                    d}d }i }t        |j                  j                  d      |j                  j                  d      |j                  j                  d            }|j                  j                  d      dv r|j                  d	       n|j                  d	       |j                  j                  d
      +|j                  |j                  j                  d
             |j                  j                  d      r+|j                  |j                  j                  d             |j                  j                  d      dk(  r+|j                  |j                  j                  d             	 | j	                  d|d   d      }|ry|d   d   }d|vr|d   d   |d<   |j                  j                  d      dk(  rt        | |fi |\  }}n|j                  j                  d      dk(  r|d   d   |d   k7  rt        | |fi |\  }}nn|d   d   |d   k7  rt        | |fi |\  }}nO|j                  d      r>	 t        | |d|d   gdg      }j                  d      |d   k7  rt        | |fi |\  }}|r't        | ||j                  j                  d      |       |j                  j                  d      dk7  r=t        | ||d   d   |j                  j                  d             \  }	}
|xs |	}|
r|
|d!<   ||fS |j                  j                  d       rF|j                  t        |j                  j                  d             "       |j                  d	       t        | |fi |\  }}t        | ||j                  j                  d             ||fS # t
        j                  j                  $ r Y 7t
        j                  j                  $ r}|j                  |d       Y d }~ld }~ww xY w# t
        j                  j                  t
        j                  j                  f$ r}|j                  |d       Y d }~d }~ww xY w)#NFrJ   string_typetier)r7   TypeTieroverwrite_value)alwaysrw   T)	Overwritevalue)Valuedescription)DescriptionSecureStringkey_id)KeyIdr7   r`   r7   WithDecryptionzfetching parameterr>   r_   rR   r   r   rw   r   r   r8   r;   zgetting description valueneverrf   tag_updates)rc   )r-   ru   rU   r.   get_parameterrD   rE   r   r   rH   r   rT   r[   r|   r   rN   )r   r   rw   r   rx   r   rM   original_versiondescribe_existing_parametertags_changedtags_responses              r   create_update_parameterr     s   GHV]]&&v.V]]5F5F}5U\b\i\i\m\mnt\uvD}}*+/DDd#e$}}!-&--++G45}}' 1 1- @A}}'>9&--++H56:#11DtF|dh1i -k:9E$.{;GDDM==./8;"266"JT"JWh]]01Y>!+.v6$v,F&6vv&N&N#(#K09T']J&6vv&N&N#(-(M2D&UYZ`UaTb:c9d3/ /22=AT-EXX*:66*RT*R'Wh&&&--*;*;F*CEUV ==./7:*? 2; ? GIZIZ[aIb+'L- -G*7' H ==V$KK;FMM<M<Mf<UVKWKK%K(.vvFF(VVV]]%6%6v%>?Ho ** ,, :Q$899:0 !++779L9L9Z9Z[ M((0K(LLMs6   8N& P &P P "O;;P 7Q:QQc                    i }	 | j                  d|j                  j                  d      d      }sdi fS |j                  rdi fS 	 | j                  d|j                  j                  d            }t        | ||j                  j                  d             d|fS # t        d      $ r di fcY S t        j
                  j                  $ r d}Y t        j
                  j                  $ r}|j                  |d       Y d }~d }~ww xY w# t        d      $ r di fcY S t        j
                  j                  t        j
                  j                  f$ r}|j                  |d	       Y d }~d }~ww xY w)
NTrJ   r   r   Fr~   r>   )r`   r7   zdeleting parameter)r   ru   rU   r   rD   rE   r   r   rH   rA   delete_parameterr]   )r   r   rx   r   rM   s        r   r   r     sp   H9#11Dv}}GXGXY_G`qu1v byRx:**T@Q@QRX@Y*Z &&&--"3"3F";<>3 23 by** "!,, 9Q$7889 23 by'')) : 	Q$899	:sA   -B ,D D2DD.DDE5"6E5E00E5c                 T    t        j                         }| j                  d|      }|S )Nr   )retry_decorator)r   jittered_backoffr   )r   r   
connections      r   setup_clientr     s(    //1OuoFJr   c                  F   t        t        d      t               t        dd      t        dddg      t        dg d	d
g      t        dd      t        d      t        dg d      t        dg d      t        ddg      t        dd            } t        | d      S )NT)requiredF)r   no_logpresentabsent)defaultchoicesString)r   
StringListr   type)r   r   aliasesbool)r   r   zalias/aws/ssm)r   rw   )r   rw   r   Standard)r   AdvancedzIntelligent-Tieringr-   resource_tags)r   r   )r   r   )rJ   r   r   r    r   
decryptionr   r   r   rf   rt   )argument_specsupports_check_mode)r-   AnsibleAWSModule)r   s    r   setup_module_objectr   !  s    4 FE$/9y(.CD3[flemn62O,Y8VW*.]^v'89VT2M #  r   c                      t               } | j                  j                  d      }t        |       }t        t
        d} ||   ||       \  }}d|i}	 t        || d| j                  j                  d      gdg      }rt        |dg      |d<    | j                  dd|i| y # t        d      $ r d	i fcY S t        j                  j                  t        j                  j                  f$ r}| j                  |d
       Y d }~d }~ww xY w)Nr    )r   r   rx   r7   rJ   r8   r;   r   Fzto describe parameterr>   rf   )ignore_listparameter_metadatarw   r   )r   ru   rU   r   r   r   rT   r   rD   rE   r   r   rH   r   	exit_json)	r   r    r   invocationsrw   rx   resultr   rM   s	            r   mainr   6  s    "FMMg&E&!F +"K -+e,VV<Wh(#F=/FfIZIZ[aIbHc.d-e
 '?@Rag`h'i#$F/W// 23 by++X-@-@-N-NO =Q$;<<=s   ,B& &D:6D0DD__main__))DOCUMENTATIONEXAMPLESRETURNrV   rD   botocore.exceptionsr   r   ImportError0ansible.module_utils.common.dict_transformationsr   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   ;ansible_collections.amazon.aws.plugins.module_utils.retriesr   ;ansible_collections.amazon.aws.plugins.module_utils.taggingr   r	   r
   ;ansible_collections.community.aws.plugins.module_utils.baser   >ansible_collections.community.aws.plugins.module_utils.modulesr   r   r   rN   r[   r]   rg   rm   rr   r|   r   r   rT   r   r   r   r   r   r1   r   r   r   <module>r      s   XtDLK
Z 	1/ V \ P f f X Y x. D__INI0 
/ 
/NbB*06 zF o
  		s   B# #B+*B+