From c27ebfc368f64537a48e50a81944a3c234e1b9fb Mon Sep 17 00:00:00 2001 From: Matt Clay Date: Fri, 11 Aug 2017 16:16:39 -0700 Subject: [PATCH] Migrate roles from ansible/azure-testing (#28074) * Migrate roles from ansible/azure-testing as-is. * Fix yamllint issues. * Remove unused binary file. --- .../roles/azure_rm_deployment/tasks/main.yml | 27 ++ .../azure_rm_networkinterface/tasks/main.yml | 427 ++++++++++++++++++ .../azure_rm_publicipaddress/tasks/main.yml | 139 ++++++ .../azure_rm_resourcegroup/tasks/main.yml | 171 +++++++ .../azure_rm_securitygroup/tasks/main.yml | 172 +++++++ .../azure_rm_storageaccount/tasks/main.yml | 159 +++++++ .../azure_rm_storageblob/files/Ratings.png | Bin 0 -> 35164 bytes .../roles/azure_rm_storageblob/tasks/main.yml | 145 ++++++ .../roles/azure_rm_subnet/tasks/main.yml | 134 ++++++ .../azure_rm_virtualmachine/defaults/main.yml | 8 + .../azure_rm_virtualmachine/tasks/main.yml | 2 + .../tasks/virtualmachine.yml | 170 +++++++ .../tasks/virtualmachine_with_defaults.yml | 120 +++++ .../tasks/main.yml | 52 +++ .../azure_rm_virtualnetwork/tasks/main.yml | 196 ++++++++ 15 files changed, 1922 insertions(+) create mode 100644 test/integration/roles/azure_rm_deployment/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_networkinterface/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_publicipaddress/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_resourcegroup/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_securitygroup/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_storageaccount/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_storageblob/files/Ratings.png create mode 100644 test/integration/roles/azure_rm_storageblob/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_subnet/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_virtualmachine/defaults/main.yml create mode 100644 test/integration/roles/azure_rm_virtualmachine/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine.yml create mode 100644 test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine_with_defaults.yml create mode 100644 test/integration/roles/azure_rm_virtualmachineimage_facts/tasks/main.yml create mode 100644 test/integration/roles/azure_rm_virtualnetwork/tasks/main.yml diff --git a/test/integration/roles/azure_rm_deployment/tasks/main.yml b/test/integration/roles/azure_rm_deployment/tasks/main.yml new file mode 100644 index 00000000000..b4049b565c6 --- /dev/null +++ b/test/integration/roles/azure_rm_deployment/tasks/main.yml @@ -0,0 +1,27 @@ +- name: Create Azure Deploy + azure_rm_deployment: + resource_group: Test_Deployment + template_link: 'https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-simple-linux/azuredeploy.json' + parameters: + adminUsername: + value: chouseknecht + adminPassword: + value: password123! + dnsLabelPrefix: + value: testvm9910001 + ubuntuOSVersion: + value: "14.04.2-LTS" + # debug: "{{ playbook_debug }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Add new instance to host group + add_host: + hostname: "{{ item.vm_name }}" + ansible_host: "{{ item['ips'][0].public_ip }}" + ansible_user: chouseknecht + ansible_ssh_pass: password123! + groupname: azure_vms + with_items: "{{ output.deployment.instances }}" diff --git a/test/integration/roles/azure_rm_networkinterface/tasks/main.yml b/test/integration/roles/azure_rm_networkinterface/tasks/main.yml new file mode 100644 index 00000000000..eae12ab5abd --- /dev/null +++ b/test/integration/roles/azure_rm_networkinterface/tasks/main.yml @@ -0,0 +1,427 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create virtual network + azure_rm_virtualnetwork: + name: vnet001 + resource_group: "{{ resource_group }}" + address_prefixes_cidr: "10.10.0.0/16" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create subnet + azure_rm_subnet: + name: subnet001 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + address_prefix_cidr: "10.10.0.0/24" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create second virtual network + azure_rm_virtualnetwork: + name: vnet002 + resource_group: "{{ resource_group }}" + address_prefixes_cidr: "10.20.0.0/16" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create second subnet + azure_rm_subnet: + name: subnet002 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet002 + address_prefix_cidr: "10.20.0.0/24" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create security group + azure_rm_securitygroup: + name: secgroup001 + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create second security group + azure_rm_securitygroup: + name: secgroup002 + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create a public ip + azure_rm_publicipaddress: + name: publicip001 + resource_group: "{{ resource_group }}" + allocation_method: "Static" + register: output + +- debug: var=output + when: playbook_debug + +- name: Create second public ip + azure_rm_publicipaddress: + name: publicip002 + resource_group: "{{ resource_group }}" + allocation_method: "Static" + register: output + +- debug: var=output + when: playbook_debug + +- name: Delete network interface, if it exists + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- name: Should require subnet when creating nic + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + security_group_name: secgroup001 + public_ip_address_name: publicip001 + register: output + ignore_errors: yes + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.failed + - "'subnet' in output.msg" + +- name: Should require virtual network when creating nic + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + security_group_name: secgroup001 + public_ip_address_name: publicip001 + subnet: subnet001 + register: output + ignore_errors: yes + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.failed + - "'virtual_network_name' in output.msg" + +- name: Create nic + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + subnet: subnet001 + security_group_name: secgroup001 + public_ip_address_name: publicip001 + register: output + +- debug: var=output + when: playbook_debug + +- name: Should be idempotent + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + subnet: subnet001 + security_group_name: secgroup001 + public_ip_address_name: publicip001 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Should change private IP address + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + private_ip_address: 10.10.0.10 + private_ip_allocation_method: Static + virtual_network_name: vnet001 + subnet: subnet001 + security_group_name: secgroup001 + public_ip_address_name: publicip001 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.changed + - output.state.ip_configuration.private_ip_address == '10.10.0.10' + - output.state.ip_configuration.private_ip_allocation_method == 'Static' + +- name: Should change virtual network and subnet + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + private_ip_allocation_method: Dynamic + virtual_network_name: vnet002 + subnet: subnet002 + security_group_name: secgroup002 + public_ip_address_name: publicip002 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.changed + - "'10.20' in output.state.ip_configuration.private_ip_address" + - output.state.ip_configuration.private_ip_allocation_method == 'Dynamic' + - output.state.ip_configuration.subnet.name == 'subnet002' + - output.state.ip_configuration.public_ip_address.name == 'publicip002' + +- name: Add tags + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + tags: + testing: testing + foo: bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 2 + - output.state.tags.testing == 'testing' + +- name: Gather facts for tags + azure_rm_networkinterface_facts: + tags: testing + register: output + +- assert: + that: + - azure_networkinterfaces | length >= 1 + +- name: Gather facts for resource group and tags + azure_rm_networkinterface_facts: + resource_group: "{{ resource_group }}" + tags: testing + register: output + +- assert: + that: + - azure_networkinterfaces| length == 1 + +- name: Gather facts for name and tags + azure_rm_networkinterface_facts: + resource_group: "{{ resource_group }}" + name: nic003 + tags: testing + register: output + +- assert: + that: + - azure_networkinterfaces | length == 1 + +- name: Purge one tag + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + tags: + testing: testing + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.changed + - output.state.tags | length == 1 + +- name: Purge all tags + azure_rm_networkinterface: + name: nic003 + resource_group: "{{ resource_group }}" + tags: {} + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.changed + - output.state.tags | length == 0 + +- name: Remove network interface, if it exists + azure_rm_networkinterface: + name: "{{ item }}" + resource_group: "{{ resource_group }}" + state: absent + register: output + with_items: + - nic004 + - nic005 + + +- debug: var=output + when: playbook_debug + +- name: Remove publicip, if it exists + azure_rm_publicipaddress: + name: "{{ item }}" + resource_group: "{{ resource_group }}" + state: absent + with_items: + - nic00401 + - nic00501 + +- name: Remove security group, if it exists + azure_rm_securitygroup: + name: "{{ item }}" + resource_group: "{{ resource_group }}" + state: absent + with_items: + - nic00401 + - nic00501 + +- name: Should create default security group and default public ip for linux host + azure_rm_networkinterface: + name: nic004 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + subnet: subnet001 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.ip_configuration.public_ip_address.name == 'nic00401' + - output.state.network_security_group.name == 'nic00401' + +- name: Gather facts for security group nic00401 + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + name: nic00401 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_securitygroups[0].properties.securityRules[0].properties.destinationPortRange == '22' + +- name: Should create default security group and default public ip for windows host + azure_rm_networkinterface: + name: nic005 + resource_group: "{{ resource_group }}" + virtual_network_name: vnet001 + subnet: subnet001 + os_type: Windows + open_ports: + - 9000 + - '9005-9010' + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.ip_configuration.public_ip_address.name == 'nic00501' + - output.state.network_security_group.name == 'nic00501' + +- name: Gather facts for security group nic00501 + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + name: nic00501 + register: output + +- debug: var=output + when: playbook_debug + +- name: Security group should allow RDP access on custom port + assert: + that: + - azure_securitygroups[0].properties.securityRules[0].properties.destinationPortRange == '9000' + - azure_securitygroups[0].properties.securityRules[1].properties.destinationPortRange == '9005-9010' + +- name: Gather facts for one nic + azure_rm_networkinterface_facts: + resource_group: "{{ resource_group }}" + name: nic003 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_networkinterfaces | length == 1 + +- name: Gather facts for all nics in resource groups + azure_rm_networkinterface_facts: + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_networkinterfaces | length >= 3 + +- name: Gather facts for all nics + azure_rm_networkinterface_facts: + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_networkinterfaces | length >= 3 + +- name: Delete nic + azure_rm_networkinterface: + name: "{{ item }}" + resource_group: "{{ resource_group }}" + state: absent + register: output + with_items: + - nic003 + - nic004 + - nic005 diff --git a/test/integration/roles/azure_rm_publicipaddress/tasks/main.yml b/test/integration/roles/azure_rm_publicipaddress/tasks/main.yml new file mode 100644 index 00000000000..95cdd0392bc --- /dev/null +++ b/test/integration/roles/azure_rm_publicipaddress/tasks/main.yml @@ -0,0 +1,139 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + +- name: Remove public ip + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: testing01 + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- name: Create public ip + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: testing01 + allocation_method: Static + domain_name: autotest01 + tags: + testing: testing + delete: on-exit + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.public_ip_allocation_method == 'Static' + - output.state.dns_settings.domain_name_label == 'autotest01' + - output.state.tags | length == 2 + - output.state.tags.testing == 'testing' + +- name: Should be idempotent + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: testing01 + allocation_method: Static + domain_name: autotest01 + tags: + testing: testing + delete: on-exit + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Update tags + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: testing01 + tags: + testing: testing + delete: never + foo: bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 3 + - output.state.tags.delete == 'never' + +- name: Gather facts, filtering by tag + azure_rm_publicipaddress_facts: + resource_group: "{{ resource_group }}" + tags: + - testing + - foo:bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_publicipaddresses | length == 1 + +- name: Purge all tags + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: testing01 + tags: {} + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 0 + +- name: Gather facts for a public ip + azure_rm_publicipaddress_facts: + resource_group: "{{ resource_group }}" + name: testing01 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_publicipaddresses | length == 1 + +- name: Gather facts for all public ips + azure_rm_publicipaddress_facts: + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_publicipaddresses | length > 0 + +- name: Remove all public ips + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + name: "{{ item.name }}" + state: absent + with_items: "{{ azure_publicipaddresses }}" + +- name: Gather facts for all public ips + azure_rm_publicipaddress_facts: + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_publicipaddresses | length == 0 diff --git a/test/integration/roles/azure_rm_resourcegroup/tasks/main.yml b/test/integration/roles/azure_rm_resourcegroup/tasks/main.yml new file mode 100644 index 00000000000..7c61e037842 --- /dev/null +++ b/test/integration/roles/azure_rm_resourcegroup/tasks/main.yml @@ -0,0 +1,171 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + tags: + testing: testing + delete: never + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags.testing == 'testing' + - output.state.tags.delete == 'never' + - output.state.location == '{{ location }}' + +- name: Should be idempotent + azure_rm_resourcegroup: + name: Testing + location: "{{ location }}" + tags: + testing: testing + delete: never + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Change resource group tags + azure_rm_resourcegroup: + name: "{{ resource_group }}" + tags: + testing: 'no' + delete: 'on-exit' + foo: 'bar' + register: output + +- debug: var=output + +- assert: + that: + - output.state.tags | length == 3 + - output.state.tags.testing == 'no' + - output.state.tags.delete == 'on-exit' + - output.state.tags.foo == 'bar' + +- name: Gather facts by tags + azure_rm_resourcegroup_facts: + tags: + - testing + - foo:bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_resourcegroups | length == 1 + +- name: Purge one tag + azure_rm_resourcegroup: + name: "{{ resource_group }}" + tags: + testing: 'no' + delete: 'on-exit' + debug: yes + register: output + +- debug: var=output + +- assert: + that: + - output.state.tags | length == 2 + - output.state.tags.testing == 'no' + - output.state.tags.delete == 'on-exit' + +- name: Purge no tags + azure_rm_resourcegroup: + name: "{{ resource_group }}" + register: output + +- debug: var=output + +- assert: + that: + - output.state.tags | length == 2 + +- name: Purge all tags + azure_rm_resourcegroup: + name: "{{ resource_group }}" + tags: {} + register: output + +- debug: var=output + +- assert: + that: + - output.state.tags | length == 0 + +- name: Add a resource + azure_rm_virtualnetwork: + resource_group: "{{ resource_group }}" + name: "virtualnet01" + address_prefixes_cidr: '10.1.0.0/16' + register: output + +- name: Remove resource group should fail + azure_rm_resourcegroup: + name: "{{ resource_group }}" + state: absent + register: output + ignore_errors: yes + +- assert: + that: + - output.failed + - "'Resources exist' in output.msg" + +- name: Create a second resource group + azure_rm_resourcegroup: + name: Testing2 + location: "{{ location }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Gather facts for a resource group + azure_rm_resourcegroup_facts: + name: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_resourcegroups | length == 1 + +- name: Gather facts for all resource groups + azure_rm_resourcegroup_facts: + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_resourcegroups | length > 1 + +- name: Force remove resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + state: absent + force: yes + register: output + +- debug: var=output + when: playbook_debug + +- name: Remove second resource group + azure_rm_resourcegroup: + name: Testing2 + state: absent + register: output + +- debug: var=output + when: playbook_debug diff --git a/test/integration/roles/azure_rm_securitygroup/tasks/main.yml b/test/integration/roles/azure_rm_securitygroup/tasks/main.yml new file mode 100644 index 00000000000..58d5121e6d6 --- /dev/null +++ b/test/integration/roles/azure_rm_securitygroup/tasks/main.yml @@ -0,0 +1,172 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + +- name: Create security group + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: mysecgroup + tags: + testing: testing + delete: on-exit + foo: bar + purge_rules: yes + rules: + - name: DenySSH + protocol: Tcp + destination_port_range: 22 + access: Deny + priority: 100 + direction: Inbound + - name: 'AllowSSH' + protocol: Tcp + source_address_prefix: '174.109.158.0/24' + destination_port_range: 22 + access: Allow + priority: 101 + direction: Inbound + register: output + +- debug: var=output + when: playbook_debug + +- assert: { that: "{{ output.state.rules | length }} == 2" } + +- name: Gather facts by tags + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + tags: + - testing + - foo:bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_securitygroups | length == 1 + +- name: Add/Update rules on existing security group + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: mysecgroup + rules: + - name: DenySSH + protocol: Tcp + destination_port_range: 22-23 + access: Deny + priority: 100 + - name: AllowSSHFromHome + protocol: Tcp + source_address_prefix: '174.109.158.0/24' + destination_port_range: 22-23 + priority: 102 + register: output + +- debug: var=output + when: playbook_debug + +- assert: { that: "{{ output.state.rules | length }} == 3" } + +- name: Test idempotence + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: mysecgroup + rules: + - name: DenySSH + protocol: Tcp + destination_port_range: 22-23 + access: Deny + priority: 100 + - name: AllowSSHFromHome + protocol: Tcp + source_address_prefix: '174.109.158.0/24' + destination_port_range: 22-23 + priority: 102 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Update tags + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: mysecgroup + tags: + testing: testing + delete: never + baz: bar + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 3 + - output.state.tags.delete == 'never' + +- name: Purge tags + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: mysecgroup + tags: + testing: testing + delete: on-exit + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 2 + - output.state.tags.delete == 'on-exit' + +- name: Gather facts for one accounts + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + name: mysecgroup + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_securitygroups | length == 1 + +- name: Gather facts for all accounts + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_securitygroups | length > 0 + +- name: Delete all security groups + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: "{{ item.name }}" + state: absent + with_items: "{{ azure_securitygroups }}" + +- name: Should have no security groups remaining + azure_rm_securitygroup_facts: + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_securitygroups | length == 0 diff --git a/test/integration/roles/azure_rm_storageaccount/tasks/main.yml b/test/integration/roles/azure_rm_storageaccount/tasks/main.yml new file mode 100644 index 00000000000..7a479cca5e3 --- /dev/null +++ b/test/integration/roles/azure_rm_storageaccount/tasks/main.yml @@ -0,0 +1,159 @@ + - name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + + - name: Test invalid account name + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: "invalid_char$" + state: present + register: invalid_name + ignore_errors: yes + + - name: Assert task failed + assert: { that: "invalid_name['failed'] == True" } + + - name: Delete storage account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + state: absent + register: output + + - debug: var=output + when: playbook_debug + + - name: Create new storage account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + account_type: Standard_LRS + tags: + test: test + galaxy: galaxy + register: output + + - debug: var=output + when: playbook_debug + + - name: Assert status succeeded and results include an Id value + assert: + that: + - output.changed + - output.state.id is defined + + - name: Gather facts by tags + azure_rm_storageaccount_facts: + resource_group: "{{ resource_group }}" + tags: + - test + - galaxy + register: output + + - debug: var=output + when: playbook_debug + + - assert: + that: azure_storageaccounts | length >= 1 + + - name: Change account type + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + account_type: Premium_LRS + register: change_account + ignore_errors: yes + + - debug: var=change_account + when: playbook_debug + + - name: Assert account type change failed + assert: { that: "change_account['failed'] == True" } + + - name: Change account type and add custom domain + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + account_type: Standard_GRS + custom_domain: { name: ansible.com, use_sub_domain: no } + register: change_account + ignore_errors: yes + + - name: Debug + debug: var=change_account + when: playbook_debug + + - name: Assert CNAME failure + assert: { that: "'custom domain name could not be verified' in change_account['msg']" } + + - name: Update account tags + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + tags: + testing: testing + delete: never + galaxy: 'no' + register: output + + - debug: var=output + when: playbook_debug + + - assert: + that: + - "output.state.tags | length == 3" + - "output.state.tags.galaxy == 'no'" + + - name: Update account tags + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + tags: + testing: testing + delete: never + register: output + + - debug: var=output + when: playbook_debug + + - assert: + that: + - "output.state.tags | length == 2" + - "output.state.tags.testing == 'testing'" + - "output.state.tags.delete == 'never'" + + - name: Gather facts + azure_rm_storageaccount_facts: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + register: output + + - debug: var=output + when: playbook_debug + + - assert: + that: + - "azure_storageaccounts| length == 1" + + - name: Gather facts + azure_rm_storageaccount_facts: + resource_group: "{{ resource_group }}" + register: output + + - debug: var=output + when: playbook_debug + + - assert: + that: + - "azure_storageaccounts | length > 0" + + - name: Delete acccount + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: teststorageacct002 + state: absent + register: output + + - debug: var=output + when: playbook_debug diff --git a/test/integration/roles/azure_rm_storageblob/files/Ratings.png b/test/integration/roles/azure_rm_storageblob/files/Ratings.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd3e3dbc1c4b1a7081b05a03db2e7bed4c985f4 GIT binary patch literal 35164 zcmZ^L1ymf%@^>JF-~@LG?(Ux8?(PnY%i`{~xDy~aEEe1~NN{%u?iO5veBAf$z2yDR z`S#42ovG>R?&|99UsZMWge%C2Bf{ary?OHnQBp!g>CGF+=r?a5HejG%C}!ibIxl|^ zPD|av7dBf+%^Kxlp>TF2tW@ByZ z#N)DIpF~4efmqni(Uh2-fsKKQL;#MMn3&Je#EeHtMC|X^ zU+(xxES#O~c^Da8U0oSmSsCmc%^8`wxw#pcSQuGY=wDLMJGt9B8@kckI+6Z2lYjCN zF?BL_w6u4&w6i7tD_=t+JD@W^3CUjt{rmfGJ)JGhUQ4od`kSp61{wc)!pO|P#Q1OC zFR$|bMdcB;v$1zHb#i*iUx1zOKPmr*_FB$=(<@lmIorLof}^Feq^+~5SlLxbh>GLk=C&bb+mf1 zySth21~&Geqc-kMurc1JDx6o6*D9<6m(Qv%RnH|5%G z``fjPzw#5(hJk{NBDIF6tp5msy0;8v;c&FP%9tJfSAG6_EP~$9M<0j8zm0nX>ud&D z%jL3Tmog>>Nj9$ba#Np#zV!0o?}~Nae0fQ{dO`F?K;R|wC7AJzc@8;i(U-(cFST>)~4Tg7%@jJ%>=HAG>xV?8c_5<>bErs~fKQ;a6LF*m2neTeBmssCr2t1W(wz&|w z^gxkKSM=s4!H%3Xor12d?>-E12KO)Dc!YAThH6{L*&3>cRO}_}_s+4k3j=s`ou$%R{4TAkMr}SBGHDV5RhWw)~i%z{65MoS^?$+6|rrB_gXH zMikMvf?V-2m7aIJoNV{w3i^SQZCA42MXi+8H6sQW3n^sZLwNGQ!8Ld8#}b_jy*;>2 zHrBRG0x*DS(<;uf(TbX!;@b%lM{VXdqpR6nlyKT^zZj3IS`rwW^@UiF$2PG-I~q9!`nhbu ziOJ*P!~7tpp<++A;A0z;p*&p}MP#XW&1 zldn(t>i4CLkx%bI*DczI(S%B2WOsRMrR6<+b){8ac~`%S7fvx)Y26c68FN-2;!j>nIBqYbUhupW z>Uel4bUHNnAQrV8DX;Ghe~25tgcbhuxq%uh4RB$#rTo$tLd{BIwG!rM7i{@K0Xwy?ovA+yW6T# z)pf4xdF6>pZ2%fU3hn#6XkO%Z+9{hO?)n@vH*{2=eLRAwj&y^%ghLD#9yrftqQ#sT zA8nOL(^E(N5v=dLxH(QQq$@1fTzHDXV6ObQqmuA*c+Q6!Od_n%+eGI}DSN};>9WNi zx-iRSJG#6Xq#+(Z)OD=&t!EciCq@|DoWmb@7jt@&Y>@ z+{omP1=^K-`MZ7WXySQdNXfp=jj=vkgw}UVx1M9k(K&$;u{M>Rj%gD;Xk%hNg;&T( znT8%7JdPKR%s1N$EVix}Ep@WKKBPX#;t}cuPOGackNw$x%-&l>k~#5TqT{$%;?^Fq zFzxJwB3Egsv9M4s=z5K7N;GdcJb4Qhut!UUkJE<*I(O-l4eFB(_D&IuOYn zSs#3|xGtCwlNv!Sj@hlBNY;I}IED8Y&%?{LBx_ckz>>Wxm$Gf@rtHx~p)I zvi`;YSRqQ{SSH-y1*B=~d#DcY{SH}V6Gj2NhAejMyh5bTT+MU|YAH!R$fBry3(J?&37y&kCI~k)a>74YLqM~j zhj8;0K%F|PrId|+(H{QMXEIY?)E>$w$2*IENo3<$P*nI!2^9S#ubj!r_;pvI`8Ij6 z{lhE-s)hWEDs(KFVEn4C2vJf9t%Yz)sQRz^^Vj(+8roO; zqaJ+*BG7ARSxgWrLXQsg%&(;+{j-jtA_hV^Z~M)bw4&k`XZ$bjd!z9Wojp}!j+fqz z>2RS_3S8sVC(Sk72JkoquO>&O2~vrilHo1S%rrjh<5iU>y_Xvu>5>)S&6Uo>>v*2i zqC>2m{N=0R&2;fhBp2E6H=F*#BurnK2sx3QNRS}%M=Sd~hRQpf6Ik#Y&A*`SbKsqS zA>^wjan#=vZr*N~ZJL7Z$5Hn9&Jgf)K5*B#Ju_ni?RpWMXYUvT<%Wy9o|uW4r|$8!DIQOVL9r?Q_c~&~y~>ldO7n z^Ncf7O)V%UgJ#LzASOoK^@aO}p_BNajc(XfmK$0f?&r0q4?#ObvA)i#4Teb8{|p0y zG(V3i4}_D*eBhztQZZ}Y`ehy(v#vnKlbLJ2fq^2Y!EAi=1C^O=)uxKw+riSJOG^L- zrMyd;1_5&WZLiVJrzE&<2318SYhB9KpNnknFZ-@K*PCWzf@n`NU~9%f2ejVv8oR=# zbyx*6C}@HDqox&Ch{aSFhVnuFjN@zlJXIVA$kvK-7Wuz+TkIIR7JM~>@v`*&B6m+< z^|`|G`oc<}mi4TyI5-Wuw|ua1A5x}2Ay}m^cHci5v{du|Jqnz$A+Lq#N4+hujzmca z>1*FIE7XmEeK_9q#AjR;1q@#T+UkmwK7+kerPP`odbl7gc0cVe9SifvQp1>rLW z54KceWIYeg21432>hcO_PAS$(zsvhR25Vlp_6FxM=jrEK9y)T5mIJV^b>Id+G2k6YNjqHHeLr!_)GnS@ce6j< zHfEAtKGlM3hi>h#K&(hpHXDuMx5Oso`dnV~corB;d$!qdOdy`%KK-+>&qtx8zw$m>%Fd4XErI5CD!-S*4~|^?`e!QPq49Tnw*B%z{AfsoLhf5`&o_OC3kq-D&62emmlZ~$A+_Q?ad1i+ci3GpGMjt$ekY*eZ9iMs;Zse} z;Zp=uEaa@}rCduULjJB_$ph&cEo0k!I&0H1QdQ%?>+^e`(CgvK<%{Q%7ec!Yvp{7n zR3SYxMhg0Z!_sQG zeag;pUURw_Ph(&kue8G>yw#baB$d=qbdIoN9?~RL^6*JX&Tp-Y^xFrm2UjNyvyq0f zOhsO3S|`t|z8XQoaAZ4NlXtrkZ5@3eEF2+zSs z->PTupzU_7NX=emwDW0?-gZX;$Mb;+fBzS0*JPH`vCtSoQ#UL3Dypx(oBhVbZT~?;) zku0LMZtrZI>w)ZVcsUL6L!5(FK1uyOl-`#s(57H^(_O`Z&*XI71J!z$9i1)4WJVti z*YT-Lj`P9zoq(2l)oOOIuTOmqC|5DG3R3R#Tj+yQhwnp6pNqJDN3Gv(fj@GYyJ3ns z%l8_%2hUM+u)~W>rGdW*#2`>9ZnIW1A(Ec6GJTV_=(YasMJ}fCu1L9V2vOb*pcsSy z1gCSBjSBk>7FG>Ny1N$4OR-ikb&-1=UN*g!T79peZ*Ycn_$#DvHxBh~7#22X7m8#z zX_en37=+JG^&wF8I*|+ zba)6<>y)X!vziFk6Mf4&S*x8Xtuax%m~X7FV54*#4RZ=&Svg;P)Q>sJ?PA8_yM0%f zC5StRC=*1_OyJwxI9|r9l5!Z_`_X^1Up$gyv*Ovhcgzf*+|uTK0C~mk z=HbJQnm}KLZE^XXHp0$VS73rFbg@&8h3U*0JD!HtS%w5+5z|4T1yg(Kf3Oe%t zZg#v_x$ST@iNUo!qC)pY(*n{+OddZf^5-+UF90S|GBc2Oqebc@ecVL0tT-%-gZi9% z`s%5FhS21lVhg#W4t)VG|LDKq8|TM7JbVx^H%jP7=J`e)>aF31;k)67U97i?CXxNC zdV13+MXN?~Hp=Mq&A_sVr>6C~unDu-j-{tc@#_f*1E9CSMZ=ZGW)+lVLqL|>(T{Hh z!+=%4j5knl8Mkzsk9Dnx2a9lh1Bzd&c4b#0XB@NkWa{2`iG4rla+O+( zy@*;o;CO$+md!l&x2n44EBw{yQS8fEjBMjpJ7WfpA=~18;`_PH3SX~?)p9GXn(L0V zY0g&Zpw_z(Qm_6Me3EkyX__pBk~21=p9lP0F81|we08&^gc2Gd_aOr8XSLt;qpip~ z*1zn}-VYc@!rWZrzFJUw6!wzl$;+-o2#T$Tlx4Azxu>}*F5rUE8f=4 zAYY1^a+J?FzqLE>wv=6W^xD4nBR+w|kth;@LW8>^g$MGF?sxs-dU2MKN#DxV_(zbr z?Z(|?;`gjQ#VGW+dF5RS7Q!hp)z`ZwaEXok6D0$yJd|z;oAKA4xIIN|IQ2tIE*Led z;p}3@*f4dqjo?l?ydh7JU3;UsGz)))`xw*xZ6l03z$V(!iMuE6mx!L1*9RGh?EltP z>22+;l6OI6TX1a~ixC`NjW8y9Lg#F6g`4tegJJY-N85N5jfsMi44tYM2kGE79#3Jo znP$v+G1lLbEqgntKRk4h7bD?qY-zoH`n_-xR_8xEcRM3K#ANR2bYsG1g^5IqBj&zi-M4dm-xLVEQe;%e%HgyZ{+iZQ_$kR zkyM5CQtG-$`fv#tz=>&X{Y(@y&U(61_xtPedHRFb;J68yw9(b9TRj>ylJMVC6SKI% z-3rP{tDWUFGb4TnIRk$3t2Jd5(fRzDtA4~6PkEk8^VMo2_O}as6TI2*DarT``~Jm_ zUZ02UP!T|VwcEV#UhKdQL@<8BYpy&WUu-$K+k*4BS7UB%iFi$7U^v*;WOD85YfcqP zbR!qnrl~$($wfx_0U3Mk6t#Bm%n&fUDLFL}rlSKzPoEUBy20Vgioe(Z-u&8)v@fqU zi8!8VnV4j*MFLtm{Es@JPR8R_CCaX4Sx*vQyqI3*S8v9er;XvC= z{Mf?WeP@GEQlyfS*=swVZ~dEba&kX_D83LVVFG02d(iNKJ9F(DfYp zF3tF1XgTx5HmYF8bXcc#WMToabm z1CkOFGC}=^A=9TT+aqm%l8%P9_@2{Z6J(R>`{5*}HQ@6%U*dBk8E-0j>u`!E89 zp6s`l`<4>+N3E{ctr;8(zJQ&Y;)@sI#{C;6R;V^y;a2G2SU5Nfr#0bt!RWq4Y(2^|%05 zQKA!!$-;FE=_E$7834QvY#3D(aHs}ikVjcAGck{B+o0BEI)IOULsU&UpXlo9>X*B> zSX?^oxfvE#4N?xpAQ%iVwzU30ei-J|O-?ekEyXe`X%{FyoOO=+$wFtvC|ISp6jG5s zx{t>ay*!my^j&E@NO^nkAGrBzb{S`Ya+dtMctRIbiRe>Bb}#ZfjXVI*HI>4AQlhGe z3r3W0`%Z!lI+L#`F_bTl)++N^6sd@`RsKkwF6XsEg20cFG}+jt0#>RkwbRDkGdL)$ zC@*JcI1CDcl8zfBc5obFc)MSeEYztrMAd*{2;;WB7*qFPYj}8Agzlmcy4S+HIjsN7k#&ASp%k8CSD$%>tKpv_1%W*|_!4hq%c_E4qskaiM8lMVoK($b=mQx=&;m}$B#x#nYfJAK*>wx3K*3s8!9a{SUIG+(C$Kd8mv&g)}dkvvV5 z@$_S{<6!WkiV#>Kk&_fomMIGS$$fuPw5>2#p|;ReCeg*iw#RU5IDasUY=Q$eS8gW1 zB)M1Nw(h=pL^eNgs>BMjSH2=4PLaKnoV5nN*=0n;EXCRR^e2HNDn9Ar%;iKPuNjGB z#b(L;rAM3C2$+4UVBhEOWx)T|X%Qr3X&H{<^U*lF3N?aUF@*q-PFP2LFRBoc3g0e* zHwYZMC`+>|yNag4mc%5;r=fVAv+pEE9DiovsxoHMS&zP;F4uM_S zKRHUBJOUnMv0fzyZY)+fdCIso$bN2l^g)R{3nyV~D=sPN11HgLY0UBgd|`_%Rg{aV z)H0%a|EJ3fKuuqj*;>YVR%cDXo0vzC@@0(q0)A+Z=e)+^DoN2LZc1yOt`Zn7@so zN|jK{KWY#!(U8CF&`U{7ng>5=N?6;s*T{Ytc3o2MR8a+&LhT7bKoKI7?toO z){vGJA1$ss=;ECaW&s-FppeWETP(g(WQmFln+C?)Hk?3_=E@(KQdyd#k*Ax`CF!9g zx(ukD#MY-5ic_9kg|%qeQRPkzKIUx>El(rR+y!Fe8QcGB-oHq5G1yNFLzOII64jyT z6Jv6gvP}_*l1UnM&KuJiU+`3|exN?zSnk=dhj>X^p(gH+Js{C;_OHrx^*dm-sFQqrU%hP%?GP2j>+oDdtdBE3&1Bi5Ztq(QyO3 zYa>T5(h351Sh35jH?*c>sUA0ua*0(-!v!wg%M9>Z!h_>ho<%5Mx+Q&x3mR13E}>Dbc8F8YJ!ie&aEhg<<*m#J54nPH+wb{VLwJdVm5B?&@u$T-(A zzcT%^>PWWO8EW1~~t`KCXM5hM4==VEO^O9W+@|0%q2;3)>NL=%Byt-S_ zz!JY{Xo{rVFWM1fTJR-SBm}vKY@Zq>VJiAWjwwl|lBdb#7b6tV*Da1o@;)m;Ww)vj zgPAVFt`u%6XPwlIsvX1+IoJsoY{aC$2)~cw~yF+>~-i zqx6PZAcRb6GL%Sb(M31QD7yTfav>oEuH?~k)5@#iYsuNMO9Eg|p-2anp!AIblqtrE zmrx>>v@p5*!aq#c#TZ$kN9LYzVk@ZNvD6d-)f@Y2%%kTCt~jIaI=^(R;|k&tD_8h4y>Q0qkJh57u94yHVu-j zoVaR?lFDXDJexFjuQ$C|j{;O((yn;h4@b^~`Ih=-LL5tKY<579Viv7hSq}p!G5OF( z^QKr$Dx*Xa0^s3@m&GlLBvnwLx=J4q*4YEVME|2@xR4Ng4DBWn zV{Hb{YG6pS0klMn@exG(!=xe;oFf2hQ&Bt+RdfecwvrY`x;=x~)e-=q+U8>6DvOF~T_A%gdhBQ#{MCcZKSC12b5ohsuKga`=-|9u#CZ0?VrE<)$ zXr9*5rHE-9keRkZ<48NfH_0T%)FQ(!yBPKUC-mUIYffvwWjZMc^=C|XWP9|CnSK<6 zhil!*R1K(&TiOqtcSQ`sF(2%s3J)jZ!nSaPlN87c zDc}A81;y#&-zygV-%{!Bn|t~@YRH6WYh>4*kt+jN#WB7~J2 zUsMIWt}sQRMPJUr0Ti_g_BzlKM^mLYHRbO*h zx;x_|rpBqpRqIW_$28`snxsFmFzXKOeVD5QFD@V9Cp4Q6?TncH{?vvH|Ef^L3h|!HtQO#2`J98r?oEhA^_(690 zb23Mcqy}guyi#9i<)S_SpGJlCzqlCa2i;R_#@emmoGNT24@m-81G0#AF$mgjLw zO0WS``-`zqib)i2N?gJ;RVuB}>)_;M+0s%CG|{G}CPia8a;vN1Jg*b+ri#I;MHj$JZ~ zC$Fg-Q$3P@jIrDtulmf5IU`jpeCVz`U9&u8TTeV)ZWWM8Zk`t*0;*;iK}8rP5kx9;Mi&sDW7k))_#0%92h3?V^5f(ScCQ>b*)#bw#)eRy}5Db2N}H91u5} z%K>s%QY{ISu*^&T)S^pLybTSE|HUhZYt>A!vZ~OBahSJ+8mp8-aiD7V)rx>$uOy|) z`Sc*)ggF$yJyd>7fo;B9J}KjGZGJW&QzfzKBa%s9;5ujNu%#=$6|QHTgJD2<-Z z9aPpGSyWRk!PMO?wsF=6Bvs(b(%-N#91KQCu~HMT>Otj!7X}9bchgLER)%J6EqW(K zOK5{xGyk{-{^K$`{w#Er!XP+(84Ac(_AWB2nrO_O;ib!HfEoi?OkeU(s=X_^tJTh? zc{s}PT4ITgqEP*`UhGk&nBZ>32cnU$!p9A!VHYD?G>NfnGNkIr)4c{Kdk(%K!L3Uv zR?4WIAdl1=n6Z$RQ@WNI71w>Qsif+kb>Pp`k1=KkYBQ37)=8? z@>vqa3rv$qa{swd^7!kl#8t*2j|4qHRHdtUR(x|dSpc>|ge;8Ox$;Q#I3bLXJ@Oz| z>Z)mItuQ-!ia3r>&$XO;_YZsLFC-ps1J7U=-^(bUryjo-Eh_miZFHFtF}NmuVO#3T zMMgH$S)>WPY=)Dj&oOpl03y|Kf$eyU-_1Z#zb$Uj!j!+~6Z>!g#Yck8e%=Qo5?-x_ z0R~L3D<~IjStq7M$i;;C4jFhDqdDgpO}q8al+#P8M&pU*gd~1T!&v>(hCl-OIgpq7 zOm$*O=8$%eSL&Ifc!}MH6SHO1{?NVD5zX@f91tpRHE)N{662il4AH85Hd0Pt$7O~| za1@u@Dpcc@9mva7g4FNP+KVTPPtQ{nHTr>y^MScUv^*M+BO@cj!pX*9xnHC?q-q@! z0ehM(d1s1XGxmQp^v}tnn~2H42qctf7v^7gUb(#@#34~GG?2iyJTVQc36Co}JmIev zyyeKSvQD~-rHBe4N@3aSL?X-|JN)2A|E&3W^{~O7^SA zStiK7mX#*Zzb8M?qFjr0@Ip!cF>dneE_)gJzeZpzx=-CuydgjlYIfgn??rY?mb6mf z!4j-p17f9``yL`n=^ia2+NB28<7?)MAV3mZuLQ6A6bY_eG98#*K_<;nw>(;{ZTqGI z3=U|YPTxZaF)pQ2vC7p#sbl-`d2mr{sCv(t+w@amnRlY3he>Jo^t1{(I(n|QZ3XP} z?7%_b9xyF_e~k10xMGIh&1{$T9>I_rF{0mEpYwtt6v#A$YBQTlf!w(OUX0`e(fX3# zi)NbmAeU)llrKBvkJcp%{Geo&lsf44RM9v`%{&J_+m+}(c=gW#;o}oldX;stlebx> znMM{>`Ov+MWC2>e>vfxj zhRuD>WWCai@q&Z!u*?(TAJ}LVO|!M&XEdk)3W0i`vmFf(0`74t&*(OG)IM5P3>94~ zLs(vBMeU3OqZT_;*;GxTBeg!N!rXfqoue1k%A;F;(MA0=sCknb z1j6I|+UgavpGl{U0FcTWJfIQML(B!RPis5z3@(r0N@ha+AM~}iaI~w*ACHK}bf+ZL zm*xYMMKptFHcPXNNnvK*(gnyM27=$Qd&lgFILVIH=>fB^>qyGj31VQlvSB`Tgz>hJ zJ%|Z8y^$n~1}p8a#Zuu_B1{uQDpjBVc$5BSlEn!;Fm)LB2DgRmIyu+UlTATvj!#Wu z$06gk9j!;JBzIaw{qTFL1t1M0IM1-}4`Es$Lq=lxT8d&~a=huC0sn#M z1$Pgxwaz5T!=>O1FnKmXz~~U(vRPzbT}KDO)tmpQnS;4T8tbJury5{pQ^{vr6BHXw zP#%6z4d%g@a}Rd9$DXU#ag9)_n>-7{(-O%`7hum7f0rAbGF6@dBZZNa{y|5iNP`f# zi(_LDJ}4~O^Yp6y3PDNZwO(!(o zvFEtvq6E&&uq*Ax9z&6jiw0#&QdyS8#Mg`48WdbkxZzzDl$uULG&Fw0!zDv&3X_l( zu|(Er@?X9JTGWPX>n#4!j4$y*L=bf>>9T5nDZ0ik}7{Lyp zYCgp$WkhqRBJ79dD_diSD0K*GV@;HW$-%T)_79X81Co-Hy48`98Jc#elvWtOua7~O zQ4AU_F7(%lNzy^ixi~#=u@eS3`yU~d8i>#zVPY<8>IrLg7S7_!b!JMTXM2X+VB^6> z&COc2w!z_^;G2Ul|Kr#~iu1!gnbs|LZ>TGFndZU-^1e5b%sE4k44$CO_-5gP*8(Fd zjUJ*V5D}@pSW>0XHUwUu&M5n=tjxese5R08AWauZUEQZh9|=%YStzo?Y_MC6j);)5 zoDU-lPgEPq)j|d$<{=rS*uVil*VSQ|<(_R!&SIHZ=Fw=-%b5p+DbSwgQDE97Qk|5Q zS%){*6ArR%{11SCL{X5=+p(Q~Sh_EP?WF&n$CW9H;1ReegBYC7Fa9o@{6k&2$-IAr zj8!O(u93yI@3gF8Pb6J46LGSHwo=NnpP1SqiPWL&#cdc+K_=m9129XVA0HnN>K%8E zH=I!|hnv|gWrtIH++>2&DFJeMmA>dV3Y2eEa+9H}^wiT)gOOr|cs)iBJjV}%n2FjOq)*7j+z(`FXGbFTDq%ZZx(}yjGSC@-vQ}dE2#Q=6pbLYM@7QnT*HS2 z-5ODuKI5s`uP#Gpkio#D!&DnM80k%p#ko(MxpjkC$Fz-;UxkF27kLpRhPF!s9 z#{s;aKY)Lg6p|tk6xJmMl*c2@UW78m`;_oeyebuF=ev zsDVl9CLa~LL5XB>ZD^ZB+1iHF`RKt2I97X`%q5GF=|ptrv7un?QQA`4D&fVwMR8q~ z5;%2HV~fheU(U!+7QJOl4i8ZsUEEs;4?Ba(Ze=^}P2C&s z(?bcu)hrjqC~VEx!%@vYsIOn@RcBzZ&J5EcpBXEUn_(eMOg{NkkT;osH@h5#E0jRi z#S!f75lLN(GNfLH&fFl|m*~vLl4T()32AFeGxytj6P4=wVMAL;{1M(ao} zr$^kk+>aMx8OT2?Nx6zLHT6``QZoxGKG7{VQX=&*2``lET?|l&Zg+@d2bCUpQ>Bl; zO+(3LX8YM*ivRY6W%%(zICZ}0!-~gsSK_8`ShgTDyeEQAsrp^SyW8!gsS%)!(=|~3 zCER~x&S=&~({H~>z&|rLSG~=yX`t>nFAW$0W~SksO~8oym_4wF7UdKg*A)(t)eS8I~jthmzx# zrV#d1bRrSs=ftOuC1_c_LCxVY4XA?YJ*x*sm^meHEwu=23K^_*EiBE*IOj4AalKI` zNZENJXqI|{$j}g!Pp`2{^OP~QIR<^gRkz7^1Xhnm0z35ian(B}-ZHjcaDLH9oVaJY z!n1!|r(CN{B9v+0!hHD3g)$`Y#OtGfO+9d%4#0ofv|{=whyv99DY~wh z(!I+Ai7epA+$`Mh{(;u!?XR68J0lr6Cnx*EgdL36acRK|ks*7T3dM5h*g1YZp8El$ zhgL!=nwUm@mJW>w`y*CVaf~3IMe!;_+&N>`s-7T2mN&wRx6aB|=v|&=afL~oS93D6 zTv=pw`oywKud#)Y6D39k%eVW{%>W2iMAWW4Pn|<30;QBM#Oot04l8`xkz$IT_7_(YFP>y~HeXo}l10OSN=ic8; zp2~1YHkawlC~$v_97{fC5CJo)4-$ZgS<@+du%>`RwFzt8C0cz3HyI$RtltrVzGFy_ zS_3LKi<2A|d*Bt_&$6qw>K$h1|FC%dUC0a)3WA&cBV}jbaqQVL1J=>_i+WMR9Enx6 zY|0`$h_&QWP{BURh$qu?+#YU41Sf4qVeFIg( zASUUe5+QWs4-2JJoEt^lp~*&~nccw#=-AYJ+i_65V?On(A=)qQe0l>rd_b71G54?=3q5i-RBV& z7pVnpR|E|->G-|qbi>Jx^rZ12@tego3MxGFCbFQoSa0?>6KyB;i`w7MQ#x!?PR}Q* zjqZBvqfPrVq%1%fddWLu`@36oFMcai*15+2@hZP;%Ned`;%SZTR&EvjqSzEOfJam@;+xfpSW06C5HYtxlTCXn zEVkAqG(1q*kz^65fYU<;ox%>%Vq?r(I_8*_l31fWKa+W#XZ9H3~MFwUS`u=FeakR|H7=kLhij7y%Ip+=0Yu2k4 zQF^R3my{Up3sUxtx>KgaxjEl#5CE0R`{2Lp%5X;EdQbCvh;E@)THgM{s*m$&lz3KO z;zP0(133oIIqFuV@#}()zYB$ZckO0uMuruFH?A+LM+w(-O4a9x4^eEl`)6I~Ai%zk z=<*QOsuKm_vnaXqDK5R7|9SR}+S*U$-{N&VJD0f8J&Q}zL~R!|iqQa!Ak z{Pg>-*T(V74WwhQaTLVRFg+FaW%|K2&{w@tp4s08&DuaQm_7ln=50Zd&{4g^ckHPS zWA3t&U6lGywRbcOX?!s9qgr96LmfSyHCg@auA?lUnJea?TCetS=I=sjneLm-tL*Q1 z$~2#-&9YegqOP6^+u$F`bMO6nXE6lbeJJ8f^?QTjC^wqc+626w5&7gjq#s%;0O~Yy{FX4b-scRhs9mZJL|$e)NnG1M?0-e@yCTdodLbe|J>V~M zZ!Q86dqi~cv+}4^2=}QRSM_-ft9kLGr3!fS1R5hn zjgv$E>MZ|EuhMzk(Zv3j%{i|FV^1^&Rl%AE7=*u`gRg5PU4Zu)Ho@cwzk&5(IzHO8H9b zA$}? z%Y~1WUr_Lokr5dd7M1{*KC*)`)m_!zPIx$5E^KSdFgZ1qqyOd)cSR2*1iRb5)kr$~ z-fD-hOjv)asusXfWkN$k!vZRA#Wr-rEHXG7Z8YwcT?GHWKCzb|ADlBTgU&aNIu%H= z6lTGB%|$J)r?zkUdwUhxT=s}q<^J8YON+70%xP}ACA>0@V*v8n0yr|YLx&KS-0Vk<~=mX)dJ-$b}S|E29DR7|iShfy#C!Ovqu2C1 zp2CcV1Jm~^`hN<1G3LYl;QBCV)eNQzWvLh##2g(RGwy-YVwrkeYV^;%J~X*iW79)t zrOz1w&P7+MiPk@ZY9DO<%qvU20X&D+9Ko~|IIS|Om0 z+#7!tW-xmPg{@JUZog;TSTFi11RO^b+`2uqzaTdrX}$3-YZ^*cqVOD^*&K_Yp*|4b+g)&RPwqsSA2mI@@ za$6sQb0swU+TQ4_O#JL9v*GJnlliz{FSPH#XC0T7$~f+QBR-dFs>TN20PT|&_|ie! zuFVt#R%74WY1P{izV{WWcT^$HHl6)rE780a?QpI?umcn74R&ngiFZQ2RwM_QTTY=oQ?}xVr4ySdpF*nxV73J)_!BM@d)54 z)7$Q~oLddg;cqtBKGNSj`+X{W1|O5tIiq9I+%VELOu5<_%()soG3j!8O@3=)RgJ@X zDKm<)yY};$7xILF_S=Z2!AbSS)avGLOlznyV;e?M%xG_N%(MUdlU8U?J5O9e+<0o6 zp0do?$vEQMqh%sB0gFFN7jvCF+~utnUqmS_L=!c`HH=C$N~C%s)?| z{rboH;orB7xm@cC%-}yT&-NBupO2CVR{^q%aXxE*rh|f*l9a~xH{)Q zYOq(8jguT54%>D&zZ~j!^`&ou>=Em01*{iH?0pwik}iBxHuar+{I3cK(T_++TQN*w z<|pIk@;a6$DJnOa4Dx4yy`H}Ql|AKJ(;M;7GAgijF|uRM^M&&xT1k8KLL)j>qdI-W4<#KqRTi23dD#gcjp?0WeZsx6{8WusNth$L{R` zB*YL2)n~v}Zrh$?kG-_PJMDriyvW*4?Rl;BPinoWRhosyDyNCRu>lLz4 zvum_{y<*fx$C_JPHu?UD6n`orreD(AZ1btqCoGFpu2Y_Y4>7Rkym-TYLELk~`+R*Q zYhZb-=AHfwr_u6y@)a{%s6Sft`==Jj?WZZx#qM9+*7h!Y)i_RfSQy_+)Km zA{{pr=tyn8vZ{>TCU!n8Y(JNSr_KWK0r%RcTQYxxrFe zYX$f|@1qPqENK78@?s}!F-n9Hv^2BQ%E37aob@HMeuBHbG|Vq1uW?nkdMs2mZsUzC zTF+$-<$x702byAuajY}{jRDRckOyF-cYXh_y|<34a*N)D6+sZBrBjfQlrlc+6r^a@b1eeD6ig6wBcj-&`2HN9SiJvr(g%TT3#qk8gE#-T-P#=vOUv27vdSc6%TW-Wt zXfW5}=PoEXZx`I2q06=M(NDe!c-?>1P@ly;92uJ|?Vm9VBC^t|!@td5`som=HfHGj zL=&e!(SdN|y{+@(AanwKjzzvd1NKsQl3(~v{OjW%VsRCNf_#VUYmt1eaCVq%c{-j1 z+s-I<7lCJb2VGcZX4g6w>a8P#%_50;)^A#_s?V>5OaE-8^^|@IqJ?OzD8{m_`W%H0exSbQH-mE3uK8=erh$?cI zmB-4`?GYY5nhTCaBA>f^BOH)*sx%ffuyvsMhD z(ly)#7b<-#@o-bBS3gt>b>`4{8WE72f_CSzl?ZLr8QY!@U$vC^<-r=sQ;1KmTZ?1M z9PjwDA+9A*x2f`p;Xq=eZtr%6Ic}b(&ZXF{CVdh8_oc!pMrxB6_opdZ&w~9ze`LS7 z=oQqE=Rf$7fEGRs-WbD`^ltr-hJCQS0y^*vdGE8>Ran*Y#ZQ0?z4;X}NED}EkdezN zpRP)e(8tj+@C9ZI3SP6`xJe{GVoSrOTW=Dr!PYM=GSQ3Fn&s+3CQj6`SkGbWma4BI z0#xUV7m^2KWJRiiGkOW|k+RIP9M)B(cU(0~{<_*G11J4FhX(w$1(FF^Luu|7a1vB6o_<}+JdRyPkGdiCH6wgZYI=8#Nq_0l+U<6Ji9C1w6I4rk zE{l-25P}#A?5T_}+lj7bxk*ucO-DH;VcZO+c%+{c6wWQR!Gqe8O3+%m>-9{?ozdwz zsgV0V&(o)=hxa*mGYvfZ^jWOBPDn7B&lJ*6jT%nqq)E)j^y)+i+CCNHiv+PSA87C1 zS+csJA>}b}_R7U?1YLRjK+d&9vNmv#ap2V= z^Ab{b3hz2M+9YdI5-xIeKJ*%9?I`3>nndDVMSM8}ZTHiTr-~`oL0=fApWxRen$Z*x z86>fmw+I<4vrcSGm zDEwQe5IswR0ed_2Y{Tu+DX~w~H5AgRSYo3+RBYLDB{g!U-2yWcL*Wf~>+=g5R}Ixd z$RFua&K3gH|6tk-N37bVAR^xWg|Jl52*dU3ixm}EI{gE~e}l9I-^1_YH)U>#*2U+4 zQ`AqwTL7xjGVP#;VL;$7m_Qk&-u|b*`LtAqGmvB#S1kR9(QvZ^$5+SgtRoYD4NqI}PH9N`v;w>MWEtGr{@(lZW|qL$dBeBc+<)CR4752wlugCCa8p8Qv228Hfk(a{svB+Go{Ay_f&@D@xA*O)F)55B;z9sQ{cA zC#!LP`{j4D7=Zx9c}80VTS9@v!t4$3Q~?$C#9wRtk9fd~3;#E2&yP|XB&%KrA$4o? z>wWU#MXkZ5Cb#=v-`S9Y=MC&+QEVZxy}fuYyRGt3@aC}|us60=p$A1j__fu$xGD96 z2k&oFJ_t}wCrT>8}pZ!Ca(_6^5xs*S%RY^+&e$g)^>4HI=AGtz#6Ds z1RGdqH}F11m^xmy{G7-CAM%D1`=hz~$)&4Kt0N9+%GH)@Qdn0m*mZ}JNZ|bPre!I5 zC2XkJlV^&R{-$&)mXuBK+#0`_hA4F|h9SWNoC1 z)2VYpgO_Us3uoiq(}6l)v;sQL#k$1xWR`Li`PQnlJ8Ys=pW7bP^ImTu)F|(p3XQs1 zh}BcJcnJN$kCV5)O_Mw|cLarW6tnL8Z81U}9gY)U4SFf&SXLTySxRduzZUmhq?+3P zP>OH<@MDJSAO@whYgIiZtT5f{PRn%_ac(@nBr?VEoMo%9P-(^Hsk#{P&fYt*3U4%` zGLHj_A_&z2whSMZUCkxQu4jzJ1@J~h)>ZW{o_{92a1rK5{je;=^rj2fb8X4R&`r#^ zuD2}@(M=#e@Jyc7aGH7ZehUj4;X$Zm23S zAOG3P!ETZCS~aabj8`z6-*)HT`R?pyZ7(!;H>I)>Nm9Ev(_q(jP`Z2(rM~>(T8!(#&Gi%M8D9{adu0D-kU0U zyNG+e*%_wTybRKIy(>QNU1<3+smuRf5aVEt@FTrEL1>_iUqvtrk6;hw1 zNO@(Bzg)R`TcSx>bxWGxvDUAp?|LGt#I@C6)^t!~C+@aQYc6(XL$J`kxB&TtQ;4_N zwCY3bdU+sKaho8PE(>vJJQ|>T%DemY>AY>n21HZlA4YMg>OX69AFJDd z1XX#g_TE~Ht?-<+ya)R@C7cw?CWf2GfWPkjk~!$`%v~uAmNzrWJdUbIDAZ|ycXzo- zK6H~MjE-7XvFS)x2Yra8Z-=uT$=8usyg7;~rXapbE_?LpyUk1R?P00gZjb#$txB$e z-EJWF&M8;fK??Z$?b7J`v*b|BrV*Ci5!3HRvk|nkSZ$QJ?Y?u@Y^p{-n<#$#%2w)3 z;5-ny{r+}~9Op8%C@WcqN~Fl-A)y?S}dOc-l2A}pIY_Q?EM#LjI+=fmIGOa>*!N6^wn3D(k*Eu|>Bp!e!S z!@7pUKBfN47iWC9%peZrJfXYCoC`dtHiGh!X7xX1tW(Tawk)g5K z+af8^#OS&epNnJY2l&eq@%x!cneo<^O326-ikh`rF#A2OTua;gj|w^=O@mE`;Kjp( zm)yP+(%W?>v_=TULaT}KOOoId3r-0Smnf5Uk7ZQe+#5oRd8Ws8yl$(OQiE^A4ZIvx z#^U5wzZ*Zr7|s_mK?^4sMk)1fB+0pjvtm4;u-uR`DmY;&;|e;_j#S_(eH4mV?PLAZ z4B*8^KH`uy1;;iN$fYuVBg$1Edfb3-P{`>Me#h|b%X;kc_WKSRvWWR_oagitOHCIt zN~;wWZbtbXy7=yRa4Ob>=IfsVT|BUX9va(2i~ndPPzgSLvrOefW<-g4!^ zTAg~oFJjK-1=6;LK0|3;M{b7Yw5djOhX*M+sdp4V8fCqtmy*&N5A;XOaD@rN8j}Xq zQQUfjOxt&RaE8>HX4$EsS8ZGHGgSkHh}#cchOJW_ie=jfkEO7J&AMeB== zTO+tIT*fVElBIB+9bFf|hgevSF1_T_R@XmcE}^WByz99!$rB9kwpbAt>(L8_s;+Ui zLo_%OIJ_`eXS?6y^F%!&K{QHpen=K~bM~mu`wG-|=Y?YtKnq8anSxozzA`eZkEec^ zW}&(A@)6CC;O9=8(NEpz$m8ENy&WfJsb=s{7t7N6F!T)5H`s8amBMhnDx_srWk+rA_Bz;K~GXiuK(LT09ZJ=@R;1?coPzTBgMtoA# zib6{08^g=?nk_c37hlV+e!k>B8hi8eIDR>xPNol^Rc2eKhIlu;Ey1aeg`3~B;iClC zV>y1zyfmk$LFlx?I`MIFqu%S9i!)SkRyfOtLCeQ%^6eQVsOKJSSF~J0F%kP?U)qv6 zF-8?)EvM}@Zn|mm-|R-1I|#~(ZAPxj=#@oSp16Apk`b=r(D9mB8vsv-5k?Y6M>Hk3 zw0p39BukSZD~d(&Id9~cQj7U;prX(jg8lfT-NO4$%YwdFVL~8k8LCkGwM5h94So0h zi)9vr9=Fgg45NScr-Tt-U^L)LV%nOUyNod=h4r80aaKH&SlM2nuQFIQE1tSh%g4;b zp8i=Ar8wM7hmkd2!?~L|G3fToT(;Y`PG=xY^%vFlxqpttV;T;S47@w`d@ji?@_++R(@j`A9S;7wAhU@hsb59<7(vL}n*~vg@P1EF8DhH;7oa zm9Sc(#<>FttL_`(g&U-@<`X0cLLg;M8Gk&xq>c+AXKCpx3d^e`l93i9?4Yn%Iq8DB zIxp&8hF)!{HK-3@LE6~q?OzR`koExM4-#Rd5q^r4?8JQT;`LqHS3 zpmK?dy``IBTdCeX&|cLZKmCM{Kko~DS$pO&)yts@Th}6nX+H?-x(!{2^-FxdY9Z~z z71j)2(zkIoq6e6wpSQnfZtVMLP+RJ_el$=&bFdtw*Oe73>mqg>d$43G>TtIt1rlVo z_!N8lD05+HASSdtvPyZPCKq=t*`Doct?l+ieryX}G4d2hAud*F+ku2CWfz0O%|!I9*uNN zMhLK=J@kFl<1%3=tRG#MTWy&9QKID|c%no+Y|MFkg>MG?G4@p2=v15=X2oL>xX?a zCtK~$^>I9NX%z7E997d2ksrlB9V^Q9cyZeC;dAWyMsJRr;gNFo8m|7xxqg2fyV(lv zk*XR^+?=?hX)qXTvX1S1g&5<^>7%fA5=vyPs!^yJJC#En*e6XrQ397_bo`i^g>O0O zN$<}%7w!&Sgyog@Y@gGU(?F>jb(h!-QCk5sjJ-=yy&?)Y34boMki-c;MUf047reMz z+D|rFQc#y~|Gs^}y(iV{ff?bl+uA{e+P`-YUpKitp%R*u1Wy;Yxa%n-)}wUhf`p=D zX7Hv-VsWNOY|e3X^t?M;^3^N+1CsiAeIb%>ilX@q6A|$CsfA%|s)T289n9~kWq$Zi zEiI}%$7S&Bd2u)sYd!a+;Ptx(Tnn;WE4i|5dgtt5q^#1(T@i|G5Oq_c zOafBoIom6|FeT+=@`wDR{Yhej_3r0`lW|_C?4fp6#bQW35@jXRBcb+P_OA<<1--{S z@HJUc&^x*h=@yQua2a&M5M=7RwViL4nyL5|&I7X;QAg#4N&=H>4AhT&9-j1E5s81T zVYu>~k1M9Mq*%k!^!8iv5Ae`iy^ffw9!AfrK#WWiJZx>_Ld1`W|Cf+y2Ei5I6kqMk zS2Y1|(0s(Z%X(wxw>6OV5xc|_&epdPgUp*B{VwfwDEp&k4XF%Xvww_asy^07A;+ti8;V_MTI$!oE)u0meAJ2*fujVPC}ma`@#p(D zT>Be?@@?Y2nwJr@_1a7^;DgMC#>iDm^~DutD)LnfY0#!b(QFwPtr%gM{sETe(T0fr z9{jV@UhxbA)VE(ke`4VswljA&B}WHadD30p+@0je8kQ<&(26#G6Q}#e ziU!Sn+8t8_D_XdN-WU@p2al<+j-mFGxI5>Nh|Rl4FA>`7pELzJpX=A*hMoNW9O0<3Tyv(fex`YcG})ZC!?u()mXn-`*$QNd#9-YRr7Q2}c>Xo+l3p z&#@^p#Xa${0aeRBKf=9TNj}Zy1XJ*SuVLOQHr%tmSmX4mVXC`U zPW9bY?u;@GtH^W1LX&*(5FUfJKv-PYz7lI^9g>Y#Q#>KG;GJi47u;}6bLY_x_5rU% z?Am;-qj2mMx|Sw6o6kWnx%z%X@@1G<@H&1}e?xgk1q#@iteKDBp;N7wa-dqg z+@1ECAQH-HxoNGqoLcbKMo-vFAZ|IPhhDYy#MlITpe5RK*l%Z4TTRiP)dzc9x?ao_ zj+^t3IR?6GU9QhuZakW?v1GC3()GRpNQ5|$ebwpR^}L=OqL7%bdmOxtLY@V==Cdtv-e?666zJzwjN?zT#3@q^+YhX{Esed z%Wv2W@9cAv`WRP&CrTA;%ry0Mc3B2dXTF`J6gt`5QO?{>DSYwR>1v!hK=jRLYlx$5 z+%XrpZuJQ4*BbYA>mRST8^X786Z7QEj;xyX#H~sqY9gpHrn#!RIAFZ=F3>3VjxW{R z7R-rH+^MXo)va-nYMHN8+B&mJ;SDL%m`D{gnUS`82d}VO?z&|P-K$(tI1q)Xwn$Q} z9hznEHRTq2VZ z%eINb5@!ueA|Gls<%RtjzkJ* zY-~G6oUbgPLTOn(wmdb0DxTT|dn314(r)r$eJCe13Tx2$pHtaum6h4)l$Gj2l6_hb z$8hn>Pv0DPw%$w#a8!;5G}V#DQnT}88jI!gR~5HB!itG za$MQX(cP-7m)FcE`)se9E^;ju>Q@Dm9qpdNA(1Ou!g0;JW!2Z$_px1{AP0(U)(!CM z+N@{PS(>c-)zuoB^3@qPzs2$G9G)HadlG(>Cz9prxmM5U>d@HDuv$9Ui4-mUaVkQ6&9^Y7@&je|G~N?2qxO4w#cKC`H)O*qU~)SmD< z(hJmt(8qe45Aw|#DvW7_^U9CKc{5twNj_&OnQzwbH@6%)Sb8*b-TocQH$cN~LSsk| z$i9f;Uw|ChjFE$hM7|#icOrndHJ3)yR|Rc$KQ93aY>(LQw+Ok~s?6Z7q5X;#15x@!x zFvz*zcD@>Ua{o=nF&sR2gvjwRtbh(4DN>Ck+zAe7^xsaKfKHFQQXbwHaW^ zGWAb458{FWA7QBl!QF^ZhY<)=vG zeh&ae_z7bo5E2oMPfX-SMxq6FEKy8oCjs;t_smeO7sy;ggX~PEBdBjuvT@wVy4O83bfCjckY*(mqor$Dkelq|Erc@!vft68h)nQun9w zsRyHz$FIH>+}TYZ(MBF+fxEfqZ}CU$MRpY61t9bJM)#Q( z-k0JPv>&T7{rziQ=9BCRn!6owPTBfS<6Bh z=r^WAKJTBX0<_}a4u}?*Y!45s5(D&`MC`&F@sG8D|2<;@OgyFjvAeqioQ3zfv;6^+lJyv={k zn$M_UHF~ak(UhF_D$`zBX0VC2PKez_ipW<;O?Nq;Q|KZ*$dHlus`04G!o8vEvCde9 zXRwMSO?ldvha6X0Tqi#xc8&BDr)8*_swc^?)m&5|w+J*Vh zNb{>bA5&LqTQy0VEEBDO#Kgabppzr7H0b0>GsR^~CR2rk%q7evUZgpLquIuAIWdPH zOR`b*sYzTtHKKdVX?9Rfim;;8X}}^bw;29SkU%gd@B;CEY6xc-z>CPlIjx&nK?%V6 zjzkTG`g8(Gc-q^~o<1HQVqGXAc?;SyIH^pYG#hDS`K+Bj$ve4Csi}0))>9nBJRj8G9pMwbJpLhcFbgoJ6)Nj0QWUXs>cHsdT16f_M z%8q?#R^(r)q(lqNKQzVJg%9bf}~@Uyaq<^zMkl(%N?* zR25@v$x8PlT&ntkNt|BllV34|n{IR7m~K!!Bit14Z*MCd^edEa$$@9!{*3*TOzX9S ztgPo5n&nbYwQ6EL!n-N_p*DY?ZUjkeYDBP#|M$Jc{Q9`67rkAP#3LW38?BTIJzTHf zVpeT@oh%x^zWi`u4Sj-2LaOYRb}^nH#xQv?9eJ-ta>eIxZ58nY<7Rs@gbG~T`GF{F zwDw+7l;4W-f407s%YVJY_!^aLBj#$lRUi8)j@d+e9Iu@04;-^iWy{N&C!$F$dj9R& zR80}6tcYk&>0F#%U3eL;!&M0I1Uh#GmQJXZay~4tP|JGMG;{c4Z_G7(D@sL} z;XbDMhvFiU@{Z*hDjh}28fbf>C(wthjJ_{%U*iFHc+|Nnh6oq(Zc|Ai09SPf|NJt{gC|C=cL4#&fUU@6;jS}-u`ERn*W*TMqPc;a9@hh?J zL-WsPug>ySR6twGRS4*2cfB{fM~zGsWlAVoTTVv#uOZgE9$Ab;Zxu{qf;?!(r`MW2 zY4U$gWuTp+)9R-MSH^&N5qAZTxL^9p2*H#I0N-d~S{>ExQVR5AFfGpHd zJRR@;N(tuX#j1Dw)-q60a6#{Jz1lp<^Wx@h!s19t4nYE$pf0_isw7eLxM44OeZ&l@ z6__^5bXf;_S#@|O?jsy9+xOwY6zn|s%G}!VPb2NI2_bla3Xvr0`E^<-{Y2B$TC9Jg zt!jp_J#fRo&+ZBt#L5i3@Rx)Z!xLIgaIXU4);ze)ctful!KA?ZsYAYq{qTL3!sGWQ zumI@;q-K}iAI!+^1H%7&^3T-$AHDo`n*T?g!GGw-4>6^rXsH*`CsR48D+g{4k(~zJ z#_WW#$uu-HF|(l#26V4sVUn8>&bVQDUwMhG{P2EiDH6dMqeND< z$uPsFJQNcEzk?bh*!PGaBO5?9(TB=Buu1|z0hB<-1GWHuQ3arpvJTxpY}#+YR3Hfy z2pGOmfUOA80KSsxky*W8g@jL#Fo+9H88)B5npFmn&>Qz}#P{(cpVa@;PUy{!8DGOf zw2KfTJ`(&hOsAXI^% z{@Ok{KX*I40H+{K!H^!gq8i-jdqePhcUC;Y*pD=a&}?t}peOgk7tY{>&qV-JW`Q~E zuk(YVB#)p1Z7j^x$gqg3_WTtiw>&A)MC(3Fx0kP>pb7(SZyvt!e?}y%_s*{9{p}FK zy)_^BV?9Yxwks+uq*toQ$Axv)Y73Y5jQHY-NDC^>4$NbuX#o71%E$r3qH0v1R#94W zetz!YwL3iXQP^@56%D9e=8pJ)4zsKpN*^@T@D=`83Xfv}VbB0fUL;vOT5f=>m>Lt|naqr4|ZaS{{o@JM{| zl-_l_BHX5=V1AU~@9-KCqM5-M$VaDN$zh&V0mq-OQ6Z`ThIx5Az~2PAE5S&Gd`-al z`q2bPU@nY|4KM_2;(vj<$!{Wp@7M|EpR}@olPBQiz#2`$0l@wC(5U^rG#Rh_%Mm26 zR+s;i+Qm`=Y(+}h*BqF>G!dd()Ij05wdpS_W%$4=2fwU*+lK~Dk+YI_F3y{_4DwYF z?}uV{3E$(=d2sCfneDGyp8?Q7ICDf`WoV zNBaBX4Yy6Nl*2vWP!mQ_3(e-FMv?Hn{c@xXo0xun(bE=2Mq-(Yv^J1vNG5;3%@Q2DZQ7$zy#d=rTzJg6p)^%Gt|bXOGt` zbb*PgX_}gId+W0^-;_K%QI|1w53ZVVzW+0Olg+KF53W?p+J@WTEvBWV{n~aln+d)* zfoi>Q=X^nlliLi;Dym6+A~ z3UZ!c5Yt=#Fk`+qr6M&jsS_7@{?eP~fImnRvCM?s3-jd-FjJ@jD*nFUf14=&iircs z{MNR%wmb@hbud%GBV*87+HC_oYsR-{;`bK9pv`+wQ_%bE?}z@#fJWX9=?$yGf=dc8 z7ze1M4Xofjpb;E)4R)OSs1CH!R+e&^LUdn{PY!4V0Tovc)>98ao-*VKuEUs7Iw?RS zuLHzY?nU%>0G96mGooP7t#|Wq{W0G&ru`$+%aeZHo$-MHFtX4&JISy>%jr3 z4wycTg)qXx%S-#f?HZ@|t);&(c?NKqHc;d?(nQ<7Xre{<@*k9;SOuqhv&p0zEP=A% zYQ#@qb42h#>V@)X<}e`@R)~??0Jt#47%6gfY<=!uPwEqC4JwyTIBcS@5XFw6qu|FT zzL0_G3*)DZ-(mtDcHrMd7Af)?6^34reo+AtCM-nc-Yp-%!Assg{`>VIV8^vivFGS7Bls|a))pjOxSg%meW&6}!m(Bs@57%m3`u?6scq-RTjY z6WI1~jH%C!<={lB?e+wXO_Lbkr1g;R5A0C6)zpJ;g%L73P45=ugSvb`$0w!=Dq*@8 z?6YLojZY$4#*1BVvur$e2)@yKhA5FtaTSOgKaHqf^=H*R@G@?ij$b4IPtV%_Stf9v z@7JBVBo5&NH;efb(ITps?rx`0JkADXKR)dnmRy);DP|7IuUt%tyD!mxh)X2#prrnar-k+V)n9CoAKRDDm3`XXCl(u+}q>S(n;q@P~IeD-(H~nLbyJv z!S{m0`y^OlV|eez*`bBeahA&m_{kZc+aaCtM*60^%VeQq>ws@!B%8AZeDfzkPLQZw zVyQ_`KRrAcczEP8=${znhq;kp$>dMfb=<_57L1!`D|CybWy+ABc8@-S|V>TSpC7Kc}1sK_YUNJ5zt?M#HRap zZ!Bl*$Hw!Ul6tA{bI|Z!vwPU>cG?0IIERH?*IX?0%9-I^wQ{NN%E?;F!=2l4F7{ez#pR)AiK3}Y1C!5D-btBSMEzb_ z(xO`BwcjNXw!Xt`zT0 zq?m)rl-l_-G;FKIFVjYETMa<AfD93;rwG1rmG`VP!5;hIiSfI*DN$Zq;lCyZdraR@0}mCd8TzN6$DY@FSSH zuFaMaK2GboMd}PkJgzT$#^i2wM8VnOiFGzmqd|dl;OC*wR6NdTS~AWSYPFAOT(&0A zy`MwAyy+O4;N-gDnU$uPO0#x!n4R0Y6{~4n33sxqB+{xMl-ey^^Q~0_^=HW}{2St4 z!3jaw3~sH*d_BQqVU(n?S__cGMyi|hTu@r^8gfouHI_Nk6b zbT{WW>(I4v>-yys@%pVt@mnf|$?PuY-vtlc7%Zuh$!2qX=LnRJzA|~QThHT}mE#Ht z5D~>et6RL{Pkr||o7U-thMU_kBcdWLGWMvfXUf%M*0%aP)<}=5clcszDrh8hCeB)p z*9mN82j|9wdo3Ui_5p%dx6E6C{+MzJ%!CUKj(I^eSiI}?=ya!7%$xM+He)PDjX45m zVOnV;j@~qB=_z%mJ&@jFXb%bByMMDQVI8>4^Y89#9?82Gd!}1*rc7hJYz^k%G(m{d zUInxF!Egz)QWpZfVl% z9XhB|+xC{sw*+zF&b{g6>YLWlUfm6f$3iAwzbiv-v(d01IDrSD{RqdxL94^#N_Qb| zMfWB_(CKJ4nrP(&4|+=m$(j(KOmdV-Ki{yfKiE~h0chQ3w*}WK59t0-pKBZB4V?`E zaP|Un986*|9r$DHjC2~tU6ebr6Uq(7#KiFaIe4L&7SZvqz4Af+M|*Bg6R9;qFWqhm z#!$hKL39&uO_PaOQy#lnywdJ+=gZvBn4a|Br!n5Wyc~)25u?psp6%K%*=r#ET`Cuw zLh3EvFKHah)hUci?M$ZQH96A<85t{DAl@qxTm^-NGQh9KAP1t5=RJDx0FmU4*lShb zL_|r6ybIdnfNmbW=F!ms7l&T28IxYSP8QvlJ^z9&MFhB0=t|b0`fEvk&`**X)`0Bw z47j(BleQFwwbIOtYx_$CVB%L+uw)7&0oVXe*=?hNt@i%JK-TuZ{SzDx13>&i5b=$33`wbguGv)2jAnbSpkj zXs~i*YAWGcJSMS6^-7Q^jfn92P6!^@n5nv>8WH+E9RC9B+NDOc>AH8+XGd=1Bk2~q zi0Z_J?oOLTe=<07MKK`V#ANw~49h=FfC7#vCT|!P38e+{PYP-^7@8et022MR;T+rh zln6NVfD|eIBb)AChZ#u-@>+J43ktuQ7e^Tj3F4YzmGiV(jTvlr=}d^ENr^#-q0?qi z7>j`MQz0Wkv*=gbuuJ!>Ud?XYg>$0veJ2m#*q+o{t;SUsxq9as9zk5+y*D&5w4&Me z+MX)w19|pavmdh{QyA6Z4aXC%+*z7bSdNCk5qWk=wb3VtLkzU zlQrJD@9b;wNIE1y#G^w#)@LFj|t3%7Oz_a`E7$7czV`olJl(e zoVJ*BjpJP3&R=eGo=xuznrc=qChQm`qSla3<<7L!cfoKZ!LD};y?q-nVfa+PqIwaNur zv3+C}p#9S^!f|Pch;&DA?^Jt`v%bD@UGMifs(+ZK-$Tf3l!;GejptODo^F7Um_{^i zRdCRI*i}Xx1~v9cc!++5toJnJKy0I2oojP;GF-i@N!GYw6B!G>k)Wq|Hpg`U_ZfuK zmdDl?1e&+LD8Uop_E4}QGU?DUdDOHtv|FK00Mhhq6zB>BezA8V**e)(XzPCF3g;jj ztx?aS*Yq>7O;#X?s}E>Z!&Ckadyx-*qvo^_k9r+8SrmS_85D+VyC4JG*Q$Fv({Sv|Su- zoYI?mwYN_3YnUA&uZ>+=tsUEj7$FCV=@6GVn5@M}ZbvaY6;~;i zn~W;5SbJt_w;*Z7DfEMXZAA6ZR-*jo)Mub-*Q@agQVqleLSpLx zZPBAApQ^2@9V#~Q!7%7KPPcd%TjP6Sb404L;n5wCW%+5VPqyt7eYkuW)qO~QRpHnB zc3Qf>l3DA*t0uL2af9#|?=tGA#H%?|n4AybE>LPyV(%~mW3TV#CZ^VvkiaMpfdAfz L%ZrtW=)M16Vfsj> literal 0 HcmV?d00001 diff --git a/test/integration/roles/azure_rm_storageblob/tasks/main.yml b/test/integration/roles/azure_rm_storageblob/tasks/main.yml new file mode 100644 index 00000000000..4e47f3b742c --- /dev/null +++ b/test/integration/roles/azure_rm_storageblob/tasks/main.yml @@ -0,0 +1,145 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + +- name: Create storage account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: testgroup03blobs + account_type: Standard_LRS + state: present + +- name: Create container + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + register: create_facts + +- debug: var=create_facts + when: playbook_debug + +- name: Force upload blob + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + blob: 'Ratings.png' + src: './roles/azure_rm_storageblob/files/Ratings.png' + content_type: image/png + tags: + val1: foo + val2: bar + force: yes + register: upload_facts + +- debug: var=upload_facts + when: playbook_debug + +- name: Upload blob idempotence + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + blob: 'Ratings.png' + src: './roles/azure_rm_storageblob/files/Ratings.png' + content_type: image/png + tags: + val1: foo + val2: bar + register: upload_facts + +- debug: var=upload_facts + when: playbook_debug + +- assert: + that: "not upload_facts.changed" + +- name: Download file idempotence + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + blob: 'Ratings.png' + dest: './roles/azure_rm_storageblob/files/Ratings.png' + register: download_results + +- debug: var=download_results + when: playbook_debug + +- assert: + that: not download_results.changed + +- file: path="/tmp/Ratings.png" state=absent + +- name: Download file + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + blob: 'Ratings.png' + dest: '/tmp/Ratings.png' + register: download_results + +- assert: + that: "download_results.changed" + +- find: paths='/tmp' patterns="Ratings.png" + register: find_results + +- assert: { that: "find_results['matched'] == 1" } + +- name: Do not delete container that has blobs + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "not output.changed" + +- name: Delete blob object + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + blob: "Ratings.png" + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "output.changed" + +- name: Delete container + azure_rm_storageblob: + resource_group: "{{ resource_group }}" + account_name: testgroup03blobs + container_name: my-blobs + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "output.changed" + +- name: Delete storage account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + location: "{{ location }}" + name: testgroup03blobs + state: absent + register: output + +- debug: var=output + when: playbook_debug diff --git a/test/integration/roles/azure_rm_subnet/tasks/main.yml b/test/integration/roles/azure_rm_subnet/tasks/main.yml new file mode 100644 index 00000000000..4185fb54a7d --- /dev/null +++ b/test/integration/roles/azure_rm_subnet/tasks/main.yml @@ -0,0 +1,134 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + tags: + testing: 'subnet' + delete: 'on-exit' + register: output + +- debug: var=output + when: playbook_debug + +- name: Create virtual network + azure_rm_virtualnetwork: + name: My_Virtual_Network + address_prefixes_cidr: + - 10.1.0.0/16 + - 172.100.0.0/16 + dns_servers: + - 127.0.0.1 + - 127.0.0.3 + tags: + testing: testing + delete: on-exit + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Remove subnet + azure_rm_subnet: + state: absent + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Catch invalid cidr + azure_rm_subnet: + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefix_cidr: "10.1.0/24" + register: output + ignore_errors: yes + +- debug: var=output + when: playbook_debug + +- assert: + that: output.failed + +- name: Add the subnet back + azure_rm_subnet: + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefix_cidr: "10.1.0.0/24" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: output.changed + +- name: Create network security group + azure_rm_securitygroup: + name: secgroupfoo + resource_group: "{{ resource_group }}" + tags: + testing: testing + register: output + +- debug: var=output + when: playbook_debug + +- name: Update the subnet + azure_rm_subnet: + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefix_cidr: "10.1.0.0/16" + security_group: secgroupfoo + tags: + testing: testing + delete: on-fini + register: output + +- debug: var=output + when: playbook_debug + +- name: Should be idempotent + azure_rm_subnet: + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + address_prefix_cidr: "10.1.0.0/16" + security_group: secgroupfoo + tags: + testing: testing + delete: on-fini + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Remove subnet + azure_rm_subnet: + state: absent + name: foobar + virtual_network_name: My_Virtual_Network + resource_group: "{{ resource_group }}" + register: output + +- name: Remove security group + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: secgroupfoo + state: absent + +- name: Remove virtual network + azure_rm_virtualnetwork: + name: My_Virtual_Network + resource_group: "{{ resource_group }}" + state: absent + register: output diff --git a/test/integration/roles/azure_rm_virtualmachine/defaults/main.yml b/test/integration/roles/azure_rm_virtualmachine/defaults/main.yml new file mode 100644 index 00000000000..1ce0ce4e53d --- /dev/null +++ b/test/integration/roles/azure_rm_virtualmachine/defaults/main.yml @@ -0,0 +1,8 @@ +ssh_keys: + - path: '/home/chouseknecht/.ssh/authorized_keys' + key_data: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC1igsIlcmTa/yfsJnTtnrEX7PP/a01gwbXcig6JOKyrUmJB8E6c/wtZwP115VSyDRTO6TEL/sBFUpkSw01zM8ydNATErh8meBlAlbnDq5NLhDXnMizgG0VNn0iLc/WplFTqkefsHXa8NtIxAtyEVIj/fKbK3XfBOdEpE3+MJYNtGlWyaod28W+5qmQPZDQys+YnE4OjSwN7D3g85/7dtLFvDH+lEC4ooJOaxVFr9VSMXUIkaRF6oI+R1Zu803LFSCTb4BfFOYOHPuQ/rEMP0KuUzggvP+TEBY14PEA2FoHOn+oRsT0ZR2+loGRaxSVqCQKaEHbNbkm+6Rllx2NQRO0BJxCSKRU1iifInLPxmSc4gvsHCKMAWy/tGkmKHPWIfN8hvwyDMK5MNBp/SJ1pVx4xuFDQjVWNbll0yk2+72uJgtFHHwEPK9QsOz45gX85vS3yhYCKrscS/W9h2l36SWwQXuGy4fXotE7esPsvNGAzBndHX1O8RMPg47qJXz059RyoGforoa9TnzIs3hIv+ts7ESx3OEq3HNk0FJ+wDka7IM7WQpGrVToJ0vfDy9Q46nw54vv5Zc/u4OZF3F5twHmyf3rLYKXRDuCvZQKT2iWQKVX6j63bq6orA5hwl22zndxWZNtOwtq8Sd0Ns0K/Fo/ggYDDGBtr68DwhA+MrxrHw== chouseknecht@ansible.com" +image: + offer: CentOS + publisher: OpenLogic + sku: '7.1' + version: latest \ No newline at end of file diff --git a/test/integration/roles/azure_rm_virtualmachine/tasks/main.yml b/test/integration/roles/azure_rm_virtualmachine/tasks/main.yml new file mode 100644 index 00000000000..f8aba05cb83 --- /dev/null +++ b/test/integration/roles/azure_rm_virtualmachine/tasks/main.yml @@ -0,0 +1,2 @@ +# - include: virtualmachine.yml +- include: virtualmachine_with_defaults.yml diff --git a/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine.yml b/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine.yml new file mode 100644 index 00000000000..cf7794714ce --- /dev/null +++ b/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine.yml @@ -0,0 +1,170 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: Testing + location: "{{ location }}" + +- name: Delete virtual machine + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + state: absent + register: output + when: remove_vm + +- debug: var=output + when: playbook_debug + +- name: Create storage account + azure_rm_storageaccount: + resource_group: "{{ resource_group }}" + name: testingstorageacct001 + account_type: Standard_LRS + +- name: Create virtual network + azure_rm_virtualnetwork: + resource_group: "{{ resource_group }}" + name: testvm001 + address_prefixes: "10.10.0.0/16" + +- name: Add subnet + azure_rm_subnet: + resource_group: "{{ resource_group }}" + name: testvm001 + address_prefix: "10.10.0.0/24" + virtual_network: testvm001 + +- name: Create public ip + azure_rm_publicipaddress: + resource_group: "{{ resource_group }}" + allocation_method: Static + name: testvm001 + +- name: Create security group + azure_rm_securitygroup: + resource_group: "{{ resource_group }}" + name: testvm001 + +- name: Create NIC + azure_rm_networkinterface: + resource_group: "{{ resource_group }}" + name: testvm001 + virtual_network: testvm001 + subnet: testvm001 + public_ip_name: testvm001 + security_group: testvm001 + +- name: Create virtual machine + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + vm_size: Standard_D1 + storage_account: testingstorageacct001 + storage_container: testvm001 + storage_blob: testvm001.vhd + admin_username: adminuser + admin_password: Password123! + short_hostname: testvm + os_type: Linux + network_interfaces: testvm001 + image: "{{ image }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Restart the virtual machine + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + restarted: yes + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - "azure_vm.powerstate in ['starting', 'running']" + - output.changed + +- name: Deallocate the virtual machine + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + allocated: no + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - azure_vm.powerstate == 'deallocated' + - output.changed + +- name: Start the virtual machine + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - "azure_vm.powerstate in ['starting', 'running']" + - output.changed + +- name: Should be idempotent + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + vm_size: Standard_D1 + storage_account: testingstorageacct001 + storage_container: testvm001 + storage_blob: testvm001.vhd + admin_username: adminuser + admin_password: Password123! + short_hostname: testvm + os_type: Linux + network_interfaces: testvm001 + image: "{{ image }}" + register: output + +- assert: + that: not output.changed + +- name: Delete VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm002 + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- name: NIC should be gone + azure_rm_networkinterface_facts: + resource_group: "{{ resource_group }}" + name: testvm001 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_networkinterfaces | length == 0 + +- name: PIP should be gone + azure_rm_publicipaddress_facts: + resource_group: "{{ resource_group }}" + name: testvm001 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_publicipaddresses | length == 0 diff --git a/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine_with_defaults.yml b/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine_with_defaults.yml new file mode 100644 index 00000000000..9d26caf0790 --- /dev/null +++ b/test/integration/roles/azure_rm_virtualmachine/tasks/virtualmachine_with_defaults.yml @@ -0,0 +1,120 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: "{{ location }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Remove VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm10 + state: absent + register: output + when: remove_vm + +- debug: var=output + when: playbook_debug + +- name: Remove VM + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm20 + state: absent + register: output + when: remove_vm + +- debug: var=output + when: playbook_debug + +- name: Create VM with defaults + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm10 + vm_size: Standard_D1 + admin_username: chouseknecht + admin_password: Password123 + short_hostname: test10 + os_type: Linux + open_ports: + - "22-23" + image: "{{ image }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Add host + add_host: + groups: just_created + hostname: testvm10 + ansible_host: "{{ azure_vm.properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties.publicIPAddress.properties.ipAddress }}" + ansible_user: chouseknecht + ansible_ssh_pass: Password123 + +- name: Create VM accessible via ssh keys only + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm20 + short_hostname: testvm20 + ssh_password_enabled: false + ssh_public_keys: "{{ ssh_keys }}" + vm_size: Standard_D1 + admin_username: chouseknecht + image: "{{ image }}" + register: output + +- debug: var=output + when: playbook_debug + +- name: Should be idempotent + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm20 + short_hostname: testvm20 + ssh_password_enabled: false + ssh_public_keys: "{{ ssh_keys }}" + vm_size: Standard_D1 + admin_username: chouseknecht + image: "{{ image }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Add host + add_host: + groups: just_created + hostname: testvm20 + ansible_ssh_host: "{{ azure_vm.properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties.publicIPAddress.properties.ipAddress }}" + ansible_ssh_user: chouseknecht + +- name: Power Off + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm10 + started: no + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "azure_vm.powerstate not in ['starting', 'running']" + +- name: Power On + azure_rm_virtualmachine: + resource_group: "{{ resource_group }}" + name: testvm10 + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "azure_vm.powerstate in ['starting', 'running']" diff --git a/test/integration/roles/azure_rm_virtualmachineimage_facts/tasks/main.yml b/test/integration/roles/azure_rm_virtualmachineimage_facts/tasks/main.yml new file mode 100644 index 00000000000..ab326074ae6 --- /dev/null +++ b/test/integration/roles/azure_rm_virtualmachineimage_facts/tasks/main.yml @@ -0,0 +1,52 @@ +- name: Get facts for a specific image + azure_rm_virtualmachineimage_facts: + location: "{{ location }}" + publisher: OpenLogic + offer: CentOS + sku: '7.1' + version: '7.1.20150731' + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_vmimages | length == 1 + +- name: List available versions + azure_rm_virtualmachineimage_facts: + location: "{{ location }}" + publisher: OpenLogic + offer: CentOS + sku: '7.1' + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_vmimages | length > 0 + +- name: List available offers + azure_rm_virtualmachineimage_facts: + location: "{{ location }}" + publisher: OpenLogic + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_vmimages | length > 0 + + +- name: List available publishers + azure_rm_virtualmachineimage_facts: + location: "{{ location }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: azure_vmimages | length > 0 diff --git a/test/integration/roles/azure_rm_virtualnetwork/tasks/main.yml b/test/integration/roles/azure_rm_virtualnetwork/tasks/main.yml new file mode 100644 index 00000000000..a401b522ce7 --- /dev/null +++ b/test/integration/roles/azure_rm_virtualnetwork/tasks/main.yml @@ -0,0 +1,196 @@ +- name: Create resource group + azure_rm_resourcegroup: + name: "{{ resource_group }}" + location: westus + register: output + +- debug: var=output + when: playbook_debug + +- name: Delete virtual network, if it exists + azure_rm_virtualnetwork: + name: my_test_network + resource_group: "{{ resource_group }}" + state: absent + register: output + +- debug: var=output + when: playbook_debug + +- name: Create virtual network + azure_rm_virtualnetwork: + name: my_test_network + address_prefixes_cidr: + - 10.1.0.0/16 + - 172.100.0.0/16 + dns_servers: + - 127.0.0.1 + - 127.0.0.3 + tags: + testing: testing + delete: on-exit + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - "output.state.address_prefixes | length == 2" + - "output.state.dns_servers | length == 2" + - "output.state.tags.delete == 'on-exit'" + - "output.state.tags | length == 2" + +- name: Gather facts by name, tags + azure_rm_virtualnetwork_facts: + resource_group: "{{ resource_group }}" + name: my_test_network + tags: + - testing + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "azure_virtualnetworks | length == 1" + +- name: Gather facts by resource group, tags + azure_rm_virtualnetwork_facts: + resource_group: "{{ resource_group }}" + tags: + - testing + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "azure_virtualnetworks | length == 1" + +- name: Gather facts by tags + azure_rm_virtualnetwork_facts: + tags: + - testing + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: "azure_virtualnetworks | length >= 1" + +- name: Should be idempotent + azure_rm_virtualnetwork: + name: my_test_network + address_prefixes_cidr: + - 10.1.0.0/16 + - 172.100.0.0/16 + dns_servers: + - 127.0.0.1 + - 127.0.0.3 + tags: + testing: testing + delete: on-exit + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: not output.changed + +- name: Update tags + azure_rm_virtualnetwork: + name: my_test_network + tags: + testing: 'no' + delete: never + foo: bar + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: output.state.tags | length == 3 + +- name: Purge tags + azure_rm_virtualnetwork: + name: my_test_network + tags: + testing: 'always' + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.tags | length == 1 + - output.state.tags.testing == 'always' + +- name: Should require address_prefixes_cidr when purge_address_prefixes + azure_rm_virtualnetwork: + name: my_test_network + purge_address_prefixes: true + resource_group: "{{ resource_group }}" + register: output + ignore_errors: yes + +- debug: var=output + when: playbook_debug + +- assert: + that: output.failed + +- name: Purge address prefixes + azure_rm_virtualnetwork: + name: my_test_network + address_prefixes_cidr: 10.1.0.0/16 + purge_address_prefixes: true + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: + - output.state.address_prefixes | length == 1 + - output.state.address_prefixes[0] == '10.1.0.0/16' + - output.state.dns_servers | length == 2 + - output.state.dns_servers[0] == '127.0.0.1' + +- name: Purge DNS servers + azure_rm_virtualnetwork: + name: my_test_network + purge_dns_servers: true + resource_group: "{{ resource_group }}" + register: output + +- debug: var=output + when: playbook_debug + +- assert: + that: output.state['dns_servers'] is undefined + +- name: Gather facts + azure_rm_virtualnetwork_facts: + resource_group: "{{ resource_group }}" + name: my_test_network + register: output + +- assert: + that: "azure_virtualnetworks | length == 1" + +- name: Delete virtual network + azure_rm_virtualnetwork: + name: my_test_network + resource_group: "{{ resource_group }}" + state: absent + register: output