Skip to content

Commit fc5e9b5

Browse files
Merge pull request #164 from estroz/bz/1989431
Bug 1989431: fix(opm): clarify that bundle declcfgs are not valid refs alone
2 parents 4f3624c + 9f21b6b commit fc5e9b5

File tree

10 files changed

+84
-35
lines changed

10 files changed

+84
-35
lines changed

staging/operator-registry/cmd/opm/alpha/diff/cmd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ func NewCmd() *cobra.Command {
4545
Diff a set of old and new catalog references ("refs") to produce a
4646
declarative config containing only packages channels, and versions not present
4747
in the old set, and versions that differ between the old and new sets. This is known as "latest" mode.
48+
4849
These references are passed through 'opm render' to produce a single declarative config.
50+
Bundle image refs are not supported directly; a valid "olm.package" declarative config object
51+
referring to the bundle's package must exist in all input refs.
4952
5053
This command has special behavior when old-refs are omitted, called "heads-only" mode:
5154
instead of the output being that of 'opm render refs...'

staging/operator-registry/internal/action/diff.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package action
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67

78
"github.com/sirupsen/logrus"
@@ -25,12 +26,18 @@ func (a Diff) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
2526
return nil, err
2627
}
2728

29+
// Disallow bundle refs.
30+
mask := RefDCDir | RefDCImage | RefSqliteFile | RefSqliteImage
31+
2832
// Heads-only mode does not require an old ref, so there may be nothing to render.
2933
var oldModel model.Model
3034
if len(a.OldRefs) != 0 {
31-
oldRender := Render{Refs: a.OldRefs, Registry: a.Registry}
35+
oldRender := Render{Refs: a.OldRefs, Registry: a.Registry, AllowedRefMask: mask}
3236
oldCfg, err := oldRender.Run(ctx)
3337
if err != nil {
38+
if errors.Is(err, ErrNotAllowed) {
39+
return nil, fmt.Errorf("%w (diff does not permit direct bundle references)", err)
40+
}
3441
return nil, fmt.Errorf("error rendering old refs: %v", err)
3542
}
3643
oldModel, err = declcfg.ConvertToModel(*oldCfg)
@@ -39,9 +46,12 @@ func (a Diff) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
3946
}
4047
}
4148

42-
newRender := Render{Refs: a.NewRefs, Registry: a.Registry}
49+
newRender := Render{Refs: a.NewRefs, Registry: a.Registry, AllowedRefMask: mask}
4350
newCfg, err := newRender.Run(ctx)
4451
if err != nil {
52+
if errors.Is(err, ErrNotAllowed) {
53+
return nil, fmt.Errorf("%w (diff does not permit direct bundle references)", err)
54+
}
4555
return nil, fmt.Errorf("error rendering new refs: %v", err)
4656
}
4757
newModel, err := declcfg.ConvertToModel(*newCfg)

staging/operator-registry/internal/action/diff_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ package action_test
33
import (
44
"context"
55
"embed"
6+
"errors"
67
"io/fs"
78
"path"
89
"path/filepath"
910
"strings"
1011
"testing"
1112

13+
"github.com/stretchr/testify/assert"
1214
"github.com/stretchr/testify/require"
1315

1416
"github.com/operator-framework/operator-registry/internal/action"
@@ -49,6 +51,37 @@ func TestDiff(t *testing.T) {
4951
expectedCfg: loadDirFS(t, indicesDir, filepath.Join("testdata", "index-declcfgs", "exp-headsonly")),
5052
assertion: require.NoError,
5153
},
54+
{
55+
name: "Fail/NewBundleImage",
56+
diff: action.Diff{
57+
Registry: registry,
58+
NewRefs: []string{"test.registry/foo-operator/foo-bundle:v0.1.0"},
59+
},
60+
assertion: func(t require.TestingT, err error, _ ...interface{}) {
61+
if !assert.Error(t, err) {
62+
require.Fail(t, "expected an error")
63+
}
64+
if !errors.Is(err, action.ErrNotAllowed) {
65+
require.Fail(t, "err is not action.ErrNotAllowed", err)
66+
}
67+
},
68+
},
69+
{
70+
name: "Fail/OldBundleImage",
71+
diff: action.Diff{
72+
Registry: registry,
73+
OldRefs: []string{"test.registry/foo-operator/foo-bundle:v0.1.0"},
74+
NewRefs: []string{filepath.Join("testdata", "index-declcfgs", "latest")},
75+
},
76+
assertion: func(t require.TestingT, err error, _ ...interface{}) {
77+
if !assert.Error(t, err) {
78+
require.Fail(t, "expected an error")
79+
}
80+
if !errors.Is(err, action.ErrNotAllowed) {
81+
require.Fail(t, "err is not action.ErrNotAllowed", err)
82+
}
83+
},
84+
},
5285
}
5386

