
    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 dd
lmZ  G d de      Zd Zd Zd Zd Zd Zd Zedk(  r e        yy# e$ r Y Vw xY w)ao  
---
module: lambda_alias
version_added: 5.0.0
short_description: Creates, updates or deletes AWS Lambda function aliases
description:
  - This module allows the management of AWS Lambda functions aliases via the Ansible
    framework. It is idempotent and supports "Check" mode. Use module M(amazon.aws.lambda) to manage the lambda function
    itself and M(amazon.aws.lambda_event) to manage event source mappings.
  - This module was originally added to C(community.aws) in release 1.0.0.

author:
  - Pierre Jodouin (@pjodouin)
  - Ryan Scott Brown (@ryansb)
options:
  function_name:
    description:
      - The name of the function alias.
    required: true
    type: str
  state:
    description:
      - Describes the desired state.
    default: "present"
    choices: ["present", "absent"]
    type: str
  name:
    description:
      - Name of the function alias.
    required: true
    aliases: ['alias_name']
    type: str
  description:
    description:
      - A short, user-defined function alias description.
    type: str
  function_version:
    description:
      -  Version associated with the Lambda function alias.
         A value of V(0) (or omitted parameter) sets the alias to the $LATEST version.
    aliases: ['version']
    type: int
    default: 0
extends_documentation_fragment:
  - amazon.aws.common.modules
  - amazon.aws.region.modules
  - amazon.aws.boto3
a	  
---
# Simple example to create a lambda function and publish a version
- hosts: localhost
  gather_facts: false
  vars:
    state: present
    project_folder: /path/to/deployment/package
    deployment_package: lambda.zip
    account: 123456789012
    production_version: 5
  tasks:
    - name: AWS Lambda Function
      amazon.aws.lambda:
        state: "{{ state | default('present') }}"
        name: myLambdaFunction
        publish: true
        description: lambda function description
        code_s3_bucket: package-bucket
        code_s3_key: "lambda/{{ deployment_package }}"
        local_path: "{{ project_folder }}/{{ deployment_package }}"
        runtime: python2.7
        timeout: 5
        handler: lambda.handler
        memory_size: 128
        role: "arn:aws:iam::{{ account }}:role/API2LambdaExecRole"

    - name: Get information
      amazon.aws.lambda_info:
        name: myLambdaFunction
      register: lambda_info
    - name: show results
      ansible.builtin.debug:
        msg: "{{ lambda_info['lambda_facts'] }}"

    # The following will set the Dev alias to the latest version ($LATEST) since version is omitted (or = 0)
    - name: "alias 'Dev' for function {{ lambda_info.lambda_facts.FunctionName }} "
      amazon.aws.lambda_alias:
        state: "{{ state | default('present') }}"
        function_name: "{{ lambda_info.lambda_facts.FunctionName }}"
        name: Dev
        description: Development is $LATEST version

    # The QA alias will only be created when a new version is published (i.e. not = '$LATEST')
    - name: "alias 'QA' for function {{ lambda_info.lambda_facts.FunctionName }} "
      amazon.aws.lambda_alias:
        state: "{{ state | default('present') }}"
        function_name: "{{ lambda_info.lambda_facts.FunctionName }}"
        name: QA
        version: "{{ lambda_info.lambda_facts.Version }}"
        description: "QA is version {{ lambda_info.lambda_facts.Version }}"
      when: lambda_info.lambda_facts.Version != "$LATEST"

    # The Prod alias will have a fixed version based on a variable
    - name: "alias 'Prod' for function {{ lambda_info.lambda_facts.FunctionName }} "
      amazon.aws.lambda_alias:
        state: "{{ state | default('present') }}"
        function_name: "{{ lambda_info.lambda_facts.FunctionName }}"
        name: Prod
        version: "{{ production_version }}"
        description: "Production is version {{ production_version }}"
a  
---
alias_arn:
    description: Full ARN of the function, including the alias.
    returned: success
    type: str
    sample: arn:aws:lambda:us-west-2:123456789012:function:myFunction:dev
description:
    description: A short description of the alias.
    returned: success
    type: str
    sample: The development stage for my hot new app.
function_version:
    description: The qualifier that the alias refers to.
    returned: success
    type: str
    sample: $LATEST
name:
    description: The name of the alias assigned.
    returned: success
    type: str
    sample: dev
revision_id:
    description: A unique identifier that changes when you update the alias.
    returned: success
    type: str
    sample: 12345678-1234-1234-1234-123456789abc
    N)camel_dict_to_snake_dict)snake_dict_to_camel_dict)is_boto3_error_code)AnsibleAWSError)AnsibleAWSModule)AWSRetryc                       e Zd Zy)LambdaAnsibleAWSErrorN)__name__
__module____qualname__     k/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/amazon/aws/plugins/modules/lambda_alias.pyr
   r
      s    r   r
   c                 r    t               }|D ]  }| j                  |d      }|s|||<    t        |d      S )z
    Sets non-None module parameters to those expected by the boto3 API.

    :param module_params:
    :param param_names:
    :return:
    NT)capitalize_first)dictgetr   )module_paramsparam_names
