1
16
17 package runtime
18
19 import (
20 "reflect"
21 "testing"
22
23 "github.com/google/go-cmp/cmp"
24 "k8s.io/apimachinery/pkg/runtime/schema"
25 )
26
27 func TestResourceMapper(t *testing.T) {
28 gvr := func(g, v, r string) schema.GroupVersionResource {
29 return schema.GroupVersionResource{Group: g, Version: v, Resource: r}
30 }
31
32 gvk := func(g, v, k string) schema.GroupVersionKind {
33 return schema.GroupVersionKind{Group: g, Version: v, Kind: k}
34 }
35
36 kindsToRegister := []struct {
37 gvr schema.GroupVersionResource
38 subresource string
39 gvk schema.GroupVersionKind
40 }{
41
42 {gvr("", "v1", "pods"), "", gvk("", "v1", "Pod")},
43
44 {gvr("", "v1", "pods"), "status", gvk("", "v1", "Pod")},
45
46 {gvr("apps", "v1", "deployments"), "", gvk("apps", "v1", "Deployment")},
47 {gvr("apps", "v1beta1", "deployments"), "", gvk("apps", "v1beta1", "Deployment")},
48 {gvr("apps", "v1alpha1", "deployments"), "", gvk("apps", "v1alpha1", "Deployment")},
49 {gvr("extensions", "v1beta1", "deployments"), "", gvk("extensions", "v1beta1", "Deployment")},
50
51 {gvr("apps", "v1", "deployments"), "scale", gvk("", "", "Scale")},
52 {gvr("apps", "v1beta1", "deployments"), "scale", gvk("", "", "Scale")},
53 {gvr("extensions", "v1beta1", "deployments"), "scale", gvk("", "", "Scale")},
54
55 {gvr("apps", "v1", "deployments"), "status", gvk("apps", "v1", "Deployment")},
56 {gvr("apps", "v1beta1", "deployments"), "status", gvk("apps", "v1beta1", "Deployment")},
57 {gvr("extensions", "v1beta1", "deployments"), "status", gvk("extensions", "v1beta1", "Deployment")},
58 }
59
60 testcases := []struct {
61 Name string
62 IdentityFunc func(schema.GroupResource) string
63 ResourcesForV1Deployment []schema.GroupVersionResource
64 ResourcesForV1DeploymentScale []schema.GroupVersionResource
65 ResourcesForV1DeploymentStatus []schema.GroupVersionResource
66 }{
67 {
68 Name: "no identityfunc",
69 ResourcesForV1Deployment: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("apps", "v1alpha1", "deployments")},
70 ResourcesForV1DeploymentScale: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments")},
71 ResourcesForV1DeploymentStatus: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments")},
72 },
73 {
74 Name: "empty identityfunc",
75 IdentityFunc: func(schema.GroupResource) string { return "" },
76
77 ResourcesForV1Deployment: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("apps", "v1alpha1", "deployments")},
78 ResourcesForV1DeploymentScale: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments")},
79 ResourcesForV1DeploymentStatus: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments")},
80 },
81 {
82 Name: "common identityfunc",
83 IdentityFunc: func(schema.GroupResource) string { return "x" },
84
85 ResourcesForV1Deployment: []schema.GroupVersionResource{gvr("", "v1", "pods"), gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("apps", "v1alpha1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
86
87 ResourcesForV1DeploymentScale: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
88
89 ResourcesForV1DeploymentStatus: []schema.GroupVersionResource{gvr("", "v1", "pods"), gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
90 },
91 {
92 Name: "colocated deployments",
93 IdentityFunc: func(resource schema.GroupResource) string {
94 if resource.Resource == "deployments" {
95 return "deployments"
96 }
97 return ""
98 },
99
100 ResourcesForV1Deployment: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("apps", "v1alpha1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
101
102 ResourcesForV1DeploymentScale: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
103
104 ResourcesForV1DeploymentStatus: []schema.GroupVersionResource{gvr("apps", "v1", "deployments"), gvr("apps", "v1beta1", "deployments"), gvr("extensions", "v1beta1", "deployments")},
105 },
106 }
107
108 for _, tc := range testcases {
109 t.Run(tc.Name, func(t *testing.T) {
110 mapper := NewEquivalentResourceRegistryWithIdentity(tc.IdentityFunc)
111
112
113 for _, data := range kindsToRegister {
114 mapper.RegisterKindFor(data.gvr, data.subresource, data.gvk)
115 }
116
117 for _, data := range kindsToRegister {
118 if kind := mapper.KindFor(data.gvr, data.subresource); kind != data.gvk {
119 t.Errorf("KindFor(%#v, %v) returned %#v, expected %#v", data.gvr, data.subresource, kind, data.gvk)
120 }
121 }
122
123
124 if resources := mapper.EquivalentResourcesFor(gvr("apps", "v1", "deployments"), ""); !reflect.DeepEqual(resources, tc.ResourcesForV1Deployment) {
125 t.Errorf("diff:\n%s", cmp.Diff(tc.ResourcesForV1Deployment, resources))
126 }
127
128 if resources := mapper.EquivalentResourcesFor(gvr("apps", "v1", "deployments"), "scale"); !reflect.DeepEqual(resources, tc.ResourcesForV1DeploymentScale) {
129 t.Errorf("diff:\n%s", cmp.Diff(tc.ResourcesForV1DeploymentScale, resources))
130 }
131 if resources := mapper.EquivalentResourcesFor(gvr("apps", "v1", "deployments"), "status"); !reflect.DeepEqual(resources, tc.ResourcesForV1DeploymentStatus) {
132 t.Errorf("diff:\n%s", cmp.Diff(tc.ResourcesForV1DeploymentStatus, resources))
133 }
134 })
135 }
136 }
137
View as plain text