This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git


The following commit(s) were added to refs/heads/master by this push:
     new 46e4d460b Add RuntimeEnvironment.inContainer() (#1241)
46e4d460b is described below

commit 46e4d460b37986d832ae45ab07fe3f1afd1da856
Author: Gary Gregory <garydgreg...@users.noreply.github.com>
AuthorDate: Thu Jul 11 08:00:06 2024 -0400

    Add RuntimeEnvironment.inContainer() (#1241)
    
    * Add RuntimeEnv.inContainer()
    
    * Add since tag
    
    ---------
    
    Co-authored-by: Gary Gregory <gardgreg...@gmail.com>
---
 .../apache/commons/lang3/RuntimeEnvironment.java   | 96 ++++++++++++++++++++++
 .../commons/lang3/RuntimeEnvironmentTest.java      | 37 +++++++++
 2 files changed, 133 insertions(+)

diff --git a/src/main/java/org/apache/commons/lang3/RuntimeEnvironment.java 
b/src/main/java/org/apache/commons/lang3/RuntimeEnvironment.java
new file mode 100644
index 000000000..06ab37ccf
--- /dev/null
+++ b/src/main/java/org/apache/commons/lang3/RuntimeEnvironment.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.commons.lang3;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.stream.Stream;
+
+/**
+ * Helps query the runtime environment.
+ *
+ * @since 3.15.0
+ */
+public class RuntimeEnvironment {
+
+    /**
+     * Tests whether the file at the given path string contains a specific 
line.
+     *
+     * @param path The path to a file.
+     * @param line The line to find.
+     * @return whether the file at the given path string contains a specific 
line.
+     */
+    private static Boolean containsLine(final String path, final String line) {
+        try (Stream<String> stream = Files.lines(Paths.get(path))) {
+            return stream.anyMatch(test -> test.contains(line));
+        } catch (final IOException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Tests whether we are running in a container like Docker or Podman.
+     *
+     * @return whether we are running in a container like Docker or Podman.
+     * @since 3.15.0.
+     */
+    public static Boolean inContainer() {
+        return inDocker() || inPodman();
+    }
+
+    /**
+     * Tests whether we are running in a Docker container.
+     * <p>
+     * Package-private for testing.
+     * </p>
+     *
+     * @return whether we are running in a Docker container.
+     */
+    // Could be public at a later time.
+    static Boolean inDocker() {
+        return containsLine("/proc/1/cgroup", "/docker");
+    }
+
+    /**
+     * Tests whether we are running in a Podman container.
+     * <p>
+     * Package-private for testing.
+     * </p>
+     *
+     * @return whether we are running in a Podman container.
+     */
+    // Could be public at a later time.
+    static Boolean inPodman() {
+        return containsLine("/proc/1/environ", "container=podman");
+    }
+
+    /**
+     * Tests whether we are running in a Windows Subsystem for Linux (WSL).
+     * <p>
+     * Package-private for testing.
+     * </p>
+     *
+     * @return whether we are running in a Windows Subsystem for Linux (WSL).
+     */
+    // Could be public at a later time.
+    static Boolean inWsl() {
+        return containsLine("/proc/1/environ", 
"container=wslcontainer_host_id");
+    }
+
+}
diff --git a/src/test/java/org/apache/commons/lang3/RuntimeEnvironmentTest.java 
b/src/test/java/org/apache/commons/lang3/RuntimeEnvironmentTest.java
new file mode 100644
index 000000000..af0461f75
--- /dev/null
+++ b/src/test/java/org/apache/commons/lang3/RuntimeEnvironmentTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.commons.lang3;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests {@link RuntimeEnvironment}.
+ */
+public class RuntimeEnvironmentTest {
+
+    @Test
+    public void testIsContainer() {
+        // At least make sure it does not blow up.
+        assertDoesNotThrow(RuntimeEnvironment::inContainer);
+        assertDoesNotThrow(RuntimeEnvironment::inDocker);
+        assertDoesNotThrow(RuntimeEnvironment::inPodman);
+        assertDoesNotThrow(RuntimeEnvironment::inWsl);
+    }
+}

Reply via email to