From 0ddb8bbbf923be9a8878b6578e7a9fd62a5f5560 Mon Sep 17 00:00:00 2001 From: Maxim Katcharov Date: Wed, 5 Feb 2025 15:44:34 -0700 Subject: [PATCH 1/3] Add env var override --- .../connection/ClientMetadataHelper.java | 2 +- .../internal/connection/FaasEnvironment.java | 30 +++++++++++++------ .../com/mongodb/client/WithWrapper.java | 15 ++-------- .../connection/FaasEnvironmentAccessor.java | 25 ++++++++++++++++ 4 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java diff --git a/driver-core/src/main/com/mongodb/internal/connection/ClientMetadataHelper.java b/driver-core/src/main/com/mongodb/internal/connection/ClientMetadataHelper.java index 36d2d891829..825af685c10 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ClientMetadataHelper.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ClientMetadataHelper.java @@ -224,7 +224,7 @@ private enum Orchestrator { K8S("kubernetes") { @Override boolean isCurrentOrchestrator() { - return System.getenv("KUBERNETES_SERVICE_HOST") != null; + return FaasEnvironment.getEnv("KUBERNETES_SERVICE_HOST") != null; } }, UNKNOWN(null); diff --git a/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java b/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java index 6627722097b..979dac95416 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java +++ b/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java @@ -20,7 +20,9 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; enum FaasEnvironment { AWS_LAMBDA("aws.lambda"), @@ -29,21 +31,23 @@ enum FaasEnvironment { VERCEL("vercel"), UNKNOWN(null); + static Map envOverridesForTesting = new HashMap<>(); + static FaasEnvironment getFaasEnvironment() { List result = new ArrayList<>(); - String awsExecutionEnv = System.getenv("AWS_EXECUTION_ENV"); + String awsExecutionEnv = getEnv("AWS_EXECUTION_ENV"); - if (System.getenv("VERCEL") != null) { + if (getEnv("VERCEL") != null) { result.add(FaasEnvironment.VERCEL); } if ((awsExecutionEnv != null && awsExecutionEnv.startsWith("AWS_Lambda_")) - || System.getenv("AWS_LAMBDA_RUNTIME_API") != null) { + || getEnv("AWS_LAMBDA_RUNTIME_API") != null) { result.add(FaasEnvironment.AWS_LAMBDA); } - if (System.getenv("FUNCTIONS_WORKER_RUNTIME") != null) { + if (getEnv("FUNCTIONS_WORKER_RUNTIME") != null) { result.add(FaasEnvironment.AZURE_FUNC); } - if (System.getenv("K_SERVICE") != null || System.getenv("FUNCTION_NAME") != null) { + if (getEnv("K_SERVICE") != null || getEnv("FUNCTION_NAME") != null) { result.add(FaasEnvironment.GCP_FUNC); } // vercel takes precedence over aws.lambda @@ -56,6 +60,14 @@ static FaasEnvironment getFaasEnvironment() { return result.get(0); } + @Nullable + public static String getEnv(final String key) { + if (envOverridesForTesting.containsKey(key)) { + return envOverridesForTesting.get(key); + } + return System.getenv(key); + } + @Nullable private final String name; @@ -95,11 +107,11 @@ public Integer getMemoryMb() { public String getRegion() { switch (this) { case AWS_LAMBDA: - return System.getenv("AWS_REGION"); + return getEnv("AWS_REGION"); case GCP_FUNC: - return System.getenv("FUNCTION_REGION"); + return getEnv("FUNCTION_REGION"); case VERCEL: - return System.getenv("VERCEL_REGION"); + return getEnv("VERCEL_REGION"); default: return null; } @@ -108,7 +120,7 @@ public String getRegion() { @Nullable private static Integer getEnvInteger(final String name) { try { - String value = System.getenv(name); + String value = getEnv(name); return Integer.parseInt(value); } catch (NumberFormatException e) { return null; diff --git a/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java b/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java index 6484f642a1a..4e8720d36d0 100644 --- a/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java +++ b/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java @@ -16,13 +16,11 @@ package com.mongodb.client; +import com.mongodb.internal.connection.FaasEnvironmentAccessor; import com.mongodb.lang.Nullable; -import java.lang.reflect.Field; import java.util.Map; -import static java.lang.System.getenv; - @FunctionalInterface public interface WithWrapper { @@ -66,15 +64,6 @@ default WithWrapper withSystemProperty(final String name, final String value) { } static Map getEnvInnerMap() { - try { - Map env = getenv(); - Field field = env.getClass().getDeclaredField("m"); - field.setAccessible(true); - @SuppressWarnings("unchecked") - Map result = (Map) field.get(env); - return result; - } catch (IllegalAccessException | NoSuchFieldException e) { - throw new RuntimeException(e); - } + return FaasEnvironmentAccessor.getFaasEnvMap(); } } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java new file mode 100644 index 00000000000..d685b365a17 --- /dev/null +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java @@ -0,0 +1,25 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * 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 com.mongodb.internal.connection; + +import java.util.Map; + +public class FaasEnvironmentAccessor { + public static Map getFaasEnvMap() { + return FaasEnvironment.envOverridesForTesting; + } +} From 633f9a25ff4333585867b834d0cfc4c8cedd8d09 Mon Sep 17 00:00:00 2001 From: Maxim Katcharov Date: Thu, 6 Feb 2025 15:20:07 -0700 Subject: [PATCH 2/3] PR fixes --- .../src/test/functional/com/mongodb/client/WithWrapper.java | 5 +---- .../mongodb/internal/connection/FaasEnvironmentAccessor.java | 3 +++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java b/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java index 4e8720d36d0..e610f578112 100644 --- a/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java +++ b/driver-core/src/test/functional/com/mongodb/client/WithWrapper.java @@ -32,7 +32,7 @@ static WithWrapper withWrapper() { default WithWrapper withEnvironmentVariable(final String name, @Nullable final String value) { return runnable -> { - Map innerMap = getEnvInnerMap(); + Map innerMap = FaasEnvironmentAccessor.getFaasEnvMap(); String original = innerMap.get(name); if (value == null) { innerMap.remove(name); @@ -63,7 +63,4 @@ default WithWrapper withSystemProperty(final String name, final String value) { }; } - static Map getEnvInnerMap() { - return FaasEnvironmentAccessor.getFaasEnvMap(); - } } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java index d685b365a17..b3609cab1a0 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java @@ -18,6 +18,9 @@ import java.util.Map; +/** + * In the same package as FaasEnvironment, to access package-private + */ public class FaasEnvironmentAccessor { public static Map getFaasEnvMap() { return FaasEnvironment.envOverridesForTesting; From 27969fd6ca616b0d99c2ae69e5238b1b94449977 Mon Sep 17 00:00:00 2001 From: Maxim Katcharov Date: Fri, 7 Feb 2025 17:12:38 -0700 Subject: [PATCH 3/3] checkstyle --- .../com/mongodb/internal/connection/FaasEnvironment.java | 6 +++--- .../internal/connection/FaasEnvironmentAccessor.java | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java b/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java index 979dac95416..a54c1efb066 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java +++ b/driver-core/src/main/com/mongodb/internal/connection/FaasEnvironment.java @@ -31,7 +31,7 @@ enum FaasEnvironment { VERCEL("vercel"), UNKNOWN(null); - static Map envOverridesForTesting = new HashMap<>(); + static final Map ENV_OVERRIDES_FOR_TESTING = new HashMap<>(); static FaasEnvironment getFaasEnvironment() { List result = new ArrayList<>(); @@ -62,8 +62,8 @@ static FaasEnvironment getFaasEnvironment() { @Nullable public static String getEnv(final String key) { - if (envOverridesForTesting.containsKey(key)) { - return envOverridesForTesting.get(key); + if (ENV_OVERRIDES_FOR_TESTING.containsKey(key)) { + return ENV_OVERRIDES_FOR_TESTING.get(key); } return System.getenv(key); } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java index b3609cab1a0..ccc71f718ba 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/FaasEnvironmentAccessor.java @@ -21,8 +21,11 @@ /** * In the same package as FaasEnvironment, to access package-private */ -public class FaasEnvironmentAccessor { +public final class FaasEnvironmentAccessor { + private FaasEnvironmentAccessor() { + } + public static Map getFaasEnvMap() { - return FaasEnvironment.envOverridesForTesting; + return FaasEnvironment.ENV_OVERRIDES_FOR_TESTING; } }