@@ -33,8 +33,10 @@ import (
33
33
"k8s.io/api/admission/v1beta1"
34
34
admissionv1beta1 "k8s.io/api/admissionregistration/v1beta1"
35
35
appsv1beta1 "k8s.io/api/apps/v1beta1"
36
+ corev1 "k8s.io/api/core/v1"
36
37
v1 "k8s.io/api/core/v1"
37
38
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
39
+ policyv1beta1 "k8s.io/api/policy/v1beta1"
38
40
"k8s.io/apimachinery/pkg/api/errors"
39
41
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
40
42
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@@ -102,6 +104,10 @@ var (
102
104
gvr ("" , "v1" , "pods/exec" ): {"create" : testPodConnectSubresource },
103
105
gvr ("" , "v1" , "pods/portforward" ): {"create" : testPodConnectSubresource },
104
106
107
+ gvr ("" , "v1" , "bindings" ): {"create" : testPodBindingEviction },
108
+ gvr ("" , "v1" , "pods/binding" ): {"create" : testPodBindingEviction },
109
+ gvr ("" , "v1" , "pods/eviction" ): {"create" : testPodBindingEviction },
110
+
105
111
gvr ("" , "v1" , "nodes/proxy" ): {"*" : testSubresourceProxy },
106
112
gvr ("" , "v1" , "pods/proxy" ): {"*" : testSubresourceProxy },
107
113
gvr ("" , "v1" , "services/proxy" ): {"*" : testSubresourceProxy },
@@ -124,11 +130,6 @@ var (
124
130
// TODO: webhook config objects are not subject to admission, verify CRUD works and webhooks do not observe them
125
131
gvr ("admissionregistration.k8s.io" , "v1beta1" , "mutatingwebhookconfigurations" ): sets .NewString ("*" ),
126
132
gvr ("admissionregistration.k8s.io" , "v1beta1" , "validatingwebhookconfigurations" ): sets .NewString ("*" ),
127
-
128
- // TODO: implement custom subresource tests (requires special states or requests)
129
- gvr ("" , "v1" , "bindings" ): sets .NewString ("create" ),
130
- gvr ("" , "v1" , "pods/binding" ): sets .NewString ("create" ),
131
- gvr ("" , "v1" , "pods/eviction" ): sets .NewString ("create" ),
132
133
}
133
134
134
135
parentResources = map [schema.GroupVersionResource ]schema.GroupVersionResource {
@@ -778,6 +779,58 @@ func testPodConnectSubresource(c *testContext) {
778
779
}
779
780
}
780
781
782
+ // testPodBindingEviction verifies pod binding and eviction admission
783
+ func testPodBindingEviction (c * testContext ) {
784
+ podGVR := gvr ("" , "v1" , "pods" )
785
+ pod , err := createOrGetResource (c .client , podGVR , c .resources [podGVR ])
786
+ if err != nil {
787
+ c .t .Error (err )
788
+ return
789
+ }
790
+
791
+ background := metav1 .DeletePropagationBackground
792
+ zero := int64 (0 )
793
+ forceDelete := & metav1.DeleteOptions {GracePeriodSeconds : & zero , PropagationPolicy : & background }
794
+ defer func () {
795
+ err := c .clientset .CoreV1 ().Pods (pod .GetNamespace ()).Delete (pod .GetName (), forceDelete )
796
+ if err != nil && ! errors .IsNotFound (err ) {
797
+ c .t .Error (err )
798
+ return
799
+ }
800
+ }()
801
+
802
+ c .admissionHolder .expect (c .gvr , gvk (c .resource .Group , c .resource .Version , c .resource .Kind ), v1beta1 .Create , pod .GetName (), pod .GetNamespace (), true , false )
803
+
804
+ switch c .gvr {
805
+ case gvr ("" , "v1" , "bindings" ):
806
+ err = c .clientset .CoreV1 ().RESTClient ().Post ().Namespace (pod .GetNamespace ()).Resource ("bindings" ).Body (& corev1.Binding {
807
+ ObjectMeta : metav1.ObjectMeta {Name : pod .GetName ()},
808
+ Target : corev1.ObjectReference {Name : "foo" , Kind : "Node" , APIVersion : "v1" },
809
+ }).Do ().Error ()
810
+
811
+ case gvr ("" , "v1" , "pods/binding" ):
812
+ err = c .clientset .CoreV1 ().RESTClient ().Post ().Namespace (pod .GetNamespace ()).Resource ("pods" ).Name (pod .GetName ()).SubResource ("binding" ).Body (& corev1.Binding {
813
+ ObjectMeta : metav1.ObjectMeta {Name : pod .GetName ()},
814
+ Target : corev1.ObjectReference {Name : "foo" , Kind : "Node" , APIVersion : "v1" },
815
+ }).Do ().Error ()
816
+
817
+ case gvr ("" , "v1" , "pods/eviction" ):
818
+ err = c .clientset .CoreV1 ().RESTClient ().Post ().Namespace (pod .GetNamespace ()).Resource ("pods" ).Name (pod .GetName ()).SubResource ("eviction" ).Body (& policyv1beta1.Eviction {
819
+ ObjectMeta : metav1.ObjectMeta {Name : pod .GetName ()},
820
+ DeleteOptions : forceDelete ,
821
+ }).Do ().Error ()
822
+
823
+ default :
824
+ c .t .Errorf ("unhandled resource %#v" , c .gvr )
825
+ return
826
+ }
827
+
828
+ if err != nil {
829
+ c .t .Error (err )
830
+ return
831
+ }
832
+ }
833
+
781
834
// testSubresourceProxy verifies proxy subresources
782
835
func testSubresourceProxy (c * testContext ) {
783
836
parentGVR := getParentGVR (c .gvr )
0 commit comments