Skip to content

Commit 2ee231b

Browse files
authored
render: improve olm.bundle.object rendering for bundles (#1094)
* render: improve olm.bundle.object rendering for bundles When rendering individual bundles, only generate olm.bundle.object properties for the CSV if there is an image reference for the bundle. Signed-off-by: Joe Lanford <[email protected]> * render: improve olm.bundle.object rendering for sqlite dbs When rendering sqlite-based catalogs, only generate olm.bundle.object properties for the CSV if there is an image reference for the bundle. Signed-off-by: Joe Lanford <[email protected]> * introduce benchmark for declcfg.LoadFS Signed-off-by: Joe Lanford <[email protected]> * concurrent LoadFS Signed-off-by: Joe Lanford <[email protected]> * add olm.csv.metadata property 1. When rendering sqlite DBs and bundle images, generate an "olm.csv.metadata" property instead of a full CSV (so long as there is a bundle image reference associated with the corresponding bundle) 2. When serving the GRPC interface and a full CSV is not present in an "olm.bundle.object" property, generate a CSV from (a) the "olm.csv.metadata" property. Also include the bundle's related images, and the package's icon, if defined. If there is no description in the CSV metadata, also include the package's description in the generated CSV. Signed-off-by: Joe Lanford <[email protected]> * Meta: more correct handling of HTML-unescaping It turns out that straight byte-based replacements of unicode escape characters back to their ascii representations is invalid if the unicode escape character itself is escaped (e.g. "\u003c" => "\\u003c" => "\<"). To solve this, we will instead unmarshal Meta objects to map[string]interface{}, extract the expected Meta fields from the map, and then use a JSON encoder with SetEscapeHTML(false) to re-encode the map back to JSON to be stored in Meta.Blob. Signed-off-by: Joe Lanford <[email protected]> * updated LoadFS benchmark to use csv metadata properties instead of olm.bundle.object properties Signed-off-by: Joe Lanford <[email protected]> --------- Signed-off-by: Joe Lanford <[email protected]>
1 parent 7629c6f commit 2ee231b

File tree

19 files changed

+1038
-222
lines changed

19 files changed

+1038
-222
lines changed

alpha/action/migrate.go

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package action
22

33
import (
4-
"bytes"
54
"context"
65
"fmt"
7-
"io"
86
"io/ioutil"
97
"os"
10-
"path/filepath"
118

129
"github.com/operator-framework/operator-registry/alpha/declcfg"
1310
"github.com/operator-framework/operator-registry/pkg/image"
@@ -17,13 +14,11 @@ type Migrate struct {
1714
CatalogRef string
1815
OutputDir string
1916

20-
WriteFunc WriteFunc
17+
WriteFunc declcfg.WriteFunc
2118
FileExt string
2219
Registry image.Registry
2320
}
2421

25-
type WriteFunc func(config declcfg.DeclarativeConfig, w io.Writer) error
26-
2722
func (m Migrate) Run(ctx context.Context) error {
2823
entries, err := ioutil.ReadDir(m.OutputDir)
2924
if err != nil && !os.IsNotExist(err) {
@@ -52,48 +47,5 @@ func (m Migrate) Run(ctx context.Context) error {
5247
return fmt.Errorf("render catalog image: %w", err)
5348
}
5449

55-
return writeToFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt)
56-
}
57-
58-
func writeToFS(cfg declcfg.DeclarativeConfig, rootDir string, writeFunc WriteFunc, fileExt string) error {
59-
channelsByPackage := map[string][]declcfg.Channel{}
60-
for _, c := range cfg.Channels {
61-
channelsByPackage[c.Package] = append(channelsByPackage[c.Package], c)
62-
}
63-
bundlesByPackage := map[string][]declcfg.Bundle{}
64-
for _, b := range cfg.Bundles {
65-
bundlesByPackage[b.Package] = append(bundlesByPackage[b.Package], b)
66-
}
67-
68-
if err := os.MkdirAll(rootDir, 0777); err != nil {
69-
return err
70-
}
71-
72-
for _, p := range cfg.Packages {
73-
fcfg := declcfg.DeclarativeConfig{
74-
Packages: []declcfg.Package{p},
75-
Channels: channelsByPackage[p.Name],
76-
Bundles: bundlesByPackage[p.Name],
77-
}
78-
pkgDir := filepath.Join(rootDir, p.Name)
79-
if err := os.MkdirAll(pkgDir, 0777); err != nil {
80-
return err
81-
}
82-
filename := filepath.Join(pkgDir, fmt.Sprintf("catalog%s", fileExt))
83-
if err := writeFile(fcfg, filename, writeFunc); err != nil {
84-
return err
85-
}
86-
}
87-
return nil
88-
}
89-
90-
func writeFile(cfg declcfg.DeclarativeConfig, filename string, writeFunc WriteFunc) error {
91-
buf := &bytes.Buffer{}
92-
if err := writeFunc(cfg, buf); err != nil {
93-
return fmt.Errorf("write to buffer for %q: %v", filename, err)
94-
}
95-
if err := ioutil.WriteFile(filename, buf.Bytes(), 0666); err != nil {
96-
return fmt.Errorf("write file %q: %v", filename, err)
97-
}
98-
return nil
50+
return declcfg.WriteFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt)
9951
}

alpha/action/migrate_test.go

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

33
import (
44
"context"
5-
"fmt"
65
"io/fs"
76
"os"
87
"path/filepath"
@@ -111,7 +110,6 @@ func TestMigrate(t *testing.T) {
111110
path := filepath.Join(s.migrate.OutputDir, file)
112111
actualData, err := os.ReadFile(path)
113112
require.NoError(t, err)
114-
fmt.Println(string(actualData))
115113
require.Equal(t, expectedData, string(actualData))
116114
}
117115
})
@@ -212,12 +210,18 @@ properties:
212210
value:
213211
packageName: bar
214212
versionRange: <0.1.0
215-
- type: olm.bundle.object
213+
- type: olm.csv.metadata
216214
value:
217-
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMS4wIn0sIm5hbWUiOiJmb28udjAuMS4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
218-
- type: olm.bundle.object
219-
value:
220-
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
215+
annotations:
216+
olm.skipRange: <0.1.0
217+
apiServiceDefinitions: {}
218+
crdDescriptions:
219+
owned:
220+
- kind: Foo
221+
name: foos.test.foo
222+
version: v1
223+
displayName: Foo Operator
224+
provider: {}
221225
relatedImages:
222226
- image: test.registry/foo-operator/foo-bundle:v0.1.0
223227
name: ""
@@ -247,12 +251,18 @@ properties:
247251
value:
248252
packageName: bar
249253
versionRange: <0.1.0
250-
- type: olm.bundle.object
251-
value:
252-
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19
253-
- type: olm.bundle.object
254+
- type: olm.csv.metadata
254255
value:
255-
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
256+
annotations:
257+
olm.skipRange: <0.2.0
258+
apiServiceDefinitions: {}
259+
crdDescriptions:
260+
owned:
261+
- kind: Foo
262+
name: foos.test.foo
263+
version: v1
264+
displayName: Foo Operator
265+
provider: {}
256266
relatedImages:
257267
- image: test.registry/foo-operator/foo-2:v0.2.0
258268
name: ""
@@ -299,12 +309,15 @@ properties:
299309
value:
300310
packageName: bar
301311
version: 0.1.0
302-
- type: olm.bundle.object
312+
- type: olm.csv.metadata
303313
value:
304-
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhci52MC4xLjAifSwic3BlYyI6eyJjdXN0b21yZXNvdXJjZWRlZmluaXRpb25zIjp7Im93bmVkIjpbeyJncm91cCI6InRlc3QuYmFyIiwia2luZCI6IkJhciIsIm5hbWUiOiJiYXJzLnRlc3QuYmFyIiwidmVyc2lvbiI6InYxYWxwaGExIn1dfSwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Jhci1vcGVyYXRvci9iYXI6djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
305-
- type: olm.bundle.object
306-
value:
307-
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
314+
apiServiceDefinitions: {}
315+
crdDescriptions:
316+
owned:
317+
- kind: Bar
318+
name: bars.test.bar
319+
version: v1alpha1
320+
provider: {}
308321
relatedImages:
309322
- image: test.registry/bar-operator/bar-bundle:v0.1.0
310323
name: ""
@@ -325,12 +338,17 @@ properties:
325338
value:
326339
packageName: bar
327340
version: 0.2.0
328-
- type: olm.bundle.object
329-
value:
330-
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJiYXIudjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmJhciIsImtpbmQiOiJCYXIiLCJuYW1lIjoiYmFycy50ZXN0LmJhciIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sInJlbGF0ZWRJbWFnZXMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9iYXItb3BlcmF0b3IvYmFyOnYwLjIuMCIsIm5hbWUiOiJvcGVyYXRvciJ9XSwic2tpcHMiOlsiYmFyLnYwLjEuMCJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0=
331-
- type: olm.bundle.object
341+
- type: olm.csv.metadata
332342
value:
333-
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
343+
annotations:
344+
olm.skipRange: <0.2.0
345+
apiServiceDefinitions: {}
346+
crdDescriptions:
347+
owned:
348+
- kind: Bar
349+
name: bars.test.bar
350+
version: v1alpha1
351+
provider: {}
334352
relatedImages:
335353
- image: test.registry/bar-operator/bar-bundle:v0.2.0
336354
name: ""

