From 38632b4d7bac0a4a88a25a3cbd1fb244854e6bd3 Mon Sep 17 00:00:00 2001 From: mamutmk5 <3045922+mamutmk5@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:21:50 +0200 Subject: [PATCH] BC-7239 - write an configmap at an namespace (#10) --- .../java/de/svs/doido/mongo/ConfigmapApi.java | 26 +++++++- .../mongo/kubernetes/configmap/Write.java | 59 +++++++++++++++++++ .../de/svs/doido/mongo/ConfigmapApiTest.java | 59 ++++++++++++++++++- 3 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/svs/doido/mongo/kubernetes/configmap/Write.java diff --git a/src/main/java/de/svs/doido/mongo/ConfigmapApi.java b/src/main/java/de/svs/doido/mongo/ConfigmapApi.java index c11d6dc..7348405 100644 --- a/src/main/java/de/svs/doido/mongo/ConfigmapApi.java +++ b/src/main/java/de/svs/doido/mongo/ConfigmapApi.java @@ -2,22 +2,42 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.sse.OutboundSseEvent; +import jakarta.ws.rs.ForbiddenException; import jakarta.inject.Inject; import svs.doido.mongo.dto.Configmap; import svs.doido.mongo.kubernetes.configmap.Read; +import svs.doido.mongo.kubernetes.configmap.Write; @Path("/configmap") public class ConfigmapApi { @Inject - Read cfg; + Read cfgRead; + + @Inject + Write cfgWrite; @GET @Path("/{namespace}/{configmapName}") @Produces(MediaType.APPLICATION_JSON) - public Configmap configmaps(String namespace, String configmapName) { - return cfg.readConfigmap(namespace,configmapName); + public Configmap configmapsRead(String namespace, String configmapName) { + return cfgRead.readConfigmap(namespace,configmapName); + } + + @POST + @Path("/{namespace}/{configmapName}") + @Produces(MediaType.APPLICATION_JSON) + public void configmapsWrite(String namespace, String configmapName) { + Configmap cfg = new Configmap(); + cfg.setName(configmapName); + cfg.setUri("http://www.test.org"); + if( !cfgWrite.writeConfigmap(namespace,cfg) ) { + throw new ForbiddenException(); + } + } } \ No newline at end of file diff --git a/src/main/java/de/svs/doido/mongo/kubernetes/configmap/Write.java b/src/main/java/de/svs/doido/mongo/kubernetes/configmap/Write.java new file mode 100644 index 0000000..1a3c1ff --- /dev/null +++ b/src/main/java/de/svs/doido/mongo/kubernetes/configmap/Write.java @@ -0,0 +1,59 @@ +package svs.doido.mongo.kubernetes.configmap; + +import svs.doido.mongo.dto.Configmap; +import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.ObjectMeta; +import io.fabric8.kubernetes.client.KubernetesClient; +import jakarta.inject.Inject; +import jakarta.enterprise.context.RequestScoped; + +import java.util.Map; +import java.util.HashMap; + +@RequestScoped +public class Write { + + private static final String NAME_LABEL = "app.kubernetes.io/name"; + private static final String NAME_LABEL_VALUE = "doido-mongo"; + + @Inject + KubernetesClient client; + + public boolean writeConfigmap(String namespace, Configmap cfg) { + ConfigMap configmap = client.configMaps().inNamespace(namespace).withName(cfg.getName()).get(); + Map labels; + Map data; + ObjectMeta meta; + + if(configmap != null) { + labels = configmap.getMetadata().getLabels(); + if( + labels.containsKey(NAME_LABEL) && + labels.get(NAME_LABEL).equals(NAME_LABEL_VALUE) + ) { + data = configmap.getData(); + data.put("uri", cfg.getUri()); + configmap.setData(data); + client.configMaps().createOrReplace(configmap); + return true; + } + else { + return false; + } + } + else { + labels = new HashMap<>(); + data = new HashMap<>(); + labels.put(NAME_LABEL, NAME_LABEL_VALUE); + data.put("uri", cfg.getUri()); + configmap = new ConfigMapBuilder().withNewMetadata().withName(cfg.getName()).withNamespace(namespace).and().build(); + configmap.setData(data); + meta = configmap.getMetadata(); + meta.setLabels(labels); + configmap.setMetadata(meta); + client.configMaps().create(configmap); + return true; + } + } +} \ No newline at end of file diff --git a/src/test/java/de/svs/doido/mongo/ConfigmapApiTest.java b/src/test/java/de/svs/doido/mongo/ConfigmapApiTest.java index 8f3ca00..fd221de 100644 --- a/src/test/java/de/svs/doido/mongo/ConfigmapApiTest.java +++ b/src/test/java/de/svs/doido/mongo/ConfigmapApiTest.java @@ -14,7 +14,9 @@ import io.fabric8.kubernetes.api.model.NamespaceBuilder; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.ObjectMeta; +import java.util.Map; import java.util.HashMap; import static io.restassured.RestAssured.given; @@ -49,18 +51,73 @@ public void before() { public void after() { final Namespace namespace1 = new NamespaceBuilder().withNewMetadata().withName("namespaceA").and().build(); + for ( ConfigMap cfg : client.configMaps().inNamespace("namespaceA").list().getItems()) { + client.configMaps().resource(cfg).delete(); + } // Set up Kubernetes so that our "pretend" namespaces are deleted client.namespaces().resource(namespace1).delete(); } @Test - void testInteractionWithAPIServerForConfigmaps() { + void testInteractionWithGetConfigmaps() { given() .when().get("/configmap/namespaceA/test") .then() .statusCode(200) .body("size()", is(2)); } + + + @Test + void testInteractionWithPostConfigmaps1() { + given() + .when().post("/configmap/namespaceA/tes2t") + .then() + .statusCode(204); + } + + + @Test + void testInteractionWithPostConfigmapsExistAndNoLabels() { + given() + .when().post("/configmap/namespaceA/test") + .then() + .statusCode(403); + } + + + @Test + void testInteractionWithPostConfigmapsExistAndLabels() { + ConfigMap configmap = new ConfigMapBuilder().withNewMetadata().withName("test3").withNamespace("namespaceA").and().build(); + Map labels = new HashMap<>(); + ObjectMeta meta; + labels.put("app.kubernetes.io/name", "doido-mongo"); + meta = configmap.getMetadata(); + meta.setLabels(labels); + configmap.setMetadata(meta); + client.configMaps().create(configmap); + given() + .when().post("/configmap/namespaceA/test3") + .then() + .statusCode(204); + } + + + @Test + void testInteractionWithPostConfigmapsExistAndLabelsWrong() { + ConfigMap configmap = new ConfigMapBuilder().withNewMetadata().withName("test3").withNamespace("namespaceA").and().build(); + Map labels = new HashMap<>(); + ObjectMeta meta; + labels.put("app.kubernetes.io/name", "doido-mongoB"); + meta = configmap.getMetadata(); + meta.setLabels(labels); + configmap.setMetadata(meta); + client.configMaps().create(configmap); + given() + .when().post("/configmap/namespaceA/test3") + .then() + .statusCode(403); + } } \ No newline at end of file