@@ -10,7 +10,6 @@ import (
10
10
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
11
11
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
12
12
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13
- "k8s.io/apimachinery/pkg/runtime"
14
13
utilerrors "k8s.io/apimachinery/pkg/util/errors"
15
14
"k8s.io/apimachinery/pkg/util/yaml"
16
15
@@ -70,6 +69,7 @@ func (b *bundleLoader) LoadBundleWalkFunc(path string, f os.FileInfo, err error)
70
69
if err != nil {
71
70
return fmt .Errorf ("unable to load file %s: %s" , path , err )
72
71
}
72
+ defer fileReader .Close ()
73
73
74
74
decoder := yaml .NewYAMLOrJSONDecoder (fileReader , 30 )
75
75
csv := unstructured.Unstructured {}
@@ -125,24 +125,30 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
125
125
errs = append (errs , fmt .Errorf ("unable to load file %s: %s" , path , err ))
126
126
continue
127
127
}
128
+ defer fileReader .Close ()
128
129
129
130
decoder := yaml .NewYAMLOrJSONDecoder (fileReader , 30 )
130
131
obj := & unstructured.Unstructured {}
131
132
if err = decoder .Decode (obj ); err != nil {
133
+ errs = append (errs , fmt .Errorf ("unable to decode object: %s" , err ))
132
134
continue
133
135
}
134
136
135
137
bundle .Objects = append (bundle .Objects , obj )
136
138
139
+ // Reset the reader so we can decode it into a typed object.
140
+ if err = resetFile (fileReader ); err != nil {
141
+ errs = append (errs , err )
142
+ continue
143
+ }
144
+
137
145
switch kind := obj .GetKind (); kind {
138
146
case "ClusterServiceVersion" :
139
147
if bundle .CSV != nil {
140
148
return nil , fmt .Errorf ("invalid bundle: contains multiple CSVs" )
141
149
}
142
150
csv := operatorsv1alpha1.ClusterServiceVersion {}
143
- err := runtime .DefaultUnstructuredConverter .FromUnstructured (
144
- obj .UnstructuredContent (),
145
- & csv )
151
+ err := decoder .Decode (& csv )
146
152
if err != nil {
147
153
return nil , fmt .Errorf ("unable to parse CSV %s: %s" , f .Name (), err .Error ())
148
154
}
@@ -151,18 +157,14 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
151
157
version := obj .GetAPIVersion ()
152
158
if version == apiextensionsv1beta1 .SchemeGroupVersion .String () {
153
159
crd := apiextensionsv1beta1.CustomResourceDefinition {}
154
- err := runtime .DefaultUnstructuredConverter .FromUnstructured (
155
- obj .UnstructuredContent (),
156
- & crd )
160
+ err := decoder .Decode (& crd )
157
161
if err != nil {
158
162
return nil , fmt .Errorf ("unable to parse CRD %s: %s" , f .Name (), err .Error ())
159
163
}
160
164
bundle .V1beta1CRDs = append (bundle .V1beta1CRDs , & crd )
161
165
} else if version == apiextensionsv1 .SchemeGroupVersion .String () {
162
166
crd := apiextensionsv1.CustomResourceDefinition {}
163
- err := runtime .DefaultUnstructuredConverter .FromUnstructured (
164
- obj .UnstructuredContent (),
165
- & crd )
167
+ err := decoder .Decode (& crd )
166
168
if err != nil {
167
169
return nil , fmt .Errorf ("unable to parse CRD %s: %s" , f .Name (), err .Error ())
168
170
}
@@ -175,3 +177,15 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
175
177
176
178
return bundle , utilerrors .NewAggregate (errs )
177
179
}
180
+
181
+ // resetFile seeks f to read from 0, assuming it is read-only.
182
+ func resetFile (f * os.File ) error {
183
+ r , err := f .Seek (0 , 0 )
184
+ if err != nil {
185
+ return fmt .Errorf ("unable to reset file %s: %v" , f .Name (), err )
186
+ }
187
+ if r != 0 {
188
+ return fmt .Errorf ("unable to reset file %s: seek is %d not 0" , f .Name (), r )
189
+ }
190
+ return nil
191
+ }
0 commit comments