Skip to content

Commit cc72248

Browse files
committed
Test webhook admission - pod connect subresources
1 parent 588ea5d commit cc72248

File tree

1 file changed

+50
-10
lines changed

1 file changed

+50
-10
lines changed

test/integration/apiserver/admissionwebhook/admission_test.go

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import (
4444
"k8s.io/apimachinery/pkg/util/sets"
4545
"k8s.io/apimachinery/pkg/util/wait"
4646
dynamic "k8s.io/client-go/dynamic"
47+
"k8s.io/client-go/kubernetes"
4748
clientset "k8s.io/client-go/kubernetes"
4849
"k8s.io/client-go/util/retry"
4950
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
@@ -63,6 +64,7 @@ type testContext struct {
6364
admissionHolder *holder
6465

6566
client dynamic.Interface
67+
clientset kubernetes.Interface
6668
gvr schema.GroupVersionResource
6769
resource metav1.APIResource
6870
resources map[schema.GroupVersionResource]metav1.APIResource
@@ -90,9 +92,14 @@ var (
9092

9193
// customTestFuncs holds custom test functions by resource and verb.
9294
customTestFuncs = map[schema.GroupVersionResource]map[string]testFunc{
93-
gvr("", "v1", "namespaces"): {"delete": testNamespaceDelete},
95+
gvr("", "v1", "namespaces"): {"delete": testNamespaceDelete},
96+
9497
gvr("apps", "v1beta1", "deployments/rollback"): {"create": testDeploymentRollback},
9598
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},
96103
}
97104

98105
// excludedResources lists resources / verb combinations that are not yet tested. this set should trend to zero.
@@ -114,15 +121,12 @@ var (
114121
gvr("admissionregistration.k8s.io", "v1beta1", "validatingwebhookconfigurations"): sets.NewString("*"),
115122

116123
// 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("*"),
126130
}
127131

128132
parentResources = map[schema.GroupVersionResource]schema.GroupVersionResource{
@@ -393,6 +397,7 @@ func TestWebhookV1beta1(t *testing.T) {
393397
t: t,
394398
admissionHolder: holder,
395399
client: dynamicClient,
400+
clientset: master.Client,
396401
gvr: gvr,
397402
resource: resource,
398403
resources: resourcesByGVR,
@@ -735,6 +740,41 @@ func testDeploymentRollback(c *testContext) {
735740
}
736741
}
737742

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+
738778
//
739779
// utility methods
740780
//

0 commit comments

Comments
 (0)