15 Commits
1.3.0 ... 1.4.0

Author SHA1 Message Date
Sagi Shnaidman
47382d52ed Release 1.4.0 version
Change-Id: I64652090e65de8450ca907a57e23e09e562c17da
2021-04-08 20:03:26 +03:00
Polina Gubina
0e2058988e Container module for management Swift containers
Change-Id: I13161b360addac2d2c1c507145b5be653d6dec17
2021-04-08 18:46:53 +03:00
Zuul
ab1a2a19d7 Merge "Prepare for Ansible 2.11 tests" 2021-04-08 10:49:56 +00:00
Sagi Shnaidman
17a1d72b1c Prepare for Ansible 2.11 tests
Change-Id: I3914db6e5c4f279f2aeae051fd6a1a4254f554c9
2021-04-08 00:19:24 +03:00
Zuul
58ec1030a4 Merge "Add execution environment metadata" 2021-04-07 19:26:45 +00:00
AlanCoding
da01746e53 Add execution environment metadata
Change-Id: Ic68fe6fd43aae12f944ad17f747f6bf37bf4d324
2021-04-07 14:41:19 +00:00
Sagi Shnaidman
c329f65b41 Fix issues with newest ansible-test 2.11
Change-Id: Ifdf253ca01b0e19b55867d8ead03eaceb5b2d73a
2021-04-07 14:47:00 +03:00
Sagi Shnaidman
18b03e1971 Fix CI for latest ansible-test with no_log
Add no_log for requires arguments, hide admin_password for server
actions.
Disable voting for stein, rocky, queens jobs as they are broken
atm in devstack part.
Change-Id: Ib408749bedb583b065f82237a223388a7d919640
2021-04-05 22:24:31 +03:00
Vladimir Ermakov
16a81fc221 security_group_rule: add support ipv6-icmp
Adds ipv6-icmp protocol to _ports_match check to be able to make that
rules for IPv6.

Story: 2008687
Task: 41989
Change-Id: Ib6313788132bb601d7d53ac709b7c822ee533a8b
2021-03-04 13:06:57 +03:00
Maxim Babushkin
50deae71f4 Add binding profile to port module
Neutron port is able to configure binding profile during creation.
Add support of the binding profile to module

Change-Id: I7a36fb05065cbd559cd7a00842070f97e7afbc13
2021-03-01 14:16:51 +02:00
Zuul
b1e5ca91cf Merge "add option to exclude legacy groups" 2021-02-22 13:31:48 +00:00
Shnaidman Sagi (Sergey)
185d0a5eca Revert "Mark 2.9 ansible-test sanity as non-voting"
This reverts commit 1d8605fbf7.

Reason for revert: fixed in Ansible: https://github.com/ansible/ansible/pull/73618

Change-Id: I6eca78cca86c57e166f45c2d5cbd79e8b5891857
2021-02-21 11:02:23 +00:00
Sagi Shnaidman
2b8aa2cb08 Add Octavia job for testing Load Balancer
Add basic test for LB.
Configure Octavia job which will run on LB changes only.
Change-Id: Ic76bb766f133c91a41893978ee864025dd659ab4
2021-02-20 17:57:20 +02:00
willtome
3c8fbc6b27 add option to exclude legacy groups
Change-Id: I73835b111b1bdfc0d8dd6409d516ad1cb84c658a
2021-02-18 12:03:09 +00:00
Sagi Shnaidman
d212be018b Bump dev version in galaxy.yml
Change-Id: Iac46e2290d5b10e39f4d480d69ff1284f535c2e9
2021-02-16 21:41:48 +02:00
36 changed files with 589 additions and 107 deletions

View File

