2020-03-04 09:02:17 +01:00
|
|
|
# Copyright 2020 Red Hat, Inc.
|
|
|
|
#
|
|
|
|
# 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 logging
|
|
|
|
import os
|
|
|
|
|
|
|
|
from validations_libs.ansible import Ansible as v_ansible
|
2020-03-18 23:10:27 +01:00
|
|
|
from validations_libs.group import Group
|
2020-03-22 22:29:21 +01:00
|
|
|
from validations_libs.validation_logs import ValidationLogs, ValidationLog
|
2020-03-09 14:21:03 +01:00
|
|
|
from validations_libs import constants
|
2020-03-04 09:02:17 +01:00
|
|
|
from validations_libs import utils as v_utils
|
|
|
|
|
2020-03-18 23:10:27 +01:00
|
|
|
LOG = logging.getLogger(__name__ + ".validation_actions")
|
2020-03-04 09:02:17 +01:00
|
|
|
|
|
|
|
|
2020-03-18 23:10:27 +01:00
|
|
|
class ValidationActions(object):
|
2020-03-04 09:02:17 +01:00
|
|
|
|
2020-03-18 23:10:27 +01:00
|
|
|
def __init__(self, validation_path=None, group=None):
|
|
|
|
self.log = logging.getLogger(__name__ + ".ValidationActions")
|
|
|
|
self.validation_path = (validation_path if validation_path
|
|
|
|
else constants.ANSIBLE_VALIDATION_DIR)
|
|
|
|
self.group = group
|
|
|
|
|
|
|
|
def list_validations(self):
|
|
|
|
"""List the available validations"""
|
|
|
|
self.log = logging.getLogger(__name__ + ".list_validations")
|
|
|
|
validations = v_utils.parse_all_validations_on_disk(
|
|
|
|
self.validation_path, self.group)
|
|
|
|
|
|
|
|
return_values = []
|
|
|
|
column_name = ('ID', 'Name', 'Groups')
|
|
|
|
|
|
|
|
for val in validations:
|
|
|
|
return_values.append((val.get('id'), val.get('name'),
|
|
|
|
val.get('groups')))
|
|
|
|
return (column_name, return_values)
|
|
|
|
|
2020-03-22 19:04:07 +01:00
|
|
|
def show_validations(self, validation,
|
|
|
|
log_path=constants.VALIDATIONS_LOG_BASEDIR):
|
2020-03-18 23:10:27 +01:00
|
|
|
"""Display detailed information about a Validation"""
|
|
|
|
self.log = logging.getLogger(__name__ + ".show_validations")
|
|
|
|
# Get validation data:
|
2020-03-22 19:04:07 +01:00
|
|
|
vlog = ValidationLogs(log_path)
|
2020-03-24 14:47:16 +01:00
|
|
|
data = v_utils.get_validations_data(validation, self.validation_path)
|
2020-03-22 19:04:07 +01:00
|
|
|
logfiles = vlog.get_all_logfiles_content()
|
|
|
|
format = vlog.get_validations_stats(logfiles)
|
2020-03-18 23:10:27 +01:00
|
|
|
data.update(format)
|
|
|
|
return data
|
2020-03-04 09:02:17 +01:00
|
|
|
|
2020-03-09 21:49:14 +01:00
|
|
|
def run_validations(self, playbook=[], inventory='localhost',
|
2020-03-04 17:36:34 +01:00
|
|
|
group=None, extra_vars=None, validations_dir=None,
|
2020-03-09 19:04:38 +01:00
|
|
|
validation_name=None, extra_env_vars=None,
|
2020-04-09 10:03:44 +02:00
|
|
|
ansible_cfg=None, quiet=True, workdir=None,
|
|
|
|
limit_hosts=None):
|
2020-03-04 09:02:17 +01:00
|
|
|
|
|
|
|
self.log = logging.getLogger(__name__ + ".run_validations")
|
2020-04-09 16:15:42 +02:00
|
|
|
playbooks = []
|
2020-03-24 00:01:22 +01:00
|
|
|
if playbook:
|
|
|
|
if isinstance(playbook, list):
|
|
|
|
playbooks = playbook
|
|
|
|
elif isinstance(playbook, str):
|
|
|
|
playbooks = [playbook]
|
|
|
|
else:
|
|
|
|
raise TypeError("Playbooks should be a List or a Str")
|
2020-03-09 19:04:38 +01:00
|
|
|
|
2020-03-04 09:02:17 +01:00
|
|
|
if group:
|
|
|
|
self.log.debug('Getting the validations list by group')
|
|
|
|
try:
|
|
|
|
validations = v_utils.parse_all_validations_on_disk(
|
2020-03-04 15:26:35 +01:00
|
|
|
(validations_dir if validations_dir
|
2020-03-04 09:02:17 +01:00
|
|
|
else constants.ANSIBLE_VALIDATION_DIR), group)
|
|
|
|
for val in validations:
|
|
|
|
playbooks.append(val.get('id') + '.yaml')
|
|
|
|
except Exception as e:
|
|
|
|
raise(e)
|
2020-03-06 11:05:25 +01:00
|
|
|
elif validation_name:
|
2020-03-24 00:01:22 +01:00
|
|
|
playbooks = v_utils.get_validations_playbook(
|
|
|
|
(validations_dir if validations_dir
|
|
|
|
else constants.ANSIBLE_VALIDATION_DIR),
|
|
|
|
validation_name, group)
|
2020-03-06 11:05:25 +01:00
|
|
|
else:
|
|
|
|
raise RuntimeError("No validations found")
|
|
|
|
|
2020-03-04 09:02:17 +01:00
|
|
|
self.log.debug('Running the validations with Ansible')
|
|
|
|
results = []
|
2020-03-11 17:07:56 +01:00
|
|
|
for playbook in playbooks:
|
|
|
|
validation_uuid, artifacts_dir = v_utils.create_artifacts_dir(
|
|
|
|
prefix=os.path.basename(playbook))
|
|
|
|
run_ansible = v_ansible(validation_uuid)
|
|
|
|
_playbook, _rc, _status = run_ansible.run(
|
|
|
|
workdir=artifacts_dir,
|
|
|
|
playbook=playbook,
|
|
|
|
playbook_dir=(validations_dir if
|
|
|
|
validations_dir else
|
|
|
|
constants.ANSIBLE_VALIDATION_DIR),
|
|
|
|
parallel_run=True,
|
|
|
|
inventory=inventory,
|
|
|
|
output_callback='validation_json',
|
|
|
|
quiet=quiet,
|
|
|
|
extra_vars=extra_vars,
|
2020-04-09 10:03:44 +02:00
|
|
|
limit_hosts=limit_hosts,
|
2020-03-11 17:07:56 +01:00
|
|
|
extra_env_variables=extra_env_vars,
|
|
|
|
ansible_cfg=ansible_cfg,
|
|
|
|
gathering_policy='explicit',
|
|
|
|
ansible_artifact_path=artifacts_dir)
|
2020-03-04 09:02:17 +01:00
|
|
|
results.append({'validation': {
|
2020-03-11 17:07:56 +01:00
|
|
|
'playbook': _playbook,
|
|
|
|
'rc_code': _rc,
|
|
|
|
'status': _status,
|
2020-03-22 19:04:07 +01:00
|
|
|
'validation_id': _playbook.split('.')[0]
|
2020-03-11 17:07:56 +01:00
|
|
|
}})
|
2020-03-22 19:04:07 +01:00
|
|
|
# Return log results
|
|
|
|
vlog = ValidationLogs()
|
|
|
|
return vlog.get_results(validation_uuid)
|
2020-03-18 23:10:27 +01:00
|
|
|
|
|
|
|
def group_information(self, groups):
|
|
|
|
"""Get Information about Validation Groups"""
|
|
|
|
val_gp = Group(groups)
|
|
|
|
group = val_gp.get_formated_group
|
|
|
|
|
|
|
|
group_info = []
|
|
|
|
# Get validations number by groups
|
|
|
|
for gp in group:
|
|
|
|
validations = v_utils.parse_all_validations_on_disk(
|
|
|
|
constants.ANSIBLE_VALIDATION_DIR, gp[0])
|
|
|
|
group_info.append((gp[0], gp[1], len(validations)))
|
|
|
|
column_name = ("Groups", "Description", "Number of Validations")
|
|
|
|
return (column_name, group_info)
|
2020-03-19 00:22:15 +01:00
|
|
|
|
|
|
|
def show_validations_parameters(self, validation, group=None):
|
|
|
|
"""Return Validations Parameters"""
|
2020-04-01 15:48:23 +02:00
|
|
|
validations = v_utils.get_validations_playbook(
|
|
|
|
constants.ANSIBLE_VALIDATION_DIR, group)
|
2020-03-19 00:22:15 +01:00
|
|
|
|
2020-04-01 15:48:23 +02:00
|
|
|
return v_utils.get_validations_parameters(validations, validation,
|
2020-03-19 00:22:15 +01:00
|
|
|
group)
|
2020-03-22 22:29:21 +01:00
|
|
|
|
2020-04-01 15:48:23 +02:00
|
|
|
def show_history(self, validation_id=None):
|
2020-03-22 22:29:21 +01:00
|
|
|
"""Return validations history"""
|
|
|
|
vlogs = ValidationLogs()
|
|
|
|
logs = (vlogs.get_logfile_by_validation(validation_id)
|
|
|
|
if validation_id else vlogs.get_all_logfiles())
|
|
|
|
|
|
|
|
values = []
|
|
|
|
column_name = ('UUID', 'Validations',
|
|
|
|
'Status', 'Execution at',
|
|
|
|
'Duration')
|
|
|
|
|
|
|
|
for log in logs:
|
|
|
|
vlog = ValidationLog(logfile=log)
|
|
|
|
values.append((vlog.get_uuid, vlog.validation_id,
|
|
|
|
vlog.get_status, vlog.get_start_time,
|
|
|
|
vlog.get_duration))
|
|
|
|
|
|
|
|
return (column_name, values)
|