Retire Tripleo: remove repo content
TripleO project is retiring - https://review.opendev.org/c/openstack/governance/+/905145 this commit remove the content of this project repo Change-Id: I3732addd9d6544f232885cd5d731104e9f804406
This commit is contained in:
parent
f273ccbb96
commit
fa15022851
@ -1,39 +0,0 @@
|
|||||||
exclude_paths:
|
|
||||||
- releasenotes/
|
|
||||||
- roles/fetch_validations/
|
|
||||||
parseable: true
|
|
||||||
quiet: false
|
|
||||||
rulesdir:
|
|
||||||
- .ansible-lint_rules/
|
|
||||||
|
|
||||||
# Mock modules or roles in order to pass ansible-playbook --syntax-check
|
|
||||||
mock_modules: []
|
|
||||||
mock_roles:
|
|
||||||
- fetch-devstack-log-dir
|
|
||||||
- fetch-output
|
|
||||||
- fetch-python-sdist-output
|
|
||||||
- fetch-subunit-output
|
|
||||||
- ensure-if-python
|
|
||||||
- ensure-pip
|
|
||||||
- ensure-tox
|
|
||||||
- ensure-virtualenv
|
|
||||||
|
|
||||||
skip_list:
|
|
||||||
# Lines should be no longer than 120 chars.
|
|
||||||
- '204'
|
|
||||||
# Using command rather module we have where
|
|
||||||
# we need to use curl or rsync.
|
|
||||||
- '303'
|
|
||||||
# shell tasks uses pipeline without pipefail,
|
|
||||||
# this requires refactoring, skip for now.
|
|
||||||
- '306'
|
|
||||||
# Tasks that run when changed should likely be handlers
|
|
||||||
# this requires refactoring, skip for now.
|
|
||||||
- '503'
|
|
||||||
# meta/main.yml should contain relevant info
|
|
||||||
- '701'
|
|
||||||
# Tags must contain lowercase letters and digits only
|
|
||||||
- '702'
|
|
||||||
# meta/main.yml default values should be changed
|
|
||||||
- '703'
|
|
||||||
verbosity: 1
|
|
@ -1,37 +0,0 @@
|
|||||||
# Molecule managed
|
|
||||||
# Copyright 2021 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
{% if item.registry is defined %}
|
|
||||||
FROM {{ item.registry.url }}/{{ item.image }}
|
|
||||||
{% else %}
|
|
||||||
FROM {{ item.image }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
RUN if [ $(command -v apt-get) ]; then apt-get update && apt-get install -y python sudo bash ca-certificates && apt-get clean; \
|
|
||||||
elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install sudo python*-devel python*-dnf bash epel-release {{ item.pkg_extras | default('') }} && dnf clean all; \
|
|
||||||
elif [ $(command -v yum) ]; then yum makecache fast && yum install -y python sudo yum-plugin-ovl python-setuptools bash {{ item.pkg_extras | default('') }} && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \
|
|
||||||
elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python sudo bash python-xml {{ item.pkg_extras | default('') }} && zypper clean -a; \
|
|
||||||
elif [ $(command -v apk) ]; then apk update && apk add --no-cache python sudo bash ca-certificates {{ item.pkg_extras | default('') }}; \
|
|
||||||
elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python sudo bash ca-certificates {{ item.pkg_extras | default('') }} && xbps-remove -O; fi
|
|
||||||
|
|
||||||
{% for pkg in item.easy_install | default([]) %}
|
|
||||||
# install pip for centos where there is no python-pip rpm in default repos
|
|
||||||
RUN easy_install {{ pkg }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
CMD ["sh", "-c", "while true; do sleep 10000; done"]
|
|
@ -1,70 +0,0 @@
|
|||||||
---
|
|
||||||
# validations-common uses a shared molecule configuration file to avoid
|
|
||||||
# repetition. That configuration file is located at the repository level
|
|
||||||
# ({REPO}/.config/molecule/config.yml) and defines all the default values for
|
|
||||||
# all the molecule.yml files across all the roles. By default, the role-addition
|
|
||||||
# process will produce an empty molecule.yml inheriting this config.yml file.
|
|
||||||
#
|
|
||||||
# Any key defined in the role molecule.yml file will override values from this
|
|
||||||
# config.yml file.
|
|
||||||
#
|
|
||||||
# IMPORTANT: if you want to override the default values set here in this file,
|
|
||||||
# you will have to redefine them completely in your molecule.yml (at the role
|
|
||||||
# level) and add your extra configuration!
|
|
||||||
#
|
|
||||||
# For instance, if you need to add an extra package in your CentOS 8 Stream
|
|
||||||
# container, you will have to add the entire "platforms" key into your
|
|
||||||
# molecule.yml file and add your package name in the pkg_extras key.
|
|
||||||
#
|
|
||||||
# No merge will happen between your molecule.yml and this config.yml
|
|
||||||
# files. That's why you will have to redefine them completely.
|
|
||||||
|
|
||||||
driver:
|
|
||||||
name: podman
|
|
||||||
|
|
||||||
log: true
|
|
||||||
|
|
||||||
platforms:
|
|
||||||
- name: centos
|
|
||||||
hostname: centos
|
|
||||||
image: centos/centos:stream8
|
|
||||||
registry:
|
|
||||||
url: quay.io
|
|
||||||
dockerfile: ../../../../../.config/molecule/Dockerfile
|
|
||||||
pkg_extras: python*-setuptools python*-pyyaml
|
|
||||||
volumes:
|
|
||||||
- /etc/ci/mirror_info.sh:/etc/ci/mirror_info.sh:ro
|
|
||||||
privileged: true
|
|
||||||
environment: &env
|
|
||||||
http_proxy: "{{ lookup('env', 'http_proxy') }}"
|
|
||||||
https_proxy: "{{ lookup('env', 'https_proxy') }}"
|
|
||||||
ulimits: &ulimit
|
|
||||||
- host
|
|
||||||
|
|
||||||
provisioner:
|
|
||||||
name: ansible
|
|
||||||
inventory:
|
|
||||||
hosts:
|
|
||||||
all:
|
|
||||||
hosts:
|
|
||||||
centos:
|
|
||||||
ansible_python_interpreter: /usr/bin/python3
|
|
||||||
log: true
|
|
||||||
options:
|
|
||||||
vvv: true
|
|
||||||
env:
|
|
||||||
ANSIBLE_STDOUT_CALLBACK: yaml
|
|
||||||
ANSIBLE_ROLES_PATH: "${ANSIBLE_ROLES_PATH}:${HOME}/zuul-jobs/roles"
|
|
||||||
ANSIBLE_LIBRARY: "${ANSIBLE_LIBRARY:-/usr/share/ansible/plugins/modules}"
|
|
||||||
|
|
||||||
scenario:
|
|
||||||
test_sequence:
|
|
||||||
- destroy
|
|
||||||
- create
|
|
||||||
- prepare
|
|
||||||
- converge
|
|
||||||
- verify
|
|
||||||
- destroy
|
|
||||||
|
|
||||||
verifier:
|
|
||||||
name: ansible
|
|
@ -1,7 +0,0 @@
|
|||||||
[run]
|
|
||||||
branch = True
|
|
||||||
source = validations_common
|
|
||||||
omit = validations_common/tests/*
|
|
||||||
|
|
||||||
[report]
|
|
||||||
ignore_errors = True
|
|
@ -1,41 +0,0 @@
|
|||||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
|
||||||
// https://github.com/microsoft/vscode-dev-containers/tree/v0.155.1/containers/docker-existing-dockerfile
|
|
||||||
{
|
|
||||||
"name": "Existing Dockerfile",
|
|
||||||
|
|
||||||
// Sets the run context to one level up instead of the .devcontainer folder.
|
|
||||||
"context": "..",
|
|
||||||
|
|
||||||
// Set *default* container specific settings.json values on container create.
|
|
||||||
"settings": {
|
|
||||||
"terminal.integrated.shell.linux": null,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Add the IDs of extensions you want installed when the container is created.
|
|
||||||
"extensions": [
|
|
||||||
"ms-python.python"
|
|
||||||
],
|
|
||||||
|
|
||||||
"dockerFile": "../Dockerfile",
|
|
||||||
|
|
||||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
|
||||||
// "forwardPorts": [],
|
|
||||||
|
|
||||||
// Uncomment the next line to run commands after the container is created - for example installing curl.
|
|
||||||
// "postCreateCommand": "apt-get update && apt-get install -y curl",
|
|
||||||
|
|
||||||
// Uncomment when using a ptrace-based debugger like C++, Go, and Rust
|
|
||||||
// "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
|
|
||||||
|
|
||||||
// Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
|
|
||||||
// "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],
|
|
||||||
|
|
||||||
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
|
|
||||||
// "remoteUser": "vscode"
|
|
||||||
|
|
||||||
// Required for an empty mount arg, since we manually add it in the runArgs
|
|
||||||
"workspaceMount": "",
|
|
||||||
"runArgs": [
|
|
||||||
"--volume=${localWorkspaceFolder}:/workspaces/${localWorkspaceFolderBasename}:Z"
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
# Docker image doesn't need any files that git doesn't track.
|
|
||||||
#Therefore the .dockerignore largely follows the structure of .gitignore.
|
|
||||||
# C extensions
|
|
||||||
*.so
|
|
||||||
# Packages
|
|
||||||
*.egg*
|
|
||||||
*.egg-info
|
|
||||||
dist
|
|
||||||
build
|
|
||||||
eggs
|
|
||||||
parts
|
|
||||||
bin
|
|
||||||
var
|
|
||||||
sdist
|
|
||||||
develop-eggs
|
|
||||||
.installed.cfg
|
|
||||||
lib
|
|
||||||
lib64
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
# Unit test / coverage reports
|
|
||||||
cover/
|
|
||||||
.coverage*
|
|
||||||
!.coveragerc
|
|
||||||
.tox
|
|
||||||
nosetests.xml
|
|
||||||
.testrepository
|
|
||||||
.venv
|
|
||||||
.stestr/*
|
|
||||||
# Translations
|
|
||||||
*.mo
|
|
||||||
# Mr Developer
|
|
||||||
.mr.developer.cfg
|
|
||||||
.project
|
|
||||||
.pydevproject
|
|
||||||
# Complexity
|
|
||||||
output/*.html
|
|
||||||
output/*/index.html
|
|
||||||
# Sphinx
|
|
||||||
doc/build
|
|
||||||
doc/source/reference/api/
|
|
||||||
# pbr generates these
|
|
||||||
AUTHORS
|
|
||||||
ChangeLog
|
|
||||||
# Editors
|
|
||||||
*~
|
|
||||||
.*.swp
|
|
||||||
.*sw?
|
|
||||||
# Files created by releasenotes build
|
|
||||||
releasenotes/build
|
|
||||||
# Ansible specific
|
|
||||||
hosts
|
|
||||||
*.retry
|
|
||||||
#Vagrantfiles, since we are using docker
|
|
||||||
Vagrantfile.*
|
|
67
.gitignore
vendored
67
.gitignore
vendored
@ -1,67 +0,0 @@
|
|||||||
*.py[cod]
|
|
||||||
|
|
||||||
# C extensions
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Packages
|
|
||||||
*.egg*
|
|
||||||
*.egg-info
|
|
||||||
dist
|
|
||||||
build
|
|
||||||
eggs
|
|
||||||
parts
|
|
||||||
bin
|
|
||||||
var
|
|
||||||
sdist
|
|
||||||
develop-eggs
|
|
||||||
.installed.cfg
|
|
||||||
lib
|
|
||||||
lib64
|
|
||||||
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
|
|
||||||
# Unit test / coverage reports
|
|
||||||
cover/
|
|
||||||
.coverage*
|
|
||||||
!.coveragerc
|
|
||||||
.tox
|
|
||||||
nosetests.xml
|
|
||||||
.testrepository
|
|
||||||
.venv
|
|
||||||
.stestr/*
|
|
||||||
|
|
||||||
# Translations
|
|
||||||
*.mo
|
|
||||||
|
|
||||||
# Mr Developer
|
|
||||||
.mr.developer.cfg
|
|
||||||
.project
|
|
||||||
.pydevproject
|
|
||||||
|
|
||||||
# Complexity
|
|
||||||
output/*.html
|
|
||||||
output/*/index.html
|
|
||||||
|
|
||||||
# Sphinx
|
|
||||||
doc/build
|
|
||||||
doc/source/reference/api/
|
|
||||||
|
|
||||||
# pbr generates these
|
|
||||||
AUTHORS
|
|
||||||
ChangeLog
|
|
||||||
|
|
||||||
# Editors
|
|
||||||
*~
|
|
||||||
.*.swp
|
|
||||||
.*sw?
|
|
||||||
|
|
||||||
# Files created by releasenotes build
|
|
||||||
releasenotes/build
|
|
||||||
|
|
||||||
# Ansible specific
|
|
||||||
hosts
|
|
||||||
*.retry
|
|
||||||
|
|
||||||
# JSON files created by molecule tests
|
|
||||||
*/roles/*/molecule/*/*Z.json
|
|
@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
repos:
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
||||||
rev: v3.4.0
|
|
||||||
hooks:
|
|
||||||
- id: end-of-file-fixer
|
|
||||||
- id: trailing-whitespace
|
|
||||||
- id: mixed-line-ending
|
|
||||||
- id: check-byte-order-marker
|
|
||||||
- id: check-executables-have-shebangs
|
|
||||||
- id: check-merge-conflict
|
|
||||||
- id: check-symlinks
|
|
||||||
- id: debug-statements
|
|
||||||
- id: check-yaml
|
|
||||||
files: .*\.(yaml|yml)$
|
|
||||||
|
|
||||||
- repo: https://github.com/pycqa/flake8
|
|
||||||
rev: 3.9.1
|
|
||||||
hooks:
|
|
||||||
- id: flake8
|
|
||||||
additional_dependencies: [flake8-typing-imports==1.12.0]
|
|
||||||
entry: flake8 --ignore=E24,E121,E122,E123,E124,E126,E226,E265,E305,E402,F401,F405,E501,E704,F403,F841,W503,W605
|
|
||||||
|
|
||||||
- repo: https://github.com/adrienverge/yamllint.git
|
|
||||||
rev: v1.30.0
|
|
||||||
hooks:
|
|
||||||
- id: yamllint
|
|
||||||
files: \.(yaml|yml)$
|
|
||||||
types: [file, yaml]
|
|
||||||
entry: yamllint --strict -f parsable
|
|
||||||
|
|
||||||
- repo: https://github.com/ansible-community/ansible-lint
|
|
||||||
rev: v5.3.2
|
|
||||||
hooks:
|
|
||||||
- id: ansible-lint
|
|
||||||
always_run: true
|
|
||||||
pass_filenames: false
|
|
||||||
additional_dependencies:
|
|
||||||
- 'ansible-core<2.12'
|
|
||||||
verbose: true
|
|
||||||
entry: ansible-lint --force-color -p -v
|
|
||||||
|
|
||||||
- repo: https://github.com/openstack-dev/bashate.git
|
|
||||||
rev: 2.0.0
|
|
||||||
hooks:
|
|
||||||
- id: bashate
|
|
||||||
entry: bashate --error . --verbose --ignore=E006,E040
|
|
||||||
# Run bashate check for all bash scripts
|
|
||||||
# Ignores the following rules:
|
|
||||||
# E006: Line longer than 79 columns (as many scripts use jinja
|
|
||||||
# templating, this is very difficult)
|
|
||||||
# E040: Syntax error determined using `bash -n` (as many scripts
|
|
||||||
# use jinja templating, this will often fail and the syntax
|
|
||||||
# error will be discovered in execution anyway)
|
|
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
packages:
|
|
||||||
all:
|
|
||||||
- name: "python-yaml"
|
|
||||||
- name: "python-PyYAML"
|
|
||||||
- name: "PyYAML"
|
|
@ -1,3 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
test_path=${TEST_PATH:-./validations_common/tests}
|
|
||||||
top_dir=./
|
|
14
.yamllint
14
.yamllint
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
extends: default
|
|
||||||
|
|
||||||
rules:
|
|
||||||
line-length:
|
|
||||||
# matches hardcoded 160 value from ansible-lint
|
|
||||||
max: 160
|
|
||||||
indentation:
|
|
||||||
spaces: consistent
|
|
||||||
indent-sequences: true
|
|
||||||
check-multi-line-strings: false
|
|
||||||
|
|
||||||
ignore: |
|
|
||||||
releasenotes/notes/*.yaml
|
|
224
.zuul.yaml
224
.zuul.yaml
@ -1,224 +0,0 @@
|
|||||||
---
|
|
||||||
- job:
|
|
||||||
name: validations-common-functional
|
|
||||||
parent: devstack
|
|
||||||
run: playbooks/validations-common-functional.yaml
|
|
||||||
post-run: playbooks/post.yaml
|
|
||||||
timeout: 7200
|
|
||||||
required-projects:
|
|
||||||
- openstack/validations-libs
|
|
||||||
- openstack/validations-common
|
|
||||||
- name: openstack/openstacksdk
|
|
||||||
override-checkout: master
|
|
||||||
- name: opendev.org/openstack/devstack
|
|
||||||
override-checkout: master
|
|
||||||
vars:
|
|
||||||
devstack_localrc:
|
|
||||||
USE_PYTHON3: true
|
|
||||||
run_validation: true
|
|
||||||
irrelevant-files:
|
|
||||||
- ^.*\.rst$
|
|
||||||
- ^doc/.*$
|
|
||||||
- ^releasenotes/.*$
|
|
||||||
|
|
||||||
- job:
|
|
||||||
name: validations-common-reqcheck
|
|
||||||
nodeset: centos-9-stream
|
|
||||||
parent: base
|
|
||||||
run: playbooks/reqcheck.yaml
|
|
||||||
timeout: 1600
|
|
||||||
voting: true
|
|
||||||
required-projects:
|
|
||||||
- openstack/validations-common
|
|
||||||
files:
|
|
||||||
- ^requirements.txt$
|
|
||||||
|
|
||||||
- project:
|
|
||||||
templates:
|
|
||||||
- check-requirements
|
|
||||||
- validations-common-molecule-jobs
|
|
||||||
check:
|
|
||||||
jobs:
|
|
||||||
- validations-common-reqcheck
|
|
||||||
- openstack-tox-linters
|
|
||||||
- openstack-tox-cover
|
|
||||||
- openstack-tox-py38
|
|
||||||
- openstack-tox-py39
|
|
||||||
- validations-common-functional
|
|
||||||
- openstack-tox-docs: &tripleo-docs
|
|
||||||
files:
|
|
||||||
- ^doc/.*
|
|
||||||
- ^README.rst
|
|
||||||
- ^validations_common/.*
|
|
||||||
- ^CONTRIBUTING.rst
|
|
||||||
gate:
|
|
||||||
jobs:
|
|
||||||
- openstack-tox-linters
|
|
||||||
- openstack-tox-py38
|
|
||||||
- openstack-tox-py39
|
|
||||||
- validations-common-functional
|
|
||||||
- openstack-tox-docs: *tripleo-docs
|
|
||||||
promote:
|
|
||||||
jobs:
|
|
||||||
- promote-openstack-tox-docs: *tripleo-docs
|
|
||||||
- project-template:
|
|
||||||
check:
|
|
||||||
jobs:
|
|
||||||
- validations-common-centos-8-molecule-advanced_format_512e_support
|
|
||||||
- validations-common-centos-8-molecule-check_latest_packages_version
|
|
||||||
- validations-common-centos-8-molecule-dns
|
|
||||||
- validations-common-centos-8-molecule-ntp
|
|
||||||
- validations-common-centos-8-molecule-service_status
|
|
||||||
- validations-common-centos-8-molecule-check_cpu
|
|
||||||
- validations-common-centos-8-molecule-check_disk_space
|
|
||||||
- validations-common-centos-8-molecule-check_ram
|
|
||||||
- validations-common-centos-8-molecule-check_selinux_mode
|
|
||||||
- validations-common-centos-8-molecule-validate_selinux
|
|
||||||
- validations-common-centos-8-molecule-xfs_check_ftype
|
|
||||||
- validations-common-centos-8-molecule-check_rsyslog
|
|
||||||
gate:
|
|
||||||
jobs:
|
|
||||||
- validations-common-centos-8-molecule-check_latest_packages_version
|
|
||||||
- validations-common-centos-8-molecule-dns
|
|
||||||
- validations-common-centos-8-molecule-check_cpu
|
|
||||||
- validations-common-centos-8-molecule-check_disk_space
|
|
||||||
- validations-common-centos-8-molecule-check_ram
|
|
||||||
- validations-common-centos-8-molecule-validate_selinux
|
|
||||||
name: validations-common-molecule-jobs
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_selinux_mode/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_selinux_mode
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_selinux_mode
|
|
||||||
voting: false
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/ntp/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-ntp
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: ntp
|
|
||||||
voting: false
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/service_status/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-service_status
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: service_status
|
|
||||||
voting: false
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/advanced_format_512e_support/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-advanced_format_512e_support
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: advanced_format_512e_support
|
|
||||||
voting: false
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/dns/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-dns
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: dns
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_cpu/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_cpu
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_cpu
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_ram/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_ram
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_ram
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_disk_space/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_disk_space
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_disk_space
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/xfs_check_ftype/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-xfs_check_ftype
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: xfs_check_ftype
|
|
||||||
voting: false
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_latest_packages_version/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_latest_packages_version
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_latest_packages_version
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/validate_selinux/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-validate_selinux
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: validate_selinux
|
|
||||||
- job:
|
|
||||||
files:
|
|
||||||
- ^validations_common/roles/check_rsyslog/.*
|
|
||||||
- ^tests/prepare-test-host.yml
|
|
||||||
- ^playbooks/molecule/pre.yml
|
|
||||||
- ^playbooks/molecule/run.yml
|
|
||||||
- ^molecule-requirements.txt
|
|
||||||
name: validations-common-centos-8-molecule-check_rsyslog
|
|
||||||
parent: validations-common-centos-8-base
|
|
||||||
vars:
|
|
||||||
validations_common_role_name: check_rsyslog
|
|
@ -1,87 +0,0 @@
|
|||||||
If you're interested in contributing to the validations-common project,
|
|
||||||
the following will help get you started:
|
|
||||||
|
|
||||||
https://docs.openstack.org/infra/manual/developers.html
|
|
||||||
|
|
||||||
If you already have a good understanding of how the system works and your
|
|
||||||
OpenStack accounts are set up, you can skip to the development workflow
|
|
||||||
section of this documentation to learn how changes to OpenStack should be
|
|
||||||
submitted for review via the Gerrit tool:
|
|
||||||
|
|
||||||
https://docs.openstack.org/infra/manual/developers.html#development-workflow
|
|
||||||
|
|
||||||
Pull requests submitted through GitHub will be ignored.
|
|
||||||
|
|
||||||
Validations are meant to verify functionality of tripleo systems.
|
|
||||||
Therefore a special care should be given to testing your code before submitting a review.
|
|
||||||
|
|
||||||
The information below will cover the project specific information you'll
|
|
||||||
need to get started with validation-framework.
|
|
||||||
|
|
||||||
Branches and version management
|
|
||||||
===============================
|
|
||||||
Validation Framework project uses semantic versioning and derives names of stable branches
|
|
||||||
from the released minor versions. The latest minor version released is the only exception
|
|
||||||
as it is derived from the `master` branch.
|
|
||||||
|
|
||||||
Therefore, all code used by version 1.n.* of the project resides in `stable/1.n` branch,
|
|
||||||
and when version 1.(n+1) is released, new branch `stable/1.(n+1)` will be created.
|
|
||||||
|
|
||||||
By default, stable branches recieve only bug fixes and feature backports are decided on case basis
|
|
||||||
after all the necessary discussions and procedures have taken place.
|
|
||||||
|
|
||||||
Documentation
|
|
||||||
=============
|
|
||||||
For description of provided validations, modules and tools please refer to the `upstream documentation <https://docs.openstack.org/validations-common/latest/>`_.
|
|
||||||
Separate documentation is provided about the runtime, `validations-libs <https://docs.openstack.org/validations-libs/latest/>`_
|
|
||||||
|
|
||||||
For general information on contributing to OpenStack, please check out the
|
|
||||||
`contributor guide <https://docs.openstack.org/contributors/>`_ to get started.
|
|
||||||
It covers all the basics that are common to all OpenStack projects: the accounts
|
|
||||||
you need, the basics of interacting with our Gerrit review system, how we
|
|
||||||
communicate as a community, etc.
|
|
||||||
|
|
||||||
Communication
|
|
||||||
=============
|
|
||||||
* IRC channel ``#validation-framework`` at `Libera`_ (For all subject-matters)
|
|
||||||
* IRC channel ``#tripleo`` at `OFTC`_ (OpenStack and TripleO discussions)
|
|
||||||
* Mailing list (prefix subjects with ``[tripleo][validations]`` for faster responses)
|
|
||||||
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss
|
|
||||||
|
|
||||||
.. _Libera: https://libera.chat/
|
|
||||||
.. _OFTC: https://www.oftc.net/
|
|
||||||
|
|
||||||
Contacting the Core Team
|
|
||||||
========================
|
|
||||||
Please refer to the `TripleO Core Team
|
|
||||||
<https://review.opendev.org/#/admin/groups/190,members>`_ contacts.
|
|
||||||
|
|
||||||
Bug Tracking
|
|
||||||
=============
|
|
||||||
We track our tasks in `Launchpad <https://bugs.launchpad.net/tripleo/+bugs?field.tag=validations>`_ and in
|
|
||||||
`StoryBoard <https://storyboard.openstack.org/#!/project_group/76>`_
|
|
||||||
|
|
||||||
Reporting a Bug
|
|
||||||
===============
|
|
||||||
You found an issue and want to make sure we are aware of it? You can do so on
|
|
||||||
`Launchpad <https://bugs.launchpad.net/tripleo/+filebug>`__. Please, add the
|
|
||||||
validations tag to your bug.
|
|
||||||
|
|
||||||
More info about Launchpad usage can be found on `OpenStack docs page
|
|
||||||
<https://docs.openstack.org/contributors/common/task-tracking.html#launchpad>`_
|
|
||||||
|
|
||||||
Getting Your Patch Merged
|
|
||||||
=========================
|
|
||||||
All changes proposed to the TripleO requires two ``Code-Review +2`` votes from
|
|
||||||
TripleO core reviewers before one of the core reviewers can approve patch by
|
|
||||||
giving ``Workflow +1`` vote.
|
|
||||||
|
|
||||||
Project Team Lead Duties
|
|
||||||
========================
|
|
||||||
All common PTL duties are enumerated in the `PTL guide
|
|
||||||
<https://docs.openstack.org/project-team-guide/ptl.html>`_.
|
|
||||||
|
|
||||||
The Release Process for TripleO is documented in `Release Management
|
|
||||||
<https://docs.openstack.org/tripleo-docs/latest/developer/release.html>`_.
|
|
||||||
|
|
||||||
Documentation for the TripleO project can be found `here <https://docs.openstack.org/tripleo-docs/latest/index.html>`_
|
|
28
Dockerfile
28
Dockerfile
@ -1,28 +0,0 @@
|
|||||||
FROM redhat/ubi9:latest
|
|
||||||
|
|
||||||
LABEL name="Validations common development container file"
|
|
||||||
LABEL version="1.1"
|
|
||||||
LABEL description="Provides environment for development of new validations."
|
|
||||||
|
|
||||||
RUN dnf install -y git python3-pip gcc python3-devel jq
|
|
||||||
|
|
||||||
# Copy contents of the local validations-common repo with all of our changes
|
|
||||||
COPY . /root/validations-common
|
|
||||||
# validations-libs repo is cloned
|
|
||||||
RUN git clone https://opendev.org/openstack/validations-libs /root/validations-libs
|
|
||||||
|
|
||||||
# Install wheel, validations-libs, validations-common, pytest and all dependencies
|
|
||||||
RUN python3 -m pip install wheel &&\
|
|
||||||
python3 -m pip install /root/validations-common &&\
|
|
||||||
python3 -m pip install -r /root/validations-common/test-requirements.txt &&\
|
|
||||||
python3 -m pip install pytest &&\
|
|
||||||
python3 -m pip install /root/validations-libs
|
|
||||||
|
|
||||||
# Setting up the default directory structure for both ansible,
|
|
||||||
# and the VF
|
|
||||||
RUN ln -s /usr/local/share/ansible /usr/share/ansible &&\
|
|
||||||
mkdir -p /var/log/validations
|
|
||||||
# Simplified ansible inventory is created, containing only localhost,
|
|
||||||
# and defining the connection as local.
|
|
||||||
RUN mkdir -p /etc/ansible && \
|
|
||||||
echo "localhost ansible_connection=local" > /etc/ansible/hosts
|
|
175
LICENSE
175
LICENSE
@ -1,175 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
@ -1,6 +0,0 @@
|
|||||||
include AUTHORS
|
|
||||||
include ChangeLog
|
|
||||||
exclude .gitignore
|
|
||||||
exclude .gitreview
|
|
||||||
|
|
||||||
global-exclude *.pyc
|
|
120
README.rst
120
README.rst
@ -1,114 +1,10 @@
|
|||||||
==================
|
This project is no longer maintained.
|
||||||
Validations-common
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. image:: https://governance.openstack.org/tc/badges/validations-common.svg
|
The contents of this repository are still available in the Git
|
||||||
:target: https://governance.openstack.org/tc/reference/tags/index.html
|
source code management system. To see the contents of this
|
||||||
|
repository before it reached its end of life, please check out the
|
||||||
|
previous commit with "git checkout HEAD^1".
|
||||||
|
|
||||||
.. Change things from this point on
|
For any further questions, please email
|
||||||
|
openstack-discuss@lists.openstack.org or join #openstack-dev on
|
||||||
A collection of Ansible roles and playbooks to detect and report potential
|
OFTC.
|
||||||
issues during deployments.
|
|
||||||
|
|
||||||
The validations will help detect issues early in the deployment process and
|
|
||||||
prevent field engineers from wasting time on misconfiguration or hardware
|
|
||||||
issues in their environments.
|
|
||||||
|
|
||||||
* Free software: Apache_license_
|
|
||||||
* Documentation: https://docs.openstack.org/validations-common/latest/
|
|
||||||
* Release notes: https://docs.openstack.org/releasenotes/validations-commons/
|
|
||||||
* Source: https://opendev.org/openstack/validations-common
|
|
||||||
* Bugs - Upstream: https://bugs.launchpad.net/tripleo/+bugs?field.tag=validations
|
|
||||||
* Bugs - Downstream: https://bugzilla.redhat.com/buglist.cgi?component=validations-common&product=Red%20Hat%20OpenStack
|
|
||||||
|
|
||||||
Installation
|
|
||||||
============
|
|
||||||
Recommended process
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
There are several different ways to install validations-common.
|
|
||||||
However it is **recommended** to both install and use
|
|
||||||
the package inside python virtual environment.
|
|
||||||
|
|
||||||
At the command line using `pip`.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ python3 -m pip install validations-common
|
|
||||||
|
|
||||||
|
|
||||||
Or, if you have virtualenvwrapper_ installed.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ mkvirtualenv validations-common
|
|
||||||
$ python3 -m pip install validations-common
|
|
||||||
|
|
||||||
Installation with package manager
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Alternatively it is possible to install validations-common using package manager.
|
|
||||||
|
|
||||||
Such as `yum` or `dnf`...
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ yum|dnf install validations-common
|
|
||||||
|
|
||||||
|
|
||||||
or the more modern `dnf`.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ dnf install validations-common
|
|
||||||
|
|
||||||
|
|
||||||
Usage
|
|
||||||
=====
|
|
||||||
|
|
||||||
Once the validations-common project has been installed,
|
|
||||||
navigate to the chosen share path, usually `/usr/share/ansible`
|
|
||||||
to access the installed roles, playbooks, and libraries.
|
|
||||||
|
|
||||||
While the validations-common can be run by itself,
|
|
||||||
it nonetheless depends on Ansible and validations-libs.
|
|
||||||
Therefore it isn't recommended to use only validations-common.
|
|
||||||
|
|
||||||
.. _virtualenvwrapper: https://pypi.org/project/virtualenvwrapper/
|
|
||||||
.. _Apache_license: http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
|
|
||||||
Validations Callbacks
|
|
||||||
=====================
|
|
||||||
http_json callback
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The callback `http_json` sends Validations logs and information to an HTTP
|
|
||||||
server as a JSON format in order to get caught and analysed with external
|
|
||||||
tools for log parsing (as Fluentd or others).
|
|
||||||
|
|
||||||
This callback inherits from `validation_json` the format of the logging
|
|
||||||
remains the same as the other logger that the Validation Framework is using
|
|
||||||
by default.
|
|
||||||
|
|
||||||
To enable this callback, you need to add it to the callback whitelist.
|
|
||||||
Then you need to export your http server url and port::
|
|
||||||
|
|
||||||
export HTTP_JSON_SERVER=http://localhost
|
|
||||||
export HTTP_JSON_PORT=8989
|
|
||||||
|
|
||||||
The callback will post JSON log to the URL provided.
|
|
||||||
This repository has a simple HTTP server for testing purpose under::
|
|
||||||
|
|
||||||
tools/http_server.py
|
|
||||||
|
|
||||||
The default host and port are localhost and 8989, feel free to adjust those
|
|
||||||
values to your needs.
|
|
||||||
|
|
||||||
Running the molecule tests
|
|
||||||
==========================
|
|
||||||
|
|
||||||
In order to run the molecule tests locally on your local machine, please follow
|
|
||||||
the instructions documented in the `Tripleo Validations` `Developers Guide`_.
|
|
||||||
|
|
||||||
.. _Developers Guide: https://docs.openstack.org/tripleo-validations/latest/contributing/developer_guide.html#local-testing-of-new-roles
|
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
---
|
|
||||||
collections:
|
|
||||||
- containers.podman
|
|
||||||
- community.general
|
|
||||||
- community.crypto
|
|
||||||
- ansible.posix
|
|
@ -1,24 +0,0 @@
|
|||||||
export VALIDATIONS_COMMON_WORKPATH="$(dirname $(readlink -f ${BASH_SOURCE[0]}))"
|
|
||||||
export ANSIBLE_STDOUT_CALLBACK=debug
|
|
||||||
export ANSIBLE_LIBRARY="${VALIDATIONS_COMMON_WORKPATH}/validations_common/library"
|
|
||||||
|
|
||||||
# TODO(gchamoul): uncomment once we host lookup plugins
|
|
||||||
#export ANSIBLE_LOOKUP_PLUGINS="${VALIDATIONS_COMMON_WORKPATH}/validations_common/lookup_plugins"
|
|
||||||
|
|
||||||
export ANSIBLE_ROLES_PATH="${VALIDATIONS_COMMON_WORKPATH}/validations_common/roles"
|
|
||||||
export ANSIBLE_INVENTORY="${VALIDATIONS_COMMON_WORKPATH}/tests/hosts.ini"
|
|
||||||
export ANSIBLE_RETRY_FILES_ENABLED="0"
|
|
||||||
export ANSIBLE_LOAD_CALLBACK_PLUGINS="1"
|
|
||||||
export ANSIBLE_HOST_KEY_CHECKING=False
|
|
||||||
|
|
||||||
function unset-ansible-test-env {
|
|
||||||
for i in $(env | grep ANSIBLE_ | awk -F'=' '{print $1}'); do
|
|
||||||
unset ${i}
|
|
||||||
done
|
|
||||||
unset VALIDATIONS_COMMON_WORKPATH
|
|
||||||
echo -e "Ansible test environment deactivated.\n"
|
|
||||||
unset -f unset-ansible-test-env
|
|
||||||
}
|
|
||||||
|
|
||||||
echo -e "Ansible test environment is now active"
|
|
||||||
echo -e "Run 'unset-ansible-test-env' to deactivate.\n"
|
|
47
bindep.txt
47
bindep.txt
@ -1,47 +0,0 @@
|
|||||||
# This file facilitates OpenStack-CI package installation
|
|
||||||
# before the execution of any tests.
|
|
||||||
#
|
|
||||||
# See the following for details:
|
|
||||||
# - https://docs.openstack.org/infra/bindep/
|
|
||||||
# - https://opendev.org/opendev/bindep/
|
|
||||||
#
|
|
||||||
# Even if the role does not make use of this facility, it
|
|
||||||
# is better to have this file empty, otherwise OpenStack-CI
|
|
||||||
# will fall back to installing its default packages which
|
|
||||||
# will potentially be detrimental to the tests executed.
|
|
||||||
|
|
||||||
# The gcc compiler
|
|
||||||
gcc
|
|
||||||
|
|
||||||
# Base requirements for RPM distros
|
|
||||||
gcc-c++ [platform:rpm]
|
|
||||||
git [platform:rpm]
|
|
||||||
libffi-devel [platform:rpm]
|
|
||||||
openssl-devel [platform:rpm]
|
|
||||||
podman [platform:rpm]
|
|
||||||
python3-devel [platform:rpm !platform:rhel-7 !platform:centos-7]
|
|
||||||
PyYAML [platform:rpm !platform:rhel-8 !platform:centos-8 !platform:fedora]
|
|
||||||
python3-pyyaml [platform:rpm !platform:rhel-7 !platform:centos-7]
|
|
||||||
python3-dnf [platform:rpm !platform:rhel-7 !platform:centos-7]
|
|
||||||
|
|
||||||
# RH Mechanisms
|
|
||||||
python-rhsm-certificates [platform:redhat]
|
|
||||||
|
|
||||||
# SELinux cent7
|
|
||||||
libselinux-python3 [platform:rpm !platform:rhel-8 !platform:centos-8]
|
|
||||||
libsemanage-python3 [platform:redhat !platform:rhel-8 !platform:centos-8]
|
|
||||||
# SELinux cent8
|
|
||||||
python3-libselinux [platform:rpm !platform:rhel-7 !platform:centos-7]
|
|
||||||
python3-libsemanage [platform:redhat !platform:rhel-7 !platform:centos-7]
|
|
||||||
|
|
||||||
# Required for compressing collected log files in CI
|
|
||||||
gzip
|
|
||||||
|
|
||||||
# Required to build language docs
|
|
||||||
gettext [doc test]
|
|
||||||
graphviz [doc test]
|
|
||||||
# libsrvg2 is needed for sphinxcontrib-svg2pdfconverter in docs builds.
|
|
||||||
librsvg2-tools [doc platform:rpm]
|
|
||||||
librsvg2-bin [doc platform:dpkg]
|
|
||||||
# PDF Docs package dependencies
|
|
||||||
tex-gyre [platform:dpkg doc]
|
|
@ -1,10 +0,0 @@
|
|||||||
# this is required for the docs build jobs
|
|
||||||
sphinx>=2.0.0,!=2.1.0 # BSD License
|
|
||||||
openstackdocstheme>=2.2.2 # Apache-2.0
|
|
||||||
reno>=3.1.0 # Apache-2.0
|
|
||||||
sphinxcontrib-apidoc>=0.2.0 # BSD License
|
|
||||||
sphinxcontrib-svg2pdfconverter>=1.1.1 # BSD License
|
|
||||||
doc8>=0.8.0 # Apache-2.0
|
|
||||||
bashate>=0.6.0 # Apache-2.0
|
|
||||||
ruamel.yaml>=0.15.5 # MIT
|
|
||||||
six>=1.11.0 # MIT
|
|
@ -1,402 +0,0 @@
|
|||||||
# Copyright 2021 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
import imp
|
|
||||||
import os
|
|
||||||
|
|
||||||
from docutils import core
|
|
||||||
from docutils import nodes
|
|
||||||
from docutils.parsers.rst import Directive
|
|
||||||
from docutils.parsers import rst
|
|
||||||
from docutils.writers.html4css1 import Writer
|
|
||||||
|
|
||||||
from sphinx import addnodes
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
from ruamel.yaml import YAML as RYAML
|
|
||||||
|
|
||||||
try:
|
|
||||||
import io
|
|
||||||
StringIO = io.StringIO
|
|
||||||
except ImportError:
|
|
||||||
import StringIO
|
|
||||||
|
|
||||||
|
|
||||||
class DocYaml(RYAML):
|
|
||||||
def _license_filter(self, data):
|
|
||||||
"""This will filter out our boilerplate license heading in return data.
|
|
||||||
|
|
||||||
The filter is used to allow documentation we're creating in variable
|
|
||||||
files to be rendered more beautifully.
|
|
||||||
"""
|
|
||||||
lines = list()
|
|
||||||
mark = True
|
|
||||||
for line in data.splitlines():
|
|
||||||
if '# Copyright' in line:
|
|
||||||
mark = False
|
|
||||||
if mark:
|
|
||||||
lines.append(line)
|
|
||||||
if '# under the License' in line:
|
|
||||||
mark = True
|
|
||||||
return '\n'.join(lines)
|
|
||||||
|
|
||||||
def dump(self, data, stream=None, **kw):
|
|
||||||
if not stream:
|
|
||||||
stream = StringIO()
|
|
||||||
try:
|
|
||||||
RYAML.dump(self, data, stream, **kw)
|
|
||||||
return self._license_filter(stream.getvalue().strip())
|
|
||||||
finally:
|
|
||||||
stream.close()
|
|
||||||
|
|
||||||
|
|
||||||
DOCYAML = DocYaml()
|
|
||||||
DOCYAML.default_flow_style = False
|
|
||||||
|
|
||||||
|
|
||||||
class AnsibleAutoPluginDirective(Directive):
|
|
||||||
directive_name = "ansibleautoplugin"
|
|
||||||
has_content = True
|
|
||||||
option_spec = {
|
|
||||||
'module': rst.directives.unchanged,
|
|
||||||
'role': rst.directives.unchanged,
|
|
||||||
'documentation': rst.directives.unchanged,
|
|
||||||
'examples': rst.directives.unchanged
|
|
||||||
}
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _render_html(source):
|
|
||||||
return core.publish_parts(
|
|
||||||
source=source,
|
|
||||||
writer=Writer(),
|
|
||||||
writer_name='html',
|
|
||||||
settings_overrides={'no_system_messages': True}
|
|
||||||
)
|
|
||||||
|
|
||||||
def make_node(self, title, contents, content_type=None):
|
|
||||||
section = self._section_block(title=title)
|
|
||||||
if not content_type:
|
|
||||||
# Doc section
|
|
||||||
for content in contents['docs']:
|
|
||||||
for paragraph in content.split('\n'):
|
|
||||||
retnode = nodes.paragraph()
|
|
||||||
retnode.append(self._raw_html_block(data=paragraph))
|
|
||||||
section.append(retnode)
|
|
||||||
|
|
||||||
# Options Section
|
|
||||||
options_list = nodes.field_list()
|
|
||||||
options_section = self._section_block(title='Options')
|
|
||||||
for key, value in contents['options'].items():
|
|
||||||
options_list.append(
|
|
||||||
self._raw_fields(
|
|
||||||
data=value['description'],
|
|
||||||
field_name=key
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
options_section.append(options_list)
|
|
||||||
section.append(options_section)
|
|
||||||
|
|
||||||
# Authors Section
|
|
||||||
authors_list = nodes.field_list()
|
|
||||||
authors_list.append(
|
|
||||||
self._raw_fields(
|
|
||||||
data=contents['author']
|
|
||||||
)
|
|
||||||
)
|
|
||||||
authors_section = self._section_block(title='Authors')
|
|
||||||
authors_section.append(authors_list)
|
|
||||||
section.append(authors_section)
|
|
||||||
|
|
||||||
elif content_type == 'yaml':
|
|
||||||
for content in contents:
|
|
||||||
section.append(
|
|
||||||
self._literal_block(
|
|
||||||
data=content,
|
|
||||||
dump_data=False
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return section
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def load_module(filename):
|
|
||||||
return imp.load_source('__ansible_module__', filename)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def build_documentation(module):
|
|
||||||
docs = DOCYAML.load(module.DOCUMENTATION)
|
|
||||||
doc_data = dict()
|
|
||||||
doc_data['docs'] = docs['description']
|
|
||||||
doc_data['author'] = docs.get('author', list())
|
|
||||||
doc_data['options'] = docs.get('options', dict())
|
|
||||||
return doc_data
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def build_examples(module):
|
|
||||||
examples = DOCYAML.load(module.EXAMPLES)
|
|
||||||
return_examples = list()
|
|
||||||
for example in examples:
|
|
||||||
return_examples.append(DOCYAML.dump([example]))
|
|
||||||
return return_examples
|
|
||||||
|
|
||||||
def _raw_html_block(self, data):
|
|
||||||
html = self._render_html(source=data)
|
|
||||||
return nodes.raw('', html['body'], format='html')
|
|
||||||
|
|
||||||
def _raw_fields(self, data, field_name=''):
|
|
||||||
body = nodes.field_body()
|
|
||||||
if isinstance(data, list):
|
|
||||||
for item in data:
|
|
||||||
body.append(self._raw_html_block(data=item))
|
|
||||||
else:
|
|
||||||
body.append(self._raw_html_block(data=data))
|
|
||||||
|
|
||||||
field = nodes.field()
|
|
||||||
field.append(nodes.field_name(text=field_name))
|
|
||||||
field.append(body)
|
|
||||||
return field
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _literal_block(data, language='yaml', dump_data=True):
|
|
||||||
if dump_data:
|
|
||||||
literal = nodes.literal_block(
|
|
||||||
text=DOCYAML.dump(data)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
literal = nodes.literal_block(text=data)
|
|
||||||
literal['language'] = 'yaml'
|
|
||||||
return literal
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _section_block(title, text=None):
|
|
||||||
section = nodes.section(
|
|
||||||
title,
|
|
||||||
nodes.title(text=title),
|
|
||||||
ids=[nodes.make_id('-'.join(title))],
|
|
||||||
)
|
|
||||||
if text:
|
|
||||||
section_body = nodes.field_body()
|
|
||||||
section_body.append(nodes.paragraph(text=text))
|
|
||||||
section.append(section_body)
|
|
||||||
|
|
||||||
return section
|
|
||||||
|
|
||||||
def _yaml_section(self, to_yaml_data, section_title, section_text=None):
|
|
||||||
yaml_section = self._section_block(
|
|
||||||
title=section_title,
|
|
||||||
text=section_text
|
|
||||||
)
|
|
||||||
yaml_section.append(self._literal_block(data=to_yaml_data))
|
|
||||||
return yaml_section
|
|
||||||
|
|
||||||
def _run_role(self, role):
|
|
||||||
section = self._section_block(
|
|
||||||
title="Role Documentation",
|
|
||||||
text="Welcome to the '{}' role documentation.".format(
|
|
||||||
os.path.basename(role)
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
molecule_defaults = None
|
|
||||||
abspath_role = os.path.dirname(os.path.abspath(role))
|
|
||||||
molecule_shared_file = os.path.join(
|
|
||||||
os.path.dirname(abspath_role), "../.config/molecule/config.yml"
|
|
||||||
)
|
|
||||||
|
|
||||||
if os.path.exists(molecule_shared_file):
|
|
||||||
with open(molecule_shared_file) as msf:
|
|
||||||
molecule_defaults = DOCYAML.load(msf.read())
|
|
||||||
|
|
||||||
defaults_file = os.path.join(role, "defaults", "main.yml")
|
|
||||||
if os.path.exists(defaults_file):
|
|
||||||
with open(defaults_file) as f:
|
|
||||||
role_defaults = DOCYAML.load(f.read())
|
|
||||||
section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=role_defaults,
|
|
||||||
section_title="Role Defaults",
|
|
||||||
section_text="This section highlights all of the defaults"
|
|
||||||
" and variables set within the '{}'"
|
|
||||||
" role.".format(os.path.basename(role)),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
vars_path = os.path.join(role, "vars")
|
|
||||||
if os.path.exists(vars_path):
|
|
||||||
for v_file in os.listdir(vars_path):
|
|
||||||
vars_file = os.path.join(vars_path, v_file)
|
|
||||||
with open(vars_file) as f:
|
|
||||||
vars_values = DOCYAML.load(f.read())
|
|
||||||
section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=vars_values,
|
|
||||||
section_title="Role Variables: {}".format(v_file),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
test_list = nodes.field_list()
|
|
||||||
test_section = self._section_block(
|
|
||||||
title="Molecule Scenarios",
|
|
||||||
text="Molecule is being used to test the '{}' role. The"
|
|
||||||
" following section highlights the drivers in service"
|
|
||||||
" and provides an example playbook showing how the role"
|
|
||||||
" is leveraged.".format(os.path.basename(role)),
|
|
||||||
)
|
|
||||||
|
|
||||||
molecule_path = os.path.join(role, "molecule")
|
|
||||||
if os.path.exists(molecule_path):
|
|
||||||
for test in os.listdir(molecule_path):
|
|
||||||
molecule_section = self._section_block(
|
|
||||||
title="Scenario: {}".format(test)
|
|
||||||
)
|
|
||||||
molecule_file = os.path.join(molecule_path, test, "molecule.yml")
|
|
||||||
if not os.path.exists(molecule_file):
|
|
||||||
continue
|
|
||||||
|
|
||||||
with open(molecule_file) as f:
|
|
||||||
molecule_conf = DOCYAML.load(f.read())
|
|
||||||
|
|
||||||
# if molecule.yml file from the scenarios, we get the
|
|
||||||
# information from the molecule shared configuration file.
|
|
||||||
if not molecule_conf:
|
|
||||||
molecule_conf = molecule_defaults
|
|
||||||
|
|
||||||
# Now that we use a shared molecule configuration file, the
|
|
||||||
# molecule.yml file in the role scenarios could be empty or
|
|
||||||
# contains only overriding keys.
|
|
||||||
driver_data = molecule_conf.get('driver',
|
|
||||||
molecule_defaults.get('driver'))
|
|
||||||
|
|
||||||
if driver_data:
|
|
||||||
molecule_section.append(
|
|
||||||
nodes.field_name(text="Driver: {}".format(driver_data["name"]))
|
|
||||||
)
|
|
||||||
|
|
||||||
options = driver_data.get("options")
|
|
||||||
if options:
|
|
||||||
molecule_section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=options, section_title="Molecule Options"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
platforms_data = molecule_conf.get('platforms',
|
|
||||||
molecule_defaults.get('platforms'))
|
|
||||||
|
|
||||||
if platforms_data:
|
|
||||||
molecule_section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=platforms_data,
|
|
||||||
section_title="Molecule Platform(s)",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
default_playbook = [molecule_path, test, "converge.yml"]
|
|
||||||
|
|
||||||
provisioner_data = molecule_conf.get('provisioner',
|
|
||||||
molecule_defaults.get('provisioner'))
|
|
||||||
|
|
||||||
if provisioner_data:
|
|
||||||
inventory = provisioner_data.get('inventory')
|
|
||||||
if inventory:
|
|
||||||
molecule_section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=inventory,
|
|
||||||
section_title="Molecule Inventory",
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
|
||||||
converge = provisioner_data['playbooks']['converge']
|
|
||||||
default_playbook = default_playbook[:-1] + [converge]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
molecule_playbook_path = os.path.join(*default_playbook)
|
|
||||||
|
|
||||||
with open(molecule_playbook_path) as f:
|
|
||||||
molecule_playbook = DOCYAML.load(f.read())
|
|
||||||
molecule_section.append(
|
|
||||||
self._yaml_section(
|
|
||||||
to_yaml_data=molecule_playbook,
|
|
||||||
section_title="Example {} playbook".format(test),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
test_list.append(molecule_section)
|
|
||||||
else:
|
|
||||||
test_section.append(test_list)
|
|
||||||
section.append(test_section)
|
|
||||||
|
|
||||||
self.run_returns.append(section)
|
|
||||||
|
|
||||||
# Document any libraries nested within the role
|
|
||||||
library_path = os.path.join(role, "library")
|
|
||||||
if os.path.exists(library_path):
|
|
||||||
self.options['documentation'] = True
|
|
||||||
self.options['examples'] = True
|
|
||||||
for lib in os.listdir(library_path):
|
|
||||||
if lib.endswith(".py"):
|
|
||||||
self._run_module(
|
|
||||||
module=self.load_module(
|
|
||||||
filename=os.path.join(library_path, lib)
|
|
||||||
),
|
|
||||||
module_title="Embedded module: {}".format(lib),
|
|
||||||
example_title="Examples for embedded module",
|
|
||||||
)
|
|
||||||
|
|
||||||
def _run_module(self, module, module_title="Module Documentation",
|
|
||||||
example_title="Example Tasks"):
|
|
||||||
if self.options.get('documentation'):
|
|
||||||
docs = self.build_documentation(module=module)
|
|
||||||
self.run_returns.append(
|
|
||||||
self.make_node(
|
|
||||||
title=module_title,
|
|
||||||
contents=docs
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if self.options.get('examples'):
|
|
||||||
examples = self.build_examples(module=module)
|
|
||||||
self.run_returns.append(
|
|
||||||
self.make_node(
|
|
||||||
title=example_title,
|
|
||||||
contents=examples,
|
|
||||||
content_type='yaml'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.run_returns = list()
|
|
||||||
|
|
||||||
if self.options.get('module'):
|
|
||||||
module = self.load_module(filename=self.options['module'])
|
|
||||||
self._run_module(module=module)
|
|
||||||
|
|
||||||
if self.options.get('role'):
|
|
||||||
self._run_role(role=self.options['role'])
|
|
||||||
|
|
||||||
return self.run_returns
|
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
|
||||||
classes = [
|
|
||||||
AnsibleAutoPluginDirective,
|
|
||||||
]
|
|
||||||
for directive_class in classes:
|
|
||||||
app.add_directive(directive_class.directive_name, directive_class)
|
|
||||||
|
|
||||||
return {'version': '0.2'}
|
|
@ -1,114 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from unittest import mock
|
|
||||||
|
|
||||||
# Add the project
|
|
||||||
sys.path.insert(0, os.path.abspath('../..'))
|
|
||||||
# Add the extensions
|
|
||||||
sys.path.insert(0, os.path.join(os.path.abspath('.'), '_exts'))
|
|
||||||
|
|
||||||
# -- General configuration ----------------------------------------------------
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
|
||||||
extensions = [
|
|
||||||
'sphinxcontrib.apidoc',
|
|
||||||
'sphinxcontrib.rsvgconverter',
|
|
||||||
'sphinx.ext.viewcode',
|
|
||||||
'sphinx.ext.autodoc',
|
|
||||||
'openstackdocstheme',
|
|
||||||
'ansible-autodoc'
|
|
||||||
]
|
|
||||||
|
|
||||||
# sphinxcontrib.apidoc options
|
|
||||||
apidoc_module_dir = '../../validations_common'
|
|
||||||
apidoc_output_dir = 'reference/api'
|
|
||||||
apidoc_excluded_paths = []
|
|
||||||
apidoc_separate_modules = True
|
|
||||||
|
|
||||||
# openstackdocstheme options
|
|
||||||
openstackdocs_repo_name = 'openstack/validations-common'
|
|
||||||
openstackdocs_use_storyboard = True
|
|
||||||
openstackdocs_pdf_link = True
|
|
||||||
openstackdocs_bug_project = 'tripleo'
|
|
||||||
openstackdocs_bug_tag = 'documentation'
|
|
||||||
|
|
||||||
# autodoc generation is a bit aggressive and a nuisance when doing heavy
|
|
||||||
# text edit cycles.
|
|
||||||
# execute "export SPHINX_DEBUG=1" in your terminal to disable
|
|
||||||
autodoc_mock_imports = ['validations_libs', 'oslotest', 'ansible']
|
|
||||||
|
|
||||||
# Mocking autodoc deps manually
|
|
||||||
sys.modules['ansible.module_utils.basic'] = mock.Mock()
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
copyright = '2021, OpenStack Foundation'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
modindex_common_prefix = ['validations_common.']
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
add_module_names = True
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'native'
|
|
||||||
|
|
||||||
# A list of glob-style patterns that should be excluded when looking for
|
|
||||||
# source files. They are matched against the source file names relative to the
|
|
||||||
# source directory, using slashes as directory separators on all platforms.
|
|
||||||
exclude_patterns = ['']
|
|
||||||
|
|
||||||
# -- Options for HTML output --------------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
|
||||||
# Sphinx are currently 'default' and 'sphinxdoc'.
|
|
||||||
# html_theme_path = ["."]
|
|
||||||
# html_theme = '_theme'
|
|
||||||
# html_static_path = ['static']
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'validations-commondoc'
|
|
||||||
html_theme = 'openstackdocs'
|
|
||||||
|
|
||||||
latex_use_xindy = False
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title, author, documentclass
|
|
||||||
# [howto/manual]).
|
|
||||||
latex_documents = [
|
|
||||||
(
|
|
||||||
'index',
|
|
||||||
'doc-validations-common.tex',
|
|
||||||
'Validations Framework Client Documentation',
|
|
||||||
'OpenStack LLC',
|
|
||||||
'manual'
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Allow deeper levels of nesting for \begin...\end stanzas
|
|
||||||
latex_elements = {'maxlistdepth': 10, 'extraclassoptions': ',openany,oneside'}
|
|
@ -1,6 +0,0 @@
|
|||||||
==================================
|
|
||||||
Contributing to validations-common
|
|
||||||
==================================
|
|
||||||
|
|
||||||
|
|
||||||
.. include:: ../../CONTRIBUTING.rst
|
|
@ -1,25 +0,0 @@
|
|||||||
.. validations-common documentation master file, created by
|
|
||||||
sphinx-quickstart on Tue Jul 9 22:26:36 2013.
|
|
||||||
You can adapt this file completely to your liking, but it should at least
|
|
||||||
contain the root `toctree` directive.
|
|
||||||
|
|
||||||
Welcome to validations-common documentation!
|
|
||||||
============================================
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
readme
|
|
||||||
usage
|
|
||||||
contributing
|
|
||||||
roles
|
|
||||||
modules
|
|
||||||
reference/index
|
|
||||||
|
|
||||||
Indices and tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`search`
|
|
@ -1,9 +0,0 @@
|
|||||||
Documented modules in Validations-Common
|
|
||||||
========================================
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:glob:
|
|
||||||
|
|
||||||
modules/*
|
|
@ -1,14 +0,0 @@
|
|||||||
========================
|
|
||||||
Module - advanced_format
|
|
||||||
========================
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* advanced_format
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/advanced_format.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1,29 +0,0 @@
|
|||||||
==================
|
|
||||||
http_json callback
|
|
||||||
==================
|
|
||||||
|
|
||||||
The callback http_json sends Validations logs and information to an HTTP
|
|
||||||
server as a JSON format in order to get caught and analysed with external
|
|
||||||
tools for log parsing (as Fluentd or others).
|
|
||||||
|
|
||||||
This callback inherits from validation_json the format of the logging
|
|
||||||
remains the same as the other logger that the Validation Framework is using
|
|
||||||
by default.
|
|
||||||
|
|
||||||
To enable this callback, you need to add it to the callback whitelist.
|
|
||||||
Then you need to export your http server url and port.
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
export HTTP_JSON_SERVER=http://localhost
|
|
||||||
export HTTP_JSON_PORT=8989
|
|
||||||
|
|
||||||
The callback will post JSON log to the URL provided.
|
|
||||||
This repository has a simple HTTP server for testing purpose under:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
tools/http_server.py
|
|
||||||
|
|
||||||
The default host and port are localhost and 8989, feel free to adjust those
|
|
||||||
values to your needs.
|
|
@ -1,14 +0,0 @@
|
|||||||
=============================
|
|
||||||
Module - check_package_update
|
|
||||||
=============================
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* check_package_update
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/check_package_update.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1,14 +0,0 @@
|
|||||||
==============
|
|
||||||
Module - hiera
|
|
||||||
==============
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* hiera
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/hiera.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1,14 +0,0 @@
|
|||||||
====================
|
|
||||||
Module - reportentry
|
|
||||||
====================
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* reportentry
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/reportentry.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1,14 +0,0 @@
|
|||||||
=============================
|
|
||||||
Module - validations_read_ini
|
|
||||||
=============================
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* validations_read_ini
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/validations_read_ini.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1,14 +0,0 @@
|
|||||||
=============
|
|
||||||
Module - warn
|
|
||||||
=============
|
|
||||||
|
|
||||||
|
|
||||||
This module provides for the following ansible plugin:
|
|
||||||
|
|
||||||
* warn
|
|
||||||
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:module: validations_common/library/warn.py
|
|
||||||
:documentation: true
|
|
||||||
:examples: true
|
|
@ -1 +0,0 @@
|
|||||||
.. include:: ../../README.rst
|
|
@ -1,8 +0,0 @@
|
|||||||
============================================
|
|
||||||
Full Validations-common Python API Reference
|
|
||||||
============================================
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
api/modules
|
|
@ -1,9 +0,0 @@
|
|||||||
Documented roles in Validations-Common
|
|
||||||
======================================
|
|
||||||
|
|
||||||
Contents:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:glob:
|
|
||||||
|
|
||||||
roles/*
|
|
@ -1,51 +0,0 @@
|
|||||||
============================
|
|
||||||
check_disk_space_pre_upgrade
|
|
||||||
============================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check that the partitioning schema on the host(s) has enough
|
|
||||||
free space to perform an upgrade.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
volumes:
|
|
||||||
- { mount: /home, min_size: 25 }
|
|
||||||
- { mount: /, min_size: 50 }
|
|
||||||
roles:
|
|
||||||
- check_disk_space
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_disk_space
|
|
@ -1,47 +0,0 @@
|
|||||||
================
|
|
||||||
check_rsyslog
|
|
||||||
================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role which detects package presence and running service on the target host
|
|
||||||
and fails if it doesn't find it.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: true
|
|
||||||
roles:
|
|
||||||
- check_rsyslog
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_rsyslog
|
|
@ -1,46 +0,0 @@
|
|||||||
============================
|
|
||||||
advanced_format_512e_support
|
|
||||||
============================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to detect whether the node disks use Advanced Format.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- advanced_format_512e_support
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/advanced_format_512e_support
|
|
@ -1,48 +0,0 @@
|
|||||||
=========
|
|
||||||
check_cpu
|
|
||||||
=========
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check if the Host(s) fit(s) the CPU core requirements
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
minimal_cpu_count: 42
|
|
||||||
roles:
|
|
||||||
- check_cpu
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_cpu
|
|
@ -1,51 +0,0 @@
|
|||||||
================
|
|
||||||
check_disk_space
|
|
||||||
================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check that the partitioning schema on the host(s) has enough
|
|
||||||
free space.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
volumes:
|
|
||||||
- { mount: /home, min_size: 25 }
|
|
||||||
- { mount: /, min_size: 50 }
|
|
||||||
roles:
|
|
||||||
- check_disk_space
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_disk_space
|
|
@ -1,50 +0,0 @@
|
|||||||
=============================
|
|
||||||
check_latest_packages_version
|
|
||||||
=============================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check if latest version of a list of packages is installed.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
packages_list:
|
|
||||||
- coreutils
|
|
||||||
- wget
|
|
||||||
roles:
|
|
||||||
- check_latest_packages_version
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_latest_packages_version
|
|
@ -1,48 +0,0 @@
|
|||||||
=========
|
|
||||||
check_ram
|
|
||||||
=========
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check if the Host(s) fit(s) the RAM requirements.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
minimal_ram_gb: 42
|
|
||||||
roles:
|
|
||||||
- check_ram
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_ram
|
|
@ -1,46 +0,0 @@
|
|||||||
==================
|
|
||||||
check_selinux_mode
|
|
||||||
==================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check SELinux status on the host(s).
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- check_selinux_mode
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:Security**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/check_selinux_mode
|
|
@ -1,48 +0,0 @@
|
|||||||
===
|
|
||||||
dns
|
|
||||||
===
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to verify that the DNS resolution works.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
server_to_lookup: example.com
|
|
||||||
roles:
|
|
||||||
- dns
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/dns
|
|
@ -1,46 +0,0 @@
|
|||||||
=====
|
|
||||||
no_op
|
|
||||||
=====
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
A no-op Ansible role for testing that the validations framework runs.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- no_op
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/no_op
|
|
@ -1,46 +0,0 @@
|
|||||||
===
|
|
||||||
ntp
|
|
||||||
===
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check if the host(s) have their clock synchronized.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- ntp
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/ntp
|
|
@ -1,46 +0,0 @@
|
|||||||
==============
|
|
||||||
service_status
|
|
||||||
==============
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to detect services status on the target host(s).
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- service_status
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/service_status
|
|
@ -1,58 +0,0 @@
|
|||||||
================
|
|
||||||
validate_selinux
|
|
||||||
================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to ensure we don't have any SELinux denials on the host(s).
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
vars:
|
|
||||||
validate_selinux_working_dir: /tmp
|
|
||||||
validate_selinux_audit_source: /var/log/audit/audit.log
|
|
||||||
validate_selinux_skip_list_dest: "{{ validate_selinux_working_dir }}/denials-skip-list.txt"
|
|
||||||
validate_selinux_filtered_denials_dest: "{{ validate_selinux_working_dir }}/denials-filtered.log"
|
|
||||||
validate_selinux_strict: false
|
|
||||||
validate_selinux_filter: "None"
|
|
||||||
validate_selinux_skip_list:
|
|
||||||
- entry: 'tcontext=system_u:system_r:init_t'
|
|
||||||
comment: 'This one is a real-life entry'
|
|
||||||
- entry: 'tcontext=system_u:system_r:system_dbusd_t'
|
|
||||||
comment: 'This one is another real-life entry'
|
|
||||||
roles:
|
|
||||||
- validate_selinux
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/validate_selinux
|
|
@ -1,47 +0,0 @@
|
|||||||
===============
|
|
||||||
xfs_check_ftype
|
|
||||||
===============
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role to check if there is at least 1 XFS volume with ftype=0 in any
|
|
||||||
deployed server(s).
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- xfs_check_ftype
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/xfs_check_ftype
|
|
@ -1,47 +0,0 @@
|
|||||||
================
|
|
||||||
verify-package
|
|
||||||
================
|
|
||||||
|
|
||||||
--------------
|
|
||||||
About The Role
|
|
||||||
--------------
|
|
||||||
|
|
||||||
An Ansible role which runs `rpm --verify` on RedHat OS family and
|
|
||||||
returns the status.
|
|
||||||
|
|
||||||
Requirements
|
|
||||||
============
|
|
||||||
|
|
||||||
No requirements.
|
|
||||||
|
|
||||||
Dependencies
|
|
||||||
============
|
|
||||||
|
|
||||||
No dependencies.
|
|
||||||
|
|
||||||
Example Playbook
|
|
||||||
================
|
|
||||||
|
|
||||||
.. code-block:: yaml
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
gather_facts: false
|
|
||||||
roles:
|
|
||||||
- verify-package
|
|
||||||
|
|
||||||
License
|
|
||||||
=======
|
|
||||||
|
|
||||||
Apache
|
|
||||||
|
|
||||||
Author Information
|
|
||||||
==================
|
|
||||||
|
|
||||||
**Red Hat TripleO DFG:DF Squad:VF**
|
|
||||||
|
|
||||||
----------------
|
|
||||||
Full Description
|
|
||||||
----------------
|
|
||||||
|
|
||||||
.. ansibleautoplugin::
|
|
||||||
:role: validations_common/roles/verify-package
|
|
@ -1,14 +0,0 @@
|
|||||||
=====
|
|
||||||
Usage
|
|
||||||
=====
|
|
||||||
|
|
||||||
Once the validations-common project has been installed,
|
|
||||||
navigate to the chosen share path, usually `/usr/share/ansible`
|
|
||||||
to access the installed roles, playbooks, and libraries.
|
|
||||||
|
|
||||||
While the validations-common can be run by itself,
|
|
||||||
it nonetheless depends on Ansible and validations-libs.
|
|
||||||
Therefore it isn't recommended to use only validations-common.
|
|
||||||
|
|
||||||
The validations included with validations-common are intended to be demonstrations,
|
|
||||||
capable of running on most setups. But they are not meant for production environment.
|
|
@ -1,12 +0,0 @@
|
|||||||
# this is required for the molecule jobs
|
|
||||||
ansible-core<2.12 # GPLv3+
|
|
||||||
ansi2html # LGPLv3+
|
|
||||||
jinja2>=2.8.0 # BSD-3-Clause
|
|
||||||
mock # BSD
|
|
||||||
molecule>=3.3.1,<4 # MIT
|
|
||||||
molecule-podman # MIT
|
|
||||||
pytest # MIT
|
|
||||||
pytest-cov # MIT
|
|
||||||
pytest-html # Mozilla Public License 2.0
|
|
||||||
pytest-xdist # MIT
|
|
||||||
selinux # MIT
|
|
@ -1,101 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: all
|
|
||||||
pre_tasks:
|
|
||||||
- name: Set project path fact
|
|
||||||
set_fact:
|
|
||||||
validations_common_project_path: "{{ ansible_user_dir }}/{{ zuul.projects['opendev.org/openstack/validations-common'].src_dir }}"
|
|
||||||
|
|
||||||
- name: Ensure output dirs
|
|
||||||
file:
|
|
||||||
path: "{{ ansible_user_dir }}/zuul-output/logs"
|
|
||||||
state: directory
|
|
||||||
|
|
||||||
- name: Ensure pip is available
|
|
||||||
include_role:
|
|
||||||
name: ensure-pip
|
|
||||||
|
|
||||||
- name: Ensure virtualenv is available
|
|
||||||
include_role:
|
|
||||||
name: ensure-virtualenv
|
|
||||||
|
|
||||||
- name: Setup bindep
|
|
||||||
pip:
|
|
||||||
name: "bindep"
|
|
||||||
virtualenv: "{{ ansible_user_dir }}/test-python"
|
|
||||||
virtualenv_command: "{{ ensure_pip_virtualenv_command }}"
|
|
||||||
virtualenv_site_packages: true
|
|
||||||
|
|
||||||
- name: Set containers module to 3.0
|
|
||||||
become: true
|
|
||||||
shell: |
|
|
||||||
dnf module disable container-tools:rhel8 -y
|
|
||||||
dnf module enable container-tools:3.0 -y
|
|
||||||
dnf clean metadata
|
|
||||||
|
|
||||||
- name: Run bindep
|
|
||||||
shell: |-
|
|
||||||
. {{ ansible_user_dir }}/test-python/bin/activate
|
|
||||||
{{ validations_common_project_path }}/scripts/bindep-install
|
|
||||||
become: true
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Ensure a recent version of pip is installed in virtualenv
|
|
||||||
pip:
|
|
||||||
name: "pip>=19.1.1"
|
|
||||||
virtualenv: "{{ ansible_user_dir }}/test-python"
|
|
||||||
virtualenv_command: "{{ ensure_pip_virtualenv_command }}"
|
|
||||||
|
|
||||||
- name: Setup test-python
|
|
||||||
pip:
|
|
||||||
requirements: "{{ validations_common_project_path }}/molecule-requirements.txt"
|
|
||||||
virtualenv: "{{ ansible_user_dir }}/test-python"
|
|
||||||
virtualenv_command: "{{ ensure_pip_virtualenv_command }}"
|
|
||||||
virtualenv_site_packages: true
|
|
||||||
|
|
||||||
- name: Set up collections
|
|
||||||
command: "{{ ansible_user_dir }}/test-python/bin/ansible-galaxy install -fr {{ validations_common_project_path }}/ansible-collections-requirements.yml"
|
|
||||||
|
|
||||||
- name: Display test-python virtualenv package versions
|
|
||||||
shell: |-
|
|
||||||
. {{ ansible_user_dir }}/test-python/bin/activate
|
|
||||||
pip freeze
|
|
||||||
|
|
||||||
- name: Basic ci setup
|
|
||||||
become: true
|
|
||||||
block:
|
|
||||||
- name: Ensure ci directories
|
|
||||||
file:
|
|
||||||
path: "/etc/ci"
|
|
||||||
state: "directory"
|
|
||||||
|
|
||||||
- name: Ensure ci mirror file
|
|
||||||
file:
|
|
||||||
path: "/etc/ci/mirror_info.sh"
|
|
||||||
state: "touch"
|
|
||||||
|
|
||||||
- name: Set an appropriate fs.file-max
|
|
||||||
sysctl:
|
|
||||||
name: fs.file-max
|
|
||||||
value: 2048000
|
|
||||||
sysctl_set: true
|
|
||||||
state: present
|
|
||||||
reload: true
|
|
||||||
|
|
||||||
- name: Set container_manage_cgroup boolean
|
|
||||||
seboolean:
|
|
||||||
name: container_manage_cgroup
|
|
||||||
state: true
|
|
||||||
persistent: true
|
|
||||||
failed_when: false
|
|
||||||
|
|
||||||
- name: Create limits file for containers
|
|
||||||
copy:
|
|
||||||
content: |
|
|
||||||
* soft nofile 102400
|
|
||||||
* hard nofile 204800
|
|
||||||
* soft nproc 2048
|
|
||||||
* hard nproc 4096
|
|
||||||
dest: /etc/security/limits.d/containers.conf
|
|
||||||
|
|
||||||
- name: Reset ssh connection
|
|
||||||
meta: reset_connection
|
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: all
|
|
||||||
tasks:
|
|
||||||
- name: set basic zuul fact
|
|
||||||
set_fact:
|
|
||||||
zuul:
|
|
||||||
projects:
|
|
||||||
"opendev.org/openstack/validations-common":
|
|
||||||
src_dir: "{{ tripleo_src }}"
|
|
||||||
ansible_connection: ssh
|
|
||||||
|
|
||||||
- import_playbook: pre.yml
|
|
||||||
|
|
||||||
- import_playbook: run.yml
|
|
@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: all
|
|
||||||
environment:
|
|
||||||
ANSIBLE_LOG_PATH: "{{ ansible_user_dir }}/zuul-output/logs/ansible-execution.log"
|
|
||||||
pre_tasks:
|
|
||||||
|
|
||||||
- name: Set project path fact
|
|
||||||
set_fact:
|
|
||||||
validations_common_project_path: "{{ ansible_user_dir }}/{{ zuul.projects['opendev.org/openstack/validations-common'].src_dir }}"
|
|
||||||
|
|
||||||
- name: Set roles path fact
|
|
||||||
set_fact:
|
|
||||||
validations_common_roles_paths:
|
|
||||||
- "{{ validations_common_project_path }}/validations_common/roles"
|
|
||||||
- "/usr/share/ansible/roles"
|
|
||||||
|
|
||||||
- name: Set library path fact
|
|
||||||
set_fact:
|
|
||||||
validations_common_library_paths:
|
|
||||||
- "{{ validations_common_project_path }}/validations_common/library"
|
|
||||||
- "/usr/share/ansible/library"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Run role test job
|
|
||||||
shell: |-
|
|
||||||
. {{ ansible_user_dir }}/test-python/bin/activate
|
|
||||||
. {{ validations_common_project_path }}/ansible-test-env.rc
|
|
||||||
pytest --color=yes \
|
|
||||||
--html={{ ansible_user_dir }}/zuul-output/logs/reports.html \
|
|
||||||
--self-contained-html \
|
|
||||||
--ansible-args='{{ tripleo_job_ansible_args | default("") }}' \
|
|
||||||
{{ validations_common_project_path }}/tests/test_molecule.py
|
|
||||||
args:
|
|
||||||
chdir:
|
|
||||||
"{{ validations_common_project_path }}/validations_common/roles/{{ validations_common_role_name }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
environment:
|
|
||||||
ANSIBLE_ROLES_PATH: "{{ validations_common_roles_paths | join(':') }}"
|
|
||||||
ANSIBLE_LIBRARY: "{{ validations_common_library_paths | join(':') }}"
|
|
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: all
|
|
||||||
vars:
|
|
||||||
tox_envlist: functional
|
|
||||||
roles:
|
|
||||||
- fetch-subunit-output
|
|
||||||
- fetch-devstack-log-dir
|
|
||||||
- fetch-output
|
|
||||||
- fetch_validations
|
|
||||||
- fetch-python-sdist-output
|
|
@ -1,44 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: all
|
|
||||||
name: validations-common-reqcheck
|
|
||||||
vars:
|
|
||||||
req_check_override: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}/.reqcheck_override.yaml"
|
|
||||||
tasks:
|
|
||||||
- name: Install rdopkg
|
|
||||||
changed_when: true
|
|
||||||
shell:
|
|
||||||
cmd: |
|
|
||||||
set -e
|
|
||||||
# Need to inherit system-site-packages for python-yum
|
|
||||||
python3 -m venv --system-site-packages {{ ansible_user_dir }}/.venv
|
|
||||||
source {{ ansible_user_dir }}/.venv/bin/activate
|
|
||||||
git clone https://github.com/softwarefactory-project/rdopkg.git
|
|
||||||
cd rdopkg
|
|
||||||
pip install .
|
|
||||||
args:
|
|
||||||
chdir: "{{ ansible_user_dir }}"
|
|
||||||
|
|
||||||
- name: Get distgit project info
|
|
||||||
changed_when: true
|
|
||||||
shell:
|
|
||||||
cmd: |
|
|
||||||
set -e
|
|
||||||
source {{ ansible_user_dir }}/.venv/bin/activate
|
|
||||||
rdopkg findpkg {{ zuul.project.name }} | sed -n "/^distgit/ s/distgit. \(.*\)/\1/p"
|
|
||||||
register: distgit
|
|
||||||
args:
|
|
||||||
chdir: "{{ ansible_user_dir }}"
|
|
||||||
|
|
||||||
- name: Clone distgit and reqcheck {{ zuul.project.name }} with rdopkg
|
|
||||||
changed_when: true
|
|
||||||
shell:
|
|
||||||
cmd: |
|
|
||||||
set -e
|
|
||||||
source {{ ansible_user_dir }}/.venv/bin/activate
|
|
||||||
git clone {{ distgit.stdout }}
|
|
||||||
cd validations-common-distgit
|
|
||||||
git remote add upstream {{ ansible_user_dir }}/{{ zuul.project.src_dir }}
|
|
||||||
git fetch upstream
|
|
||||||
rdopkg reqcheck --strict --override {{ req_check_override }}
|
|
||||||
args:
|
|
||||||
chdir: "{{ ansible_user_dir }}"
|
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
- hosts: tempest
|
|
||||||
name: validations-common-functional
|
|
||||||
roles:
|
|
||||||
- ensure-tox
|
|
||||||
- ensure-pip
|
|
||||||
- ensure-virtualenv
|
|
||||||
- role: ensure-if-python
|
|
||||||
vars:
|
|
||||||
zuul_work_dir: "src/opendev.org/openstack/validations-libs"
|
|
||||||
- role: ensure-if-python
|
|
||||||
vars:
|
|
||||||
zuul_work_dir: "src/opendev.org/openstack/validations-common"
|
|
||||||
- role: validations
|
|
@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
upgrade:
|
|
||||||
- |
|
|
||||||
Python 3.6 & 3.7 support has been dropped. The minimum version of Python now
|
|
||||||
supported is Python 3.8.
|
|
@ -1,6 +0,0 @@
|
|||||||
========================
|
|
||||||
1.6 Series Release Notes
|
|
||||||
========================
|
|
||||||
|
|
||||||
.. release-notes::
|
|
||||||
:branch: stable/1.6
|
|
@ -1,321 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
#
|
|
||||||
# flake8: noqa
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
#
|
|
||||||
# import os
|
|
||||||
# import sys
|
|
||||||
# sys.path.insert(0, os.path.abspath('.'))
|
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
|
||||||
|
|
||||||
# If your documentation needs a minimal Sphinx version, state it here.
|
|
||||||
#
|
|
||||||
# needs_sphinx = '1.0'
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
||||||
# ones.
|
|
||||||
extensions = [
|
|
||||||
'openstackdocstheme',
|
|
||||||
'reno.sphinxext',
|
|
||||||
]
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix(es) of source filenames.
|
|
||||||
# You can specify multiple suffix as a list of string:
|
|
||||||
#
|
|
||||||
# source_suffix = ['.rst', '.md']
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#
|
|
||||||
# source_encoding = 'utf-8-sig'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
authors = 'Validations Framework Developers'
|
|
||||||
project = 'validations-common Release Notes'
|
|
||||||
copyright = '2020, ' + authors
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
#
|
|
||||||
# This is also used if you do content translation via gettext catalogs.
|
|
||||||
# Usually you set "language" from the command line for these cases.
|
|
||||||
# language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#
|
|
||||||
# today = ''
|
|
||||||
#
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#
|
|
||||||
# today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of patterns, relative to source directory, that match files and
|
|
||||||
# directories to ignore when looking for source files.
|
|
||||||
# This patterns also effect to html_static_path and html_extra_path
|
|
||||||
exclude_patterns = []
|
|
||||||
|
|
||||||
# The reST default role (used for this markup: `text`) to use for all
|
|
||||||
# documents.
|
|
||||||
#
|
|
||||||
# default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#
|
|
||||||
# add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#
|
|
||||||
# add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
#
|
|
||||||
# show_authors = False
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'native'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
# modindex_common_prefix = []
|
|
||||||
|
|
||||||
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
||||||
# keep_warnings = False
|
|
||||||
|
|
||||||
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
|
||||||
# todo_include_todos = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output ----------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
||||||
# a list of builtin themes.
|
|
||||||
#
|
|
||||||
html_theme = 'openstackdocs'
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
#
|
|
||||||
# html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
#html_theme_path = []
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents.
|
|
||||||
# "<project> v<release> documentation" by default.
|
|
||||||
#
|
|
||||||
# html_title = 'validations-common v1.0'
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#
|
|
||||||
# html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#
|
|
||||||
# html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to use as a favicon of
|
|
||||||
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#
|
|
||||||
# html_favicon = None
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
html_static_path = ['_static']
|
|
||||||
|
|
||||||
# Add any extra paths that contain custom files (such as robots.txt or
|
|
||||||
# .htaccess) here, relative to this directory. These files are copied
|
|
||||||
# directly to the root of the documentation.
|
|
||||||
#
|
|
||||||
# html_extra_path = []
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
#
|
|
||||||
# html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#
|
|
||||||
# html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#
|
|
||||||
# html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# html_domain_indices = True
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
#html_use_index = True
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#
|
|
||||||
# html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#
|
|
||||||
# html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
||||||
#
|
|
||||||
# html_show_sphinx = True
|
|
||||||
|
|
||||||
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
||||||
#
|
|
||||||
# html_show_copyright = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#
|
|
||||||
# html_use_opensearch = ''
|
|
||||||
|
|
||||||
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
# html_file_suffix = None
|
|
||||||
|
|
||||||
# Language to be used for generating the HTML full-text search index.
|
|
||||||
# Sphinx supports the following languages:
|
|
||||||
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
|
|
||||||
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
|
|
||||||
#
|
|
||||||
# html_search_language = 'en'
|
|
||||||
|
|
||||||
# A dictionary with options for the search language support, empty by default.
|
|
||||||
# 'ja' uses this config value.
|
|
||||||
# 'zh' user can custom change `jieba` dictionary path.
|
|
||||||
#
|
|
||||||
# html_search_options = {'type': 'default'}
|
|
||||||
|
|
||||||
# The name of a javascript file (relative to the configuration directory) that
|
|
||||||
# implements a search results scorer. If empty, the default will be used.
|
|
||||||
#
|
|
||||||
# html_search_scorer = 'scorer.js'
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'validations-commonReleaseNotesdoc'
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ---------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title,
|
|
||||||
# author, documentclass [howto, manual, or own class]).
|
|
||||||
latex_documents = [
|
|
||||||
(master_doc, 'validations-commonReleaseNotes.tex',
|
|
||||||
'validations-common Release Notes Documentation',
|
|
||||||
authors, 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#
|
|
||||||
# latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#
|
|
||||||
# latex_use_parts = False
|
|
||||||
|
|
||||||
# If true, show page references after internal links.
|
|
||||||
#
|
|
||||||
# latex_show_pagerefs = False
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#
|
|
||||||
# latex_show_urls = False
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#
|
|
||||||
# latex_appendices = []
|
|
||||||
|
|
||||||
# It false, will not define \strong, \code, itleref, \crossref ... but only
|
|
||||||
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
|
|
||||||
# packages.
|
|
||||||
#
|
|
||||||
# latex_keep_old_macro_names = True
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# latex_domain_indices = True
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for manual page output ---------------------------------------
|
|
||||||
|
|
||||||
# One entry per manual page. List of tuples
|
|
||||||
# (source start file, name, description, authors, manual section).
|
|
||||||
man_pages = [
|
|
||||||
(master_doc, 'validations-commonreleasenotes',
|
|
||||||
'validations-common Release Notes Documentation',
|
|
||||||
[authors], 1)
|
|
||||||
]
|
|
||||||
|
|
||||||
# If true, show URL addresses after external links.
|
|
||||||
#
|
|
||||||
# man_show_urls = False
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for Texinfo output -------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree into Texinfo files. List of tuples
|
|
||||||
# (source start file, target name, title, author,
|
|
||||||
# dir menu entry, description, category)
|
|
||||||
texinfo_documents = [
|
|
||||||
(master_doc, 'validations-commonReleaseNotes',
|
|
||||||
'validations-common Release Notes Documentation',
|
|
||||||
authors, 'validations-commonReleaseNotes',
|
|
||||||
'A collection of Ansible playbooks to detect and report potential issues during TripleO deployments.',
|
|
||||||
'Miscellaneous'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#
|
|
||||||
# texinfo_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#
|
|
||||||
# texinfo_domain_indices = True
|
|
||||||
|
|
||||||
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
||||||
#
|
|
||||||
# texinfo_show_urls = 'footnote'
|
|
||||||
|
|
||||||
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
||||||
#
|
|
||||||
# texinfo_no_detailmenu = False
|
|
||||||
|
|
||||||
# -- Options for Internationalization output ------------------------------
|
|
||||||
locale_dirs = ['locale/']
|
|
||||||
|
|
||||||
# openstackdocstheme options
|
|
||||||
repository_name = 'openstack/validations-common'
|
|
||||||
bug_project = 'tripleo'
|
|
||||||
bug_tag = 'documentation'
|
|
@ -1,19 +0,0 @@
|
|||||||
=============================================
|
|
||||||
Welcome to validations-common' Release Notes!
|
|
||||||
=============================================
|
|
||||||
|
|
||||||
Contents
|
|
||||||
========
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
unreleased
|
|
||||||
1.6
|
|
||||||
ussuri
|
|
||||||
|
|
||||||
Indices and tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`search`
|
|
@ -1,5 +0,0 @@
|
|||||||
==============================
|
|
||||||
Current Series Release Notes
|
|
||||||
==============================
|
|
||||||
|
|
||||||
.. release-notes::
|
|
@ -1,6 +0,0 @@
|
|||||||
===========================
|
|
||||||
Ussuri Series Release Notes
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. release-notes::
|
|
||||||
:branch: stable/ussuri
|
|
@ -1,7 +0,0 @@
|
|||||||
# The order of packages is significant, because pip processes them in the order
|
|
||||||
# of appearance. Changing the order has an impact on the overall integration
|
|
||||||
# process, which may cause wedges in the gate later.
|
|
||||||
|
|
||||||
pbr>=3.1.1 # Apache-2.0
|
|
||||||
PyYAML>=3.13 # MIT
|
|
||||||
PrettyTable>=0.7.2 # BSD-3-Clause
|
|
@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
src_dir: "{{ zuul.project.src_dir }}"
|
|
||||||
output_dir: "{{ ansible_user_dir }}"
|
|
||||||
log_path: "{{ zuul.executor.log_root }}"
|
|
||||||
artifacts_dir: "{{ zuul.executor.work_root }}/artifacts"
|
|
@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Ensure local output dirs
|
|
||||||
delegate_to: localhost
|
|
||||||
file:
|
|
||||||
path: "{{ vf_output_dir }}"
|
|
||||||
state: directory
|
|
||||||
with_items:
|
|
||||||
- "{{ log_path }}/validations-logs"
|
|
||||||
- "{{ artifacts_dir }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: vf_output_dir
|
|
||||||
|
|
||||||
# TODO(jpodivin):
|
|
||||||
# This is a temporary construct to bridge the time span
|
|
||||||
# when new log path handling is being tested but isn't merged yet
|
|
||||||
- name: Discover new log dir
|
|
||||||
stat:
|
|
||||||
path: "{{ output_dir }}/validations"
|
|
||||||
register: new_log_dir
|
|
||||||
|
|
||||||
- name: Set log dir
|
|
||||||
set_fact:
|
|
||||||
available_log_dir: "{{'validations' if new_log_dir.stat.exists else 'artifacts'}}"
|
|
||||||
# End of the temporary construct
|
|
||||||
|
|
||||||
- name: Collect logs and artifacts
|
|
||||||
synchronize:
|
|
||||||
dest: "{{ log_path }}/validations-logs/"
|
|
||||||
mode: pull
|
|
||||||
src: "{{ output_dir }}/{{ available_log_dir }}/"
|
|
||||||
verify_host: true
|
|
||||||
owner: false
|
|
||||||
group: false
|
|
||||||
|
|
||||||
- name: Find validations data
|
|
||||||
find:
|
|
||||||
paths: "{{ output_dir }}"
|
|
||||||
patterns: "*.json,*.log,*.yaml"
|
|
||||||
register: validation_json
|
|
||||||
|
|
||||||
- name: Collect Validation logs
|
|
||||||
synchronize:
|
|
||||||
dest: "{{ log_path }}/validations-logs/"
|
|
||||||
mode: pull
|
|
||||||
src: "{{ logs.path }}"
|
|
||||||
verify_host: true
|
|
||||||
owner: false
|
|
||||||
group: false
|
|
||||||
loop: "{{ validation_json.files }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: logs
|
|
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
user_dir: "{{ ansible_env.HOME | default('') }}"
|
|
||||||
val_working_dir: "{{ ansible_env.HOME | default('') }}"
|
|
||||||
zuul_work_virtualenv: "{{ user_dir }}/.venv"
|
|
||||||
vf_log_dir: "{{ ansible_user_dir }}/logs"
|
|
||||||
ansible_dir: ""
|
|
||||||
|
|
||||||
inventory: ""
|
|
||||||
inventory_list:
|
|
||||||
- '{{ user_dir }}/tripleo-deploy/overcloud/tripleo-ansible-inventory.yaml'
|
|
||||||
- '{{ user_dir }}/tripleo-deploy/undercloud/tripleo-ansible-inventory.yaml'
|
|
||||||
- '{{ user_dir }}/tripleo-deploy/tripleo-ansible-inventory.yaml'
|
|
||||||
|
|
||||||
validation_component: "{{ job.component|default('validation') }}"
|
|
||||||
# both commands can be used:
|
|
||||||
# "openstack tripleo validator" or "validation"
|
|
||||||
# the default is validation because this is the 1st entry available on
|
|
||||||
# a system for validation.
|
|
||||||
# The openstack command needs to install python-tripleoclient and its
|
|
||||||
# dependencies first. This value should be override as needed in the roles/vars
|
|
||||||
# calls.
|
|
||||||
cli_command: "validation"
|
|
||||||
run_validation: true
|
|
||||||
execute_full_vf_catalogue: "{{ job.execute_full_vf_catalogue|default(false)|bool }}"
|
|
||||||
vf_catalogue_overrides: "{{ ansible_user_dir }}/catalog_vars_override.yaml"
|
|
||||||
files_to_run_dest: "{{ ansible_user_dir }}"
|
|
||||||
files_test_failure: false
|
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
# LP#1959864
|
|
||||||
volumes:
|
|
||||||
- {mount: /var/lib/docker, min_size: 10}
|
|
||||||
- {mount: /var/lib/config-data, min_size: 3}
|
|
||||||
- {mount: /var/log, min_size: 3}
|
|
||||||
- {mount: /usr, min_size: 5}
|
|
||||||
- {mount: /var, min_size: 8}
|
|
||||||
- {mount: /, min_size: 8}
|
|
||||||
|
|
||||||
minimal_ram_gb: 2
|
|
||||||
|
|
||||||
# LP#1987506
|
|
||||||
minimal_cpu_count: 4
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
# Execute entire Validations Framework catalogue as provided
|
|
||||||
# by the validations-common and tripleo-validations packages.
|
|
||||||
# This task is intended to be used only by the RDO CI component pipeline.
|
|
||||||
# Executing it anywhere else might lead to unforseen consequences.
|
|
||||||
- name: Run validations catalogue
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} run --validation {{ validation_catalogue.full_list | join(",") }}
|
|
||||||
{{ validation_dir_arg }} {{ ansible_dir_arg }}
|
|
||||||
--inventory {{ inventory }}
|
|
||||||
--output-log validation_catalogue_execution.log
|
|
||||||
{{ validation_catalogue.extra_args }}
|
|
||||||
{{ validation_catalogue.extra_env_args }}
|
|
||||||
--extra-vars-file={{ vf_catalogue_overrides }}
|
|
||||||
executable: /bin/bash
|
|
@ -1,118 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Run validations from the YAML file
|
|
||||||
vars:
|
|
||||||
file_wrong_path: foo/bar.yaml
|
|
||||||
junitxml_path: /home/stack/logs
|
|
||||||
junitxml_wrong_path: /foo/bar
|
|
||||||
wrong_path_string: must be properly formatted
|
|
||||||
wrong_directory_string: No such file or directory
|
|
||||||
junitxml_missing_string: junitxml output disabled
|
|
||||||
validation_failed_string: have failed
|
|
||||||
validation_not_found_string: Following validations were not found
|
|
||||||
no_validation_run_string: No validation has been run
|
|
||||||
expected_result: 1
|
|
||||||
block:
|
|
||||||
- debug:
|
|
||||||
msg: "{{ item }}"
|
|
||||||
loop: "{{ files }}"
|
|
||||||
|
|
||||||
- name: Execute the file command
|
|
||||||
block:
|
|
||||||
- name: Passed validation test
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[0] }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when: "{{ run_results.rc }} == 1"
|
|
||||||
|
|
||||||
- name: Failed validation test
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[3] }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when: run_results.rc != expected_result
|
|
||||||
|
|
||||||
- name: Run with no executed validation
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[1] }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when:
|
|
||||||
- run_results.rc != expected_result
|
|
||||||
|
|
||||||
- name: Run with non-existent validation
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[2] }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when:
|
|
||||||
- validation_not_found_string not in run_results.stdout
|
|
||||||
- validation_not_found_string not in run_results.stderr
|
|
||||||
|
|
||||||
- name: Execute the file command with wrong path
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ file_wrong_path }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when:
|
|
||||||
- wrong_path_string not in run_results.stdout
|
|
||||||
- wrong_path_string not in run_results.stderr
|
|
||||||
|
|
||||||
- name: Execute the file command with junitxml output
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[0] }} --junitxml {{ junitxml_path }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when:
|
|
||||||
- wrong_directory_string in run_results.stdout
|
|
||||||
- junitxml_missing_string not in run_results.stdout
|
|
||||||
- wrong_directory_string in run_results.stderr
|
|
||||||
- junitxml_missing_string not in run_results.stderr
|
|
||||||
- "{{ run_results.rc }} == 1"
|
|
||||||
|
|
||||||
- name: Execute the file command with wrong Junitxml path
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} file {{ files[0] }} --junitxml {{ junitxml_wrong_path }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- set_fact:
|
|
||||||
files_test_failure: true
|
|
||||||
when:
|
|
||||||
- wrong_directory_string in run_results.stdout
|
|
||||||
- junitxml_missing_string not in run_results.stdout
|
|
||||||
- wrong_directory_string in run_results.stderr
|
|
||||||
- junitxml_missing_string not in run_results.stderr
|
|
||||||
- "{{ run_results.rc }} == 1"
|
|
@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
- name: List Validations - all - to file
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} list {{ validation_dir_arg }} -f json > {{ val_working_dir }}/list.log 2>&1"
|
|
||||||
executable: /bin/bash
|
|
||||||
when: val_format == "json"
|
|
||||||
|
|
||||||
- name: List Validations - all - to stdout - {{ val_format }}
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} list {{ validation_dir_arg }} -f {{ val_format }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
# Metadata dependent list output
|
|
||||||
- name: List Validations - group - to stdout - {{ val_format }}
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} list {{ validation_dir_arg }} --group {{ val_group }} -f {{ val_format }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
loop: "{{ validation_metadata.group }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: val_group
|
|
||||||
|
|
||||||
- name: " List Validations - category - to stdout - {{ val_format }} "
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} list {{ validation_dir_arg }} --category {{ val_category }} -f {{ val_format }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
loop: "{{ validation_metadata.category }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: val_category
|
|
||||||
|
|
||||||
- name: "List Validations - product - to stdout - {{ val_format }}"
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} list {{ validation_dir_arg }} --product {{ val_product }} -f {{ val_format }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
loop: "{{ validation_metadata.product }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: val_product
|
|
@ -1,52 +0,0 @@
|
|||||||
---
|
|
||||||
# The subcommand used is 'show history' but it is implemented
|
|
||||||
# as a subclass of Lister and it formats the results as such.
|
|
||||||
# Both tests use regex to keep only lines starting with UUID[1].
|
|
||||||
# As every validation run has UUID assigned and the 'value' output format
|
|
||||||
# places it's octal form in the first column, it is possible to use it to
|
|
||||||
# match only records about validation runs, and remove the rest.
|
|
||||||
# [1]https://datatracker.ietf.org/doc/html/rfc4122#section-4.1
|
|
||||||
- name: List all history
|
|
||||||
register: list_all_history_output
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} {{ history_command }} -f value 2>&1
|
|
||||||
| grep "^[[:alnum:]]\{8\}-[[:alnum:]]\{4\}-[[:alnum:]]\{4\}-[[:alnum:]]\{4\}-[[:alnum:]]\{12\}"
|
|
||||||
| tee {{ val_working_dir }}/full_validation_history.log
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: List truncated history
|
|
||||||
register: list_truncated_history_output
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} {{ history_command }} --limit 1 -f value 2>&1
|
|
||||||
| grep "^[[:alnum:]]\{8\}-[[:alnum:]]\{4\}-[[:alnum:]]\{4\}-[[:alnum:]]\{4\}-[[:alnum:]]\{12\}"
|
|
||||||
| tee {{ val_working_dir }}/truncated_validation_history.log
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Verify history output
|
|
||||||
block:
|
|
||||||
# To ensure that we are getting the right number of validation runs
|
|
||||||
# we are querying the relevant item of the 'validations_list', for the number of 'extra_args' entries.
|
|
||||||
# As all validations defined in the 'validations_list' have 'extra_args' defined for both normal,
|
|
||||||
# and false positive run, we can use the number of 'extra_args' keys as an indication
|
|
||||||
# of the validations runs that were supposed to occur.
|
|
||||||
# Please note that this assertion will not hold, if the format of the default_vars changes substantially.
|
|
||||||
- name: Verify full history output
|
|
||||||
fail:
|
|
||||||
msg: >
|
|
||||||
The history output length {{ list_all_history_output.stdout_lines | length }}
|
|
||||||
doesn't match the number of expected validations runs {{ expected_history_length }}.
|
|
||||||
when: (list_all_history_output.stdout_lines | length) != (expected_history_length | int)
|
|
||||||
vars:
|
|
||||||
expected_history_length: "{{ validations_list[validation_component] | string | regex_findall('extra_args') | length }}"
|
|
||||||
|
|
||||||
- name: Verify truncated history output
|
|
||||||
fail:
|
|
||||||
msg: >
|
|
||||||
The number of history items displayed is {{ list_truncated_history_output.stdout_lines | length }}
|
|
||||||
but it should be 1.
|
|
||||||
when: (list_truncated_history_output.stdout_lines | length) != 1
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
@ -1,230 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Remove user local log dir to ensure clean env
|
|
||||||
become: true
|
|
||||||
file:
|
|
||||||
path: "{{ ansible_user_dir }}/validations"
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Recreate user local log dir
|
|
||||||
become: true
|
|
||||||
file:
|
|
||||||
path: "{{ ansible_user_dir }}/validations"
|
|
||||||
state: directory
|
|
||||||
mode: "0755"
|
|
||||||
owner: "{{ ansible_user }}"
|
|
||||||
group: "{{ ansible_user }}"
|
|
||||||
recurse: true
|
|
||||||
|
|
||||||
- name: Ensure validations Log dir exists
|
|
||||||
become: true
|
|
||||||
file:
|
|
||||||
path: "{{ vf_log_dir }}"
|
|
||||||
state: directory
|
|
||||||
mode: "0755"
|
|
||||||
owner: "{{ ansible_user }}"
|
|
||||||
group: "{{ ansible_user }}"
|
|
||||||
recurse: true
|
|
||||||
|
|
||||||
- name: check if virtualenv is used
|
|
||||||
register: is_virtualenv
|
|
||||||
stat:
|
|
||||||
path: "{{ zuul_work_virtualenv }}"
|
|
||||||
|
|
||||||
- name: Set commmand if virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
validation_command: "source {{ zuul_work_virtualenv }}/bin/activate; {{ cli_command }}"
|
|
||||||
when:
|
|
||||||
- is_virtualenv.stat.exists
|
|
||||||
- validation_command is not defined
|
|
||||||
|
|
||||||
- name: Set Validation directory if virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
validation_dir: "{{ zuul_work_virtualenv }}/share/ansible/validation-playbooks"
|
|
||||||
when: is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set Validation directory argument if virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
validation_dir_arg: "--validation-dir {{ validation_dir }}"
|
|
||||||
when: is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set Ansible base directory path if virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
ansible_dir: "{{ zuul_work_virtualenv }}/share/ansible/"
|
|
||||||
when: is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set Ansible base directory argument if virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
ansible_dir_arg: "--ansible-base-dir {{ ansible_dir }}"
|
|
||||||
when: is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set commmand without virtualenv
|
|
||||||
set_fact:
|
|
||||||
validation_command: "{{ cli_command }}"
|
|
||||||
when:
|
|
||||||
- not is_virtualenv.stat.exists
|
|
||||||
- validation_command is not defined
|
|
||||||
|
|
||||||
- name: Set validation dir without virtualenv
|
|
||||||
set_fact:
|
|
||||||
validation_dir: "/usr/share/ansible/validation-playbooks"
|
|
||||||
when: not is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set validation dir argument without virtualenv
|
|
||||||
set_fact:
|
|
||||||
validation_dir_arg: "--validation-dir {{ validation_dir }}"
|
|
||||||
when: not is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set Ansible base directory path withnout virtualenv
|
|
||||||
set_fact:
|
|
||||||
ansible_dir: "/usr/share/ansible/"
|
|
||||||
when: not is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set Ansible base directory argument withnout virtualenv exists
|
|
||||||
set_fact:
|
|
||||||
ansible_dir_arg: "--ansible-base-dir {{ ansible_dir }}"
|
|
||||||
when: not is_virtualenv.stat.exists
|
|
||||||
|
|
||||||
- name: Set a valid inventory
|
|
||||||
block:
|
|
||||||
- name: Stat all possible inventory location
|
|
||||||
register: stat_results
|
|
||||||
stat:
|
|
||||||
path: '{{ inv_path }}'
|
|
||||||
loop: '{{ inventory_list }}'
|
|
||||||
loop_control:
|
|
||||||
loop_var: inv_path
|
|
||||||
|
|
||||||
- name: Set inventory path or fallback to default localhost
|
|
||||||
set_fact:
|
|
||||||
inventory_path: '{{ stat_result.inv_path }}'
|
|
||||||
when:
|
|
||||||
- '{{ stat_result.stat.exists }}'
|
|
||||||
loop: '{{ stat_results.results }}'
|
|
||||||
loop_control:
|
|
||||||
loop_var: stat_result
|
|
||||||
|
|
||||||
- name: Set inventory variable
|
|
||||||
set_fact:
|
|
||||||
inventory: '{{ inventory_path|default("localhost") }}'
|
|
||||||
when: inventory == ""
|
|
||||||
|
|
||||||
- name: Run positive validation tests
|
|
||||||
include_tasks: run.yaml
|
|
||||||
vars:
|
|
||||||
name: "{{ item }}"
|
|
||||||
expected_rc: 0
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
||||||
with_dict: "{{ validations_list[validation_component] }}"
|
|
||||||
|
|
||||||
- name: Fail if something went wrong
|
|
||||||
fail:
|
|
||||||
msg: "One or more Validations has failed, check the log results for more information."
|
|
||||||
when: result_failed | default(False) | bool
|
|
||||||
|
|
||||||
- name: Run negative validation tests
|
|
||||||
include_tasks: run.yaml
|
|
||||||
vars:
|
|
||||||
name: "{{ item }}"
|
|
||||||
expected_rc: 1
|
|
||||||
negative: true
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
||||||
with_dict: "{{ validations_list[validation_component] }}"
|
|
||||||
|
|
||||||
- name: Fail if something went wrong
|
|
||||||
fail:
|
|
||||||
msg: "One or more Validations has failed, check the log results for more information."
|
|
||||||
when: result_failed | default(False) | bool
|
|
||||||
|
|
||||||
- name: List validations
|
|
||||||
include_tasks: list.yaml
|
|
||||||
vars:
|
|
||||||
val_format: "{{ tested_format }}"
|
|
||||||
loop: "{{ validation_list_formats }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: tested_format
|
|
||||||
|
|
||||||
- name: Show validation run results
|
|
||||||
include_tasks: show_results.yaml
|
|
||||||
vars:
|
|
||||||
name: "{{ item }}"
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
||||||
with_dict: "{{ validations_list[validation_component] }}"
|
|
||||||
|
|
||||||
- name: Show validation
|
|
||||||
include_tasks: show_validation_info.yaml
|
|
||||||
vars:
|
|
||||||
name: "{{ item }}"
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
||||||
with_dict: "{{ validations_list[validation_component] }}"
|
|
||||||
|
|
||||||
- name: List history
|
|
||||||
include_tasks: list_validation_history.yaml
|
|
||||||
vars:
|
|
||||||
history_command: "{{'show history' if validation_command == 'openstack tripleo validator' else 'history list'}}"
|
|
||||||
|
|
||||||
- name: Run validations with extra vars file
|
|
||||||
include_tasks: run_extra_vars_file.yaml
|
|
||||||
vars:
|
|
||||||
name: "{{ item }}"
|
|
||||||
extra_vars_uuid: "{{ 'extra vars for tests' | to_uuid }}"
|
|
||||||
when:
|
|
||||||
- run_validation|default(false)|bool
|
|
||||||
- validation_component | length > 0
|
|
||||||
with_dict: "{{ validations_list[validation_component] }}"
|
|
||||||
|
|
||||||
- name: Import variable overrides
|
|
||||||
become: true
|
|
||||||
copy:
|
|
||||||
src: files/catalog_vars_override.yaml
|
|
||||||
dest: "{{ vf_catalogue_overrides }}"
|
|
||||||
mode: "0644"
|
|
||||||
owner: "{{ ansible_user }}"
|
|
||||||
group: "{{ ansible_user }}"
|
|
||||||
|
|
||||||
- name: Execute entire validations catalogue
|
|
||||||
include_tasks: execute_full_catalogue.yaml
|
|
||||||
when: execute_full_vf_catalogue
|
|
||||||
|
|
||||||
- debug:
|
|
||||||
msg: "{{ item }}"
|
|
||||||
loop: "{{ test_arguments_run_from_file }}"
|
|
||||||
|
|
||||||
- name: Check if the File command is present
|
|
||||||
register: subcommand_list
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} --help
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Execute the file command tests
|
|
||||||
block:
|
|
||||||
- name: Copy files to run
|
|
||||||
template:
|
|
||||||
src: './templates/file-template.j2'
|
|
||||||
dest: rendered_file_{{ ansible_loop.index }}.yaml
|
|
||||||
mode: "0644"
|
|
||||||
owner: "{{ ansible_user }}"
|
|
||||||
group: "{{ ansible_user }}"
|
|
||||||
loop: "{{ test_arguments_run_from_file }}"
|
|
||||||
loop_control:
|
|
||||||
extended: true
|
|
||||||
register: rendered_files
|
|
||||||
|
|
||||||
- name: Run validations from the File
|
|
||||||
include_tasks: file.yaml
|
|
||||||
vars:
|
|
||||||
files: "{{ rendered_files.results | map(attribute='dest') | list }}"
|
|
||||||
when: "'Include and exclude validations by' in subcommand_list.stdout"
|
|
||||||
|
|
||||||
- name: Fail if something went wrong
|
|
||||||
fail:
|
|
||||||
msg: "One or more file runs have failed, check the log results for more information."
|
|
||||||
when: files_test_failure | default(False) | bool and "'file' in subcommand_list.stdout"
|
|
@ -1,29 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Run validations
|
|
||||||
block:
|
|
||||||
- name: Set fact for extra args.
|
|
||||||
set_fact:
|
|
||||||
execution_extra_args: "{{ name.value.negative_results.extra_args | default('') }}"
|
|
||||||
when:
|
|
||||||
- "'negative_results' in name.value "
|
|
||||||
- negative | default(False) | bool
|
|
||||||
|
|
||||||
- name: Execute Validations {{ name.key }}
|
|
||||||
ignore_errors: true
|
|
||||||
register: run_results
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} run --validation {{ name.key }}
|
|
||||||
{{ validation_dir_arg }} {{ ansible_dir_arg }}
|
|
||||||
--inventory {{ inventory }}
|
|
||||||
--output-log validation_{{ name.key }}_positive.log
|
|
||||||
{{ execution_extra_args | default(name.value.extra_args) }}
|
|
||||||
{{ name.value.extra_env_args }}
|
|
||||||
executable: /bin/bash
|
|
||||||
when: (negative | default(False) | bool and 'negative_results' in name.value) or
|
|
||||||
(not negative | default(False) | bool)
|
|
||||||
|
|
||||||
- name: set fact for run_results
|
|
||||||
ignore_errors: true
|
|
||||||
set_fact: result_failed=true
|
|
||||||
when: run_results is defined and run_results.rc is defined and run_results.rc != expected_rc
|
|
@ -1,41 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Create extra vars file
|
|
||||||
shell:
|
|
||||||
cmd: "echo -e 'minimal_cpu_count: 2\nminimal_ram_gb: 2\n' > {{ extra_vars_uuid }}extra_vars.yaml"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Run validations with extra vars file
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} run --validation {{ name.key }}
|
|
||||||
{{ validation_dir_arg }} {{ ansible_dir_arg }}
|
|
||||||
--inventory {{ inventory }}
|
|
||||||
--output-log validation_{{ name.key }}_extra_vars_file.log
|
|
||||||
--extra-vars-file {{ extra_vars_uuid }}extra_vars.yaml
|
|
||||||
{{ name.value.extra_env_args }}
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Get Run results
|
|
||||||
block:
|
|
||||||
- name: Get run results
|
|
||||||
register: result
|
|
||||||
shell:
|
|
||||||
cmd: "cat validation_{{ name.key }}_extra_vars_file.log"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Get json data
|
|
||||||
set_fact:
|
|
||||||
jsondata: "{{ result.stdout | from_json }}"
|
|
||||||
|
|
||||||
- name: Get Validations Status
|
|
||||||
set_fact:
|
|
||||||
status: "{{ jsondata | json_query(jsonres) }}"
|
|
||||||
vars:
|
|
||||||
jsonres: 'results[*].Status'
|
|
||||||
|
|
||||||
- fail:
|
|
||||||
msg: "Validation failed with {{ validation_status }}: some of the validations has failed. {{ status }}"
|
|
||||||
when: validation_status != "PASSED"
|
|
||||||
loop: "{{ status }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: validation_status
|
|
@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Get run UUID
|
|
||||||
block:
|
|
||||||
- name: Get run results file
|
|
||||||
register: result
|
|
||||||
shell:
|
|
||||||
cmd: "cat validation_{{ name.key }}_positive.log"
|
|
||||||
executable: /bin/bash
|
|
||||||
- name: Get uuid from log
|
|
||||||
set_fact:
|
|
||||||
validation_run_uuids: "{{ result.stdout | from_json | json_query(uuid_selector) }}"
|
|
||||||
vars:
|
|
||||||
uuid_selector: 'results[*].UUID'
|
|
||||||
|
|
||||||
- name: Show Validation run results
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} history get {{ run_uuid }} --full > {{ val_working_dir }}/show_run.log 2>&1"
|
|
||||||
executable: /bin/bash
|
|
||||||
loop: "{{ validation_run_uuids }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: run_uuid
|
|
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Show Validation - correct id
|
|
||||||
register: show_output
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} show {{ validation_dir_arg }} {{ name.key }} -f json > {{ val_working_dir }}/show.log 2>&1"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
# Simulating a typo in the validation name
|
|
||||||
- name: Show Validation - incorrect id
|
|
||||||
block:
|
|
||||||
- name: Show validations - incorrect id
|
|
||||||
register: show_output_incorrect
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }} show {{ validation_dir_arg }} chuck-cpu -f json 2>&1 | tee {{val_working_dir}}/show_typo.log"
|
|
||||||
executable: /bin/bash
|
|
||||||
ignore_errors: true
|
|
||||||
- fail:
|
|
||||||
msg: "The expected error message was not displayed."
|
|
||||||
when: "'Validation chuck-cpu not found' not in show_output_incorrect.stdout"
|
|
||||||
|
|
||||||
- name: Show Validation parameters
|
|
||||||
shell:
|
|
||||||
cmd: >-
|
|
||||||
{{ validation_command }} show parameter
|
|
||||||
--validation {{ name.key }} {{ validation_dir_arg }}
|
|
||||||
--download {{ name.key }}_params.{{ format_type }}
|
|
||||||
--format-output {{ format_type }}
|
|
||||||
executable: /bin/bash
|
|
||||||
loop:
|
|
||||||
- json
|
|
||||||
- yaml
|
|
||||||
loop_control:
|
|
||||||
loop_var: format_type
|
|
@ -1,64 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Execute validation commands
|
|
||||||
shell:
|
|
||||||
cmd: "{{ validation_command }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: set fact for Validation action
|
|
||||||
set_fact: v_action="{{ action }}"
|
|
||||||
|
|
||||||
- name: Get Run results - Positive - these are supposed to pass
|
|
||||||
block:
|
|
||||||
- name: Get run results
|
|
||||||
register: result
|
|
||||||
shell:
|
|
||||||
cmd: "cat {{ val_output }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Get json data
|
|
||||||
set_fact:
|
|
||||||
jsondata: "{{ result.stdout | from_json }}"
|
|
||||||
|
|
||||||
- name: Get Validations Status
|
|
||||||
set_fact:
|
|
||||||
status: "{{ jsondata | json_query(jsonres) }}"
|
|
||||||
vars:
|
|
||||||
jsonres: 'results[*].Status'
|
|
||||||
|
|
||||||
- fail:
|
|
||||||
msg: "Validation failed with {{ validation_status }}: some of the validations have failed. {{ status }}"
|
|
||||||
when: validation_status != "PASSED"
|
|
||||||
loop: "{{ status }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: validation_status
|
|
||||||
when: v_action == 'run'
|
|
||||||
|
|
||||||
- name: Get Run results - Negative - these are supposed to fail
|
|
||||||
# This task should fail with return code != 0
|
|
||||||
# The validation is supplied with parameters that make it impossible to pass.
|
|
||||||
block:
|
|
||||||
- name: Get run results
|
|
||||||
register: result
|
|
||||||
shell:
|
|
||||||
cmd: "cat {{ val_output }}"
|
|
||||||
executable: /bin/bash
|
|
||||||
|
|
||||||
- name: Get json data
|
|
||||||
set_fact:
|
|
||||||
jsondata: "{{ result.stdout | from_json }}"
|
|
||||||
|
|
||||||
- name: Get Validations Status
|
|
||||||
set_fact:
|
|
||||||
status: "{{ jsondata | json_query(jsonres) }}"
|
|
||||||
vars:
|
|
||||||
jsonres: 'results[*].Status'
|
|
||||||
|
|
||||||
- fail:
|
|
||||||
msg: "Validation passed with {{ validation_status }} when it shouldn't have: some of the validations have passed. {{ status }}"
|
|
||||||
when: validation_status == "PASSED"
|
|
||||||
loop: "{{ status }}"
|
|
||||||
loop_control:
|
|
||||||
loop_var: validation_status
|
|
||||||
when:
|
|
||||||
- v_action == 'run'
|
|
||||||
- "'negative_results' in name.value"
|
|
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
include_validation: {{ item.validation }}
|
|
||||||
include_group: {{ item.validation_group }}
|
|
||||||
include_category: {{ item.validation_category }}
|
|
||||||
include_product: {{ item.validation_product }}
|
|
||||||
exclude_validation: {{ item.exclude_validation }}
|
|
||||||
exclude_group: {{ item.exclude_validation_group }}
|
|
||||||
exclude_category: {{ item.exclude_validation_category }}
|
|
||||||
exclude_product: {{ item.exclude_validation_product }}
|
|
||||||
config: {{ validation_config | default('') }}
|
|
||||||
inventory: {{ inventory }}
|
|
||||||
validation-log-dir: {{ vf_log_dir }}
|
|
||||||
output-log: {{ vf_log_dir }}/run-from-file.log
|
|
||||||
# Checks if the following variables are defined, if the variables
|
|
||||||
# don't have the value, based on the vars/main.yaml file, they are skipped.
|
|
||||||
{% if item.extra_env_vars | default('') %}
|
|
||||||
extra-env-vars: {{ item.extra_env_vars }}
|
|
||||||
{% endif %}
|
|
||||||
{% if item.extra_vars | default('') %}
|
|
||||||
extra-vars: {{ item.extra_vars }}
|
|
||||||
{% endif %}
|
|
||||||
{% if item.limit_hosts | default('') %}
|
|
||||||
limit: {{ item.limit_hosts.limit | default('') }}
|
|
||||||
{% endif %}
|
|
||||||
# Checks if the zuul virtualenv exists, if not default path is used instead.
|
|
||||||
{% if is_virtualenv.stat.exists %}
|
|
||||||
validation-dir: {{ zuul_work_virtualenv }}/share/ansible/validation-playbooks
|
|
||||||
ansible-base-dir: {{ zuul_work_virtualenv }}/share/ansible
|
|
||||||
python-interpreter: {{ zuul_work_virtualenv }}/bin/python3
|
|
||||||
{% else %}
|
|
||||||
validation-dir: /usr/share/ansible/validation-playbooks
|
|
||||||
ansible-base-dir: /usr/share/ansible
|
|
||||||
python-interpreter: /usr/bin/python3
|
|
||||||
{% endif %}
|
|
@ -1,267 +0,0 @@
|
|||||||
---
|
|
||||||
# extra_env_vars variable should be formed as:
|
|
||||||
# extra_env_vars: "--extra-env-vars key=value --extra-env-vars key2=value2"
|
|
||||||
validations_list:
|
|
||||||
compute:
|
|
||||||
- nova-status:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
clients:
|
|
||||||
- openstack-endpoints:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
network:
|
|
||||||
- undercloud-neutron-sanity-check:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
security:
|
|
||||||
- tls-everywhere-prep:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- tls-everywhere-pre-deployment:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- tls-everywhere-post-deployment:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
validation:
|
|
||||||
- check-cpu:
|
|
||||||
negative_results:
|
|
||||||
extra_args: "--extra-vars minimal_cpu_count=20000"
|
|
||||||
extra_args: "--extra-vars minimal_cpu_count=2"
|
|
||||||
extra_env_args: "--extra-env-vars ANSIBLE_STDOUT_CALLBACK=default {{ extra_env_vars | default('') }}"
|
|
||||||
- 512e:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: ""
|
|
||||||
- check-ram:
|
|
||||||
negative_results:
|
|
||||||
extra_args: "--extra-vars minimal_ram_gb=2000000"
|
|
||||||
extra_args: "--extra-vars minimal_ram_gb=2"
|
|
||||||
extra_env_args: "--extra-env-vars ANSIBLE_STDOUT_CALLBACK=default {{ extra_env_vars | default('') }}"
|
|
||||||
tripleo:
|
|
||||||
- undercloud-process-count:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- tripleo-latest-packages-version:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- check-for-dangling-images:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
baremetal:
|
|
||||||
- collect-flavors-and-verify-profiles:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- default-node-count:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- dhcp-introspection:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- dhcp-provisioning:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- ironic-boot-configuration:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- node-disks:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
- node-health:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
validations_group:
|
|
||||||
compute:
|
|
||||||
- compute
|
|
||||||
network:
|
|
||||||
- network
|
|
||||||
|
|
||||||
validation_metadata:
|
|
||||||
group:
|
|
||||||
- no-op
|
|
||||||
- prep
|
|
||||||
category:
|
|
||||||
- storage
|
|
||||||
- container
|
|
||||||
product:
|
|
||||||
- tripleo
|
|
||||||
|
|
||||||
validation_list_formats:
|
|
||||||
- csv
|
|
||||||
- json
|
|
||||||
- table
|
|
||||||
- value
|
|
||||||
- yaml
|
|
||||||
|
|
||||||
# Entire catalogue of validations to be executed in OVB environment
|
|
||||||
# extra_env_args and extra_args are shared for the execution
|
|
||||||
# Included validations will be sorted alphabetically.
|
|
||||||
validation_catalogue:
|
|
||||||
extra_args: ""
|
|
||||||
extra_env_args: "{{ extra_env_vars | default('') }}"
|
|
||||||
full_list:
|
|
||||||
- 512e
|
|
||||||
- ceph-dependencies-installed
|
|
||||||
- check-cpu
|
|
||||||
- check-disk-space
|
|
||||||
- check-disk-space-pre-upgrade
|
|
||||||
- check-for-dangling-images
|
|
||||||
- check-ftype
|
|
||||||
- check-network-gateway
|
|
||||||
- check-ntp-reachability
|
|
||||||
- check-ram
|
|
||||||
- check-rsyslog
|
|
||||||
- check-selinux-mode
|
|
||||||
- compute-tsx
|
|
||||||
- container-status
|
|
||||||
- controller-token
|
|
||||||
- controller-ulimits
|
|
||||||
- ctlplane-ip-range
|
|
||||||
- dhcp-introspection
|
|
||||||
- dhcp-provisioning
|
|
||||||
- dns
|
|
||||||
- fips-enabled
|
|
||||||
- healthcheck-service-status
|
|
||||||
- image-serve
|
|
||||||
- mysql-open-files-limit
|
|
||||||
- neutron-sanity-check
|
|
||||||
- no-op
|
|
||||||
- nova-event-callback
|
|
||||||
- nova-svirt
|
|
||||||
- ntp
|
|
||||||
- openshift-nw-requirements
|
|
||||||
- openstack-endpoints
|
|
||||||
- overcloud-service-status
|
|
||||||
- rabbitmq-limits
|
|
||||||
- repos
|
|
||||||
- service-status
|
|
||||||
- tripleo-latest-packages-version
|
|
||||||
- undercloud-disabled-services
|
|
||||||
- undercloud-disk-space
|
|
||||||
- undercloud-disk-space-pre-upgrade
|
|
||||||
- undercloud-ipa-server-check
|
|
||||||
- undercloud-neutron-sanity-check
|
|
||||||
- undercloud-process-count
|
|
||||||
- validate-selinux
|
|
||||||
|
|
||||||
# Following validations are disabled for purposes of catalogue testing
|
|
||||||
|
|
||||||
# - ceilometerdb-size # Not present on the OVB deployment
|
|
||||||
# - system-encoding # Not present on the OVB deployment
|
|
||||||
# - ceph-ansible-installed # Not present on the OVB deployment
|
|
||||||
# - haproxy # Not present on the OVB deployment
|
|
||||||
# - no-op-firewall-nova-driver # Not present on the OVB deployment
|
|
||||||
# - containerized-undercloud-docker # Not present on the OVB deployment
|
|
||||||
|
|
||||||
# Hostname prerequisites are not met
|
|
||||||
|
|
||||||
# - ceph-health
|
|
||||||
# - ovs-dpdk-pmd-cpus-check
|
|
||||||
|
|
||||||
# General validation superceded by 'tripleo-latest-packages-version'
|
|
||||||
# - check-latest-packages-version
|
|
||||||
|
|
||||||
# Failing due to bugs
|
|
||||||
# - ceph-pg
|
|
||||||
# - check-uc-hostname
|
|
||||||
# - collect-flavors-and-verify-profiles
|
|
||||||
# - default-node-count
|
|
||||||
# - ironic-boot-configuration
|
|
||||||
# - network-environment
|
|
||||||
# - nova-status
|
|
||||||
# - node-health
|
|
||||||
# - node-disks
|
|
||||||
# - stack-health
|
|
||||||
# - switch-vlans
|
|
||||||
# - undercloud-heat-purge-deleted
|
|
||||||
|
|
||||||
# Real issues detedte by validations but not relevant
|
|
||||||
# - check-rhsm-version
|
|
||||||
# - check-undercloud-conf
|
|
||||||
# - openshift-hw-requirements
|
|
||||||
# - pacemaker-status
|
|
||||||
# - stonith-exists
|
|
||||||
# - tls-everywhere-post-deployment
|
|
||||||
# - tls-everywhere-pre-deployment
|
|
||||||
# - tls-everywhere-prep
|
|
||||||
# - undercloud-debug
|
|
||||||
# - undercloud-service-status
|
|
||||||
#
|
|
||||||
# List of dictionaries for testing 4 different versions of file-to-run the CLI file command
|
|
||||||
# Each dictionary consists of different options for inclusion and exclusion
|
|
||||||
# validations/groups/categories/products
|
|
||||||
test_arguments_run_from_file:
|
|
||||||
# 1st valid file
|
|
||||||
# expected rc is 0
|
|
||||||
- validation:
|
|
||||||
- check-cpu
|
|
||||||
validation_group: []
|
|
||||||
validation_category: []
|
|
||||||
validation_product: []
|
|
||||||
exclude_validation:
|
|
||||||
exclude_validation_group: []
|
|
||||||
exclude_validation_category: []
|
|
||||||
exclude_validation_product:
|
|
||||||
- tripleo
|
|
||||||
validation-dir:
|
|
||||||
extra_vars:
|
|
||||||
minimal_cpu_count: 2
|
|
||||||
# 2nd valid file with 1 non-existent validation
|
|
||||||
# networking group should be run, expected rc is 1 due to the failing
|
|
||||||
# validations
|
|
||||||
- validation:
|
|
||||||
- check-cpu
|
|
||||||
- i-dont-exist
|
|
||||||
validation_group: []
|
|
||||||
validation_category:
|
|
||||||
- compute
|
|
||||||
- networking
|
|
||||||
validation_product: []
|
|
||||||
exclude_validation:
|
|
||||||
- fips-enabled
|
|
||||||
exclude_validation_group:
|
|
||||||
- prep
|
|
||||||
exclude_validation_category:
|
|
||||||
- compute
|
|
||||||
exclude_validation_product:
|
|
||||||
- rabbitmq
|
|
||||||
- tripleo
|
|
||||||
limit_hosts:
|
|
||||||
limit: [undercloud-0]
|
|
||||||
# 3rd valid file testing the Invalid operation: no validation to run
|
|
||||||
# expected rc is 1
|
|
||||||
- validation:
|
|
||||||
- i-dont-exist
|
|
||||||
validation_group: []
|
|
||||||
validation_category: []
|
|
||||||
validation_product: []
|
|
||||||
exclude_validation:
|
|
||||||
- fips-enabled
|
|
||||||
exclude_validation_group:
|
|
||||||
- prep
|
|
||||||
exclude_validation_category:
|
|
||||||
- compute
|
|
||||||
exclude_validation_product:
|
|
||||||
- rabbitmq
|
|
||||||
- tripleo
|
|
||||||
# 4th valid file, testing the proper inclusion and exclusion
|
|
||||||
# only networking group should run (except the dns and the ntp validations)
|
|
||||||
# expected rc is 1 due to the failed check-cpu validation
|
|
||||||
- validation:
|
|
||||||
- check-cpu
|
|
||||||
validation_group:
|
|
||||||
validation_category:
|
|
||||||
- networking
|
|
||||||
validation_product:
|
|
||||||
- tripleo
|
|
||||||
exclude_validation:
|
|
||||||
- fips-enabled
|
|
||||||
- dns
|
|
||||||
- ntp
|
|
||||||
exclude_validation_group:
|
|
||||||
exclude_validation_category:
|
|
||||||
exclude_validation_product:
|
|
||||||
- rabbitmq
|
|
||||||
- tripleo
|
|
||||||
extra_vars:
|
|
||||||
minimal_cpu_count: 8000
|
|
@ -1,45 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright 2019 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
## Shell Opts ----------------------------------------------------------------
|
|
||||||
|
|
||||||
set -o pipefail
|
|
||||||
set -xeuo
|
|
||||||
|
|
||||||
|
|
||||||
## Vars ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
export BINDEP_FILE="${BINDEP_FILE:-$(dirname $(readlink -f ${BASH_SOURCE[0]}))/../bindep.txt}"
|
|
||||||
|
|
||||||
|
|
||||||
## Main ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Source distribution information
|
|
||||||
source /etc/os-release || source /usr/lib/os-release
|
|
||||||
RHT_PKG_MGR=$(command -v dnf || command -v yum)
|
|
||||||
|
|
||||||
# NOTE(cloudnull): Get a list of packages to install with bindep. If packages
|
|
||||||
# need to be installed, bindep exits with an exit code of 1.
|
|
||||||
BINDEP_PKGS=$(bindep -b -f "${BINDEP_FILE}" test || true)
|
|
||||||
|
|
||||||
if [[ ${#BINDEP_PKGS} > 0 ]]; then
|
|
||||||
case "${ID,,}" in
|
|
||||||
amzn|rhel|centos|fedora)
|
|
||||||
sudo "${RHT_PKG_MGR}" install -y ${BINDEP_PKGS}
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
@ -1,89 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Copyright 2019 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
## Functions -----------------------------------------------------------------
|
|
||||||
function usage {
|
|
||||||
echo "Usage: ROLE_NAME=ROLE_NAME ${0##*/} or ${0##*/} ROLE_NAME"
|
|
||||||
}
|
|
||||||
|
|
||||||
## Vars ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
export PROJECT_DIR="$(dirname $(readlink -f ${BASH_SOURCE[0]}))/../"
|
|
||||||
if [ "${ROLE_NAME}x" = "x" -a "${1}x" = "x" ]; then
|
|
||||||
usage;
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
export ROLE_NAME="${ROLE_NAME:-$1}"
|
|
||||||
export TRIPLEO_JOB_ANSIBLE_ARGS=${TRIPLEO_JOB_ANSIBLE_ARGS:-""}
|
|
||||||
|
|
||||||
## Shell Opts ----------------------------------------------------------------
|
|
||||||
|
|
||||||
set -o pipefail
|
|
||||||
set -xeuo
|
|
||||||
|
|
||||||
## Main ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Source distribution information
|
|
||||||
source /etc/os-release || source /usr/lib/os-release
|
|
||||||
RHT_PKG_MGR=$(command -v dnf || command -v yum)
|
|
||||||
|
|
||||||
# Install the one requirement we need to run any local test
|
|
||||||
case "${ID,,}" in
|
|
||||||
amzn|rhel|centos|fedora)
|
|
||||||
sudo "${RHT_PKG_MGR}" install -y python3 python*-virtualenv
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Ensure the required ci file is present
|
|
||||||
sudo mkdir -p /etc/ci
|
|
||||||
sudo touch /etc/ci/mirror_info.sh
|
|
||||||
|
|
||||||
# Get Python Executable
|
|
||||||
PYTHON_EXEC=$(command -v python3 || command -v python)
|
|
||||||
|
|
||||||
# Create a virtual env
|
|
||||||
"${PYTHON_EXEC}" -m virtualenv --system-site-packages "${HOME}/test-python"
|
|
||||||
|
|
||||||
# Activate a virtual env
|
|
||||||
PS1="[\u@\h \W]\$" source "${HOME}/test-python/bin/activate"
|
|
||||||
|
|
||||||
# Run bindep
|
|
||||||
"${HOME}/test-python/bin/pip" install "pip>=19.1.1" setuptools bindep --upgrade
|
|
||||||
"${PROJECT_DIR}/scripts/bindep-install"
|
|
||||||
|
|
||||||
# Install local requirements
|
|
||||||
if [[ -d "${HOME}/.cache/pip/wheels" ]]; then
|
|
||||||
rm -rf "${HOME}/.cache/pip/wheels"
|
|
||||||
fi
|
|
||||||
"${HOME}/test-python/bin/pip" install \
|
|
||||||
-r "${PROJECT_DIR}/requirements.txt" \
|
|
||||||
-r "${PROJECT_DIR}/test-requirements.txt" \
|
|
||||||
-r "${PROJECT_DIR}/molecule-requirements.txt"
|
|
||||||
|
|
||||||
# Run local test
|
|
||||||
source "${PROJECT_DIR}/ansible-test-env.rc"
|
|
||||||
export ANSIBLE_ROLES_PATH="${ANSIBLE_ROLES_PATH}:${HOME}/zuul-jobs/roles"
|
|
||||||
ansible-galaxy install -fr "${PROJECT_DIR}/ansible-collections-requirements.yml"
|
|
||||||
ansible-playbook -i "${PROJECT_DIR}/tests/hosts.ini" \
|
|
||||||
-e "tripleo_src=$(realpath --relative-to="${HOME}" "${PROJECT_DIR}")" \
|
|
||||||
-e "validations_common_role_name=${ROLE_NAME}" \
|
|
||||||
-e "tripleo_job_ansible_args='${TRIPLEO_JOB_ANSIBLE_ARGS}'" \
|
|
||||||
-e "ansible_user=${USER}" \
|
|
||||||
-e "ansible_user_dir=${HOME}" \
|
|
||||||
"${PROJECT_DIR}/tests/prepare-test-host.yml" \
|
|
||||||
"${PROJECT_DIR}/playbooks/molecule/run-local.yml" \
|
|
||||||
-v
|
|
35
setup.cfg
35
setup.cfg
@ -1,35 +0,0 @@
|
|||||||
[metadata]
|
|
||||||
name = validations-common
|
|
||||||
summary = A common Ansible libraries and plugins for the validations framework
|
|
||||||
long_description = file: README.rst
|
|
||||||
long_description_content_type = text/x-rst
|
|
||||||
author = OpenStack
|
|
||||||
author_email = openstack-discuss@lists.openstack.org
|
|
||||||
home_page = https://opendev.org/openstack/validations-common
|
|
||||||
classifier =
|
|
||||||
Development Status :: 5 - Production/Stable
|
|
||||||
Environment :: OpenStack
|
|
||||||
Framework :: Ansible
|
|
||||||
Intended Audience :: Information Technology
|
|
||||||
Intended Audience :: System Administrators
|
|
||||||
License :: OSI Approved :: Apache Software License
|
|
||||||
Operating System :: POSIX :: Linux
|
|
||||||
Programming Language :: Python
|
|
||||||
Programming Language :: Python :: Implementation :: CPython
|
|
||||||
Programming Language :: Python :: 3 :: Only
|
|
||||||
Programming Language :: Python :: 3
|
|
||||||
Programming Language :: Python :: 3.8
|
|
||||||
Programming Language :: Python :: 3.9
|
|
||||||
|
|
||||||
[options]
|
|
||||||
python_requires = >=3.8
|
|
||||||
|
|
||||||
[files]
|
|
||||||
packages =
|
|
||||||
validations_common
|
|
||||||
|
|
||||||
data_files =
|
|
||||||
share/ansible/roles = roles/*
|
|
||||||
share/ansible/roles = validations_common/roles/*
|
|
||||||
share/ansible/library = validations_common/library/*
|
|
||||||
share/ansible/validation-playbooks = validations_common/playbooks/*
|
|
21
setup.py
21
setup.py
@ -1,21 +0,0 @@
|
|||||||
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
|
|
||||||
import setuptools
|
|
||||||
|
|
||||||
setuptools.setup(
|
|
||||||
setup_requires=['pbr>=2.0.0'],
|
|
||||||
pbr=True)
|
|
@ -1,13 +0,0 @@
|
|||||||
# The order of packages is significant, because pip processes them in the order
|
|
||||||
# of appearance. Changing the order has an impact on the overall integration
|
|
||||||
# process, which may cause wedges in the gate later.
|
|
||||||
|
|
||||||
ansible-core<2.12 # GPLv3+
|
|
||||||
coverage!=4.4,>=4.0 # Apache-2.0
|
|
||||||
oslotest>=3.2.0 # Apache-2.0
|
|
||||||
stestr>=3.0.1 # Apache-2.0
|
|
||||||
testscenarios>=0.4 # Apache-2.0/BSD
|
|
||||||
testtools>=2.2.0 # MIT
|
|
||||||
reno>=2.5.0 # Apache-2.0
|
|
||||||
netaddr>=0.7.18 # BSD
|
|
||||||
pre-commit>=2.3.0 # MIT
|
|
@ -1,18 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
|
||||||
parser.addoption('--scenario', help='scenario setting')
|
|
||||||
parser.addoption(
|
|
||||||
'--ansible-args', help='ansible args passed into test runner.')
|
|
@ -1 +0,0 @@
|
|||||||
test ansible_connection=local ansible_host=localhost
|
|
@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
# Copyright 2019 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
|
|
||||||
- name: pre prepare
|
|
||||||
hosts: all
|
|
||||||
gather_facts: false
|
|
||||||
tasks:
|
|
||||||
- name: set basic user fact
|
|
||||||
fail:
|
|
||||||
msg: >-
|
|
||||||
The variable `ansible_user` set this option and try again. On the
|
|
||||||
CLI this can be defined with "-e ansible_user=${USER}"
|
|
||||||
when:
|
|
||||||
- ansible_user is undefined
|
|
||||||
|
|
||||||
- name: set basic home fact
|
|
||||||
fail:
|
|
||||||
msg: >-
|
|
||||||
The variable `ansible_user_dir` set this option and try again. On
|
|
||||||
the CLI this can be defined with "-e ansible_user_dir=${HOME}"
|
|
||||||
when:
|
|
||||||
- ansible_user_dir is undefined
|
|
||||||
|
|
||||||
- name: Ensure the user has a .ssh directory
|
|
||||||
file:
|
|
||||||
path: "{{ ansible_user_dir }}/.ssh"
|
|
||||||
state: directory
|
|
||||||
owner: "{{ ansible_user }}"
|
|
||||||
group: "{{ ansible_user }}"
|
|
||||||
mode: "0700"
|
|
||||||
|
|
||||||
- name: Create ssh key pair
|
|
||||||
openssh_keypair:
|
|
||||||
path: "{{ ansible_user_dir }}/.ssh/id_rsa"
|
|
||||||
size: 2048
|
|
||||||
|
|
||||||
- name: Slurp pub key
|
|
||||||
slurp:
|
|
||||||
src: "{{ ansible_user_dir ~ '/.ssh/id_rsa.pub' }}"
|
|
||||||
register: pub_key
|
|
||||||
|
|
||||||
- name: Ensure can ssh to can connect to localhost
|
|
||||||
authorized_key:
|
|
||||||
user: "{{ ansible_user }}"
|
|
||||||
key: "{{ pub_key['content'] | b64decode }}"
|
|
||||||
|
|
||||||
- name: Get the zuul/zuul-jobs repo
|
|
||||||
git:
|
|
||||||
repo: https://opendev.org/zuul/zuul-jobs
|
|
||||||
dest: "{{ ansible_user_dir }}/zuul-jobs"
|
|
||||||
version: master
|
|
||||||
force: true
|
|
@ -1,41 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
def test_molecule(pytestconfig):
|
|
||||||
cmd = ['python', '-m', 'molecule']
|
|
||||||
scenario = pytestconfig.getoption("scenario")
|
|
||||||
ansible_args = pytestconfig.getoption("ansible_args")
|
|
||||||
|
|
||||||
if ansible_args:
|
|
||||||
cmd.append('converge')
|
|
||||||
if scenario:
|
|
||||||
cmd.extend(['--scenario-name', scenario])
|
|
||||||
cmd.append('--')
|
|
||||||
cmd.extend(ansible_args.split())
|
|
||||||
else:
|
|
||||||
cmd.append('test')
|
|
||||||
if scenario:
|
|
||||||
cmd.extend(['--scenario-name', scenario])
|
|
||||||
else:
|
|
||||||
cmd.append('--all')
|
|
||||||
|
|
||||||
try:
|
|
||||||
assert subprocess.call(cmd) == 0
|
|
||||||
finally:
|
|
||||||
if ansible_args:
|
|
||||||
cmd = ['python', '-m', 'molecule', 'destroy']
|
|
||||||
if scenario:
|
|
||||||
cmd.extend(['--scenario-name', scenario])
|
|
||||||
subprocess.call(cmd)
|
|
@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
rm -rf releasenotes/build
|
|
||||||
|
|
||||||
sphinx-build -a -E -W \
|
|
||||||
-d releasenotes/build/doctrees \
|
|
||||||
-b html \
|
|
||||||
releasenotes/source releasenotes/build/html
|
|
||||||
BUILD_RESULT=$?
|
|
||||||
|
|
||||||
UNCOMMITTED_NOTES=$(git status --porcelain | \
|
|
||||||
awk '$1 == "M" && $2 ~ /releasenotes\/notes/ {print $2}')
|
|
||||||
|
|
||||||
if [ "${UNCOMMITTED_NOTES}" ]; then
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
REMINDER: The following changes to release notes have not been committed:
|
|
||||||
|
|
||||||
${UNCOMMITTED_NOTES}
|
|
||||||
|
|
||||||
While that may be intentional, keep in mind that release notes are built from
|
|
||||||
committed changes, not the working directory.
|
|
||||||
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit ${BUILD_RESULT}
|
|
@ -1,119 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def exit_usage():
|
|
||||||
print('Usage {} <directory>'.format(sys.argv[0]))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_library_file(file_path, quiet):
|
|
||||||
|
|
||||||
with open(file_path) as f:
|
|
||||||
file_content = f.read()
|
|
||||||
if 'DOCUMENTATION = ' not in file_content \
|
|
||||||
or 'EXAMPLES = ' not in file_content:
|
|
||||||
if quiet < 3:
|
|
||||||
print('Missing ansible documentation in {}'.format(file_path))
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def validate_callback_file(file_path, quiet):
|
|
||||||
required_attributes = [
|
|
||||||
'CALLBACK_VERSION',
|
|
||||||
'CALLBACK_NAME']
|
|
||||||
|
|
||||||
with open(file_path) as file:
|
|
||||||
file_content = file.read()
|
|
||||||
if any([attr not in file_content for attr in required_attributes]):
|
|
||||||
if quiet < 3:
|
|
||||||
print(
|
|
||||||
'Missing required callback plugin attributes in {}'.format(file_path))
|
|
||||||
return 1
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
def validate_file(file_path, quiet):
|
|
||||||
if os.path.split(file_path)[0].endswith('library'):
|
|
||||||
return validate_library_file(file_path, quiet)
|
|
||||||
elif os.path.split(file_path)[0].endswith('callback_plugins'):
|
|
||||||
return validate_callback_file(file_path, quiet)
|
|
||||||
else:
|
|
||||||
raise ValueError()
|
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
|
||||||
p = argparse.ArgumentParser()
|
|
||||||
|
|
||||||
p.add_argument('--quiet', '-q',
|
|
||||||
action='count',
|
|
||||||
default=0,
|
|
||||||
help='output warnings and errors (-q) or only errors (-qq)')
|
|
||||||
|
|
||||||
p.add_argument('path_args',
|
|
||||||
nargs='*',
|
|
||||||
default=['.'])
|
|
||||||
|
|
||||||
return p.parse_args()
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
args = parse_args()
|
|
||||||
path_args = args.path_args
|
|
||||||
quiet = args.quiet
|
|
||||||
exit_val = 0
|
|
||||||
scanned_subdirs = ['callback_plugins', 'library']
|
|
||||||
failed_files = []
|
|
||||||
|
|
||||||
for base_path in path_args:
|
|
||||||
scanned_paths = [
|
|
||||||
os.path.join(
|
|
||||||
base_path,
|
|
||||||
'validations_common',
|
|
||||||
path) for path in scanned_subdirs]
|
|
||||||
|
|
||||||
if os.path.isdir(base_path):
|
|
||||||
for subdir, dirs, files in os.walk(base_path):
|
|
||||||
if '.tox' in dirs:
|
|
||||||
dirs.remove('.tox')
|
|
||||||
if '.git' in dirs:
|
|
||||||
dirs.remove('.git')
|
|
||||||
if subdir in scanned_paths:
|
|
||||||
for f in files:
|
|
||||||
if f.endswith('.py') and f != '__init__.py':
|
|
||||||
file_path = os.path.join(subdir, f)
|
|
||||||
if quiet < 1:
|
|
||||||
print('Validating {}'.format(file_path))
|
|
||||||
failed = validate_file(file_path, quiet)
|
|
||||||
if failed:
|
|
||||||
failed_files.append(file_path)
|
|
||||||
exit_val |= failed
|
|
||||||
else:
|
|
||||||
print('Unexpected argument {}'.format(base_path))
|
|
||||||
exit_usage()
|
|
||||||
|
|
||||||
if failed_files:
|
|
||||||
print('Validation failed on:')
|
|
||||||
for f in failed_files:
|
|
||||||
print(f)
|
|
||||||
else:
|
|
||||||
print('Validation successful!')
|
|
||||||
sys.exit(exit_val)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
181
tox.ini
181
tox.ini
@ -1,181 +0,0 @@
|
|||||||
[tox]
|
|
||||||
minversion = 4.0.0
|
|
||||||
envlist = linters,docs,py3
|
|
||||||
skipsdist = True
|
|
||||||
|
|
||||||
# Automatic envs (pyXX) will only use the python version appropriate to that
|
|
||||||
# env and ignore basepython inherited from [testenv] if we set
|
|
||||||
# ignore_basepython_conflict.
|
|
||||||
ignore_basepython_conflict = True
|
|
||||||
|
|
||||||
[testenv]
|
|
||||||
basepython = python3.10
|
|
||||||
usedevelop = True
|
|
||||||
passenv =
|
|
||||||
TERM
|
|
||||||
setenv =
|
|
||||||
ANSIBLE_CALLBACK_PLUGINS={toxinidir}/validations_common/callback_plugins
|
|
||||||
ANSIBLE_LOOKUP_PLUGINS={toxinidir}/validations_common/lookup_plugins
|
|
||||||
ANSIBLE_LIBRARY={toxinidir}/validations_common/library
|
|
||||||
ANSIBLE_ROLES_PATH={toxinidir}/validations_common/roles
|
|
||||||
ANSIBLE_NOCOWS=1
|
|
||||||
ANSIBLE_RETRY_FILES_ENABLED=0
|
|
||||||
ANSIBLE_STDOUT_CALLBACK=debug
|
|
||||||
ANSIBLE_LOG_PATH={envlogdir}/ansible-execution.log
|
|
||||||
# pip: Avoid 2020-01-01 warnings: https://github.com/pypa/pip/issues/6207
|
|
||||||
# paramiko CryptographyDeprecationWarning: https://github.com/ansible/ansible/issues/52598
|
|
||||||
PYTHONWARNINGS=ignore:DEPRECATION::pip._internal.cli.base_command,ignore::UserWarning
|
|
||||||
VIRTUAL_ENV={envdir}
|
|
||||||
LANG=en_US.UTF-8
|
|
||||||
LANGUAGE=en_US:en
|
|
||||||
LC_ALL=en_US.UTF-8
|
|
||||||
HOME={envdir}
|
|
||||||
DISABLE_PIP_VERSION_CHECK=1
|
|
||||||
commands =
|
|
||||||
ansible-galaxy install -fr {toxinidir}/ansible-collections-requirements.yml
|
|
||||||
stestr run --slowest --color {posargs}
|
|
||||||
deps =
|
|
||||||
-r {toxinidir}/requirements.txt
|
|
||||||
-r {toxinidir}/test-requirements.txt
|
|
||||||
-r {toxinidir}/doc/requirements.txt
|
|
||||||
allowlist_externals =
|
|
||||||
bash
|
|
||||||
ansible-galaxy
|
|
||||||
|
|
||||||
[testenv:py27]
|
|
||||||
envtmpdir={envdir}/tmp
|
|
||||||
skip_install = true
|
|
||||||
commands_pre =
|
|
||||||
cp -r {toxinidir}/validations_common {envtmpdir}/validations_common
|
|
||||||
touch {envtmpdir}/validations_common/library/__init__.py
|
|
||||||
find {envtmpdir}/validations_common/tests/ -type f -exec sed -i -e 's/from unittest import mock/import mock/g' \{\} ;
|
|
||||||
find {envtmpdir}/validations_common/tests/ -type f -exec sed -i -e 's/from unittest.mock/from mock/g' \{\} ;
|
|
||||||
find {envtmpdir} -type f -name 'setup.cfg' -exec sed -i -e 's/python-requires = >=3.6/python-requires = >=2.7/g' \{\} ;
|
|
||||||
commands =
|
|
||||||
python2.7 -m unittest discover -s {envtmpdir}/validations_common/tests
|
|
||||||
deps =
|
|
||||||
-c {env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/train}
|
|
||||||
-r {toxinidir}/requirements.txt
|
|
||||||
-r {toxinidir}/test-requirements.txt
|
|
||||||
allowlist_externals =
|
|
||||||
bash
|
|
||||||
cp
|
|
||||||
find
|
|
||||||
sed
|
|
||||||
touch
|
|
||||||
|
|
||||||
[testenv:bindep]
|
|
||||||
# Do not install any requirements. We want this to be fast and work even if
|
|
||||||
# system dependencies are missing, since it's used to tell you what system
|
|
||||||
# dependencies are missing! This also means that bindep must be installed
|
|
||||||
# separately, outside of the requirements files.
|
|
||||||
deps = bindep
|
|
||||||
commands = bindep test
|
|
||||||
|
|
||||||
[testenv:debug]
|
|
||||||
commands = oslo_debug_helper {posargs}
|
|
||||||
|
|
||||||
[testenv:pep8]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run flake8 -a
|
|
||||||
|
|
||||||
[testenv:ansible-lint]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps =
|
|
||||||
{[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
bash -c "ANSIBLE_ROLES_PATH='{toxinidir}/validations_common/roles'"
|
|
||||||
bash -c "ANSIBLE_LIBRARY='{toxinidir}/validations_common/library'"
|
|
||||||
python -m pre_commit run ansible-lint -a
|
|
||||||
|
|
||||||
[testenv:yamllint]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps = {[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run yamllint -a
|
|
||||||
|
|
||||||
[testenv:bashate]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps = {[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run bashate -a
|
|
||||||
|
|
||||||
[testenv:whitespace]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps = {[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run trailing-whitespace -a
|
|
||||||
|
|
||||||
[testenv:shebangs]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps = {[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run check-executables-have-shebangs -a
|
|
||||||
|
|
||||||
[testenv:end-of-file]
|
|
||||||
envdir = {toxworkdir}/linters
|
|
||||||
deps = {[testenv:linters]deps}
|
|
||||||
commands =
|
|
||||||
python -m pre_commit run end-of-file-fixer -a
|
|
||||||
|
|
||||||
[testenv:linters]
|
|
||||||
commands_pre =
|
|
||||||
ansible-galaxy install -fr {toxinidir}/ansible-collections-requirements.yml
|
|
||||||
deps =
|
|
||||||
-c {env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
|
|
||||||
-r {toxinidir}/requirements.txt
|
|
||||||
-r {toxinidir}/test-requirements.txt
|
|
||||||
commands =
|
|
||||||
python '{toxinidir}/tools/validate-files.py' .
|
|
||||||
{[testenv:ansible-lint]commands}
|
|
||||||
{[testenv:yamllint]commands}
|
|
||||||
{[testenv:bashate]commands}
|
|
||||||
{[testenv:whitespace]commands}
|
|
||||||
{[testenv:shebangs]commands}
|
|
||||||
{[testenv:end-of-file]commands}
|
|
||||||
{[testenv:pep8]commands}
|
|
||||||
|
|
||||||
[testenv:releasenotes]
|
|
||||||
deps = -r {toxinidir}/doc/requirements.txt
|
|
||||||
commands =
|
|
||||||
sphinx-build -a -E -W -d releasenotes/build/doctrees --keep-going -b html releasenotes/source releasenotes/build/html
|
|
||||||
|
|
||||||
[testenv:venv]
|
|
||||||
commands = {posargs}
|
|
||||||
passenv = *
|
|
||||||
|
|
||||||
[testenv:cover]
|
|
||||||
setenv =
|
|
||||||
PYTHON=coverage run --parallel-mode --branch
|
|
||||||
HOME={envdir}
|
|
||||||
commands =
|
|
||||||
coverage erase
|
|
||||||
stestr run --color {posargs}
|
|
||||||
coverage combine
|
|
||||||
coverage html -d cover
|
|
||||||
coverage xml -o cover/coverage.xml
|
|
||||||
coverage report --show-missing
|
|
||||||
|
|
||||||
[testenv:docs]
|
|
||||||
deps =
|
|
||||||
-c {env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
|
|
||||||
-r {toxinidir}/doc/requirements.txt
|
|
||||||
commands=
|
|
||||||
sphinx-build -a -E -W -d doc/build/doctrees --keep-going -b html doc/source doc/build/html -T
|
|
||||||
doc8 doc
|
|
||||||
|
|
||||||
[pdf-docs]
|
|
||||||
allowlist_externals = make
|
|
||||||
description =
|
|
||||||
Build PDF documentation.
|
|
||||||
envdir = {toxworkdir}/docs
|
|
||||||
deps = {[docs]deps}
|
|
||||||
commands =
|
|
||||||
sphinx-build -b latex doc/source doc/build/pdf
|
|
||||||
make -C doc/build/pdf
|
|
||||||
|
|
||||||
[doc8]
|
|
||||||
# Settings for doc8:
|
|
||||||
extensions = .rst
|
|
||||||
ignore = D001
|
|
@ -1,22 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
"""
|
|
||||||
Uses `oslotest`_.
|
|
||||||
|
|
||||||
.. _oslotest: https://opendev.org/openstack/oslotest
|
|
||||||
"""
|
|
||||||
import pbr.version
|
|
||||||
|
|
||||||
|
|
||||||
__version__ = pbr.version.VersionInfo('validations-common')
|
|
@ -1,2 +0,0 @@
|
|||||||
"""Provides several ansible modules for I/O needs of validations.
|
|
||||||
"""
|
|
@ -1,96 +0,0 @@
|
|||||||
# Copyright 2016 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from os import path
|
|
||||||
from yaml import safe_load as yaml_safe_load
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: advanced_format
|
|
||||||
short_description: Check for advanced disk format
|
|
||||||
description:
|
|
||||||
- Check whether a drive uses advanced format
|
|
||||||
options:
|
|
||||||
drive:
|
|
||||||
required: true
|
|
||||||
description:
|
|
||||||
- drive name
|
|
||||||
type: str
|
|
||||||
author: "Martin Andre (@mandre)"
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
- hosts: webservers
|
|
||||||
tasks:
|
|
||||||
- name: Detect whether the drive uses Advanced Format
|
|
||||||
advanced_format: drive=vda
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
def read_int(module, file_path):
|
|
||||||
'''Read a file and convert its value to int.
|
|
||||||
|
|
||||||
Raise ansible failure otherwise.
|
|
||||||
'''
|
|
||||||
try:
|
|
||||||
with open(file_path) as f:
|
|
||||||
file_contents = f.read()
|
|
||||||
return int(file_contents)
|
|
||||||
except IOError:
|
|
||||||
module.fail_json(msg="Cannot open '%s'" % file_path)
|
|
||||||
except ValueError:
|
|
||||||
module.fail_json(msg="The '%s' file doesn't contain an integer value" %
|
|
||||||
file_path)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec=yaml_safe_load(DOCUMENTATION)['options']
|
|
||||||
)
|
|
||||||
|
|
||||||
drive = module.params.get('drive')
|
|
||||||
queue_path = path.join('/sys/class/block', drive, 'queue')
|
|
||||||
|
|
||||||
physical_block_size_path = path.join(queue_path, 'physical_block_size')
|
|
||||||
logical_block_size_path = path.join(queue_path, 'logical_block_size')
|
|
||||||
|
|
||||||
physical_block_size = read_int(module, physical_block_size_path)
|
|
||||||
logical_block_size = read_int(module, logical_block_size_path)
|
|
||||||
|
|
||||||
if physical_block_size == logical_block_size:
|
|
||||||
module.exit_json(
|
|
||||||
changed=False,
|
|
||||||
msg="The disk %s probably doesn't use Advance Format." % drive,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
module.exit_json(
|
|
||||||
# NOTE(shadower): we're marking this as `changed`, to make it
|
|
||||||
# visually stand out when running via Ansible directly instead of
|
|
||||||
# using the API.
|
|
||||||
#
|
|
||||||
# The API & UI is planned to look for the `warnings` field and
|
|
||||||
# display it differently.
|
|
||||||
changed=True,
|
|
||||||
warnings=["Physical and logical block sizes of drive %s differ "
|
|
||||||
"(%s vs. %s). This can mean the disk uses Advance "
|
|
||||||
"Format." %
|
|
||||||
(drive, physical_block_size, logical_block_size)],
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,331 +0,0 @@
|
|||||||
# Copyright 2017 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
"""Check for available updates for a given package.
|
|
||||||
Module queries and parses output of at least two separate
|
|
||||||
external binaries, in order to obtain information about
|
|
||||||
supported package manager, installed and available packages.
|
|
||||||
As such it has many points of failure.
|
|
||||||
|
|
||||||
Information about supported package managers,
|
|
||||||
such as the commands to use while working with them
|
|
||||||
and the expected stderr output we can encounter while querying repos,
|
|
||||||
are stored as a nested dictionery SUPPORTED_PKG_MGRS.
|
|
||||||
With names of the supported package managers as keys
|
|
||||||
of the first level elements. And the aformentioned information
|
|
||||||
on the second level, as lists of strings, with self-explanatory keys.
|
|
||||||
|
|
||||||
Formally speaking it is a tree of a sort.
|
|
||||||
But so is entire python namespace.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import collections
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
|
||||||
from yaml import safe_load as yaml_safe_load
|
|
||||||
|
|
||||||
DOCUMENTATION = '''
|
|
||||||
---
|
|
||||||
module: check_package_update
|
|
||||||
short_description: Check for available updates for given packages
|
|
||||||
description:
|
|
||||||
- Check for available updates for given packages
|
|
||||||
options:
|
|
||||||
packages_list:
|
|
||||||
required: true
|
|
||||||
description:
|
|
||||||
- The names of the packages you want to check
|
|
||||||
type: list
|
|
||||||
pkg_mgr:
|
|
||||||
required: false
|
|
||||||
description:
|
|
||||||
- Supported Package Manager, DNF or YUM
|
|
||||||
type: str
|
|
||||||
author:
|
|
||||||
- Florian Fuchs
|
|
||||||
- Jiri Podivin (@jpodivin)
|
|
||||||
'''
|
|
||||||
|
|
||||||
EXAMPLES = '''
|
|
||||||
- hosts: webservers
|
|
||||||
tasks:
|
|
||||||
- name: Get available updates for packages
|
|
||||||
check_package_update:
|
|
||||||
packages_list:
|
|
||||||
- coreutils
|
|
||||||
- wget
|
|
||||||
pkg_mgr: "{{ ansible_pkg_mgr }}"
|
|
||||||
'''
|
|
||||||
|
|
||||||
SUPPORTED_PKG_MGRS = {
|
|
||||||
'dnf': {
|
|
||||||
'query_installed': [
|
|
||||||
'rpm', '-qa', '--qf',
|
|
||||||
'%{NAME}|%{VERSION}|%{RELEASE}|%{ARCH}\n'
|
|
||||||
],
|
|
||||||
'query_available': [
|
|
||||||
'dnf', '-q', 'list', '--available'
|
|
||||||
],
|
|
||||||
'allowed_errors': [
|
|
||||||
'',
|
|
||||||
'Error: No matching Packages to list\n'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'yum': {
|
|
||||||
'query_installed': [
|
|
||||||
'rpm', '-qa', '--qf',
|
|
||||||
'%{NAME}|%{VERSION}|%{RELEASE}|%{ARCH}\n'
|
|
||||||
],
|
|
||||||
'query_available': [
|
|
||||||
'yum', '-q', 'list', 'available'
|
|
||||||
],
|
|
||||||
'allowed_errors': [
|
|
||||||
'',
|
|
||||||
'Error: No matching Packages to list\n'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PackageDetails = collections.namedtuple(
|
|
||||||
'PackageDetails',
|
|
||||||
['name', 'version', 'release', 'arch'])
|
|
||||||
|
|
||||||
|
|
||||||
def get_package_details(pkg_details_string):
|
|
||||||
"""Returns PackageDetails namedtuple from given string.
|
|
||||||
Raises ValueError if the number of '|' separated
|
|
||||||
fields is < 4.
|
|
||||||
|
|
||||||
:return: package details
|
|
||||||
:rtype: collections.namedtuple
|
|
||||||
"""
|
|
||||||
split_output = pkg_details_string.split('|')
|
|
||||||
try:
|
|
||||||
pkg_details = PackageDetails(
|
|
||||||
split_output[0],
|
|
||||||
split_output[1],
|
|
||||||
split_output[2],
|
|
||||||
split_output[3],
|
|
||||||
)
|
|
||||||
except IndexError:
|
|
||||||
raise ValueError(
|
|
||||||
(
|
|
||||||
"Package description '{}' doesn't contain fields"
|
|
||||||
" required for processing."
|
|
||||||
).format(pkg_details_string)
|
|
||||||
)
|
|
||||||
|
|
||||||
return pkg_details
|
|
||||||
|
|
||||||
|
|
||||||
def _allowed_pkg_manager_stderr(stderr, allowed_errors):
|
|
||||||
"""Returns False if the error message isn't in the
|
|
||||||
allowed_errors list.
|
|
||||||
This function factors out large, and possibly expanding,
|
|
||||||
condition so it doesn't cause too much confusion.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if stderr in allowed_errors:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def _command(command):
|
|
||||||
"""
|
|
||||||
Return result of a subprocess call.
|
|
||||||
Doesn't set timeout for the call, so the process can hang.
|
|
||||||
Potentially for a very long time.
|
|
||||||
:return: stdout and stderr from Popen.communicate()
|
|
||||||
:rtype: tuple
|
|
||||||
"""
|
|
||||||
process = subprocess.Popen(
|
|
||||||
command,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.PIPE,
|
|
||||||
universal_newlines=True)
|
|
||||||
|
|
||||||
return process.communicate()
|
|
||||||
|
|
||||||
|
|
||||||
def _get_pkg_manager(module):
|
|
||||||
"""Return name of available package manager.
|
|
||||||
Queries binaries using `command -v`, in order defined by
|
|
||||||
the `SUPPORTED_PKG_MGRS`.
|
|
||||||
:returns: string
|
|
||||||
"""
|
|
||||||
for possible_pkg_mgr in SUPPORTED_PKG_MGRS:
|
|
||||||
|
|
||||||
stdout, stderr = _command(['command', '-v', possible_pkg_mgr])
|
|
||||||
if stdout != '' and stderr == '':
|
|
||||||
return possible_pkg_mgr
|
|
||||||
|
|
||||||
module.fail_json(
|
|
||||||
msg=(
|
|
||||||
"None of the supported package managers '{}' seems to be "
|
|
||||||
"available on this system."
|
|
||||||
).format(' '.join(SUPPORTED_PKG_MGRS))
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_new_pkg_info(available_stdout):
|
|
||||||
"""Return package information as dictionary. With package names
|
|
||||||
as keys and detailed information as list of strings.
|
|
||||||
"""
|
|
||||||
available_stdout = available_stdout.split('\n')[1:]
|
|
||||||
|
|
||||||
available_stdout = [line.rstrip().split() for line in available_stdout]
|
|
||||||
|
|
||||||
new_pkgs_info = {}
|
|
||||||
|
|
||||||
for line in available_stdout:
|
|
||||||
if len(line) != 0:
|
|
||||||
new_pkgs_info[line[0]] = PackageDetails(
|
|
||||||
line[0],
|
|
||||||
line[1].split('-')[0],
|
|
||||||
line[1].split('-')[1],
|
|
||||||
line[0].split('.')[1])
|
|
||||||
|
|
||||||
return new_pkgs_info
|
|
||||||
|
|
||||||
|
|
||||||
def _get_installed_pkgs(installed_stdout, packages, module):
|
|
||||||
"""Return dictionary of installed packages.
|
|
||||||
Package names form keys and the output of the get_package_details
|
|
||||||
function values of the dictionary.
|
|
||||||
"""
|
|
||||||
installed = {}
|
|
||||||
installed_stdout = installed_stdout.split('\n')[:-1]
|
|
||||||
|
|
||||||
for package in installed_stdout:
|
|
||||||
if package != '':
|
|
||||||
package = get_package_details(package)
|
|
||||||
if package.name in packages:
|
|
||||||
installed[package.name + '.' + package.arch] = package
|
|
||||||
packages.remove(package.name)
|
|
||||||
#Once find all the requested packages we don't need to continue search
|
|
||||||
if len(packages) == 0:
|
|
||||||
break
|
|
||||||
|
|
||||||
#Even a single missing package is a reason for failure.
|
|
||||||
if len(packages) > 0:
|
|
||||||
msg = "Following packages are not installed {}".format(packages)
|
|
||||||
module.fail_json(
|
|
||||||
msg=msg
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
return installed
|
|
||||||
|
|
||||||
|
|
||||||
def check_update(module, packages_list, pkg_mgr):
|
|
||||||
"""Check if the packages in the 'packages_list are up to date.
|
|
||||||
Queries binaries, defined the in relevant SUPPORTED_PKG_MGRS entry,
|
|
||||||
to obtain information about present and available packages.
|
|
||||||
|
|
||||||
:param module: ansible module providing fail_json and exit_json
|
|
||||||
methods
|
|
||||||
:type module: AnsibleModule
|
|
||||||
:param packages_list: list of packages to be checked
|
|
||||||
:type package: list
|
|
||||||
:param pkg_mgr: Package manager to check for update availability
|
|
||||||
:type pkg_mgr: string
|
|
||||||
|
|
||||||
:return: None
|
|
||||||
:rtype: None
|
|
||||||
"""
|
|
||||||
if len(packages_list) == 0:
|
|
||||||
module.fail_json(
|
|
||||||
msg="No packages given to check.")
|
|
||||||
return
|
|
||||||
|
|
||||||
if pkg_mgr is None:
|
|
||||||
pkg_mgr = _get_pkg_manager(module=module)
|
|
||||||
if pkg_mgr not in SUPPORTED_PKG_MGRS:
|
|
||||||
module.fail_json(
|
|
||||||
msg='Package manager "{}" is not supported.'.format(pkg_mgr))
|
|
||||||
return
|
|
||||||
|
|
||||||
pkg_mgr = SUPPORTED_PKG_MGRS[pkg_mgr]
|
|
||||||
|
|
||||||
installed_stdout, installed_stderr = _command(pkg_mgr['query_installed'])
|
|
||||||
|
|
||||||
# Fail the module if for some reason we can't lookup the current package.
|
|
||||||
if installed_stderr != '':
|
|
||||||
module.fail_json(msg=installed_stderr)
|
|
||||||
return
|
|
||||||
if not installed_stdout:
|
|
||||||
module.fail_json(
|
|
||||||
msg='no output returned for the query.{}'.format(
|
|
||||||
' '.join(pkg_mgr['query_installed'])
|
|
||||||
))
|
|
||||||
return
|
|
||||||
|
|
||||||
installed = _get_installed_pkgs(installed_stdout, packages_list, module)
|
|
||||||
|
|
||||||
installed_pkg_names = ' '.join(installed)
|
|
||||||
|
|
||||||
pkg_mgr['query_available'].append(installed_pkg_names)
|
|
||||||
|
|
||||||
available_stdout, available_stderr = _command(pkg_mgr['query_available'])
|
|
||||||
|
|
||||||
#We need to check that the stderr consists only of the expected strings
|
|
||||||
#This can get complicated if the CLI on the pkg manager side changes.
|
|
||||||
if not _allowed_pkg_manager_stderr(available_stderr, pkg_mgr['allowed_errors']):
|
|
||||||
module.fail_json(msg=available_stderr)
|
|
||||||
return
|
|
||||||
if available_stdout:
|
|
||||||
new_pkgs_info = _get_new_pkg_info(available_stdout)
|
|
||||||
else:
|
|
||||||
new_pkgs_info = {}
|
|
||||||
|
|
||||||
results = []
|
|
||||||
|
|
||||||
for installed_pkg in installed:
|
|
||||||
|
|
||||||
results.append(
|
|
||||||
{
|
|
||||||
'name': installed_pkg,
|
|
||||||
'current_version': installed[installed_pkg].version,
|
|
||||||
'current_release': installed[installed_pkg].release,
|
|
||||||
'new_version': None,
|
|
||||||
'new_release': None
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if installed_pkg in new_pkgs_info:
|
|
||||||
results[-1]['new_version'] = new_pkgs_info[installed_pkg][1]
|
|
||||||
results[-1]['new_release'] = new_pkgs_info[installed_pkg][2]
|
|
||||||
|
|
||||||
module.exit_json(
|
|
||||||
changed=False,
|
|
||||||
outdated_pkgs=results
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
module = AnsibleModule(
|
|
||||||
argument_spec=yaml_safe_load(DOCUMENTATION)['options']
|
|
||||||
)
|
|
||||||
|
|
||||||
check_update(
|
|
||||||
module,
|
|
||||||
packages_list=module.params.get('packages_list'),
|
|
||||||
pkg_mgr=module.params.get('pkg_mgr', None))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user