@@ -19,6 +19,42 @@
devstack_services:
designate: true
- job:
name: ansible-collections-openstack-functional-devstack-octavia
parent: ansible-collections-openstack-functional-devstack
description: |
Run openstack collections functional tests against a master devstack
with Octavia plugin enabled, using releases of openstacksdk and latest
ansible release. Run it only on Load Balancer changes.
pre-run: ci/playbooks/get_amphora_tarball.yaml
required-projects:
- openstack/octavia
- name: github.com/ansible/ansible
override-checkout: stable-2.11
files:
- ^ci/roles/loadbalancer/.*$
- ^plugins/modules/lb_health_monitor.py
- ^plugins/modules/lb_listener.py
- ^plugins/modules/lb_member.py
- ^plugins/modules/lb_pool.py
- ^plugins/modules/loadbalancer.py
vars:
tox_envlist: ansible
devstack_plugins:
designate: https://opendev.org/openstack/designate
octavia: https://opendev.org/openstack/octavia
devstack_services:
designate: true
octavia: true
o-api: true
o-cw: true
o-hk: true
o-hm: true
devstack_localrc:
OCTAVIA_AMP_IMAGE_FILE: "/tmp/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2"
OCTAVIA_AMP_IMAGE_SIZE: 3
OCTAVIA_AMP_IMAGE_NAME: "test-only-amphora-x64-haproxy-ubuntu-bionic"
- job:
name: ansible-collections-openstack-functional-devstack-releases
parent: ansible-collections-openstack-functional-devstack
@@ -43,14 +79,14 @@
tox_envlist: ansible-2.9
- job:
name: ansible-collections-openstack-functional-devstack-ansible-2.10
name: ansible-collections-openstack-functional-devstack-ansible-2.11
parent: ansible-collections-openstack-functional-devstack
description: |
Run openstack collections functional tests against a master devstack
using master of openstacksdk and stable 2.10 branch of ansible
using master of openstacksdk and stable 2.11 branch of ansible
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
vars:
tox_envlist: ansible
@@ -80,16 +116,16 @@
# Stable branches tests
- job:
name: ansible-collections-openstack-functional-devstack-victoria-ansible-2.10
name: ansible-collections-openstack-functional-devstack-victoria-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a victoria devstack
using victoria brach of openstacksdk and stable 2.10 branch of ansible
using victoria brach of openstacksdk and stable 2.11 branch of ansible
voting: true
override-checkout: stable/victoria
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
override-checkout: stable/victoria
vars:
@@ -97,16 +133,16 @@
- job:
name: ansible-collections-openstack-functional-devstack-ussuri-ansible-2.10
name: ansible-collections-openstack-functional-devstack-ussuri-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a ussuri devstack
using ussuri brach of openstacksdk and stable 2.10 branch of ansible
using ussuri brach of openstacksdk and stable 2.11 branch of ansible
voting: true
override-checkout: stable/ussuri
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
override-checkout: stable/ussuri
- name: openstack/os-client-config
@@ -115,16 +151,16 @@
tox_envlist: ansible
- job:
name: ansible-collections-openstack-functional-devstack-train-ansible-2.10
name: ansible-collections-openstack-functional-devstack-train-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a train devstack
using train brach of openstacksdk and stable 2.10 branch of ansible
using train brach of openstacksdk and stable 2.11 branch of ansible
voting: false
override-checkout: stable/train
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
override-checkout: stable/train
- name: openstack/os-client-config
@@ -133,16 +169,16 @@
tox_envlist: ansible
- job:
name: ansible-collections-openstack-functional-devstack-stein-ansible-2.10
name: ansible-collections-openstack-functional-devstack-stein-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a stein devstack
using stein brach of openstacksdk and stable 2.10 branch of ansible
using stein brach of openstacksdk and stable 2.11 branch of ansible
voting: true
override-checkout: stable/stein
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
override-checkout: stable/stein
- name: openstack/os-client-config
@@ -151,16 +187,16 @@
tox_envlist: ansible
- job:
name: ansible-collections-openstack-functional-devstack-rocky-ansible-2.10
name: ansible-collections-openstack-functional-devstack-rocky-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a rocky devstack
using rocky brach of openstacksdk and stable 2.10 branch of ansible
using rocky brach of openstacksdk and stable 2.11 branch of ansible
voting: true
override-checkout: stable/rocky
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
override-checkout: stable/rocky
- name: openstack/os-client-config
@@ -172,16 +208,16 @@
tox_envlist: ansible
- job:
name: ansible-collections-openstack-functional-devstack-queens-ansible-2.10
name: ansible-collections-openstack-functional-devstack-queens-ansible-2.11
parent: ansible-collections-openstack-functional-devstack-ansible-devel
description: |
Run openstack collections functional tests against a queens devstack
using master branch of openstacksdk and stable 2.10 branch of ansible
using master branch of openstacksdk and stable 2.11 branch of ansible
voting: true
override-checkout: stable/queens
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- name: openstack/openstacksdk
# Run queens with highest possible py2 version of SDK
override-checkout: stable/train
@@ -222,15 +258,15 @@
tox_envlist: linters-2.11
- job:
name: openstack-tox-linters-ansible-2.10
name: openstack-tox-linters-ansible-2.11
parent: openstack-tox-linters
nodeset: ubuntu-bionic
description: |
Run openstack collections linter tests using the 2.10 branch of ansible
Run openstack collections linter tests using the 2.11 branch of ansible
voting: true
required-projects:
- name: github.com/ansible/ansible
override-checkout: stable-2.10
override-checkout: stable-2.11
- job:
name: openstack-tox-linters-ansible-2.9
@@ -263,15 +299,13 @@
jobs:
- tox-pep8
- openstack-tox-linters-ansible-devel
- openstack-tox-linters-ansible-2.10
# Issue with ansible-test 2.9: https://github.com/ansible/ansible/pull/73530
- openstack-tox-linters-ansible-2.9:
voting: false
- openstack-tox-linters-ansible-2.11
- openstack-tox-linters-ansible-2.9
- ansible-collections-openstack-functional-devstack:
dependencies: &deps_unit_lint
- tox-pep8
# - openstack-tox-linters-ansible-2.9
- openstack-tox-linters-ansible-2.10
- openstack-tox-linters-ansible-2.9
- openstack-tox-linters-ansible-2.11
irrelevant-files: &ignore_files
- changelogs/.*
- COPYING
@@ -288,7 +322,7 @@
- ansible-collections-openstack-functional-devstack-ansible-2.9:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-ansible-2.10:
- ansible-collections-openstack-functional-devstack-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-ansible-devel:
@@ -297,22 +331,29 @@
- ansible-collections-openstack-functional-devstack-ansible-pip:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.10:
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.10:
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-train-ansible-2.10:
- ansible-collections-openstack-functional-devstack-train-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-stein-ansible-2.10:
voting: false
- ansible-collections-openstack-functional-devstack-stein-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-rocky-ansible-2.10:
voting: false
- ansible-collections-openstack-functional-devstack-rocky-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
- ansible-collections-openstack-functional-devstack-queens-ansible-2.10:
voting: false
- ansible-collections-openstack-functional-devstack-queens-ansible-2.11:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
voting: false
- ansible-collections-openstack-functional-devstack-octavia:
dependencies: *deps_unit_lint
irrelevant-files: *ignore_files
@@ -328,38 +369,39 @@
gate:
jobs:
- tox-pep8
- openstack-tox-linters-ansible-2.10
# https://github.com/ansible/ansible/pull/73530
# - openstack-tox-linters-ansible-2.9
- ansible-collections-openstack-functional-devstack
- ansible-collections-openstack-functional-devstack-releases
- ansible-collections-openstack-functional-devstack-ansible-2.9
- ansible-collections-openstack-functional-devstack-ansible-2.10
- ansible-collections-openstack-functional-devstack-ansible-pip
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.10
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.10
# - ansible-collections-openstack-functional-devstack-train-ansible-2.10
- ansible-collections-openstack-functional-devstack-stein-ansible-2.10
- ansible-collections-openstack-functional-devstack-rocky-ansible-2.10
- ansible-collections-openstack-functional-devstack-queens-ansible-2.10
periodic:
jobs:
- openstack-tox-linters-ansible-devel
- openstack-tox-linters-ansible-2.10
- openstack-tox-linters-ansible-2.11
- openstack-tox-linters-ansible-2.9
- ansible-collections-openstack-functional-devstack
- ansible-collections-openstack-functional-devstack-releases
- ansible-collections-openstack-functional-devstack-ansible-2.9
- ansible-collections-openstack-functional-devstack-ansible-2.10
- ansible-collections-openstack-functional-devstack-ansible-2.11
- ansible-collections-openstack-functional-devstack-ansible-pip
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.11
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.11
# - ansible-collections-openstack-functional-devstack-train-ansible-2.11
# - ansible-collections-openstack-functional-devstack-stein-ansible-2.11
# - ansible-collections-openstack-functional-devstack-rocky-ansible-2.11
# - ansible-collections-openstack-functional-devstack-queens-ansible-2.11
- ansible-collections-openstack-functional-devstack-octavia
periodic:
jobs:
- openstack-tox-linters-ansible-devel
- openstack-tox-linters-ansible-2.11
- openstack-tox-linters-ansible-2.9
- ansible-collections-openstack-functional-devstack
- ansible-collections-openstack-functional-devstack-releases
- ansible-collections-openstack-functional-devstack-ansible-2.9
- ansible-collections-openstack-functional-devstack-ansible-2.11
- ansible-collections-openstack-functional-devstack-ansible-devel
- ansible-collections-openstack-functional-devstack-ansible-pip
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.10
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.10
- ansible-collections-openstack-functional-devstack-train-ansible-2.10
- ansible-collections-openstack-functional-devstack-stein-ansible-2.10
- ansible-collections-openstack-functional-devstack-rocky-ansible-2.10
- ansible-collections-openstack-functional-devstack-queens-ansible-2.10
- ansible-collections-openstack-functional-devstack-victoria-ansible-2.11
- ansible-collections-openstack-functional-devstack-ussuri-ansible-2.11
- ansible-collections-openstack-functional-devstack-train-ansible-2.11
- ansible-collections-openstack-functional-devstack-stein-ansible-2.11
- ansible-collections-openstack-functional-devstack-rocky-ansible-2.11
- ansible-collections-openstack-functional-devstack-queens-ansible-2.11
- ansible-collections-openstack-functional-devstack-queens-ansible-devel
- bifrost-collections-src
- bifrost-keystone-collections-src
- ansible-collections-openstack-functional-devstack-octavia

