Skip to content

Commit 768bd6d

Browse files
authored
Quarkus sample (#5)
* fix: quakus sample wip * fix: tests
1 parent 21cdc42 commit 768bd6d

File tree

12 files changed

+263
-49
lines changed

12 files changed

+263
-49
lines changed

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@
189189
</plugins>
190190
</pluginManagement>
191191
<plugins>
192+
192193
<plugin>
193194
<groupId>org.commonjava.maven.plugins</groupId>
194195
<artifactId>directory-maven-plugin</artifactId>
File renamed without changes.

samples/quarkus/pom.xml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</parent>
1010
<groupId>io.javaoperatorsdk.admissioncontroller.sample</groupId>
1111
<artifactId>quarkus-sample</artifactId>
12-
<version>1.0.0-SNAPSHOT</version>
12+
<name>Admission Controller Framework - Samples - Quarkus</name>
1313
<properties>
1414
<compiler-plugin.version>3.8.1</compiler-plugin.version>
1515
<maven.compiler.release>11</maven.compiler.release>
@@ -40,6 +40,11 @@
4040
<groupId>io.quarkus</groupId>
4141
<artifactId>quarkus-resteasy</artifactId>
4242
</dependency>
43+
<dependency>
44+
<groupId>io.javaoperatorsdk</groupId>
45+
<artifactId>operator-framework-framework-core</artifactId>
46+
<version>${project.version}</version>
47+
</dependency>
4348
<dependency>
4449
<groupId>io.quarkus</groupId>
4550
<artifactId>quarkus-junit5</artifactId>
@@ -50,6 +55,10 @@
5055
<artifactId>rest-assured</artifactId>
5156
<scope>test</scope>
5257
</dependency>
58+
<dependency>
59+
<groupId>org.jboss.resteasy</groupId>
60+
<artifactId>resteasy-jackson2-provider</artifactId>
61+
</dependency>
5362
</dependencies>
5463
<build>
5564
<plugins>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.javaoperatorsdk.admissioncontroller.sample.quarkus;
2+
3+
import javax.enterprise.context.Dependent;
4+
import javax.inject.Named;
5+
import javax.inject.Singleton;
6+
7+
import io.fabric8.kubernetes.api.model.Pod;
8+
import io.javaoperatorsdk.admissioncontroller.AdmissionController;
9+
import io.javaoperatorsdk.admissioncontroller.NotAllowedException;
10+
11+
@Dependent
12+
public class AdmissionControllerConfig {
13+
14+
public static final String APP_NAME_LABEL_KEY = "app.kubernetes.io/name";
15+
16+
@Singleton
17+
@Named("mutatingController")
18+
public AdmissionController<Pod> mutatingController() {
19+
return new AdmissionController<>((resource, operation) -> {
20+
resource.getMetadata().getLabels().putIfAbsent(APP_NAME_LABEL_KEY, "mutation-test");
21+
return resource;
22+
});
23+
}
24+
25+
@Singleton
26+
@Named("validatingController")
27+
public AdmissionController<Pod> validatingController() {
28+
return new AdmissionController<>((resource, operation) -> {
29+
if (resource.getMetadata().getLabels().get(APP_NAME_LABEL_KEY) == null) {
30+
throw new NotAllowedException("Missing label: " + APP_NAME_LABEL_KEY);
31+
}
32+
});
33+
}
34+
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.javaoperatorsdk.admissioncontroller.sample.quarkus;
2+
3+
import javax.inject.Inject;
4+
import javax.inject.Named;
5+
import javax.ws.rs.*;
6+
import javax.ws.rs.core.MediaType;
7+
8+
import io.fabric8.kubernetes.api.model.Pod;
9+
import io.fabric8.kubernetes.api.model.admission.v1.AdmissionReview;
10+
import io.javaoperatorsdk.admissioncontroller.AdmissionController;
11+
12+
@Path("/")
13+
public class AdmissionEndpoint {
14+
15+
private AdmissionController<Pod> mutationController;
16+
private AdmissionController<Pod> validationController;
17+
18+
@Inject
19+
public AdmissionEndpoint(@Named("mutatingController") AdmissionController<Pod> mutationController,
20+
@Named("validatingController") AdmissionController<Pod> validationController) {
21+
this.mutationController = mutationController;
22+
this.validationController = validationController;
23+
}
24+
25+
@POST
26+
@Path("mutate")
27+
@Consumes(MediaType.APPLICATION_JSON)
28+
@Produces(MediaType.APPLICATION_JSON)
29+
public AdmissionReview mutate(AdmissionReview admissionReview) {
30+
return mutationController.handle(admissionReview);
31+
}
32+
33+
@POST
34+
@Path("validate")
35+
@Consumes(MediaType.APPLICATION_JSON)
36+
@Produces(MediaType.APPLICATION_JSON)
37+
public AdmissionReview hello(AdmissionReview admissionReview) {
38+
return validationController.handle(admissionReview);
39+
}
40+
41+
}

samples/quarkus/src/main/java/org/acme/getting/started/GreetingResource.java

Lines changed: 0 additions & 16 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.javaoperatorsdk.admissioncontroller.sample.quarkus;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.nio.charset.StandardCharsets;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
import io.quarkus.test.junit.QuarkusTest;
10+
import io.restassured.http.ContentType;
11+
12+
import static io.restassured.RestAssured.given;
13+
import static org.hamcrest.CoreMatchers.is;
14+
15+
@QuarkusTest
16+
public class AdmissionEndpointTest {
17+
18+
@Test
19+
public void mutates() {
20+
given().contentType(ContentType.JSON)
21+
.body(jsonRequest())
22+
.when().post("/mutate")
23+
.then()
24+
.statusCode(200)
25+
.body(is(
26+
"{\"apiVersion\":\"admission.k8s.io/v1\",\"kind\":\"AdmissionReview\",\"response\":{\"allowed\":true,\"patch\":\"W3sib3AiOiJhZGQiLCJwYXRoIjoiL21ldGFkYXRhL2xhYmVscy9hcHAua3ViZXJuZXRlcy5pb34xbmFtZSIsInZhbHVlIjoibXV0YXRpb24tdGVzdCJ9XQ==\",\"patchType\":\"JSONPatch\",\"uid\":\"0df28fbd-5f5f-11e8-bc74-36e6bb280816\"}}"));
27+
}
28+
29+
@Test
30+
public void validates() {
31+
given().contentType(ContentType.JSON)
32+
.body(jsonRequest())
33+
.when().post("/validate")
34+
.then()
35+
.statusCode(200)
36+
.body(is(
37+
"{\"apiVersion\":\"admission.k8s.io/v1\",\"kind\":\"AdmissionReview\",\"response\":{\"allowed\":false,\"status\":{\"apiVersion\":\"v1\",\"kind\":\"Status\",\"code\":403,\"message\":\"Missing label: app.kubernetes.io/name\"},\"uid\":\"0df28fbd-5f5f-11e8-bc74-36e6bb280816\"}}"));
38+
}
39+
40+
private String jsonRequest() {
41+
try (InputStream is = this.getClass().getResourceAsStream("/admission-request.json")) {
42+
return new String(is.readAllBytes(), StandardCharsets.UTF_8);
43+
} catch (IOException e) {
44+
throw new IllegalStateException(e);
45+
}
46+
}
47+
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.javaoperatorsdk.admissioncontroller.sample.quarkus;
2+
3+
import io.quarkus.test.junit.NativeImageTest;
4+
5+
@NativeImageTest
6+
public class NativeAdmissionEndpointIT extends AdmissionEndpointTest {
7+
8+
// Execute the same tests but in native mode.
9+
}

samples/quarkus/src/test/java/org/acme/getting/started/GreetingResourceTest.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

samples/quarkus/src/test/java/org/acme/getting/started/NativeGreetingResourceIT.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)