---
# Create a new zone - the default one is enabled
- name: assure zone for tests
  cs_zone:
    name: cs-test-zone
    state: present
    dns1: 8.8.8.8
    network_type: Advanced
  register: cszone

- name: ensure the zone is disabled
  cs_zone:
    name: "{{ cszone.name }}"
    state: disabled
  register: cszone

- name: setup a network in check_mode
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    isolation_method: VLAN
    broadcast_domain_range: ZONE
  check_mode: yes
  register: pn
- name: validate setup a network
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.zone == cszone.name

- name: setup a network
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    isolation_method: VLAN
    broadcast_domain_range: ZONE
  register: pn
- name: validate setup a network
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.state == 'Disabled'

- name: setup a network idempotence
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    isolation_method: VLAN
    broadcast_domain_range: ZONE
  register: pn
- name: validate setup a network idempotence
  assert:
    that:
      - pn is successful
      - pn is not changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.state == 'Disabled'

- name: set a tag on a network
  cs_physical_network:
    name: net01
    tag: overlay
    zone: "{{ cszone.name }}"
  ignore_errors: true
  register: pn
- name: validate set a tag on a network
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.tags == 'overlay'
      - pn.state == 'Disabled'

- name: Remove tag on a network
  cs_physical_network:
    name: net01
    tag: ""
    zone: "{{ cszone.name }}"
  register: pn
- name: validate remove tag on a network
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.tags is undefined
      - pn.state == 'Disabled'

- name: ensure a network is enabled with specific nsps enabled in check mode
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    isolation_method: VLAN
    vlan: 100-200,300-400
    broadcast_domain_range: ZONE
    state: enabled
    nsps_enabled:
      - virtualrouter
      - internallbvm
      - vpcvirtualrouter
  check_mode: yes
  register: pn
- name: validate ensure a network is enabled with specific nsps enabled
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.zone == cszone.name
      - "'internallbvm' in pn.nsps_enabled"
      - "'virtualrouter' in pn.nsps_enabled"
      - "'vpcvirtualrouter' in pn.nsps_enabled"

- name: ensure a network is enabled with specific nsps enabled
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    isolation_method: VLAN
    vlan: 100-200,300-400
    broadcast_domain_range: ZONE
    state: enabled
    nsps_enabled:
      - virtualrouter
      - internallbvm
      - vpcvirtualrouter
  register: pn
- name: validate ensure a network is enabled with specific nsps enabled
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.vlan == '100-200,300-400'
      - pn.state == 'Enabled'
      - "'internallbvm' in pn.nsps_enabled"
      - "'virtualrouter' in pn.nsps_enabled"
      - "'vpcvirtualrouter' in pn.nsps_enabled"

- name: ensure a network is disabled
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    state: disabled
  register: pn
- name: validate ensure a network is disabled
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.tags is undefined
      - pn.state == 'Disabled'

- name: ensure a network is enabled
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    state: enabled
  register: pn
- name: validate ensure a network is enabled
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.name == 'net01'
      - pn.broadcast_domain_range == 'ZONE'
      - pn.isolation_method == 'VLAN'
      - pn.zone == cszone.name
      - pn.tags is undefined
      - pn.state == 'Enabled'

- name: ensure a network is not absent in check mode
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    state: absent
  check_mode: yes
  register: pn
- name: validate ensure a network is absent
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.zone == cszone.name

- name: ensure a network is absent
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    state: absent
  register: pn
- name: validate ensure a network is absent
  assert:
    that:
      - pn is successful
      - pn is changed
      - pn.zone == cszone.name
      - pn.name == 'net01'

- name: ensure a network is absent idempotence
  cs_physical_network:
    name: net01
    zone: "{{ cszone.name }}"
    state: absent
  register: pn
- name: validate ensure a network is absent idempotence
  assert:
    that:
      - pn is successful
      - pn is not changed
      - pn.zone == cszone.name

- name: cleanup zone
  cs_zone:
    name: "{{ cszone.name }}"
    state: absent