Skip to content

Commit

Permalink
refactor config file filter impl and add (some) tests
Browse files Browse the repository at this point in the history
Signed-off-by: Joe Lanford <joe.lanford@gmail.com>
  • Loading branch information
joelanford committed Apr 3, 2024
1 parent 33fe0a9 commit 2a4d098
Show file tree
Hide file tree
Showing 19 changed files with 2,218 additions and 221 deletions.
7 changes: 3 additions & 4 deletions alpha/action/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import (
"k8s.io/apimachinery/pkg/util/sets"

"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/alpha/declcfg/filter"
"github.com/operator-framework/operator-registry/alpha/property"
"github.com/operator-framework/operator-registry/pkg/containertools"
"github.com/operator-framework/operator-registry/pkg/image"
Expand Down Expand Up @@ -251,13 +250,13 @@ func (r *Render) renderFBCDirectory(ctx context.Context, dir string) (*declcfg.D
// If a filterer is provided that can tell us which meta objects to keep, we
// can optimize FBC loading and post-filtering by ignoring meta objects that
// we know we won't need to keep.
metaFilter := filter.KeepAllMetas
opts := []declcfg.LoadOption{}
if r.Filter != nil {
if mf, ok := r.Filter.(declcfg.MetaFilter); ok {
metaFilter = mf
opts = append(opts, declcfg.WithMetaFilter(mf))
}
}
return declcfg.LoadFS(ctx, os.DirFS(dir), declcfg.WithMetaFilter(metaFilter))
return declcfg.LoadFS(ctx, os.DirFS(dir), opts...)
}

// checkDBFile returns an error if ref is not an sqlite3 database.
Expand Down
305 changes: 303 additions & 2 deletions alpha/action/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (

"github.com/operator-framework/operator-registry/alpha/action"
"github.com/operator-framework/operator-registry/alpha/declcfg"
configv1alpha1 "github.com/operator-framework/operator-registry/alpha/declcfg/filter/config/v1alpha1"
"github.com/operator-framework/operator-registry/alpha/property"
"github.com/operator-framework/operator-registry/pkg/containertools"
"github.com/operator-framework/operator-registry/pkg/image"
Expand Down Expand Up @@ -164,6 +165,77 @@ func TestRender(t *testing.T) {
},
assertion: require.NoError,
},
{
name: "Success/SqliteIndexImage/Filter",
render: action.Render{
Refs: []string{"test.registry/foo-operator/foo-index-sqlite:v0.2.0"},
Registry: reg,
Filter: configv1alpha1.NewFilter(configv1alpha1.FilterConfiguration{
Packages: []configv1alpha1.Package{{
Name: "foo",
DefaultChannel: "stable",
Channels: []configv1alpha1.Channel{{
Name: "stable",
VersionRange: ">=0.2.0",
}},
}},
}),
},
expectCfg: &declcfg.DeclarativeConfig{
Packages: []declcfg.Package{
{
Schema: "olm.package",
Name: "foo",
DefaultChannel: "stable",
},
},
Channels: []declcfg.Channel{
{Schema: "olm.channel", Package: "foo", Name: "stable", Entries: []declcfg.ChannelEntry{
{Name: "foo.v0.2.0", Replaces: "foo.v0.1.0", SkipRange: "<0.2.0", Skips: []string{"foo.v0.1.1", "foo.v0.1.2"}},
}},
},
Bundles: []declcfg.Bundle{
{
Schema: "olm.bundle",
Name: "foo.v0.2.0",
Package: "foo",
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
Properties: []property.Property{
property.MustBuildGVK("test.foo", "v1", "Foo"),
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
Image: "test.registry/foo-operator/foo-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init:v0.2.0",
},
{
Name: "other",
Image: "test.registry/foo-operator/foo-other:v0.2.0",
},
{
Name: "operator",
Image: "test.registry/foo-operator/foo:v0.2.0",
},
},
CsvJSON: string(foov2csv),
Objects: []string{string(foov2csv), string(foov2crd)},
},
},
},
assertion: require.NoError,
},
{
name: "Success/SqliteFile",
render: action.Render{
Expand Down Expand Up @@ -254,6 +326,77 @@ func TestRender(t *testing.T) {
},
assertion: require.NoError,
},
{
name: "Success/SqliteFile/Filter",
render: action.Render{
Refs: []string{dbFile},
Registry: reg,
Filter: configv1alpha1.NewFilter(configv1alpha1.FilterConfiguration{
Packages: []configv1alpha1.Package{{
Name: "foo",
DefaultChannel: "stable",
Channels: []configv1alpha1.Channel{{
Name: "stable",
VersionRange: ">=0.2.0",
}},
}},
}),
},
expectCfg: &declcfg.DeclarativeConfig{
Packages: []declcfg.Package{
{
Schema: "olm.package",
Name: "foo",
DefaultChannel: "stable",
},
},
Channels: []declcfg.Channel{
{Schema: "olm.channel", Package: "foo", Name: "stable", Entries: []declcfg.ChannelEntry{
{Name: "foo.v0.2.0", Replaces: "foo.v0.1.0", SkipRange: "<0.2.0", Skips: []string{"foo.v0.1.1", "foo.v0.1.2"}},
}},
},
Bundles: []declcfg.Bundle{
{
Schema: "olm.bundle",
Name: "foo.v0.2.0",
Package: "foo",
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
Properties: []property.Property{
property.MustBuildGVK("test.foo", "v1", "Foo"),
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
Image: "test.registry/foo-operator/foo-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init:v0.2.0",
},
{
Name: "other",
Image: "test.registry/foo-operator/foo-other:v0.2.0",
},
{
Name: "operator",
Image: "test.registry/foo-operator/foo:v0.2.0",
},
},
CsvJSON: string(foov2csv),
Objects: []string{string(foov2csv), string(foov2crd)},
},
},
},
assertion: require.NoError,
},
{
name: "Success/DeclcfgIndexImage",
render: action.Render{
Expand Down Expand Up @@ -352,6 +495,85 @@ func TestRender(t *testing.T) {
},
assertion: require.NoError,
},
{
name: "Success/DeclcfgIndexImage/Filter",
render: action.Render{
Refs: []string{"test.registry/foo-operator/foo-index-declcfg:v0.2.0"},
Registry: reg,
Filter: configv1alpha1.NewFilter(configv1alpha1.FilterConfiguration{
Packages: []configv1alpha1.Package{{
Name: "foo",
DefaultChannel: "beta",
Channels: []configv1alpha1.Channel{{
Name: "beta",
VersionRange: ">=0.2.0",
}},
}},
}),
},
expectCfg: &declcfg.DeclarativeConfig{
Packages: []declcfg.Package{
{
Schema: "olm.package",
Name: "foo",
DefaultChannel: "beta",
Properties: []property.Property{
{Type: "owner", Value: json.RawMessage("{\"group\":\"abc.com\",\"name\":\"admin\"}")},
},
},
},
Channels: []declcfg.Channel{
{Schema: "olm.channel", Package: "foo", Name: "beta", Entries: []declcfg.ChannelEntry{
{Name: "foo.v0.2.0", Replaces: "foo.v0.1.0", SkipRange: "<0.2.0", Skips: []string{"foo.v0.1.1", "foo.v0.1.2"}},
},
Properties: []property.Property{
{Type: "user", Value: json.RawMessage("{\"group\":\"xyz.com\",\"name\":\"account\"}")},
},
},
},
Bundles: []declcfg.Bundle{
{
Schema: "olm.bundle",
Name: "foo.v0.2.0",
Package: "foo",
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
Properties: []property.Property{
property.MustBuildGVK("test.foo", "v1", "Foo"),
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
property.MustBuildBundleObject(foov2csv),
property.MustBuildBundleObject(foov2crd),
},
RelatedImages: []declcfg.RelatedImage{
{
Image: "test.registry/foo-operator/foo-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init:v0.2.0",
},
{
Name: "other",
Image: "test.registry/foo-operator/foo-other:v0.2.0",
},
{
Name: "operator",
Image: "test.registry/foo-operator/foo:v0.2.0",
},
},
CsvJSON: string(foov2csv),
Objects: []string{string(foov2csv), string(foov2crd)},
},
},
},
assertion: require.NoError,
},
{
name: "Success/DeclcfgDirectory",
render: action.Render{
Expand Down Expand Up @@ -451,7 +673,86 @@ func TestRender(t *testing.T) {
assertion: require.NoError,
},
{
name: "Success/DeclcfgImageMigrate",
name: "Success/DeclcfgDirectory/Filter",
render: action.Render{
Refs: []string{"testdata/foo-index-v0.2.0-declcfg"},
Registry: reg,
Filter: configv1alpha1.NewFilter(configv1alpha1.FilterConfiguration{
Packages: []configv1alpha1.Package{{
Name: "foo",
DefaultChannel: "beta",
Channels: []configv1alpha1.Channel{{
Name: "beta",
VersionRange: ">=0.2.0",
}},
}},
}),
},
expectCfg: &declcfg.DeclarativeConfig{
Packages: []declcfg.Package{
{
Schema: "olm.package",
Name: "foo",
DefaultChannel: "beta",
Properties: []property.Property{
{Type: "owner", Value: json.RawMessage("{\"group\":\"abc.com\",\"name\":\"admin\"}")},
},
},
},
Channels: []declcfg.Channel{
{Schema: "olm.channel", Package: "foo", Name: "beta", Entries: []declcfg.ChannelEntry{
{Name: "foo.v0.2.0", Replaces: "foo.v0.1.0", SkipRange: "<0.2.0", Skips: []string{"foo.v0.1.1", "foo.v0.1.2"}},
},
Properties: []property.Property{
{Type: "user", Value: json.RawMessage("{\"group\":\"xyz.com\",\"name\":\"account\"}")},
},
},
},
Bundles: []declcfg.Bundle{
{
Schema: "olm.bundle",
Name: "foo.v0.2.0",
Package: "foo",
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
Properties: []property.Property{
property.MustBuildGVK("test.foo", "v1", "Foo"),
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
property.MustBuildBundleObject(foov2csv),
property.MustBuildBundleObject(foov2crd),
},
RelatedImages: []declcfg.RelatedImage{
{
Image: "test.registry/foo-operator/foo-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-bundle:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init-2:v0.2.0",
},
{
Image: "test.registry/foo-operator/foo-init:v0.2.0",
},
{
Name: "other",
Image: "test.registry/foo-operator/foo-other:v0.2.0",
},
{
Name: "operator",
Image: "test.registry/foo-operator/foo:v0.2.0",
},
},
CsvJSON: string(foov2csv),
Objects: []string{string(foov2csv), string(foov2crd)},
},
},
},
assertion: require.NoError,
},
{
name: "Success/DeclcfgImage/Migrate",
render: action.Render{
Refs: []string{"test.registry/foo-operator/foo-index-declcfg:v0.2.0"},
Migrate: true,
Expand Down Expand Up @@ -548,7 +849,7 @@ func TestRender(t *testing.T) {
assertion: require.NoError,
},
{
name: "Success/DeclcfgDirectoryMigrate",
name: "Success/DeclcfgDirectory/Migrate",
render: action.Render{
Refs: []string{"testdata/foo-index-v0.2.0-declcfg"},
Migrate: true,
Expand Down
Loading

0 comments on commit 2a4d098

Please sign in to comment.