Skip to content

Commit

Permalink
Implement promote-within-set operation
Browse files Browse the repository at this point in the history
  • Loading branch information
Sushisource committed Oct 26, 2022
1 parent 707d900 commit 8614b5e
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 1 deletion.
19 changes: 18 additions & 1 deletion service/matching/version_sets.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func UpdateVersionsGraph(existingData *persistence.VersioningData, req *workflow
func updateImpl(existingData *persistence.VersioningData, req *workflowservice.UpdateWorkerBuildIdOrderingRequest) error {
// First find if the targeted version is already in the sets
targetedVersion := extractTargetedVersion(req)
targetSetIx, _ := findVersion(existingData, targetedVersion)
targetSetIx, versionInSetIx := findVersion(existingData, targetedVersion)

if _, ok := req.GetOperation().(*workflowservice.UpdateWorkerBuildIdOrderingRequest_NewDefaultVersionId); ok {
// If it's not already in the sets, add it as the new default set
Expand Down Expand Up @@ -140,6 +140,11 @@ func updateImpl(existingData *persistence.VersioningData, req *workflowservice.U
return serviceerror.NewNotFound(fmt.Sprintf("targeted version %v not found", targetedVersion))
}
makeDefaultSet(existingData, targetSetIx)
} else if _, ok := req.GetOperation().(*workflowservice.UpdateWorkerBuildIdOrderingRequest_PromoteVersionIdWithinSet); ok {
if targetSetIx == -1 {
return serviceerror.NewNotFound(fmt.Sprintf("targeted version %v not found", targetedVersion))
}
makeVersionInSetDefault(existingData, targetSetIx, versionInSetIx)
}

return nil
Expand All @@ -150,6 +155,8 @@ func extractTargetedVersion(req *workflowservice.UpdateWorkerBuildIdOrderingRequ
return req.GetNewCompatibleVersion().GetNewVersionId()
} else if req.GetExistingVersionIdInSetToPromote() != "" {
return req.GetExistingVersionIdInSetToPromote()
} else if req.GetPromoteVersionIdWithinSet() != "" {
return req.GetPromoteVersionIdWithinSet()
}
return req.GetNewDefaultVersionId()
}
Expand All @@ -176,3 +183,13 @@ func makeDefaultSet(data *persistence.VersioningData, setIx int) {
copy(data.VersionSets[setIx:], data.VersionSets[setIx+1:])
data.VersionSets[len(data.VersionSets)-1] = moveMe
}

func makeVersionInSetDefault(data *persistence.VersioningData, setIx, versionIx int) {
setVersions := data.VersionSets[setIx].Versions
if len(setVersions) <= 1 {
return
}
moveMe := setVersions[versionIx]
copy(setVersions[versionIx:], setVersions[versionIx+1:])
setVersions[len(setVersions)-1] = moveMe
}
51 changes: 51 additions & 0 deletions service/matching/version_sets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ func mkExistingDefault(id string) *workflowservice.UpdateWorkerBuildIdOrderingRe
},
}
}
func mkPromoteInSet(id string) *workflowservice.UpdateWorkerBuildIdOrderingRequest {
return &workflowservice.UpdateWorkerBuildIdOrderingRequest{
Operation: &workflowservice.UpdateWorkerBuildIdOrderingRequest_PromoteVersionIdWithinSet{
PromoteVersionIdWithinSet: id,
},
}
}

func TestNewDefaultUpdate(t *testing.T) {
data := mkInitialData(2)
Expand Down Expand Up @@ -237,3 +244,47 @@ func TestLimitsMaxSize(t *testing.T) {
assert.Equal(t, fmt.Sprintf("%d", i+10), data.VersionSets[i].Versions[0])
}
}

func TestPromoteWithinVersion(t *testing.T) {
data := mkInitialData(3)

for i := 1; i <= 5; i++ {
req := mkNewCompatReq(fmt.Sprintf("0.%d", i), "0", false)
err := UpdateVersionsGraph(data, req, 0)
assert.NoError(t, err)
}

req := mkPromoteInSet("0.1")
err := UpdateVersionsGraph(data, req, 0)
assert.NoError(t, err)

curd := data.VersionSets[0].Versions[len(data.VersionSets[0].Versions)-1]
assert.Equal(t, "0.1", curd)
}

func TestAddAlreadyExtantVersionAsDefaultErrors(t *testing.T) {
data := mkInitialData(3)

req := mkNewDefReq("0")
err := UpdateVersionsGraph(data, req, 0)
assert.Error(t, err)
assert.IsType(t, &serviceerror.InvalidArgument{}, err)
}

func TestMakeSetDefaultTargetingNonexistentVersionErrors(t *testing.T) {
data := mkInitialData(3)

req := mkExistingDefault("crab boi")
err := UpdateVersionsGraph(data, req, 0)
assert.Error(t, err)
assert.IsType(t, &serviceerror.NotFound{}, err)
}

func TestPromoteWithinSetTargetingNonexistentVersionErrors(t *testing.T) {
data := mkInitialData(3)

req := mkPromoteInSet("i'd rather be writing rust ;)")
err := UpdateVersionsGraph(data, req, 0)
assert.Error(t, err)
assert.IsType(t, &serviceerror.NotFound{}, err)
}

0 comments on commit 8614b5e

Please sign in to comment.