Skip to content

Commit 5bbad4f

Browse files
authored
Merge pull request kubernetes#77368 from liggitt/handle-status-objects
Require version match to special-case status objects
2 parents 217e08d + dbe6128 commit 5bbad4f

File tree

3 files changed

+97
-5
lines changed

3 files changed

+97
-5
lines changed

staging/src/k8s.io/cli-runtime/pkg/resource/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ go_test(
5151
srcs = [
5252
"builder_test.go",
5353
"helper_test.go",
54+
"scheme_test.go",
5455
"visitor_test.go",
5556
],
5657
data = [
@@ -64,6 +65,7 @@ go_test(
6465
"//staging/src/k8s.io/apimachinery/pkg/api/meta/testrestmapper:go_default_library",
6566
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
6667
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
68+
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library",
6769
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
6870
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
6971
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",

staging/src/k8s.io/cli-runtime/pkg/resource/scheme.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ func (dynamicCodec) Decode(data []byte, gvk *schema.GroupVersionKind, obj runtim
4141
return nil, nil, err
4242
}
4343

44-
if _, ok := obj.(*metav1.Status); !ok && strings.ToLower(gvk.Kind) == "status" {
45-
obj = &metav1.Status{}
46-
err := json.Unmarshal(data, obj)
47-
if err != nil {
48-
return nil, nil, err
44+
if strings.ToLower(gvk.Kind) == "status" && gvk.Version == "v1" && (gvk.Group == "" || gvk.Group == "meta.k8s.io") {
45+
if _, ok := obj.(*metav1.Status); !ok {
46+
obj = &metav1.Status{}
47+
err := json.Unmarshal(data, obj)
48+
if err != nil {
49+
return nil, nil, err
50+
}
4951
}
5052
}
5153

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
Copyright 2019 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package resource
18+
19+
import (
20+
"reflect"
21+
"strings"
22+
"testing"
23+
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
26+
"k8s.io/apimachinery/pkg/runtime"
27+
"k8s.io/apimachinery/pkg/runtime/schema"
28+
)
29+
30+
func TestDynamicCodecDecode(t *testing.T) {
31+
testcases := []struct {
32+
name string
33+
data []byte
34+
gvk *schema.GroupVersionKind
35+
obj runtime.Object
36+
37+
expectErr string
38+
expectGVK *schema.GroupVersionKind
39+
expectObj runtime.Object
40+
}{
41+
{
42+
name: "v1 Status",
43+
data: []byte(`{"apiVersion":"v1","kind":"Status"}`),
44+
expectGVK: &schema.GroupVersionKind{"", "v1", "Status"},
45+
expectObj: &metav1.Status{TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Status"}},
46+
},
47+
{
48+
name: "meta.k8s.io/v1 Status",
49+
data: []byte(`{"apiVersion":"meta.k8s.io/v1","kind":"Status"}`),
50+
expectGVK: &schema.GroupVersionKind{"meta.k8s.io", "v1", "Status"},
51+
expectObj: &metav1.Status{TypeMeta: metav1.TypeMeta{APIVersion: "meta.k8s.io/v1", Kind: "Status"}},
52+
},
53+
{
54+
name: "example.com/v1 Status",
55+
data: []byte(`{"apiVersion":"example.com/v1","kind":"Status"}`),
56+
expectGVK: &schema.GroupVersionKind{"example.com", "v1", "Status"},
57+
expectObj: &unstructured.Unstructured{Object: map[string]interface{}{"apiVersion": "example.com/v1", "kind": "Status"}},
58+
},
59+
{
60+
name: "example.com/v1 Foo",
61+
data: []byte(`{"apiVersion":"example.com/v1","kind":"Foo"}`),
62+
expectGVK: &schema.GroupVersionKind{"example.com", "v1", "Foo"},
63+
expectObj: &unstructured.Unstructured{Object: map[string]interface{}{"apiVersion": "example.com/v1", "kind": "Foo"}},
64+
},
65+
}
66+
67+
for _, test := range testcases {
68+
t.Run(test.name, func(t *testing.T) {
69+
obj, gvk, err := dynamicCodec{}.Decode(test.data, test.gvk, test.obj)
70+
if (err == nil) != (test.expectErr == "") {
71+
t.Fatalf("expected err=%v, got %v", test.expectErr, err)
72+
}
73+
if err != nil && !strings.Contains(err.Error(), test.expectErr) {
74+
t.Fatalf("expected err=%v, got %v", test.expectErr, err)
75+
}
76+
if err != nil {
77+
return
78+
}
79+
80+
if !reflect.DeepEqual(test.expectGVK, gvk) {
81+
t.Errorf("expected\n\tgvk=%#v\ngot\n\t%#v", test.expectGVK, gvk)
82+
}
83+
if !reflect.DeepEqual(test.expectObj, obj) {
84+
t.Errorf("expected\n\t%#v\n\t%#v", test.expectObj, obj)
85+
}
86+
})
87+
}
88+
}

0 commit comments

Comments
 (0)