- name: Fix resource prefix
  set_fact:
    redis_name: "redis-{{ resource_group | hash('md5') | truncate(7, True, '') }}-{{ 1000 | random }}"
    vnet_name: "vnet-{{ resource_group | hash('md5') | truncate(7, True, '') }}-{{ 1000 | random }}"
    subnet_name: "subnet-{{ resource_group | hash('md5') | truncate(7, True, '') }}-{{ 1000 | random }}"
    rule_name: "rule1"
  run_once: yes

- name: Create a redis cache (Check Mode)
  azure_rm_rediscache:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}"
    sku:
      name: basic
      size: C1
    wait_for_provisioning: False
  check_mode: yes
  register: output

- name: Assert creating redis cache check mode
  assert:
    that:
      - output.changed

- name: Create a redis cache
  azure_rm_rediscache:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}"
    sku:
      name: basic
      size: C1
    wait_for_provisioning: False
  register: output

- name: Assert creating redis cache
  assert:
    that:
      - output.changed
      - output.id

- name: Get facts
  azure_rm_rediscache_facts:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}"
  register: facts

- name: Assert facts
  assert:
    that:
      - facts.rediscaches | length == 1
      - facts.rediscaches[0].id != None
      - facts.rediscaches[0].host_name != None
      - facts.rediscaches[0].provisioning_state != None
      - facts.rediscaches[0].sku.name == 'basic'
      - facts.rediscaches[0].sku.size == 'C1'

- name: Update the redis cache (idempotent)
  azure_rm_rediscache:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}"
    sku:
      name: basic
      size: C1
    wait_for_provisioning: False
  register: output

- name: assert output not changed
  assert:
    that:
      - not output.changed

- name: long-running rediscache tests [run with `--tags long_run,untagged` to enable]
 # creating redis Cache costs about 20 mins async operation,
 # need to poll status from Creating to Running, then able to perform updating/deleting operation,
 # otherwise, will met error:
 # "The resource '<resource_id>' is busy processing a previous update request or is undergoing system maintenance.
 # As such, it is currently unable to accept the update request.  Please try again later."
  block:
  - name: Wait for Redis provisioning to complete
    azure_rm_rediscache_facts:
        resource_group: "{{ resource_group }}"
        name: "{{ redis_name }}"
    register: facts
    until: facts.rediscaches[0]['provisioning_state'] == 'Succeeded'
    retries: 30
    delay: 60

  - name: (actually) update redis cache
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      sku:
        name: basic
        size: C1
      enable_non_ssl_port: true
      tags:
        testing: foo
      wait_for_provisioning: True
    register: output

  - name: assert output changed
    assert:
      that:
        - output.changed

  - name: Update redis cache configuration
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      sku:
        name: basic
        size: C1
      enable_non_ssl_port: True
      maxmemory_policy: allkeys_lru
      tags:
        testing: foo
    register: output

  - name: assert output changed
    assert:
      that:
        - output.changed

  - name: Scale up the redis cache
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      sku:
        name: standard
        size: C1
      tags:
        testing: foo
      wait_for_provisioning: True
    register: output

  - assert:
      that:
        - output.changed

  - name: Force reboot redis cache
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      reboot:
        reboot_type: all
    register: output

  - assert:
      that:
        - output.changed

  - name: Delete the redis cache (Check Mode)
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      state: absent
    check_mode: yes
    register: output

  - name: assert deleting redis cache check mode
    assert:
      that: output.changed

  - name: Delete the redis cache
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}"
      state: absent
    register: output

  - assert:
      that:
        - output.changed
  tags: [long_run, never]


- name: Create virtual network
  azure_rm_virtualnetwork:
      resource_group: "{{ resource_group }}"
      name: "{{ vnet_name }}"
      address_prefixes: "10.10.0.0/16"

- name: Add subnet
  azure_rm_subnet:
      resource_group: "{{ resource_group }}"
      name: "{{ subnet_name }}"
      address_prefix: "10.10.0.0/24"
      virtual_network: "{{ vnet_name }}"

- name: Create redis with subnet
  azure_rm_rediscache:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}2"
    sku:
      name: premium
      size: P1
    subnet:
      name: "{{ subnet_name }}"
      virtual_network_name: "{{ vnet_name }}"
    wait_for_provisioning: False
  register: output

- name: Assert creating redis cache
  assert:
    that:
      - output.changed
      - output.id

- name: Get facts
  azure_rm_rediscache_facts:
    resource_group: "{{ resource_group }}"
    name: "{{ redis_name }}2"
    return_access_keys: True
  register: facts

- name: Assert facts
  assert:
    that:
      - facts.rediscaches | length == 1
      - facts.rediscaches[0].subnet != None
      - facts.rediscaches[0].access_keys.primary != None

- name: Create firewall rule (Check mode)
  azure_rm_rediscachefirewallrule:
    resource_group: "{{ resource_group }}"
    cache_name: "{{ redis_name }}2"
    name: "{{ rule_name }}"
    start_ip_address: 192.168.1.1
    end_ip_address: 192.168.1.4
  check_mode: yes
  register: output

- name: Assert check mode creation
  assert:
    that:
      - output.changed


- name: long-running rediscachefirewallrule tests [run with `--tags long_run,untagged` to enable]
# Creating firewall rule need Redis status is running, while creating redis Cache costs about 20 mins async operation,
# need to poll status from Creating to Running, then able to perform firewall rule creating,
# otherwise, will met error:
# "Error creating/updating Firewall rule of Azure Cache for Redis: Azure Error: Conflict\nMessage: The resource
# '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Cache/Redis/myRedis' is busy processing
# a previous update request or is undergoing system maintenance.  As such, it is currently unable to accept the update request.  Please try again later."
  block:
  - name: Wait for Redis provisioning to complete
    azure_rm_rediscache_facts:
        resource_group: "{{ resource_group }}"
        name: "{{ redis_name }}2"
    register: facts
    until: facts.rediscaches[0]['provisioning_state'] == 'Succeeded'
    retries: 30
    delay: 60

  - name: Create firewall rule
    azure_rm_rediscachefirewallrule:
      resource_group: "{{ resource_group }}"
      cache_name: "{{ redis_name }}2"
      name: "{{ rule_name }}"
      start_ip_address: 192.168.1.1
      end_ip_address: 192.168.1.4
    register: output

  - name: Assert creation
    assert:
      that:
        - output.changed
        - output.id

  - name: Update firewall rule idempotence
    azure_rm_rediscachefirewallrule:
      resource_group: "{{ resource_group }}"
      cache_name: "{{ redis_name }}2"
      name: "{{ rule_name }}"
      start_ip_address: 192.168.1.1
      end_ip_address: 192.168.1.4
    register: output

  - name: Assert idempotence
    assert:
      that:
        - output.changed == False

  - name: Update firewall rule
    azure_rm_rediscachefirewallrule:
      resource_group: "{{ resource_group }}"
      cache_name: "{{ redis_name }}2"
      name: "{{ rule_name }}"
      end_ip_address: 192.168.1.5
    register: output

  - name: Assert updating
    assert:
      that:
        - output.changed

  - name: Delete firewall rule
    azure_rm_rediscachefirewallrule:
      resource_group: "{{ resource_group }}"
      cache_name: "{{ redis_name }}2"
      name: "{{ rule_name }}"
      state: absent
    register: output

  - name: Assert deletion
    assert:
      that:
        - output.changed

  - name: Delete the redis cache
    azure_rm_rediscache:
      resource_group: "{{ resource_group }}"
      name: "{{ redis_name }}2"
      state: absent
    register: output
  tags: [long_run, never]