8
8
9
9
"k8s.io/apimachinery/pkg/api/errors"
10
10
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
11
12
"k8s.io/apimachinery/pkg/runtime/schema"
12
13
"k8s.io/apimachinery/pkg/util/json"
13
14
"k8s.io/client-go/dynamic"
@@ -21,6 +22,20 @@ import (
21
22
// InstallPlansTopX is the Maximal number of Install plans by non-unique instances count
22
23
const InstallPlansTopX = 100
23
24
25
+ type collectedPlan struct {
26
+ Namespace string
27
+ Name string
28
+ CSV string
29
+ Count int
30
+ }
31
+
32
+ // InstallPlanAnonymizer implements serialization of top x installplans
33
+ type InstallPlanAnonymizer struct {
34
+ v map [string ]* collectedPlan
35
+ total int
36
+ limit int
37
+ }
38
+
24
39
// GatherInstallPlans collects Top x InstallPlans from all openshift namespaces.
25
40
// Because InstallPlans have unique generated names, it groups them by namespace and the "template"
26
41
// for name generation from field generateName.
@@ -78,11 +93,12 @@ func gatherInstallPlans(ctx context.Context,
78
93
return nil , []error {err }
79
94
}
80
95
jsonMap := u .UnstructuredContent ()
81
- var items []interface {}
82
- err = failEarly (
83
- func () error { return utils .ParseJSONQuery (jsonMap , "metadata.continue?" , & cont ) },
84
- func () error { return utils .ParseJSONQuery (jsonMap , "items" , & items ) },
85
- )
96
+ // continue will not be always present - we can ignore the return bool value
97
+ cont , _ , err = unstructured .NestedString (jsonMap , "metadata" , "continue" )
98
+ if err != nil {
99
+ return nil , []error {err }
100
+ }
101
+ items , err := utils .NestedSliceWrapper (jsonMap , "items" )
86
102
if err != nil {
87
103
return nil , []error {err }
88
104
}
@@ -105,21 +121,21 @@ func gatherInstallPlans(ctx context.Context,
105
121
func collectInstallPlan (recs map [string ]* collectedPlan , item interface {}) []error {
106
122
// Get common prefix
107
123
csv := "[NONE]"
108
- var clusterServiceVersionNames []interface {}
109
- var ns , genName string
110
124
var itemMap map [string ]interface {}
111
125
var ok bool
112
126
if itemMap , ok = item .(map [string ]interface {}); ! ok {
113
127
return []error {fmt .Errorf ("cannot cast item to map %v" , item )}
114
128
}
115
129
116
- err := failEarly (
117
- func () error {
118
- return utils .ParseJSONQuery (itemMap , "spec.clusterServiceVersionNames" , & clusterServiceVersionNames )
119
- },
120
- func () error { return utils .ParseJSONQuery (itemMap , "metadata.namespace" , & ns ) },
121
- func () error { return utils .ParseJSONQuery (itemMap , "metadata.generateName" , & genName ) },
122
- )
130
+ clusterServiceVersionNames , err := utils .NestedSliceWrapper (itemMap , "spec" , "clusterServiceVersionNames" )
131
+ if err != nil {
132
+ return []error {err }
133
+ }
134
+ ns , err := utils .NestedStringWrapper (itemMap , "metadata" , "namespace" )
135
+ if err != nil {
136
+ return []error {err }
137
+ }
138
+ genName , err := utils .NestedStringWrapper (itemMap , "metadata" , "generateName" )
123
139
if err != nil {
124
140
return []error {err }
125
141
}
@@ -138,30 +154,6 @@ func collectInstallPlan(recs map[string]*collectedPlan, item interface{}) []erro
138
154
return nil
139
155
}
140
156
141
- func failEarly (fns ... func () error ) error {
142
- for _ , f := range fns {
143
- err := f ()
144
- if err != nil {
145
- return err
146
- }
147
- }
148
- return nil
149
- }
150
-
151
- type collectedPlan struct {
152
- Namespace string
153
- Name string
154
- CSV string
155
- Count int
156
- }
157
-
158
- // InstallPlanAnonymizer implements serialization of top x installplans
159
- type InstallPlanAnonymizer struct {
160
- v map [string ]* collectedPlan
161
- total int
162
- limit int
163
- }
164
-
165
157
// Marshal implements serialization of InstallPlan
166
158
func (a InstallPlanAnonymizer ) Marshal (_ context.Context ) ([]byte , error ) {
167
159
if a .limit == 0 {
0 commit comments