Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions catalogd/internal/version/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"runtime"
"strings"

"github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
genericversion "k8s.io/apimachinery/pkg/version"
)

Expand All @@ -27,10 +27,11 @@ func Version() genericversion.Info {
Compiler: runtime.Compiler,
Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
}
v, err := semver.Parse(strings.TrimPrefix(gitVersion, "v"))

v, err := mmsemver.NewVersion(strings.TrimPrefix(gitVersion, "v"))
if err == nil {
info.Major = fmt.Sprintf("%d", v.Major)
info.Minor = fmt.Sprintf("%d", v.Minor)
info.Major = fmt.Sprintf("%d", v.Major())
info.Minor = fmt.Sprintf("%d", v.Minor())
}
return info
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ require (
carvel.dev/kapp v0.63.3
github.com/BurntSushi/toml v1.4.0
github.com/Masterminds/semver/v3 v3.3.1
github.com/blang/semver/v4 v4.0.0
github.com/containerd/containerd v1.7.24
github.com/containers/image/v5 v5.32.2
github.com/fsnotify/fsnotify v1.8.0
Expand Down Expand Up @@ -55,6 +54,7 @@ require (
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chai2010/gettext-go v1.0.2 // indirect
Expand Down
10 changes: 5 additions & 5 deletions internal/bundleutil/bundle.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,33 @@ import (
"encoding/json"
"fmt"

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

"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/alpha/property"

ocv1 "github.com/operator-framework/operator-controller/api/v1"
)

func GetVersion(b declcfg.Bundle) (*bsemver.Version, error) {
func GetVersion(b declcfg.Bundle) (*mmsemver.Version, error) {
for _, p := range b.Properties {
if p.Type == property.TypePackage {
var pkg property.Package
if err := json.Unmarshal(p.Value, &pkg); err != nil {
return nil, fmt.Errorf("error unmarshalling package property: %w", err)
}
vers, err := bsemver.Parse(pkg.Version)
vers, err := mmsemver.NewVersion(pkg.Version)
if err != nil {
return nil, err
}
return &vers, nil
return vers, nil
}
}
return nil, fmt.Errorf("no package property found in bundle %q", b.Name)
}

// MetadataFor returns a BundleMetadata for the given bundle name and version.
func MetadataFor(bundleName string, bundleVersion bsemver.Version) ocv1.BundleMetadata {
func MetadataFor(bundleName string, bundleVersion *mmsemver.Version) ocv1.BundleMetadata {
return ocv1.BundleMetadata{
Name: bundleName,
Version: bundleVersion.String(),
Expand Down
2 changes: 1 addition & 1 deletion internal/catalogmetadata/compare/compare.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func ByVersion(b1, b2 declcfg.Bundle) int {

// Check for "greater than" because
// we want higher versions on top
return v2.Compare(*v1)
return v2.Compare(v1)
}

func ByDeprecationFunc(deprecation declcfg.Deprecation) func(a, b declcfg.Bundle) int {
Expand Down
7 changes: 3 additions & 4 deletions internal/catalogmetadata/filter/successors.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"

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

"github.com/operator-framework/operator-registry/alpha/declcfg"

Expand Down Expand Up @@ -45,7 +44,7 @@ func SuccessorsOf(installedBundle ocv1.BundleMetadata, channels ...declcfg.Chann
type successorsPredicateFunc func(installedBundle ocv1.BundleMetadata, channels ...declcfg.Channel) (Predicate[declcfg.Bundle], error)

func legacySuccessor(installedBundle ocv1.BundleMetadata, channels ...declcfg.Channel) (Predicate[declcfg.Bundle], error) {
installedBundleVersion, err := bsemver.Parse(installedBundle.Version)
installedBundleVersion, err := mmsemver.NewVersion(installedBundle.Version)
if err != nil {
return nil, fmt.Errorf("error parsing installed bundle version: %w", err)
}
Expand All @@ -60,8 +59,8 @@ func legacySuccessor(installedBundle ocv1.BundleMetadata, channels ...declcfg.Ch
}
}
if candidateBundleEntry.SkipRange != "" {
skipRange, err := bsemver.ParseRange(candidateBundleEntry.SkipRange)
if err == nil && skipRange(installedBundleVersion) {
skipRange, err := mmsemver.NewConstraint(candidateBundleEntry.SkipRange)
if err == nil && skipRange.Check(installedBundleVersion) {
return true
}
}
Expand Down
14 changes: 7 additions & 7 deletions internal/catalogmetadata/filter/successors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"slices"
"testing"

bsemver "github.com/blang/semver/v4"
mmsemver "github.com/Masterminds/semver/v3"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -134,7 +134,7 @@ func TestSuccessorsPredicateWithForceSemverUpgradeConstraintsEnabled(t *testing.
}{
{
name: "with non-zero major version",
installedBundle: bundleutil.MetadataFor("test-package.v2.0.0", bsemver.MustParse("2.0.0")),
installedBundle: bundleutil.MetadataFor("test-package.v2.0.0", mmsemver.MustParse("2.0.0")),
expectedResult: []declcfg.Bundle{
// Updates are allowed within the major version
bundleSet["test-package.v2.2.0"],
Expand All @@ -144,15 +144,15 @@ func TestSuccessorsPredicateWithForceSemverUpgradeConstraintsEnabled(t *testing.
},
{
name: "with zero major and zero minor version",
installedBundle: bundleutil.MetadataFor("test-package.v0.0.1", bsemver.MustParse("0.0.1")),
installedBundle: bundleutil.MetadataFor("test-package.v0.0.1", mmsemver.MustParse("0.0.1")),
expectedResult: []declcfg.Bundle{
// No updates are allowed in major version zero when minor version is also zero
bundleSet["test-package.v0.0.1"],
},
},
{
name: "with zero major and non-zero minor version",
installedBundle: bundleutil.MetadataFor("test-package.v0.1.0", bsemver.MustParse("0.1.0")),
installedBundle: bundleutil.MetadataFor("test-package.v0.1.0", mmsemver.MustParse("0.1.0")),
expectedResult: []declcfg.Bundle{
// Patch version updates are allowed within the minor version
bundleSet["test-package.v0.1.2"],
Expand Down Expand Up @@ -286,7 +286,7 @@ func TestSuccessorsPredicateWithForceSemverUpgradeConstraintsDisabled(t *testing
}{
{
name: "respect replaces directive from catalog",
installedBundle: bundleutil.MetadataFor("test-package.v2.0.0", bsemver.MustParse("2.0.0")),
installedBundle: bundleutil.MetadataFor("test-package.v2.0.0", mmsemver.MustParse("2.0.0")),
expectedResult: []declcfg.Bundle{
// Must only have two bundle:
// - the one which replaces the current version
Expand All @@ -297,7 +297,7 @@ func TestSuccessorsPredicateWithForceSemverUpgradeConstraintsDisabled(t *testing
},
{
name: "respect skips directive from catalog",
installedBundle: bundleutil.MetadataFor("test-package.v2.2.1", bsemver.MustParse("2.2.1")),
installedBundle: bundleutil.MetadataFor("test-package.v2.2.1", mmsemver.MustParse("2.2.1")),
expectedResult: []declcfg.Bundle{
// Must only have two bundle:
// - the one which skips the current version
Expand All @@ -308,7 +308,7 @@ func TestSuccessorsPredicateWithForceSemverUpgradeConstraintsDisabled(t *testing
},
{
name: "respect skipRange directive from catalog",
installedBundle: bundleutil.MetadataFor("test-package.v2.3.0", bsemver.MustParse("2.3.0")),
installedBundle: bundleutil.MetadataFor("test-package.v2.3.0", mmsemver.MustParse("2.3.0")),
expectedResult: []declcfg.Bundle{
// Must only have two bundle:
// - the one which is skipRanges the current version
Expand Down
2 changes: 1 addition & 1 deletion internal/controllers/clusterextension_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func (r *ClusterExtensionReconciler) reconcile(ctx context.Context, ext *ocv1.Cl
// all catalogs?
SetDeprecationStatus(ext, resolvedBundle.Name, resolvedDeprecation)

resolvedBundleMetadata := bundleutil.MetadataFor(resolvedBundle.Name, *resolvedBundleVersion)
resolvedBundleMetadata := bundleutil.MetadataFor(resolvedBundle.Name, resolvedBundleVersion)
bundleSource := &rukpaksource.BundleSource{
Name: ext.GetName(),
Type: rukpaksource.SourceTypeImage,
Expand Down
53 changes: 27 additions & 26 deletions internal/controllers/clusterextension_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import (
"testing"
"testing/fstest"

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

"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -50,7 +51,7 @@ func TestClusterExtensionDoesNotExist(t *testing.T) {
func TestClusterExtensionResolutionFails(t *testing.T) {
pkgName := fmt.Sprintf("non-existent-%s", rand.String(6))
cl, reconciler := newClientAndReconciler(t)
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
return nil, nil, nil, fmt.Errorf("no package %q found", pkgName)
})
ctx := context.Background()
Expand Down Expand Up @@ -154,13 +155,13 @@ func TestClusterExtensionResolutionSuccessfulUnpackFails(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
res, err := reconciler.Reconcile(ctx, ctrl.Request{NamespacedName: extKey})
require.Equal(t, ctrl.Result{}, res)
Expand Down Expand Up @@ -236,13 +237,13 @@ func TestClusterExtensionUnpackUnexpectedState(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})

require.Panics(t, func() {
Expand Down Expand Up @@ -294,13 +295,13 @@ func TestClusterExtensionResolutionAndUnpackSuccessfulApplierFails(t *testing.T)

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
reconciler.Applier = &MockApplier{
err: errors.New("apply failure"),
Expand Down Expand Up @@ -374,13 +375,13 @@ func TestClusterExtensionApplierFailsWithBundleInstalled(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})

reconciler.Manager = &MockManagedContentCacheManager{
Expand Down Expand Up @@ -473,13 +474,13 @@ func TestClusterExtensionManagerFailed(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
reconciler.Applier = &MockApplier{
objs: []client.Object{},
Expand Down Expand Up @@ -555,13 +556,13 @@ func TestClusterExtensionManagedContentCacheWatchFail(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
reconciler.Applier = &MockApplier{
objs: []client.Object{},
Expand Down Expand Up @@ -638,13 +639,13 @@ func TestClusterExtensionInstallationSucceeds(t *testing.T) {

t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
reconciler.Applier = &MockApplier{
objs: []client.Object{},
Expand Down Expand Up @@ -718,13 +719,13 @@ func TestClusterExtensionDeleteFinalizerFails(t *testing.T) {
require.NoError(t, err)
t.Log("It sets resolution success status")
t.Log("By running reconcile")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
v := bsemver.MustParse("1.0.0")
reconciler.Resolver = resolve.Func(func(_ context.Context, _ *ocv1.ClusterExtension, _ *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
v := mmsemver.MustParse("1.0.0")
return &declcfg.Bundle{
Name: "prometheus.v1.0.0",
Package: "prometheus",
Image: "quay.io/operatorhubio/prometheus@fake1.0.0",
}, &v, nil, nil
}, v, nil, nil
})
fakeFinalizer := "fake.testfinalizer.io"
finalizersMessage := "still have finalizers"
Expand Down
3 changes: 1 addition & 2 deletions internal/resolve/catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"strings"

mmsemver "github.com/Masterminds/semver/v3"
bsemver "github.com/blang/semver/v4"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/sets"
Expand Down Expand Up @@ -38,7 +37,7 @@ type foundBundle struct {
}

// Resolve returns a Bundle from a catalog that needs to get installed on the cluster.
func (r *CatalogResolver) Resolve(ctx context.Context, ext *ocv1.ClusterExtension, installedBundle *ocv1.BundleMetadata) (*declcfg.Bundle, *bsemver.Version, *declcfg.Deprecation, error) {
func (r *CatalogResolver) Resolve(ctx context.Context, ext *ocv1.ClusterExtension, installedBundle *ocv1.BundleMetadata) (*declcfg.Bundle, *mmsemver.Version, *declcfg.Deprecation, error) {
packageName := ext.Spec.Source.Catalog.PackageName
versionRange := ext.Spec.Source.Catalog.Version
channels := ext.Spec.Source.Catalog.Channels
Expand Down
Loading
Loading