Skip to content

Commit 155cb16

Browse files
committed
[issues-93] - WildFLy + remote Infinispan distributed timers test
1 parent bead963 commit 155cb16

12 files changed

+1239
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@
1414
/testsuite/wildfly-web-cache-offload-infinispan/target/
1515
/testsuite/wildfly-web-cache-offload-infinispan/tmp/
1616
/testsuite/intersmash-tests-testsuite.iml
17+
/testsuite/log/

testsuite/src/test/java/org/jboss/intersmash/tests/wildfly/web/cache/offload/infinispan/Infinispan2ReplicasService.java renamed to testsuite/src/test/java/org/jboss/intersmash/tests/infinispan/Infinispan2ReplicasService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.jboss.intersmash.tests.wildfly.web.cache.offload.infinispan;
16+
package org.jboss.intersmash.tests.infinispan;
1717

1818
import io.fabric8.kubernetes.api.model.Secret;
1919
import io.fabric8.kubernetes.api.model.SecretBuilder;
@@ -28,7 +28,6 @@
2828
import org.infinispan.v2alpha1.Cache;
2929
import org.jboss.intersmash.application.openshift.OpenShiftApplication;
3030
import org.jboss.intersmash.application.operator.InfinispanOperatorApplication;
31-
import org.jboss.intersmash.tests.wildfly.web.cache.offload.infinispan.util.InfinispanSecretUtils;
3231

