From 1193931f15fac8b4d79010324f575a1cf0535ee7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 30 Mar 2025 15:00:19 +0000 Subject: [PATCH 1/6] Update Quarkus Platform and Group to v3.21.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0d9df8874f1..832d59c3314 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ opentelemetry = "1.48.0" opentelemetryAlpha = "1.31.0-alpha" picocli = "4.7.6" protobuf = "4.30.2" -quarkusPlatform = "3.19.4" +quarkusPlatform = "3.21.0" quarkusPlugin = "3.21.0" slf4j = "2.0.17" smallryeConfig = "3.12.4" From c0dbecc96b21c640a92a356aa40d248a0252fcb0 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 31 Mar 2025 11:26:59 +0200 Subject: [PATCH 2/6] adopt license-binary-dist --- gradle/built-uber-dists/LICENSE-BINARY-DIST | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gradle/built-uber-dists/LICENSE-BINARY-DIST b/gradle/built-uber-dists/LICENSE-BINARY-DIST index 5a9f0dfb042..e3d1fbd5da0 100644 --- a/gradle/built-uber-dists/LICENSE-BINARY-DIST +++ b/gradle/built-uber-dists/LICENSE-BINARY-DIST @@ -402,6 +402,7 @@ io.prometheus:simpleclient_common io.prometheus:simpleclient_tracer_common io.prometheus:simpleclient_tracer_otel io.prometheus:simpleclient_tracer_otel_agent +io.quarkiverse.amazonservices:quarkus-amazon-common-spi io.quarkiverse.amazonservices:quarkus-amazon-common io.quarkiverse.amazonservices:quarkus-amazon-dynamodb io.quarkiverse.amazonservices:quarkus-amazon-secretsmanager @@ -467,6 +468,7 @@ io.quarkus:quarkus-smallrye-jwt-build io.quarkus:quarkus-smallrye-openapi io.quarkus:quarkus-swagger-ui io.quarkus:quarkus-tls-registry +io.quarkus:quarkus-tls-registry-spi io.quarkus:quarkus-transaction-annotations io.quarkus:quarkus-vertx io.quarkus:quarkus-vertx-http From c5dd98a232b0aeeb432cac91a4a3a368bdc6f8ff Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 31 Mar 2025 12:52:32 +0200 Subject: [PATCH 3/6] Update Quarkus built-time configs for dev-mode Fixes `quarkus.devservices.enabled is set to 'false' but it is build time fixed to 'true'. Did you change the property quarkus.devservices.enabled after building the application?` --- .../quarkus-server/src/main/resources/application.properties | 2 +- tools/server-admin/src/main/resources/application.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/quarkus-server/src/main/resources/application.properties b/servers/quarkus-server/src/main/resources/application.properties index 1e7f659c399..cdec873ec7e 100644 --- a/servers/quarkus-server/src/main/resources/application.properties +++ b/servers/quarkus-server/src/main/resources/application.properties @@ -475,7 +475,7 @@ quarkus.micrometer.binder.http-server.match-patterns=\ /iceberg/v1/.*/views/rename=/iceberg/v1/{prefix}/views/rename, \ /iceberg/v1/.*/transactions/commit=/iceberg/v1/{prefix}/transactions/commit -%test.quarkus.devservices.enabled=false +quarkus.devservices.enabled=false # Disable Micrometer JVM-Metrics for tests. # diff --git a/tools/server-admin/src/main/resources/application.properties b/tools/server-admin/src/main/resources/application.properties index e48c42daf20..c3a4d723a7d 100644 --- a/tools/server-admin/src/main/resources/application.properties +++ b/tools/server-admin/src/main/resources/application.properties @@ -181,7 +181,7 @@ quarkus.http.test-port=0 # Disable a "lot of things" that are not needed for integration testing. Disabled in an effort to get hold # of the class-loader OOM leak described in https://github.com/projectnessie/nessie/issues/8571 # Many of these settings are probably unnecessary, but otoh don't hurt. -%test.quarkus.devservices.enabled=false +quarkus.devservices.enabled=false %test.quarkus.micrometer.enabled=false %test.quarkus.micrometer.registry-enabled-default=false %test.quarkus.mongodb.metrics.enabled=false From 97c21a49a9775d70c6fbf68c591067a671e259dd Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 31 Mar 2025 13:21:46 +0200 Subject: [PATCH 4/6] Add quarkus-vault* as independent deps to enable use of non-platform Quarkus bom --- catalog/secrets/vault/build.gradle.kts | 2 +- gradle/libs.versions.toml | 6 ++++-- servers/quarkus-secrets/build.gradle.kts | 2 +- servers/quarkus-server/build.gradle.kts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/catalog/secrets/vault/build.gradle.kts b/catalog/secrets/vault/build.gradle.kts index ecbd9bc5b81..a149b3fdc87 100644 --- a/catalog/secrets/vault/build.gradle.kts +++ b/catalog/secrets/vault/build.gradle.kts @@ -23,7 +23,7 @@ dependencies { implementation(libs.guava) implementation(enforcedPlatform(libs.quarkus.bom)) - implementation("io.quarkiverse.vault:quarkus-vault") + implementation(libs.quarkus.vault) compileOnly(project(":nessie-immutables")) annotationProcessor(project(":nessie-immutables", configuration = "processor")) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 832d59c3314..7940d416bf3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,8 +27,8 @@ picocli = "4.7.6" protobuf = "4.30.2" quarkusPlatform = "3.21.0" quarkusPlugin = "3.21.0" +quarkusVault = "4.2.1" slf4j = "2.0.17" -smallryeConfig = "3.12.4" undertow = "2.3.18.Final" # Backwards compatibility versions. Not referenced in this file to not let Renovate bump those versions. @@ -130,6 +130,8 @@ quarkus-bom = { module = "io.quarkus.platform:quarkus-bom", version.ref = "quark quarkus-cassandra-bom = { module = "io.quarkus.platform:quarkus-cassandra-bom", version.ref = "quarkusPlatform" } quarkus-google-cloud-services-bom = { module = "io.quarkus.platform:quarkus-google-cloud-services-bom", version.ref = "quarkusPlatform" } quarkus-logging-sentry = { module = "io.quarkiverse.loggingsentry:quarkus-logging-sentry", version = "2.1.2" } +quarkus-vault = { module = "io.quarkiverse.vault:quarkus-vault", version.ref = "quarkusVault" } +quarkus-vault-deployment = { module = "io.quarkiverse.vault:quarkus-vault-deployment", version.ref = "quarkusVault" } rest-assured = { module = "io.rest-assured:rest-assured", version = "5.5.1" } rocksdb-jni = { module = "org.rocksdb:rocksdbjni", version = "9.10.0" } scala-library-v212 = { module = "org.scala-lang:scala-library", version = { strictly = "[2.12, 2.13[", prefer = "2.12.20" }} @@ -138,7 +140,7 @@ slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } slf4j-jcl-over-slf4j = { module = "org.slf4j:jcl-over-slf4j", version.ref = "slf4j" } slf4j-log4j-over-slf4j = { module = "org.slf4j:log4j-over-slf4j", version.ref = "slf4j" } smallrye-mutiny = { module = "io.smallrye.reactive:mutiny", version = "2.8.0" } -smallrye-config-core = { module = "io.smallrye.config:smallrye-config-core", version.ref = "smallryeConfig" } +smallrye-config-core = { module = "io.smallrye.config:smallrye-config-core", version = "3.12.4" } snappy-java = { module = "org.xerial.snappy:snappy-java", version = "1.1.10.7" } spark-sql-v33-v212 = { module = "org.apache.spark:spark-sql_2_12", version = { strictly = "[3.3, 3.4[", prefer = "3.3.4"}} spark-sql-v33-v213 = { module = "org.apache.spark:spark-sql_2_13", version = { strictly = "[3.3, 3.4[", prefer = "3.3.4"}} diff --git a/servers/quarkus-secrets/build.gradle.kts b/servers/quarkus-secrets/build.gradle.kts index d08c681068e..ca476077bf6 100644 --- a/servers/quarkus-secrets/build.gradle.kts +++ b/servers/quarkus-secrets/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation(enforcedPlatform(libs.quarkus.google.cloud.services.bom)) implementation("io.quarkiverse.googlecloudservices:quarkus-google-cloud-secret-manager") - implementation("io.quarkiverse.vault:quarkus-vault") + implementation(libs.quarkus.vault) implementation(enforcedPlatform(libs.quarkus.azure.services.bom)) implementation("io.quarkiverse.azureservices:quarkus-azure-keyvault") diff --git a/servers/quarkus-server/build.gradle.kts b/servers/quarkus-server/build.gradle.kts index 5e166dad88e..303056cbb0d 100644 --- a/servers/quarkus-server/build.gradle.kts +++ b/servers/quarkus-server/build.gradle.kts @@ -164,7 +164,7 @@ dependencies { testFixturesApi(platform(libs.awssdk.bom)) testFixturesApi("software.amazon.awssdk:secretsmanager") - testFixturesApi("io.quarkiverse.vault:quarkus-vault-deployment") + testFixturesApi(libs.quarkus.vault.deployment) testFixturesApi(enforcedPlatform(libs.quarkus.azure.services.bom)) testFixturesApi("io.quarkiverse.azureservices:quarkus-azure-keyvault") From 713fabec1d257a1e5a95d826763c32cd725042a6 Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 31 Mar 2025 13:42:34 +0200 Subject: [PATCH 5/6] (Non-platform) Quarkus requires AWSSDK `url-connection-client` as an explicit dependency --- catalog/files/impl/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/catalog/files/impl/build.gradle.kts b/catalog/files/impl/build.gradle.kts index e2e50986f74..37c371488b8 100644 --- a/catalog/files/impl/build.gradle.kts +++ b/catalog/files/impl/build.gradle.kts @@ -41,6 +41,9 @@ dependencies { implementation("software.amazon.awssdk:apache-client") { exclude("commons-logging", "commons-logging") } + runtimeOnly("software.amazon.awssdk:url-connection-client") { + exclude("commons-logging", "commons-logging") + } implementation(platform(libs.google.cloud.storage.bom)) implementation("com.google.cloud:google-cloud-storage") From b49871689b11e3cfc624ebc1d673142eabd7c63e Mon Sep 17 00:00:00 2001 From: Robert Stupp Date: Mon, 31 Mar 2025 12:54:06 +0200 Subject: [PATCH 6/6] Remove `@StaticInitSafe` This is rather a workaround than a necessity. It works around [Quarkus issue 47007](https://github.com/quarkusio/quarkus/issues/47007), but also another one: Mapped configs having `@StaticInitSafe` being rejected by Quarkus 3.21.0 (`SRCFG00027: Could not find a mapping for ...`) despite all properties having `@WithDefault` annotations. There is no runtime impact on removing `@StaticInitSafe` even for `@RequestScoped` beans getting those configs injected - it's always the same mapped config bean instance (same Java object). --- .../projectnessie/events/quarkus/config/QuarkusEventConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusBigTableConfig.java | 2 -- .../projectnessie/quarkus/config/QuarkusCassandraConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusDynamoDBConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusJdbcConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusRocksConfig.java | 2 -- .../quarkus/config/QuarkusNessieAuthenticationConfig.java | 2 -- .../quarkus/config/QuarkusNessieAuthorizationConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusServerConfig.java | 2 -- .../org/projectnessie/quarkus/config/QuarkusStoreConfig.java | 2 -- .../org/projectnessie/quarkus/config/VersionStoreConfig.java | 2 -- 11 files changed, 22 deletions(-) diff --git a/events/quarkus/src/main/java/org/projectnessie/events/quarkus/config/QuarkusEventConfig.java b/events/quarkus/src/main/java/org/projectnessie/events/quarkus/config/QuarkusEventConfig.java index 468c0aec1f5..0df5b71136f 100644 --- a/events/quarkus/src/main/java/org/projectnessie/events/quarkus/config/QuarkusEventConfig.java +++ b/events/quarkus/src/main/java/org/projectnessie/events/quarkus/config/QuarkusEventConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.events.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; @@ -23,7 +22,6 @@ import java.util.Map; import org.projectnessie.events.service.EventConfig; -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.events") public interface QuarkusEventConfig extends EventConfig { diff --git a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusBigTableConfig.java b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusBigTableConfig.java index e0e74207b9b..4ff777b0b01 100644 --- a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusBigTableConfig.java +++ b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusBigTableConfig.java @@ -16,7 +16,6 @@ package org.projectnessie.quarkus.config; import com.google.api.gax.core.CredentialsProvider; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.Optional; @@ -26,7 +25,6 @@ * When setting {@code nessie.version.store.type=BIGTABLE} which enables Google BigTable as the * version store used by the Nessie server, the following configurations are applicable. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.persist.bigtable") public interface QuarkusBigTableConfig extends BigTableClientsConfig { diff --git a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusCassandraConfig.java b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusCassandraConfig.java index a59e31a15d5..29a421bc3ea 100644 --- a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusCassandraConfig.java +++ b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusCassandraConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.time.Duration; @@ -25,7 +24,6 @@ * When setting {@code nessie.version.store.type=CASSANDRA} which enables Apache Cassandra as the * version store used by the Nessie server, the following configurations are applicable. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.cassandra") public interface QuarkusCassandraConfig extends Cassandra2Config { @Override diff --git a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusDynamoDBConfig.java b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusDynamoDBConfig.java index 99bfb50c85f..dd967a97a7d 100644 --- a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusDynamoDBConfig.java +++ b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusDynamoDBConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import java.util.Optional; @@ -23,7 +22,6 @@ * When setting {@code nessie.version.store.type=DYNAMODB} which enables DynamoDB as the version * store used by the Nessie server, the following configurations are applicable. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.persist.dynamodb") public interface QuarkusDynamoDBConfig { /** Prefix for tables, default is no prefix. */ diff --git a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusJdbcConfig.java b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusJdbcConfig.java index 93e14322453..b8c0fd079cf 100644 --- a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusJdbcConfig.java +++ b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusJdbcConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithName; import java.util.Optional; @@ -79,7 +78,6 @@ *

