Skip to content

Commit e7e9c01

Browse files
committed
render: include olm.bundle.object properties in rendered bundle images
Signed-off-by: Joe Lanford <[email protected]>
1 parent c426f78 commit e7e9c01

File tree

4 files changed

+78
-179
lines changed

4 files changed

+78
-179
lines changed

Diff for: alpha/action/render.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ func populateDBRelatedImages(ctx context.Context, cfg *declcfg.DeclarativeConfig
296296
}
297297

298298
func bundleToDeclcfg(bundle *registry.Bundle) (*declcfg.DeclarativeConfig, error) {
299-
bundleProperties, err := registry.PropertiesFromBundle(bundle)
299+
objs, props, err := registry.ObjectsAndPropertiesFromBundle(bundle)
300300
if err != nil {
301301
return nil, fmt.Errorf("get properties for bundle %q: %v", bundle.Name, err)
302302
}
@@ -310,8 +310,9 @@ func bundleToDeclcfg(bundle *registry.Bundle) (*declcfg.DeclarativeConfig, error
310310
Name: bundle.Name,
311311
Package: bundle.Package,
312312
Image: bundle.BundleImage,
313-
Properties: bundleProperties,
313+
Properties: props,
314314
RelatedImages: relatedImages,
315+
Objects: objs,
315316
}
316317

317318
return &declcfg.DeclarativeConfig{Bundles: []declcfg.Bundle{dBundle}}, nil

Diff for: alpha/action/render_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func TestRender(t *testing.T) {
4242
require.NoError(t, err)
4343
foov2crd, err := bundleImageV2.ReadFile("testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml")
4444
require.NoError(t, err)
45+
foov2csvNoRelatedImages, err := bundleImageV2NoCSVRelatedImages.ReadFile("testdata/foo-bundle-v0.2.0-no-csv-related-images/manifests/foo.v0.2.0.csv.yaml")
46+
require.NoError(t, err)
47+
foov2crdNoRelatedImages, err := bundleImageV2NoCSVRelatedImages.ReadFile("testdata/foo-bundle-v0.2.0-no-csv-related-images/manifests/foos.test.foo.crd.yaml")
48+
require.NoError(t, err)
4549

4650
foov1csv, err = yaml.ToJSON(foov1csv)
4751
require.NoError(t, err)
@@ -51,6 +55,10 @@ func TestRender(t *testing.T) {
5155
require.NoError(t, err)
5256
foov2crd, err = yaml.ToJSON(foov2crd)
5357
require.NoError(t, err)
58+
foov2csvNoRelatedImages, err = yaml.ToJSON(foov2csvNoRelatedImages)
59+
require.NoError(t, err)
60+
foov2crdNoRelatedImages, err = yaml.ToJSON(foov2crdNoRelatedImages)
61+
require.NoError(t, err)
5462

5563
dir := t.TempDir()
5664
dbFile := filepath.Join(dir, "index.db")
@@ -445,7 +453,10 @@ func TestRender(t *testing.T) {
445453
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
446454
property.MustBuildPackage("foo", "0.2.0"),
447455
property.MustBuildPackageRequired("bar", "<0.1.0"),
456+
property.MustBuildBundleObjectData(foov2csv),
457+
property.MustBuildBundleObjectData(foov2crd),
448458
},
459+
Objects: []string{string(foov2csv), string(foov2crd)},
449460
RelatedImages: []declcfg.RelatedImage{
450461
{
451462
Image: "test.registry/foo-operator/foo-2:v0.2.0",
@@ -491,7 +502,10 @@ func TestRender(t *testing.T) {
491502
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
492503
property.MustBuildPackage("foo", "0.2.0"),
493504
property.MustBuildPackageRequired("bar", "<0.1.0"),
505+
property.MustBuildBundleObjectData(foov2csvNoRelatedImages),
506+
property.MustBuildBundleObjectData(foov2crdNoRelatedImages),
494507
},
508+
Objects: []string{string(foov2csvNoRelatedImages), string(foov2crdNoRelatedImages)},
495509
RelatedImages: []declcfg.RelatedImage{
496510
{
497511
Image: "test.registry/foo-operator/foo-2:v0.2.0",

Diff for: pkg/registry/registry_to_model.go

+31-135
Original file line numberDiff line numberDiff line change
@@ -4,90 +4,11 @@ import (
44
"encoding/json"
55
"fmt"
66
"sort"
7-
"strings"
87

9-
"github.com/operator-framework/operator-registry/alpha/model"
108
"github.com/operator-framework/operator-registry/alpha/property"
119
)
1210

13-
func ConvertRegistryBundleToModelBundles(b *Bundle) ([]model.Bundle, error) {
14-
var bundles []model.Bundle
15-
desc, err := b.csv.GetDescription()
16-
if err != nil {
17-
return nil, fmt.Errorf("Could not get description from bundle CSV:%s", err)
18-
}
19-
20-
i, err := b.csv.GetIcons()
21-
if err != nil {
22-
return nil, fmt.Errorf("Could not get icon from bundle CSV:%s", err)
23-
}
24-
mIcon := &model.Icon{
25-
MediaType: "",
26-
Data: []byte{},
27-
}
28-
if len(i) > 0 {
29-
mIcon.MediaType = i[0].MediaType
30-
mIcon.Data = []byte(i[0].Base64data)
31-
}
32-
33-
pkg := &model.Package{
34-
Name: b.Annotations.PackageName,
35-
Description: desc,
36-
Icon: mIcon,
37-
Channels: make(map[string]*model.Channel),
38-
}
39-
40-
mb, err := registryBundleToModelBundle(b)
41-
mb.Package = pkg
42-
if err != nil {
43-
return nil, err
44-
}
45-
46-
for _, ch := range extractChannels(b.Annotations.Channels) {
47-
newCh := &model.Channel{
48-
Name: ch,
49-
}
50-
chBundle := mb
51-
chBundle.Channel = newCh
52-
bundles = append(bundles, *chBundle)
53-
}
54-
return bundles, nil
55-
}
56-
57-
func registryBundleToModelBundle(b *Bundle) (*model.Bundle, error) {
58-
bundleProps, err := PropertiesFromBundle(b)
59-
if err != nil {
60-
return nil, fmt.Errorf("error converting properties for internal model: %v", err)
61-
}
62-
63-
csv, err := b.ClusterServiceVersion()
64-
if err != nil {
65-
return nil, fmt.Errorf("Could not get CVS for bundle: %s", err)
66-
}
67-
replaces, err := csv.GetReplaces()
68-
if err != nil {
69-
return nil, fmt.Errorf("Could not get Replaces from CSV for bundle: %s", err)
70-
}
71-
skips, err := csv.GetSkips()
72-
if err != nil {
73-
return nil, fmt.Errorf("Could not get Skips from CSV for bundle: %s", err)
74-
}
75-
relatedImages, err := convertToModelRelatedImages(csv)
76-
if err != nil {
77-
return nil, fmt.Errorf("Could not get Related images from bundle: %v", err)
78-
}
79-
80-
return &model.Bundle{
81-
Name: csv.Name,
82-
Image: b.BundleImage,
83-
Replaces: replaces,
84-
Skips: skips,
85-
Properties: bundleProps,
86-
RelatedImages: relatedImages,
87-
}, nil
88-
}
89-
90-
func PropertiesFromBundle(b *Bundle) ([]property.Property, error) {
11+
func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, error) {
9112
providedGVKs := map[property.GVK]struct{}{}
9213
requiredGVKs := map[property.GVKRequired]struct{}{}
9314

@@ -99,14 +20,14 @@ func PropertiesFromBundle(b *Bundle) ([]property.Property, error) {
9920
case property.TypeGVK:
10021
var v property.GVK
10122
if err := json.Unmarshal(p.Value, &v); err != nil {
102-
return nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
23+
return nil, nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
10324
}
10425
k := property.GVK{Group: v.Group, Kind: v.Kind, Version: v.Version}
10526
providedGVKs[k] = struct{}{}
10627
case property.TypePackage:
10728
var v property.Package
10829
if err := json.Unmarshal(p.Value, &v); err != nil {
109-
return nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
30+
return nil, nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
11031
}
11132
p := property.MustBuildPackage(v.PackageName, v.Version)
11233
packageProvidedProperty = &p
@@ -124,27 +45,27 @@ func PropertiesFromBundle(b *Bundle) ([]property.Property, error) {
12445
case property.TypeGVK:
12546
var v property.GVK
12647
if err := json.Unmarshal(p.Value, &v); err != nil {
127-
return nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
48+
return nil, nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
12849
}
12950
k := property.GVKRequired{Group: v.Group, Kind: v.Kind, Version: v.Version}
13051
requiredGVKs[k] = struct{}{}
13152
case property.TypePackage:
13253
var v property.Package
13354
if err := json.Unmarshal(p.Value, &v); err != nil {
134-
return nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
55+
return nil, nil, property.ParseError{Idx: i, Typ: p.Type, Err: err}
13556
}
13657
packageRequiredProps = append(packageRequiredProps, property.MustBuildPackageRequired(v.PackageName, v.Version))
13758
}
13859
}
13960

14061
version, err := b.Version()
14162
if err != nil {
142-
return nil, fmt.Errorf("get version: %v", err)
63+
return nil, nil, fmt.Errorf("get version: %v", err)
14364
}
14465

14566
providedApis, err := b.ProvidedAPIs()
14667
if err != nil {
147-
return nil, fmt.Errorf("get provided apis: %v", err)
68+
return nil, nil, fmt.Errorf("get provided apis: %v", err)
14869
}
14970

15071
for p := range providedApis {
@@ -155,7 +76,7 @@ func PropertiesFromBundle(b *Bundle) ([]property.Property, error) {
15576
}
15677
requiredApis, err := b.RequiredAPIs()
15778
if err != nil {
158-
return nil, fmt.Errorf("get required apis: %v", err)
79+
return nil, nil, fmt.Errorf("get required apis: %v", err)
15980
}
16081
for p := range requiredApis {
16182
k := property.GVKRequired{Group: p.Group, Kind: p.Kind, Version: p.Version}
@@ -164,67 +85,42 @@ func PropertiesFromBundle(b *Bundle) ([]property.Property, error) {
16485
}
16586
}
16687

167-
var out []property.Property
88+
var (
89+
props []property.Property
90+
objects []string
91+
)
92+
for _, obj := range b.Objects {
93+
objData, err := json.Marshal(obj)
94+
if err != nil {
95+
return nil, nil, fmt.Errorf("marshal object %s/%s (%s) to json: %v", obj.GetName(), obj.GetNamespace(), obj.GroupVersionKind(), err)
96+
}
97+
props = append(props, property.MustBuildBundleObjectData(objData))
98+
objects = append(objects, string(objData))
99+
}
100+
168101
if packageProvidedProperty == nil {
169102
p := property.MustBuildPackage(b.Package, version)
170103
packageProvidedProperty = &p
171104
}
172-
out = append(out, *packageProvidedProperty)
105+
props = append(props, *packageProvidedProperty)
173106

174107
for p := range providedGVKs {
175-
out = append(out, property.MustBuildGVK(p.Group, p.Version, p.Kind))
108+
props = append(props, property.MustBuildGVK(p.Group, p.Version, p.Kind))
176109
}
177110

178111
for p := range requiredGVKs {
179-
out = append(out, property.MustBuildGVKRequired(p.Group, p.Version, p.Kind))
112+
props = append(props, property.MustBuildGVKRequired(p.Group, p.Version, p.Kind))
180113
}
181114

182-
out = append(out, packageRequiredProps...)
183-
out = append(out, otherProps...)
115+
props = append(props, packageRequiredProps...)
116+
props = append(props, otherProps...)
184117

185-
sort.Slice(out, func(i, j int) bool {
186-
if out[i].Type != out[j].Type {
187-
return out[i].Type < out[j].Type
118+
sort.Slice(props, func(i, j int) bool {
119+
if props[i].Type != props[j].Type {
120+
return props[i].Type < props[j].Type
188121
}
189-
return string(out[i].Value) < string(out[j].Value)
122+
return string(props[i].Value) < string(props[j].Value)
190123
})
191124

192-
return out, nil
193-
}
194-
195-
func convertToModelRelatedImages(csv *ClusterServiceVersion) ([]model.RelatedImage, error) {
196-
var objmap map[string]*json.RawMessage
197-
if err := json.Unmarshal(csv.Spec, &objmap); err != nil {
198-
return nil, err
199-
}
200-
201-
rawValue, ok := objmap[relatedImages]
202-
if !ok || rawValue == nil {
203-
return nil, nil
204-
}
205-
206-
type relatedImage struct {
207-
Name string `json:"name"`
208-
Ref string `json:"image"`
209-
}
210-
var relatedImages []relatedImage
211-
if err := json.Unmarshal(*rawValue, &relatedImages); err != nil {
212-
return nil, err
213-
}
214-
mrelatedImages := []model.RelatedImage{}
215-
for _, img := range relatedImages {
216-
mrelatedImages = append(mrelatedImages, model.RelatedImage{Name: img.Name, Image: img.Ref})
217-
}
218-
return mrelatedImages, nil
219-
}
220-
221-
func extractChannels(annotationChannels string) []string {
222-
var channels []string
223-
for _, ch := range strings.Split(annotationChannels, ",") {
224-
c := strings.TrimSpace(ch)
225-
if c != "" {
226-
channels = append(channels, ch)
227-
}
228-
}
229-
return channels
125+
return objects, props, nil
230126
}

0 commit comments

Comments
 (0)