diff --git a/pkg/loader/factory.go b/pkg/loader/factory.go new file mode 100644 index 000000000..86fc97527 --- /dev/null +++ b/pkg/loader/factory.go @@ -0,0 +1,36 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package loader + +import ( + "fmt" + + "k8s.io/kubectl/pkg/kinflate/util/fs" +) + +func GetLoader(location string) (Loader, error) { + switch { + case isFilePath(location): + return NewFileLoader(fs.MakeRealFS(), location) + default: + return nil, fmt.Errorf("unknown scheme: %v", location) + } +} + +func isFilePath(location string) bool { + return true +} diff --git a/pkg/loader/fake/fakefileloader.go b/pkg/loader/fake/fakefileloader.go new file mode 100644 index 000000000..1df7b2c0b --- /dev/null +++ b/pkg/loader/fake/fakefileloader.go @@ -0,0 +1,36 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fake + +import "k8s.io/kubectl/pkg/loader" + +type fakefileLoader struct { + data []byte + err error +} + +// NewFakeFileLoader returns Loader which always returns byte array and an error. +// Example: case no error: NewFakeFileLoader(yamlBytes, nil) +// Example: case return an error: NewFakeFileLoader(nil, errors.New("forced error")) +// Location parameter is unneeded because we always return data bytes or an error. +func NewFakeFileLoader(content []byte, e error) (loader.Loader, error) { + return &fakefileLoader{data: content, err: e}, nil +} + +func (l *fakefileLoader) Load() ([]byte, error) { + return l.data, l.err +} diff --git a/pkg/loader/fileloader.go b/pkg/loader/fileloader.go new file mode 100644 index 000000000..91ce86b0c --- /dev/null +++ b/pkg/loader/fileloader.go @@ -0,0 +1,35 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package loader + +import ( + "k8s.io/kubectl/pkg/kinflate/util/fs" +) + +type fileLoader struct { + fs fs.FileSystem + + path string +} + +func NewFileLoader(fs fs.FileSystem, path string) (Loader, error) { + return &fileLoader{fs: fs, path: path}, nil +} + +func (l *fileLoader) Load() ([]byte, error) { + return l.fs.ReadFile(l.path) +} diff --git a/pkg/loader/fileloader_test.go b/pkg/loader/fileloader_test.go new file mode 100644 index 000000000..2461e3e76 --- /dev/null +++ b/pkg/loader/fileloader_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package loader + +import ( + "reflect" + "testing" + + "k8s.io/kubectl/pkg/kinflate/util/fs" +) + +func TestFileLoaderHappyPath(t *testing.T) { + fakefs := fs.MakeFakeFS() + location := "foo" + content := []byte("bar") + fakefs.WriteFile(location, content) + l, err := NewFileLoader(fakefs, location) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + b, err := l.Load() + if err != nil { + t.Fatalf("unexpected error in Load: %v", err) + } + if !reflect.DeepEqual(b, content) { + t.Fatalf("expected %s, but got %s", content, b) + } +} + +func TestFileLoaderFileNotFound(t *testing.T) { + fakefs := fs.MakeFakeFS() + l, err := NewFileLoader(fakefs, "path/does/not/exist") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + _, err = l.Load() + if err == nil { + t.Fatal("expected error in Load, but no error returned") + } +} diff --git a/pkg/loader/loader.go b/pkg/loader/loader.go new file mode 100644 index 000000000..d6f2fd3cf --- /dev/null +++ b/pkg/loader/loader.go @@ -0,0 +1,21 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package loader + +type Loader interface { + Load() ([]byte, error) +}