From 6d44f7e080aed5c4a59f201e1968f97d679e47e2 Mon Sep 17 00:00:00 2001 From: Oleg Nenashev Date: Wed, 3 Jan 2018 11:59:24 +0100 Subject: [PATCH] [JENKINS-48766] - Create restricted API for getting info about Remoting versions --- .../jenkins/slaves/remoting-info.properties | 6 + .../java/hudson/TcpSlaveAgentListener.java | 1 + .../jenkins/slaves/RemotingVersionInfo.java | 104 ++++++++++++++++++ .../slaves/RemotingVersionInfoTest.java | 47 ++++++++ pom.xml | 6 +- 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 core/src/filter/resources/jenkins/slaves/remoting-info.properties create mode 100644 core/src/main/java/jenkins/slaves/RemotingVersionInfo.java create mode 100644 core/src/test/java/jenkins/slaves/RemotingVersionInfoTest.java diff --git a/core/src/filter/resources/jenkins/slaves/remoting-info.properties b/core/src/filter/resources/jenkins/slaves/remoting-info.properties new file mode 100644 index 0000000000..5a3a6ef14a --- /dev/null +++ b/core/src/filter/resources/jenkins/slaves/remoting-info.properties @@ -0,0 +1,6 @@ +# Remoting version, which is embedded into the core +# This version MAY differ from what is really classloaded (see the "Pluggable Core Components", JENKINS-41196) +remoting.embedded.version=${remoting.version} + +# Minimal Remoting version on external agents which is supported by the core +remoting.minimal.supported.version=${remoting.minimal.supported.version} diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 6b41b6dcf1..e6e2a7807d 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -290,6 +290,7 @@ public final class TcpSlaveAgentListener extends Thread { try { Writer o = new OutputStreamWriter(s.getOutputStream(), "UTF-8"); + //TODO: expose version about minimal supported Remoting version (JENKINS-48766) if (header.startsWith("GET / ")) { o.write("HTTP/1.0 200 OK\r\n"); o.write("Content-Type: text/plain;charset=UTF-8\r\n"); diff --git a/core/src/main/java/jenkins/slaves/RemotingVersionInfo.java b/core/src/main/java/jenkins/slaves/RemotingVersionInfo.java new file mode 100644 index 0000000000..e4ac3b71c7 --- /dev/null +++ b/core/src/main/java/jenkins/slaves/RemotingVersionInfo.java @@ -0,0 +1,104 @@ +/* + * The MIT License + * + * Copyright (c) 2018, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.slaves; + +import hudson.util.VersionNumber; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; + +// TODO: Make the API public (JENKINS-48766) +/** + * Provides information about Remoting versions used withing the core. + * @author Oleg Nenashev + * @since TODO + */ +@Restricted(NoExternalUse.class) +public class RemotingVersionInfo { + + private static final Logger LOGGER = Logger.getLogger(RemotingVersionInfo.class.getName()); + private static final String RESOURCE_NAME="remoting-info.properties"; + + @CheckForNull + private static VersionNumber EMBEDDED_VERSION; + + @CheckForNull + private static VersionNumber MINIMAL_SUPPORTED_VERSION; + + private RemotingVersionInfo() {} + + static { + Properties props = new Properties(); + try (InputStream is = RemotingVersionInfo.class.getResourceAsStream(RESOURCE_NAME)) { + if(is!=null) { + props.load(is); + } + } catch (IOException e) { + LOGGER.log(Level.WARNING, "Failed to load Remoting Info from " + RESOURCE_NAME, e); + } + + EMBEDDED_VERSION = tryExtractVersion(props, "remoting.embedded.version"); + MINIMAL_SUPPORTED_VERSION = tryExtractVersion(props, "remoting.minimal.supported.version"); + } + + @CheckForNull + private static VersionNumber tryExtractVersion(@Nonnull Properties props, @Nonnull String propertyName) { + String prop = props.getProperty(propertyName); + if (prop == null) { + LOGGER.log(Level.FINE, "Property {0} is not defined in {1}", new Object[] {propertyName, RESOURCE_NAME}); + return null; + } + + if(prop.contains("${")) { // Due to whatever reason, Maven does not nullify them + LOGGER.log(Level.WARNING, "Property {0} in {1} has unresolved variable(s). Raw value: {2}", + new Object[] {propertyName, RESOURCE_NAME, prop}); + return null; + } + + try { + return new VersionNumber(prop); + } catch (RuntimeException ex) { + LOGGER.log(Level.WARNING, String.format("Failed to parse version for for property %s in %s. Raw Value: %s", + propertyName, RESOURCE_NAME, prop), ex); + return null; + } + } + + @CheckForNull + public static VersionNumber getEmbeddedVersion() { + return EMBEDDED_VERSION; + } + + @CheckForNull + public static VersionNumber getMinimalSupportedVersion() { + return MINIMAL_SUPPORTED_VERSION; + } +} diff --git a/core/src/test/java/jenkins/slaves/RemotingVersionInfoTest.java b/core/src/test/java/jenkins/slaves/RemotingVersionInfoTest.java new file mode 100644 index 0000000000..3e894b404c --- /dev/null +++ b/core/src/test/java/jenkins/slaves/RemotingVersionInfoTest.java @@ -0,0 +1,47 @@ +/* + * The MIT License + * + * Copyright (c) 2018, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.slaves; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.assertThat; + +/** + * Tests for {@link RemotingVersionInfo}. + */ +public class RemotingVersionInfoTest { + + @Test + public void shouldLoadEmbeddedVersionByDefault() { + assertThat("Remoting Embedded version is not defined", + RemotingVersionInfo.getEmbeddedVersion(), notNullValue()); + } + + @Test + public void shouldLoadMinimalSupportedVersionByDefault() { + assertThat("Remoting Minimal supported version is not defined", + RemotingVersionInfo.getMinimalSupportedVersion(), notNullValue()); + } +} diff --git a/pom.xml b/pom.xml index d6324453bd..d0f11bbe36 100644 --- a/pom.xml +++ b/pom.xml @@ -104,6 +104,10 @@ THE SOFTWARE. 3.0.0 + + 3.15 + 2.60 +