View File

@@ -5,6 +5,31 @@ Openstack Cloud Ansilbe modules Release Notes
.. contents:: Topics
v1.4.0
======
Release Summary
---------------
New object_container module and bugfixes.
Bugfixes
--------
- Add Octavia job for testing Load Balancer
- Add binding profile to port module
- Add execution environment metadata
- Fix CI for latest ansible-test with no_log
- Fix issues with newest ansible-test 2.11
- Prepare for Ansible 2.11 tests
- add option to exclude legacy groups
- security_group_rule add support ipv6-icmp
New Modules
-----------
- openstack.cloud.object_container - Manage Swift container
v1.3.0
======

View File

@@ -149,3 +149,20 @@ releases:
name: stack_info
namespace: ''
release_date: '2021-02-16'
1.4.0:
changes:
bugfixes:
- Add Octavia job for testing Load Balancer
- Add binding profile to port module
- Add execution environment metadata
- Fix CI for latest ansible-test with no_log
- Fix issues with newest ansible-test 2.11
- Prepare for Ansible 2.11 tests
- add option to exclude legacy groups
- security_group_rule add support ipv6-icmp
release_summary: New object_container module and bugfixes.
modules:
- description: Manage Swift container
name: object_container
namespace: ''
release_date: '2021-04-08'

