diff --git a/pkg/apis/pipelinesascode/v1alpha1/types.go b/pkg/apis/pipelinesascode/v1alpha1/types.go index 67a6eb403..db9e30b48 100644 --- a/pkg/apis/pipelinesascode/v1alpha1/types.go +++ b/pkg/apis/pipelinesascode/v1alpha1/types.go @@ -128,6 +128,7 @@ type Params struct { Value string `json:"value,omitempty"` SecretRef *Secret `json:"secret_ref,omitempty"` Filter string `json:"filter,omitempty"` + Required bool `json:"required,omitempty"` } type Incoming struct { diff --git a/pkg/customparams/customparams.go b/pkg/customparams/customparams.go index aa7f7ea69..e633654ff 100644 --- a/pkg/customparams/customparams.go +++ b/pkg/customparams/customparams.go @@ -64,7 +64,7 @@ func (p *CustomParams) applyIncomingParams(ret map[string]string) map[string]str // matched true. func (p *CustomParams) GetParams(ctx context.Context) (map[string]string, map[string]interface{}, error) { stdParams, changedFiles := p.makeStandardParamsFromEvent(ctx) - ret, mapFilters, parsedFromComment := map[string]string{}, map[string]string{}, map[string]string{} + resolvedParams, mapFilters, parsedFromComment := map[string]string{}, map[string]string{}, map[string]string{} if p.event.TriggerComment != "" { parsedFromComment = opscomments.ParseKeyValueArgs(p.event.TriggerComment) for k, v := range parsedFromComment { @@ -121,8 +121,12 @@ func (p *CustomParams) GetParams(ctx context.Context) (map[string]string, map[st "ParamsFilterUsedValue", fmt.Sprintf("repo %s, param name %s has a value and secretref, picking value", p.repo.GetName(), value.Name)) } + var resolvedValue string + if value.Value != "" { - ret[value.Name] = value.Value + resolvedValue = value.Value + } else if parsedValue, ok := parsedFromComment[value.Name]; ok && parsedValue != "" { + resolvedValue = parsedValue } else if value.SecretRef != nil { secretValue, err := p.k8int.GetSecret(ctx, sectypes.GetSecretOpt{ Namespace: p.repo.GetNamespace(), @@ -130,9 +134,15 @@ func (p *CustomParams) GetParams(ctx context.Context) (map[string]string, map[st Key: value.SecretRef.Key, }) if err != nil { - return ret, changedFiles, err + return resolvedParams, changedFiles, err } - ret[value.Name] = secretValue + resolvedValue = secretValue + } else if value.Required { + return resolvedParams, changedFiles, fmt.Errorf("param %s is required but was not given any value", value.Name) + } + + if resolvedValue != "" { + resolvedParams[value.Name] = resolvedValue } } @@ -140,17 +150,17 @@ func (p *CustomParams) GetParams(ctx context.Context) (map[string]string, map[st // we don't let them here for k, v := range stdParams { // check if not already there - if _, ok := ret[k]; !ok && v != "" { - ret[k] = v + if _, ok := resolvedParams[k]; !ok && v != "" { + resolvedParams[k] = v } } // overwrite stdParams with parsed ones from the trigger comment for k, v := range parsedFromComment { - if _, ok := ret[k]; ok && v != "" { - ret[k] = v + if _, ok := resolvedParams[k]; ok && v != "" { + resolvedParams[k] = v } } - return p.applyIncomingParams(ret), changedFiles, nil + return p.applyIncomingParams(resolvedParams), changedFiles, nil } diff --git a/pkg/customparams/customparams_test.go b/pkg/customparams/customparams_test.go index 2c7f3f678..063275e83 100644 --- a/pkg/customparams/customparams_test.go +++ b/pkg/customparams/customparams_test.go @@ -264,6 +264,22 @@ func TestProcessTemplates(t *testing.T) { }, }, }, + { + name: "params/override params with no value via gitops arguments", + expected: map[string]string{ + "event_type": "push", + "hello": `"yolo"`, + "trigger_comment": triggerCommentArgs, + }, + event: &info.Event{EventType: "pull_request", TriggerComment: triggerCommentArgs}, + repository: &v1alpha1.Repository{ + Spec: v1alpha1.RepositorySpec{ + Params: &[]v1alpha1.Params{ + {Name: "hello"}, + }, + }, + }, + }, { name: "params/skip with no name", expectedLogSnippet: "no name has been set in params[0] of repo", @@ -277,6 +293,33 @@ func TestProcessTemplates(t *testing.T) { }, }, }, + { + name: "params/skip with no value", + expected: map[string]string{}, + repository: &v1alpha1.Repository{ + Spec: v1alpha1.RepositorySpec{ + Params: &[]v1alpha1.Params{ + { + Name: "empty-param", + }, + }, + }, + }, + }, + { + name: "params/missing required params", + expectedError: true, + repository: &v1alpha1.Repository{ + Spec: v1alpha1.RepositorySpec{ + Params: &[]v1alpha1.Params{ + { + Name: "empty-param", + Required: true, + }, + }, + }, + }, + }, { name: "params/pick value when value and secret set", expected: map[string]string{"params": "batman"},