cli-utils/pkg/manifestreader/manifestloader.go

73 lines
1.9 KiB
Go

// Copyright 2020 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package manifestreader
import (
"io"
"k8s.io/kubectl/pkg/cmd/util"
)
// ManifestLoader is an interface for reading
// and parsing the resources
type ManifestLoader interface {
ManifestReader(reader io.Reader, path string) (ManifestReader, error)
}
// manifestLoader implements the ManifestLoader interface
type manifestLoader struct {
factory util.Factory
}
// NewManifestLoader returns an instance of manifestLoader.
func NewManifestLoader(f util.Factory) ManifestLoader {
return &manifestLoader{
factory: f,
}
}
func (f *manifestLoader) ManifestReader(reader io.Reader, path string) (ManifestReader, error) {
// Fetch the namespace from the configloader. The source of this
// either the namespace flag or the context. If the namespace is provided
// with the flag, enforceNamespace will be true. In this case, it is
// an error if any of the resources in the package has a different
// namespace set.
namespace, enforceNamespace, err := f.factory.ToRawKubeConfigLoader().Namespace()
if err != nil {
return nil, err
}
mapper, err := f.factory.ToRESTMapper()
if err != nil {
return nil, err
}
readerOptions := ReaderOptions{
Mapper: mapper,
Namespace: namespace,
EnforceNamespace: enforceNamespace,
}
return mReader(path, reader, readerOptions), nil
}
// mReader returns the ManifestReader based in the input args
func mReader(path string, reader io.Reader, readerOptions ReaderOptions) ManifestReader {
var mReader ManifestReader
// Read from stdin if "-" is specified, similar to kubectl
if path == "-" {
mReader = &StreamManifestReader{
ReaderName: "stdin",
Reader: reader,
ReaderOptions: readerOptions,
}
} else {
mReader = &PathManifestReader{
Path: path,
ReaderOptions: readerOptions,
}
}
return mReader
}