View File

@@ -0,0 +1,6 @@
- hosts: all
tasks:
- name: Download amphora tarball
get_url:
url: "https://tarballs.openstack.org/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2"
dest: /tmp/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2

View File

@@ -0,0 +1,3 @@
network_name: network_lb
subnet_name: subnet_lb
lb_name: test_lb

View File

@@ -0,0 +1,50 @@
---
- name: Create network {{ network_name }} for LB
openstack.cloud.network:
cloud: "{{ cloud }}"
name: "{{ network_name }}"
state: present
- name: Create subnet {{ subnet_name }} on network {{ network_name }} for LB
openstack.cloud.subnet:
cloud: "{{ cloud }}"
network_name: "{{ network_name }}"
name: "{{ subnet_name }}"
state: present
enable_dhcp: true
dns_nameservers:
- 8.8.8.7
- 8.8.8.8
cidr: 192.168.0.0/24
gateway_ip: 192.168.0.1
allocation_pool_start: 192.168.0.2
allocation_pool_end: 192.168.0.254
- name: Create loadbalancer - generic
openstack.cloud.loadbalancer:
cloud: "{{ cloud }}"
state: present
name: "{{ lb_name }}"
vip_subnet: "{{ subnet_name }}"
timeout: 450
- name: Delete loadbalancer
openstack.cloud.loadbalancer:
cloud: "{{ cloud }}"
state: absent
name: "{{ lb_name }}"
timeout: 150
- name: Delete subnet {{ subnet_name }} on network {{ network_name }}
openstack.cloud.subnet:
cloud: "{{ cloud }}"
network_name: "{{ network_name }}"
name: "{{ subnet_name }}"
state: absent
- name: Delete network {{ network_name }} of LB
openstack.cloud.network:
cloud: "{{ cloud }}"
name: "{{ network_name }}"
state: absent

View File

@@ -0,0 +1 @@
container_name: "test-container"

View File

