---
# __Test Info__
# EIPs are a scarce resource.  AWS only assigns 5 per account
# by default.  This test tries to only use 1 at a time.
# one t1.micro instance will also be provisioned.
# tests require setting of variables eip_ec2_keyname and
# eip_ec2_image .

# __Test Outline__
#
# __ec2_eip__
# create test instance
# create EIP
# assign allocated ip to instance_id
# disassociate EIP associated with instance
# re-use existing EIP with instance
# deactivate EIP
# provision EIP with instance_id
# create VPC EIP
# re-use exiting VPC EIP with instance

# __ec2-common__
# test environment variable EC2_REGION
# deactivate EIP
# test with no parameters
# test with only instance_id
# test invalid region parameter
# test valid region parameter
# test invalid ec2_url parameter
# test valid ec2_url parameter
# test credentials from environment
# test credential parameters

# ============================================================
# create a keypair using the ssh key

- name: create the keypair for ec2
  ec2_key:
    name: "{{ resource_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    key_material: "{{ key_material }}"
    wait: yes
    state: present

# ============================================================
# create test instance

- name: create test instance
  local_action:
    module: ec2
    key_name: "{{ resource_prefix }}"
    region: "{{ ec2_region }}"
    instance_type: t1.micro
    image: ami-fb8e9292
    wait: yes
    instance_tags:
      Name: "{{ tag_prefix }}"
      ansible_ec2_eip_integration_test: foo
    exact_count: 1
    count_tag: "ansible_ec2_eip_integration_test"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
  register: output


- name: set instance id fact
  set_fact: instance_id={{ output.instances[0].id }}

# eip allocated:0 assigned:0

# ============================================================

# create EIP

- name: create EIP
  ec2_eip: region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
  register: result

- name: set eip fact
  set_fact: eip={{ result.public_ip }}

- name: write ip to list for cleanup script
  shell: echo {{ eip }} >> {{ output_dir }}/{{ tag_prefix }}-eip_integration_tests.log

- name: assert EIP created
  assert:
    that:
      - '"failed" not in result'


# eip allocated:1 assigned:0

# ============================================================

# assign allocated ip to instance_id

- name: assign allocated ip to instance_id
  ec2_eip:
    reuse_existing_ip_allowed=yes
    instance_id={{ instance_id }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    public_ip={{ eip }}
    region={{ ec2_region }}
  register: result

- name: assert new EIP was assigned
  assert:
    that:
      - '"public_ip" in result'


# eip allocated:1 assigned:1

# ============================================================

# disassociate EIP associated with instance

- name: disassociate EIP associated with instance
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    instance_id={{ instance_id }}
  register: result


# eip allocated:1 assigned:0


# ============================================================

# re-use existing EIP with instance

- name: re-use existing EIP with instance
  ec2_eip:
    reuse_existing_ip_allowed=yes
    instance_id={{ instance_id }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    region={{ ec2_region }}
  register: result

- name: assert new EIP was assigned
  assert:
    that:
      - '"public_ip" in result'



- name: disassociate EIP associated with instance
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    instance_id={{ instance_id }}


# eip allocated:1 assigned:1

# ============================================================

# deactivate EIP

- name: deactivate EIP
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
  register: result


# eip allocated:0 assigned:0

# ============================================================

# provision EIP with instance_id

- name: provision EIP with instance_id
  ec2_eip:
    instance_id={{ instance_id }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    region={{ ec2_region }}
  register: result

- name: set eip fact
  set_fact: eip={{ result.public_ip }}

- name: write ip to list for cleanup script
  shell: echo {{ eip }} >> {{ output_dir }}/{{ tag_prefix }}-eip_integration_tests.log

- name: assert provision EIP with instance_id
  assert:
    that:
      - '"public_ip" in result'


- name: disassociate EIP associated with instance
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
    instance_id={{ instance_id }}


- name: deactivate EIP
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}


# eip allocated:0 assigned:0

# ============================================================


# create VPC EIP


- name: create VPC EIP
  ec2_eip: in_vpc=yes region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
  register: result

- name: set eip fact
  set_fact: eip={{ result.public_ip }}

- name: write ip to list for cleanup script
  shell: echo {{ eip }} >> {{ output_dir }}/{{ tag_prefix }}-eip_integration_tests.log

- name: assert VPC EIP creation
  assert:
    that:
      - '"public_ip" in result'


# eip allocated:1 assigned:0

# ============================================================

# re-use existing VPC EIP with instance
# DISABLED BY JCAMMARATA
#- name: re-use existing VPC EIP with instance
#  ec2_eip:
#    in_vpc=yes
#    reuse_existing_ip_allowed=yes
#    instance_id={{ instance_id }}
#    ec2_access_key={{ ec2_access_key }}
#    ec2_secret_key={{ ec2_secret_key }}
#    region={{ ec2_region }}
#  register: result
#
#- name: assert new VPC EIP was assigned
#  assert:
#    that:
#      - '"public_ip" in result'
#
#
#- name: disassociate VPC EIP associated with instance
#  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
#    ec2_access_key={{ ec2_access_key }}
#    ec2_secret_key={{ ec2_secret_key }}
#    instance_id={{ instance_id }}


- name: deactivate VPC EIP
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}


# eip allocated:0 assigned:0


# ============================================================
- name: test environment variable EC2_REGION
  ec2_eip:
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}
  environment:
    EC2_REGION: "{{ ec2_region }}"
  register: result

