From 8614b5e92acba8bcc07f182ce32c55262e94d32b Mon Sep 17 00:00:00 2001 From: Spencer Judge Date: Wed, 26 Oct 2022 14:42:31 -0700 Subject: [PATCH] Implement promote-within-set operation --- service/matching/version_sets.go | 19 +++++++++- service/matching/version_sets_test.go | 51 +++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/service/matching/version_sets.go b/service/matching/version_sets.go index 183bf4341b6c..235c6f0d5da4 100644 --- a/service/matching/version_sets.go +++ b/service/matching/version_sets.go @@ -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 @@ -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 @@ -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() } @@ -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 +} diff --git a/service/matching/version_sets_test.go b/service/matching/version_sets_test.go index 11a27a747264..9d6793689d4e 100644 --- a/service/matching/version_sets_test.go +++ b/service/matching/version_sets_test.go @@ -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) @@ -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) +}