From 3dd75d73dfe5eef23f61e6d7a9250d45a76d68b9 Mon Sep 17 00:00:00 2001 From: linyh Date: Mon, 1 Aug 2022 09:36:13 +0800 Subject: [PATCH 1/2] feat: add before_action and after_action for blueprint --- models/blueprint.go | 2 ++ services/blueprint.go | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/models/blueprint.go b/models/blueprint.go index 413bb9aa27e..2913a8a002c 100644 --- a/models/blueprint.go +++ b/models/blueprint.go @@ -47,6 +47,8 @@ func (Blueprint) TableName() string { type BlueprintSettings struct { Version string `json:"version" validate:"required,semver,oneof=1.0.0"` Connections json.RawMessage `json:"connections" validate:"required"` + BeforePlan json.RawMessage `json:"before_plan"` + AfterPlan json.RawMessage `json:"after_plan"` } // UnmarshalPlan unmarshals Plan in JSON to strong-typed core.PipelinePlan diff --git a/services/blueprint.go b/services/blueprint.go index 4709a664158..55bd40d2a85 100644 --- a/services/blueprint.go +++ b/services/blueprint.go @@ -280,7 +280,28 @@ func GeneratePlanJsonV100(settings *models.BlueprintSettings) (core.PipelinePlan return nil, fmt.Errorf("plugin %s does not support blueprint protocol version 1.0.0", connection.Plugin) } } - return MergePipelinePlans(plans...), nil + newPipelinePlan := core.PipelinePlan{} + if settings.BeforePlan != nil { + beforePipelinePlan := core.PipelinePlan{} + err = json.Unmarshal(settings.BeforePlan, &beforePipelinePlan) + if err != nil { + return nil, err + } + newPipelinePlan = append(newPipelinePlan, beforePipelinePlan...) + } + + mergedPipelinePlan := MergePipelinePlans(plans...) + newPipelinePlan = append(newPipelinePlan, mergedPipelinePlan...) + + if settings.AfterPlan != nil { + afterPipelinePlan := core.PipelinePlan{} + err = json.Unmarshal(settings.AfterPlan, &afterPipelinePlan) + if err != nil { + return nil, err + } + newPipelinePlan = append(newPipelinePlan, afterPipelinePlan...) + } + return newPipelinePlan, nil } // MergePipelinePlans merges multiple pipelines into one unified pipeline From 9ac7cedfbb32f97072f83dd7bd260a47444b6992 Mon Sep 17 00:00:00 2001 From: linyh Date: Tue, 9 Aug 2022 17:37:40 +0800 Subject: [PATCH 2/2] test: add unittest --- services/blueprint.go | 18 ++++++++++------ services/blueprint_test.go | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/services/blueprint.go b/services/blueprint.go index 55bd40d2a85..1c2544c7a0a 100644 --- a/services/blueprint.go +++ b/services/blueprint.go @@ -280,22 +280,28 @@ func GeneratePlanJsonV100(settings *models.BlueprintSettings) (core.PipelinePlan return nil, fmt.Errorf("plugin %s does not support blueprint protocol version 1.0.0", connection.Plugin) } } + + mergedPipelinePlan := MergePipelinePlans(plans...) + return FormatPipelinePlans(settings.BeforePlan, mergedPipelinePlan, settings.AfterPlan) +} + +// FormatPipelinePlans merges multiple pipelines and append before and after pipeline +func FormatPipelinePlans(beforePlanJson json.RawMessage, mainPlan core.PipelinePlan, afterPlanJson json.RawMessage) (core.PipelinePlan, error) { newPipelinePlan := core.PipelinePlan{} - if settings.BeforePlan != nil { + if beforePlanJson != nil { beforePipelinePlan := core.PipelinePlan{} - err = json.Unmarshal(settings.BeforePlan, &beforePipelinePlan) + err := json.Unmarshal(beforePlanJson, &beforePipelinePlan) if err != nil { return nil, err } newPipelinePlan = append(newPipelinePlan, beforePipelinePlan...) } - mergedPipelinePlan := MergePipelinePlans(plans...) - newPipelinePlan = append(newPipelinePlan, mergedPipelinePlan...) + newPipelinePlan = append(newPipelinePlan, mainPlan...) - if settings.AfterPlan != nil { + if afterPlanJson != nil { afterPipelinePlan := core.PipelinePlan{} - err = json.Unmarshal(settings.AfterPlan, &afterPipelinePlan) + err := json.Unmarshal(afterPlanJson, &afterPipelinePlan) if err != nil { return nil, err } diff --git a/services/blueprint_test.go b/services/blueprint_test.go index f4e5384892d..8c7862adbb8 100644 --- a/services/blueprint_test.go +++ b/services/blueprint_test.go @@ -18,6 +18,7 @@ limitations under the License. package services import ( + "encoding/json" "testing" "github.com/apache/incubator-devlake/plugins/core" @@ -92,3 +93,45 @@ func TestMergePipelineTasks(t *testing.T) { MergePipelinePlans(plan1, plan2, plan3), ) } + +func TestFormatPipelinePlans(t *testing.T) { + beforePlan2 := json.RawMessage(`[[{"plugin":"github"},{"plugin":"gitlab"}],[{"plugin":"gitextractor1"},{"plugin":"gitextractor2"}]]`) + + mainPlan := core.PipelinePlan{ + { + {Plugin: "jira"}, + }, + } + + afterPlan2 := json.RawMessage(`[[{"plugin":"jenkins"}],[{"plugin":"jenkins"}]]`) + + result1, err1 := FormatPipelinePlans(nil, mainPlan, nil) + assert.Nil(t, err1) + assert.Equal(t, mainPlan, result1) + + result2, err2 := FormatPipelinePlans(beforePlan2, mainPlan, afterPlan2) + assert.Nil(t, err2) + assert.Equal(t, core.PipelinePlan{ + { + {Plugin: "github"}, + {Plugin: "gitlab"}, + }, + { + {Plugin: "gitextractor1"}, + {Plugin: "gitextractor2"}, + }, + { + {Plugin: "jira"}, + }, + { + {Plugin: "jenkins"}, + }, + { + {Plugin: "jenkins"}, + }, + }, result2) + + result3, err3 := FormatPipelinePlans(json.RawMessage("[]"), mainPlan, json.RawMessage("[]")) + assert.Nil(t, err3) + assert.Equal(t, mainPlan, result3) +}