---
# __Test Info__
# Create a self signed cert and upload it to AWS
# http://www.akadia.com/services/ssh_test_certificate.html
# http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html

# __Test Outline__
#
# __ec2_elb_lb__
# create test elb with listeners and certificate
# change AZ's
# change listeners
# remove listeners
# remove elb

# __ec2-common__
# test environment variable EC2_REGION
# 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 test elb with listeners, certificate, and health check

- name: Create ELB
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    state: present
    zones:
      - us-east-1c
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
      - protocol: http
        load_balancer_port: 8080
        instance_port: 8080
    health_check:
        ping_protocol: http
        ping_port: 80
        ping_path: "/index.html"
        response_timeout: 5
        interval: 30
        unhealthy_threshold: 2
        healthy_threshold: 10
  register: info

- assert:
    that:
      - 'info.changed'
      - '"failed" not in info'
      - 'info.elb.status == "created"'
      - '"us-east-1c" in info.elb.zones'
      - '"us-east-1d" in info.elb.zones'
      - 'info.elb.health_check.healthy_threshold == 10'
      - 'info.elb.health_check.interval == 30'
      - 'info.elb.health_check.target == "HTTP:80/index.html"'
      - 'info.elb.health_check.timeout == 5'
      - 'info.elb.health_check.unhealthy_threshold == 2'
      - '[80, 80, "HTTP", "HTTP"] in info.elb.listeners'
      - '[8080, 8080, "HTTP", "HTTP"] in info.elb.listeners'

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

# check ports, would be cool, but we are at the mercy of AWS
# to start things in a timely manner

#- name: check to make sure 80 is listening
#  wait_for: host={{ info.elb.dns_name }} port=80 timeout=600
#  register: result

#- name: assert can connect to port#
#  assert: 'result.state == "started"'

#- name: check to make sure 443 is listening
#  wait_for: host={{ info.elb.dns_name }} port=443 timeout=600
#  register: result

#- name: assert can connect to port#
#  assert: 'result.state == "started"'

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

# Change AZ's

- name: Change AZ's
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    state: present
    zones:
      - us-east-1b
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
    purge_zones: yes
    health_check:
        ping_protocol: http
        ping_port: 80
        ping_path: "/index.html"
        response_timeout: 5
        interval: 30
        unhealthy_threshold: 2
        healthy_threshold: 10
  register: info



- assert:
    that:
      - '"failed" not in info'
      - 'info.elb.status == "ok"'
      - 'info.changed'
      - 'info.elb.zones[0] == "us-east-1b"'

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

# Update AZ's

- name: Update AZ's
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    state: present
    zones:
      - us-east-1b
      - us-east-1c
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
    purge_zones: yes
  register: info

- assert:
    that:
      - '"failed" not in info'
      - 'info.changed'
      - 'info.elb.status == "ok"'
      - '"us-east-1b" in info.elb.zones'
      - '"us-east-1c" in info.elb.zones'
      - '"us-east-1d" in info.elb.zones'


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

# Purge Listeners

- name: Purge Listeners
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    state: present
    zones:
      - us-east-1b
      - us-east-1c
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 81
    purge_listeners: yes
  register: info

- assert:
    that:
      - '"failed" not in info'
      - 'info.elb.status == "ok"'
      - 'info.changed'
      - '[80, 81, "HTTP", "HTTP"] in info.elb.listeners'
      - 'info.elb.listeners|length == 1'



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

# add Listeners

- name: Add Listeners
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
    state: present
    zones:
      - us-east-1b
      - us-east-1c
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 8081
        instance_port: 8081
    purge_listeners: no
  register: info

- assert:
    that:
      - '"failed" not in info'
      - 'info.elb.status == "ok"'
      - 'info.changed'
      - '[80, 81, "HTTP", "HTTP"] in info.elb.listeners'
      - '[8081, 8081, "HTTP", "HTTP"] in info.elb.listeners'
      - 'info.elb.listeners|length == 2'


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

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

- name: assert failure when called with no parameters
  assert:
    that:
       - 'result.failed'
       - 'result.msg == "missing required arguments: name,state"'



# ============================================================
- name: test with only name
  ec2_elb_lb:
    name="{{ tag_prefix }}"
  register: result
  ignore_errors: true

- name: assert failure when called with only name
  assert:
    that:
       - 'result.failed'
       - 'result.msg == "missing required arguments: state"'


# ============================================================
- name: test invalid region parameter
  ec2_elb_lb:
    name="{{ tag_prefix }}"
    region='asdf querty 1234'
    state=present
  register: result
  ignore_errors: true

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


# ============================================================
- name: test valid region parameter
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: present
    zones:
      - us-east-1a
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80

  register: result
  ignore_errors: true

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


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

- name: test invalid ec2_url parameter
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: present
    zones:
      - us-east-1a
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
  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.")'


# ============================================================
- name: test valid ec2_url parameter
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: present
    zones:
      - us-east-1a
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
  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.")'


# ============================================================
- name: test credentials from environment
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: present
    zones:
      - us-east-1a
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
  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'
       - '"InvalidClientTokenId" in result.msg'


# ============================================================
- name: test credential parameters
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: present
    zones:
      - us-east-1a
      - us-east-1d
    listeners:
      - protocol: http
        load_balancer_port: 80
        instance_port: 80
  register: result
  ignore_errors: true

- name: assert credential parameters
  assert:
    that:
       - 'result.failed'
       - '"No handler was ready to authenticate. 1 handlers were checked." in result.msg'

# ============================================================
- name: remove the test load balancer completely
  ec2_elb_lb:
    name: "{{ tag_prefix }}"
    region: "{{ ec2_region }}"
    state: absent
    ec2_access_key: "{{ ec2_access_key }}"
    ec2_secret_key: "{{ ec2_secret_key }}"
  register: result

- name: assert the load balancer was removed
  assert:
    that:
       - 'result.changed'
       - 'result.elb.name == "{{tag_prefix}}"'
       - 'result.elb.status == "deleted"'
