Skip to content

Commit

Permalink
review: improved Javadoc + KubernetesClientBuilder consumer approach
Browse files Browse the repository at this point in the history
Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
manusa committed Jul 21, 2023
1 parent 5251f4a commit 94c729b
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.function.Function;
import java.util.function.Consumer;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
Expand All @@ -43,11 +43,12 @@
boolean crud() default false;

/**
* No-arg constructor class implementing {@link Function} interface that returns {@link KubernetesClientBuilder} instance.
* No-arg constructor class implementing {@link Consumer} interface that accepts the {@link KubernetesClientBuilder} instance
* used by the KubernetesMockServerExtension for further customization.
* <p>
* Enables the customization of the automatically bootstrapped and injected
* {@link io.fabric8.kubernetes.client.KubernetesClient} instance.
*/
Class<? extends Function<String, KubernetesClientBuilder>> kubernetesClientBuilder() default KubernetesMockClientKubernetesClientBuilder.class;
Class<? extends Consumer<KubernetesClientBuilder>> kubernetesClientBuilderCustomizer() default KubernetesClientBuilderCustomizer.class;

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,14 @@
*/
package io.fabric8.kubernetes.client.server.mock;

import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.fabric8.kubernetes.client.http.TlsVersion;

import java.util.function.Function;
import java.util.function.Consumer;

