Skip to content

Commit 413e581

Browse files
authored
Merge pull request #37 from estroz/bugfix/number-conversion
pkg/manifests: use yaml decoder to avoid conversion errors
2 parents 197407c + ba3e236 commit 413e581

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

pkg/manifests/bundleloader.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1111
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
1212
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13-
"k8s.io/apimachinery/pkg/runtime"
1413
utilerrors "k8s.io/apimachinery/pkg/util/errors"
1514
"k8s.io/apimachinery/pkg/util/yaml"
1615

@@ -70,6 +69,7 @@ func (b *bundleLoader) LoadBundleWalkFunc(path string, f os.FileInfo, err error)
7069
if err != nil {
7170
return fmt.Errorf("unable to load file %s: %s", path, err)
7271
}
72+
defer fileReader.Close()
7373

7474
decoder := yaml.NewYAMLOrJSONDecoder(fileReader, 30)
7575
csv := unstructured.Unstructured{}
@@ -125,24 +125,30 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
125125
errs = append(errs, fmt.Errorf("unable to load file %s: %s", path, err))
126126
continue
127127
}
128+
defer fileReader.Close()
128129

129130
decoder := yaml.NewYAMLOrJSONDecoder(fileReader, 30)
130131
obj := &unstructured.Unstructured{}
131132
if err = decoder.Decode(obj); err != nil {
133+
errs = append(errs, fmt.Errorf("unable to decode object: %s", err))
132134
continue
133135
}
134136

135137
bundle.Objects = append(bundle.Objects, obj)
136138

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+
137145
switch kind := obj.GetKind(); kind {
138146
case "ClusterServiceVersion":
139147
if bundle.CSV != nil {
140148
return nil, fmt.Errorf("invalid bundle: contains multiple CSVs")
141149
}
142150
csv := operatorsv1alpha1.ClusterServiceVersion{}
143-
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
144-
obj.UnstructuredContent(),
145-
&csv)
151+
err := decoder.Decode(&csv)
146152
if err != nil {
147153
return nil, fmt.Errorf("unable to parse CSV %s: %s", f.Name(), err.Error())
148154
}
@@ -151,18 +157,14 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
151157
version := obj.GetAPIVersion()
152158
if version == apiextensionsv1beta1.SchemeGroupVersion.String() {
153159
crd := apiextensionsv1beta1.CustomResourceDefinition{}
154-
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
155-
obj.UnstructuredContent(),
156-
&crd)
160+
err := decoder.Decode(&crd)
157161
if err != nil {
158162
return nil, fmt.Errorf("unable to parse CRD %s: %s", f.Name(), err.Error())
159163
}
160164
bundle.V1beta1CRDs = append(bundle.V1beta1CRDs, &crd)
161165
} else if version == apiextensionsv1.SchemeGroupVersion.String() {
162166
crd := apiextensionsv1.CustomResourceDefinition{}
163-
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
164-
obj.UnstructuredContent(),
165-
&crd)
167+
err := decoder.Decode(&crd)
166168
if err != nil {
167169
return nil, fmt.Errorf("unable to parse CRD %s: %s", f.Name(), err.Error())
168170
}
@@ -175,3 +177,15 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
175177

176178
return bundle, utilerrors.NewAggregate(errs)
177179
}
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+
}

pkg/manifests/packagemanifestloader.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func (p *packageManifestLoader) LoadPackagesWalkFunc(path string, f os.FileInfo,
6161
if err != nil {
6262
return fmt.Errorf("unable to load package from file %s: %s", path, err)
6363
}
64+
defer fileReader.Close()
6465

6566
decoder := yaml.NewYAMLOrJSONDecoder(fileReader, 30)
6667
manifest := PackageManifest{}
@@ -103,6 +104,7 @@ func (p *packageManifestLoader) LoadBundleWalkFunc(path string, f os.FileInfo, e
103104
if err != nil {
104105
return fmt.Errorf("unable to load file %s: %s", path, err)
105106
}
107+
defer fileReader.Close()
106108

107109
decoder := yaml.NewYAMLOrJSONDecoder(fileReader, 30)
108110
csv := unstructured.Unstructured{}

0 commit comments

Comments
 (0)