
    VhwB                         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Z ej*                         d        Zd Zd Zd Zd Zd Zd Zedk(  r e        yy# e$ r Y lw xY w)a  
---
module: sqs_queue
version_added: 1.0.0
short_description: Creates or deletes AWS SQS queues
description:
  - Create or delete AWS SQS queues.
  - Update attributes on existing queues.
author:
  - Alan Loi (@loia)
  - Fernando Jose Pando (@nand0p)
  - Nadir Lloret (@nadirollo)
  - Dennis Podkovyrin (@sbj-ss)
options:
  state:
    description:
      - Create or delete the queue.
    choices: ['present', 'absent']
    default: 'present'
    type: str
  name:
    description:
      - Name of the queue.
    required: true
    type: str
  queue_type:
    description:
      - Standard or FIFO queue.
      - I(queue_type) can only be set at queue creation and will otherwise be
        ignored.
    choices: ['standard', 'fifo']
    default: 'standard'
    type: str
  deduplication_scope:
    description:
      - Deduplication scope for FIFO queues.
      - C(messageGroup) is required for high throughput FIFO.
      - Defaults to C(queue) on creation.
    choices: ['queue', 'messageGroup']
    type: str
    version_added: 5.3.0
  fifo_throughput_limit:
    description:
      - Throughput limit for FIFO queues.
      - C(perMessageGroupId) is required for high throughput FIFO.
      - Defaults to C(perQueue) on creation.
    choices: ['perQueue', 'perMessageGroupId']
    type: str
    version_added: 5.3.0
  visibility_timeout:
    description:
      - The default visibility timeout in seconds.
    aliases: [default_visibility_timeout]
    type: int
  message_retention_period:
    description:
      - The message retention period in seconds.
    type: int
  maximum_message_size:
    description:
      - The maximum message size in bytes.
    type: int
  delay_seconds:
    description:
      - The delivery delay in seconds.
    aliases: [delivery_delay]
    type: int
  receive_message_wait_time_seconds:
    description:
      - The receive message wait time in seconds.
    aliases: [receive_message_wait_time]
    type: int
  policy:
    description:
      - Policy to attach to the queue.
      - Policy body can be YAML or JSON.
      - This is required for certain use cases for example with S3 bucket notifications.
    type: dict
  redrive_policy:
    description:
      - JSON dict with the redrive_policy (see example).
    type: dict
  kms_master_key_id:
    description:
      - The ID of an AWS-managed customer master key (CMK) for Amazon SQS or a custom CMK.
      - Specifying a valid I(kms_master_key_id) will enable encryption automatically.
    type: str
  kms_data_key_reuse_period_seconds:
    description:
      - The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again.
    aliases: [kms_data_key_reuse_period]
    type: int
  content_based_deduplication:
    type: bool
    description:
      - Enables content-based deduplication. Used for FIFOs only.
      - Defaults to C(false).
extends_documentation_fragment:
  - amazon.aws.common.modules
  - amazon.aws.region.modules
  - amazon.aws.tags
  - amazon.aws.boto3
a  
content_based_deduplication:
    description: Enables content-based deduplication. Used for FIFOs only.
    type: bool
    returned: always
    sample: True
fifo_throughput_limit:
    description: Which throughput limit strategy is applied.
    type: str
    returned: always
    sample: perQueue
deduplication_scope:
    description: The deduplication setting.
    type: str
    returned: always
    sample: messageGroup
visibility_timeout:
    description: The default visibility timeout in seconds.
    type: int
    returned: always
    sample: 30
delay_seconds:
    description: The delivery delay in seconds.
    type: int
    returned: always
    sample: 0
kms_master_key_id:
    description: The ID of an AWS-managed customer master key (CMK) for Amazon SQS or a custom CMK.
    type: str
    returned: if value exists
    sample: alias/MyAlias
kms_data_key_reuse_period_seconds:
    description: The length of time, in seconds, for which Amazon SQS can reuse a data key to encrypt or decrypt messages before calling AWS KMS again.
    type: int
    returned: always
    sample: 300
maximum_message_size:
    description: The maximum message size in bytes.
    type: int
    returned: always
    sample: 262144
message_retention_period:
    description: The message retention period in seconds.
    type: int
    returned: always
    sample: 345600
name:
    description: Name of the SQS Queue
    type: str
    returned: always
    sample: "queuename-987d2de0"
queue_arn:
    description: The queue's Amazon resource name (ARN).
    type: str
    returned: on success
    sample: 'arn:aws:sqs:us-east-1:123456789012:queuename-987d2de0'
queue_url:
    description: URL to access the queue
    type: str
    returned: on success
    sample: 'https://queue.amazonaws.com/123456789012/MyQueue'
receive_message_wait_time_seconds:
    description: The receive message wait time in seconds.
    type: int
    returned: always
    sample: 0
region:
    description: Region that the queue was created within
    type: str
    returned: always
    sample: 'us-east-1'
tags:
    description: List of queue tags
    type: dict
    returned: always
    sample: '{"Env": "prod"}'
a=  
- name: Create SQS queue with redrive policy
  community.aws.sqs_queue:
    name: my-queue
    region: ap-southeast-2
    default_visibility_timeout: 120
    message_retention_period: 86400
    maximum_message_size: 1024
    delivery_delay: 30
    receive_message_wait_time: 20
    policy: "{{ json_dict }}"
    redrive_policy:
      maxReceiveCount: 5
      deadLetterTargetArn: arn:aws:sqs:eu-west-1:123456789012:my-dead-queue

- name: Drop redrive policy
  community.aws.sqs_queue:
    name: my-queue
    region: ap-southeast-2
    redrive_policy: {}

- name: Create FIFO queue
  community.aws.sqs_queue:
    name: fifo-queue
    region: ap-southeast-2
    queue_type: fifo
    content_based_deduplication: true

- name: Tag queue
  community.aws.sqs_queue:
    name: fifo-queue
    region: ap-southeast-2
    tags:
      example: SomeValue

- name: Configure Encryption, automatically uses a new data key every hour
  community.aws.sqs_queue:
    name: fifo-queue
    region: ap-southeast-2
    kms_master_key_id: alias/MyQueueKey
    kms_data_key_reuse_period_seconds: 3600

- name: Example queue allowing s3 bucket notifications
  sqs_queue:
    name: "S3Notifications"
    default_visibility_timeout: 120
    message_retention_period: 86400
    maximum_message_size: 1024
    delivery_delay: 30
    receive_message_wait_time: 20
    policy:
      Version: 2012-10-17
      Id: s3-queue-policy
      Statement:
        - Sid: allowNotifications
          Effect: Allow
          Principal:
            Service: s3.amazonaws.com
          Action:
            - SQS:SendMessage
          Resource: "arn:aws:sqs:*:*:S3Notifications"
          Condition:
            ArnLike:
              aws:SourceArn: "arn:aws:s3:*:*:SomeBucket"

- name: Delete SQS queue
  community.aws.sqs_queue:
    name: my-queue
    region: ap-southeast-2
    state: absent
    N)camel_dict_to_snake_dict)snake_dict_to_camel_dict)is_boto3_error_code)compare_policies)AWSRetry)compare_aws_tags)AnsibleCommunityAWSModulec                 l    | j                   j                  d      }|r|j                  d      r|S |dz   S )Nnamez.fifo)paramsgetendswith)moduleis_fifor   s      k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/aws/plugins/modules/sqs_queue.pyget_queue_namer     s3    ==V$DdmmG,'>    c                 V    	 | j                  |      d   S # t        d      $ r Y y w xY w)N)	QueueNameQueueUrl'AWS.SimpleQueueService.NonExistentQueue)get_queue_urlr   )clientr   s     r   r   r     s8    ##d#3J??HI s    ((c                 :   | j                  |dgd      d   }t        |      }|j                  dd       |j                  dd       t        |      }|j	                  dd      |d<   |j	                  dd      |d	<   |j                         D ]a  \  }}|	|d
