Skip to content

Commit f08f6c4

Browse files
grokspawnjoelanford
andcommitted
add optional schema migrations; default to olm.bundle.object instead of olm.csv.metadata (#1384)
* Allow disabling of migrations for bundles and sqlite DBs Signed-off-by: Joe Lanford <[email protected]> * intro new migrations package Signed-off-by: Joe Lanford <[email protected]> * schema migration optional; default to olm.bundle.object Signed-off-by: Jordan Keister <[email protected]> * review resolutions Signed-off-by: Jordan Keister <[email protected]> * use a type to protect migration interactions Signed-off-by: Jordan Keister <[email protected]> * review revisions Signed-off-by: Jordan Keister <[email protected]> --------- Signed-off-by: Joe Lanford <[email protected]> Signed-off-by: Jordan Keister <[email protected]> Co-authored-by: Joe Lanford <[email protected]> Upstream-repository: operator-registry Upstream-commit: c80e8751e716c069017b55279a0f29d0254d426a Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 8cb2bb1 commit f08f6c4

File tree

37 files changed

+1386
-175
lines changed

37 files changed

+1386
-175
lines changed

staging/operator-registry/alpha/action/migrate.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import (
66
"io/ioutil"
77
"os"
88

9+
"github.com/operator-framework/operator-registry/alpha/action/migrations"
910
"github.com/operator-framework/operator-registry/alpha/declcfg"
1011
"github.com/operator-framework/operator-registry/pkg/image"
1112
)
1213

1314
type Migrate struct {
1415
CatalogRef string
1516
OutputDir string
17+
Migrations *migrations.Migrations
1618

1719
WriteFunc declcfg.WriteFunc
1820
FileExt string
@@ -29,7 +31,8 @@ func (m Migrate) Run(ctx context.Context) error {
2931
}
3032

3133
r := Render{
32-
Refs: []string{m.CatalogRef},
34+
Refs: []string{m.CatalogRef},
35+
Migrations: m.Migrations,
3336

3437
// Only allow sqlite images and files to be migrated. Other types cannot
3538
// always be migrated cleanly because they may contain file references.

staging/operator-registry/alpha/action/migrate_test.go

Lines changed: 163 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ func TestMigrate(t *testing.T) {
3131
image.SimpleReference("test.registry/bar-operator/bar-bundle:v0.2.0"): "testdata/bar-bundle-v0.2.0",
3232
}
3333

34-
tmpDir := t.TempDir()
35-
dbFile := filepath.Join(tmpDir, "index.db")
34+
sqliteDBDir := t.TempDir()
35+
dbFile := filepath.Join(sqliteDBDir, "index.db")
3636
err := generateSqliteFile(dbFile, sqliteBundles)
3737
require.NoError(t, err)
3838

@@ -44,7 +44,6 @@ func TestMigrate(t *testing.T) {
4444
name: "SqliteImage/Success",
4545
migrate: action.Migrate{
4646
CatalogRef: "test.registry/migrate/catalog:sqlite",
47-
OutputDir: filepath.Join(tmpDir, "sqlite-image"),
4847
WriteFunc: declcfg.WriteYAML,
4948
FileExt: ".yaml",
5049
Registry: reg,
@@ -58,7 +57,6 @@ func TestMigrate(t *testing.T) {
5857
name: "SqliteFile/Success",
5958
migrate: action.Migrate{
6059
CatalogRef: dbFile,
61-
OutputDir: filepath.Join(tmpDir, "sqlite-file"),
6260
WriteFunc: declcfg.WriteYAML,
6361
FileExt: ".yaml",
6462
Registry: reg,
@@ -72,7 +70,6 @@ func TestMigrate(t *testing.T) {
7270
name: "DeclcfgImage/Failure",
7371
migrate: action.Migrate{
7472
CatalogRef: "test.registry/foo-operator/foo-index-declcfg:v0.2.0",
75-
OutputDir: filepath.Join(tmpDir, "declcfg-image"),
7673
WriteFunc: declcfg.WriteYAML,
7774
FileExt: ".yaml",
7875
Registry: reg,
@@ -83,7 +80,6 @@ func TestMigrate(t *testing.T) {
8380
name: "DeclcfgDir/Failure",
8481
migrate: action.Migrate{
8582
CatalogRef: "testdata/foo-index-v0.2.0-declcfg",
86-
OutputDir: filepath.Join(tmpDir, "declcfg-dir"),
8783
WriteFunc: declcfg.WriteYAML,
8884
FileExt: ".yaml",
8985
Registry: reg,
@@ -94,16 +90,31 @@ func TestMigrate(t *testing.T) {
9490
name: "BundleImage/Failure",
9591
migrate: action.Migrate{
9692
CatalogRef: "test.registry/foo-operator/foo-bundle:v0.1.0",
97-
OutputDir: filepath.Join(tmpDir, "bundle-image"),
9893
WriteFunc: declcfg.WriteYAML,
9994
FileExt: ".yaml",
10095
Registry: reg,
10196
},
10297
expectErr: action.ErrNotAllowed,
10398
},
99+
{
100+
name: "SqliteImage/Success/NoMigrations",
101+
migrate: action.Migrate{
102+
CatalogRef: "test.registry/migrate/catalog:sqlite",
103+
WriteFunc: declcfg.WriteYAML,
104+
FileExt: ".yaml",
105+
Registry: reg,
106+
Migrations: nil,
107+
},
108+
expectedFiles: map[string]string{
109+
"foo/catalog.yaml": migrateFooCatalog(),
110+
"bar/catalog.yaml": migrateBarCatalog(),
111+
},
112+
},
104113
}
105114
for _, s := range specs {
106115
t.Run(s.name, func(t *testing.T) {
116+
s.migrate.OutputDir = t.TempDir()
117+
107118
err := s.migrate.Run(context.Background())
108119
require.ErrorIs(t, err, s.expectErr)
109120
for file, expectedData := range s.expectedFiles {
@@ -210,18 +221,12 @@ properties:
210221
value:
211222
packageName: bar
212223
versionRange: <0.1.0
213-
- type: olm.csv.metadata
214-
value:
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: {}
224+
- type: olm.bundle.object
225+
value:
226+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
227+
- type: olm.bundle.object
228+
value:
229+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMS4wIn0sIm5hbWUiOiJmb28udjAuMS4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
225230
relatedImages:
226231
- image: test.registry/foo-operator/foo-bundle:v0.1.0
227232
name: ""
@@ -251,18 +256,12 @@ properties:
251256
value:
252257
packageName: bar
253258
versionRange: <0.1.0
254-
- type: olm.csv.metadata
255-
value:
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: {}
259+
- type: olm.bundle.object
260+
value:
261+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
262+
- type: olm.bundle.object
263+
value:
264+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19
266265
relatedImages:
267266
- image: test.registry/foo-operator/foo-2:v0.2.0
268267
name: ""
@@ -278,6 +277,7 @@ relatedImages:
278277
name: operator
279278
schema: olm.bundle
280279
`
280+
281281
}
282282

283283
func migrateBarCatalog() string {
@@ -309,15 +309,12 @@ properties:
309309
value:
310310
packageName: bar
311311
version: 0.1.0
312-
- type: olm.csv.metadata
313-
value:
314-
apiServiceDefinitions: {}
315-
crdDescriptions:
316-
owned:
317-
- kind: Bar
318-
name: bars.test.bar
319-
version: v1alpha1
320-
provider: {}
312+
- type: olm.bundle.object
313+
value:
314+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
315+
- type: olm.bundle.object
316+
value:
317+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhci52MC4xLjAifSwic3BlYyI6eyJjdXN0b21yZXNvdXJjZWRlZmluaXRpb25zIjp7Im93bmVkIjpbeyJncm91cCI6InRlc3QuYmFyIiwia2luZCI6IkJhciIsIm5hbWUiOiJiYXJzLnRlc3QuYmFyIiwidmVyc2lvbiI6InYxYWxwaGExIn1dfSwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Jhci1vcGVyYXRvci9iYXI6djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
321318
relatedImages:
322319
- image: test.registry/bar-operator/bar-bundle:v0.1.0
323320
name: ""
@@ -338,17 +335,12 @@ properties:
338335
value:
339336
packageName: bar
340337
version: 0.2.0
341-
- type: olm.csv.metadata
342-
value:
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: {}
338+
- type: olm.bundle.object
339+
value:
340+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
341+
- type: olm.bundle.object
342+
value:
343+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJiYXIudjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmJhciIsImtpbmQiOiJCYXIiLCJuYW1lIjoiYmFycy50ZXN0LmJhciIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sInJlbGF0ZWRJbWFnZXMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9iYXItb3BlcmF0b3IvYmFyOnYwLjIuMCIsIm5hbWUiOiJvcGVyYXRvciJ9XSwic2tpcHMiOlsiYmFyLnYwLjEuMCJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0=
352344
relatedImages:
353345
- image: test.registry/bar-operator/bar-bundle:v0.2.0
354346
name: ""
@@ -357,3 +349,123 @@ relatedImages:
357349
schema: olm.bundle
358350
`
359351
}
352+
353+
func migrateFooCatalogFBC() string {
354+
return `---
355+
defaultChannel: beta
356+
name: foo
357+
properties:
358+
- type: owner
359+
value:
360+
group: abc.com
361+
name: admin
362+
schema: olm.package
363+
---
364+
entries:
365+
- name: foo.v0.1.0
366+
skipRange: <0.1.0
367+
- name: foo.v0.2.0
368+
replaces: foo.v0.1.0
369+
skipRange: <0.2.0
370+
skips:
371+
- foo.v0.1.1
372+
- foo.v0.1.2
373+
name: beta
374+
package: foo
375+
properties:
376+
- type: user
377+
value:
378+
group: xyz.com
379+
name: account
380+
schema: olm.channel
381+
---
382+
entries:
383+
- name: foo.v0.2.0
384+
replaces: foo.v0.1.0
385+
skipRange: <0.2.0
386+
skips:
387+
- foo.v0.1.1
388+
- foo.v0.1.2
389+
name: stable
390+
package: foo
391+
schema: olm.channel
392+
---
393+
image: test.registry/foo-operator/foo-bundle:v0.1.0
394+
name: foo.v0.1.0
395+
package: foo
396+
properties:
397+
- type: olm.gvk
398+
value:
399+
group: test.foo
400+
kind: Foo
401+
version: v1
402+
- type: olm.gvk.required
403+
value:
404+
group: test.bar
405+
kind: Bar
406+
version: v1alpha1
407+
- type: olm.package
408+
value:
409+
packageName: foo
410+
version: 0.1.0
411+
- type: olm.package.required
412+
value:
413+
packageName: bar
414+
versionRange: <0.1.0
415+
- type: olm.bundle.object
416+
value:
417+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMS4wIn0sIm5hbWUiOiJmb28udjAuMS4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
418+
- type: olm.bundle.object
419+
value:
420+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
421+
relatedImages:
422+
- image: test.registry/foo-operator/foo-bundle:v0.1.0
423+
name: ""
424+
- image: test.registry/foo-operator/foo:v0.1.0
425+
name: operator
426+
schema: olm.bundle
427+
---
428+
image: test.registry/foo-operator/foo-bundle:v0.2.0
429+
name: foo.v0.2.0
430+
package: foo
431+
properties:
432+
- type: olm.gvk
433+
value:
434+
group: test.foo
435+
kind: Foo
436+
version: v1
437+
- type: olm.gvk.required
438+
value:
439+
group: test.bar
440+
kind: Bar
441+
version: v1alpha1
442+
- type: olm.package
443+
value:
444+
packageName: foo
445+
version: 0.2.0
446+
- type: olm.package.required
447+
value:
448+
packageName: bar
449+
versionRange: <0.1.0
450+
- type: olm.bundle.object
451+
value:
452+
data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19
453+
- type: olm.bundle.object
454+
value:
455+
data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
456+
relatedImages:
457+
- image: test.registry/foo-operator/foo-2:v0.2.0
458+
name: ""
459+
- image: test.registry/foo-operator/foo-bundle:v0.2.0
460+
name: ""
461+
- image: test.registry/foo-operator/foo-init-2:v0.2.0
462+
name: ""
463+
- image: test.registry/foo-operator/foo-init:v0.2.0
464+
name: ""
465+
- image: test.registry/foo-operator/foo-other:v0.2.0
466+
name: other
467+
- image: test.registry/foo-operator/foo:v0.2.0
468+
name: operator
469+
schema: olm.bundle
470+
`
471+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package migrations
2+
3+
import (
4+
"encoding/json"
5+
6+
"github.com/operator-framework/api/pkg/operators/v1alpha1"
7+
8+
"github.com/operator-framework/operator-registry/alpha/declcfg"
9+
"github.com/operator-framework/operator-registry/alpha/property"
10+
)
11+
12+
func bundleObjectToCSVMetadata(cfg *declcfg.DeclarativeConfig) error {
13+
convertBundleObjectToCSVMetadata := func(b *declcfg.Bundle) error {
14+
if b.Image == "" || b.CsvJSON == "" {
15+
return nil
16+
}
17+
18+
var csv v1alpha1.ClusterServiceVersion
19+
if err := json.Unmarshal([]byte(b.CsvJSON), &csv); err != nil {
20+
return err
21+
}
22+
23+
props := b.Properties[:0]
24+
for _, p := range b.Properties {
25+
switch p.Type {
26+
case property.TypeBundleObject:
27+
// Get rid of the bundle objects
28+
case property.TypeCSVMetadata:
29+
// If this bundle already has a CSV metadata
30+
// property, we won't mutate the bundle at all.
31+
return nil
32+
default:
33+
// Keep all of the other properties
34+
props = append(props, p)
35+
}
36+
}
37+
b.Properties = append(props, property.MustBuildCSVMetadata(csv))
38+
return nil
39+
}
40+
41+
for bi := range cfg.Bundles {
42+
if err := convertBundleObjectToCSVMetadata(&cfg.Bundles[bi]); err != nil {
43+
return err
44+
}
45+
}
46+
return nil
47+
}

0 commit comments

Comments
 (0)