@@ -44,6 +44,7 @@ import (
44
44
"k8s.io/apimachinery/pkg/util/sets"
45
45
"k8s.io/apimachinery/pkg/util/wait"
46
46
dynamic "k8s.io/client-go/dynamic"
47
+ "k8s.io/client-go/kubernetes"
47
48
clientset "k8s.io/client-go/kubernetes"
48
49
"k8s.io/client-go/util/retry"
49
50
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
@@ -63,6 +64,7 @@ type testContext struct {
63
64
admissionHolder * holder
64
65
65
66
client dynamic.Interface
67
+ clientset kubernetes.Interface
66
68
gvr schema.GroupVersionResource
67
69
resource metav1.APIResource
68
70
resources map [schema.GroupVersionResource ]metav1.APIResource
90
92
91
93
// customTestFuncs holds custom test functions by resource and verb.
92
94
customTestFuncs = map [schema.GroupVersionResource ]map [string ]testFunc {
93
- gvr ("" , "v1" , "namespaces" ): {"delete" : testNamespaceDelete },
95
+ gvr ("" , "v1" , "namespaces" ): {"delete" : testNamespaceDelete },
96
+
94
97
gvr ("apps" , "v1beta1" , "deployments/rollback" ): {"create" : testDeploymentRollback },
95
98
gvr ("extensions" , "v1beta1" , "deployments/rollback" ): {"create" : testDeploymentRollback },
99
+
100
+ gvr ("" , "v1" , "pods/attach" ): {"create" : testPodConnectSubresource },
101
+ gvr ("" , "v1" , "pods/exec" ): {"create" : testPodConnectSubresource },
102
+ gvr ("" , "v1" , "pods/portforward" ): {"create" : testPodConnectSubresource },
96
103
}
97
104
98
105
// excludedResources lists resources / verb combinations that are not yet tested. this set should trend to zero.
@@ -114,15 +121,12 @@ var (
114
121
gvr ("admissionregistration.k8s.io" , "v1beta1" , "validatingwebhookconfigurations" ): sets .NewString ("*" ),
115
122
116
123
// TODO: implement custom subresource tests (requires special states or requests)
117
- gvr ("" , "v1" , "bindings" ): sets .NewString ("create" ),
118
- gvr ("" , "v1" , "nodes/proxy" ): sets .NewString ("*" ),
119
- gvr ("" , "v1" , "pods/attach" ): sets .NewString ("create" ),
120
- gvr ("" , "v1" , "pods/binding" ): sets .NewString ("create" ),
121
- gvr ("" , "v1" , "pods/eviction" ): sets .NewString ("create" ),
122
- gvr ("" , "v1" , "pods/exec" ): sets .NewString ("create" ),
123
- gvr ("" , "v1" , "pods/portforward" ): sets .NewString ("create" ),
124
- gvr ("" , "v1" , "pods/proxy" ): sets .NewString ("*" ),
125
- gvr ("" , "v1" , "services/proxy" ): sets .NewString ("*" ),
124
+ gvr ("" , "v1" , "bindings" ): sets .NewString ("create" ),
125
+ gvr ("" , "v1" , "nodes/proxy" ): sets .NewString ("*" ),
126
+ gvr ("" , "v1" , "pods/binding" ): sets .NewString ("create" ),
127
+ gvr ("" , "v1" , "pods/eviction" ): sets .NewString ("create" ),
128
+ gvr ("" , "v1" , "pods/proxy" ): sets .NewString ("*" ),
129
+ gvr ("" , "v1" , "services/proxy" ): sets .NewString ("*" ),
126
130
}
127
131
128
132
parentResources = map [schema.GroupVersionResource ]schema.GroupVersionResource {
@@ -393,6 +397,7 @@ func TestWebhookV1beta1(t *testing.T) {
393
397
t : t ,
394
398
admissionHolder : holder ,
395
399
client : dynamicClient ,
400
+ clientset : master .Client ,
396
401
gvr : gvr ,
397
402
resource : resource ,
398
403
resources : resourcesByGVR ,
@@ -735,6 +740,41 @@ func testDeploymentRollback(c *testContext) {
735
740
}
736
741
}
737
742
743
+ // testPodConnectSubresource verifies connect subresources
744
+ func testPodConnectSubresource (c * testContext ) {
745
+ podGVR := gvr ("" , "v1" , "pods" )
746
+ pod , err := createOrGetResource (c .client , podGVR , c .resources [podGVR ])
747
+ if err != nil {
748
+ c .t .Error (err )
749
+ return
750
+ }
751
+
752
+ // check all upgradeable verbs
753
+ for _ , httpMethod := range []string {"GET" , "POST" } {
754
+ c .t .Logf ("verifying %v" , httpMethod )
755
+
756
+ c .admissionHolder .expect (c .gvr , gvk (c .resource .Group , c .resource .Version , c .resource .Kind ), v1beta1 .Connect , pod .GetName (), pod .GetNamespace (), true , false )
757
+ var err error
758
+ switch c .gvr {
759
+ case gvr ("" , "v1" , "pods/exec" ):
760
+ err = c .clientset .CoreV1 ().RESTClient ().Verb (httpMethod ).Namespace (pod .GetNamespace ()).Resource ("pods" ).Name (pod .GetName ()).SubResource ("exec" ).Do ().Error ()
761
+ case gvr ("" , "v1" , "pods/attach" ):
762
+ err = c .clientset .CoreV1 ().RESTClient ().Verb (httpMethod ).Namespace (pod .GetNamespace ()).Resource ("pods" ).Name (pod .GetName ()).SubResource ("attach" ).Do ().Error ()
763
+ case gvr ("" , "v1" , "pods/portforward" ):
764
+ err = c .clientset .CoreV1 ().RESTClient ().Verb (httpMethod ).Namespace (pod .GetNamespace ()).Resource ("pods" ).Name (pod .GetName ()).SubResource ("portforward" ).Do ().Error ()
765
+ default :
766
+ c .t .Errorf ("unknown subresource %#v" , c .gvr )
767
+ return
768
+ }
769
+
770
+ if err != nil {
771
+ c .t .Logf ("debug: result of subresource connect: %v" , err )
772
+ }
773
+ c .admissionHolder .verify (c .t )
774
+
775
+ }
776
+ }
777
+
738
778
//
739
779
// utility methods
740
780
//
0 commit comments