api_paramsparammodule_params        r   set_api_paramsr      sH     J -$((5 ,Ju-
 $JFFr   c                     | d   }t        j                  d|      st        d| d      t        |      dkD  rt        d| d      y)	zr
    Performs basic parameter validation.

    :param module_params: AnsibleAWSModule Parameters
    :return:
    function_namez
^[\w\-:]+$zFunction name zI is invalid. Names must contain only alphanumeric characters and hyphens.@   zFunction name 'z' exceeds 64 character limitN)researchr
   len)r   r   s     r   validate_paramsr!      s_     "/2M 99]M2#]O+tu
 	
 =B#om_D`$abb
r   c                 \    t        |       }|d   dk(  rd|d<   |S t        |d         |d<   |S )Nfunction_versionr   z$LATEST)r   str)r   paramss     r   normalize_paramsr&      sK    - F  !Q&%.!" M &)0B)C%D!"Mr   c                    t        | d      }	  |j                  dddi|}|S # t        d      $ r d}Y |S t        j                  j
                  t        j                  j                  f$ r}t        d|      d}~ww xY w)	z
    Returns the lambda function alias if it exists.

    :param module_params: AnsibleAWSModule parameters
    :param client: (wrapped) boto3 lambda client
    :return:
    r   name	aws_retryTResourceNotFoundExceptionNzError retrieving function alias	exceptionr   )r   	get_aliasr   botocore
exceptionsClientErrorBotoCoreErrorr
   )r   clientr   resultses        r   get_lambda_aliasr6      s      /HIJT"&""@T@Z@ N :;  N 	'')) T $$EQRSS	Ts   $ A?6A?-A::A?c                    t               }d}d}| d   }t        | |      }|rd}|dk(  r|dk(  rt        |      }d}	|	D ];  }
| j                  |
      | j                  |
      |j                  |
      k7  s9d} n |rt	        | d      }|j                  t	        | |	             |sf	  |j                  dd	di|}nPt	        | d      }	 |s |j                  dd	di|}d}n*|dk(  r%t	        | d      }	 |s |j                  dd	di|}d}t        dd|it        |xs |xs i       S # t        j                  j                  t        j                  j                  f$ r}t        d
|      d}~ww xY w# t        j                  j                  t        j                  j                  f$ r}t        d|      d}~ww xY w# t        j                  j                  t        j                  j                  f$ r}t        d|      d}~ww xY w)z
    Adds, updates or deletes lambda function aliases.

    :param module_params: AnsibleAWSModule parameters
    :param client: (wrapped) boto3 lambda client
    :return dict:
    Fabsentstatepresent)r#   descriptionNTr(   r*   zError updating function aliasr,   )r   r)   r#   r;   zError creating function aliaszError deleting function aliaschangedr   )r   r6   r   r   r   updateupdate_aliasr/   r0   r1   r2   r
   create_aliasdelete_alias)r   r3   
check_moder4   r<   current_stater9   factssnake_factsalias_paramsr   r   r5   s                r   lambda_aliasrF      s=    fGGM'"E]F3E!	I%259K ?L%  $$U+3 $$U+{u/EE"G +M;TU
!!."MN!b"5&"5"5"S"S
"S (7stJZ!1f11ODOJOG
 I%'7PQJZ!1f11ODOJOG @@4(>5(>B#?@@5 %//;;X=P=P=^=^_ b34S_`aab ''33X5H5H5V5VW Z+,KWXYYZ ''33X5H5H5V5VW Z+,KWXYYZsH   'D* 	E6 4G *7E3!E..E367F?-F::F?7H9HHc                     t        t        ddddg      t        d      t        ddg      t        d	dd
dg      t        dd            } t        | dg g       }|j                  dt        j                               }	 t        |j                         t        |j                        }t        |||j                        } |j                  di t!               y# t        $ rY}|j                  r'|j                  |j                  |j                         |j                  |j                         Y d}~yd}~ww xY w)z<
    Main entry point.

    :return dict: ansible facts
    Fr:   r8   )requireddefaultchoicesT)rH   
alias_name)rH   aliasesintr   version)typerH   rI   rL   N)rH   rI   )r9   r   r)   r#   r;   )argument_specsupports_check_modemutually_exclusiverequired_togetherlambda)retry_decorator)msgr   )r   r   r3   r   jittered_backoffr!   r%   r&   rF   rA   r
   r-   fail_json_awsmessage	fail_json	exit_jsonr   )rP   moduler3   r   r4   r5   s         r   mainr]   7  s    E9y(>STD)4,855!i[Y%6M # 	F ]]8X5N5N5P]QF(&(7}ff6G6GH F9/89 ! (;;  !)) <QYY''(s   AC   	E)AD==E__main__)DOCUMENTATIONEXAMPLESRETURNr   r/   ImportError0ansible.module_utils.common.dict_transformationsr   r   <ansible_collections.amazon.aws.plugins.module_utils.botocorer   >ansible_collections.amazon.aws.plugins.module_utils.exceptionsr   ;ansible_collections.amazon.aws.plugins.module_utils.modulesr   ;ansible_collections.amazon.aws.plugins.module_utils.retriesr   r
   r   r!   r&   r6   rF   r]   r   r   r   r   <module>rh      s   /b=~
: 
	 V U \ Z X P	O 	G&(	4?AD :F zF E  		s   A A'&A'