v rt        j                  |      }|||<   (|dk(  r	 t        |      ||<   	 |t        t        |            k(  rt        |      ||<   c |S # t        t        f$ r Y ;w xY w# t        t        f$ r Y w xY w)z-
    Description a queue in snake format
    AllTr   AttributeNames	aws_retry
AttributesPolicyNRedrivePolicypolicyredrive_policy)r"   r#   content_based_deduplication)get_queue_attributesdictpopr   r   itemsjsonloadsbool	TypeError
ValueErrorstrint)r   	queue_url
attributesdescriptionkeyvaluer"   s          r   describe_queuer5   '  sD    ,,iQVPWcg,hiuvJz"KOOHd#OOOT**;7K&NN8T:K$.NN?D$IK ! "'') 
U=..ZZ&F%K//#';C 	CJ'#&u:C #*  z*  :& 		s$   ;C3
%D3DDDDc                    |j                   j                  d      dk(  }|j                   j                  d      }t        ||      }t        ||j                   j                  d      d      }t	        | |      }||d<   i }|s8|rd|d	<   |r||d
<   d|d<   |j
                  r|S | j                  ||d      d   }t        || |      \  }}	|dxx   |z  cc<   |	|d<   t        | ||      \  }}
|dxx   |z  cc<   |
|d<   |j                  t        | |             t        dddd      }t        |j                               D ]*  }|j                  |      }|s|j                  |      ||<   , |S )N
queue_typefifokms_master_key_idregionFr   r:   changedr0   True	FifoQueueKmsMasterKeyIdTr<   )r   r   r   r   	queue_arntagsdelivery_delayreceive_message_wait_timedefault_visibility_timeoutkms_data_key_reuse_period)delay_seconds!receive_message_wait_time_secondsvisibility_timeout!kms_data_key_reuse_period_seconds)r   r   r   r&   r   
check_modecreate_queueupdate_sqs_queueupdate_tagsupdater5   listkeys)r   r   r   r9   
queue_nameresultr0   create_attributesr<   arnrA   COMPATABILITY_KEYSr3   return_names                 r   create_or_update_sqs_queuerW   M  s   mm-7G))*=>0J}}  *F fj1I#F; -3k*2C./ yM''*IZfj'klvw	#FFI>LGS
9 F;	6:MGT
9 F6N
MM.34&*E7*E	 FKKM" 2 ),,S1"(**S/F;2 Mr   c                 T   | j                   }d}|j                  |dgd      d   }t        | j                  d      }t	               }| j                  j                  d      h| j                  j                  d      }|j                  dd	      }	t        j                  |	      }
t        |
|      rt        j                  |      |d<   d}| j                  j                  d
      h| j                  j                  d
      }|j                  dd	      }	t        j                  |	      }