@@ -0,0 +1,60 @@
---
- module_defaults:
openstack.cloud.object_container:
cloud: "{{ cloud }}"
block:
- name: Create an empty container
openstack.cloud.object_container:
container: "{{ container_name }}"
register: container
- name: Verify container was created
assert:
that:
- container is success
- container is changed
- container.container.name == container_name
- name: Set metadata for a container
openstack.cloud.object_container:
container: "{{ container_name }}"
metadata: "Cache-Control='no-cache'"
register: set_meta
- name: Verify container metadata was set
assert:
that:
- set_meta is success
- set_meta is changed
- name: Delete some keys from container metadata
openstack.cloud.object_container:
container: "{{ container_name }}"
keys:
- Cache-Control
register: delete_meta
- name: Verify some keys from container metadata was deleted
assert:
that:
- delete_meta is success
- delete_meta is changed
- name: Delete container
openstack.cloud.object_container:
container: "{{ container_name }}"
state: absent
register: deleted
- name: Verify container was deleted
assert:
that:
- deleted is success
- deleted is changed
always:
- name: Delete container
openstack.cloud.object_container:
container: "{{ container_name }}"
state: absent
ignore_errors: yes

View File

@@ -4,3 +4,6 @@ subnet_name: ansible_port_subnet
port_name: ansible_port
secgroup_name: ansible_port_secgroup
no_security_groups: True
binding_profile:
"pci_slot": "0000:03:11.1"
"physical_network": "provider"

View File

@@ -88,6 +88,30 @@
state: absent
name: "{{ secgroup_name }}"
- name: Test port binding config (runs from train release sdk > 0.28)
block:
- name: Create port (with binding profile)
openstack.cloud.port:
cloud: "{{ cloud }}"
state: present
name: "{{ port_name }}"
network: "{{ network_name }}"
binding_profile: "{{ binding_profile }}"
register: port
- name: Assert binding:profile exists in created port
assert:
that: "port.port['binding:profile']"
- debug: var=port
- name: Delete port (with binding profile)
openstack.cloud.port:
cloud: "{{ cloud }}"
state: absent
name: "{{ port_name }}"
when: sdk_version is version(0.28, '>')
- name: Delete subnet
openstack.cloud.subnet:
cloud: "{{ cloud }}"

View File

@@ -106,6 +106,27 @@ then
exit 1
fi
# In case of Octavia enabled:
_octavia_image_path="/tmp/test-only-amphora-x64-haproxy-ubuntu-bionic.qcow2"
if systemctl list-units --full -all | grep -Fq "devstack@o-api.service" && \
test -f "$_octavia_image_path"
then
# Upload apmhora image for Octavia to test load balancers
OCTAVIA_AMP_IMAGE_FILE=${OCTAVIA_AMP_IMAGE_FILE:-"$_octavia_image_path"}
OCTAVIA_AMP_IMAGE_NAME=${OCTAVIA_AMP_IMAGE_NAME:-"test-only-amphora-x64-haproxy-ubuntu-bionic"}
OCTAVIA_AMP_IMAGE_SIZE=${OCTAVIA_AMP_IMAGE_SIZE:-3}
openstack --os-cloud=${CLOUD} image create \
--container-format bare \
--disk-format qcow2 \
--private \
--file $OCTAVIA_AMP_IMAGE_FILE \
--project service $OCTAVIA_AMP_IMAGE_NAME
openstack --os-cloud=${CLOUD} image set --tag amphora $OCTAVIA_AMP_IMAGE_NAME
# End of Octavia preparement
else
tag_opt="$tag_opt --skip-tags loadbalancer"
fi
# Discover openstackSDK version
SDK_VER=$(python -c "import openstack; print(openstack.version.__version__)")
pushd ci/

View File

@@ -6,6 +6,9 @@
roles:
- { role: auth, tags: auth }
- { role: client_config, tags: client_config }
- role: object_container
tags: object_container
when: sdk_version is version(0.18, '>=')
- { role: group, tags: group }
- role: dns
tags: dns
@@ -42,3 +45,5 @@
- role: orchestration
tags: orchestrate
when: sdk_version is version("0.53.0", '>=')
- role: loadbalancer
tags: loadbalancer

View File

@@ -33,4 +33,4 @@ build_ignore:
- ansible_collections_openstack.egg-info
- contrib
- changelogs
version: 1.3.0
version: 1.4.0

View File

@@ -66,6 +66,7 @@ action_groups:
- network
- networks_info
- object
- object_container
- port
- port_info
- project
@@ -163,6 +164,7 @@ action_groups:
- network
- networks_info
- object
- object_container
- port
- port_info
- project

View File

@@ -98,6 +98,10 @@ options:
description: Add hosts to group based on Jinja2 conditionals.
type: dictionary
default: {}
legacy_groups:
description: Automatically create groups from host variables.
type: bool
default: true
extends_documentation_fragment:
- inventory_cache
@@ -361,8 +365,9 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
openstack=server)
self.inventory.add_host(current_host)
for group in self._get_groups_from_server(server, namegroup=namegroup):
groups[group].append(current_host)
if self.get_option('legacy_groups'):
for group in self._get_groups_from_server(server, namegroup=namegroup):
groups[group].append(current_host)
def verify_file(self, path):

