Skip to content

Commit

Permalink
Introduce Masterminds/semver
Browse files Browse the repository at this point in the history
Add support for Masterminds/semver for .spec.Version
This is a bit more entangled into the code than I expected,
most instances of bsemver were replaced.

Signed-off-by: Todd Short <tshort@redhat.com>
  • Loading branch information
tmshort committed Aug 29, 2023
1 parent 8bce29c commit ee305fd
Show file tree
Hide file tree
Showing 11 changed files with 30 additions and 23 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/operator-framework/operator-controller
go 1.20

require (
github.com/Masterminds/semver/v3 v3.2.0
github.com/blang/semver/v4 v4.0.0
github.com/go-logr/logr v1.2.4
github.com/onsi/ginkgo/v2 v2.11.0
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
Expand Down
4 changes: 2 additions & 2 deletions internal/controllers/validators/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package validators
import (
"fmt"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"

operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
)
Expand All @@ -18,7 +18,7 @@ func validateSemver(operator *operatorsv1alpha1.Operator) error {
if operator.Spec.Version == "" {
return nil
}
if _, err := bsemver.Parse(operator.Spec.Version); err != nil {
if _, err := mmsemver.NewConstraint(operator.Spec.Version); err != nil {
return fmt.Errorf("invalid .spec.version: %w", err)
}
return nil
Expand Down
9 changes: 5 additions & 4 deletions internal/resolution/entities/bundle_entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"sync"

mmsemver "github.com/Masterminds/semver/v3"
bsemver "github.com/blang/semver/v4"
"github.com/operator-framework/deppy/pkg/deppy/input"
"github.com/operator-framework/operator-registry/alpha/property"
Expand Down Expand Up @@ -67,7 +68,7 @@ type BundleEntity struct {
requiredPackages []PackageRequired
channel *property.Channel
channelEntry *ChannelEntry
semVersion *bsemver.Version
semVersion *mmsemver.Version
bundlePath string
mediaType string
mu sync.RWMutex
Expand All @@ -87,7 +88,7 @@ func (b *BundleEntity) PackageName() (string, error) {
return b.bundlePackage.PackageName, nil
}

func (b *BundleEntity) Version() (*bsemver.Version, error) {
func (b *BundleEntity) Version() (*mmsemver.Version, error) {
if err := b.loadPackage(); err != nil {
return nil, err
}
Expand Down Expand Up @@ -187,11 +188,11 @@ func (b *BundleEntity) loadPackage() error {
}
b.bundlePackage = &bundlePackage
if b.semVersion == nil {
semVer, err := bsemver.Parse(b.bundlePackage.Version)
semVer, err := mmsemver.NewVersion(b.bundlePackage.Version)
if err != nil {
return fmt.Errorf("could not parse semver (%s) for entity '%s': %w", b.bundlePackage.Version, b.ID, err)
}
b.semVersion = &semVer
b.semVersion = semVer
}
}
return nil
Expand Down
6 changes: 3 additions & 3 deletions internal/resolution/entities/bundle_entity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
"testing"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/operator-framework/deppy/pkg/deppy/input"
Expand Down Expand Up @@ -55,7 +55,7 @@ var _ = Describe("BundleEntity", func() {
bundleEntity := olmentity.NewBundleEntity(entity)
version, err := bundleEntity.Version()
Expect(err).ToNot(HaveOccurred())
Expect(*version).To(Equal(bsemver.MustParse("0.14.0")))
Expect(version).To(Equal(mmsemver.MustParse("0.14.0")))
})
It("should return an error if the property is not found", func() {
entity := input.NewEntity("operatorhub/prometheus/0.14.0", map[string]string{})
Expand All @@ -80,7 +80,7 @@ var _ = Describe("BundleEntity", func() {
bundleEntity := olmentity.NewBundleEntity(entity)
version, err := bundleEntity.Version()
Expect(version).To(BeNil())
Expect(err.Error()).To(Equal("could not parse semver (badversion) for entity 'operatorhub/prometheus/0.14.0': No Major.Minor.Patch elements found"))
Expect(err.Error()).To(Equal("could not parse semver (badversion) for entity 'operatorhub/prometheus/0.14.0': Invalid Semantic Version"))
})
})

Expand Down
6 changes: 3 additions & 3 deletions internal/resolution/util/predicates/predicates.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package predicates

import (
bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
"github.com/operator-framework/deppy/pkg/deppy/input"

olmentity "github.com/operator-framework/operator-controller/internal/resolution/entities"
Expand All @@ -18,14 +18,14 @@ func WithPackageName(packageName string) input.Predicate {
}
}

func InSemverRange(semverRange bsemver.Range) input.Predicate {
func InSemverRange(semverRange *mmsemver.Constraints) input.Predicate {
return func(entity *input.Entity) bool {
bundleEntity := olmentity.NewBundleEntity(entity)
bundleVersion, err := bundleEntity.Version()
if err != nil {
return false
}
return semverRange(*bundleVersion)
return semverRange.Check(bundleVersion)
}
}

Expand Down
11 changes: 7 additions & 4 deletions internal/resolution/util/predicates/predicates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package predicates_test
import (
"testing"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"github.com/operator-framework/deppy/pkg/deppy/input"
Expand Down Expand Up @@ -38,14 +38,17 @@ var _ = Describe("Predicates", func() {
entity := input.NewEntity("test", map[string]string{
property.TypePackage: `{"packageName": "mypackage", "version": "1.0.0"}`,
})
inRange := bsemver.MustParseRange(">=1.0.0")
notInRange := bsemver.MustParseRange(">=2.0.0")
inRange, err := mmsemver.NewConstraint(">=1.0.0")
Expect(err).NotTo(HaveOccurred())
notInRange, err := mmsemver.NewConstraint(">=2.0.0")
Expect(err).NotTo(HaveOccurred())
Expect(predicates.InSemverRange(inRange)(entity)).To(BeTrue())
Expect(predicates.InSemverRange(notInRange)(entity)).To(BeFalse())
})
It("should return false when the entity does not have a version", func() {
entity := input.NewEntity("test", map[string]string{})
inRange := bsemver.MustParseRange(">=1.0.0")
inRange, err := mmsemver.NewConstraint(">=1.0.0")
Expect(err).NotTo(HaveOccurred())
Expect(predicates.InSemverRange(inRange)(entity)).To(BeFalse())
})
})
Expand Down
2 changes: 1 addition & 1 deletion internal/resolution/util/sort/sort.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,5 +76,5 @@ func versionOrder(e1, e2 *entities.BundleEntity) int {
// from highest to lowest
return -1 * errComp
}
return ver1.Compare(*ver2)
return ver1.Compare(ver2)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"fmt"
"sort"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"

Expand Down Expand Up @@ -87,7 +87,7 @@ func (b *BundlesAndDepsVariableSource) getEntityDependencies(ctx context.Context
// todo(perdasilva): disambiguate between not found and actual errors
requiredPackages, _ := bundleEntity.RequiredPackages()
for _, requiredPackage := range requiredPackages {
semverRange, err := bsemver.ParseRange(requiredPackage.VersionRange)
semverRange, err := mmsemver.NewConstraint(requiredPackage.VersionRange)
if err != nil {
return nil, err
}
Expand Down
6 changes: 3 additions & 3 deletions internal/resolution/variablesources/required_package.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"context"
"fmt"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"

Expand All @@ -21,14 +21,14 @@ type RequiredPackageVariableSourceOption func(*RequiredPackageVariableSource) er
func InVersionRange(versionRange string) RequiredPackageVariableSourceOption {
return func(r *RequiredPackageVariableSource) error {
if versionRange != "" {
vr, err := bsemver.ParseRange(versionRange)
vr, err := mmsemver.NewConstraint(versionRange)
if err == nil {
r.versionRange = versionRange
r.predicates = append(r.predicates, predicates.InSemverRange(vr))
return nil
}

return fmt.Errorf("invalid version range '%s': %v", versionRange, err)
return fmt.Errorf("invalid version range '%s': %w", versionRange, err)
}
return nil
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ var _ = Describe("RequiredPackageVariableSource", func() {
It("should filter by version range", func() {
// recreate source with version range option
var err error
rpvs, err = variablesources.NewRequiredPackageVariableSource(packageName, variablesources.InVersionRange(">=1.0.0 !2.0.0 <3.0.0"))
rpvs, err = variablesources.NewRequiredPackageVariableSource(packageName, variablesources.InVersionRange(">=1.0.0 !=2.0.0 <3.0.0"))
Expect(err).NotTo(HaveOccurred())

variables, err := rpvs.GetVariables(context.TODO(), mockEntitySource)
Expand Down

0 comments on commit ee305fd

Please sign in to comment.