diff --git a/.gitignore b/.gitignore index edaa9c6..541a8b1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,11 @@ *.ear hs_err_pid* +########################## +# VS Code +########################## +.vscode/ + ########################## ## Maven ########################## @@ -57,4 +62,4 @@ nb-configuration.xml ########################## ## OS X ########################## -.DS_Store \ No newline at end of file +.DS_Store diff --git a/micro-java/.dockerignore b/micro-java/.dockerignore new file mode 100644 index 0000000..94810d0 --- /dev/null +++ b/micro-java/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/micro-java/.gitignore b/micro-java/.gitignore new file mode 100644 index 0000000..23876f1 --- /dev/null +++ b/micro-java/.gitignore @@ -0,0 +1,44 @@ +#Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +release.properties + +mvnw* +.mvn/ +# VS Code +.vscode/ + +# Eclipse +.project +.classpath +.settings/ +bin/ + +# IntelliJ +.idea +*.ipr +*.iml +*.iws + +# NetBeans +nb-configuration.xml + +# Visual Studio Code +.vscode +.factorypath + +# OSX +.DS_Store + +# Vim +*.swp +*.swo + +# patch +*.orig +*.rej + +# Local environment +.env diff --git a/micro-java/pom.xml b/micro-java/pom.xml index 9c8b9cd..92d220b 100644 --- a/micro-java/pom.xml +++ b/micro-java/pom.xml @@ -1,96 +1,145 @@ - - - + + 4.0.0 - - com.redhat.training.openshift - hello + com.redhat.training.openshift.hello + micro-java 1.0 - war - Red Hat Training Hello Java app - Hello microservice using Thorntail - - - + 3.8.1 + true + 11 + 11 UTF-8 - false - - - 2.4.0.Final - - - 3.1 - 2.16 - 2.5 - 4.1.0 - - - 1.8 - 1.8 + UTF-8 + 1.11.6.Final-redhat-00001 + quarkus-universe-bom + com.redhat.quarkus + 1.11.6.Final-redhat-00001 + 3.0.0-M5 - - - io.thorntail - bom-all - ${version.thorntail} - import + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} pom + import - - io.thorntail - cdi + io.quarkus + quarkus-arc - io.thorntail - jaxrs + io.quarkus + quarkus-resteasy + + + io.quarkus + quarkus-junit5 + test + + + io.rest-assured + rest-assured + test - + + + + true + + + false + + redhat + https://maven.repository.redhat.com/ga + + + + + + true + + + false + + redhat + https://maven.repository.redhat.com/ga + + - - hello - - - io.thorntail - thorntail-maven-plugin - ${version.thorntail} + io.quarkus + quarkus-maven-plugin + ${quarkus-plugin.version} + true - package + build + generate-code + generate-code-tests - io.fabric8 - fabric8-maven-plugin - ${version.fabric8.plugin} - - - fmp - - resource - build - - - + maven-compiler-plugin + ${compiler-plugin.version} + + + maven-surefire-plugin + ${surefire-plugin.version} + + + org.jboss.logmanager.LogManager + ${maven.home} + + - + + + native + + + native + + + + + + maven-failsafe-plugin + ${surefire-plugin.version} + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + diff --git a/micro-java/src/main/docker/Dockerfile.fast-jar b/micro-java/src/main/docker/Dockerfile.fast-jar new file mode 100644 index 0000000..5fa2aef --- /dev/null +++ b/micro-java/src/main/docker/Dockerfile.fast-jar @@ -0,0 +1,54 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.type=fast-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.fast-jar -t quarkus/micro-java2-fast-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/micro-java2-fast-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/micro-java2-fast-jar +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 + +ARG JAVA_PACKAGE=java-11-openjdk-headless +ARG RUN_JAVA_VERSION=1.3.8 +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' +# Install java and the run-java script +# Also set up permissions for user `1001` +RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \ + && microdnf update \ + && microdnf clean all \ + && mkdir /deployments \ + && chown 1001 /deployments \ + && chmod "g+rwX" /deployments \ + && chown 1001:root /deployments \ + && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \ + && chown 1001 /deployments/run-java.sh \ + && chmod 540 /deployments/run-java.sh \ + && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security + +# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. +ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=1001 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=1001 target/quarkus-app/*.jar /deployments/ +COPY --chown=1001 target/quarkus-app/app/ /deployments/app/ +COPY --chown=1001 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT [ "/deployments/run-java.sh" ] diff --git a/micro-java/src/main/docker/Dockerfile.jvm b/micro-java/src/main/docker/Dockerfile.jvm new file mode 100644 index 0000000..ce8612b --- /dev/null +++ b/micro-java/src/main/docker/Dockerfile.jvm @@ -0,0 +1,51 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/micro-java2-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/micro-java2-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/micro-java2-jvm +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 + +ARG JAVA_PACKAGE=java-11-openjdk-headless +ARG RUN_JAVA_VERSION=1.3.8 +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' +# Install java and the run-java script +# Also set up permissions for user `1001` +RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \ + && microdnf update \ + && microdnf clean all \ + && mkdir /deployments \ + && chown 1001 /deployments \ + && chmod "g+rwX" /deployments \ + && chown 1001:root /deployments \ + && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \ + && chown 1001 /deployments/run-java.sh \ + && chmod 540 /deployments/run-java.sh \ + && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security + +# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. +ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/app.jar + +EXPOSE 8080 +USER 1001 + +ENTRYPOINT [ "/deployments/run-java.sh" ] diff --git a/micro-java/src/main/docker/Dockerfile.native b/micro-java/src/main/docker/Dockerfile.native new file mode 100644 index 0000000..f6f3935 --- /dev/null +++ b/micro-java/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode +# +# Before building the container image run: +# +# ./mvnw package -Pnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/micro-java2 . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/micro-java2 +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/micro-java/src/main/java/com/redhat/training/openshift/hello/HelloResource.java b/micro-java/src/main/java/com/redhat/training/openshift/hello/HelloResource.java index 41084a4..a3623cd 100644 --- a/micro-java/src/main/java/com/redhat/training/openshift/hello/HelloResource.java +++ b/micro-java/src/main/java/com/redhat/training/openshift/hello/HelloResource.java @@ -1,27 +1,36 @@ package com.redhat.training.openshift.hello; -import javax.inject.Inject; +import java.util.Optional; + +import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; -@Path("/") +import org.eclipse.microprofile.config.inject.ConfigProperty; + +@Path("/api") +@Produces(MediaType.TEXT_PLAIN) +@Consumes(MediaType.TEXT_PLAIN) public class HelloResource { + @ConfigProperty(name = "HOSTNAME", defaultValue = "unknown") + String hostname; + @ConfigProperty(name = "APP_MSG") + Optional message; + @GET @Path("/hello") - @Produces("text/plain") public String hello() { - String hostname = System.getenv().getOrDefault("HOSTNAME", "unknown"); - String message = System.getenv().getOrDefault("APP_MSG", null); - String response = ""; + String response = ""; - if (message == null) { - response = "Hello world from host "+hostname+"\n"; + if (!message.isPresent()) { + response = "Hello world from host " + hostname + "\n"; } else { - response = "Hello world from host ["+hostname+"].\n"; - response += "Message received = "+message+"\n"; + response = "Hello world from host [" + hostname + "].\n"; + response += "Message received = " + message.get() + "\n"; } return response; } -} +} \ No newline at end of file diff --git a/micro-java/src/main/java/com/redhat/training/openshift/hello/JaxRsActivator.java b/micro-java/src/main/java/com/redhat/training/openshift/hello/JaxRsActivator.java deleted file mode 100644 index 7a6a14a..0000000 --- a/micro-java/src/main/java/com/redhat/training/openshift/hello/JaxRsActivator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.redhat.training.openshift.hello; - -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; - -@ApplicationPath("/api") -public class JaxRsActivator extends Application { -} diff --git a/micro-java/src/main/jkube/cm.yml b/micro-java/src/main/jkube/cm.yml new file mode 100644 index 0000000..3565c20 --- /dev/null +++ b/micro-java/src/main/jkube/cm.yml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: configmap-hello +data: diff --git a/micro-java/src/main/jkube/deployment.yml b/micro-java/src/main/jkube/deployment.yml new file mode 100644 index 0000000..6398686 --- /dev/null +++ b/micro-java/src/main/jkube/deployment.yml @@ -0,0 +1,46 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: micro-java + provider: jkube + version: "1.0" + group: com.redhat.training.openshift.hello + name: micro-java +spec: + replicas: 1 + selector: + matchLabels: + app: micro-java + provider: jkube + group: com.redhat.training.openshift.hello + template: + metadata: + labels: + app: micro-java + provider: jkube + version: "1.0" + group: com.redhat.training.openshift.hello + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: micro-java:1.0 + imagePullPolicy: IfNotPresent + name: quarkus + ports: + - containerPort: 8080 + name: http + protocol: TCP + - containerPort: 9779 + name: prometheus + protocol: TCP + - containerPort: 8778 + name: jolokia + protocol: TCP + securityContext: + privileged: false \ No newline at end of file diff --git a/micro-java/src/main/fabric8/.gitkeep b/micro-java/src/main/resources/application.properties similarity index 100% rename from micro-java/src/main/fabric8/.gitkeep rename to micro-java/src/main/resources/application.properties diff --git a/micro-java/src/test/java/com/redhat/training/openshift/hello/HelloResourceTest.java b/micro-java/src/test/java/com/redhat/training/openshift/hello/HelloResourceTest.java new file mode 100644 index 0000000..4ba6649 --- /dev/null +++ b/micro-java/src/test/java/com/redhat/training/openshift/hello/HelloResourceTest.java @@ -0,0 +1,23 @@ +package com.redhat.training.openshift.hello; + +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.containsString; + +@QuarkusTest +@TestHTTPEndpoint(HelloResource.class) +public class HelloResourceTest { + + @Test + public void testHelloEndpoint() { + given() + .when().get("/hello") + .then() + .statusCode(200) + .body(containsString("Hello world from")); + } + +} \ No newline at end of file diff --git a/micro-java/src/test/java/com/redhat/training/openshift/hello/NativeHelloResourceIT.java b/micro-java/src/test/java/com/redhat/training/openshift/hello/NativeHelloResourceIT.java new file mode 100644 index 0000000..82f180a --- /dev/null +++ b/micro-java/src/test/java/com/redhat/training/openshift/hello/NativeHelloResourceIT.java @@ -0,0 +1,9 @@ +package com.redhat.training.openshift.hello; + +import io.quarkus.test.junit.NativeImageTest; + +@NativeImageTest +public class NativeHelloResourceIT extends HelloResourceTest { + + // Execute the same tests but in native mode. +} \ No newline at end of file