diff --git a/jenkins_jobs/modules/helpers.py b/jenkins_jobs/modules/helpers.py index 1c37c43d2..51ad2a109 100644 --- a/jenkins_jobs/modules/helpers.py +++ b/jenkins_jobs/modules/helpers.py @@ -492,11 +492,19 @@ def convert_mapping_to_xml(parent, data, mapping, fail_required=False): configuring the XML tag for the parameter. We recommend for new plugins to set fail_required=True and instead of optional parameters provide a default value for all paramters that are not required instead. + + valid_options provides a way to check if the value the user input is from a + list of available options. When the user pass a value that is not supported + from the list, it raise an InvalidAttributeError. """ for elem in mapping: - (optname, xmlname, val) = elem + (optname, xmlname, val) = elem[:3] val = data.get(optname, val) + valid_options = [] + if len(elem) == 4: + valid_options = elem[3] + # Use fail_required setting to allow support for optional parameters # we will phase this out in the future as we rework plugins so that # optional parameters use a default setting instead. @@ -509,6 +517,10 @@ def convert_mapping_to_xml(parent, data, mapping, fail_required=False): if val is None and fail_required is False: continue + if valid_options: + if val not in valid_options: + raise InvalidAttributeError(optname, val, valid_options) + if type(val) == bool: val = str(val).lower() XML.SubElement(parent, xmlname).text = str(val) diff --git a/tests/modules/test_helpers.py b/tests/modules/test_helpers.py index b0bcb603f..a59fa3e77 100644 --- a/tests/modules/test_helpers.py +++ b/tests/modules/test_helpers.py @@ -18,6 +18,7 @@ from testtools.matchers import Equals import xml.etree.ElementTree as XML import yaml +from jenkins_jobs.errors import InvalidAttributeError from jenkins_jobs.errors import MissingAttributeError from jenkins_jobs.modules.helpers import convert_mapping_to_xml from tests.base import LoggingFixture @@ -68,3 +69,16 @@ class TestCaseTestHelpers(LoggingFixture, testtools.TestCase): required_data, required_mappings, fail_required=True) + + # Test invalid user input + user_input_root = XML.Element('testUserInput') + user_input_data = yaml.load("user-input-string: bye") + valid_inputs = ['hello'] + user_input_mappings = [('user-input-string', 'userInputString', + 'user-input', valid_inputs)] + + self.assertRaises(InvalidAttributeError, + convert_mapping_to_xml, + user_input_root, + user_input_data, + user_input_mappings)