@@ -12,13 +12,13 @@ import (
1212 "time"
1313
1414 "github.com/blang/semver/v4"
15- "github.com/operator-framework/operator-registry/alpha/declcfg"
16- "github.com/operator-framework/operator-registry/alpha/property"
1715 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1816 "k8s.io/apimachinery/pkg/util/duration"
1917 "k8s.io/apimachinery/pkg/util/json"
2018
2119 olmv1 "github.com/operator-framework/operator-controller/api/v1"
20+ "github.com/operator-framework/operator-registry/alpha/declcfg"
21+ "github.com/operator-framework/operator-registry/alpha/property"
2222)
2323
2424func printFormattedExtensions (extensions ... olmv1.ClusterExtension ) {
@@ -70,12 +70,8 @@ func printFormattedCatalogs(catalogs ...olmv1.ClusterCatalog) {
7070}
7171
7272func printFormattedDeclCfg (w io.Writer , catalogDcfg map [string ]* declcfg.DeclarativeConfig , listVersions bool ) {
73+ var printedHeaders bool
7374 tw := tabwriter .NewWriter (w , 3 , 4 , 2 , ' ' , 0 )
74- if listVersions {
75- _ , _ = fmt .Fprint (tw , "PACKAGE\t CATALOG\t PROVIDER\t VERSION\n " )
76- } else {
77- _ , _ = fmt .Fprint (tw , "PACKAGE\t CATALOG\t PROVIDER\t CHANNELS\n " )
78- }
7975 sortedCatalogs := []string {}
8076 for catalogName := range catalogDcfg {
8177 sortedCatalogs = append (sortedCatalogs , catalogName )
@@ -96,37 +92,20 @@ func printFormattedDeclCfg(w io.Writer, catalogDcfg map[string]*declcfg.Declarat
9692 if listVersions {
9793 for _ , b := range dcfg .Bundles {
9894 if pkgProviders [b .Package ] == nil {
99- pkgProviders [b .Package ] = & dcfgPrintMeta {}
100- }
101- if pkgProviders [b .Package ].versions == nil {
102- pkgProviders [b .Package ].versions = []semver.Version {}
103- }
104- for _ , versionProp := range b .Properties {
105- if versionProp .Type == property .TypePackage {
106- var pkgProp property.Package
107- if err := json .Unmarshal (versionProp .Value , & pkgProp ); err == nil && len (pkgProp .Version ) > 0 {
108- if parsedVersion , err := semver .Parse (pkgProp .Version ); err == nil {
109- pkgProviders [b .Package ].versions = append (pkgProviders [b .Package ].versions , parsedVersion )
110- }
111- }
112- continue
113- }
114- if versionProp .Type == property .TypeCSVMetadata {
115- var pkgProp property.CSVMetadata
116- if err := json .Unmarshal (versionProp .Value , & pkgProp ); err == nil && len (pkgProp .Provider .Name ) > 0 {
117- pkgProviders [b .Package ].provider = pkgProp .Provider .Name
118- }
119- continue
95+ pkgProviders [b .Package ] = & dcfgPrintMeta {
96+ versions : []semver.Version {},
97+ provider : getCSVProvider (& b ),
12098 }
12199 }
100+ bundleVersion , err := getBundleVersion (& b )
101+ if err == nil {
102+ pkgProviders [b .Package ].versions = append (pkgProviders [b .Package ].versions , bundleVersion )
103+ }
122104 }
123105 } else {
124106 for _ , c := range dcfg .Channels {
125107 if pkgProviders [c .Package ] == nil {
126- pkgProviders [c .Package ] = & dcfgPrintMeta {}
127- }
128- if pkgProviders [c .Package ].channels == nil {
129- pkgProviders [c .Package ].channels = []string {}
108+ pkgProviders [c .Package ] = & dcfgPrintMeta {channels : []string {}}
130109 }
131110 pkgProviders [c .Package ].channels = append (pkgProviders [c .Package ].channels , c .Name )
132111 }
@@ -138,6 +117,10 @@ func printFormattedDeclCfg(w io.Writer, catalogDcfg map[string]*declcfg.Declarat
138117 return pkgProviders [p .Name ].versions [i ].GT (pkgProviders [p .Name ].versions [j ])
139118 })
140119 for _ , v := range pkgProviders [p .Name ].versions {
120+ if ! printedHeaders {
121+ _ , _ = fmt .Fprint (tw , "PACKAGE\t CATALOG\t PROVIDER\t VERSION\n " )
122+ printedHeaders = true
123+ }
141124 _ , _ = fmt .Fprintf (tw , "%s\t %s\t %s\t %s\n " ,
142125 p .Name ,
143126 catalogName ,
@@ -146,6 +129,10 @@ func printFormattedDeclCfg(w io.Writer, catalogDcfg map[string]*declcfg.Declarat
146129 }
147130 } else {
148131 sort .Strings (pkgProviders [p .Name ].channels )
132+ if ! printedHeaders {
133+ _ , _ = fmt .Fprint (tw , "PACKAGE\t CATALOG\t PROVIDER\t CHANNELS\n " )
134+ printedHeaders = true
135+ }
149136 _ , _ = fmt .Fprintf (tw , "%s\t %s\t %s\t %s\n " ,
150137 p .Name ,
151138 catalogName ,
@@ -154,9 +141,40 @@ func printFormattedDeclCfg(w io.Writer, catalogDcfg map[string]*declcfg.Declarat
154141 }
155142 }
156143 }
144+ if ! printedHeaders {
145+ _ , _ = fmt .Fprint (tw , "No resources found.\n " )
146+ }
157147 _ = tw .Flush ()
158148}
159149
150+ func getBundleVersion (bundle * declcfg.Bundle ) (semver.Version , error ) {
151+ for _ , p := range bundle .Properties {
152+ if p .Type == property .TypePackage {
153+ var pkgProp property.Package
154+ if err := json .Unmarshal (p .Value , & pkgProp ); err == nil && len (pkgProp .Version ) > 0 {
155+ parsedVersion , err := semver .Parse (pkgProp .Version )
156+ if err != nil {
157+ return semver.Version {}, err
158+ }
159+ return parsedVersion , nil
160+ }
161+ }
162+ }
163+ return semver.Version {}, fmt .Errorf ("no version property" )
164+ }
165+
166+ func getCSVProvider (bundle * declcfg.Bundle ) string {
167+ for _ , csvProp := range bundle .Properties {
168+ if csvProp .Type == property .TypeCSVMetadata {
169+ var pkgProp property.CSVMetadata
170+ if err := json .Unmarshal (csvProp .Value , & pkgProp ); err == nil && len (pkgProp .Provider .Name ) > 0 {
171+ return pkgProp .Provider .Name
172+ }
173+ }
174+ }
175+ return ""
176+ }
177+
160178func printDeclCfgJSON (w io.Writer , catalogDcfg map [string ]* declcfg.DeclarativeConfig ) {
161179 for _ , dcfg := range catalogDcfg {
162180 _ = declcfg .WriteJSON (* dcfg , w )
0 commit comments