From f2b62f98f2216dfc94923c46b7a385d3a4829589 Mon Sep 17 00:00:00 2001 From: "Gael Chamoulaud (Strider)" Date: Tue, 17 Mar 2020 15:05:59 +0100 Subject: [PATCH] Add reportentry.py custom module Change-Id: I2832475a131fae6f7fb95158bacdd9f615ca891f Signed-off-by: Gael Chamoulaud (Strider) --- validations_common/library/reportentry.py | 93 +++++++++++++++++++ .../tests/library/test_reportentry.py | 84 +++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 validations_common/library/reportentry.py create mode 100644 validations_common/tests/library/test_reportentry.py diff --git a/validations_common/library/reportentry.py b/validations_common/library/reportentry.py new file mode 100644 index 0000000..77034ce --- /dev/null +++ b/validations_common/library/reportentry.py @@ -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() diff --git a/validations_common/tests/library/test_reportentry.py b/validations_common/tests/library/test_reportentry.py new file mode 100644 index 0000000..92075a5 --- /dev/null +++ b/validations_common/tests/library/test_reportentry.py @@ -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)