Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7b2faba

Browse files
committedApr 30, 2021
check presence of all bundles before deprecate
Signed-off-by: Ankita Thomas <[email protected]>
1 parent 83884aa commit 7b2faba

File tree

10 files changed

+399
-34
lines changed

10 files changed

+399
-34
lines changed
 

‎go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.16
55
require (
66
github.com/Microsoft/hcsshim v0.8.9 // indirect
77
github.com/blang/semver v3.5.1+incompatible
8+
github.com/blang/semver/v4 v4.0.0
89
github.com/bugsnag/bugsnag-go v1.5.3 // indirect
910
github.com/bugsnag/panicwrap v1.2.0 // indirect
1011
github.com/containerd/containerd v1.3.2
@@ -61,6 +62,7 @@ require (
6162
k8s.io/kubectl v0.20.6
6263
sigs.k8s.io/controller-runtime v0.8.0
6364
sigs.k8s.io/kind v0.10.0
65+
sigs.k8s.io/yaml v1.2.0
6466
)
6567

6668
replace (

‎pkg/lib/registry/registry.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,9 @@ func (r RegistryUpdater) DeprecateFromRegistry(request DeprecateFromRegistryRequ
342342
return fmt.Errorf("unable to migrate database: %s", err)
343343
}
344344

345-
deprecator := sqlite.NewSQLDeprecatorForBundles(dbLoader, request.Bundles)
345+
dbQuerier := sqlite.NewSQLLiteQuerierFromDb(db)
346+
347+
deprecator := sqlite.NewSQLDeprecatorForBundles(dbLoader, dbQuerier, request.Bundles)
346348
if err := deprecator.Deprecate(); err != nil {
347349
r.Logger.Debugf("unable to deprecate bundles from database: %s", err)
348350
if !request.Permissive {

‎pkg/registry/empty.go

+4
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ func (EmptyQuery) ListRegistryBundles(ctx context.Context) ([]*Bundle, error) {
112112
return nil, errors.New("empty querier: cannot list registry bundles")
113113
}
114114

115+
func (EmptyQuery) GetBundleNameAndVersionForImage(ctx context.Context, path string) (bundleName string, bundleVersion string, err error) {
116+
return "", "", errors.New("empty querier: cannot get bundle from path")
117+
}
118+
115119
var _ Query = &EmptyQuery{}
116120

117121
func NewEmptyQuerier() *EmptyQuery {

‎pkg/registry/interface.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type Load interface {
1313
AddBundlePackageChannels(manifest PackageManifest, bundle *Bundle) error
1414
RemovePackage(packageName string) error
1515
RemoveStrandedBundles() error
16-
DeprecateBundle(path string) error
16+
DeprecateBundle(name, version, path string) error
1717
ClearNonHeadBundles() error
1818
}
1919

@@ -79,6 +79,8 @@ type Query interface {
7979
GetBundlePathIfExists(ctx context.Context, csvName string) (string, error)
8080
// ListRegistryBundles returns a set of registry bundles.
8181
ListRegistryBundles(ctx context.Context) ([]*Bundle, error)
82+
83+
GetBundleNameAndVersionForImage(ctx context.Context, bundlepath string) (name string, version string, err error)
8284
}
8385

8486
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . GraphLoader

‎pkg/registry/populator_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ func TestDeprecateBundle(t *testing.T) {
859859
store, err := sqlite.NewSQLLiteLoader(db)
860860
require.NoError(t, err)
861861

862-
deprecator := sqlite.NewSQLDeprecatorForBundles(store, tt.args.bundles)
862+
deprecator := sqlite.NewSQLDeprecatorForBundles(store, querier, tt.args.bundles)
863863
err = deprecator.Deprecate()
864864
fmt.Printf("error: %s\n", err)
865865
require.Equal(t, tt.expected.err, err)
@@ -994,7 +994,7 @@ func TestAddAfterDeprecate(t *testing.T) {
994994
// Initialize index with some bundles
995995
require.NoError(t, populate(tt.args.firstBundles))
996996

997-
deprecator := sqlite.NewSQLDeprecatorForBundles(load, tt.args.deprecatedBundles)
997+
deprecator := sqlite.NewSQLDeprecatorForBundles(load, query, tt.args.deprecatedBundles)
998998
err = deprecator.Deprecate()
999999
require.Equal(t, tt.expected.err, err)
10001000

‎pkg/sqlite/deprecate.go

+32-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sqlite
22

33
import (
4+
"context"
45
"errors"
56
"fmt"
67

@@ -17,14 +18,16 @@ type SQLDeprecator interface {
1718
// BundleDeprecator removes bundles from the database
1819
type BundleDeprecator struct {
1920
store registry.Load
21+
querier registry.Query
2022
bundles []string
2123
}
2224

2325
var _ SQLDeprecator = &BundleDeprecator{}
2426

25-
func NewSQLDeprecatorForBundles(store registry.Load, bundles []string) *BundleDeprecator {
27+
func NewSQLDeprecatorForBundles(store registry.Load, querier registry.Query, bundles []string) *BundleDeprecator {
2628
return &BundleDeprecator{
2729
store: store,
30+
querier: querier,
2831
bundles: bundles,
2932
}
3033
}
@@ -35,10 +38,35 @@ func (d *BundleDeprecator) Deprecate() error {
3538
log.Info("deprecating bundles")
3639

3740
var errs []error
38-
41+
type nameVersion struct {
42+
name string
43+
version string
44+
}
45+
bundleInfo := make(map[string]nameVersion)
46+
// Check if all bundlepaths are valid
3947
for _, bundlePath := range d.bundles {
40-
if err := d.store.DeprecateBundle(bundlePath); err != nil {
41-
if !errors.Is(err, registry.ErrBundleImageNotInDatabase) && !errors.Is(err, registry.ErrRemovingDefaultChannelDuringDeprecation) {
48+
name, version, err := d.querier.GetBundleNameAndVersionForImage(context.TODO(), bundlePath)
49+
if err != nil {
50+
errs = append(errs, fmt.Errorf("error deprecating bundle %s: %s", bundlePath, err))
51+
}
52+
bundleInfo[bundlePath] = nameVersion{name, version}
53+
}
54+
55+
if len(errs) != 0 {
56+
return utilerrors.NewAggregate(errs)
57+
}
58+
59+
for bundlePath, bundle := range bundleInfo {
60+
// verify that bundle is still present
61+
_, _, err := d.querier.GetBundleNameAndVersionForImage(context.TODO(), bundlePath)
62+
if err != nil {
63+
if !errors.Is(err, registry.ErrBundleImageNotInDatabase) {
64+
errs = append(errs, fmt.Errorf("error deprecating bundle %s: %s", bundlePath, err))
65+
}
66+
continue
67+
}
68+
if err := d.store.DeprecateBundle(bundle.name, bundle.version, bundlePath); err != nil {
69+
if !errors.Is(err, registry.ErrRemovingDefaultChannelDuringDeprecation) {
4270
return utilerrors.NewAggregate(append(errs, fmt.Errorf("error deprecating bundle %s: %s", bundlePath, err)))
4371
}
4472
errs = append(errs, fmt.Errorf("error deprecating bundle %s: %s", bundlePath, err))

‎pkg/sqlite/deprecate_test.go

+329
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
1+
package sqlite
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io/ioutil"
7+
"os"
8+
"path/filepath"
9+
"strings"
10+
"testing"
11+
12+
"github.com/blang/semver/v4"
13+
"github.com/operator-framework/api/pkg/lib/version"
14+
"github.com/operator-framework/api/pkg/operators/v1alpha1"
15+
"github.com/operator-framework/operator-registry/pkg/api"
16+
"github.com/operator-framework/operator-registry/pkg/image"
17+
"github.com/operator-framework/operator-registry/pkg/registry"
18+
"github.com/sirupsen/logrus"
19+
"github.com/stretchr/testify/require"
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
"sigs.k8s.io/yaml"
22+
)
23+
24+
type testBundle struct {
25+
version string
26+
pkg string
27+
channels []string
28+
defaultChannel string
29+
skips []string
30+
replaces string
31+
}
32+
33+
func newRegistryBundle(t *testing.T, b testBundle) *registry.Bundle {
34+
name := b.version
35+
csvYAML, err := yaml.Marshal(&v1alpha1.ClusterServiceVersion{
36+
TypeMeta: metav1.TypeMeta{
37+
Kind: v1alpha1.ClusterServiceVersionKind,
38+
APIVersion: v1alpha1.ClusterServiceVersionAPIVersion,
39+
},
40+
ObjectMeta: metav1.ObjectMeta{Name: name, Annotations: map[string]string{}},
41+
Spec: v1alpha1.ClusterServiceVersionSpec{
42+
Version: version.OperatorVersion{
43+
Version: semver.MustParse(b.version),
44+
},
45+
Replaces: b.replaces,
46+
Skips: b.skips,
47+
},
48+
})
49+
require.NoError(t, err)
50+
51+
tmpdir, err := ioutil.TempDir(".", "depr-")
52+
require.NoError(t, err)
53+
defer os.RemoveAll(tmpdir)
54+
55+
annotationsYAML, err := yaml.Marshal(&registry.AnnotationsFile{
56+
Annotations: registry.Annotations{
57+
PackageName: b.pkg,
58+
Channels: strings.Join(b.channels, ","),
59+
DefaultChannelName: b.defaultChannel,
60+
},
61+
})
62+
require.NoError(t, err)
63+
64+
require.NoError(t, os.Mkdir(filepath.Join(tmpdir, "manifests"), 0755))
65+
require.NoError(t, os.Mkdir(filepath.Join(tmpdir, "metadata"), 0755))
66+
require.NoError(t, ioutil.WriteFile(filepath.Join(tmpdir, "manifests", "csv.yaml"), csvYAML, 0644))
67+
require.NoError(t, ioutil.WriteFile(filepath.Join(tmpdir, "metadata", "annotations.yaml"), annotationsYAML, 0644))
68+
69+
img, err := registry.NewImageInput(image.SimpleReference(fmt.Sprintf("bundle-%s", b.version)), tmpdir)
70+
require.NoError(t, err)
71+
72+
return img.Bundle
73+
}
74+
75+
func TestDeprecate(t *testing.T) {
76+
tests := []struct {
77+
description string
78+
initial []testBundle
79+
deprecate []string
80+
expected []*api.Bundle
81+
expectedError error
82+
}{
83+
{
84+
description: "Missing Image",
85+
initial: []testBundle{
86+
{
87+
version: "0.0.1",
88+
pkg: "testpkg",
89+
channels: []string{"stable"},
90+
defaultChannel: "stable",
91+
skips: nil,
92+
replaces: "",
93+
},
94+
},
95+
deprecate: []string{
96+
"bundle-nonexistent",
97+
},
98+
expectedError: fmt.Errorf("error deprecating bundle bundle-nonexistent: %s", registry.ErrBundleImageNotInDatabase),
99+
},
100+
{
101+
description: "Unordered multi-bundle deprecation",
102+
initial: []testBundle{
103+
{
104+
version: "0.0.1",
105+
pkg: "testpkg",
106+
channels: []string{"stable", "0.x"},
107+
defaultChannel: "stable",
108+
skips: []string{"0.0.1-rc0"},
109+
},
110+
{
111+
version: "0.0.2",
112+
pkg: "testpkg",
113+
channels: []string{"stable", "0.x"},
114+
defaultChannel: "stable",
115+
replaces: "0.0.1",
116+
},
117+
{
118+
version: "0.0.3-rc0",
119+
pkg: "testpkg",
120+
channels: []string{"0.x"},
121+
defaultChannel: "stable",
122+
skips: nil,
123+
replaces: "0.0.2",
124+
},
125+
{
126+
version: "1.0.1",
127+
pkg: "testpkg",
128+
channels: []string{"stable", "1.x"},
129+
defaultChannel: "stable",
130+
skips: []string{"0.0.3-rc0", "0.0.1"},
131+
replaces: "0.0.2",
132+
},
133+
{
134+
version: "1.0.2-rc0",
135+
pkg: "testpkg",
136+
channels: []string{"1.x"},
137+
defaultChannel: "stable",
138+
skips: nil,
139+
replaces: "1.0.1",
140+
},
141+
{
142+
version: "1.0.2",
143+
pkg: "testpkg",
144+
channels: []string{"stable", "1.x"},
145+
defaultChannel: "stable",
146+
skips: []string{"1.0.2-rc0"},
147+
replaces: "1.0.1",
148+
},
149+
{
150+
version: "2.0.1",
151+
pkg: "testpkg",
152+
channels: []string{"stable", "2.x"},
153+
defaultChannel: "stable",
154+
skips: nil,
155+
replaces: "1.0.2",
156+
},
157+
{
158+
version: "2.0.2",
159+
pkg: "testpkg",
160+
channels: []string{"stable", "2.x"},
161+
defaultChannel: "stable",
162+
skips: nil,
163+
replaces: "2.0.1",
164+
},
165+
},
166+
deprecate: []string{
167+
"bundle-1.0.2",
168+
"bundle-0.0.2",
169+
"bundle-2.0.2",
170+
},
171+
expected: []*api.Bundle{
172+
{
173+
CsvName: "2.0.2",
174+
PackageName: "testpkg",
175+
ChannelName: "2.x",
176+
CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"2.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"2.0.1\",\"version\":\"2.0.2\"},\"status\":{\"cleanup\":{}}}",
177+
Object: []string{
178+
"{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"2.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"2.0.1\",\"version\":\"2.0.2\"},\"status\":{\"cleanup\":{}}}",
179+
},
180+
BundlePath: "bundle-2.0.2",
181+
Version: "2.0.2",
182+
Replaces: "",
183+
Skips: nil,
184+
Properties: []*api.Property{{
185+
Type: registry.DeprecatedType,
186+
Value: "{}",
187+
}},
188+
},
189+
{
190+
CsvName: "2.0.2",
191+
PackageName: "testpkg",
192+
ChannelName: "stable",
193+
CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"2.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"2.0.1\",\"version\":\"2.0.2\"},\"status\":{\"cleanup\":{}}}",
194+
Object: []string{
195+
"{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"2.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"2.0.1\",\"version\":\"2.0.2\"},\"status\":{\"cleanup\":{}}}",
196+
},
197+
BundlePath: "bundle-2.0.2",
198+
Version: "2.0.2",
199+
Replaces: "",
200+
Skips: nil,
201+
Properties: []*api.Property{{
202+
Type: registry.DeprecatedType,
203+
Value: "{}",
204+
}},
205+
},
206+
},
207+
},
208+
{
209+
description: "deprecate semver branch",
210+
initial: []testBundle{
211+
{
212+
version: "1.0.1",
213+
pkg: "testpkg",
214+
channels: []string{"stable", "1.x"},
215+
defaultChannel: "stable",
216+
skips: nil,
217+
replaces: "",
218+
},
219+
{
220+
version: "1.0.2-rc0",
221+
pkg: "testpkg",
222+
channels: []string{"1.x"},
223+
defaultChannel: "stable",
224+
skips: nil,
225+
replaces: "1.0.1",
226+
},
227+
{
228+
version: "1.0.2-rc1",
229+
pkg: "testpkg",
230+
channels: []string{"1.x"},
231+
defaultChannel: "stable",
232+
skips: []string{"1.0.2-rc0"},
233+
replaces: "1.0.1",
234+
},
235+
{
236+
version: "1.0.2",
237+
pkg: "testpkg",
238+
channels: []string{"stable", "1.x"},
239+
defaultChannel: "stable",
240+
skips: []string{"1.0.2-rc0"},
241+
replaces: "1.0.1",
242+
},
243+
},
244+
deprecate: []string{
245+
"bundle-1.0.2-rc1",
246+
"bundle-1.0.2-rc0",
247+
},
248+
expected: []*api.Bundle{
249+
250+
{
251+
CsvName: "1.0.2",
252+
PackageName: "testpkg",
253+
ChannelName: "1.x",
254+
CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2\"},\"status\":{\"cleanup\":{}}}",
255+
Object: []string{"{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2\"},\"status\":{\"cleanup\":{}}}"},
256+
BundlePath: "bundle-1.0.2",
257+
Version: "1.0.2",
258+
Replaces: "1.0.2-rc1",
259+
},
260+
{
261+
CsvName: "1.0.2",
262+
PackageName: "testpkg",
263+
ChannelName: "stable",
264+
CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2\"},\"status\":{\"cleanup\":{}}}",
265+
Object: []string{"{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2\"},\"status\":{\"cleanup\":{}}}"},
266+
BundlePath: "bundle-1.0.2",
267+
Version: "1.0.2",
268+
},
269+
{
270+
CsvName: "1.0.2-rc1",
271+
PackageName: "testpkg",
272+
ChannelName: "1.x",
273+
CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2-rc1\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2-rc1\"},\"status\":{\"cleanup\":{}}}",
274+
Object: []string{"{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"creationTimestamp\":null,\"name\":\"1.0.2-rc1\"},\"spec\":{\"apiservicedefinitions\":{},\"cleanup\":{\"enabled\":false},\"customresourcedefinitions\":{},\"displayName\":\"\",\"install\":{\"spec\":{\"deployments\":null},\"strategy\":\"\"},\"provider\":{},\"replaces\":\"1.0.1\",\"skips\":[\"1.0.2-rc0\"],\"version\":\"1.0.2-rc1\"},\"status\":{\"cleanup\":{}}}"},
275+
BundlePath: "bundle-1.0.2-rc1",
276+
Version: "1.0.2-rc1",
277+
Properties: []*api.Property{{
278+
Type: registry.DeprecatedType,
279+
Value: "{}",
280+
}},
281+
},
282+
},
283+
},
284+
}
285+
for _, tt := range tests {
286+
t.Run(tt.description, func(t *testing.T) {
287+
logrus.SetLevel(logrus.DebugLevel)
288+
db, cleanup := CreateTestDb(t)
289+
defer cleanup()
290+
store, err := NewSQLLiteLoader(db)
291+
require.NoError(t, err)
292+
err = store.Migrate(context.TODO())
293+
require.NoError(t, err)
294+
295+
graphLoader, err := NewSQLGraphLoaderFromDB(db)
296+
require.NoError(t, err)
297+
298+
querier := NewSQLLiteQuerierFromDb(db)
299+
300+
bundleLoader := registry.BundleGraphLoader{}
301+
for _, b := range tt.initial {
302+
graph, err := graphLoader.Generate(b.pkg)
303+
if err != nil {
304+
require.EqualError(t, err, registry.ErrPackageNotInDatabase.Error(), "Expected empty error or package not in database")
305+
}
306+
bndl := newRegistryBundle(t, b)
307+
graph, err = bundleLoader.AddBundleToGraph(bndl, graph, &registry.AnnotationsFile{Annotations: *bndl.Annotations}, false)
308+
require.NoError(t, err)
309+
310+
require.NoError(t, store.AddBundleSemver(graph, bndl))
311+
}
312+
313+
err = NewSQLDeprecatorForBundles(store, querier, tt.deprecate).Deprecate()
314+
if tt.expectedError != nil && err != nil {
315+
require.EqualError(t, err, tt.expectedError.Error())
316+
}
317+
var result []*api.Bundle
318+
if err == nil {
319+
result, err = querier.ListBundles(context.TODO())
320+
}
321+
if tt.expectedError != nil {
322+
require.EqualError(t, err, tt.expectedError.Error())
323+
return
324+
}
325+
require.NoError(t, err)
326+
require.ElementsMatch(t, tt.expected, result)
327+
})
328+
}
329+
}

‎pkg/sqlite/load.go

+1-26
Original file line numberDiff line numberDiff line change
@@ -1367,28 +1367,7 @@ func getTailFromBundle(tx *sql.Tx, name string) (bundles []string, err error) {
13671367

13681368
}
13691369

1370-
func getBundleNameAndVersionForImage(tx *sql.Tx, path string) (string, string, error) {
1371-
query := `SELECT name, version FROM operatorbundle WHERE bundlepath=? LIMIT 1`
1372-
rows, err := tx.QueryContext(context.TODO(), query, path)
1373-
if err != nil {
1374-
return "", "", err
1375-
}
1376-
defer rows.Close()
1377-
1378-
var name sql.NullString
1379-
var version sql.NullString
1380-
if rows.Next() {
1381-
if err := rows.Scan(&name, &version); err != nil {
1382-
return "", "", err
1383-
}
1384-
}
1385-
if name.Valid && version.Valid {
1386-
return name.String, version.String, nil
1387-
}
1388-
return "", "", registry.ErrBundleImageNotInDatabase
1389-
}
1390-
1391-
func (s *sqlLoader) DeprecateBundle(path string) error {
1370+
func (s *sqlLoader) DeprecateBundle(name, version, path string) error {
13921371
tx, err := s.db.Begin()
13931372
if err != nil {
13941373
return err
@@ -1403,10 +1382,6 @@ func (s *sqlLoader) DeprecateBundle(path string) error {
14031382
}
14041383
defer nullifyBundleReplaces.Close()
14051384

1406-
name, version, err := getBundleNameAndVersionForImage(tx, path)
1407-
if err != nil {
1408-
return err
1409-
}
14101385
tailBundles, err := getTailFromBundle(tx, name)
14111386
if err != nil {
14121387
return err

‎pkg/sqlite/query.go

+21
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,27 @@ func (s *SQLQuerier) GetBundlePathIfExists(ctx context.Context, bundleName strin
12331233
return
12341234
}
12351235

1236+
func (s *SQLQuerier) GetBundleNameAndVersionForImage(ctx context.Context, path string) (string, string, error) {
1237+
query := `SELECT name, version FROM operatorbundle WHERE bundlepath=? LIMIT 1`
1238+
rows, err := s.db.QueryContext(ctx, query, path)
1239+
if err != nil {
1240+
return "", "", err
1241+
}
1242+
defer rows.Close()
1243+
1244+
var name sql.NullString
1245+
var version sql.NullString
1246+
if rows.Next() {
1247+
if err := rows.Scan(&name, &version); err != nil {
1248+
return "", "", err
1249+
}
1250+
}
1251+
if name.Valid && version.Valid {
1252+
return name.String, version.String, nil
1253+
}
1254+
return "", "", registry.ErrBundleImageNotInDatabase
1255+
}
1256+
12361257
// ListRegistryBundles returns a set of registry bundles.
12371258
// The set can be filtered by package by setting the given context's 'package' key to a desired package name.
12381259
// e.g.

‎vendor/modules.txt

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ github.com/beorn7/perks/quantile
4545
## explicit
4646
github.com/blang/semver
4747
# github.com/blang/semver/v4 v4.0.0
48+
## explicit
4849
github.com/blang/semver/v4
4950
# github.com/bshuster-repo/logrus-logstash-hook v0.4.1
5051
github.com/bshuster-repo/logrus-logstash-hook
@@ -901,6 +902,7 @@ sigs.k8s.io/kind/pkg/log
901902
# sigs.k8s.io/structured-merge-diff/v4 v4.0.3
902903
sigs.k8s.io/structured-merge-diff/v4/value
903904
# sigs.k8s.io/yaml v1.2.0
905+
## explicit
904906
sigs.k8s.io/yaml
905907
# github.com/containerd/containerd => github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5
906908
# github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d

0 commit comments

Comments
 (0)
Please sign in to comment.