View File

@@ -290,7 +290,7 @@ class OpenStackModule:
"The '%s' module has been renamed to '%s' in openstack "
"collection: openstack.cloud.%s" % (
self.module_name, new_module_name, new_module_name),
version='2.10')
version='2.0.0', collection_name='openstack.cloud')
def openstack_cloud_from_module(self):
"""Sets up connection to cloud using provided options. Checks if all

View File

@@ -242,7 +242,8 @@ def _parse_driver_info(sdk, module):
info.update(info.pop(deprecated))
module.deprecate("Suboption %s of the driver_info parameter of "
"'openstack.cloud.baremetal_node' is deprecated"
% deprecated, version='2.0.0')
% deprecated, version='2.0.0',
collection_name='openstack.cloud')
return info

View File

@@ -230,7 +230,7 @@ def main():
discovery_url=dict(default=None),
docker_volume_size=dict(type='int'),
flavor_id=dict(default=None),
keypair=dict(default=None),
keypair=dict(default=None, no_log=False),
labels=dict(default=None, type='raw'),
master_count=dict(type='int', default=1),
master_flavor_id=dict(default=None),

View File

@@ -184,7 +184,8 @@ def main():
is_old_facts = module._name == 'openstack.cloud.compute_flavor_facts'
if is_old_facts:
module.deprecate("The 'openstack.cloud.compute_flavor_facts' module has been renamed to 'openstack.cloud.compute_flavor_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
"and the renamed one no longer returns ansible_facts", version='2.0.0',
collection_name='openstack.cloud')
name = module.params['name']
vcpus = module.params['vcpus']

View File

@@ -0,0 +1 @@
object_container.py

View File

@@ -102,7 +102,8 @@ def main():
is_old_facts = module._name == 'openstack.cloud.identity_domain_facts'
if is_old_facts:
module.deprecate("The 'openstack.cloud.identity_domain_facts' module has been renamed to 'openstack.cloud.identity_domain_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
"and the renamed one no longer returns ansible_facts", version='2.0.0',
collection_name='openstack.cloud')
sdk, opcloud = openstack_cloud_from_module(module)
try:

View File

@@ -126,7 +126,8 @@ def main():
is_old_facts = module._name == 'openstack.cloud.identity_user_facts'
if is_old_facts:
module.deprecate("The 'openstack.cloud.identity_user_facts' module has been renamed to 'openstack.cloud.identity_user_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
"and the renamed one no longer returns ansible_facts", version='2.0.0',
collection_name='openstack.cloud')
sdk, opcloud = openstack_cloud_from_module(module)
try:

View File

@@ -0,0 +1,207 @@
#!/usr/bin/python
# coding: utf-8 -*-
#
# Copyright (c) 2021 by Open Telekom Cloud, operated by T-Systems International GmbH
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
DOCUMENTATION = '''
---
module: object_container
short_description: Manage Swift container.
author: OpenStack Ansible SIG
description:
- Manage Swift container.
options:
container:
description: Name of a container in Swift.
type: str
required: true
metadata:
description:
- Key/value pairs to be set as metadata on the container.
- If a container doesn't exist, it will be created.
- Both custom and system metadata can be set.
- Custom metadata are keys and values defined by the user.
- The system metadata keys are content_type, content_encoding, content_disposition, delete_after,\
delete_at, is_content_type_detected
type: dict
required: false
keys:
description: Keys from 'metadata' to be deleted.
type: list
elements: str
required: false
delete_with_all_objects:
description:
- Whether the container should be deleted with all objects or not.
- Without this parameter set to "true", an attempt to delete a container that contains objects will fail.
type: bool
default: False
required: false
state:
description: Whether resource should be present or absent.
default: 'present'
choices: ['present', 'absent']
type: str
requirements:
- "python >= 3.6"
- "openstacksdk"
extends_documentation_fragment:
- openstack.cloud.openstack
'''
RETURN = '''
container:
description: Specifies the container.
returned: On success when C(state=present)
type: dict
sample:
{
"bytes": 5449,
"bytes_used": 5449,
"content_type": null,
"count": 1,
"id": "otc",
"if_none_match": null,
"is_content_type_detected": null,
"is_newest": null,
"meta_temp_url_key": null,
"meta_temp_url_key_2": null,
"name": "otc",
"object_count": 1,
"read_ACL": null,
"sync_key": null,
"sync_to": null,
"timestamp": null,
"versions_location": null,
"write_ACL": null
}
'''
EXAMPLES = '''
# Create empty container
- openstack.cloud.object_container:
container: "new-container"
state: present
# Set metadata for container
- openstack.cloud.object_container:
container: "new-container"
metadata: "Cache-Control='no-cache'"
# Delete some keys from metadata of a container
- openstack.cloud.object_container:
container: "new-container"
keys:
- content_type
# Delete container
- openstack.cloud.object_container:
container: "new-container"
state: absent
# Delete container and its objects
- openstack.cloud.object_container:
container: "new-container"
delete_with_all_objects: true
state: absent
'''
from ansible_collections.openstack.cloud.plugins.module_utils.openstack import OpenStackModule
class ContainerModule(OpenStackModule):
argument_spec = dict(
container=dict(type='str', required=True),
metadata=dict(type='dict', required=False),
keys=dict(type='list', required=False, elements='str', no_log=False),
state=dict(type='str', required=False, default='present', choices=['present', 'absent']),
delete_with_all_objects=dict(type='bool', default=False, required=False)
)
def create(self, container):
data = {}
if self._container_exist(container):
self.exit_json(changed=False)
container_data = self.conn.object_store.create_container(name=container).to_dict()
container_data.pop('location')
data['container'] = container_data
self.exit_json(changed=True, **data)
def delete(self, container):
delete_with_all_objects = self.params['delete_with_all_objects']
changed = False
if self._container_exist(container):
objects = []
for raw in self.conn.object_store.objects(container):
dt = raw.to_dict()
dt.pop('location')
objects.append(dt)
if len(objects) > 0:
if delete_with_all_objects:
for obj in objects:
self.conn.object_store.delete_object(container=container, obj=obj['id'])
else:
self.fail_json(msg="Container has objects")
self.conn.object_store.delete_container(container=container)
changed = True
self.exit(changed=changed)
def set_metadata(self, container, metadata):
data = {}
if not self._container_exist(container):
new_container = self.conn.object_store.create_container(name=container).to_dict()
new_container = self.conn.object_store.set_container_metadata(container, **metadata).to_dict()
new_container.pop('location')
data['container'] = new_container
self.exit(changed=True, **data)
def delete_metadata(self, container, keys):
if not self._container_exist(container):
self.fail_json(msg="Container doesn't exist")
self.conn.object_store.delete_container_metadata(container=container, keys=keys)
self.exit(changed=True)
def _container_exist(self, container):
try:
self.conn.object_store.get_container_metadata(container)
return True
except self.sdk.exceptions.ResourceNotFound:
return False
def run(self):
container = self.params['container']
state = self.params['state']
metadata = self.params['metadata']
keys = self.params['keys']
if state == 'absent':
self.delete(container)
if metadata:
self.set_metadata(container, metadata)
if keys:
self.delete_metadata(container, keys)
self.create(container)
def main():
module = ContainerModule()
module()
if __name__ == "__main__":
main()

View File

@@ -119,6 +119,10 @@ options:
description:
- Whether to enable or disable the port security on the network.
type: bool
binding_profile:
description:
- Binding profile dict that the port should be created with.
type: dict
requirements:
- "python >= 3.6"
- "openstacksdk"
@@ -199,6 +203,20 @@ EXAMPLES = '''
name: port1
network: foo
vnic_type: direct
# Create a port with binding profile
- openstack.cloud.port:
state: present
auth:
auth_url: https://identity.example.com
username: admin
password: admin
project_name: admin
name: port1
network: foo
binding_profile:
"pci_slot": "0000:03:11.1"
"physical_network": "provider"
'''
RETURN = '''
@@ -246,6 +264,10 @@ port_security_enabled:
description: Port security state on the network.
returned: success
type: bool
binding:profile:
description: Port binded profile
returned: success
type: dict
'''
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
@@ -274,7 +296,8 @@ def _needs_update(module, port, cloud):
'device_owner',
'device_id',
'binding:vnic_type',
'port_security_enabled']
'port_security_enabled',
'binding:profile']
compare_list_dict = ['allowed_address_pairs',
'extra_dhcp_opts']
compare_list = ['security_groups']
@@ -357,7 +380,8 @@ def _compose_port_args(module, cloud):
'device_owner',
'device_id',
'binding:vnic_type',
'port_security_enabled']
'port_security_enabled',
'binding:profile']
for optional_param in optional_parameters:
if module.params[optional_param] is not None:
port_kwargs[optional_param] = module.params[optional_param]
@@ -393,7 +417,8 @@ def main():
vnic_type=dict(default=None,
choices=['normal', 'direct', 'direct-physical',
'macvtap', 'baremetal', 'virtio-forwarder']),
port_security_enabled=dict(default=None, type='bool')
port_security_enabled=dict(default=None, type='bool'),
binding_profile=dict(default=None, type='dict')
)
module_kwargs = openstack_module_kwargs(
@@ -424,6 +449,9 @@ def main():
# Neutron API accept 'binding:vnic_type' as an argument
# for the port type.
module.params['binding:vnic_type'] = module.params.pop('vnic_type')
# Neutron API accept 'binding:profile' as an argument
# for the port binding profile type.
module.params['binding:profile'] = module.params.pop('binding_profile')
port = None
network_id = None

View File

@@ -195,7 +195,8 @@ def main():
is_old_facts = module._name == 'openstack.cloud.port_facts'
if is_old_facts:
module.deprecate("The 'openstack.cloud.port_facts' module has been renamed to 'openstack.cloud.port_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
"and the renamed one no longer returns ansible_facts", version='2.0.0',
collection_name='openstack.cloud')
port = module.params.get('port')
filters = module.params.get('filters')

View File

@@ -115,7 +115,8 @@ def main():
is_old_facts = module._name == 'openstack.cloud.project_facts'
if is_old_facts:
module.deprecate("The 'openstack.cloud.project_facts' module has been renamed to 'openstack.cloud.project_info', "
"and the renamed one no longer returns ansible_facts", version='2.13')
"and the renamed one no longer returns ansible_facts", version='2.0.0',
collection_name='openstack.cloud')
sdk, opcloud = openstack_cloud_from_module(module)
try:

View File

@@ -381,7 +381,7 @@ def main():
injected_files=dict(required=False, type='int', default=None),
injected_path_size=dict(required=False, type='int', default=None),
instances=dict(required=False, type='int', default=None),
key_pairs=dict(required=False, type='int', default=None),
key_pairs=dict(required=False, type='int', default=None, no_log=False),
loadbalancer=dict(required=False, type='int', default=None),
network=dict(required=False, type='int', default=None),
per_volume_gigabytes=dict(required=False, type='int', default=None),

View File

@@ -202,7 +202,7 @@ def _ports_match(protocol, module_min, module_max, rule_min, rule_max):
"""
# Check if the user is supplying -1 for ICMP.
if protocol == 'icmp':
if protocol in ['icmp', 'ipv6-icmp']:
if module_min and int(module_min) == -1:
module_min = None
if module_max and int(module_max) == -1:

