Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 24 additions & 10 deletions pkg/manifests/bundleloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/yaml"

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

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

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

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

// Reset the reader so we can decode it into a typed object.
if err = resetFile(fileReader); err != nil {
errs = append(errs, err)
continue
}

switch kind := obj.GetKind(); kind {
case "ClusterServiceVersion":
if bundle.CSV != nil {
return nil, fmt.Errorf("invalid bundle: contains multiple CSVs")
}
csv := operatorsv1alpha1.ClusterServiceVersion{}
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
obj.UnstructuredContent(),
&csv)
err := decoder.Decode(&csv)
if err != nil {
return nil, fmt.Errorf("unable to parse CSV %s: %s", f.Name(), err.Error())
}
Expand All @@ -151,18 +157,14 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {
version := obj.GetAPIVersion()
if version == apiextensionsv1beta1.SchemeGroupVersion.String() {
crd := apiextensionsv1beta1.CustomResourceDefinition{}
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
obj.UnstructuredContent(),
&crd)
err := decoder.Decode(&crd)
if err != nil {
return nil, fmt.Errorf("unable to parse CRD %s: %s", f.Name(), err.Error())
}
bundle.V1beta1CRDs = append(bundle.V1beta1CRDs, &crd)
} else if version == apiextensionsv1.SchemeGroupVersion.String() {
crd := apiextensionsv1.CustomResourceDefinition{}
err := runtime.DefaultUnstructuredConverter.FromUnstructured(
obj.UnstructuredContent(),
&crd)
err := decoder.Decode(&crd)
if err != nil {
return nil, fmt.Errorf("unable to parse CRD %s: %s", f.Name(), err.Error())
}
Expand All @@ -175,3 +177,15 @@ func loadBundle(csvName string, dir string) (*Bundle, error) {

return bundle, utilerrors.NewAggregate(errs)
}

// resetFile seeks f to read from 0, assuming it is read-only.
func resetFile(f *os.File) error {
r, err := f.Seek(0, 0)
if err != nil {
return fmt.Errorf("unable to reset file %s: %v", f.Name(), err)
}
if r != 0 {
return fmt.Errorf("unable to reset file %s: seek is %d not 0", f.Name(), r)
}
return nil
}
2 changes: 2 additions & 0 deletions pkg/manifests/packagemanifestloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ func (p *packageManifestLoader) LoadPackagesWalkFunc(path string, f os.FileInfo,
if err != nil {
return fmt.Errorf("unable to load package from file %s: %s", path, err)
}
defer fileReader.Close()

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

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