A complete set of JDBC configuration options can be found on quarkus.io. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.persist.jdbc") public interface QuarkusJdbcConfig extends Jdbc2BackendBaseConfig { diff --git a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusRocksConfig.java b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusRocksConfig.java index 80013c0df41..e1abc6d3bc7 100644 --- a/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusRocksConfig.java +++ b/servers/quarkus-common/src/main/java/org/projectnessie/quarkus/config/QuarkusRocksConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; @@ -26,7 +25,6 @@ * When setting {@code nessie.version.store.type=ROCKSDB} which enables RocksDB as the version store * used by the Nessie server, the following configurations are applicable. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store.persist.rocks") public interface QuarkusRocksConfig extends RocksDBBackendBaseConfig { diff --git a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthenticationConfig.java b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthenticationConfig.java index d0a91cafd28..40aed43660f 100644 --- a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthenticationConfig.java +++ b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthenticationConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; @@ -23,7 +22,6 @@ import java.util.Set; /** Configuration for Nessie authentication settings. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.server.authentication") public interface QuarkusNessieAuthenticationConfig { diff --git a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthorizationConfig.java b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthorizationConfig.java index ea499284048..54d3d2d19e2 100644 --- a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthorizationConfig.java +++ b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusNessieAuthorizationConfig.java @@ -15,14 +15,12 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; import java.util.Map; /** Configuration for Nessie authorization settings. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.server.authorization") public interface QuarkusNessieAuthorizationConfig { diff --git a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusServerConfig.java b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusServerConfig.java index 17e826ba4a8..646e190817c 100644 --- a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusServerConfig.java +++ b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusServerConfig.java @@ -15,13 +15,11 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; import org.projectnessie.services.config.ServerConfig; -@StaticInitSafe @ConfigMapping(prefix = "nessie.server") public interface QuarkusServerConfig extends ServerConfig { diff --git a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusStoreConfig.java b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusStoreConfig.java index effb474bc49..9c00e745ba4 100644 --- a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusStoreConfig.java +++ b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/QuarkusStoreConfig.java @@ -15,7 +15,6 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithConverter; import io.smallrye.config.WithDefault; @@ -27,7 +26,6 @@ import java.util.OptionalInt; import org.projectnessie.versioned.storage.common.config.StoreConfig; -@StaticInitSafe @ConfigMapping(prefix = QuarkusStoreConfig.NESSIE_VERSION_STORE_PERSIST) public interface QuarkusStoreConfig extends StoreConfig { diff --git a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/VersionStoreConfig.java b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/VersionStoreConfig.java index b8d5e9e03fd..6f08a65383c 100644 --- a/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/VersionStoreConfig.java +++ b/servers/quarkus-config/src/main/java/org/projectnessie/quarkus/config/VersionStoreConfig.java @@ -15,13 +15,11 @@ */ package org.projectnessie.quarkus.config; -import io.quarkus.runtime.annotations.StaticInitSafe; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import io.smallrye.config.WithName; /** Version store configuration. */ -@StaticInitSafe @ConfigMapping(prefix = "nessie.version.store") public interface VersionStoreConfig {