---
    - name: Integration testing for ec2_eip
      block:

        - name: set up aws connection info
          set_fact:
            aws_connection_info: &aws_connection_info
              aws_access_key: "{{ aws_access_key }}"
              aws_secret_key: "{{ aws_secret_key }}"
              security_token: "{{ security_token }}"
              region: "{{ aws_region }}"
          no_log: True

        - name: Allocate a new eip - attempt reusing unallocated ones
          ec2_eip:
            state: present
            in_vpc: yes
            reuse_existing_ip_allowed: yes
            <<: *aws_connection_info
          register: eip

        - assert:
            that:
              - eip is defined
              - eip.public_ip is defined and eip.public_ip != ""
              - eip.allocation_id is defined and eip.allocation_id != ""

        - name: Allocate a new eip
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
          register: new_eip

        - assert:
            that:
              - new_eip is defined
              - new_eip is changed
              - new_eip.public_ip is defined and new_eip.public_ip != ""
              - new_eip.allocation_id is defined and new_eip.allocation_id != ""

        - name: Match an existing eip (changed == false)
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
            public_ip: "{{ eip.public_ip }}"
          register: existing_eip

        - assert:
            that:
              - existing_eip is defined
              - existing_eip is not changed
              - existing_eip.public_ip is defined and existing_eip.public_ip != ""
              - existing_eip.allocation_id is defined and existing_eip.allocation_id != ""

        - name: attempt reusing an existing eip with a tag (or allocate a new one)
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
            reuse_existing_ip_allowed: yes
            tag_name: Team
          register: tagged_eip

        - assert:
            that:
              - tagged_eip is defined
              - tagged_eip.public_ip is defined and tagged_eip.public_ip != ""
              - tagged_eip.allocation_id is defined and tagged_eip.allocation_id != ""

        - name: attempt reusing an existing eip with a tag and it's value (or allocate a new one)
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
            public_ip: "{{ eip.public_ip }}"
            reuse_existing_ip_allowed: yes
            tag_name: Team
            tag_value: Backend
          register: backend_eip

        - assert:
            that:
              - backend_eip is defined
              - backend_eip.public_ip is defined and backend_eip.public_ip != ""
              - backend_eip.allocation_id is defined and backend_eip.allocation_id != ""

        - name: attempt reusing an existing eip with a tag and it's value (or allocate a new one from pool)
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
            reuse_existing_ip_allowed: yes
            tag_name: Team
            tag_value: Backend
            public_ipv4_pool: amazon
          register: amazon_eip

        - assert:
            that:
              - amazon_eip is defined
              - amazon_eip.public_ip is defined and amazon_eip.public_ip != ""
              - amazon_eip.allocation_id is defined and amazon_eip.allocation_id != ""

        - name: allocate a new eip from a pool
          ec2_eip:
            state: present
            in_vpc: yes
            <<: *aws_connection_info
            public_ipv4_pool: amazon
          register: pool_eip

        - assert:
            that:
              - pool_eip is defined
              - pool_eip is changed
              - pool_eip.public_ip is defined and pool_eip.public_ip != ""
              - pool_eip.allocation_id is defined and pool_eip.allocation_id != ""

      always:
        - debug: msg="{{ item }}"
          when: item is defined and item.public_ip is defined and item.allocation_id is defined
          loop:
            - eip
            - new_eip
            - pool_eip
            - tagged_eip
            - backend_eip
            - amazon_eip
        - name: Cleanup newly allocated eip
          ec2_eip:
            state: absent
            public_ip: "{{ item.public_ip }}"
            in_vpc: yes
            <<: *aws_connection_info
          when: item is defined and item is changed and item.public_ip is defined and item.public_ip != ""
          loop:
            - "{{ eip }}"
            - "{{ new_eip }}"
            - "{{ pool_eip }}"
            - "{{ tagged_eip }}"
            - "{{ backend_eip }}"
            - "{{ amazon_eip }}"
...