- name: set eip fact
  set_fact: eip={{ result.public_ip }}

- name: write ip to list for cleanup script
  shell: echo {{ eip }} >> {{ output_dir }}/{{ tag_prefix }}-eip_integration_tests.log


- name: assert environment variable EC2_REGION
  assert:
    that:
      - '"public_ip" in result'


- name: deactivate EIP
  ec2_eip: state=absent public_ip={{ eip }} region={{ ec2_region }}
    ec2_access_key={{ ec2_access_key }}
    ec2_secret_key={{ ec2_secret_key }}


# eip allocated:0 assigned:0

# ============================================================

- name: test with no parameters
  ec2_eip:
  register: result
  ignore_errors: true

- name: assert failure when called with no parameters
  assert:
    that:
       - 'result.failed'
       - 'result.msg == "Either region or ec2_url must be specified"'

# eip allocated:0 assigned:0

# ============================================================
- name: test with only instance_id
  ec2_eip:
    instance_id=i-12345
  register: result
  ignore_errors: true

- name: assert failure when called with only 'instance_id'
  assert:
    that:
       - 'result.failed'
       - 'result.msg == "Either region or ec2_url must be specified"'

# eip allocated:0 assigned:0

# ============================================================
- name: test invalid region parameter
  ec2_eip:
    instance_id={{ instance_id }}
    region='asdf querty 1234'
  register: result
  ignore_errors: true

- name: assert invalid region parameter
  assert:
    that:
       - 'result.failed'
       - 'result.msg.startswith("value of region must be one of:")'

# eip allocated:0 assigned:0

# ============================================================
- name: test valid region parameter
  ec2_eip:
    instance_id={{ instance_id }}
    region={{ ec2_region }}
  register: result
  ignore_errors: true

- name: assert valid region parameter
  assert:
    that:
       - 'result.failed'
       - 'result.msg.startswith("No handler was ready to authenticate.")'

# eip allocated:0 assigned:0

# ============================================================

- name: test invalid ec2_url parameter
  ec2_eip:
    instance_id={{ instance_id }}
    reuse_existing_ip_allowed=yes
  environment:
    EC2_URL: bogus.example.com
  register: result
  ignore_errors: true

- name: assert invalid ec2_url parameter
  assert:
    that:
       - 'result.failed'
       - 'result.msg.startswith("No handler was ready to authenticate.")'

# eip allocated:0 assigned:0

# ============================================================
- name: test valid ec2_url parameter
  ec2_eip:
    instance_id={{ instance_id }}
    reuse_existing_ip_allowed=yes
  environment:
    EC2_URL: '{{ec2_url}}'
  register: result
  ignore_errors: true

- name: assert valid ec2_url parameter
  assert:
    that:
       - 'result.failed'
       - 'result.msg.startswith("No handler was ready to authenticate.")'

# eip allocated:0 assigned:0

# ============================================================
- name: test credentials from environment
  ec2_eip:
    region={{ ec2_region }}
    instance_id={{ instance_id }}
  environment:
    EC2_ACCESS_KEY: bogus_access_key
    EC2_SECRET_KEY: bogus_secret_key
  register: result
  ignore_errors: true

- name: assert credentials from environment
  assert:
    that:
       - 'result.failed'
       - '"EC2ResponseError: 401 Unauthorized" in result.msg'

# eip allocated:0 assigned:0

# ============================================================
- name: test credential parameters
  ec2_eip: region={{ ec2_region }}
  register: result
  ignore_errors: true

- name: assert credential parameters
  assert:
    that:
       - 'result.failed'
       - '"Check your credentials" in result.msg'

# eip allocated:0 assigned:0