diff --git a/pkg/apiserver/devops/project_pipeline.go b/pkg/apiserver/devops/project_pipeline.go index fe62c69e4..3bf2a59cc 100644 --- a/pkg/apiserver/devops/project_pipeline.go +++ b/pkg/apiserver/devops/project_pipeline.go @@ -39,6 +39,12 @@ func CreateDevOpsProjectPipelineHandler(request *restful.Request, resp *restful. errors.ParseSvcErr(restful.NewError(http.StatusForbidden, err.Error()), resp) return } + err = devops.ValidatePipelineConfig(pipeline) + if err != nil { + klog.Errorf("%+v", err) + errors.ParseSvcErr(restful.NewError(http.StatusBadRequest, err.Error()), resp) + return + } pipelineName, err := devops.CreateProjectPipeline(projectId, pipeline) if err != nil { @@ -96,6 +102,12 @@ func UpdateDevOpsProjectPipelineHandler(request *restful.Request, resp *restful. errors.ParseSvcErr(restful.NewError(http.StatusForbidden, err.Error()), resp) return } + err = devops.ValidatePipelineConfig(pipeline) + if err != nil { + klog.Errorf("%+v", err) + errors.ParseSvcErr(restful.NewError(http.StatusBadRequest, err.Error()), resp) + return + } pipelineName, err := devops.UpdateProjectPipeline(projectId, pipelineId, pipeline) if err != nil { diff --git a/pkg/models/devops/project_pipeline_handler.go b/pkg/models/devops/project_pipeline_handler.go index 96f6986d9..e624bcb18 100644 --- a/pkg/models/devops/project_pipeline_handler.go +++ b/pkg/models/devops/project_pipeline_handler.go @@ -309,3 +309,39 @@ func GetMultiBranchPipelineSonar(projectId, pipelineId, branchId string) ([]*Son } return sonarStatus, nil } + +func ValidatePipelineConfig(pipeline *ProjectPipeline) error { + switch pipeline.Type { + case NoScmPipelineType: + if pipeline.Pipeline == nil { + err := fmt.Errorf("request should contains Pipeline struct") + return err + } + if pipeline.Pipeline.Name == "" { + err := fmt.Errorf("pipeline name suport not be nil") + return err + } + if pipeline.Pipeline.Parameters != nil { + params := []*Parameter(*pipeline.Pipeline.Parameters) + for _, param := range params { + if param.Name == "" { + err := fmt.Errorf("param name should not be nil") + return err + } + } + } + case MultiBranchPipelineType: + if pipeline.MultiBranchPipeline == nil { + err := fmt.Errorf("request should contains MultiBranchPipeline struct") + return err + } + if pipeline.MultiBranchPipeline.Name == "" { + err := fmt.Errorf("pipeline name suport not be nil") + return err + } + default: + err := fmt.Errorf("unsupport job type") + return err + } + return nil +} diff --git a/pkg/models/devops/project_pipeline_test.go b/pkg/models/devops/project_pipeline_test.go index f1473abdf..29ef7b894 100644 --- a/pkg/models/devops/project_pipeline_test.go +++ b/pkg/models/devops/project_pipeline_test.go @@ -799,3 +799,98 @@ pipeline { agent any parameters { string(name: 'PERSON', defaultValue: 'Mr Jenki } } + +func Test_ValidatePipelineConfig(t *testing.T) { + rightInput := []*ProjectPipeline{ + { + Type: "pipeline", + Pipeline: &NoScmPipeline{ + Name: "test", + Parameters: nil, + Jenkinsfile: "echo 1", + }, + }, { + Type: "multi-branch-pipeline", + MultiBranchPipeline: &MultiBranchPipeline{ + Name: "multibranch-test", + Description: "xx", + }, + }, { + Type: "pipeline", + Pipeline: &NoScmPipeline{ + Name: "test2", + Description: "", + Discarder: nil, + Parameters: &Parameters{ + &Parameter{ + Name: "xx", + Type: "yy", + }, &Parameter{ + Name: "tt", + DefaultValue: "", + Type: "", + Description: "ccc", + }, + }, + DisableConcurrent: false, + TimerTrigger: nil, + RemoteTrigger: nil, + Jenkinsfile: "", + }, + }, + } + errorInput := []*ProjectPipeline{ + { + Type: "xx", + Pipeline: &NoScmPipeline{ + Name: "", + Parameters: nil, + Jenkinsfile: "echo 1", + }, + }, + { + Type: "pipeline", + Pipeline: &NoScmPipeline{ + Name: "", + Parameters: nil, + Jenkinsfile: "echo 1", + }, + }, { + Type: "multi-branch-pipeline", + MultiBranchPipeline: &MultiBranchPipeline{ + Name: "", + Description: "xx", + }, + }, { + Type: "pipeline", + Pipeline: &NoScmPipeline{ + Name: "test2", + Description: "", + Discarder: nil, + Parameters: &Parameters{ + &Parameter{ + Name: "", + Type: "yy", + }, &Parameter{ + Name: "tt", + Description: "ccc", + }, + }, + Jenkinsfile: "", + }, + }, + } + for _, input := range rightInput { + err := ValidatePipelineConfig(input) + if err != nil { + t.Fatal(err) + } + } + + for _, input := range errorInput { + err := ValidatePipelineConfig(input) + if err == nil { + t.Fatalf("%+v, is an error configuration", input) + } + } +}