Skip to content

Commit

Permalink
[JBWS-4382]:Improve the kuberentes tests common utilities
Browse files Browse the repository at this point in the history
  • Loading branch information
jimma committed Sep 8, 2023
1 parent ed08efe commit 7757c86
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 25 deletions.
Expand Up @@ -22,6 +22,7 @@
import java.net.URL;
import javax.xml.namespace.QName;
import org.jboss.test.ws.jaxws.container.Endpoint;
import org.jboss.ws.cloud.test.InjectKubeClient;
import org.jboss.ws.cloud.test.JBossWSKubernetesIntegrationTest;
import org.jboss.ws.cloud.test.JBossWSKubernetesTest;
import org.junit.jupiter.api.Assertions;
Expand All @@ -45,13 +46,13 @@ public class EndpointTestCase extends JBossWSKubernetesTest {

private static final String APP_NAME = "jbossws-cxf-k8s-basic";
@Test
public void checkWSEndpoint() throws Exception {
List<Pod> lst = getKubeClient().pods().withLabel("app.kubernetes.io/name", APP_NAME).list().getItems();
public void checkWSEndpoint(@InjectKubeClient KubernetesClient kubeClient) throws Exception {
List<Pod> lst = kubeClient.pods().withLabel("app.kubernetes.io/name", APP_NAME).list().getItems();
Assertions.assertEquals(1, lst.size(), "More than one pod found with expected label " + lst);
Pod first = lst.get(0);
Assertions.assertNotNull(first, "pod isn't created");
Assertions.assertEquals("Running", first.getStatus().getPhase(), "Pod isn't running");
LocalPortForward p = getKubeClient().services().withName(APP_NAME).portForward(8080);
LocalPortForward p = kubeClient.services().withName(APP_NAME).portForward(8080);
Assertions.assertTrue(p.isAlive());
URL baseURL = new URL("http://localhost:" + p.getLocalPort() + "/" + APP_NAME + "/EndpointImpl");
Endpoint endpoint = initPort(baseURL);
Expand Down
@@ -0,0 +1,12 @@
package org.jboss.ws.cloud.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectKubeClient {

}
Expand Up @@ -18,18 +18,29 @@
*/
package org.jboss.ws.cloud.test;

import io.dekorate.testing.kubernetes.KubernetesExtension;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolutionException;
import org.junit.jupiter.api.extension.ParameterResolver;
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
import org.junit.platform.commons.support.AnnotationSupport;

public class JBossWSKubernetesExtension extends KubernetesExtension {
public class JBossWSKubernetesExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, ParameterResolver {
private final ExtensionContext.Namespace JBOSSWS = ExtensionContext.Namespace.create(JBossWSKubernetesExtension.class);
private final String KUBECLIENT = "kubeclient";
public JBossWSKubernetesIntegrationTestConfig getIntegrationTestConfig(ExtensionContext context) {
// Override the super class method so we can use our own configuration
return context.getElement()
Expand All @@ -48,7 +59,33 @@ public void afterAll(ExtensionContext context) {
JBossWSKubernetesIntegrationTestConfig config = getIntegrationTestConfig(context);
deleteK8sResources(context,config);
}
public void postProcessTestInstance(Object test, ExtensionContext context) {
List<Field> annotatedFields = AnnotationSupport.findAnnotatedFields(context.getRequiredTestClass() , InjectKubeClient.class);
annotatedFields.stream().filter(field -> !field.isSynthetic())
.forEach(field -> {injectKubernetesClient(context, test, field);});
}

public void injectKubernetesClient(ExtensionContext context, Object test, Field field) {
if (field.getType().isAssignableFrom(KubernetesClient.class)) {
field.setAccessible(true);
try {
field.set(test, this.getKubernetesClient(context));
} catch (IllegalAccessException var) {
//TODO: handle this exception
}
}

}
KubernetesClient getKubernetesClient(ExtensionContext context) {
Object client = context.getStore(JBOSSWS).get(KUBECLIENT);
if (client == null) {
KubernetesClient kubeclient = (new KubernetesClientBuilder()).build();
context.getStore(JBOSSWS).put(KUBECLIENT, kubeclient);
return kubeclient;
} else {
return (KubernetesClient)client;
}
}

private void createK8sResources(ExtensionContext context, JBossWSKubernetesIntegrationTestConfig config) {
if (config.getKuberentesResource().isEmpty()) {
Expand Down Expand Up @@ -88,4 +125,14 @@ private InputStream getInputStream(String resource) throws IOException {
}
}
}

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType() == KubernetesClient.class && parameterContext.isAnnotated(InjectKubeClient.class);
}

@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return getKubernetesClient(extensionContext);
}
}
Expand Up @@ -31,10 +31,6 @@
@Retention(RUNTIME)
@ExtendWith(JBossWSKubernetesExtension.class)
public @interface JBossWSKubernetesIntegrationTest {
boolean deployEnabled() default false;
boolean buildEnabled() default false;
long readinessTimeout() default 500000;
String[] additionalModules() default {};
String kubernetesResource() default "";
}

Expand Up @@ -18,23 +18,15 @@
*/
package org.jboss.ws.cloud.test;

import io.dekorate.testing.config.EditableKubernetesIntegrationTestConfig;

public class JBossWSKubernetesIntegrationTestConfig extends EditableKubernetesIntegrationTestConfig {
public class JBossWSKubernetesIntegrationTestConfig {

private String resource;
private JBossWSKubernetesIntegrationTestConfig(boolean deployEnabled, boolean buildEnabled, long readinessTimeout,
String[] additionalModules, String resource){
super(deployEnabled, buildEnabled, readinessTimeout, additionalModules);
private JBossWSKubernetesIntegrationTestConfig( String resource){
this.resource = resource;
}

static JBossWSKubernetesIntegrationTestConfig create(JBossWSKubernetesIntegrationTest annotation) {
return new JBossWSKubernetesIntegrationTestConfig(
annotation.deployEnabled(),
annotation.buildEnabled(),
annotation.readinessTimeout(),
annotation.additionalModules(),
annotation.kubernetesResource());
}

Expand Down
Expand Up @@ -18,7 +18,6 @@
*/
package org.jboss.ws.cloud.test;

import io.dekorate.testing.annotation.Inject;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.LocalPortForward;
import io.restassured.RestAssured;
Expand All @@ -31,7 +30,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;

public class JBossWSKubernetesTest implements JBossWSServerContainer {
@Inject
@InjectKubeClient
private KubernetesClient kubeClient;

@BeforeEach
Expand Down Expand Up @@ -74,8 +73,4 @@ public static boolean waitWFLYReady(KubernetesClient k8sClient, String container
}
return false;
}

public KubernetesClient getKubeClient() {
return this.kubeClient;
}
}

0 comments on commit 7757c86

Please sign in to comment.