t        |
|      rt        j                  |      |d<   d}|j                         D ]  \  }}|dv r||j                         vr|j                  |      0||   }t        |t              r2t        |      j                         }t        |      j                         }t        |      t        |      k(  rt        |      ||<   d} |r|s|j!                  ||d       ||j                  d      fS )NFr   Tr   r   )capitalize_firstr"   r    z{}r#   r!   )r    r!   )r   r   r   r@   )rJ   r%   r   r   r&   r   r)   r*   r   dumpsr(   rP   
isinstancer+   r.   lowerset_queue_attributes)r   r   r0   rJ   r<   existing_attributesnew_attributesattributes_to_setr"   current_valuecurrent_policy	attributer4   	new_values                 r   rL   rL     s   ""JG 55yZ_Y`lp5q .fmmdSN }}".""8,+//$?M2NF3*.**V*<h'G}})*6""#34+//FM2NF315F1Co.G/557 	533N//11i(0"9-	i&I,,.IJ$$&Ey>SZ' (+9~)$-0 z##YCT`d#e'++K888r   c                 R   |j                   j                  d      dk(  }t        ||      }t        ||j                   j                  d      d      }t	        | |      }|s|S t        |      |d<   |j                  s+  t        j                         | j                        |       |S )Nr7   r8   r:   Fr;   r<   )r   )
r   r   r   r&   r   r+   rJ   r   jittered_backoffdelete_queue)r   r   r   rQ   rR   r0   s         r   delete_sqs_queuerh     s    mm-7G0Jz&--*;*;H*EuUFfj1IYF98#!!#F$7$78)LMr   c                 D   |j                   j                  d      }|j                   j                  d      }|di fS 	 | j                  |d      d   }t        |||      \  }}|j                  sO|r| j                  ||d       |r| j                  ||	       | j                  |d      j                  di       }n|}t        |      xs t        |      }||fS # t        j                  j
                  t        j                  j                  t        f$ r i }Y w xY w)
