Skip to content

Commit 6c0f726

Browse files
committed
Decouple manifest reader from cli
1 parent 1c6b5f2 commit 6c0f726

File tree

8 files changed

+105
-10
lines changed

8 files changed

+105
-10
lines changed

cmd/apply/cmdapply.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (r *ApplyRunner) RunE(cmd *cobra.Command, args []string) error {
113113
if err != nil {
114114
return err
115115
}
116-
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), args)
116+
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), flagutils.PathFromArgs(args))
117117
if err != nil {
118118
return err
119119
}

cmd/destroy/cmddestroy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (r *DestroyRunner) RunE(cmd *cobra.Command, args []string) error {
7272
}
7373

7474
// Retrieve the inventory object.
75-
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), args)
75+
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), flagutils.PathFromArgs(args))
7676
if err != nil {
7777
return err
7878
}

cmd/flagutils/utils.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,12 @@ func ConvertInventoryPolicy(policy string) (inventory.InventoryPolicy, error) {
2626
"inventory policy must be one of strict, adopt")
2727
}
2828
}
29+
30+
// PathFromArgs returns the path which is a positional arg from args list
31+
// returns "-" if there is length of args is 0, which implies no path is provided
32+
func PathFromArgs(args []string) string {
33+
if len(args) == 0 {
34+
return "-"
35+
}
36+
return args[0]
37+
}

cmd/preview/cmdpreview.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func (r *PreviewRunner) RunE(cmd *cobra.Command, args []string) error {
103103
return err
104104
}
105105

106-
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), args)
106+
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), flagutils.PathFromArgs(args))
107107
if err != nil {
108108
return err
109109
}

cmd/status/cmdstatus.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/spf13/cobra"
1313
"k8s.io/cli-runtime/pkg/genericclioptions"
1414
cmdutil "k8s.io/kubectl/pkg/cmd/util"
15+
"sigs.k8s.io/cli-utils/cmd/flagutils"
1516
"sigs.k8s.io/cli-utils/cmd/status/printers"
1617
"sigs.k8s.io/cli-utils/pkg/apply/poller"
1718
"sigs.k8s.io/cli-utils/pkg/common"
@@ -77,7 +78,7 @@ func (r *StatusRunner) runE(cmd *cobra.Command, args []string) error {
7778
return err
7879
}
7980

80-
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), args)
81+
reader, err := r.loader.ManifestReader(cmd.InOrStdin(), flagutils.PathFromArgs(args))
8182
if err != nil {
8283
return err
8384
}

pkg/manifestreader/fake-loader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func NewFakeLoader(f util.Factory, objs []object.ObjMetadata) *fakeLoader {
2727
}
2828
}
2929

30-
func (f *fakeLoader) ManifestReader(reader io.Reader, _ []string) (ManifestReader, error) {
30+
func (f *fakeLoader) ManifestReader(reader io.Reader, _ string) (ManifestReader, error) {
3131
mapper, err := f.factory.ToRESTMapper()
3232
if err != nil {
3333
return nil, err

pkg/manifestreader/manifestloader.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
// and parsing the resources and inventory info.
1616
type ManifestLoader interface {
1717
InventoryInfo([]*unstructured.Unstructured) (inventory.InventoryInfo, []*unstructured.Unstructured, error)
18-
ManifestReader(reader io.Reader, args []string) (ManifestReader, error)
18+
ManifestReader(reader io.Reader, path string) (ManifestReader, error)
1919
}
2020

2121
// manifestLoader implements the ManifestLoader interface
@@ -37,7 +37,7 @@ func (f *manifestLoader) InventoryInfo(objs []*unstructured.Unstructured) (inven
3737
return inventory.WrapInventoryInfoObj(invObj), objs, err
3838
}
3939

40-
func (f *manifestLoader) ManifestReader(reader io.Reader, args []string) (ManifestReader, error) {
40+
func (f *manifestLoader) ManifestReader(reader io.Reader, path string) (ManifestReader, error) {
4141
// Fetch the namespace from the configloader. The source of this
4242
// either the namespace flag or the context. If the namespace is provided
4343
// with the flag, enforceNamespace will be true. In this case, it is
@@ -59,18 +59,24 @@ func (f *manifestLoader) ManifestReader(reader io.Reader, args []string) (Manife
5959
EnforceNamespace: enforceNamespace,
6060
}
6161

62+
return mReader(path, reader, readerOptions), nil
63+
}
64+
65+
// mReader returns the ManifestReader based in the input args
66+
func mReader(path string, reader io.Reader, readerOptions ReaderOptions) ManifestReader {
6267
var mReader ManifestReader
63-
if len(args) == 0 {
68+
// Read from stdin if "-" is specified, similar to kubectl
69+
if path == "-" {
6470
mReader = &StreamManifestReader{
6571
ReaderName: "stdin",
6672
Reader: reader,
6773
ReaderOptions: readerOptions,
6874
}
6975
} else {
7076
mReader = &PathManifestReader{
71-
Path: args[0],
77+
Path: path,
7278
ReaderOptions: readerOptions,
7379
}
7480
}
75-
return mReader, nil
81+
return mReader
7682
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright 2020 The Kubernetes Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package manifestreader
5+
6+
import (
7+
"io/ioutil"
8+
"path/filepath"
9+
"strings"
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
14+
)
15+
16+
func TestMReader_Read(t *testing.T) {
17+
testCases := map[string]struct {
18+
manifests map[string]string
19+
namespace string
20+
enforceNamespace bool
21+
validate bool
22+
path string
23+
24+
infosCount int
25+
namespaces []string
26+
}{
27+
"path mReader: namespace should be set if not already present": {
28+
namespace: "foo",
29+
enforceNamespace: true,
30+
path: "${reader-test-dir}",
31+
infosCount: 1,
32+
namespaces: []string{"foo"},
33+
},
34+
"stream mReader: namespace should be set if not already present": {
35+
namespace: "foo",
36+
enforceNamespace: true,
37+
path: "-",
38+
infosCount: 1,
39+
namespaces: []string{"foo"},
40+
},
41+
}
42+
43+
for tn, tc := range testCases {
44+
t.Run(tn, func(t *testing.T) {
45+
tf := cmdtesting.NewTestFactory().WithNamespace("test-ns")
46+
defer tf.Cleanup()
47+
48+
mapper, err := tf.ToRESTMapper()
49+
if !assert.NoError(t, err) {
50+
t.FailNow()
51+
}
52+
53+
dir, err := ioutil.TempDir("", "reader-test")
54+
assert.NoError(t, err)
55+
p := filepath.Join(dir, "dep.yaml")
56+
err = ioutil.WriteFile(p, []byte(depManifest), 0600)
57+
assert.NoError(t, err)
58+
stringReader := strings.NewReader(depManifest)
59+
60+
if tc.path == "${reader-test-dir}" {
61+
tc.path = dir
62+
}
63+
64+
objs, err := mReader(tc.path, stringReader, ReaderOptions{
65+
Mapper: mapper,
66+
Namespace: tc.namespace,
67+
EnforceNamespace: tc.enforceNamespace,
68+
Validate: tc.validate,
69+
}).Read()
70+
71+
assert.NoError(t, err)
72+
assert.Equal(t, len(objs), tc.infosCount)
73+
74+
for i, obj := range objs {
75+
assert.Equal(t, tc.namespaces[i], obj.GetNamespace())
76+
}
77+
})
78+
}
79+
}

0 commit comments

Comments
 (0)