View File

@@ -119,7 +119,7 @@ class ServerActionModule(OpenStackModule):
'lock', 'unlock', 'suspend', 'resume',
'rebuild', 'shelve', 'shelve_offload', 'unshelve']),
image=dict(required=False, type='str'),
admin_password=dict(required=False, type='str'),
admin_password=dict(required=False, type='str', no_log=True),
)
module_kwargs = dict(
required_if=[('action', 'rebuild', ['image'])],

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
openstacksdk>=0.13

View File

@@ -1,11 +0,0 @@
openstacksdk
ansible-base
pycodestyle
flake8
pylint
voluptuous
yamllint
rstcheck
ruamel.yaml
#galaxy-importer # see https://review.opendev.org/#/c/743054
tox

View File

@@ -1 +1 @@
test-requirements-2.10.txt
test-requirements-2.11.txt

View File

@@ -1,7 +0,0 @@
plugins/modules/baremetal_node.py pylint:ansible-deprecated-no-collection-name
plugins/modules/compute_flavor_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/identity_domain_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/identity_user_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/port_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/project_info.py pylint:ansible-deprecated-no-collection-name
plugins/module_utils/openstack.py pylint:ansible-deprecated-no-collection-name

View File

@@ -1,7 +0,0 @@
plugins/modules/baremetal_node.py pylint:ansible-deprecated-no-collection-name
plugins/modules/compute_flavor_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/identity_domain_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/identity_user_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/port_info.py pylint:ansible-deprecated-no-collection-name
plugins/modules/project_info.py pylint:ansible-deprecated-no-collection-name
plugins/module_utils/openstack.py pylint:ansible-deprecated-no-collection-name

View File

View File

@@ -35,7 +35,7 @@ commands =
deps =
pbr
ruamel.yaml
ansible-base
ansible-core
commands =
python {toxinidir}/tools/build.py