- name: Prepare random number
  set_fact:
    dbname: "cosmos{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}"
    vnname: "vn{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}"
    subnetname: "subnet{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}"
  run_once: yes

- name: Create virtual network
  azure_rm_virtualnetwork:
    resource_group: "{{ resource_group }}"
    name: "{{ vnname }}"
    address_prefixes_cidr:
      - 10.1.0.0/16
      - 172.100.0.0/16
    dns_servers:
      - 127.0.0.1
      - 127.0.0.3

- name: Add subnet
  azure_rm_subnet:
    name: "{{ subnetname }}"
    virtual_network_name: "{{ vnname }}"
    resource_group: "{{ resource_group }}"
    address_prefix_cidr: "10.1.0.0/24"

- name: Create instance of Database Account -- check mode
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    location: eastus
    geo_rep_locations:
      - name: eastus
        failover_priority: 0
    database_account_offer_type: Standard
  check_mode: yes
  register: output
- name: Assert the resource instance is well created
  assert:
    that:
      - output.changed

- name: Create instance of Database Account
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    location: eastus
    kind: global_document_db
    geo_rep_locations:
      - name: eastus
        failover_priority: 0
      - name: westus
        failover_priority: 1
    database_account_offer_type: Standard
    is_virtual_network_filter_enabled: yes
    virtual_network_rules:
      - subnet:
          resource_group: "{{ resource_group }}"
          virtual_network_name: "{{ vnname }}"
          subnet_name: "{{ subnetname }}"
        ignore_missing_vnet_service_endpoint: yes
  register: output
- name: Assert the resource instance is well created
  assert:
    that:
      - output.changed

- name: Create again instance of Database Account
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    location: eastus
    kind: global_document_db
    geo_rep_locations:
      - name: eastus
        failover_priority: 0
      - name: westus
        failover_priority: 1
    database_account_offer_type: Standard
    is_virtual_network_filter_enabled: yes
    virtual_network_rules:
      - subnet:
          resource_group: "{{ resource_group }}"
          virtual_network_name: "{{ vnname }}"
          subnet_name: "{{ subnetname }}"
        ignore_missing_vnet_service_endpoint: yes
  register: output
- name: Assert the state has not changed
  assert:
    that:
      - output.changed == false

- name: Create again instance of Database Account -- change something
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    location: eastus
    kind: global_document_db
    geo_rep_locations:
      - name: eastus
        failover_priority: 0
      - name: westus
        failover_priority: 1
    database_account_offer_type: Standard
    is_virtual_network_filter_enabled: yes
    virtual_network_rules:
      - subnet:
          resource_group: "{{ resource_group }}"
          virtual_network_name: "{{ vnname }}"
          subnet_name: "{{ subnetname }}"
        ignore_missing_vnet_service_endpoint: yes
    enable_automatic_failover: yes
  register: output
- name: Assert the state has not changed
  assert:
    that:
      - output.changed

- name: Get facts of single account
  azure_rm_cosmosdbaccount_info:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
  register: output

- name: Assert that facts are returned
  assert:
    that:
      - output.changed == False
      - output.accounts[0]['id'] != None
      - output.accounts[0]['resource_group'] != None
      - output.accounts[0]['name'] != None
      - output.accounts[0]['location'] != None
      - output.accounts[0]['kind'] != None
      - output.accounts[0]['consistency_policy'] != None
      - output.accounts[0]['failover_policies'] != None
      - output.accounts[0]['read_locations'] != None
      - output.accounts[0]['write_locations'] != None
      - output.accounts[0]['database_account_offer_type'] != None
      - output.accounts[0]['ip_range_filter'] != None
      - output.accounts[0]['is_virtual_network_filter_enabled'] != None
      - output.accounts[0]['enable_automatic_failover'] != None
      - output.accounts[0]['enable_cassandra'] != None
      - output.accounts[0]['enable_table'] != None
      - output.accounts[0]['enable_gremlin'] != None
      - output.accounts[0]['virtual_network_rules'] != None
      - output.accounts[0]['enable_multiple_write_locations'] != None
      - output.accounts[0]['document_endpoint'] != None
      - output.accounts[0]['provisioning_state'] != None
      - output.accounts[0]['tags'] != None

- name: Get facts with keys
  azure_rm_cosmosdbaccount_info:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    retrieve_keys: all
  register: output

- name: Assert that facts are returned
  assert:
    that:
      - output.changed == False
      - output.accounts[0]['primary_master_key'] != None
      - output.accounts[0]['secondary_master_key'] != None
      - output.accounts[0]['primary_readonly_master_key'] != None
      - output.accounts[0]['secondary_readonly_master_key'] != None

- name: Get facts with readonly keys
  azure_rm_cosmosdbaccount_info:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    retrieve_keys: readonly
    retrieve_connection_strings: yes
  register: output

- name: Assert that facts are returned
  assert:
    that:
      - output.changed == False
      - "'primary_master_key' not in output.accounts[0]"
      - "'secondary_master_key' not in output.accounts[0]"
      - output.accounts[0]['primary_readonly_master_key'] != None
      - output.accounts[0]['secondary_readonly_master_key'] != None
      - output.accounts[0]['connection_strings'] | length > 0

- name: List acounts by resource group
  azure_rm_cosmosdbaccount_info:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
  register: output

- name: Assert that facts are returned
  assert:
    that:
      - output.changed == False
      - output.accounts[0]['id'] != None
      - output.accounts[0]['resource_group'] != None
      - output.accounts[0]['name'] != None
      - output.accounts[0]['location'] != None
      - output.accounts[0]['kind'] != None
      - output.accounts[0]['consistency_policy'] != None
      - output.accounts[0]['failover_policies'] != None
      - output.accounts[0]['read_locations'] != None
      - output.accounts[0]['write_locations'] != None
      - output.accounts[0]['database_account_offer_type'] != None
      - output.accounts[0]['ip_range_filter'] != None
      - output.accounts[0]['is_virtual_network_filter_enabled'] != None
      - output.accounts[0]['enable_automatic_failover'] != None
      - output.accounts[0]['enable_cassandra'] != None
      - output.accounts[0]['enable_table'] != None
      - output.accounts[0]['enable_gremlin'] != None
      - output.accounts[0]['virtual_network_rules'] != None
      - output.accounts[0]['enable_multiple_write_locations'] != None
      - output.accounts[0]['document_endpoint'] != None
      - output.accounts[0]['provisioning_state'] != None
      - output.accounts[0]['tags'] != None

- name: Delete instance of Database Account -- check mode
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    state: absent
  check_mode: yes
  register: output
- name: Assert the state has changed
  assert:
    that:
      - output.changed

- name: Delete instance of Database Account
  azure_rm_cosmosdbaccount:
    resource_group: "{{ resource_group }}"
    name: "{{ dbname }}"
    state: absent
  register: output
- name: Assert the state has changed
  assert:
    that:
      - output.changed

# currently disabled as there's a bug in SDK / Service
#- name: Delete unexisting instance of Database Account
#  azure_rm_cosmosdbaccount:
#    resource_group: "{{ resource_group }}"
#    name: "{{ dbname }}"
#    state: absent
#  register: output
#- name: Assert the state has changed
#  assert:
#    that:
#      - output.changed == false