public class KubernetesMockClientKubernetesClientBuilder implements Function<String, KubernetesClientBuilder> {
public class KubernetesClientBuilderCustomizer implements Consumer<KubernetesClientBuilder> {

@Override
public KubernetesClientBuilder apply(String url) {
return new KubernetesClientBuilder().withConfig(initConfig(url));
}

protected Config initConfig(String url) {
return new ConfigBuilder(Config.empty())
.withMasterUrl(url)
.withTrustCerts(true)
.withTlsVersions(TlsVersion.TLS_1_2)
.withNamespace("test")
.withHttp2Disable(true)
.build();
public void accept(KubernetesClientBuilder kubernetesClientBuilder) {
// NO-OP
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@
import io.fabric8.kubernetes.api.model.APIResourceListBuilder;
import io.fabric8.kubernetes.api.model.RootPathsBuilder;
import io.fabric8.kubernetes.client.Client;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import io.fabric8.kubernetes.client.NamespacedKubernetesClient;
import io.fabric8.kubernetes.client.VersionInfo;
import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext;
import io.fabric8.kubernetes.client.http.HttpClient;
import io.fabric8.kubernetes.client.http.TlsVersion;
import io.fabric8.kubernetes.client.impl.BaseClient;
import io.fabric8.kubernetes.client.utils.ApiVersionUtil;
import io.fabric8.kubernetes.client.utils.Serialization;
Expand All @@ -49,7 +52,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.Queue;
import java.util.function.Function;
import java.util.function.Consumer;
import java.util.regex.Pattern;

public class KubernetesMockServer extends DefaultMockServer implements Resetable, CustomResourceAware {
Expand Down Expand Up @@ -118,15 +121,38 @@ public String[] getRootPaths() {
}

public NamespacedKubernetesClient createClient() {
return createClient(new KubernetesMockClientKubernetesClientBuilder());
return createClient(new KubernetesClientBuilderCustomizer());
}

public NamespacedKubernetesClient createClient(HttpClient.Factory factory) {
return createClient(url -> new KubernetesMockClientKubernetesClientBuilder().apply(url).withHttpClientFactory(factory));
return createClient(b -> b.withHttpClientFactory(factory));
}

public NamespacedKubernetesClient createClient(Function<String, KubernetesClientBuilder> kubernetesClientBuilder) {
final BaseClient client = kubernetesClientBuilder.apply(url("/")).build().adapt(BaseClient.class);
/**
* Creates a client using the cusotmized {@link KubernetesClientBuilder} provided in the {@link Consumer} parameter.
* <p>
* The function is invoked using an initial {@link Config} instance that is initialized with the mock server's
* URL and the {@link TlsVersion} to use.
* <p>
* The following snippet shows how you can use this method in your tests:
* <pre>
* &#64;BeforeEach
* void setUp() {
* server = new KubernetesMockServer();
* server.start();
* client = server.createClient(b -&gt; {&#47;* customize builder *&#47;}));
* }
* }</pre>
*
* @param kubernetesClientBuilderCustomizer Consumer function to enable further customization of the provided
* KubernetesClientBuilder.
* @return a NamespacedKubernetesClient instance from the provided configuration.
*/
public NamespacedKubernetesClient createClient(Consumer<KubernetesClientBuilder> kubernetesClientBuilderCustomizer) {
final KubernetesClientBuilder kubernetesClientBuilder = new KubernetesClientBuilder().withConfig(initConfig());
kubernetesClientBuilderCustomizer.accept(kubernetesClientBuilder);

final BaseClient client = kubernetesClientBuilder.build().adapt(BaseClient.class);
client.setMatchingGroupPredicate(s -> unsupportedPatterns.stream().noneMatch(p -> p.matcher(s).find()));
return client.adapt(NamespacedKubernetesClient.class);
}
Expand Down Expand Up @@ -178,6 +204,16 @@ public void clearExpectations() {
responses.clear();
}

protected Config initConfig() {
return new ConfigBuilder(Config.empty())
.withMasterUrl(url("/"))
.withTrustCerts(true)
.withTlsVersions(TlsVersion.TLS_1_2)
.withNamespace("test")
.withHttp2Disable(true)
.build();
}

/**
* @deprecated Use {@code client.adapt(NamespacedServiceCatalogClient.class)} instead.
* @return A {@link NamespacedServiceCatalogClient} instance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ protected void initializeKubernetesClientAndMockServer(Class<?> testClass) {
a.https());
mock.init();
try {
client = mock.createClient(a.kubernetesClientBuilder().getConstructor().newInstance());
client = mock.createClient(a.kubernetesClientBuilderCustomizer().getConstructor().newInstance());
} catch (Exception e) {
throw new IllegalArgumentException("The provided kubernetesClientBuilder is invalid", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.function.Consumer;

import static org.assertj.core.api.Assertions.assertThat;

@EnableKubernetesMockClient(crud = true, kubernetesClientBuilder = KubernetesMockServerExtensionKubernetesClientBuilderTest.CustomSerialization.class)
@EnableKubernetesMockClient(crud = true, kubernetesClientBuilderCustomizer = KubernetesMockServerExtensionKubernetesClientBuilderTest.CustomSerialization.class)
class KubernetesMockServerExtensionKubernetesClientBuilderTest {

KubernetesClient client;
Expand All @@ -51,14 +52,13 @@ void usesCustomMapper() {
.isNotNull();
}

public static final class CustomSerialization extends KubernetesMockClientKubernetesClientBuilder {
public static final class CustomSerialization implements Consumer<KubernetesClientBuilder> {

@Override
public KubernetesClientBuilder apply(String url) {
final KubernetesClientBuilder kubernetesClientBuilder = super.apply(url);
public void accept(KubernetesClientBuilder builder) {
final ObjectMapper customMapper = new ObjectMapper();
customMapper.addMixIn(ObjectMeta.class, ObjectMetaMixin.class);
kubernetesClientBuilder.withKubernetesSerialization(new KubernetesSerialization(customMapper, true));
return kubernetesClientBuilder;
builder.withKubernetesSerialization(new KubernetesSerialization(customMapper, true));
}

private static final class ObjectMetaMixin {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public String[] getRootPaths() {
return new String[] { "/api", "/oapi" };
}

@SuppressWarnings("java:S2095")
public NamespacedOpenShiftClient createOpenShiftClient() {
final NamespacedOpenShiftClient client = createClient().adapt(NamespacedOpenShiftClient.class);
((OpenShiftConfig) client.getConfiguration()).setDisableApiGroupCheck(disableApiGroupCheck);
Expand Down

0 comments on commit 94c729b

Please sign in to comment.