3332
/**
3433
* Application descriptor that represents an Infinispan/Red Hat Data Grid service deployed by the related Operator, and

testsuite/src/test/java/org/jboss/intersmash/tests/wildfly/web/cache/offload/infinispan/util/InfinispanSecretUtils.java renamed to testsuite/src/test/java/org/jboss/intersmash/tests/infinispan/InfinispanSecretUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package org.jboss.intersmash.tests.wildfly.web.cache.offload.infinispan.util;
16+
package org.jboss.intersmash.tests.infinispan;
1717

1818
import java.io.ByteArrayOutputStream;
1919
import java.io.IOException;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.jboss.intersmash.tests.wildfly.distributed.timers.infinispan;
2+
3+
import java.io.IOException;
4+
import java.util.Base64;
5+
import java.util.Collections;
6+
import java.util.Map;
7+
8+
import cz.xtf.core.openshift.OpenShifts;
9+
import io.fabric8.kubernetes.api.model.ObjectMetaBuilder;
10+
import io.fabric8.kubernetes.api.model.Secret;
11+
import org.apache.commons.io.FileUtils;
12+
import org.infinispan.v1.InfinispanBuilder;
13+
import org.infinispan.v1.infinispanspec.Expose;
14+
import org.infinispan.v1.infinispanspec.security.EndpointEncryption;
15+
import org.infinispan.v1.infinispanspec.security.EndpointEncryptionBuilder;
16+
import org.jboss.intersmash.application.openshift.OpenShiftApplication;
17+
import org.jboss.intersmash.tests.infinispan.Infinispan2ReplicasService;
18+
import org.jboss.intersmash.util.CommandLineBasedKeystoreGenerator;
19+
20+
/**
21+
* An Infinispan basic service, which is supposed to be provisioned by
22+
* {@link org.jboss.intersmash.provision.openshift.InfinispanOpenShiftOperatorProvisioner}
23+
*
24+
* This class extends {@link @Infinispan2ReplicasService} in order to configure the Infinispan CR with a
25+
* route that exposes the service and allows for consuming the REST APIs to perform test assertions.
26+
*/
27+
public class InfinispanOperatorWithExternalRouteApplication extends Infinispan2ReplicasService
28+
implements OpenShiftApplication {
29+
30+
public InfinispanOperatorWithExternalRouteApplication() throws IOException {
31+
32+
// Here we're crating a Secret that holds the certificates needed to secure the communication with
33+
// Infinispan/Red Hat Data Grid service
34+
final String hostName = OpenShifts.master().generateHostname(INFINISPAN_APP_NAME);
35+
final CommandLineBasedKeystoreGenerator.GeneratedPaths certPaths = CommandLineBasedKeystoreGenerator
36+
.generateCerts(hostName);
37+
Secret tlsSecret = new io.fabric8.kubernetes.api.model.SecretBuilder()
38+
.withNewMetadata()
39+
.withName(TLS_SECRET_NAME)
40+
.withLabels(Collections.singletonMap("app", INFINISPAN_APP_NAME))
41+
.endMetadata()
42+
.addToData(Map.of("tls.crt",
43+
Base64.getEncoder().encodeToString(FileUtils.readFileToByteArray(certPaths.certPem.toFile()))))
44+
.addToData(Map.of("tls.key",
45+
Base64.getEncoder().encodeToString(FileUtils.readFileToByteArray(certPaths.keyPem.toFile()))))
46+
.build();
47+
secrets.add(tlsSecret);
48+
49+
// https://access.redhat.com/documentation/en-us/red_hat_data_grid/8.1/html/running_data_grid_on_openshift/start_operator#minimal_crd-start
50+
// Override parent class Infinispan instance definition
51+
infinispan = new InfinispanBuilder()
52+
.withMetadata(new ObjectMetaBuilder()
53+
.withName(this.getName())
54+
.withLabels(Map.of("app", "datagrid"))
55+
.build())
56+
.withNewSpec()
57+
.withReplicas(2)
58+
.withNewSecurity()
59+
// The superclass sets the secret for Infinispan/Red Hat Data Grid identities credentials,
60+
// and we'll reuse it here
61+
.withEndpointSecretName(INFINISPAN_CUSTOM_CREDENTIALS_SECRET_NAME)
62+
.withEndpointEncryption(new EndpointEncryptionBuilder()
63+
.withCertSecretName(TLS_SECRET_NAME)
64+
.withType(EndpointEncryption.Type.Secret)
65+
.build())
66+
.endSecurity()
67+
.withNewExpose().withType(Expose.Type.Route).endExpose()
68+
.endSpec().build();
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.jboss.intersmash.tests.wildfly.distributed.timers.infinispan;
2+
3+
import java.util.Collections;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import org.jboss.intersmash.application.openshift.PostgreSQLTemplateOpenShiftApplication;
8+
import org.jboss.intersmash.application.openshift.template.PostgreSQLTemplate;
9+
10+
/**
11+
* Deploy the PostgreSQL database using the {@link PostgreSQLTemplate#POSTGRESQL_EPHEMERAL} template to implement
12+
* the persistence store holding distributed timers expirations.
13+
* Uses the template default parameters.
14+
*/
15+
public class PostgresqlTimerExpirationStoreApplication implements PostgreSQLTemplateOpenShiftApplication {
16+
17+
public static final String POSTGRESQL_NAME = "postgresql";
18+
19+
private final Map<String, String> parameters = new HashMap<>();
20+
21+
public PostgresqlTimerExpirationStoreApplication() {
22+
parameters.put("POSTGRESQL_USER", "theUser");
23+
parameters.put("POSTGRESQL_PASSWORD", "thePassword");
24+
parameters.put("POSTGRESQL_DATABASE", "theData");
25+
}
26+
27+
@Override
28+
public PostgreSQLTemplate getTemplate() {
29+
return PostgreSQLTemplate.POSTGRESQL_EPHEMERAL;
30+
}
31+
32+
@Override
33+
public String getName() {
34+
return POSTGRESQL_NAME;
35+
}
36+
37+
@Override
38+
public Map<String, String> getParameters() {
39+
return Collections.unmodifiableMap(parameters);
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package org.jboss.intersmash.tests.wildfly.distributed.timers.infinispan;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
8+
import com.google.common.base.Strings;
9+
import org.jboss.intersmash.IntersmashConfig;
10+
import org.jboss.intersmash.application.input.BuildInput;
11+
import org.jboss.intersmash.application.input.BuildInputBuilder;
12+
import org.jboss.intersmash.application.openshift.WildflyImageOpenShiftApplication;
13+
import org.jboss.intersmash.tests.wildfly.WildflyApplicationConfiguration;
14+
import org.jboss.intersmash.util.CommandLineBasedKeystoreGenerator;
15+
16+
import cz.xtf.builder.builders.SecretBuilder;
17+
import cz.xtf.core.openshift.OpenShifts;
18+
import io.fabric8.kubernetes.api.model.EnvVar;
19+
import io.fabric8.kubernetes.api.model.EnvVarBuilder;
20+
import io.fabric8.kubernetes.api.model.Secret;
21+
22+
/**
23+
* Set up a WildFly/JBoss EAP 8 application that starts a configured server, which configures Infinispan distributed
24+
* timers on a remote Infinispan cluster.
25+
*/
26+
public class WildFlyDistributedTimersApplication
27+
implements WildflyImageOpenShiftApplication, WildflyApplicationConfiguration {
28+
29+
public static final String NAME = "distributed-ejb-timers";
30+
private final BuildInput buildInput;
31+
final String applicationDir = "wildfly/distributed-timers-infinispan";
32+
private final List<EnvVar> environmentVariables = new ArrayList<>();
33+
private final List<Secret> secrets = new ArrayList<>();
34+
35+
public WildFlyDistributedTimersApplication() throws IOException {
36+
37+
final String truststorePassword = CommandLineBasedKeystoreGenerator.getPassword();
38+
// Set up client OpenShift secret for SSL
39+
secrets.add(new SecretBuilder("infinispan-client-secret")
40+
.addData("truststore.jks", CommandLineBasedKeystoreGenerator.getTruststore())
41+
.addRawData("trustStorePassword", truststorePassword)
42+
.build());
43+
44+
// Set the build input
45+
buildInput = new BuildInputBuilder()
46+
.uri(IntersmashConfig.deploymentsRepositoryUrl())
47+
.ref(IntersmashConfig.deploymentsRepositoryRef())
48+
.build();
49+
50+
// configure KUBE_PING, an invalidation-cache requires a functioning JGroups cluster.
51+
environmentVariables.add(new EnvVarBuilder()
52+
.withName("KUBERNETES_NAMESPACE")
53+
.withValue(OpenShifts.master().getNamespace())
54+
.build());
55+
56+
// set up environment variables
57+
environmentVariables.add(new EnvVarBuilder()
58+
.withName("JDG_HOST")
59+
.withValue("$(RHDG_SERVICE_HOST)")
60+
.build());
61+
environmentVariables.add(new EnvVarBuilder()
62+
.withName("JDG_PORT")
63+
.withValue("$(RHDG_SERVICE_PORT)")
64+
.build());
65+
environmentVariables.add(new EnvVarBuilder()
66+
.withName("TRUSTSTORE_PASSWORD")
67+
.withValue(truststorePassword)
68+
.build());
69+
70+
// credentials from Infinispan/Red Hat Data Grid custom secret
71+
environmentVariables.add(new EnvVarBuilder()
72+
.withName("CACHE_USERNAME")
73+
.withValue(InfinispanOperatorWithExternalRouteApplication.INFINISPAN_CUSTOM_CREDENTIALS_USERNAME)
74+
.build());
75+
environmentVariables.add(new EnvVarBuilder()
76+
.withName("CACHE_PASSWORD")
77+
.withValue(InfinispanOperatorWithExternalRouteApplication.INFINISPAN_CUSTOM_CREDENTIALS_PASSWORD)
78+
.build());
79+
environmentVariables.add(new EnvVarBuilder()
80+
.withName("TIMER_EXPIRATION_API_BASE_URL")
81+
.withValue("http://timer-expiration-store:8080").build());
82+
83+
// More env vars
84+
// TODO: this appears in many application descriptors that implement WildflyImageOpenShiftApplication and
85+
// WildflyApplicationConfiguration, therefore it might be refactored into a unique interface method
86+
environmentVariables.add(
87+
new EnvVarBuilder().withName("MAVEN_S2I_ARTIFACT_DIRS")
88+
.withValue(applicationDir + "/target")
89+
.build());
90+
91+
String mavenAdditionalArgs = generateAdditionalMavenArgs()
92+
.concat(" -pl " + applicationDir + " -am");
93+
94+
final String mavenMirrorUrl = this.getMavenMirrorUrl();
95+
if (!Strings.isNullOrEmpty(mavenMirrorUrl)) {
96+
environmentVariables.add(
97+
new EnvVarBuilder().withName("MAVEN_MIRROR_URL")
98+
.withValue(mavenMirrorUrl)
99+
.build());
100+
mavenAdditionalArgs = mavenAdditionalArgs.concat(" -Dinsecure.repositories=WARN");
101+
}
102+
103+
environmentVariables.add(
104+
new EnvVarBuilder().withName("MAVEN_ARGS_APPEND")
105+
.withValue(mavenAdditionalArgs)
106+
.build());
107+
108+
environmentVariables.add(new EnvVarBuilder()
109+
.withName("SCRIPT_DEBUG").withValue(IntersmashConfig.scriptDebug()).build());
110+
}
111+
112+
@Override
113+
public String getName() {
114+
return NAME;
115+
}
116+
117+
@Override
118+
public BuildInput getBuildInput() {
119+
return buildInput;
120+
}
121+
122+
@Override
123+
public List<EnvVar> getEnvVars() {
124+
return Collections.unmodifiableList(environmentVariables);
125+
}
126+
127+
@Override
128+
public List<Secret> getSecrets() {
129+
return secrets;
130+
}
131+
}

0 commit comments

Comments
 (0)