5487
for _, s := range specs {

staging/operator-registry/internal/action/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ func indexRefToModel(ctx context.Context, ref string) (model.Model, error) {
206206
}
207207
cfg, err := render.Run(ctx)
208208
if err != nil {
209-
if errors.Is(err, &ErrNotAllowed{}) {
209+
if errors.Is(err, ErrNotAllowed) {
210210
return nil, fmt.Errorf("cannot list non-index %q", ref)
211211
}
212212
return nil, err

staging/operator-registry/internal/action/render.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"database/sql"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"io/ioutil"
910
"os"
@@ -41,13 +42,7 @@ func (r RefType) Allowed(refType RefType) bool {
4142
return r == RefAll || r&refType == refType
4243
}
4344

44-
var _ error = &ErrNotAllowed{}
45-
46-
type ErrNotAllowed struct{}
47-
48-
func (_ *ErrNotAllowed) Error() string {
49-
return "not allowed"
50-
}
45+
var ErrNotAllowed = errors.New("not allowed")
5146

5247
type Render struct {
5348
Refs []string
@@ -108,7 +103,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla
108103
if stat, serr := os.Stat(ref); serr == nil {
109104
if stat.IsDir() {
110105
if !r.AllowedRefMask.Allowed(RefDCDir) {
111-
return nil, fmt.Errorf("cannot render DC directory: %w", &ErrNotAllowed{})
106+
return nil, fmt.Errorf("cannot render declarative config directory: %w", ErrNotAllowed)
112107
}
113108
return declcfg.LoadFS(os.DirFS(ref))
114109
} else {
@@ -118,7 +113,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla
118113
return nil, err
119114
}
120115
if !r.AllowedRefMask.Allowed(RefSqliteFile) {
121-
return nil, fmt.Errorf("cannot render sqlite file: %w", &ErrNotAllowed{})
116+
return nil, fmt.Errorf("cannot render sqlite file: %w", ErrNotAllowed)
122117
}
123118
return sqliteToDeclcfg(ctx, ref)
124119
}
@@ -147,23 +142,23 @@ func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.D
147142
var cfg *declcfg.DeclarativeConfig
148143
if dbFile, ok := labels[containertools.DbLocationLabel]; ok {
149144
if !r.AllowedRefMask.Allowed(RefSqliteImage) {
150-
return nil, fmt.Errorf("cannot render sqlite image: %w", &ErrNotAllowed{})
145+
return nil, fmt.Errorf("cannot render sqlite image: %w", ErrNotAllowed)
151146
}
152147
cfg, err = sqliteToDeclcfg(ctx, filepath.Join(tmpDir, dbFile))
153148
if err != nil {
154149
return nil, err
155150
}
156151
} else if configsDir, ok := labels[containertools.ConfigsLocationLabel]; ok {
157152
if !r.AllowedRefMask.Allowed(RefDCImage) {
158-
return nil, fmt.Errorf("cannot render DC image: %w", &ErrNotAllowed{})
153+
return nil, fmt.Errorf("cannot render declarative config image: %w", ErrNotAllowed)
159154
}
160155
cfg, err = declcfg.LoadFS(os.DirFS(filepath.Join(tmpDir, configsDir)))
161156
if err != nil {
162157
return nil, err
163158
}
164159
} else if _, ok := labels[bundle.PackageLabel]; ok {
165160
if !r.AllowedRefMask.Allowed(RefBundleImage) {
166-
return nil, fmt.Errorf("cannot render bundle image: %w", &ErrNotAllowed{})
161+
return nil, fmt.Errorf("cannot render bundle image: %w", ErrNotAllowed)
167162
}
168163
img, err := registry.NewImageInput(ref, tmpDir)
169164
if err != nil {

staging/operator-registry/internal/action/render_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ func TestAllowRefMask(t *testing.T) {
448448
Registry: reg,
449449
AllowedRefMask: action.RefDCImage | action.RefDCDir | action.RefSqliteFile | action.RefBundleImage,
450450
},
451-
expectErr: &action.ErrNotAllowed{},
451+
expectErr: action.ErrNotAllowed,
452452
},
453453
{
454454
name: "SqliteFile/Allowed",
@@ -466,7 +466,7 @@ func TestAllowRefMask(t *testing.T) {
466466
Registry: reg,
467467
AllowedRefMask: action.RefDCImage | action.RefDCDir | action.RefSqliteImage | action.RefBundleImage,
468468
},
469-
expectErr: &action.ErrNotAllowed{},
469+
expectErr: action.ErrNotAllowed,
470470
},
471471
{
472472
name: "DeclcfgImage/Allowed",
@@ -484,7 +484,7 @@ func TestAllowRefMask(t *testing.T) {
484484
Registry: reg,
485485
AllowedRefMask: action.RefDCDir | action.RefSqliteImage | action.RefSqliteFile | action.RefBundleImage,
486486
},
487-
expectErr: &action.ErrNotAllowed{},
487+
expectErr: action.ErrNotAllowed,
488488
},
489489
{
490490
name: "DeclcfgDir/Allowed",
@@ -502,7 +502,7 @@ func TestAllowRefMask(t *testing.T) {
502502
Registry: reg,
503503
AllowedRefMask: action.RefDCImage | action.RefSqliteImage | action.RefSqliteFile | action.RefBundleImage,
504504
},
505-
expectErr: &action.ErrNotAllowed{},
505+
expectErr: action.ErrNotAllowed,
506506
},
507507
{
508508
name: "BundleImage/Allowed",
@@ -520,7 +520,7 @@ func TestAllowRefMask(t *testing.T) {
520520
Registry: reg,
521521
AllowedRefMask: action.RefDCImage | action.RefDCDir | action.RefSqliteImage | action.RefSqliteFile,
522522
},
523-
expectErr: &action.ErrNotAllowed{},
523+
expectErr: action.ErrNotAllowed,
524524
},
525525
{
526526
name: "All/Allowed",

vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-registry/internal/action/diff.go

Lines changed: 12 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-registry/internal/action/list.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/operator-framework/operator-registry/internal/action/render.go

Lines changed: 7 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)