Skip to content

Commit dd502d8

Browse files
authored
fix(api): remove all pipeline parameters before inserting new ones (#5125)
1 parent 788e7f6 commit dd502d8

File tree

4 files changed

+46
-138
lines changed

4 files changed

+46
-138
lines changed

engine/api/pipeline.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ func (api *API) postPipelineRollbackHandler() service.Handler {
190190
}
191191
}(&msgList)
192192

193-
if err := pipeline.ImportUpdate(ctx, tx, *proj, audit.Pipeline, msgChan, u); err != nil {
193+
if err := pipeline.ImportUpdate(ctx, tx, *proj, audit.Pipeline, msgChan); err != nil {
194194
return sdk.WrapError(err, "cannot import pipeline")
195195
}
196196

engine/api/pipeline/pipeline_importer.go

Lines changed: 41 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
)
1616

1717
//ImportUpdate import and update the pipeline in the project
18-
func ImportUpdate(ctx context.Context, db gorp.SqlExecutor, proj sdk.Project, pip *sdk.Pipeline, msgChan chan<- sdk.Message, u sdk.Identifiable) error {
18+
func ImportUpdate(ctx context.Context, db gorp.SqlExecutor, proj sdk.Project, pip *sdk.Pipeline, msgChan chan<- sdk.Message) error {
1919
t := time.Now()
2020
log.Debug("ImportUpdate> Begin")
2121
defer log.Debug("ImportUpdate> End (%d ns)", time.Since(t).Nanoseconds())
@@ -40,155 +40,63 @@ func ImportUpdate(ctx context.Context, db gorp.SqlExecutor, proj sdk.Project, pi
4040

4141
rx := sdk.NamePatternSpaceRegex
4242
pip.ID = oldPipeline.ID
43+
44+
// Delete old stages
45+
for _, s := range oldPipeline.Stages {
46+
if err := DeleteStageByID(ctx, db, &s); err != nil {
47+
return sdk.WrapError(err, "unable to delete stage %d", s.ID)
48+
}
49+
}
50+
51+
// delete old parameters
52+
if err := DeleteAllParameterFromPipeline(db, oldPipeline.ID); err != nil {
53+
return sdk.WrapError(err, "unable to delete pipeline parameters for pipeline %d", oldPipeline.ID)
54+
}
55+
56+
// Insert new stages
4357
for i := range pip.Stages {
4458
s := &pip.Stages[i]
4559
// stage name mandatory if there are many stages
4660
if len(pip.Stages) > 1 && !rx.MatchString(s.Name) {
4761
return sdk.NewError(sdk.ErrInvalidName, fmt.Errorf("Invalid stage name '%s'. It should match %s", s.Name, sdk.NamePatternSpace))
4862
}
49-
var stageFound bool
50-
var oldStage *sdk.Stage
51-
for _, os := range oldPipeline.Stages {
52-
if s.Name == os.Name {
53-
oldStage = &os
54-
stageFound = true
55-
break
56-
}
57-
}
58-
if !stageFound {
59-
//Insert stage
60-
log.Debug("Inserting stage %s", s.Name)
61-
s.PipelineID = pip.ID
62-
if err := InsertStage(db, s); err != nil {
63-
return sdk.WrapError(err, "Unable to insert stage %s in %s", s.Name, pip.Name)
64-
}
65-
//Insert stage's Jobs
66-
for x := range s.Jobs {
67-
jobAction := &s.Jobs[x]
68-
if errs := CheckJob(ctx, db, jobAction); errs != nil {
69-
log.Debug("CheckJob > %s", errs)
70-
return errs
71-
}
72-
if err := action.CheckChildrenForGroupIDs(ctx, db, &jobAction.Action, groupIDs); err != nil {
73-
return err
74-
}
75-
jobAction.PipelineStageID = s.ID
76-
jobAction.Action.Type = sdk.JoinedAction
77-
log.Debug("Creating job %s on stage %s on pipeline %s", jobAction.Action.Name, s.Name, pip.Name)
78-
if err := InsertJob(db, jobAction, s.ID, pip); err != nil {
79-
return sdk.WrapError(err, "Unable to insert job %s in %s", jobAction.Action.Name, pip.Name)
80-
}
81-
if msgChan != nil {
82-
msgChan <- sdk.NewMessage(sdk.MsgPipelineJobAdded, jobAction.Action.Name, s.Name)
83-
}
84-
}
85-
if msgChan != nil {
86-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageAdded, s.Name)
87-
}
88-
} else {
89-
//Update
90-
log.Debug("> Updating stage %s", oldStage.Name)
91-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageUpdating, oldStage.Name)
92-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageDeletingOldJobs, oldStage.Name)
93-
for x := range s.Jobs {
94-
jobAction := &s.Jobs[x]
95-
//Check the job
96-
if errs := CheckJob(ctx, db, jobAction); errs != nil {
97-
log.Debug(">> CheckJob > %s", errs)
98-
return errs
99-
}
100-
if err := action.CheckChildrenForGroupIDs(ctx, db, &jobAction.Action, groupIDs); err != nil {
101-
return err
102-
}
103-
}
104-
// Delete all existing jobs in existing stage
105-
for _, oj := range oldStage.Jobs {
106-
if err := DeleteJob(db, oj); err != nil {
107-
return sdk.WrapError(err, "unable to delete job %s in %s", oj.Action.Name, pip.Name)
108-
}
109-
msgChan <- sdk.NewMessage(sdk.MsgPipelineJobDeleted, oj.Action.Name, s.Name)
110-
}
111-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageInsertingNewJobs, oldStage.Name)
112-
// then insert job from yml into existing stage
113-
for x := range s.Jobs {
114-
j := &s.Jobs[x]
115-
//Insert the job
116-
j.PipelineStageID = oldStage.ID
117-
j.Action.Type = sdk.JoinedAction
118-
log.Debug(">> Creating job %s on stage %s on pipeline %s stageID: %d", j.Action.Name, s.Name, pip.Name, oldStage.ID)
119-
if err := InsertJob(db, j, oldStage.ID, pip); err != nil {
120-
return sdk.WrapError(err, "Unable to insert job %s in %s", j.Action.Name, pip.Name)
121-
}
122-
if msgChan != nil {
123-
msgChan <- sdk.NewMessage(sdk.MsgPipelineJobAdded, j.Action.Name, s.Name)
124-
}
125-
}
12663

127-
if oldStage.BuildOrder != s.BuildOrder {
128-
s.ID = oldStage.ID
129-
if err := updateStageOrder(db, s.ID, s.BuildOrder); err != nil {
130-
return sdk.WrapError(err, "Unable to update stage %s", s.Name)
131-
}
132-
}
133-
134-
//Update stage
135-
if msgChan != nil {
136-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageUpdated, s.Name)
137-
}
64+
//Insert stage
65+
log.Debug("Inserting stage %s", s.Name)
66+
s.PipelineID = pip.ID
67+
if err := InsertStage(db, s); err != nil {
68+
return sdk.WrapError(err, "Unable to insert stage %s in %s", s.Name, pip.Name)
13869
}
139-
}
140-
141-
//Check if we have to delete stages
142-
for _, os := range oldPipeline.Stages {
143-
var stageFound bool
144-
var currentStage sdk.Stage
145-
for _, s := range pip.Stages {
146-
if s.Name == os.Name {
147-
stageFound = true
148-
currentStage = s
149-
currentStage.ID = os.ID
150-
break
70+
//Insert stage's Jobs
71+
for x := range s.Jobs {
72+
jobAction := &s.Jobs[x]
73+
if errs := CheckJob(ctx, db, jobAction); errs != nil {
74+
log.Debug("CheckJob > %s", errs)
75+
return errs
15176
}
152-
}
153-
if !stageFound {
154-
for x := range os.Jobs {
155-
j := os.Jobs[x]
156-
if err := DeleteJob(db, j); err != nil {
157-
return sdk.WrapError(err, "unable to delete job %s in %s", j.Action.Name, pip.Name)
158-
}
159-
if msgChan != nil {
160-
msgChan <- sdk.NewMessage(sdk.MsgPipelineJobDeleted, j.Action.Name, os.Name)
161-
}
77+
if err := action.CheckChildrenForGroupIDs(ctx, db, &jobAction.Action, groupIDs); err != nil {
78+
return err
16279
}
163-
if err := DeleteStageByID(ctx, db, &os); err != nil {
164-
return sdk.WrapError(err, "unable to delete stage %d", os.ID)
80+
jobAction.PipelineStageID = s.ID
81+
jobAction.Action.Type = sdk.JoinedAction
82+
log.Debug("Creating job %s on stage %s on pipeline %s", jobAction.Action.Name, s.Name, pip.Name)
83+
if err := InsertJob(db, jobAction, s.ID, pip); err != nil {
84+
return sdk.WrapError(err, "Unable to insert job %s in %s", jobAction.Action.Name, pip.Name)
16585
}
16686
if msgChan != nil {
167-
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageDeleted, os.Name)
168-
}
169-
} else {
170-
// Update stage
171-
if err := UpdateStage(db, &currentStage); err != nil {
172-
return sdk.WrapError(err, "cannot update stage %s (id=%d) for conditions, build_order and name", currentStage.Name, currentStage.ID)
87+
msgChan <- sdk.NewMessage(sdk.MsgPipelineJobAdded, jobAction.Action.Name, s.Name)
17388
}
17489
}
90+
if msgChan != nil {
91+
msgChan <- sdk.NewMessage(sdk.MsgPipelineStageAdded, s.Name)
92+
}
93+
17594
}
17695

96+
// Insert new parameters
17797
for _, param := range pip.Parameter {
178-
found := false
179-
for _, oldParam := range oldPipeline.Parameter {
180-
if param.Name == oldParam.Name {
181-
found = true
182-
if err := UpdateParameterInPipeline(db, pip.ID, oldParam.Name, param); err != nil {
183-
return sdk.WrapError(err, "cannot update parameter %s", param.Name)
184-
}
185-
break
186-
}
187-
}
188-
if !found {
189-
if err := InsertParameterInPipeline(db, pip.ID, &param); err != nil {
190-
return sdk.WrapError(err, "cannot insert parameter %s", param.Name)
191-
}
98+
if err := InsertParameterInPipeline(db, pip.ID, &param); err != nil {
99+
return sdk.WrapError(err, "cannot insert parameter %s", param.Name)
192100
}
193101
}
194102

engine/api/pipeline/pipeline_importer_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func testImportUpdate(t *testing.T, db gorp.SqlExecutor, store cache.Store, tt t
5555
proj, err := project.Load(db, store, tt.args.pip.ProjectKey, nil)
5656
test.NoError(t, err)
5757

58-
if err := pipeline.ImportUpdate(context.TODO(), db, *proj, tt.args.pip, msgChan, tt.args.u); (err != nil) != tt.wantErr {
58+
if err := pipeline.ImportUpdate(context.TODO(), db, *proj, tt.args.pip, msgChan); (err != nil) != tt.wantErr {
5959
t.Errorf("%q. ImportUpdate() error = %v, wantErr %v", tt.name, err, tt.wantErr)
6060
}
6161

@@ -493,6 +493,7 @@ func TestImportUpdate(t *testing.T) {
493493

494494
test.NoError(t, pipeline.InsertStage(db, &args.pip.Stages[0]))
495495
test.NoError(t, pipeline.InsertStage(db, &args.pip.Stages[1]))
496+
test.NoError(t, pipeline.InsertParameterInPipeline(db, args.pip.ID, &sdk.Parameter{Name: "oldparam", Type: string(sdk.ParameterTypeString), Value: "foo"}))
496497

497498
args.pip.Stages[1].Jobs = args.pip.Stages[1].Jobs[1:]
498499

@@ -646,8 +647,7 @@ func TestImportUpdate(t *testing.T) {
646647
},
647648
asserts: func(t *testing.T, pip sdk.Pipeline) {
648649
t.Logf("Asserts on %+v", pip)
649-
assert.Equal(t, 1, len(pip.Stages))
650-
assert.Equal(t, 1, pip.Stages[0].BuildOrder)
650+
assert.Equal(t, 0, len(pip.Stages))
651651
},
652652
}
653653

engine/api/pipeline/pipeline_parser.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func ParseAndImport(ctx context.Context, db gorp.SqlExecutor, cache cache.Store,
6363
if exist && !opts.Force {
6464
return pip, nil, sdk.ErrPipelineAlreadyExists
6565
} else if exist {
66-
globalError = ImportUpdate(ctx, db, proj, pip, msgChan, u)
66+
globalError = ImportUpdate(ctx, db, proj, pip, msgChan)
6767
} else {
6868
globalError = Import(ctx, db, cache, proj, pip, msgChan, u)
6969
}

0 commit comments

Comments
 (0)