@@ -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