diff --git a/igor-web/src/main/groovy/com/netflix/spinnaker/igor/build/BuildController.groovy b/igor-web/src/main/groovy/com/netflix/spinnaker/igor/build/BuildController.groovy index 0dd7cff0e..8b2e8b206 100644 --- a/igor-web/src/main/groovy/com/netflix/spinnaker/igor/build/BuildController.groovy +++ b/igor-web/src/main/groovy/com/netflix/spinnaker/igor/build/BuildController.groovy @@ -222,7 +222,10 @@ class BuildController { static void validateJobParameters(JobConfig jobConfig, Map requestParams) { jobConfig.parameterDefinitionList.each { parameterDefinition -> String matchingParam = requestParams[parameterDefinition.name] - if (matchingParam != null && parameterDefinition.type == 'ChoiceParameterDefinition' && !parameterDefinition.choices.contains(matchingParam)) { + if (matchingParam != null && + parameterDefinition.type == 'ChoiceParameterDefinition' && + parameterDefinition.choices != null && + !parameterDefinition.choices.contains(matchingParam)) { throw new InvalidJobParameterException("`${matchingParam}` is not a valid choice " + "for `${parameterDefinition.name}`. Valid choices are: ${parameterDefinition.choices.join(', ')}") } diff --git a/igor-web/src/test/groovy/com/netflix/spinnaker/igor/build/BuildControllerSpec.groovy b/igor-web/src/test/groovy/com/netflix/spinnaker/igor/build/BuildControllerSpec.groovy index 2d621ccbb..1f22832bb 100644 --- a/igor-web/src/test/groovy/com/netflix/spinnaker/igor/build/BuildControllerSpec.groovy +++ b/igor-web/src/test/groovy/com/netflix/spinnaker/igor/build/BuildControllerSpec.groovy @@ -42,6 +42,7 @@ import retrofit.client.Response import spock.lang.Shared import spock.lang.Specification +import static com.netflix.spinnaker.igor.build.BuildController.* import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status @@ -310,4 +311,39 @@ class BuildControllerSpec extends Specification { response.status == HttpStatus.BAD_REQUEST.value() response.errorMessage == "Job '${JOB_NAME}' is not buildable. It may be disabled." } + + void 'validation successful for null list of choices'() { + given: + Map requestParams = ["hey" : "you"] + ParameterDefinition parameterDefinition = new ParameterDefinition() + parameterDefinition.choices = null + parameterDefinition.type = "ChoiceParameterDefinition" + parameterDefinition.name = "hey" + JobConfig jobConfig = new JobConfig() + jobConfig.parameterDefinitionList = [parameterDefinition] + + when: + validateJobParameters(jobConfig, requestParams) + + then: + noExceptionThrown() + } + + void 'validation failed for option not in list of choices'() { + given: + Map requestParams = ["hey" : "you"] + ParameterDefinition parameterDefinition = new ParameterDefinition() + parameterDefinition.choices = ["why", "not"] + parameterDefinition.type = "ChoiceParameterDefinition" + parameterDefinition.name = "hey" + JobConfig jobConfig = new JobConfig() + jobConfig.parameterDefinitionList = [parameterDefinition] + + when: + validateJobParameters(jobConfig, requestParams) + + then: + thrown(InvalidJobParameterException) + } + }