From 964bc8afdaaef2183c70a132cc61d34b82b53228 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 7 May 2015 23:51:36 -0400 Subject: [PATCH] Verify namespace is not set on root objects --- pkg/kubectl/resource/builder_test.go | 34 ++++++++++++++++++++++++++++ pkg/kubectl/resource/visitor.go | 3 +++ 2 files changed, 37 insertions(+) diff --git a/pkg/kubectl/resource/builder_test.go b/pkg/kubectl/resource/builder_test.go index 3ca445f5cfe..e74f8fae509 100644 --- a/pkg/kubectl/resource/builder_test.go +++ b/pkg/kubectl/resource/builder_test.go @@ -147,6 +147,15 @@ func streamYAMLTestData() (io.Reader, *api.PodList, *api.ServiceList) { return r, pods, svc } +func streamTestObject(obj runtime.Object) io.Reader { + r, w := io.Pipe() + go func() { + defer w.Close() + w.Write([]byte(runtime.EncodeOrDie(latest.Codec, obj))) + }() + return r +} + type testVisitor struct { InjectErr error Infos []*Info @@ -617,6 +626,31 @@ func TestSingularObject(t *testing.T) { } } +func TestSingularRootScopedObject(t *testing.T) { + node := &api.Node{ObjectMeta: api.ObjectMeta{Name: "test"}, Spec: api.NodeSpec{ExternalID: "test"}} + r := streamTestObject(node) + infos, err := NewBuilder(latest.RESTMapper, api.Scheme, fakeClient()). + NamespaceParam("test").DefaultNamespace(). + Stream(r, "STDIN"). + Flatten(). + Do().Infos() + + if err != nil || len(infos) != 1 { + t.Fatalf("unexpected error: %v", err) + } + + if infos[0].Namespace != "" { + t.Errorf("namespace should be empty: %#v", infos[0]) + } + n, ok := infos[0].Object.(*api.Node) + if !ok { + t.Fatalf("unexpected object: %#v", infos[0].Object) + } + if n.Name != "test" || n.Namespace != "" { + t.Errorf("unexpected object: %#v", n) + } +} + func TestListObject(t *testing.T) { pods, _ := testData() labelKey := api.LabelSelectorQueryParam(testapi.Version()) diff --git a/pkg/kubectl/resource/visitor.go b/pkg/kubectl/resource/visitor.go index dce54c8d156..ceeb9882497 100644 --- a/pkg/kubectl/resource/visitor.go +++ b/pkg/kubectl/resource/visitor.go @@ -474,6 +474,9 @@ func FilterNamespace(info *Info) error { // set. If info.Object is set, it will be mutated as well. func SetNamespace(namespace string) VisitorFunc { return func(info *Info) error { + if !info.Namespaced() { + return nil + } if len(info.Namespace) == 0 { info.Namespace = namespace UpdateObjectNamespace(info)