From 1d659c78936b3f25a1d5248dbe7275be52b165be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tilo=20K=C3=B6rner?= <70266685+tiloKo@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:44:20 +0200 Subject: [PATCH] addon.yml may now contain wildCard MAXX (#5039) * wildCard MAXX in addon.yml for AAKaaS steps --------- Co-authored-by: Christian Luttenberger <42861202+bluesbrother84@users.noreply.github.com> --- pkg/abap/aakaas/componentVersion.go | 2 +- pkg/abap/aakaas/productVersion.go | 2 +- pkg/abap/aakaas/versionables.go | 56 ++++++++++---- pkg/abap/aakaas/versionables_test.go | 106 +++++++++++++++++++++++++-- 4 files changed, 143 insertions(+), 23 deletions(-) diff --git a/pkg/abap/aakaas/componentVersion.go b/pkg/abap/aakaas/componentVersion.go index efdb24e91c..4d8dc6df99 100644 --- a/pkg/abap/aakaas/componentVersion.go +++ b/pkg/abap/aakaas/componentVersion.go @@ -21,7 +21,7 @@ func (c *ComponentVersion) ConstructComponentVersion(repo abaputils.Repository, if err := c.constructVersionable(repo.Name, repo.VersionYAML, conn, cvQueryURL); err != nil { return err } - if err := c.resolveNext(statusFilterCV); err != nil { + if err := c.resolveWildCards(statusFilterCV); err != nil { return err } diff --git a/pkg/abap/aakaas/productVersion.go b/pkg/abap/aakaas/productVersion.go index 25743c05de..8f5c585047 100644 --- a/pkg/abap/aakaas/productVersion.go +++ b/pkg/abap/aakaas/productVersion.go @@ -21,7 +21,7 @@ func (p *ProductVersion) ConstructProductversion(desc abaputils.AddonDescriptor, if err := p.constructVersionable(desc.AddonProduct, desc.AddonVersionYAML, conn, pvQueryURL); err != nil { return err } - if err := p.resolveNext(statusFilterPV); err != nil { + if err := p.resolveWildCards(statusFilterPV); err != nil { return err } return nil diff --git a/pkg/abap/aakaas/versionables.go b/pkg/abap/aakaas/versionables.go index d28ab46cc8..7ad2cf3c39 100644 --- a/pkg/abap/aakaas/versionables.go +++ b/pkg/abap/aakaas/versionables.go @@ -12,7 +12,8 @@ import ( "github.com/pkg/errors" ) -const wildCard string = "NEXT" +const wildCardNext string = "NEXT" +const wildCardMax string = "MAXX" const statusFilterCV string = "DeliveryStatus eq 'R'" const statusFilterPV string = "DeliveryStatus eq 'T' or DeliveryStatus eq 'P'" @@ -51,21 +52,31 @@ func (v *versionable) constructVersionable(name string, dottedVersionString stri return nil } +func (v *versionable) resolveWildCards(statusFilter string) error { + if err := v.resolveNext(statusFilter); err != nil { + return err + } + if err := v.resolveMax(statusFilter); err != nil { + return err + } + return nil +} + func (v *versionable) resolveNext(statusFilter string) error { - switch strings.Count(v.Version, wildCard) { + switch strings.Count(v.Version, wildCardNext) { case 0: return nil case 1: log.Entry().Info("Wildcard detected in dotted-version-string. Looking up highest existing package in AAKaaS...") var err error - switch wildCard { + switch wildCardNext { case v.TechRelease: - err = v.resolveRelease(statusFilter) + err = v.resolveRelease(statusFilter, 1) case v.TechSpLevel: - err = v.resolveSpLevel(statusFilter) + err = v.resolveSpLevel(statusFilter, 1) case v.TechPatchLevel: - err = v.resolvePatchLevel(statusFilter) + err = v.resolvePatchLevel(statusFilter, 1) } if err != nil { return err @@ -74,13 +85,32 @@ func (v *versionable) resolveNext(statusFilter string) error { return err } default: - return errors.New("The dotted-version-string must contain only one wildcard " + wildCard) + return errors.New("The dotted-version-string must contain only one wildcard " + wildCardNext) } return nil } -func (v *versionable) resolveRelease(statusFilter string) error { +func (v *versionable) resolveMax(statusFilter string) error { + if v.TechRelease == wildCardMax { + if err := v.resolveRelease(statusFilter, 0); err != nil { + return err + } + } + if v.TechSpLevel == wildCardMax { + if err := v.resolveSpLevel(statusFilter, 0); err != nil { + return err + } + } + if v.TechPatchLevel == wildCardMax { + if err := v.resolvePatchLevel(statusFilter, 0); err != nil { + return err + } + } + return nil +} + +func (v *versionable) resolveRelease(statusFilter string, increment int) error { filter := "Name eq '" + v.Name + "' and TechSpLevel eq '0000' and TechPatchLevel eq '0000' and ( " + statusFilter + " )" orderBy := "TechRelease desc" @@ -90,13 +120,13 @@ func (v *versionable) resolveRelease(statusFilter string) error { if newRelease, err := strconv.Atoi(queryResuult.TechRelease); err != nil { return err } else { - v.TechRelease = strconv.Itoa(newRelease + 1) + v.TechRelease = strconv.Itoa(newRelease + increment) return nil } } } -func (v *versionable) resolveSpLevel(statusFilter string) error { +func (v *versionable) resolveSpLevel(statusFilter string, increment int) error { filter := "Name eq '" + v.Name + "' and TechRelease eq '" + v.TechRelease + "' and TechPatchLevel eq '0000' and ( " + statusFilter + " )" orderBy := "TechSpLevel desc" @@ -106,13 +136,13 @@ func (v *versionable) resolveSpLevel(statusFilter string) error { if newSpLevel, err := strconv.Atoi(queryResuult.TechSpLevel); err != nil { return err } else { - v.TechSpLevel = fmt.Sprintf("%04d", newSpLevel+1) + v.TechSpLevel = fmt.Sprintf("%04d", newSpLevel+increment) return nil } } } -func (v *versionable) resolvePatchLevel(statusFilter string) error { +func (v *versionable) resolvePatchLevel(statusFilter string, increment int) error { filter := "Name eq '" + v.Name + "' and TechRelease eq '" + v.TechRelease + "' and TechSpLevel eq '" + v.TechSpLevel + "' and ( " + statusFilter + " )" orderBy := "TechPatchLevel desc" @@ -122,7 +152,7 @@ func (v *versionable) resolvePatchLevel(statusFilter string) error { if newPatchLevel, err := strconv.Atoi(queryResuult.TechPatchLevel); err != nil { return err } else { - v.TechPatchLevel = fmt.Sprintf("%04d", newPatchLevel+1) + v.TechPatchLevel = fmt.Sprintf("%04d", newPatchLevel+increment) return nil } } diff --git a/pkg/abap/aakaas/versionables_test.go b/pkg/abap/aakaas/versionables_test.go index 816a5da46a..e2b8991422 100644 --- a/pkg/abap/aakaas/versionables_test.go +++ b/pkg/abap/aakaas/versionables_test.go @@ -43,7 +43,7 @@ func TestCvResolve(t *testing.T) { }) t.Run("ComponentVersion NEXT Release Existing", func(t *testing.T) { mc.AddData(testDataAakaasCVGetReleaseExisting) - err := vers.constructVersionable("DummyComp", wildCard+".0.0", *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", wildCardNext+".0.0", *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -54,7 +54,7 @@ func TestCvResolve(t *testing.T) { }) t.Run("ComponentVersion NEXT Release Non Existing", func(t *testing.T) { mc.AddData(testDataAakaasCVGetReleaseNonExisting) - err := vers.constructVersionable("DummyComp", wildCard+".0.0", *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", wildCardNext+".0.0", *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -65,7 +65,7 @@ func TestCvResolve(t *testing.T) { }) t.Run("ComponentVersion NEXT SP Level Existing", func(t *testing.T) { mc.AddData(testDataAakaasCVGetSpLevelExisting) - err := vers.constructVersionable("DummyComp", "1."+wildCard+".0", *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", "1."+wildCardNext+".0", *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -77,7 +77,7 @@ func TestCvResolve(t *testing.T) { t.Run("ComponentVersion NEXT SP Level Non Existing", func(t *testing.T) { //This one should lead to an error later on as AOI is needed - anyway we can't just produce a differen package then customized... mc.AddData(testDataAakaasCVGetSpLevelNonExisting) - err := vers.constructVersionable("DummyComp", "1."+wildCard+".0", *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", "1."+wildCardNext+".0", *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -88,7 +88,7 @@ func TestCvResolve(t *testing.T) { }) t.Run("ComponentVersion NEXT Patch Level Existing", func(t *testing.T) { mc.AddData(testDataAakaasCVGetPatchLevelExisting) - err := vers.constructVersionable("DummyComp", "1.3."+wildCard, *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", "1.3."+wildCardNext, *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -100,7 +100,7 @@ func TestCvResolve(t *testing.T) { t.Run("ComponentVersion NEXT Patch Level Non Existing", func(t *testing.T) { //This one should lead to an error later on as AOI is needed - anyway we can't just produce a differen package then customized... mc.AddData(testDataAakaasCVGetPatchLevelNonExisting) - err := vers.constructVersionable("DummyComp", "1.3."+wildCard, *conn, cvQueryURL) + err := vers.constructVersionable("DummyComp", "1.3."+wildCardNext, *conn, cvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterCV) assert.NoError(t, err) @@ -109,9 +109,10 @@ func TestCvResolve(t *testing.T) { assert.Equal(t, "0001", vers.TechPatchLevel) assert.Equal(t, "1.3.1", vers.Version) }) + t.Run("Product Version NEXT Release Existing", func(t *testing.T) { mc.AddData(testDataAakaasPVGetReleaseExisting) - err := vers.constructVersionable("DummyProd", wildCard+".0.0", *conn, pvQueryURL) + err := vers.constructVersionable("DummyProd", wildCardNext+".0.0", *conn, pvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterPV) assert.NoError(t, err) @@ -120,9 +121,10 @@ func TestCvResolve(t *testing.T) { assert.Equal(t, "0000", vers.TechPatchLevel) assert.Equal(t, "2.0.0", vers.Version) }) + t.Run("Product Version NEXT Release Non Existing", func(t *testing.T) { mc.AddData(testDataAakaasPVGetReleaseNonExisting) - err := vers.constructVersionable("DummyProd", wildCard+".0.0", *conn, pvQueryURL) + err := vers.constructVersionable("DummyProd", wildCardNext+".0.0", *conn, pvQueryURL) assert.NoError(t, err) err = vers.resolveNext(statusFilterPV) assert.NoError(t, err) @@ -131,4 +133,92 @@ func TestCvResolve(t *testing.T) { assert.Equal(t, "0000", vers.TechPatchLevel) assert.Equal(t, "1.0.0", vers.Version) }) + + t.Run("Component Version MAX Release existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetReleaseExisting) + err := vers.constructVersionable("DummyComp", wildCardMax+".0.0", *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0000", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Component Version MAX Release non existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetReleaseNonExisting) + err := vers.constructVersionable("DummyComp", wildCardMax+".0.0", *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "0", vers.TechRelease) + assert.Equal(t, "0000", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Component Version MAX SP Level existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetSpLevelExisting) + err := vers.constructVersionable("DummyComp", "1."+wildCardMax+".0", *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0007", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Component Version MAX SP Level non existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetSpLevelNonExisting) + err := vers.constructVersionable("DummyComp", "1."+wildCardMax+".0", *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0000", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Component Version MAX Patch Level existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetPatchLevelExisting) + err := vers.constructVersionable("DummyComp", "1.3."+wildCardMax, *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0003", vers.TechSpLevel) + assert.Equal(t, "0046", vers.TechPatchLevel) + }) + + t.Run("Component Version MAX Patch Level non existing", func(t *testing.T) { + mc.AddData(testDataAakaasCVGetPatchLevelNonExisting) + err := vers.constructVersionable("DummyComp", "1.3."+wildCardMax, *conn, cvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterCV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0003", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Product Version MAX Release existing", func(t *testing.T) { + mc.AddData(testDataAakaasPVGetReleaseExisting) + err := vers.constructVersionable("DummyProd", wildCardMax+".0.0", *conn, pvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterPV) + assert.NoError(t, err) + assert.Equal(t, "1", vers.TechRelease) + assert.Equal(t, "0000", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) + + t.Run("Product Version MAX Release non existing", func(t *testing.T) { + mc.AddData(testDataAakaasPVGetReleaseNonExisting) + err := vers.constructVersionable("DummyProd", wildCardMax+".0.0", *conn, pvQueryURL) + assert.NoError(t, err) + err = vers.resolveMax(statusFilterPV) + assert.NoError(t, err) + assert.Equal(t, "0", vers.TechRelease) + assert.Equal(t, "0000", vers.TechSpLevel) + assert.Equal(t, "0000", vers.TechPatchLevel) + }) }