1
+ package io .javaoperatorsdk .admissioncontroller ;
2
+
3
+ import io .fabric8 .kubernetes .api .model .HasMetadata ;
4
+ import io .fabric8 .kubernetes .api .model .admission .v1 .AdmissionRequest ;
5
+ import io .fabric8 .kubernetes .api .model .admission .v1 .AdmissionReview ;
6
+ import io .fabric8 .kubernetes .api .model .apps .Deployment ;
7
+ import io .fabric8 .kubernetes .client .utils .Serialization ;
8
+ import org .junit .jupiter .api .Test ;
9
+
10
+ import java .io .IOException ;
11
+ import java .io .InputStream ;
12
+ import java .util .Base64 ;
13
+ import java .util .UUID ;
14
+
15
+ import static org .assertj .core .api .Assertions .assertThat ;
16
+ import static org .assertj .core .api .Assertions .in ;
17
+
18
+ class AdmissionControllerTest {
19
+
20
+ public static final String MISSING_REQUIRED_LABEL = "Missing required label." ;
21
+ public static final String LABEL_KEY = "app.kubernetes.io/name" ;
22
+ public static final String LABEL_TEST_VALUE = "mutation-test" ;
23
+
24
+ @ Test
25
+ public void validatesResource () {
26
+ AdmissionController <HasMetadata > admissionController = new AdmissionController <>((resource , operation ) -> {
27
+ if (resource .getMetadata ().getLabels ().get (LABEL_KEY ) == null ) {
28
+ throw new NotAllowedException (MISSING_REQUIRED_LABEL );
29
+ }
30
+ });
31
+ var inputAdmissionReview = createTestAdmissionReview ();
32
+
33
+ var response = admissionController .handle (inputAdmissionReview );
34
+
35
+ assertThat (response .getResponse ().getUid ()).isEqualTo (inputAdmissionReview .getRequest ().getUid ());
36
+ assertThat (response .getResponse ().getStatus ().getCode ()).isEqualTo (403 );
37
+ assertThat (response .getResponse ().getStatus ().getMessage ()).isEqualTo (MISSING_REQUIRED_LABEL );
38
+ assertThat (response .getResponse ().getAllowed ()).isFalse ();
39
+ }
40
+
41
+ @ Test
42
+ public void mutatesResource () {
43
+ AdmissionController <HasMetadata > admissionController = new AdmissionController <>((resource , operation ) -> {
44
+ resource .getMetadata ().getLabels ().putIfAbsent (LABEL_KEY , LABEL_TEST_VALUE );
45
+ return resource ;
46
+ });
47
+ var inputAdmissionReview = createTestAdmissionReview ();
48
+
49
+ var response = admissionController .handle (inputAdmissionReview );
50
+
51
+ assertThat (response .getResponse ().getAllowed ()).isTrue ();
52
+ String patch = new String (Base64 .getDecoder ().decode (response .getResponse ().getPatch ()));
53
+ assertThat (patch )
54
+ .isEqualTo ("[{\" op\" :\" add\" ,\" path\" :\" /metadata/labels/app.kubernetes.io~1name\" ,\" value\" :\" mutation-test\" }]" );
55
+ }
56
+
57
+ private AdmissionReview createTestAdmissionReview () {
58
+ AdmissionReview admissionReview = new AdmissionReview ();
59
+ AdmissionRequest request = new AdmissionRequest ();
60
+ admissionReview .setRequest (request );
61
+ request .setOperation (Operation .CREATE .name ());
62
+ request .setUid (UUID .randomUUID ().toString ());
63
+ Deployment deployment = null ;
64
+ try (InputStream is = getClass ().getResourceAsStream ("deployment.yaml" )) {
65
+ deployment = Serialization .unmarshal (is , Deployment .class );
66
+ request .setObject (deployment );
67
+ } catch (IOException e ) {
68
+ throw new IllegalStateException (e );
69
+ }
70
+ return admissionReview ;
71
+ }
72
+
73
+ }
0 commit comments