- name: Create virtual network
  azure_rm_virtualnetwork:
      resource_group: "{{ resource_group_secondary }}"
      name: testnic001
      address_prefixes: "10.10.0.0/16"
  register: vn

- name: Add subnet
  azure_rm_subnet:
      resource_group: "{{ resource_group_secondary }}"
      name: testnic001
      address_prefix: "10.10.0.0/24"
      virtual_network: testnic001

- name: create public ip
  azure_rm_publicipaddress:
    name: ansiblepip3
    resource_group: '{{ resource_group }}'

- name: create load balancer with multiple parameters
  azure_rm_loadbalancer:
    resource_group: '{{ resource_group }}'
    name: lbtestfromansible
    frontend_ip_configurations:
      - name: frontendipconf0
        public_ip_address: ansiblepip3
    backend_address_pools:
      - name: backendaddrpool0
      - name: backendaddrpool1
    probes:
      - name: prob0
        port: 80
    inbound_nat_pools:
      - name: inboundnatpool0
        frontend_ip_configuration_name: frontendipconf0
        protocol: Tcp
        frontend_port_range_start: 80
        frontend_port_range_end: 81
        backend_port: 8080
    load_balancing_rules:
      - name: lbrbalancingrule0
        frontend_ip_configuration: frontendipconf0
        backend_address_pool: backendaddrpool0
        frontend_port: 80
        backend_port: 80
        probe: prob0
  register: lb

- name: create public ip
  azure_rm_publicipaddress:
    name: ansiblepip3
    resource_group: '{{ resource_group }}'

- name: Create NIC (check mode)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      public_ip_name: testnic001
      public_ip_allocation_method: Static
      security_group: testnic001
  register: output
  check_mode: yes

- assert:
    that:
      - output.changed

- name: Create NIC using virtual_network resource_group parameter
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001rg
      virtual_network:
        name: testnic001
        resource_group: "{{ resource_group_secondary }}"
      subnet: testnic001
      public_ip_name: testnic001rg
      public_ip_allocation_method: Static
      security_group: testnic001
  register: output

- name: Create NIC using virtual_network resource_group parameter (idempotent)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001rg
      virtual_network:
        name: testnic001
        resource_group: "{{ resource_group_secondary }}"
      subnet: testnic001
      public_ip_name: testnic001rg
      public_ip_allocation_method: Static
      security_group: testnic001
  register: output

- assert:
    that:
      - not output.changed

- name: Delete NIC
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001rg
      state: absent

- name: Create NIC
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      public_ip_name: testnic001
      public_ip_allocation_method: Static
      security_group:
        name: testnic002
        resource_group: "{{ resource_group_secondary }}"
  register: output

- assert:
    that:
      - output.changed
      - output.state.ip_configuration.subnet.name == 'testnic001'

- name: Update the NIC with mutilple ip configurations (check mode)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      security_group:
        name: testnic002
        resource_group: "{{ resource_group_secondary }}"
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      ip_configurations:
        - name: ipconfig-add
          public_ip_name: testnic002
        - name: default
          public_ip_name: testnic001
          primary: True
          public_ip_allocation_method: Static
        - name: ipconfig1
          public_ip_name: testnic003
  register: output
  check_mode: yes

- assert:
    that:
      - output.changed

- name: Update the NIC with mutilple ip configurations
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      security_group: 
        name: testnic002
        resource_group: "{{ resource_group_secondary }}"
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      ip_configurations:
        - name: ipconfig-add
          public_ip_name: testnic002
        - name: default
          public_ip_name: testnic001
          primary: True
          public_ip_allocation_method: Static
        - name: ipconfig1
          public_ip_name: testnic003
          load_balancer_backend_address_pools:
          - "{{ lb.state.backend_address_pools[0].id }}"
          - name: backendaddrpool1
            load_balancer: lbtestfromansible
  register: output

- assert:
    that:
      - output.changed
      - not output.state.ip_configuration
      - output.state.ip_configurations | length == 3
      - output.state.network_security_group.name == 'testnic002'

- name: Update the NIC with mutilple ip configurations (idempotent)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      security_group: "{{ output.state.network_security_group.id }}"
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      ip_configurations:
        - name: ipconfig-add
          public_ip_name: testnic002
        - name: default
          public_ip_name: testnic001
          primary: True
          public_ip_allocation_method: Static
        - name: ipconfig1
          public_ip_name: testnic003
          load_balancer_backend_address_pools:
          - "{{ lb.state.backend_address_pools[0].id }}"
          - name: backendaddrpool1
            load_balancer: lbtestfromansible
  register: output

- assert:
    that:
      - not output.changed

- name: Remove one ip configuration
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      security_group:
        name: testnic002
        resource_group: "{{ resource_group_secondary }}"
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      ip_configurations:
        - name: ipconfig1
          public_ip_name: testnic003
          load_balancer_backend_address_pools:
          - "{{ lb.state.backend_address_pools[0].id }}"
          - name: backendaddrpool1
            load_balancer: lbtestfromansible
        - name: default
          public_ip_name: testnic001
          public_ip_allocation_method: Static
          primary: True
  register: output

- assert:
    that:
      - not output.state.ip_configuration
      - output.state.ip_configurations | length == 2

- name: IP configuration without public IP and NSG
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001noip
      create_with_security_group: False
      virtual_network: "{{ vn.state.id }}"
      subnet: testnic001
      ip_configurations:
        - name: ipconfig1
          primary: True
  register: output

- assert:
    that:
      - output.state.ip_configurations[0].public_ip_address == None
      - output.state.network_security_group == None

- name: Delete the NIC (check mode)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      state: absent
  check_mode: yes
  register: output

- assert:
    that:
      - output.changed

- name: Delete the NIC
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: "{{ item }}"
      state: absent
  with_items:
    - testnic001
    - testnic001noip
  register: output

- assert:
    that:
      - output.changed

- name: Delete the NIC (idempotent)
  azure_rm_networkinterface:
      resource_group: "{{ resource_group }}"
      name: testnic001
      state: absent
  register: output

- assert:
    that:
      - not output.changed