Add reportentry.py custom module
Change-Id: I2832475a131fae6f7fb95158bacdd9f615ca891f Signed-off-by: Gael Chamoulaud (Strider) <gchamoul@redhat.com>
This commit is contained in:
parent
d48b4b7714
commit
f2b62f98f2
93
validations_common/library/reportentry.py
Normal file
93
validations_common/library/reportentry.py
Normal file
@ -0,0 +1,93 @@
|
||||
# -*- 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.
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from yaml import safe_load as yaml_safe_load
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
module: reportentry
|
||||
short_description: Print a custom report
|
||||
description:
|
||||
- Print a custom report
|
||||
options:
|
||||
report_status:
|
||||
required: true
|
||||
description:
|
||||
- The report status. Should be 'OK', 'ERROR' or 'SKIPPED'.
|
||||
choices:
|
||||
- 'OK'
|
||||
- 'ERROR'
|
||||
- 'SKIPPED'
|
||||
type: str
|
||||
report_reason:
|
||||
required: true
|
||||
description:
|
||||
- The reason of the report
|
||||
type: str
|
||||
report_recommendations:
|
||||
required: true
|
||||
description:
|
||||
- A list of recommendations to do.
|
||||
type: list
|
||||
author: "Gael Chamoulaud"
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
- hosts: undercloud
|
||||
tasks:
|
||||
- name: Report DNS setup in undercloud.conf
|
||||
reportentry:
|
||||
report_status: "ERROR"
|
||||
report_reason: "DNS is not setup correctly in undercloud.conf"
|
||||
report_recommendations:
|
||||
- "Please set the 'undercloud_nameservers' param in undercloud.conf"
|
||||
'''
|
||||
|
||||
|
||||
def format_msg_report(status, reason, recommendations):
|
||||
msg = ("[{}] '{}'\n".format(status, reason))
|
||||
if recommendations:
|
||||
for rec in recommendations:
|
||||
msg += " - RECOMMENDATION: {}\n".format(rec)
|
||||
|
||||
return msg
|
||||
|
||||
|
||||
def display_type_report(module, status, msg):
|
||||
if status == 'ERROR':
|
||||
module.fail_json(msg=msg)
|
||||
elif status == "SKIPPED":
|
||||
module.exit_json(changed=False,
|
||||
warnings=msg)
|
||||
else:
|
||||
module.exit_json(changed=False,
|
||||
msg=msg)
|
||||
|
||||
|
||||
def main():
|
||||
module = AnsibleModule(
|
||||
argument_spec=yaml_safe_load(DOCUMENTATION)['options']
|
||||
)
|
||||
|
||||
status = module.params.get('report_status')
|
||||
msg = format_msg_report(module.params.get('report_status'),
|
||||
module.params.get('report_reason'),
|
||||
module.params.get('report_recommendations'))
|
||||
|
||||
display_type_report(module, status, msg)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
84
validations_common/tests/library/test_reportentry.py
Normal file
84
validations_common/tests/library/test_reportentry.py
Normal file
@ -0,0 +1,84 @@
|
||||
# -*- 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.
|
||||
|
||||
"""
|
||||
test_report_entry
|
||||
----------------------------------
|
||||
|
||||
Tests for `reportentry` module.
|
||||
"""
|
||||
|
||||
|
||||
import validations_common.library.reportentry as validation
|
||||
from validations_common.tests import base
|
||||
|
||||
from unittest import mock
|
||||
|
||||
reason = "Reason #1"
|
||||
recommendation = ['Recommendation #1']
|
||||
recommendations = [
|
||||
'Recommendation #1', 'Recommendation #2', 'Recommendation #3'
|
||||
]
|
||||
valid_report = '''[{}] '{}'
|
||||
- RECOMMENDATION: Recommendation #1
|
||||
'''
|
||||
|
||||
multi_reco_valid_report = '''[{}] '{}'
|
||||
- RECOMMENDATION: Recommendation #1
|
||||
- RECOMMENDATION: Recommendation #2
|
||||
- RECOMMENDATION: Recommendation #3
|
||||
'''
|
||||
|
||||
|
||||
class TestReportEntry(base.TestCase):
|
||||
def setUp(self):
|
||||
super(TestReportEntry, self).setUp()
|
||||
self.module = mock.MagicMock()
|
||||
|
||||
def test_format_msg_report_error(self):
|
||||
'''Test reportentry with error status'''
|
||||
|
||||
status = "ERROR"
|
||||
one_reco_report = valid_report.format(status, reason, recommendation)
|
||||
report = validation.format_msg_report(status, reason, recommendation)
|
||||
validation.display_type_report(self.module, status, report)
|
||||
self.assertEqual(one_reco_report, report)
|
||||
validation.display_type_report(self.module, status, report)
|
||||
self.module.fail_json.assert_called_with(msg=report)
|
||||
|
||||
def test_format_msg_report_skipped(self):
|
||||
'''Test reportentry with skipped status'''
|
||||
|
||||
status = "SKIPPED"
|
||||
one_reco_report = valid_report.format(status, reason, recommendation)
|
||||
report = validation.format_msg_report(status, reason, recommendation)
|
||||
self.assertEqual(one_reco_report, report)
|
||||
|
||||
validation.display_type_report(self.module, status, report)
|
||||
self.module.exit_json.assert_called_with(changed=False,
|
||||
warnings=report)
|
||||
|
||||
def test_format_msg_report_with_multiple_reco(self):
|
||||
'''Test reportentry with multiple recommendation'''
|
||||
|
||||
status = "OK"
|
||||
multi_reco_report = \
|
||||
multi_reco_valid_report.format(status,
|
||||
reason,
|
||||
recommendations)
|
||||
report = validation.format_msg_report(status, reason, recommendations)
|
||||
self.assertEqual(multi_reco_report, report)
|
||||
|
||||
validation.display_type_report(self.module, status, report)
|
||||
self.module.exit_json.assert_called_with(changed=False, msg=report)
|
Loading…
Reference in New Issue
Block a user