--- - module_defaults: group/openstack.cloud.openstack: cloud: "{{ cloud }}" # Listing modules individually is required for # backward compatibility with Ansible 2.9 only openstack.cloud.resource: cloud: "{{ cloud }}" openstack.cloud.resources: cloud: "{{ cloud }}" openstack.cloud.router: cloud: "{{ cloud }}" block: - name: Create external network openstack.cloud.resource: service: network type: network attributes: name: ansible_network_external is_router_external: true wait: true register: network_external - name: Assert return values of resource module assert: that: # allow new fields to be introduced but prevent fields from being removed - expected_fields|difference(network_external.keys())|length == 0 - name: Assert external network assert: that: - network_external is changed - name: Create external network again openstack.cloud.resource: service: network type: network attributes: name: ansible_network_external is_router_external: true wait: true register: network_external - name: Assert external network again assert: that: - network_external is not changed - name: Create external subnet openstack.cloud.resource: service: network type: subnet attributes: cidr: 10.6.6.0/24 ip_version: 4 name: ansible_external_subnet network_id: "{{ network_external.resource.id }}" register: subnet_external - name: Assert external subnet assert: that: - subnet_external is changed - name: Create external subnet again openstack.cloud.resource: service: network type: subnet attributes: cidr: 10.6.6.0/24 ip_version: 4 name: ansible_external_subnet network_id: "{{ network_external.resource.id }}" register: subnet_external - name: Assert external subnet again assert: that: - subnet_external is not changed - name: Create external port openstack.cloud.resource: service: network type: port attributes: name: ansible_port_external network_id: "{{ network_external.resource.id }}" fixed_ips: - ip_address: 10.6.6.50 non_updateable_attributes: - fixed_ips register: port_external - name: Assert external port assert: that: - port_external is changed - name: Create external port again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_external network_id: "{{ network_external.resource.id }}" fixed_ips: - ip_address: 10.6.6.50 non_updateable_attributes: - fixed_ips register: port_external - name: Assert external port again assert: that: - port_external is not changed - name: Create internal network openstack.cloud.resource: service: network type: network attributes: name: ansible_network_internal is_router_external: false wait: true register: network_internal - name: Assert internal network assert: that: - network_internal is changed - name: Create internal network again openstack.cloud.resource: service: network type: network attributes: name: ansible_network_internal is_router_external: false wait: true register: network_internal - name: Assert internal network again assert: that: - network_internal is not changed - name: Create internal subnet openstack.cloud.resource: service: network type: subnet attributes: cidr: 10.7.7.0/24 ip_version: 4 name: ansible_internal_subnet network_id: "{{ network_internal.resource.id }}" register: subnet_internal - name: Assert internal subnet assert: that: - subnet_internal is changed - name: Create internal subnet again openstack.cloud.resource: service: network type: subnet attributes: cidr: 10.7.7.0/24 ip_version: 4 name: ansible_internal_subnet network_id: "{{ network_internal.resource.id }}" register: subnet_internal - name: Assert internal subnet again assert: that: - subnet_internal is not changed - name: Create internal port 1 openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal1 network_id: "{{ network_internal.resource.id }}" fixed_ips: - ip_address: 10.7.7.100 subnet_id: "{{ subnet_internal.resource.id }}" register: port_internal1 - name: Assert internal port 1 assert: that: - port_internal1 is changed - name: Create internal port 1 again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal1 network_id: "{{ network_internal.resource.id }}" fixed_ips: - ip_address: 10.7.7.100 subnet_id: "{{ subnet_internal.resource.id }}" register: port_internal1 - name: Assert internal port 1 again assert: that: - port_internal1 is not changed - name: Create internal port 2 openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal2 network_id: "{{ network_internal.resource.id }}" fixed_ips: - ip_address: 10.7.7.101 subnet_id: "{{ subnet_internal.resource.id }}" register: port_internal2 - name: Assert internal port 2 assert: that: - port_internal2 is changed - name: Create internal port 2 again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal2 network_id: "{{ network_internal.resource.id }}" fixed_ips: - ip_address: 10.7.7.101 subnet_id: "{{ subnet_internal.resource.id }}" register: port_internal2 - name: Assert internal port 2 again assert: that: - port_internal2 is not changed - name: Create router openstack.cloud.resource: service: network type: router attributes: name: ansible_router external_gateway_info: enable_snat: true external_fixed_ips: - ip_address: 10.6.6.10 subnet_id: "{{ subnet_external.resource.id }}" network_id: "{{ network_external.resource.id }}" wait: true register: router - name: Assert router assert: that: - router is changed - name: Create router again openstack.cloud.resource: service: network type: router attributes: name: ansible_router external_gateway_info: enable_snat: true external_fixed_ips: - ip_address: 10.6.6.10 subnet_id: "{{ subnet_external.resource.id }}" network_id: "{{ network_external.resource.id }}" wait: true register: router - name: Assert router again assert: that: - router is not changed - name: Attach router to internal subnet openstack.cloud.router: name: ansible_router network: "{{ network_external.resource.id }}" external_fixed_ips: - ip: 10.6.6.10 subnet: "{{ subnet_external.resource.id }}" interfaces: - net: "{{ network_internal.resource.id }}" subnet: "{{ subnet_internal.resource.id }}" portip: 10.7.7.1 - name: Create floating ip address 1 openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.150 floating_ip_address: 10.6.6.150 floating_network_id: "{{ network_external.resource.id }}" register: ip1 - name: Assert floating ip address 1 assert: that: - ip1 is changed - name: Create floating ip address 1 again openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.150 floating_ip_address: 10.6.6.150 floating_network_id: "{{ network_external.resource.id }}" register: ip1 - name: Assert floating ip address 1 again assert: that: - ip1 is not changed - name: Create floating ip address 2 openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.151 floating_ip_address: 10.6.6.151 floating_network_id: "{{ network_external.resource.id }}" port_id: "{{ port_internal1.resource.id }}" register: ip2 - name: Assert floating ip address 2 assert: that: - ip2 is changed - name: Create floating ip address 2 again openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.151 floating_ip_address: 10.6.6.151 floating_network_id: "{{ network_external.resource.id }}" port_id: "{{ port_internal1.resource.id }}" register: ip2 - name: Assert floating ip address 2 again assert: that: - ip2 is not changed - name: Create floating ip address 3 openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.152 floating_ip_address: 10.6.6.152 floating_network_id: "{{ network_external.resource.id }}" fixed_ip_address: 10.7.7.101 port_id: "{{ port_internal2.resource.id }}" updateable_attributes: - fixed_ip_address - port_id register: ip3 - name: Assert floating ip address 3 assert: that: - ip3 is changed - name: Create floating ip address 3 again openstack.cloud.resource: service: network type: ip attributes: name: 10.6.6.152 floating_ip_address: 10.6.6.152 floating_network_id: "{{ network_external.resource.id }}" fixed_ip_address: 10.7.7.101 port_id: "{{ port_internal2.resource.id }}" updateable_attributes: - fixed_ip_address - port_id register: ip3 - name: Assert floating ip address 3 again assert: that: - ip3 is not changed - name: List images openstack.cloud.resources: service: image type: image register: images - name: Identify CirrOS image id set_fact: image_id: "{{ images.resources|community.general.json_query(query)|first }}" vars: query: "[?starts_with(name, 'cirros')].id" - name: List compute flavors openstack.cloud.resources: service: compute type: flavor register: flavors - name: Identify m1.tiny flavor id set_fact: flavor_id: "{{ flavors.resources|community.general.json_query(query)|first }}" vars: query: "[?name == 'm1.tiny'].id" - name: Create server openstack.cloud.resource: service: compute type: server attributes: name: ansible_server image_id: "{{ image_id }}" flavor_id: "{{ flavor_id }}" networks: - uuid: "{{ network_internal.resource.id }}" port: "{{ port_internal1.resource.id }}" - uuid: "{{ network_internal.resource.id }}" port: "{{ port_internal2.resource.id }}" non_updateable_attributes: - name - image_id - flavor_id - networks wait: true register: server - name: Assert server assert: that: - server is changed - name: Create server again openstack.cloud.resource: service: compute type: server attributes: name: ansible_server image_id: "{{ image_id }}" flavor_id: "{{ flavor_id }}" networks: - uuid: "{{ network_internal.resource.id }}" port: "{{ port_internal1.resource.id }}" - uuid: "{{ network_internal.resource.id }}" port: "{{ port_internal2.resource.id }}" non_updateable_attributes: - name - image_id - flavor_id - networks wait: true register: server - name: Assert server again assert: that: - server is not changed - name: Detach floating ip address 3 openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.152 port_id: !!null register: ip3 - name: Assert floating ip address 3 assert: that: - ip3 is changed - name: Detach floating ip address 3 again openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.152 port_id: !!null register: ip3 - name: Assert floating ip address 3 again assert: that: - ip3 is not changed - name: Delete server openstack.cloud.resource: service: compute type: server attributes: name: ansible_server state: absent wait: true register: server - name: Assert server assert: that: - server is changed - name: Delete server again openstack.cloud.resource: service: compute type: server attributes: name: ansible_server state: absent wait: true register: server - name: Assert server assert: that: - server is not changed - name: Delete floating ip address 3 openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.152 state: absent register: ip3 - name: Assert floating ip address 3 assert: that: - ip3 is changed - name: Delete floating ip address 3 again openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.152 state: absent register: ip3 - name: Assert floating ip address 3 again assert: that: - ip3 is not changed - name: Delete floating ip address 2 openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.151 state: absent register: ip2 - name: Assert floating ip address 2 assert: that: - ip2 is changed - name: Delete floating ip address 2 again openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.151 state: absent register: ip2 - name: Assert floating ip address 2 again assert: that: - ip2 is not changed - name: Delete floating ip address 1 openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.150 state: absent register: ip1 - name: Assert floating ip address 1 assert: that: - ip1 is changed - name: Delete floating ip address 1 again openstack.cloud.resource: service: network type: ip attributes: floating_ip_address: 10.6.6.150 state: absent register: ip1 - name: Assert floating ip address 1 again assert: that: - ip1 is not changed - name: Detach router from internal subnet openstack.cloud.router: name: ansible_router network: "{{ network_external.resource.id }}" external_fixed_ips: - ip: 10.6.6.10 subnet: "{{ subnet_external.resource.id }}" interfaces: [] register: router - name: Delete router openstack.cloud.resource: service: network type: router attributes: name: ansible_router state: absent wait: true register: router - name: Assert router assert: that: - router is changed - name: Delete router again openstack.cloud.resource: service: network type: router attributes: name: ansible_router state: absent wait: true register: router - name: Assert router again assert: that: - router is not changed - name: Delete internal port 2 openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal2 state: absent register: port_internal2 - name: Assert internal port 2 assert: that: - port_internal2 is changed - name: Delete internal port 2 again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal2 state: absent register: port_internal2 - name: Assert internal port 2 again assert: that: - port_internal2 is not changed - name: Delete internal port 1 openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal1 state: absent register: port_internal1 - name: Assert internal port 1 assert: that: - port_internal1 is changed - name: Delete internal port 1 again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_internal1 state: absent register: port_internal1 - name: Assert internal port 1 again assert: that: - port_internal1 is not changed - name: Delete internal subnet openstack.cloud.resource: service: network type: subnet attributes: name: ansible_internal_subnet state: absent register: subnet_internal - name: Assert internal subnet assert: that: - subnet_internal is changed - name: Delete internal subnet again openstack.cloud.resource: service: network type: subnet attributes: name: ansible_internal_subnet state: absent register: subnet_internal - name: Assert internal subnet again assert: that: - subnet_internal is not changed - name: Delete internal network openstack.cloud.resource: service: network type: network attributes: name: ansible_network_internal state: absent wait: true register: network_internal - name: Assert internal network assert: that: - network_internal is changed - name: Delete internal network again openstack.cloud.resource: service: network type: network attributes: name: ansible_network_internal state: absent wait: true register: network_internal - name: Assert internal network again assert: that: - network_internal is not changed - name: Delete external port openstack.cloud.resource: service: network type: port attributes: name: ansible_port_external state: absent register: port_external - name: Assert external port assert: that: - port_external is changed - name: Delete external port again openstack.cloud.resource: service: network type: port attributes: name: ansible_port_external state: absent register: port_external - name: Assert external port again assert: that: - port_external is not changed - name: Delete external subnet openstack.cloud.resource: service: network type: subnet attributes: name: ansible_external_subnet state: absent register: subnet_external - name: Assert external subnet assert: that: - subnet_external is changed - name: Delete external subnet again openstack.cloud.resource: service: network type: subnet attributes: name: ansible_external_subnet state: absent register: subnet_external - name: Assert external subnet again assert: that: - subnet_external is not changed - name: Delete external network openstack.cloud.resource: service: network type: network attributes: name: ansible_network_external state: absent wait: true register: network_external - name: Assert external network assert: that: - network_external is changed - name: Delete external network again openstack.cloud.resource: service: network type: network attributes: name: ansible_network_external state: absent wait: true register: network_external - name: Assert external network again assert: that: - network_external is not changed - name: Verify resource's check mode import_tasks: check_mode.yml