alpha/action/render.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
8282
if err != nil {
8383
return nil, fmt.Errorf("render reference %q: %w", ref, err)
8484
}
85-
renderBundleObjects(cfg)
85+
moveBundleObjectsToEndOfPropertySlices(cfg)
8686

8787
for _, b := range cfg.Bundles {
8888
sort.Slice(b.RelatedImages, func(i, j int) bool {
@@ -304,6 +304,7 @@ func bundleToDeclcfg(bundle *registry.Bundle) (*declcfg.DeclarativeConfig, error
304304
if err != nil {
305305
return nil, fmt.Errorf("get related images for bundle %q: %v", bundle.Name, err)
306306
}
307+
307308
var csvJson []byte
308309
for _, obj := range bundle.Objects {
309310
if obj.GetKind() == "ClusterServiceVersion" {
@@ -376,19 +377,21 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) {
376377
return relatedImages, nil
377378
}
378379

379-
func renderBundleObjects(cfg *declcfg.DeclarativeConfig) {
380+
func moveBundleObjectsToEndOfPropertySlices(cfg *declcfg.DeclarativeConfig) {
380381
for bi, b := range cfg.Bundles {
381-
props := b.Properties[:0]
382+
var (
383+
others []property.Property
384+
objs []property.Property
385+
)
382386
for _, p := range b.Properties {
383-
if p.Type != property.TypeBundleObject {
384-
props = append(props, p)
387+
switch p.Type {
388+
case property.TypeBundleObject, property.TypeCSVMetadata:
389+
objs = append(objs, p)
390+
default:
391+
others = append(others, p)
385392
}
386393
}
387-
388-
for _, obj := range b.Objects {
389-
props = append(props, property.MustBuildBundleObjectData([]byte(obj)))
390-
}
391-
cfg.Bundles[bi].Properties = props
394+
cfg.Bundles[bi].Properties = append(others, objs...)
392395
}
393396
}
394397

alpha/action/render_test.go

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package action_test
22

33
import (
4+
"bytes"
45
"context"
56
"embed"
67
"encoding/json"
78
"errors"
9+
"io"
810
"io/fs"
911
"os"
1012
"path/filepath"
1113
"testing"
1214
"testing/fstest"
1315

16+
"github.com/operator-framework/api/pkg/operators/v1alpha1"
1417
"github.com/stretchr/testify/assert"
1518
"github.com/stretchr/testify/require"
1619
"k8s.io/apimachinery/pkg/util/yaml"
@@ -105,8 +108,7 @@ func TestRender(t *testing.T) {
105108
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
106109
property.MustBuildPackage("foo", "0.1.0"),
107110
property.MustBuildPackageRequired("bar", "<0.1.0"),
108-
property.MustBuildBundleObjectData(foov1csv),
109-
property.MustBuildBundleObjectData(foov1crd),
111+
mustBuildCSVMetadata(bytes.NewReader(foov1csv)),
110112
},
111113
RelatedImages: []declcfg.RelatedImage{
112114
{
@@ -130,8 +132,7 @@ func TestRender(t *testing.T) {
130132
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
131133
property.MustBuildPackage("foo", "0.2.0"),
132134
property.MustBuildPackageRequired("bar", "<0.1.0"),
133-
property.MustBuildBundleObjectData(foov2csv),
134-
property.MustBuildBundleObjectData(foov2crd),
135+
mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
135136
},
136137
RelatedImages: []declcfg.RelatedImage{
137138
{
@@ -197,8 +198,7 @@ func TestRender(t *testing.T) {
197198
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
198199
property.MustBuildPackage("foo", "0.1.0"),
199200
property.MustBuildPackageRequired("bar", "<0.1.0"),
200-
property.MustBuildBundleObjectData(foov1csv),
201-
property.MustBuildBundleObjectData(foov1crd),
201+
mustBuildCSVMetadata(bytes.NewReader(foov1csv)),
202202
},
203203
RelatedImages: []declcfg.RelatedImage{
204204
{
@@ -222,8 +222,7 @@ func TestRender(t *testing.T) {
222222
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
223223
property.MustBuildPackage("foo", "0.2.0"),
224224
property.MustBuildPackageRequired("bar", "<0.1.0"),
225-
property.MustBuildBundleObjectData(foov2csv),
226-
property.MustBuildBundleObjectData(foov2crd),
225+
mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
227226
},
228227
RelatedImages: []declcfg.RelatedImage{
229228
{
@@ -468,8 +467,7 @@ func TestRender(t *testing.T) {
468467
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
469468
property.MustBuildPackage("foo", "0.2.0"),
470469
property.MustBuildPackageRequired("bar", "<0.1.0"),
471-
property.MustBuildBundleObjectData(foov2csv),
472-
property.MustBuildBundleObjectData(foov2crd),
470+
mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
473471
},
474472
Objects: []string{string(foov2csv), string(foov2crd)},
475473
CsvJSON: string(foov2csv),
@@ -518,8 +516,7 @@ func TestRender(t *testing.T) {
518516
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
519517
property.MustBuildPackage("foo", "0.2.0"),
520518
property.MustBuildPackageRequired("bar", "<0.1.0"),
521-
property.MustBuildBundleObjectData(foov2csvNoRelatedImages),
522-
property.MustBuildBundleObjectData(foov2crdNoRelatedImages),
519+
mustBuildCSVMetadata(bytes.NewReader(foov2csvNoRelatedImages)),
523520
},
524521
Objects: []string{string(foov2csvNoRelatedImages), string(foov2crdNoRelatedImages)},
525522
CsvJSON: string(foov2csvNoRelatedImages),
@@ -551,7 +548,17 @@ func TestRender(t *testing.T) {
551548
t.Run(s.name, func(t *testing.T) {
552549
actualCfg, actualErr := s.render.Run(context.Background())
553550
s.assertion(t, actualErr)
554-
require.Equal(t, s.expectCfg, actualCfg)
551+
require.Equal(t, len(s.expectCfg.Packages), len(actualCfg.Packages))
552+
require.Equal(t, s.expectCfg.Packages, actualCfg.Packages)
553+
require.Equal(t, len(s.expectCfg.Channels), len(actualCfg.Channels))
554+
require.Equal(t, s.expectCfg.Channels, actualCfg.Channels)
555+
require.Equal(t, len(s.expectCfg.Bundles), len(actualCfg.Bundles))
556+
for i := range s.expectCfg.Bundles {
557+
actual, expected := actualCfg.Bundles[i], s.expectCfg.Bundles[i]
558+
require.Equal(t, expected, actual, "bundle %d", i)
559+
}
560+
require.Equal(t, len(s.expectCfg.Others), len(actualCfg.Others))
561+
require.Equal(t, s.expectCfg.Others, actualCfg.Others)
555562
})
556563
}
557564
}
@@ -880,3 +887,11 @@ func generateSqliteFile(path string, imageMap map[image.Reference]string) error
880887
}
881888
return nil
882889
}
890+
891+
func mustBuildCSVMetadata(r io.Reader) property.Property {
892+
var csv v1alpha1.ClusterServiceVersion
893+
if err := json.NewDecoder(r).Decode(&csv); err != nil {
894+
panic(err)
895+
}
896+
return property.MustBuildCSVMetadata(csv)
897+
}

0 commit comments

Comments
 (0)