Skip to content

Commit

Permalink
feat: conversion hooks integration tests (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
csviri authored Jul 14, 2022
1 parent ff8836d commit c29ce11
Show file tree
Hide file tree
Showing 39 changed files with 738 additions and 18 deletions.
1 change: 0 additions & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@


<dependencies>
<!-- We use the OpenShift client, because functionally it is a superset of the Kubernetes client -->
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public void registerMapper(AsyncMapper<?, ?> mapper) {
throw new IllegalStateException(MAPPER_ALREADY_REGISTERED_FOR_VERSION_MESSAGE + version);
}
mappers.put(version, mapper);
Utils.registerCustomKind(
Utils.getFirstTypeArgumentFromInterface(mapper.getClass(), AsyncMapper.class));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public void registerMapper(Mapper<?, ?> mapper) {
throw new IllegalStateException(MAPPER_ALREADY_REGISTERED_FOR_VERSION_MESSAGE + version);
}
mappers.put(version, mapper);
Utils.registerCustomKind(
Utils.getFirstTypeArgumentFromInterface(mapper.getClass(), Mapper.class));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package io.javaoperatorsdk.webhook.conversion;

import java.lang.reflect.ParameterizedType;
import java.util.Arrays;

import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.internal.KubernetesDeserializer;

public class Utils {

private Utils() {}
Expand All @@ -12,4 +18,25 @@ public static String versionOfApiVersion(String apiVersion) {
var lastDelimiter = apiVersion.lastIndexOf("/");
return apiVersion.substring(lastDelimiter + 1);
}

public static void registerCustomKind(Class<? extends HasMetadata> clazz) {
KubernetesDeserializer.registerCustomKind(HasMetadata.getApiVersion(clazz),
HasMetadata.getKind(clazz), clazz);
}

@SuppressWarnings("unchecked")
public static Class<? extends HasMetadata> getFirstTypeArgumentFromInterface(Class<?> clazz,
Class<?> expectedImplementedInterface) {
return (Class<? extends HasMetadata>) Arrays.stream(clazz.getGenericInterfaces())
.filter(type -> type.getTypeName().startsWith(expectedImplementedInterface.getName())
&& type instanceof ParameterizedType)
.map(ParameterizedType.class::cast)
.findFirst()
.map(t -> (Class<?>) t.getActualTypeArguments()[0])
.orElseThrow(() -> new RuntimeException(
"Couldn't retrieve generic parameter type from " + clazz.getSimpleName()
+ " because it doesn't implement "
+ expectedImplementedInterface.getSimpleName()
+ " directly"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

import org.junit.jupiter.api.Test;

import io.javaoperatorsdk.webhook.conversion.crd.CustomResourceV1;
import io.javaoperatorsdk.webhook.conversion.crd.CustomResourceV2;
import io.javaoperatorsdk.webhook.conversion.mapper.AsyncV1Mapper;
import io.javaoperatorsdk.webhook.conversion.mapper.AsyncV2Mapper;
import io.javaoperatorsdk.webhook.conversion.mapper.CustomResourceV1Mapper;
import io.javaoperatorsdk.webhook.conversion.mapper.CustomResourceV2Mapper;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

Expand All @@ -13,4 +20,16 @@ void getsVersionFromApiVersion() {
assertThat(Utils.versionOfApiVersion("extensions/v1beta1")).isEqualTo("v1beta1");
}

@Test
void getMapperResourceType() {
assertThat(Utils.getFirstTypeArgumentFromInterface(CustomResourceV1Mapper.class, Mapper.class))
.isEqualTo(CustomResourceV1.class);
assertThat(Utils.getFirstTypeArgumentFromInterface(CustomResourceV2Mapper.class, Mapper.class))
.isEqualTo(CustomResourceV2.class);
assertThat(Utils.getFirstTypeArgumentFromInterface(AsyncV1Mapper.class, AsyncMapper.class))
.isEqualTo(CustomResourceV1.class);
assertThat(Utils.getFirstTypeArgumentFromInterface(AsyncV2Mapper.class, AsyncMapper.class))
.isEqualTo(CustomResourceV2.class);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

@Group("sample.javaoperatorsdk")
@Version("v1")
@Kind("MultiVersionCustomResource")
@Kind("MultiVersionTestCustomResource")
@ShortNames("mv1")
public class CustomResourceV1
extends
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

@Group("sample.javaoperatorsdk")
@Version(value = "v2", storage = false)
@Kind("MultiVersionCustomResource")
@Kind("MultiVersionTestCustomResource")
@ShortNames("mv2")
public class CustomResourceV2
extends
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

@Group("sample.javaoperatorsdk")
@Version(value = "v3", storage = false)
@Kind("MultiVersionCustomResource")
@Kind("MultiVersionTestCustomResource")
@ShortNames("mv3")
public class CustomResourceV3
extends
Expand Down
3 changes: 0 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,6 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<rerunFailingTestsCount>3</rerunFailingTestsCount>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down
46 changes: 46 additions & 0 deletions samples/commons/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>admission-controller-framework-samples</artifactId>
<version>0.2.1-SNAPSHOT</version>
</parent>

<groupId>io.javaoperatorsdk.admissioncontroller.sample</groupId>
<artifactId>sample-commons</artifactId>
<name>Admission Controller Framework - Samples - Commons</name>

<properties>
<java.version>11</java.version>
<spring-boot-dependencies.version>2.6.6</spring-boot-dependencies.version>
</properties>

<dependencies>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
</dependency>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>admission-controller-framework-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>crd-generator-apt</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-dependencies.version}</version>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;

import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.model.annotation.Group;
import io.fabric8.kubernetes.model.annotation.Kind;
import io.fabric8.kubernetes.model.annotation.ShortNames;
import io.fabric8.kubernetes.model.annotation.Version;

@Group("sample.javaoperatorsdk")
@Version(value = "v1", storage = false)
@Kind("MultiVersionCustomResource")
@ShortNames("tcr")
public class MultiVersionCustomResource
extends CustomResource<MultiVersionCustomResourceSpec, MultiVersionCustomResourceStatus> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;

public class MultiVersionCustomResourceSpec {

private int value;

public int getValue() {
return value;
}

public MultiVersionCustomResourceSpec setValue(int value) {
this.value = value;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;

public class MultiVersionCustomResourceSpecV2 {

private String value;

private String additionalValue;

public String getValue() {
return value;
}

public MultiVersionCustomResourceSpecV2 setValue(String value) {
this.value = value;
return this;
}

public String getAdditionalValue() {
return additionalValue;
}

public void setAdditionalValue(String additionalValue) {
this.additionalValue = additionalValue;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;

public class MultiVersionCustomResourceStatus {

private Boolean ready;

public Boolean getReady() {
return ready;
}

public MultiVersionCustomResourceStatus setReady(Boolean ready) {
this.ready = ready;
return this;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;


public class MultiVersionCustomResourceStatusV2 {

private Boolean ready;

private String message;

public Boolean getReady() {
return ready;
}

public MultiVersionCustomResourceStatusV2 setReady(Boolean ready) {
this.ready = ready;
return this;
}

public String getMessage() {
return message;
}

public MultiVersionCustomResourceStatusV2 setMessage(String message) {
this.message = message;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.javaoperatorsdk.webhook.sample.commons.customresource;

import io.fabric8.kubernetes.client.CustomResource;
import io.fabric8.kubernetes.model.annotation.Group;
import io.fabric8.kubernetes.model.annotation.Kind;
import io.fabric8.kubernetes.model.annotation.ShortNames;
import io.fabric8.kubernetes.model.annotation.Version;

@Group("sample.javaoperatorsdk")
@Version(value = "v2")
@Kind("MultiVersionCustomResource")
@ShortNames("tcr")
public class MultiVersionCustomResourceV2
extends CustomResource<MultiVersionCustomResourceSpecV2, MultiVersionCustomResourceStatusV2> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.javaoperatorsdk.webhook.sample.commons.mapper;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

import io.javaoperatorsdk.webhook.conversion.AsyncMapper;
import io.javaoperatorsdk.webhook.conversion.TargetVersion;
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResource;
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResourceV2;

@TargetVersion("v1")
public class AsyncV1Mapper
implements AsyncMapper<MultiVersionCustomResource, MultiVersionCustomResourceV2> {

private V1Mapper mapper = new V1Mapper();

@Override
public CompletionStage<MultiVersionCustomResourceV2> toHub(MultiVersionCustomResource resource) {
return CompletableFuture.completedStage(mapper.toHub(resource));
}

@Override
public CompletionStage<MultiVersionCustomResource> fromHub(
MultiVersionCustomResourceV2 testCustomResourceV2) {
return CompletableFuture.completedStage(mapper.fromHub(testCustomResourceV2));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.javaoperatorsdk.webhook.sample.commons.mapper;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;

import io.javaoperatorsdk.webhook.conversion.AsyncMapper;
import io.javaoperatorsdk.webhook.conversion.TargetVersion;
import io.javaoperatorsdk.webhook.sample.commons.customresource.MultiVersionCustomResourceV2;

@TargetVersion("v2")
public class AsyncV2Mapper
implements AsyncMapper<MultiVersionCustomResourceV2, MultiVersionCustomResourceV2> {

private V2Mapper mapper = new V2Mapper();

@Override
public CompletionStage<MultiVersionCustomResourceV2> toHub(
MultiVersionCustomResourceV2 resource) {
return CompletableFuture.completedStage(mapper.toHub(resource));
}

@Override
public CompletionStage<MultiVersionCustomResourceV2> fromHub(
MultiVersionCustomResourceV2 multiVersionCustomResourceV2) {
return CompletableFuture.completedStage(mapper.fromHub(multiVersionCustomResourceV2));
}
}
Loading

0 comments on commit c29ce11

Please sign in to comment.