Added resource{,s} modules

Change-Id: I0b04d43d5095ee74ec5af27013b6159a6a4d0f13
This commit is contained in:
Jakob Meng
2023-01-11 14:09:44 +01:00
parent 778cf14f1b
commit a4a6e6d4ec
10 changed files with 1921 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
---
expected_fields:
- resource

View File

@@ -0,0 +1,194 @@
---
- 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 }}"
block:
- name: Create security group
check_mode: false
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
description: 'ansible security group'
register: security_group
- name: Assert created security group
assert:
that:
- security_group.resource.name == 'ansible_security_group'
- security_group.resource.description == 'ansible security group'
- name: Find created security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert created security group independently
assert:
that:
- security_groups.resources | length == 1
- security_groups.resources.0.name == 'ansible_security_group'
- security_groups.resources.0.description == 'ansible security group'
- name: Update security group simulation
check_mode: true
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
description: 'ansible neutron security group'
register: security_group
- name: Assert security group update simulation
assert:
that:
- security_group is changed
- security_group.resource.description == 'ansible neutron security group'
- name: Find non-updated security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert security group non-update
assert:
that:
- security_groups.resources | length == 1
- security_groups.resources.0.name == 'ansible_security_group'
- security_groups.resources.0.description == 'ansible security group'
- name: Update security group
check_mode: false
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
description: 'ansible neutron security group'
register: security_group
- name: Assert security group update
assert:
that:
- security_group is changed
- security_group.resource.description == 'ansible neutron security group'
- name: Find updated security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert security group update
assert:
that:
- security_groups.resources | length == 1
- security_groups.resources.0.name == 'ansible_security_group'
- security_groups.resources.0.description == 'ansible neutron security group'
- name: Delete security group simulation
check_mode: true
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
state: absent
register: security_group
- name: Assert security group delete simulation
assert:
that:
- security_group is changed
- "'security_group' not in security_group"
- name: Find non-deleted security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert security group non-deletion
assert:
that:
- security_groups.resources | length == 1
- security_groups.resources.0.name == 'ansible_security_group'
- security_groups.resources.0.description == 'ansible neutron security group'
- name: Delete security group
check_mode: false
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
state: absent
register: security_group
- name: Assert security group deletion
assert:
that:
- security_group is changed
- "'resource' not in security_group"
- name: Find deleted security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert security group deletion
assert:
that:
- security_groups.resources | length == 0
- name: Create security group simulation
check_mode: true
openstack.cloud.resource:
service: network
type: security_group
attributes:
name: ansible_security_group
description: 'ansible security group'
register: security_group
- name: Assert security group creation simulation
assert:
that:
- security_group is changed
- security_group.resource.name == 'ansible_security_group'
- security_group.resource.description == 'ansible security group'
- security_group.resource.keys() | sort == ['description', 'name'] | sort
- name: Find non-created security group
openstack.cloud.resources:
service: network
type: security_group
parameters:
name: ansible_security_group
register: security_groups
- name: Assert security group non-creation
assert:
that:
- security_groups.resources | length == 0

View File

@@ -0,0 +1,861 @@
---
- 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

View File

@@ -0,0 +1,3 @@
---
expected_fields:
- resources

View File

@@ -0,0 +1,53 @@
---
- module_defaults:
group/openstack.cloud.openstack:
cloud: "{{ cloud }}"
# Listing modules individually is required for
# backward compatibility with Ansible 2.9 only
openstack.cloud.resources:
cloud: "{{ cloud }}"
block:
- 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: Assert return values of resources module
assert:
that:
- images is not changed
# allow new fields to be introduced but prevent fields from being removed
- expected_fields|difference(images.keys())|length == 0
- 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: List public network
openstack.cloud.resources:
service: network
type: network
parameters:
name: public
register: networks
- name: Assert public network
assert:
that:
- networks.resources|length == 1
- networks.resources.0.name == 'public'

View File

@@ -42,6 +42,8 @@
- { role: port, tags: port }
- { role: project, tags: project }
- { role: recordset, tags: recordset }
- { role: resource, tags: resource }
- { role: resources, tags: resources }
- { role: role_assignment, tags: role_assignment }
- { role: router, tags: router }
- { role: security_group, tags: security_group }