Move Ansible components to validations_common directory

* Add missing Ansible & Yamllint configuration files
* Fix requirements issues
* Add tools/validate-files.py

Signed-off-by: Gael Chamoulaud (Strider) <gchamoul@redhat.com>
This commit is contained in:
Gael Chamoulaud (Strider) 2020-03-05 12:45:46 +01:00
parent 59a9e69f47
commit ba5e10832e
No known key found for this signature in database
GPG Key ID: 4119D0305C651D66
124 changed files with 384 additions and 27 deletions

23
.ansible-lint Normal file
View File

@ -0,0 +1,23 @@
exclude_paths:
- releasenotes/
parseable: true
quiet: false
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

11
.yamllint Normal file
View File

@ -0,0 +1,11 @@
---
extends: default
rules:
line-length:
# matches hardcoded 160 value from ansible-lint
max: 160
ignore: |
zuul.d/*.yaml
releasenotes/notes/*.yaml

View File

@ -3,14 +3,4 @@
# process, which may cause wedges in the gate later.
pbr>=3.1.1 # Apache-2.0
oslo.config>=5.2.0 # Apache-2.0
keystoneauth1>=3.12.0 # Apache-2.0
python-novaclient>=15.1.0 # Apache-2.0
python-heatclient>=1.10.0 # Apache-2.0
python-glanceclient>=2.9.1 # Apache-2.0
python-ironicclient>=2.7.0 # Apache-2.0
python-ironic-inspector-client>=3.1.1 # Apache-2.0
os-net-config>=7.1.0 # Apache-2.0
oslo.utils>=3.40.2 # Apache-2.0
six>=1.11.0 # MIT
tripleo-common>=7.1.0 # Apache-2.0
PyYAML

View File

@ -26,10 +26,10 @@ packages =
validations_common
data_files =
share/validations-common/roles = roles/*
share/validations-common/callback_plugins = callback_plugins/*
share/validations-common/lookup_plugins = lookup_plugins/*
share/validations-common/library = library/*
share/validations-common/roles = validations_common/roles/*
share/validations-common/callback_plugins = validations_common/callback_plugins/*
share/validations-common/lookup_plugins = validations_common/lookup_plugins/*
share/validations-common/library = validations_common/library/*
[build_sphinx]
source-dir = doc/source

View File

@ -7,8 +7,6 @@ hacking<0.12,>=0.11.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0
python-subunit>=1.0.0 # Apache-2.0/BSD
sphinx>=1.8.0,<2.0.0;python_version=='2.7' # BSD
sphinx>=1.8.0,!=2.1.0;python_version>='3.4' # BSD
oslotest>=3.2.0 # Apache-2.0
testrepository>=0.0.18 # Apache-2.0/BSD
testscenarios>=0.4 # Apache-2.0/BSD

View File

@ -66,9 +66,7 @@ for base_path in path_args:
if f.endswith('.py') \
and not f == '__init__.py' \
and subdir in [os.path.join(base_path,
'validations',
'library'),
os.path.join(base_path,
'validations_common',
'library')]:
file_path = os.path.join(subdir, f)
if quiet < 1:

12
tox.ini
View File

@ -7,10 +7,10 @@ skipdist = True
usedevelop = True
passenv = *
setenv =
ANSIBLE_CALLBACK_PLUGINS={toxinidir}/callback_plugins
ANSIBLE_LOOKUP_PLUGINS={toxinidir}/lookup_plugins
ANSIBLE_LIBRARY={toxinidir}/library
ANSIBLE_ROLES_PATH={toxinidir}/roles
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
@ -49,8 +49,8 @@ envdir = {toxworkdir}/linters
deps =
{[testenv:linters]deps}
commands =
bash -c "ANSIBLE_ROLES_PATH='{toxinidir}/roles'"
bash -c "ANSIBLE_LIBRARY='{toxinidir}/library'"
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]

View File

@ -0,0 +1,97 @@
#!/usr/bin/env python
# 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()

View File

@ -0,0 +1,145 @@
#!/usr/bin/env python
# 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."""
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 a given package
description:
- Check for available updates for a given package
options:
package:
required: true
description:
- The name of the package you want to check
type: str
pkg_mgr:
required: true
description:
- Supported Package Manager, DNF or YUM
type: str
author: "Florian Fuchs"
'''
EXAMPLES = '''
- hosts: webservers
tasks:
- name: Get available updates for packages
check_package_update:
package: python-tripleoclient
pkg_mgr: "{{ ansible_pkg_mgr}}"
'''
SUPPORTED_PKG_MGRS = (
'yum',
'dnf',
)
PackageDetails = collections.namedtuple('PackageDetails',
['name', 'version', 'release', 'arch'])
def get_package_details(output):
if output:
return PackageDetails(
output.split('|')[0],
output.split('|')[1],
output.split('|')[2],
output.split('|')[3],
)
def _command(command):
# Return the result of a subprocess call
# as [stdout, stderr]
process = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
return process.communicate()
def check_update(module, package, pkg_mgr):
if pkg_mgr not in SUPPORTED_PKG_MGRS:
module.fail_json(
msg='Package manager "{}" is not supported.'.format(pkg_mgr))
return
installed_stdout, installed_stderr = _command(
['rpm', '-qa', '--qf',
'%{NAME}|%{VERSION}|%{RELEASE}|%{ARCH}',
package])
# Fail the module if for some reason we can't lookup the current package.
if installed_stderr != '':
module.fail_json(msg=installed_stderr)
return
elif not installed_stdout:
module.fail_json(
msg='"{}" is not an installed package.'.format(package))
return
installed = get_package_details(installed_stdout)
pkg_mgr_option = 'available'
if pkg_mgr == 'dnf':
pkg_mgr_option = '--available'
available_stdout, available_stderr = _command(
[pkg_mgr, '-q', 'list', pkg_mgr_option, installed.name])
if available_stdout:
new_pkg_info = available_stdout.split('\n')[1].rstrip().split()[:2]
new_ver, new_rel = new_pkg_info[1].split('-')
module.exit_json(
changed=False,
name=installed.name,
current_version=installed.version,
current_release=installed.release,
new_version=new_ver,
new_release=new_rel)
else:
module.exit_json(
changed=False,
name=installed.name,
current_version=installed.version,
current_release=installed.release,
new_version=None,
new_release=None)
def main():
module = AnsibleModule(
argument_spec=yaml_safe_load(DOCUMENTATION)['options']
)
check_update(module,
module.params.get('package'),
module.params.get('pkg_mgr'))
if __name__ == '__main__':
main()

Some files were not shown because too many files have changed in this diff Show More