
    Vh&                         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  G d
 de      Z G d de      Zd Zedk(  r e        yy# e$ r Y Lw xY w)a  
---

version_added: 1.0.0
module: cloudfront_invalidation

short_description: create invalidations for AWS CloudFront distributions
description:
  - Allows for invalidation of a batch of paths for a CloudFront distribution.

author:
  - Willem van Ketwich (@wilvk)

options:
    distribution_id:
      description:
        - The ID of the CloudFront distribution to invalidate paths for. Can be specified instead of the alias.
      required: false
      type: str
    alias:
      description:
        - The alias of the CloudFront distribution to invalidate paths for. Can be specified instead of distribution_id.
      required: false
      type: str
    caller_reference:
      description:
        - A unique reference identifier for the invalidation paths.
        - Defaults to current datetime stamp.
      required: false
      default:
      type: str
    target_paths:
      description:
        - A list of paths on the distribution to invalidate. Each path should begin with C(/). Wildcards are allowed. eg. C(/foo/bar/*)
      required: true
      type: list
      elements: str

notes:
  - does not support check mode

extends_documentation_fragment:
  - amazon.aws.common.modules
  - amazon.aws.region.modules
  - amazon.aws.boto3
ag  
- name: create a batch of invalidations using a distribution_id for a reference
  community.aws.cloudfront_invalidation:
    distribution_id: E15BU8SDCGSG57
    caller_reference: testing 123
    target_paths:
      - /testpathone/test1.css
      - /testpathtwo/test2.js
      - /testpaththree/test3.ss

- name: create a batch of invalidations using an alias as a reference and one path using a wildcard match
  community.aws.cloudfront_invalidation:
    alias: alias.test.com
    caller_reference: testing 123
    target_paths:
      - /testpathone/test4.css
      - /testpathtwo/test5.js
      - /testpaththree/*
a  
invalidation:
  description: The invalidation's information.
  returned: always
  type: complex
  contains:
    create_time:
      description: The date and time the invalidation request was first made.
      returned: always
      type: str
      sample: '2018-02-01T15:50:41.159000+00:00'
    id:
      description: The identifier for the invalidation request.
      returned: always
      type: str
      sample: I2G9MOWJZFV612
    invalidation_batch:
      description: The current invalidation information for the batch request.
      returned: always
      type: complex
      contains:
        caller_reference:
          description: The value used to uniquely identify an invalidation request.
          returned: always
          type: str
          sample: testing 123
        paths:
          description: A dict that contains information about the objects that you want to invalidate.
          returned: always
          type: complex
          contains:
            items:
              description: A list of the paths that you want to invalidate.
              returned: always
              type: list
              sample:
              - /testpathtwo/test2.js
              - /testpathone/test1.css
              - /testpaththree/test3.ss
            quantity:
              description: The number of objects that you want to invalidate.
              returned: always
              type: int
              sample: 3
    status:
      description: The status of the invalidation request.
      returned: always
      type: str
      sample: Completed
location:
  description: The fully qualified URI of the distribution and invalidation batch request.
  returned: always
  type: str
  sample: https://cloudfront.amazonaws.com/2017-03-25/distribution/E1ZID6KZJECZY7/invalidation/I2G9MOWJZFV622
    N)camel_dict_to_snake_dict)snake_dict_to_camel_dict)is_boto3_error_message)CloudFrontFactsServiceManager)AnsibleCommunityAWSModulec                   "    e Zd ZdZd Zd Zd Zy)$CloudFrontInvalidationServiceManagerzC
    Handles CloudFront service calls to AWS for invalidations
    c                 L    || _         |j                  d      | _        || _        y )N
cloudfront)moduleclient;_CloudFrontInvalidationServiceManager__cloudfront_facts_mgrselfr   cloudfront_facts_mgrs      y/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/aws/plugins/modules/cloudfront_invalidation.py__init__z-CloudFrontInvalidationServiceManager.__init__   s!    mmL1&:#    c                    | j                  ||d         }	 | j                  j                  ||      }|j                  dd        |r|dfS |dfS # t	        d      $ r" | j
                  j                  d       |dfcY S t        j                  j                  t        j                  j                  f$ r'}| j
                  j                  |d	       Y d }~y d }~ww xY w)
NCallerReference)DistributionIdInvalidationBatchResponseMetadataFTzsYour request contains a caller reference that was used for a previous invalidation batch for the same distribution.zmInvalidationBatch target paths are not modifiable. To make a new invalidation please update caller_reference.z(Error creating CloudFront invalidations.msg)get_invalidationr   create_invalidationpopr   r   warnbotocore
exceptionsClientErrorBotoCoreErrorfail_json_aws)r   distribution_idinvalidation_batchcurrent_invalidation_responseresponsees         r   r   z8CloudFrontInvalidationServiceManager.create_invalidation   s    (,(=(=oOabsOt(u%	Y{{66.BT 7 H LL+T2,&~%%/
 	8 KKM 1%77++--
 	Y KK%%a-W%XX		Ys#   4A A -C?6C5CCc                     | j                   j                  |      }|D ]\  }| j                   j                  ||d         }|j                  di       j                  d      |k(  sH|j	                  dd        |c S  i S )N)r%   Id)r%   idr   r   r   )r   list_invalidationsr   getr   )r   r%   caller_referenceinvalidationsinvalidationinvalidation_infos         r   r   z5CloudFrontInvalidationServiceManager.get_invalidation   s    33FFWfFg * 	)L $ ; ; L L /L4F !M ! !$$%8"=AABSTXhh!%%&8$?((	) 	r   N)__name__
__module____qualname____doc__r   r   r    r   r   r	   r	      s    ;
Y4r   r	   c                   (    e Zd ZdZd Zd Zd Zd Zy)'CloudFrontInvalidationValidationManagerzA
    Manages CloudFront validations for invalidation batches
    c                      || _         || _        y )N)r   >_CloudFrontInvalidationValidationManager__cloudfront_facts_mgrr   s      r   r   z0CloudFrontInvalidationValidationManager.__init__   s    &:#r   c                 D   	 ||| j                   j                  d       || j                  j                  |      }|S # t        j
                  j                  t        j
                  j                  f$ r'}| j                   j                  |d       Y d }~y d }~ww xY w)Nz*distribution_id or alias must be specifiedr   zError validating parameters.)	r   	fail_jsonr;   $get_distribution_id_from_domain_namer    r!   r"   r#   r$   )r   r%   aliasr)   s       r   validate_distribution_idz@CloudFrontInvalidationValidationManager.validate_distribution_id   s    	M&5=%%*V%W&"&"="="b"bch"i""##//1D1D1R1RS 	MKK%%a-K%LL	Ms   >A 7B8BBc                 0    i }t        |      |d<   ||d<   |S )NQuantityItems)len)r   r&   aws_lists      r   create_aws_listz7CloudFrontInvalidationValidationManager.create_aws_list   s&    "#56.r   c                 T   	 ||}n,t         j                   j                         j                         }| j                  |      |d}|S # t        j
                  j                  t        j
                  j                  f$ r'}| j                  j                  |d       Y d }~y d }~ww xY w)N)pathsr/   z$Error validating invalidation batch.r   )
datetimenow	isoformatrF   r    r!   r"   r#   r   r$   )r   r&   r/   valid_caller_referencevalid_invalidation_batchr)   s         r   validate_invalidation_batchzCCloudFrontInvalidationValidationManager.validate_invalidation_batch   s    	U+)9&)1):):)>)>)@)J)J)L&--.@A$:($ ,+##//1D1D1R1RS 	UKK%%a-S%TT	Us   AA	 	7B' B""B'N)r3   r4   r5   r6   r   r@   rF   rN   r7   r   r   r9   r9      s    ;MUr   r9   c            
      r   t        t               t               t               t        ddd            } t        | dddgg	      }t        |      }t        ||      }t	        ||      }|j
                  j                  d
      }|j
                  j                  d      }|j
                  j                  d      }|j
                  j                  d      }i }	|j                  ||      }|j                  ||      }
t        |
d      }|j                  ||      \  }	} |j                  dd|it        |	       y )NTliststr)requiredtypeelements)r/   r%   r?   target_pathsFr%   r?   )argument_specsupports_check_modemutually_exclusiver/   rU   changedr7   )dictAnsibleAWSModuler   r9   r	   paramsr.   r@   rN   r   r   	exit_jsonr   )rV   r   r   validation_mgrservice_mgrr/   r%   r?   rU   resultvalid_target_pathsvalid_pascal_target_pathsrY   s                r   mainrc      s,   f4fuE	M #UfhoTpSqF 9@<VEYZN6v?STK}}(();<mm''(9:OMMg&E==$$^4LF$==ouUO'CCLRbc 89KT R!55oG`aOFGFIWI(@(HIr   __main__)DOCUMENTATIONEXAMPLESRETURNrI   r    ImportError0ansible.module_utils.common.dict_transformationsr   r   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   Dansible_collections.amazon.aws.plugins.module_utils.cloudfront_factsr   >ansible_collections.community.aws.plugins.module_utils.modulesr   r[   objectr	   r9   rc   r3   r7   r   r   <module>rn      s   -^(6
p 	 V U _ n x06 0f%Uf %UPJ> zF M  		s   A AA