From 3b7752f30e8e1de60fb8d5218870ed48df6120ae Mon Sep 17 00:00:00 2001 From: Fabio Burzigotti Date: Thu, 2 Nov 2023 13:04:00 +0100 Subject: [PATCH 1/2] [issue 80] - Adding a new shared deployments module for EAP 7 and an eap7-helloworld shared deployment --- .../eap7-helloworld/pom.xml | 48 ++++++++++++++ .../quickstarts/helloworld/HelloService.java | 31 ++++++++++ .../helloworld/HelloWorldServlet.java | 62 +++++++++++++++++++ .../src/main/webapp/WEB-INF/beans.xml | 22 +++++++ .../src/main/webapp/index.html | 23 +++++++ .../pom.xml | 45 ++++++++++++++ .../intersmash-deployments-shared/pom.xml | 1 + 7 files changed, 232 insertions(+) create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/pom.xml create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloService.java create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/WEB-INF/beans.xml create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/index.html create mode 100644 deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/pom.xml diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/pom.xml b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/pom.xml new file mode 100644 index 000000000..5c68d6d1d --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + + org.jboss.intersmash + intersmash-deployments-shared-eap7 + 0.0.1-SNAPSHOT + ../pom.xml + + + eap7-helloworld + war + + Intersmash Shared Deployments (EAP 7): Hello World Quickstart + + + ${project.parent.parent.parent.parent.basedir}/ide-config + + + + + + jakarta.inject + jakarta.inject-api + provided + + + + org.jboss.spec.javax.servlet + jboss-servlet-api_4.0_spec + provided + + + + + + + org.apache.maven.plugins + maven-war-plugin + + ROOT + + + + + diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloService.java b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloService.java new file mode 100644 index 000000000..13d44f1e7 --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloService.java @@ -0,0 +1,31 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2015, Red Hat, Inc. and/or its affiliates, and individual + * contributors by the @authors tag. See the copyright.txt in the + * distribution for a full listing of individual contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jboss.as.quickstarts.helloworld; + +/** + * A simple CDI service which is able to say hello to someone + * + * @author Pete Muir + * + */ +public class HelloService { + + String createHelloMessage(String name) { + return "Hello " + name + "!"; + } + +} diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java new file mode 100644 index 000000000..5942cfb9e --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/java/org/jboss/as/quickstarts/helloworld/HelloWorldServlet.java @@ -0,0 +1,62 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2015, Red Hat, Inc. and/or its affiliates, and individual + * contributors by the @authors tag. See the copyright.txt in the + * distribution for a full listing of individual contributors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jboss.as.quickstarts.helloworld; + +import java.io.IOException; +import java.io.PrintWriter; + +import javax.inject.Inject; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + *

+ * A simple servlet taking advantage of features added in 3.0. + *

+ * + *

+ * The servlet is registered and mapped to /HelloServlet using the {@linkplain WebServlet + * @HttpServlet}. The {@link HelloService} is injected by CDI. + *

