diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 3fab65e0257fb..af68fb810559a 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -146,7 +146,7 @@ 2.10.0 1.4.2 1.6.10 - 1.5.2 + 1.6.0 2.6.0 3.0.1 4.1.1 diff --git a/build-parent/pom.xml b/build-parent/pom.xml index c9a8bd36fd4e6..39a4aa7d3248d 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -65,7 +65,7 @@ 3.8.4 0.7.7 - 7.3.2 + 7.3.3 ${project.version} ${project.version} diff --git a/core/deployment/src/main/java/io/quarkus/deployment/configuration/ConfigMappingUtils.java b/core/deployment/src/main/java/io/quarkus/deployment/configuration/ConfigMappingUtils.java index d3b62cc378f78..9a801af4687da 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/configuration/ConfigMappingUtils.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/configuration/ConfigMappingUtils.java @@ -60,7 +60,8 @@ public static void generateConfigClasses( reflectiveClasses .produce(ReflectiveClassBuildItem.builder(mappingMetadata.getInterfaceType()).methods(true).build()); reflectiveClasses - .produce(ReflectiveClassBuildItem.builder(mappingMetadata.getClassName()).constructors(true).build()); + .produce(ReflectiveClassBuildItem.builder(mappingMetadata.getClassName()).constructors(true) + .methods(true).build()); for (Class parent : getHierarchy(mappingMetadata.getInterfaceType())) { reflectiveClasses.produce(ReflectiveClassBuildItem.builder(parent).methods(true).build()); diff --git a/core/deployment/src/main/java/io/quarkus/deployment/logging/LogCleanupFilterBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/logging/LogCleanupFilterBuildItem.java index e856ae2b974a2..7c3b23c5f1240 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/logging/LogCleanupFilterBuildItem.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/logging/LogCleanupFilterBuildItem.java @@ -1,6 +1,7 @@ package io.quarkus.deployment.logging; import java.util.Arrays; +import java.util.List; import java.util.logging.Level; import io.quarkus.builder.item.MultiBuildItem; @@ -17,17 +18,25 @@ public final class LogCleanupFilterBuildItem extends MultiBuildItem { private LogCleanupFilterElement filterElement; public LogCleanupFilterBuildItem(String loggerName, String... messageStarts) { - if (messageStarts.length == 0) { - throw new IllegalArgumentException("messageStarts cannot be null"); - } - this.filterElement = new LogCleanupFilterElement(loggerName, Arrays.asList(messageStarts)); + this(loggerName, Arrays.asList(messageStarts)); } public LogCleanupFilterBuildItem(String loggerName, Level targetLevel, String... messageStarts) { - if (messageStarts.length == 0) { - throw new IllegalArgumentException("messageStarts cannot be null"); + this(loggerName, targetLevel, Arrays.asList(messageStarts)); + } + + public LogCleanupFilterBuildItem(String loggerName, List messageStarts) { + if (messageStarts.isEmpty()) { + throw new IllegalArgumentException("messageStarts cannot be empty"); + } + this.filterElement = new LogCleanupFilterElement(loggerName, messageStarts); + } + + public LogCleanupFilterBuildItem(String loggerName, Level targetLevel, List messageStarts) { + if (messageStarts.isEmpty()) { + throw new IllegalArgumentException("messageStarts cannot be empty"); } - this.filterElement = new LogCleanupFilterElement(loggerName, targetLevel, Arrays.asList(messageStarts)); + this.filterElement = new LogCleanupFilterElement(loggerName, targetLevel, messageStarts); } public LogCleanupFilterElement getFilterElement() { diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/ClassTransformingBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/ClassTransformingBuildStep.java index a974f62ab9ca4..1eebd6fa368bf 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/ClassTransformingBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/ClassTransformingBuildStep.java @@ -292,7 +292,7 @@ private void handleRemovedResources(ClassLoadingConfig classLoadingConfig, Curat } } if (!removed.isEmpty()) { - log.warn("Could not removed configured resources from the following artifacts as they were not found in the model: " + log.warn("Could not remove configured resources from the following artifacts as they were not found in the model: " + removed.keySet()); } } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java b/core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java index fc95edd7b7523..a67a1af723c41 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/steps/MainClassBuildStep.java @@ -84,13 +84,6 @@ public class MainClassBuildStep { static final String LOG = "LOG"; static final String JAVA_LIBRARY_PATH = "java.library.path"; - private static final String JAVAX_NET_SSL_TRUST_STORE = "javax.net.ssl.trustStore"; - private static final String JAVAX_NET_SSL_TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType"; - private static final String JAVAX_NET_SSL_TRUST_STORE_PROVIDER = "javax.net.ssl.trustStoreProvider"; - private static final String JAVAX_NET_SSL_TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword"; - private static final List BUILD_TIME_TRUST_STORE_PROPERTIES = List.of(JAVAX_NET_SSL_TRUST_STORE, - JAVAX_NET_SSL_TRUST_STORE_TYPE, JAVAX_NET_SSL_TRUST_STORE_PROVIDER, JAVAX_NET_SSL_TRUST_STORE_PASSWORD); - public static final String GENERATE_APP_CDS_SYSTEM_PROPERTY = "quarkus.appcds.generate"; private static final FieldDescriptor STARTUP_CONTEXT_FIELD = FieldDescriptor.of(Application.APP_CLASS_NAME, STARTUP_CONTEXT, @@ -236,22 +229,6 @@ void build(List staticInitTasks, .ifNonZero(mv.invokeStaticMethod(ofMethod(ImageInfo.class, "inImageRuntimeCode", boolean.class))) .trueBranch(); - // GraalVM uses the build-time trustStore and bakes the backing classes of the TrustStore into the the native binary, - // so we need to warn users trying to set the trust store related system properties that it won't have an effect - for (String property : BUILD_TIME_TRUST_STORE_PROPERTIES) { - ResultHandle trustStoreSystemProp = inGraalVMCode.invokeStaticMethod( - ofMethod(System.class, "getProperty", String.class, String.class), - mv.load(property)); - - BytecodeCreator inGraalVMCodeAndTrustStoreSet = inGraalVMCode.ifNull(trustStoreSystemProp).falseBranch(); - inGraalVMCodeAndTrustStoreSet.invokeVirtualMethod( - ofMethod(Logger.class, "warn", void.class, Object.class), - inGraalVMCodeAndTrustStoreSet.readStaticField(logField.getFieldDescriptor()), - inGraalVMCodeAndTrustStoreSet.load(String.format( - "Setting the '%s' system property will not have any effect at runtime. Make sure to set this property at build time (for example by setting 'quarkus.native.additional-build-args=-J-D%s=someValue').", - property, property))); - } - mv.invokeStaticMethod(ofMethod(Timing.class, "mainStarted", void.class)); startupContext = mv.readStaticField(scField.getFieldDescriptor()); @@ -468,7 +445,6 @@ private void writeRecordedBytecode(BytecodeRecorderImpl recorder, String fallbac /** * registers the generated application class for reflection, needed when launching via the Quarkus launcher - * */ @BuildStep ReflectiveClassBuildItem applicationReflection() { diff --git a/devtools/gradle/gradle/wrapper/gradle-wrapper.properties b/devtools/gradle/gradle/wrapper/gradle-wrapper.properties index ac0b842f1984b..669386b870a69 100644 --- a/devtools/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/devtools/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/docs/src/main/asciidoc/native-and-ssl.adoc b/docs/src/main/asciidoc/native-and-ssl.adoc index b84bf5e014c27..e4a95565badbe 100644 --- a/docs/src/main/asciidoc/native-and-ssl.adoc +++ b/docs/src/main/asciidoc/native-and-ssl.adoc @@ -225,16 +225,28 @@ And let's build the native executable again: [WARNING] ==== -This behavior is new to GraalVM 19.3+. +This behavior is new to GraalVM 21.3+. ==== -When creating a native binary, GraalVM embraces the principle of "immutable security" for the root certificates. -This essentially means that the root certificates are fixed at image build time, based on the certificate configuration used at that build time -(which for Quarkus means when you perform a build having `quarkus.package.type=native` set). -This avoids shipping a `cacerts` file or requiring a system property be set in order to set up root -certificates that are provided by the OS where the binary runs. +GraalVM supports both build time and runtime certificate configuration. -As a consequence, system properties such as `javax.net.ssl.trustStore` do not have an effect at +=== Build time configuration + +The build time approach favors the principle of "immutable security" where the appropriate certificates are added at build time, and can never be changed afterward. +This guarantees that the list of valid certificates cannot be tampered with when the application gets deployed in production. + +However, this comes with a few drawbacks: + + * If you use the same executable in all environments, and a certificate expires, the application needs to be rebuilt, and redeployed into production with the new certificate, which is an inconvenience. + * Even worse, if a certificate gets revoked because of a security breach, all applications that embed this certificate need to be rebuilt and redeployed in a timely manner. + * This requires also to add into the application all certificates for all environments (e.g. DEV, TEST, PROD), which means that a certificate that is required for DEV but should not be used elsewhere, will make its way anyway in production. + * Providing all certificates at build time complicates the CI, specifically in dynamic environments such as Kubernetes where valid certificates are provided by the platform in the `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` PEM file. + * Lastly, this does not play well with third party software that do not provide a dedicated build for each customer environment. + +Creating a native executable using build time certificates essentially means that the root certificates are fixed at image build time, based on the certificate configuration used at build time (which for Quarkus means when you perform a build having `quarkus.package.type=native` set). +This avoids shipping a `cacerts` file or requiring a system property be set in order to set up root certificates that are provided by the OS where the binary runs. + +In this situation, system properties such as `javax.net.ssl.trustStore` do not have an effect at run time, so when the defaults need to be changed, these system properties must be provided at image build time. The easiest way to do so is by setting `quarkus.native.additional-build-args`. For example: @@ -244,11 +256,11 @@ quarkus.native.additional-build-args=-J-Djavax.net.ssl.trustStore=/tmp/mycerts,- ---- will ensure that the certificates of `/tmp/mycerts` are baked into the native binary and used *in addition* to the default cacerts. +The file containing the custom TrustStore does *not* (and probably should not) have to be present at runtime as its content has been baked into the native binary. -[IMPORTANT] -==== -The file containing the custom TrustStore does *not* have to be present at runtime as its content has been baked into the native binary. -==== +=== Run time configuration + +Using the runtime certificate configuration, supported by GraalVM since 21.3 does not require any special or additional configuration compared to regular java programs or Quarkus in jvm mode. See the https://www.graalvm.org/reference-manual/native-image/CertificateManagement/#run-time-options[GraalVM documentation] for more information. [#working-with-containers] === Working with containers @@ -258,7 +270,4 @@ as described in the previous section, it will work properly in container as well == Conclusion -We make building native executable easy and, even if the SSL support in GraalVM is still requiring some serious thinking, -it should be mostly transparent when using Quarkus. - -We track GraalVM progress on a regular basis so we will promptly integrate in Quarkus any improvement with respect to SSL support. +We make building native executable using SSL easy, and provide several options to cope well with different types of security requirements. diff --git a/docs/src/main/asciidoc/security-openid-connect-client.adoc b/docs/src/main/asciidoc/security-openid-connect-client.adoc index dc4bdfca939c2..77e308e521a24 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client.adoc @@ -305,7 +305,7 @@ public class OidcClientResource { cfg.setAuthServerUrl("http://localhost:8081/auth/realms/quarkus/"); cfg.setClientId("quarkus"); cfg.getCredentials().setSecret("secret"); - Uni client = clients.newClient(config); + Uni client = clients.newClient(cfg); // use this client to get the token } } diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index fc13df4da7791..4f9b56ec8f339 100644 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -3110,6 +3110,7 @@ Then, at the end of your documentation, include the extensive documentation: Finally, generate the documentation and check it out. +[[ecosystem-ci]] == Continuous testing of your extension In order to make it easy for extension authors to test their extensions daily against the latest snapshot of Quarkus, Quarkus has introduced @@ -3127,6 +3128,8 @@ Before publishing your extension to the xref:tooling.adoc[Quarkus tooling], make * Your extension is published in Maven Central +* Your extension repository is configured to use the <>. + Then you must create a pull request adding a `your-extension.yaml` file in the `extensions/` directory in the link:https://github.com/quarkusio/quarkus-extension-catalog[Quarkus Extension Catalog]. The YAML must have the following structure: ```yaml diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateMultiTenantConnectionProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateMultiTenantConnectionProvider.java index c5fef6c9cc1e9..1455be9ea3932 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateMultiTenantConnectionProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/HibernateMultiTenantConnectionProvider.java @@ -7,7 +7,6 @@ import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; -import javax.enterprise.inject.Default; import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; @@ -17,7 +16,6 @@ import io.quarkus.arc.InjectableInstance; import io.quarkus.arc.InstanceHandle; import io.quarkus.arc.ManagedContext; -import io.quarkus.hibernate.orm.PersistenceUnit.PersistenceUnitLiteral; import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil; /** @@ -107,20 +105,18 @@ private static ConnectionProvider resolveConnectionProvider(String persistenceUn * @return Current tenant resolver. */ private static InstanceHandle tenantResolver(String persistenceUnitName) { - InstanceHandle resolverInstance; - if (PersistenceUnitUtil.isDefaultPersistenceUnit(persistenceUnitName)) { - resolverInstance = Arc.container().instance(TenantResolver.class, Default.Literal.INSTANCE); - } else { - resolverInstance = Arc.container().instance(TenantResolver.class, - new PersistenceUnitLiteral(persistenceUnitName)); - } - if (!resolverInstance.isAvailable()) { + InjectableInstance instance = PersistenceUnitUtil + .legacySingleExtensionInstanceForPersistenceUnit( + TenantResolver.class, persistenceUnitName); + + if (instance.isUnsatisfied()) { throw new IllegalStateException(String.format(Locale.ROOT, "No instance of %1$s was found for persistence unit %2$s. " + "You need to create an implementation for this interface to allow resolving the current tenant identifier.", TenantResolver.class.getSimpleName(), persistenceUnitName)); } - return resolverInstance; + + return instance.getHandle(); } } diff --git a/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaProcessor.java b/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaProcessor.java index 79027fdba7f1a..76ccae4a3d199 100644 --- a/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaProcessor.java +++ b/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaProcessor.java @@ -1,8 +1,10 @@ package io.quarkus.kafka.client.deployment; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.logging.Level; @@ -79,6 +81,7 @@ import io.quarkus.deployment.builditem.nativeimage.ReflectiveHierarchyBuildItem; import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem; import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem; +import io.quarkus.deployment.logging.LogCleanupFilterBuildItem; import io.quarkus.deployment.pkg.NativeConfig; import io.quarkus.kafka.client.runtime.KafkaBindingConverter; import io.quarkus.kafka.client.runtime.KafkaRecorder; @@ -137,7 +140,21 @@ void logging(BuildProducer log) { log.produce(new LogCategoryBuildItem("org.apache.kafka.clients", Level.WARNING)); log.produce(new LogCategoryBuildItem("org.apache.kafka.common.utils", Level.WARNING)); log.produce(new LogCategoryBuildItem("org.apache.kafka.common.metrics", Level.WARNING)); + } + + @BuildStep + void silenceUnwantedConfigLogs(BuildProducer logCleanupFilters) { + String[] ignoredConfigProperties = { "wildfly.sasl.relax-compliance", "ssl.endpoint.identification.algorithm" }; + + List ignoredMessages = new ArrayList<>(); + for (String ignoredConfigProperty : ignoredConfigProperties) { + ignoredMessages.add("The configuration '" + ignoredConfigProperty + "' was supplied but isn't a known config."); + } + logCleanupFilters.produce(new LogCleanupFilterBuildItem("org.apache.kafka.clients.consumer.ConsumerConfig", + ignoredMessages)); + logCleanupFilters.produce(new LogCleanupFilterBuildItem("org.apache.kafka.clients.producer.ProducerConfig", + ignoredMessages)); } @BuildStep diff --git a/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/pom.xml b/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/pom.xml index e23503dbf5d97..b7432d91ea48e 100644 --- a/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/pom.xml +++ b/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/pom.xml @@ -33,6 +33,21 @@ quarkus-grpc-common + + io.opentelemetry + opentelemetry-exporter-otlp-common + + + org.codehaus.mojo + animal-sniffer-annotations + + + org.checkerframework + checker-qual + + + + io.opentelemetry opentelemetry-exporter-jaeger @@ -47,6 +62,12 @@ + + + org.graalvm.nativeimage + svm + provided + diff --git a/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/src/main/java/io/quarkus/opentelemetry/exporter/jaeger/runtime/JaegerSubstitutions.java b/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/src/main/java/io/quarkus/opentelemetry/exporter/jaeger/runtime/JaegerSubstitutions.java new file mode 100644 index 0000000000000..ef2ab46b55a1f --- /dev/null +++ b/extensions/opentelemetry/opentelemetry-exporter-jaeger/runtime/src/main/java/io/quarkus/opentelemetry/exporter/jaeger/runtime/JaegerSubstitutions.java @@ -0,0 +1,47 @@ +package io.quarkus.opentelemetry.exporter.jaeger.runtime; + +import static java.util.Objects.requireNonNull; + +import javax.net.ssl.SSLException; +import javax.net.ssl.X509TrustManager; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +import io.grpc.ManagedChannelBuilder; +import io.grpc.netty.GrpcSslContexts; +import io.grpc.netty.NettyChannelBuilder; +import io.opentelemetry.exporter.otlp.internal.grpc.ManagedChannelUtil; + +/** + * Replace the {@link ManagedChannelUtil#setTrustedCertificatesPem(ManagedChannelBuilder, byte[])} method in native + * because the method implementation tries to look for grpc-netty-shaded dependencies, which we don't support. + * + * Check: + * https://github.com/open-telemetry/opentelemetry-java/blob/v1.9.1/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/otlp/internal/grpc/ManagedChannelUtil.java#L56-L89 + */ +final class JaegerSubstitutions { + @TargetClass(ManagedChannelUtil.class) + static final class Target_ManagedChannelUtil { + @Substitute + public static void setTrustedCertificatesPem( + ManagedChannelBuilder managedChannelBuilder, byte[] trustedCertificatesPem) + throws SSLException { + requireNonNull(managedChannelBuilder, "managedChannelBuilder"); + requireNonNull(trustedCertificatesPem, "trustedCertificatesPem"); + + X509TrustManager tm = io.opentelemetry.exporter.otlp.internal.TlsUtil.trustManager(trustedCertificatesPem); + + // gRPC does not abstract TLS configuration so we need to check the implementation and act + // accordingly. + if (managedChannelBuilder.getClass().getName().equals("io.grpc.netty.NettyChannelBuilder")) { + NettyChannelBuilder nettyBuilder = (NettyChannelBuilder) managedChannelBuilder; + nettyBuilder.sslContext(GrpcSslContexts.forClient().trustManager(tm).build()); + } else { + throw new SSLException( + "TLS certificate configuration not supported for unrecognized ManagedChannelBuilder " + + managedChannelBuilder.getClass().getName()); + } + } + } +} diff --git a/independent-projects/bootstrap/pom.xml b/independent-projects/bootstrap/pom.xml index 9833d39a72bd0..99081d7aef7dd 100644 --- a/independent-projects/bootstrap/pom.xml +++ b/independent-projects/bootstrap/pom.xml @@ -54,7 +54,7 @@ 21.3.0 2.6.0 1.8.0 - 7.3.2 + 7.3.3 0.0.3 diff --git a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/tooling/gradle-wrapper/codestart.yml b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/tooling/gradle-wrapper/codestart.yml index 77b12c6c3eb8e..8d0ae44ebf2bc 100644 --- a/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/tooling/gradle-wrapper/codestart.yml +++ b/independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/tooling/gradle-wrapper/codestart.yml @@ -6,7 +6,7 @@ language: base: data: gradle: - version: 7.3.2 + version: 7.3.3 shared-data: buildtool: cli: ./gradlew diff --git a/independent-projects/tools/devtools-testing/src/main/resources/fake-catalog.json b/independent-projects/tools/devtools-testing/src/main/resources/fake-catalog.json index df0995940d6dc..bcdf37436f2a6 100644 --- a/independent-projects/tools/devtools-testing/src/main/resources/fake-catalog.json +++ b/independent-projects/tools/devtools-testing/src/main/resources/fake-catalog.json @@ -330,7 +330,7 @@ "supported-maven-versions": "[3.6.2,)", "proposed-maven-version": "3.8.4", "maven-wrapper-version": "0.7.7", - "gradle-wrapper-version": "7.3.2" + "gradle-wrapper-version": "7.3.3" } }, "codestarts-artifacts": [ diff --git a/independent-projects/tools/pom.xml b/independent-projects/tools/pom.xml index 14b1c88d40452..5022bf658c13c 100644 --- a/independent-projects/tools/pom.xml +++ b/independent-projects/tools/pom.xml @@ -28,7 +28,7 @@ 3.8.4 0.7.7 - 7.3.2 + 7.3.3 diff --git a/integration-tests/gradle/gradle/wrapper/gradle-wrapper.properties b/integration-tests/gradle/gradle/wrapper/gradle-wrapper.properties index d2880ba8000a3..2e6e5897b5285 100644 --- a/integration-tests/gradle/gradle/wrapper/gradle-wrapper.properties +++ b/integration-tests/gradle/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/integration-tests/smallrye-config/src/main/java/io/quarkus/it/smallrye/config/ServerResource.java b/integration-tests/smallrye-config/src/main/java/io/quarkus/it/smallrye/config/ServerResource.java index 8df7de97ca533..eb63076d17514 100644 --- a/integration-tests/smallrye-config/src/main/java/io/quarkus/it/smallrye/config/ServerResource.java +++ b/integration-tests/smallrye-config/src/main/java/io/quarkus/it/smallrye/config/ServerResource.java @@ -1,5 +1,6 @@ package io.quarkus.it.smallrye.config; +import java.lang.reflect.Method; import java.util.List; import javax.enterprise.inject.Instance; @@ -39,6 +40,13 @@ public Response getServer() { return Response.ok(server).build(); } + @GET + @Path("/host") + public Response getServerHost() throws Exception { + Method method = server.getClass().getDeclaredMethod("host"); + return Response.ok(method.invoke(server)).build(); + } + @GET @Path("/properties") public Response getServerProperties() { diff --git a/integration-tests/smallrye-config/src/test/java/io/quarkus/it/smallrye/config/ServerResourceTest.java b/integration-tests/smallrye-config/src/test/java/io/quarkus/it/smallrye/config/ServerResourceTest.java index 1357fc24e2912..21b2cda6b6d49 100644 --- a/integration-tests/smallrye-config/src/test/java/io/quarkus/it/smallrye/config/ServerResourceTest.java +++ b/integration-tests/smallrye-config/src/test/java/io/quarkus/it/smallrye/config/ServerResourceTest.java @@ -59,6 +59,15 @@ void mapping() { .body("log.period", equalTo("P1D")); } + @Test + void serverHost() { + given() + .get("/server/host") + .then() + .statusCode(OK.getStatusCode()) + .body(equalTo("localhost")); + } + @Test void properties() { given()