diff --git a/alpha/action/render.go b/alpha/action/render.go index 52363d004..a4a09ba4e 100644 --- a/alpha/action/render.go +++ b/alpha/action/render.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sort" "strings" "sync" @@ -76,6 +77,13 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { return nil, fmt.Errorf("render reference %q: %w", ref, err) } renderBundleObjects(cfg) + + for _, b := range cfg.Bundles { + sort.Slice(b.RelatedImages, func(i, j int) bool { + return b.RelatedImages[i].Image < b.RelatedImages[j].Image + }) + } + cfgs = append(cfgs, *cfg) } @@ -233,6 +241,7 @@ func sqliteToDeclcfg(ctx context.Context, dbFile string) (*declcfg.DeclarativeCo if err := populateDBRelatedImages(ctx, &cfg, db); err != nil { return nil, err } + return &cfg, nil } @@ -322,6 +331,33 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) { if err = json.Unmarshal(*rawValue, &relatedImages); err != nil { return nil, err } + + // Keep track of the images we've already found, so that we don't add + // them multiple times. + allImages := sets.NewString() + for _, ri := range relatedImages { + allImages = allImages.Insert(ri.Image) + } + + if !allImages.Has(b.BundleImage) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: b.BundleImage, + }) + } + + opImages, err := csv.GetOperatorImages() + if err != nil { + return nil, err + } + for img := range opImages { + if !allImages.Has(img) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: img, + }) + } + allImages = allImages.Insert(img) + } + return relatedImages, nil } diff --git a/alpha/action/render_test.go b/alpha/action/render_test.go index ef4719825..ac3511a51 100644 --- a/alpha/action/render_test.go +++ b/alpha/action/render_test.go @@ -94,11 +94,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -124,12 +124,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + 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)}, @@ -171,11 +184,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -201,12 +214,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + 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)}, @@ -247,11 +273,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -277,12 +303,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + 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)}, @@ -323,11 +362,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -353,12 +392,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + 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)}, @@ -392,6 +444,22 @@ func TestRender(t *testing.T) { property.MustBuildSkips("foo.v0.1.2"), }, 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", diff --git a/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml b/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml index d7e30bee0..823f91c0f 100644 --- a/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml +++ b/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml @@ -18,6 +18,28 @@ spec: skips: - foo.v0.1.1 - foo.v0.1.2 + install: + strategy: deployment + spec: + deployments: + - name: foo-operator + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init:v0.2.0 + containers: + - image: test.registry/foo-operator/foo:v0.2.0 + - name: foo-operator-2 + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + containers: + - image: test.registry/foo-operator/foo-2:v0.2.0 relatedImages: - name: operator image: test.registry/foo-operator/foo:v0.2.0 + - name: other + image: test.registry/foo-operator/foo-other:v0.2.0 diff --git a/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml b/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml index e42e746b2..50c028e4c 100644 --- a/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml +++ b/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml @@ -81,11 +81,16 @@ properties: value: foo.v0.1.2 - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMi4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJyZXBsYWNlcyI6ImZvby52MC4xLjAiLCJza2lwcyI6WyJmb28udjAuMS4xIiwiZm9vLnYwLjEuMiJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0= + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19 - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19 relatedImages: + - image: test.registry/foo-operator/foo-2:v0.2.0 + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + - image: test.registry/foo-operator/foo-init:v0.2.0 + - image: test.registry/foo-operator/foo-bundle:v0.2.0 + - image: test.registry/foo-operator/foo-other:v0.2.0 + name: other - image: test.registry/foo-operator/foo:v0.2.0 name: operator - - image: test.registry/foo-operator/foo-bundle:v0.2.0