+ * + * @author Pete Muir + * + */ +@SuppressWarnings("serial") +@WebServlet("/HelloWorld") +public class HelloWorldServlet extends HttpServlet { + + static String PAGE_HEADER = "helloworld"; + + static String PAGE_FOOTER = ""; + + @Inject + HelloService helloService; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setContentType("text/html"); + PrintWriter writer = resp.getWriter(); + writer.println(PAGE_HEADER); + writer.println("

" + helloService.createHelloMessage("World") + "

"); + writer.println(PAGE_FOOTER); + writer.close(); + } + +} diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/WEB-INF/beans.xml b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 000000000..1b3cc6c0e --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/index.html b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/index.html new file mode 100644 index 000000000..8e59c00ac --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld/src/main/webapp/index.html @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/pom.xml b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/pom.xml new file mode 100644 index 000000000..ebe9923e0 --- /dev/null +++ b/deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + org.jboss.intersmash + intersmash-deployments-shared + 0.0.1-SNAPSHOT + + pom + intersmash-deployments-shared-eap7 + + Intersmash Shared Deployments: EAP 7 aggregator + + + + 1.8 + 1.8 + UTF-8 + + 7.4.13.GA + + org.jboss.bom + jboss-eap-jakartaee8 + ${jboss-eap7.version} + + + + eap7-helloworld + + + + + + + ${bom.jboss-eap7-jakartaee.groupId} + ${bom.jboss-eap7jakartaee.artifactId} + ${bom.jboss-eap7-jakartaee.version} + pom + import + + + + \ No newline at end of file diff --git a/deployments/intersmash-deployments-shared/pom.xml b/deployments/intersmash-deployments-shared/pom.xml index e131de3e6..234dcefff 100644 --- a/deployments/intersmash-deployments-shared/pom.xml +++ b/deployments/intersmash-deployments-shared/pom.xml @@ -22,6 +22,7 @@ intersmash-deployments-shared-wildfly + intersmash-deployments-shared-eap7 From 5928b3b1eff957834acee3997ddbae30da4ae485 Mon Sep 17 00:00:00 2001 From: Fabio Burzigotti Date: Thu, 2 Nov 2023 13:11:06 +0100 Subject: [PATCH 2/2] [issue 80] - Adding the EAP 7 legacy s2i template-based build provisioner --- README.md | 33 ++--- .../NotForCommunityExecutionProfile.java | 3 +- .../OpenShiftProvisionerTestBase.java | 48 +++++++ .../openshift/ProvisionerCleanupTestCase.java | 30 +++++ ...ap7LegacyS2iBuildTemplateApplication.java} | 12 +- ...Eap7LegacyS2iBuildTemplateProvisioner.java | 118 ++++++++++++++++++ ...acyS2iBuildTemplateProvisionerFactory.java | 18 +++ .../provision/ProvisionerManagerTestCase.java | 15 ++- 8 files changed, 255 insertions(+), 22 deletions(-) rename tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/{WildflyLegacyS2iBuildTemplateApplication.java => Eap7LegacyS2iBuildTemplateApplication.java} (80%) create mode 100644 tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisioner.java create mode 100644 tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisionerFactory.java diff --git a/README.md b/README.md index 6d3722fa8..3530986fd 100644 --- a/README.md +++ b/README.md @@ -245,22 +245,23 @@ public class PostgresqlProvisionTest { Mapping of implemented provisioners: -| Service | Supports community project | Supports product | Application | Provisioner | Notes | -|:--------------------------------------|:---------------------------|:-------------------|:-------------------------------------|:--------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| ActiveMQ Artemis & Red Hat AMQ Broker | :heavy_check_mark: | :heavy_check_mark: | ActiveMQOperatorApplication | ActiveMQOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | -| HyperFoil | :heavy_check_mark: | :x: | HyperfoilOperatorApplication | HyperfoilOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | -| Infinispan & Red Hat DataGrid | :heavy_check_mark: | :heavy_check_mark: | InfinispanOperatorApplication | InfinispanOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | -| Kafka & Red Hat AMQ Streams | :heavy_check_mark: | :heavy_check_mark: | KafkaOperatorApplication | KafkaOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | -| Keycloak | :heavy_check_mark: | :x: | KeycloakOperatorApplication | KeycloakOperatorProvisioner | Based on the latest Quarkus based Keycloak Operator, doesn't provide stable CRDs yet (see https://www.keycloak.org/2022/09/operator-crs); this operator offers a solution which supports the `Keycloak` and `KeycloakRealmImport` Custom Resources: these are the only supported CRs at the time of writing. See details [below](#operator-based-provisioning) | -| MySQL | :heavy_check_mark: | :x: | MysqlImageOpenShiftApplication | MysqlImageOpenShiftProvisioner | Deploys a MySQL image and sets environment variables to configure the service (ports, credentials etc.) | -| PostgreSQL | :heavy_check_mark: | :x: | PostgreSQLImageOpenShiftApplication | PostgreSQLImageOpenShiftProvisioner | Deploys a PostgreSQL image and sets environment variables to configure the service (ports, credentials etc.) | -| Wildfly & Red Hat JBoss EAP XP | :heavy_check_mark: | :heavy_check_mark: | BootableJarOpenShiftApplication | WildflyBootableJarImageOpenShiftProvisioner | Deploys a WildFly Bootable JAR, i.e. a runnable WildFly application | -| Wildfly & Red Hat JBoss EAP 8 | :heavy_check_mark: | :heavy_check_mark: | WildflyImageOpenShiftApplication | WildflyImageOpenShiftProvisioner | Available both for Git sources and binary based s2i v2 build (either a pre-built deployment or a filesystem resource like a Maven project folder) | -| Wildfly & Red Hat JBoss EAP 8 | :heavy_check_mark: | :heavy_check_mark: | WildflyHelmChartOpenShiftApplication | WildflyHelmChartOpenShiftProvisioner | The `wildfly-2.3.2` tag of https://github.com/wildfly/wildfly-charts is used and the model is generated based on the https://raw.githubusercontent.com/wildfly/wildfly-charts/main/charts/wildfly/values.schema.json value schema file | -| Wildfly & Red Hat JBoss EAP 7/8 | :heavy_check_mark: | :heavy_check_mark: | WildflyOperatorApplication | WildflyOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | -| Red Hat JBoss EAP 7 | :x: | :heavy_check_mark: | Eap7ImageOpenShiftApplication | Eap7ImageOpenShiftProvisioner | Available both for Git sources and binary based EAP 7 s2i (legacy) build, i.e. based on a pre-built deployment (i.e. a _WAR archive_) | -| Red Hat JBoss EAP 7 | :x: | :heavy_check_mark: | Eap7TemplateOpenShiftApplication | Eap7TemplateOpenShiftProvisioner | Available Git sources and template based EAP 7 s2i (legacy) build | -| Red Hat SSO 7 | :x: | :heavy_check_mark: | RhSsoOperatorApplication | RhSsoOperatorProvisioner | Based on the archived Keycloak operator project, which contains the latest Red Hat SSO 7.z CRDs definitions, see details [below](#operator-based-provisioning) | +| Service | Supports community project | Supports product | Application | Provisioner | Notes | +|:--------------------------------------|:---------------------------|:-------------------|:--------------------------------------|:--------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ActiveMQ Artemis & Red Hat AMQ Broker | :heavy_check_mark: | :heavy_check_mark: | ActiveMQOperatorApplication | ActiveMQOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | +| HyperFoil | :heavy_check_mark: | :x: | HyperfoilOperatorApplication | HyperfoilOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | +| Infinispan & Red Hat DataGrid | :heavy_check_mark: | :heavy_check_mark: | InfinispanOperatorApplication | InfinispanOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | +| Kafka & Red Hat AMQ Streams | :heavy_check_mark: | :heavy_check_mark: | KafkaOperatorApplication | KafkaOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | +| Keycloak | :heavy_check_mark: | :x: | KeycloakOperatorApplication | KeycloakOperatorProvisioner | Based on the latest Quarkus based Keycloak Operator, doesn't provide stable CRDs yet (see https://www.keycloak.org/2022/09/operator-crs); this operator offers a solution which supports the `Keycloak` and `KeycloakRealmImport` Custom Resources: these are the only supported CRs at the time of writing. See details [below](#operator-based-provisioning) | +| MySQL | :heavy_check_mark: | :x: | MysqlImageOpenShiftApplication | MysqlImageOpenShiftProvisioner | Deploys a MySQL image and sets environment variables to configure the service (ports, credentials etc.) | +| PostgreSQL | :heavy_check_mark: | :x: | PostgreSQLImageOpenShiftApplication | PostgreSQLImageOpenShiftProvisioner | Deploys a PostgreSQL image and sets environment variables to configure the service (ports, credentials etc.) | +| Wildfly & Red Hat JBoss EAP XP | :heavy_check_mark: | :heavy_check_mark: | BootableJarOpenShiftApplication | WildflyBootableJarImageOpenShiftProvisioner | Deploys a WildFly Bootable JAR, i.e. a runnable WildFly application | +| Wildfly & Red Hat JBoss EAP 8 | :heavy_check_mark: | :heavy_check_mark: | WildflyImageOpenShiftApplication | WildflyImageOpenShiftProvisioner | Available both for Git sources and binary based s2i v2 build (either a pre-built deployment or a filesystem resource like a Maven project folder) | +| Wildfly & Red Hat JBoss EAP 8 | :heavy_check_mark: | :heavy_check_mark: | WildflyHelmChartOpenShiftApplication | WildflyHelmChartOpenShiftProvisioner | The `wildfly-2.3.2` tag of https://github.com/wildfly/wildfly-charts is used and the model is generated based on the https://raw.githubusercontent.com/wildfly/wildfly-charts/main/charts/wildfly/values.schema.json value schema file | +| Wildfly & Red Hat JBoss EAP 7/8 | :heavy_check_mark: | :heavy_check_mark: | WildflyOperatorApplication | WildflyOperatorProvisioner | Operator based provisioner, see details [below](#operator-based-provisioning) | +| Red Hat JBoss EAP 7 | :x: | :heavy_check_mark: | Eap7ImageOpenShiftApplication | Eap7ImageOpenShiftProvisioner | Available both for Git sources and binary based EAP 7 s2i (legacy) build, i.e. based on a pre-built deployment (i.e. a _WAR archive_) | +| Red Hat JBoss EAP 7 | :x: | :heavy_check_mark: | Eap7TemplateOpenShiftApplication | Eap7TemplateOpenShiftProvisioner | Available Git sources and template based EAP 7 s2i (legacy) build | +| Red Hat JBoss EAP 7 | :x: | :heavy_check_mark: | Eap7LegacyS2iBuildTemplateApplication | Eap7LegacyS2iBuildTemplateProvisioner | Git based EAP 7 s2i (legacy) build, used to generate image streams that can be deployed by WildflyOperatorProvisioner | +| Red Hat SSO 7 | :x: | :heavy_check_mark: | RhSsoOperatorApplication | RhSsoOperatorProvisioner | Based on the archived Keycloak operator project, which contains the latest Red Hat SSO 7.z CRDs definitions, see details [below](#operator-based-provisioning) | The only thing users have to take care of is to implement the correct `Application` (see the table above) interface and diff --git a/testsuite/src/main/java/org/jboss/intersmash/testsuite/junit5/categories/NotForCommunityExecutionProfile.java b/testsuite/src/main/java/org/jboss/intersmash/testsuite/junit5/categories/NotForCommunityExecutionProfile.java index ad999b672..bc01a8cbf 100644 --- a/testsuite/src/main/java/org/jboss/intersmash/testsuite/junit5/categories/NotForCommunityExecutionProfile.java +++ b/testsuite/src/main/java/org/jboss/intersmash/testsuite/junit5/categories/NotForCommunityExecutionProfile.java @@ -15,6 +15,7 @@ */ package org.jboss.intersmash.testsuite.junit5.categories; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -27,6 +28,6 @@ */ @Tag("ts.not-for-community") @Retention(RetentionPolicy.RUNTIME) -@Target({ java.lang.annotation.ElementType.TYPE }) +@Target({ java.lang.annotation.ElementType.TYPE, ElementType.METHOD }) public @interface NotForCommunityExecutionProfile { } diff --git a/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/OpenShiftProvisionerTestBase.java b/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/OpenShiftProvisionerTestBase.java index b0d7c8a00..f4d1e26c1 100644 --- a/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/OpenShiftProvisionerTestBase.java +++ b/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/OpenShiftProvisionerTestBase.java @@ -33,6 +33,7 @@ import org.jboss.intersmash.tools.IntersmashConfig; import org.jboss.intersmash.tools.application.openshift.BootableJarOpenShiftApplication; import org.jboss.intersmash.tools.application.openshift.Eap7ImageOpenShiftApplication; +import org.jboss.intersmash.tools.application.openshift.Eap7LegacyS2iBuildTemplateApplication; import org.jboss.intersmash.tools.application.openshift.Eap7TemplateOpenShiftApplication; import org.jboss.intersmash.tools.application.openshift.KafkaOperatorApplication; import org.jboss.intersmash.tools.application.openshift.MysqlImageOpenShiftApplication; @@ -42,10 +43,12 @@ import org.jboss.intersmash.tools.application.openshift.input.BuildInput; import org.jboss.intersmash.tools.application.openshift.input.BuildInputBuilder; import org.jboss.intersmash.tools.application.openshift.template.Eap7Template; +import org.jboss.intersmash.tools.util.openshift.WildflyOpenShiftUtils; import org.jboss.intersmash.tools.util.wildfly.Eap7CliScriptBuilder; import cz.xtf.builder.builders.SecretBuilder; import cz.xtf.builder.builders.secret.SecretType; +import cz.xtf.core.config.OpenShiftConfig; import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.Secret; @@ -118,6 +121,51 @@ public String getName() { }; } + public static Eap7LegacyS2iBuildTemplateApplication getEap7LegacyS2iBuildTemplateApplication() { + return new Eap7LegacyS2iBuildTemplateApplication() { + private String eapImage; + private String eapRuntimeImage; + private final Map parameters; + private final List envVars; + + { + eapImage = WildflyOpenShiftUtils.importBuilderImage(IntersmashConfig.eap7ImageURL()).getMetadata().getName(); + eapRuntimeImage = WildflyOpenShiftUtils.importRuntimeImage(IntersmashConfig.eap7RuntimeImageUrl()).getMetadata() + .getName(); + String deployment = "deployments/intersmash-deployments-shared/intersmash-deployments-shared-eap7/eap7-helloworld"; + //params + parameters = new HashMap<>(); + parameters.put("APPLICATION_IMAGE", getName()); + parameters.put("EAP_IMAGE", eapImage); + parameters.put("EAP_RUNTIME_IMAGE", eapRuntimeImage); + parameters.put("EAP_IMAGESTREAM_NAMESPACE", OpenShiftConfig.namespace()); + parameters.put("SOURCE_REPOSITORY_URL", IntersmashConfig.deploymentsRepositoryUrl()); + parameters.put("SOURCE_REPOSITORY_REF", IntersmashConfig.deploymentsRepositoryRef()); + parameters.put("ARTIFACT_DIR", deployment + "/target"); + + // envvars + envVars = new ArrayList<>(); + // Set to allow cloning from Gitlab - any value here do the job + envVars.add(new EnvVarBuilder().withName("GIT_SSL_NO_VERIFY").withValue("").build()); + } + + @Override + public List getEnvVars() { + return envVars; + } + + @Override + public Map getParameters() { + return parameters; + } + + @Override + public String getName() { + return "eap-s2i-build-application"; + } + }; + } + static BootableJarOpenShiftApplication getWildflyBootableJarOpenShiftApplication() { return new BootableJarOpenShiftApplication() { @Override diff --git a/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/ProvisionerCleanupTestCase.java b/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/ProvisionerCleanupTestCase.java index b5f998faf..dc9911bb4 100644 --- a/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/ProvisionerCleanupTestCase.java +++ b/testsuite/src/test/java/org/jboss/intersmash/testsuite/provision/openshift/ProvisionerCleanupTestCase.java @@ -18,12 +18,15 @@ import java.util.stream.Stream; import org.jboss.intersmash.testsuite.IntersmashTestsuiteProperties; +import org.jboss.intersmash.testsuite.junit5.categories.NotForCommunityExecutionProfile; +import org.jboss.intersmash.tools.provision.openshift.Eap7LegacyS2iBuildTemplateProvisioner; import org.jboss.intersmash.tools.provision.openshift.MysqlImageOpenShiftProvisioner; import org.jboss.intersmash.tools.provision.openshift.OpenShiftProvisioner; import org.jboss.intersmash.tools.provision.openshift.PostgreSQLImageOpenShiftProvisioner; import org.jboss.intersmash.tools.provision.openshift.WildflyBootableJarImageOpenShiftProvisioner; import org.jboss.intersmash.tools.provision.openshift.WildflyImageOpenShiftProvisioner; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -80,4 +83,31 @@ public void testProvisioningWorkflowCleanup(OpenShiftProvisioner provisioner) { openShift.configMaps().withName("no-delete").delete(); openShift.waiters().isProjectClean().waitFor(); } + + /** + * EapS2iBuild application requires additional image streams to be created. CleanBeforeEach would delete it if the + * provisioner is initialized in {@link #provisionerProvider()}, so we need a separate test method. + */ + @Test + @NotForCommunityExecutionProfile + public void eap7LegacyS2iBuild() { + Eap7LegacyS2iBuildTemplateProvisioner provisioner = new Eap7LegacyS2iBuildTemplateProvisioner( + OpenShiftProvisionerTestBase.getEap7LegacyS2iBuildTemplateApplication()); + provisioner.preDeploy(); + provisioner.deploy(); + openShift.configMaps().create(new ConfigMapBuilder().withNewMetadata().withName("no-delete").endMetadata().build()); + provisioner.undeploy(); + provisioner.postUndeploy(); + Assertions.assertNotNull(openShift.configMaps().withName("no-delete").get()); + openShift.configMaps().withName("no-delete").delete(); + // delete the images streams created by EapS2iBuildTemplateApplication + openShift.imageStreams() + .withName(((String) provisioner.getApplication().getParameters().get("EAP_IMAGE")).split(":")[0]) + .delete(); + openShift.imageStreams() + .withName(((String) provisioner.getApplication().getParameters().get("EAP_RUNTIME_IMAGE")).split(":")[0]) + .delete(); + + openShift.waiters().isProjectClean().waitFor(); + } } diff --git a/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/WildflyLegacyS2iBuildTemplateApplication.java b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/Eap7LegacyS2iBuildTemplateApplication.java similarity index 80% rename from tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/WildflyLegacyS2iBuildTemplateApplication.java rename to tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/Eap7LegacyS2iBuildTemplateApplication.java index 1accef0a2..660cba5bb 100644 --- a/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/WildflyLegacyS2iBuildTemplateApplication.java +++ b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/application/openshift/Eap7LegacyS2iBuildTemplateApplication.java @@ -18,6 +18,7 @@ import java.util.Collections; import java.util.List; +import org.jboss.intersmash.tools.provision.openshift.Eap7LegacyS2iBuildTemplateProvisioner; import org.jboss.intersmash.tools.provision.openshift.template.OpenShiftTemplate; import io.fabric8.kubernetes.api.model.EnvVar; @@ -26,15 +27,18 @@ * End user Application interface which presents resources on OpenShift Container Platform created by deploying the * eap-s2i-build build template. * - * The template is supposed to be used in conjunction with the WILDFLY Operator - the later can be used to deploy the + * The template is supposed to be used in conjunction with the WILDFLY Operator - the latter can be used to deploy the * application image (can be referenced by an actual image link to local image registry, or by an image stream produced * by the eap-s2i-build build). * - * See https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/getting_started_with_jboss_eap_for_openshift_container_platform/index#the-eap-s2i-build-template-for-creating-application-images_default - * + * See https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html-single/getting_started_with_jboss_eap_for_openshift_container_platform/index#the-eap-s2i-build-template-for-creating-application-images_default * + * The application will be deployed by: + *
    + *
  • {@link Eap7LegacyS2iBuildTemplateProvisioner}
  • + *
*/ -public interface WildflyLegacyS2iBuildTemplateApplication extends TemplateApplication, HasEnvVars { +public interface Eap7LegacyS2iBuildTemplateApplication extends TemplateApplication, HasEnvVars { /** * Defaults to https://raw.githubusercontent.com/jboss-container-images/jboss-eap-openshift-templates/master/eap-s2i-build.yaml template diff --git a/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisioner.java b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisioner.java new file mode 100644 index 000000000..1b96334c3 --- /dev/null +++ b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisioner.java @@ -0,0 +1,118 @@ +package org.jboss.intersmash.tools.provision.openshift; + +import java.io.IOException; +import java.net.URL; +import java.util.List; + +import org.jboss.intersmash.tools.application.openshift.Eap7LegacyS2iBuildTemplateApplication; +import org.slf4j.event.Level; + +import cz.xtf.core.event.helpers.EventHelper; +import cz.xtf.core.openshift.OpenShiftWaiters; +import cz.xtf.core.waiting.failfast.FailFastCheck; +import io.fabric8.kubernetes.api.model.KubernetesList; +import io.fabric8.kubernetes.api.model.Pod; +import io.fabric8.openshift.api.model.BuildConfig; +import io.fabric8.openshift.api.model.Template; +import lombok.extern.slf4j.Slf4j; + +/** + * Provisioner used process and deploy eap-s2i-build template to OpenShift Container Platform cluster. + * + * @see Eap7LegacyS2iBuildTemplateApplication + */ +@Slf4j +public class Eap7LegacyS2iBuildTemplateProvisioner implements OpenShiftProvisioner { + // we can parametrize this one once required, but its location should be static + private String EAP_S2I_BUILD = "https://raw.githubusercontent.com/jboss-container-images/jboss-eap-openshift-templates/master/eap-s2i-build.yaml"; + private KubernetesList deployedResources; + private Eap7LegacyS2iBuildTemplateApplication application; + private FailFastCheck ffCheck = () -> false; + private Template template; + + public Eap7LegacyS2iBuildTemplateProvisioner(Eap7LegacyS2iBuildTemplateApplication application) { + this.application = application; + } + + @Override + public Eap7LegacyS2iBuildTemplateApplication getApplication() { + return application; + } + + @Override + public void deploy() { + ffCheck = FailFastUtils.getFailFastCheck(EventHelper.timeOfLastEventBMOrTestNamespaceOrEpoch(), + application.getName()); + + if (application.getParameters().getOrDefault("APPLICATION_IMAGE", "null") != application.getName()) { + throw new IllegalArgumentException("APPLICATION_IMAGE template parameters has to match the application name!"); + } + try { + template = openShift.templates().load(new URL(EAP_S2I_BUILD)).item(); + } catch (IOException e) { + throw new RuntimeException("Failed to load eap-s2i-build template from " + EAP_S2I_BUILD, e); + } + template.setApiVersion("template.openshift.io/v1"); + openShift.createTemplate(template); + deployedResources = openShift.processTemplate(template.getMetadata().getName(), + application.getParameters()); + // add additional environment variables to the build config resources + deployedResources.getItems().stream() + .filter(hasMetadata -> hasMetadata.getKind().equals(BuildConfig.class.getSimpleName())) + .forEach(hasMetadata -> setEnvToBuildConfig((BuildConfig) hasMetadata)); + openShift.createResources(deployedResources); + + // two build configs has to be built (builder/runtime) in order to proceed + waitForBuilds(); + } + + private void setEnvToBuildConfig(BuildConfig buildConfig) { + // Update Git based build config + if (buildConfig.getSpec().getStrategy().getSourceStrategy() != null) { + if (buildConfig.getSpec().getStrategy().getSourceStrategy().getEnv() == null) { + buildConfig.getSpec().getStrategy().getSourceStrategy().setEnv(application.getEnvVars()); + } else { + buildConfig.getSpec().getStrategy().getSourceStrategy().getEnv().addAll(application.getEnvVars()); + } + } + // Update dockerile based build config + if (buildConfig.getSpec().getStrategy().getDockerStrategy() != null) { + if (buildConfig.getSpec().getStrategy().getDockerStrategy().getEnv() == null) { + buildConfig.getSpec().getStrategy().getDockerStrategy().setEnv(application.getEnvVars()); + } else { + buildConfig.getSpec().getStrategy().getDockerStrategy().getEnv().addAll(application.getEnvVars()); + } + } + } + + private void waitForBuilds() { + OpenShiftWaiters.get(openShift, ffCheck).hasBuildCompleted(application.getName() + "-build-artifacts") + .level(Level.DEBUG) + .waitFor(); + OpenShiftWaiters.get(openShift, ffCheck).hasBuildCompleted(application.getName()) + .level(Level.DEBUG) + .waitFor(); + } + + @Override + public void undeploy() { + openShift.deleteResources(deployedResources); + openShift.deleteTemplate(template); + } + + @Override + public URL getURL() { + throw new UnsupportedOperationException("No route for eap-s2i-build template instance."); + } + + @Override + public List getPods() { + throw new UnsupportedOperationException( + "eap-s2i-build does not provide any running pods - all pods are completed once builds are done."); + } + + @Override + public void scale(int replicas, boolean wait) { + throw new UnsupportedOperationException("eap-s2i-build template is not suppose to be scaled - no running pods."); + } +} diff --git a/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisionerFactory.java b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisionerFactory.java new file mode 100644 index 000000000..ad2e51fa9 --- /dev/null +++ b/tools/intersmash-tools-provisioners/src/main/java/org/jboss/intersmash/tools/provision/openshift/Eap7LegacyS2iBuildTemplateProvisionerFactory.java @@ -0,0 +1,18 @@ +package org.jboss.intersmash.tools.provision.openshift; + +import org.jboss.intersmash.tools.application.Application; +import org.jboss.intersmash.tools.application.openshift.Eap7LegacyS2iBuildTemplateApplication; +import org.jboss.intersmash.tools.provision.ProvisionerFactory; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class Eap7LegacyS2iBuildTemplateProvisionerFactory implements ProvisionerFactory { + + @Override + public Eap7LegacyS2iBuildTemplateProvisioner getProvisioner(Application application) { + if (Eap7LegacyS2iBuildTemplateApplication.class.isAssignableFrom(application.getClass())) + return new Eap7LegacyS2iBuildTemplateProvisioner((Eap7LegacyS2iBuildTemplateApplication) application); + return null; + } +} diff --git a/tools/intersmash-tools-provisioners/src/test/java/org/jboss/intersmash/tools/provision/ProvisionerManagerTestCase.java b/tools/intersmash-tools-provisioners/src/test/java/org/jboss/intersmash/tools/provision/ProvisionerManagerTestCase.java index 06bcb31a5..9836f2c4e 100644 --- a/tools/intersmash-tools-provisioners/src/test/java/org/jboss/intersmash/tools/provision/ProvisionerManagerTestCase.java +++ b/tools/intersmash-tools-provisioners/src/test/java/org/jboss/intersmash/tools/provision/ProvisionerManagerTestCase.java @@ -20,12 +20,14 @@ import org.jboss.intersmash.tools.application.Application; import org.jboss.intersmash.tools.application.openshift.ActiveMQOperatorApplication; import org.jboss.intersmash.tools.application.openshift.BootableJarOpenShiftApplication; +import org.jboss.intersmash.tools.application.openshift.Eap7LegacyS2iBuildTemplateApplication; import org.jboss.intersmash.tools.application.openshift.KafkaOperatorApplication; import org.jboss.intersmash.tools.application.openshift.MysqlImageOpenShiftApplication; import org.jboss.intersmash.tools.application.openshift.PostgreSQLImageOpenShiftApplication; import org.jboss.intersmash.tools.application.openshift.WildflyImageOpenShiftApplication; import org.jboss.intersmash.tools.application.openshift.WildflyOperatorApplication; import org.jboss.intersmash.tools.provision.openshift.ActiveMQOperatorProvisioner; +import org.jboss.intersmash.tools.provision.openshift.Eap7LegacyS2iBuildTemplateProvisioner; import org.jboss.intersmash.tools.provision.openshift.KafkaOperatorProvisioner; import org.jboss.intersmash.tools.provision.openshift.MysqlImageOpenShiftProvisioner; import org.jboss.intersmash.tools.provision.openshift.PostgreSQLImageOpenShiftProvisioner; @@ -42,7 +44,7 @@ * | InfinispanImageOpenShiftApplication | IMAGE | InfinispanImageOpenShiftProvisioner | * | MysqlImageOpenShiftApplication | IMAGE | MysqlImageOpenShiftProvisioner | * | PostgreSQLImageOpenShiftApplication | IMAGE | PostgreSQLImageOpenShiftProvisioner | - * | EapS2iBuildTemplateApplication | TEMPLATE | EapS2iBuildTemplateProvisioner | + * | Eap7LegacyS2iBuildTemplateApplication | TEMPLATE | Eap7LegacyS2iBuildTemplateProvisioner | * | WildflyOperatorApplication | OPERATOR | WildflyOperatorProvisioner | * | ActiveMQOperatorApplication | OPERATOR | ActiveMQOperatorProvisioner | * | KafkaOperatorApplication | OPERATOR | KafkaOperatorProvisioner | @@ -128,6 +130,17 @@ public void kafkaOperatorProvisioner() { Assertions.assertEquals(KafkaOperatorProvisioner.class, actual.getClass()); } + /** + * Eap7LegacyS2iBuildTemplateApplication/Eap7LegacyS2iBuildTemplateProvisioner + */ + @Test + public void eapS2iBuildTemplateProvisioner() { + application = mock(Eap7LegacyS2iBuildTemplateApplication.class); + + Provisioner actual = ProvisionerManager.getProvisioner(application); + Assertions.assertEquals(Eap7LegacyS2iBuildTemplateProvisioner.class, actual.getClass()); + } + @Test public void unsupportedProvisioner() { Assertions.assertThrows(UnsupportedOperationException.class,