NrA   
purge_tagsFT)r   r   Tags)rj   )r   TagKeysr   )r   rk   )r   r   list_queue_tagsbotocore
exceptionsClientErrorBotoCoreErrorKeyErrorr   rJ   untag_queue	tag_queuer+   )	r   r0   r   new_tagsrj   existing_tagstags_to_addtags_to_remover<   s	            r   rM   rM     s&   }}  (H""<0Jby..	T.RSYZ #3=(Wa"bK	>UYZikB..	T.RVVW]_ab >"7d;&7GM!! ++X-@-@-N-NPXY s   C >DDc                     t        d3i dt        ddddg      dt        dd      d	t        dd
d
dg      dt        ddg      dt        d      dt        d      dt        d      dt        ddg      dt        d      dt        ddg      dt        d      dt        dddg      dt        dd d!g      d"t        dd#gd$%      d&t        d'      d(t        dd)g      d*t        d'd+      } t        | d,      }|j                  j                  d      }t	        j
                  d-g.      }	 |j                  d/|0      }|dk(  rt        ||      }n|dk(  rt        ||      } |j                  d3i  y # t        j                  j                  t        j                  j                  f$ r}|j                  |d12       Y d }~y d }~ww xY w)4Nstater.   presentabsent)typedefaultchoicesr   T)r}   requiredr7   standardr8   rF   r/   rB   )r}   aliasesmaximum_message_size)r}   message_retention_periodr"   r&   rG   rC   r#   rH   rD   r9   fifo_throughput_limitperQueueperMessageGroupId)r}   r   deduplication_scopequeuemessageGrouprI   rE   F)r}   r   no_logr$   r+   rA   resource_tagsrj   )r}   r~   )argument_specsupports_check_moder   )catch_extra_error_codessqs)retry_decoratorzFailed to control sqs queue)msg )r&   AnsibleAWSModuler   r   r   rf   r   rW   rh   	exit_jsonrn   ro   rp   rq   fail_json_aws)r   r   rz   r   r   rR   es          r   mainr     s    y9h:OPut, UJV@TU 0@/AB	
 "u- "&5!1   +/ED_C`*a (  U5Q4RS E* #
DW7XY !eg~5NO +/ED_C`in*o %)f$5  v'89!" VT2#M& MtTFMMg&E//IrHstO	#uoFI/?Fh%ff5F 	"6" ++X-@-@-N-NO CQ$ABBCs   6F 7GGG__main__)F)DOCUMENTATIONRETURNEXAMPLESr)   rn   ImportError0ansible.module_utils.common.dict_transformationsr   r   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   :ansible_collections.amazon.aws.plugins.module_utils.policyr   ;ansible_collections.amazon.aws.plugins.module_utils.retriesr   ;ansible_collections.amazon.aws.plugins.module_utils.taggingr   >ansible_collections.community.aws.plugins.module_utils.modulesr	   r   r   rf   r   r5   rW   rL   rh   rM   r   __name__r   r   r   <module>r      s   fPL
\FP 	 V U \ W P X x  #L1h59p "4!#H zF }  		s   A5 5A=<A=