Skip to content

Commit 5d35d5d

Browse files
committed
add test coverge for kv store tracking executed workspaces
1 parent 4a9fd3d commit 5d35d5d

6 files changed

Lines changed: 130 additions & 3 deletions

File tree

pkg/mocks/helpers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package mocks
22

33
import (
4+
"errors"
45
"fmt"
56
"path/filepath"
67
"regexp"
@@ -175,6 +176,8 @@ func (ts *TestSuite) InitTestSuite() {
175176
ts.MockApiClient.EXPECT().AddTags(gomock.Any(), gomock.Any(), "tfbuddylock", "101").AnyTimes()
176177

177178
ts.MockStreamClient.EXPECT().AddRunMeta(gomock.Any()).AnyTimes()
179+
ts.MockStreamClient.EXPECT().AddWorkspaceMeta(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes()
180+
ts.MockStreamClient.EXPECT().GetWorkspaceMeta(gomock.Any(), gomock.Any()).Return(nil, errors.New("not found")).AnyTimes()
178181

179182
ts.MockProject.EXPECT().GetPathWithNamespace().Return(ts.MetaData.ProjectNameNS).AnyTimes()
180183

pkg/mocks/mock_runstream.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/tfc_trigger/tfc_trigger.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,14 @@ func (t *TFCTrigger) TriggerTFCEvents(ctx context.Context) (*TriggeredTFCWorkspa
441441
log.Debug().Msg("No Terraform changes found in changeset.")
442442
return nil, nil
443443
}
444-
t.runstream.AddWorkspaceMeta(&runstream.TFCWorkspacesMetadata{}, t.GetMergeRequestIID(), t.GetProjectNameWithNamespace())
444+
//only set workspace metadata for a MR when the first run is triggered. This prevents the count of executed workspaces from being reset
445+
wsMeta, err := t.runstream.GetWorkspaceMeta(fmt.Sprintf("%d", t.GetMergeRequestIID()), t.GetProjectNameWithNamespace())
446+
if err != nil || wsMeta == nil {
447+
t.runstream.AddWorkspaceMeta(&runstream.TFCWorkspacesMetadata{
448+
CountTotalWorkspaces: len(triggeredWorkspaces),
449+
CountExecutedWorkspaces: 0,
450+
}, fmt.Sprintf("%d", t.GetMergeRequestIID()), t.GetProjectNameWithNamespace())
451+
}
445452
return workspaceStatus, nil
446453
}
447454

pkg/tfc_trigger/tfc_trigger_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package tfc_trigger_test
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"os"
78
"testing"
@@ -296,6 +297,10 @@ func TestTFCEvents_MultiWorkspaceApply(t *testing.T) {
296297
}).Times(2)
297298

298299
testSuite.MockStreamClient.EXPECT().AddRunMeta(gomock.Any()).Times(2)
300+
testSuite.MockStreamClient.EXPECT().AddWorkspaceMeta(&runstream.TFCWorkspacesMetadata{
301+
CountTotalWorkspaces: 2,
302+
CountExecutedWorkspaces: 0,
303+
}, fmt.Sprintf("%d", testSuite.MetaData.MRIID), testSuite.MetaData.ProjectNameNS)
299304
testSuite.InitTestSuite()
300305
testLogger := zltest.New(t)
301306
log.Logger = log.Logger.Output(testLogger)
@@ -474,7 +479,11 @@ func TestTFCEvents_WorkspaceApplyModifiedBothSrcDstBranches(t *testing.T) {
474479
testSuite.MockGitClient.EXPECT().GetMergeRequestModifiedFiles(gomock.Any(), testSuite.MetaData.MRIID, testSuite.MetaData.ProjectNameNS).Return([]string{"main.tf"}, nil)
475480

476481
mockStreamClient := mocks.NewMockStreamClient(mockCtrl)
477-
482+
mockStreamClient.EXPECT().GetWorkspaceMeta(gomock.Any(), gomock.Any()).Return(nil, errors.New("no record"))
483+
mockStreamClient.EXPECT().AddWorkspaceMeta(&runstream.TFCWorkspacesMetadata{
484+
CountTotalWorkspaces: 1,
485+
CountExecutedWorkspaces: 0,
486+
}, fmt.Sprintf("%d", testSuite.MetaData.MRIID), testSuite.MetaData.ProjectNameNS)
478487
testSuite.InitTestSuite()
479488

480489
testLogger := zltest.New(t)

pkg/vcs/gitlab/mr_status_updater.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,29 @@ func (p *RunStatusUpdater) mergeMRIfPossible(ctx context.Context, rmd runstream.
208208
if !rmd.GetAutoMerge() {
209209
return
210210
}
211+
//check that all triggered workspaces have been executed or increment
212+
wsMeta, err := p.rs.GetWorkspaceMeta(fmt.Sprintf("%d", rmd.GetMRInternalID()), rmd.GetMRProjectNameWithNamespace())
213+
if err != nil {
214+
log.Debug().AnErr("err", err).Msg("get workspace metadata")
215+
return
216+
}
217+
wsMeta.CountExecutedWorkspaces++
218+
219+
if wsMeta.CountTotalWorkspaces > wsMeta.CountExecutedWorkspaces {
220+
err = p.rs.AddWorkspaceMeta(wsMeta, fmt.Sprintf("%d", rmd.GetMRInternalID()), rmd.GetMRProjectNameWithNamespace())
221+
if err != nil {
222+
log.Debug().AnErr("err", err).Msg("add workspace metadata")
223+
span.RecordError(err)
224+
}
225+
return
226+
}
227+
if wsMeta.CountExecutedWorkspaces > wsMeta.CountTotalWorkspaces {
228+
log.Debug().Msg("count executed workspaces is greater than total workspaces")
229+
span.RecordError(errors.New("count executed workspaces is greater than total workspaces"))
230+
return
231+
}
211232

212-
err := p.client.MergeMR(ctx, rmd.GetMRInternalID(), rmd.GetMRProjectNameWithNamespace())
233+
err = p.client.MergeMR(ctx, rmd.GetMRInternalID(), rmd.GetMRProjectNameWithNamespace())
213234
if err != nil {
214235
span.RecordError(err)
215236
}

pkg/vcs/gitlab/mr_status_updater_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ func TestAutoMergeNoChangesApply(t *testing.T) {
2222
testSuite.MockGitClient.EXPECT().MergeMR(gomock.Any(), gomock.Any(), gomock.Any())
2323
testSuite.MockGitClient.EXPECT().GetPipelinesForCommit(gomock.Any(), gomock.Any(), gomock.Any()).Return([]vcs.ProjectPipeline{&GitlabPipeline{&gogitlab.PipelineInfo{ID: 1}}}, nil).AnyTimes()
2424
testSuite.MockGitClient.EXPECT().SetCommitStatus(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, errors.New("could not commit status")).AnyTimes()
25+
testSuite.MockStreamClient.EXPECT().GetWorkspaceMeta(gomock.Any(), gomock.Any()).Return(&runstream.TFCWorkspacesMetadata{
26+
CountExecutedWorkspaces: 0,
27+
CountTotalWorkspaces: 1,
28+
}, nil)
2529
testSuite.InitTestSuite()
2630
r := &RunStatusUpdater{
2731
tfc: testSuite.MockApiClient,
@@ -71,6 +75,12 @@ func TestAutoMergeApply(t *testing.T) {
7175
testSuite.MockGitClient.EXPECT().MergeMR(gomock.Any(), gomock.Any(), gomock.Any())
7276
testSuite.MockGitClient.EXPECT().GetPipelinesForCommit(gomock.Any(), gomock.Any(), gomock.Any()).Return([]vcs.ProjectPipeline{&GitlabPipeline{&gogitlab.PipelineInfo{ID: 1}}}, nil).AnyTimes()
7377
testSuite.MockGitClient.EXPECT().SetCommitStatus(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, errors.New("could not commit status")).AnyTimes()
78+
79+
testSuite.MockStreamClient.EXPECT().GetWorkspaceMeta(gomock.Any(), gomock.Any()).Return(&runstream.TFCWorkspacesMetadata{
80+
CountExecutedWorkspaces: 0,
81+
CountTotalWorkspaces: 1,
82+
}, nil)
83+
7484
testSuite.InitTestSuite()
7585
r := &RunStatusUpdater{
7686
tfc: testSuite.MockApiClient,
@@ -86,6 +96,54 @@ func TestAutoMergeApply(t *testing.T) {
8696
})
8797
}
8898

99+
func TestAutoMergeApplyMultiWorkspace(t *testing.T) {
100+
101+
mockCtrl := gomock.NewController(t)
102+
defer mockCtrl.Finish()
103+
104+
testSuite := mocks.CreateTestSuite(mockCtrl, mocks.TestOverrides{}, t)
105+
106+
testSuite.MockGitClient.EXPECT().MergeMR(gomock.Any(), gomock.Any(), gomock.Any())
107+
testSuite.MockGitClient.EXPECT().GetPipelinesForCommit(gomock.Any(), gomock.Any(), gomock.Any()).Return([]vcs.ProjectPipeline{&GitlabPipeline{&gogitlab.PipelineInfo{ID: 1}}}, nil).AnyTimes()
108+
testSuite.MockGitClient.EXPECT().SetCommitStatus(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, errors.New("could not commit status")).AnyTimes()
109+
110+
//workspace 1 in same mr
111+
testSuite.MockStreamClient.EXPECT().GetWorkspaceMeta("101", "zapier/test").Return(&runstream.TFCWorkspacesMetadata{
112+
CountExecutedWorkspaces: 0,
113+
CountTotalWorkspaces: 2,
114+
}, nil)
115+
//workspace 2 in same mr
116+
testSuite.MockStreamClient.EXPECT().GetWorkspaceMeta("101", "zapier/test").Return(&runstream.TFCWorkspacesMetadata{
117+
CountExecutedWorkspaces: 1,
118+
CountTotalWorkspaces: 2,
119+
}, nil)
120+
121+
testSuite.InitTestSuite()
122+
r := &RunStatusUpdater{
123+
tfc: testSuite.MockApiClient,
124+
client: testSuite.MockGitClient,
125+
rs: testSuite.MockStreamClient,
126+
}
127+
r.updateCommitStatusForRun(context.Background(), &tfe.Run{
128+
Status: tfe.RunApplied,
129+
HasChanges: true,
130+
}, &runstream.TFRunMetadata{
131+
Action: "apply",
132+
AutoMerge: true,
133+
MergeRequestIID: 101,
134+
MergeRequestProjectNameWithNamespace: "zapier/test",
135+
})
136+
137+
r.updateCommitStatusForRun(context.Background(), &tfe.Run{
138+
Status: tfe.RunApplied,
139+
HasChanges: true,
140+
}, &runstream.TFRunMetadata{
141+
Action: "apply",
142+
AutoMerge: true,
143+
MergeRequestIID: 101,
144+
MergeRequestProjectNameWithNamespace: "zapier/test",
145+
})
146+
}
89147
func TestAutoMergeTargetedApply(t *testing.T) {
90148

91149
mockCtrl := gomock.NewController(t)

0 commit comments

Comments
 (0)