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); + } +}