Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[JENKINS-47056] nested JNLPLauncher settings ignored
- fixed by stripping off DelegatedComputerLaunchers and
  ComputerLauncherFilters when rendering slave-agent.jnlp
  • Loading branch information
MartinNowak committed Oct 7, 2017
1 parent 2fe1514 commit 257cc23
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 18 deletions.
23 changes: 23 additions & 0 deletions core/src/main/java/hudson/slaves/SlaveComputer.java
Expand Up @@ -234,10 +234,33 @@ public boolean isLaunchSupported() {
return launcher.isLaunchSupported();
}

/**
* Return the {@code ComputerLauncher} for this SlaveComputer.
* @since 1.312
*/
public ComputerLauncher getLauncher() {
return launcher;
}

/**
* Return the {@code ComputerLauncher} for this SlaveComputer, strips off
* any {@code DelegatingComputerLauncher}s or {@code ComputerLauncherFilter}s.
* @since 2.83
*/
public ComputerLauncher getDelegatedLauncher() {
ComputerLauncher l = launcher;
while (true) {
if (l instanceof DelegatingComputerLauncher) {
l = ((DelegatingComputerLauncher) l).getLauncher();
} else if (l instanceof ComputerLauncherFilter) {
l = ((ComputerLauncherFilter) l).getCore();
} else {
break;
}
}
return l;
}

protected Future<?> _connect(boolean forceReconnect) {
if(channel!=null) return Futures.precomputed(null);
if(!forceReconnect && isConnecting())
Expand Down
Expand Up @@ -46,14 +46,16 @@ THE SOFTWARE.
<all-permissions/>
</security>

<j:set var="launcher" value="${it.delegatedLauncher}"/>

<resources>
<j:set var="port" value="${request.getParameter('debugPort')}"/>
<j:choose>
<j:when test="${port!=null}">
<j2se version="1.8+" java-vm-args="${it.launcher.vmargs} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=${port}" />
<j2se version="1.8+" java-vm-args="${launcher.vmargs} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=${port}" />
</j:when>
<j:otherwise>
<j2se version="1.8+" java-vm-args="${it.launcher.vmargs}"/>
<j2se version="1.8+" java-vm-args="${launcher.vmargs}"/>
</j:otherwise>
</j:choose>
<jar href="${rootURL}jnlpJars/remoting.jar"/>
Expand All @@ -62,23 +64,23 @@ THE SOFTWARE.
<application-desc main-class="hudson.remoting.jnlp.Main">
<argument>${it.jnlpMac}</argument>
<argument>${it.node.nodeName}</argument>
<j:if test="${it.launcher.tunnel!=null}">
<j:if test="${launcher.tunnel!=null}">
<argument>-tunnel</argument>
<argument>${it.launcher.tunnel}</argument>
<argument>${launcher.tunnel}</argument>
</j:if>
<j:if test="${not it.launcher.workDirSettings.disabled}">
<j:if test="${not launcher.workDirSettings.disabled}">
<argument>-workDir</argument>
<j:choose>
<j:when test="${it.launcher.workDirSettings.useAgentRootDir}">
<j:when test="${launcher.workDirSettings.useAgentRootDir}">
<argument>${it.node.remoteFS}</argument>
</j:when>
<j:otherwise>
<argument>${it.launcher.workDirSettings.workDirPath}</argument>
<argument>${launcher.workDirSettings.workDirPath}</argument>
</j:otherwise>
</j:choose>
<argument>-internalDir</argument>
<argument>${it.launcher.workDirSettings.internalDir}</argument>
<j:if test="${it.launcher.workDirSettings.failIfWorkDirIsMissing}">
<argument>${launcher.workDirSettings.internalDir}</argument>
<j:if test="${launcher.workDirSettings.failIfWorkDirIsMissing}">
<argument>-failIfWorkDirIsMissing</argument>
</j:if>
</j:if>
Expand Down
55 changes: 46 additions & 9 deletions test/src/test/java/hudson/slaves/JNLPLauncherTest.java
Expand Up @@ -32,9 +32,11 @@
import hudson.model.Node.Mode;
import hudson.model.Slave;
import hudson.remoting.Which;
import hudson.slaves.DelegatingComputerLauncher;
import hudson.util.ArgumentListBuilder;

import jenkins.security.SlaveToMasterCallable;
import jenkins.slaves.RemotingWorkDirSettings;

import org.junit.Assume;
import org.junit.Rule;
Expand Down Expand Up @@ -152,6 +154,32 @@ public void testDefaults() throws Exception {
assertTrue(errorMsg, new JNLPLauncher(null, null).getWorkDirSettings().isDisabled());
}

@Test
@Issue("JENKINS-47056")
public void testDelegatingComputerLauncher() throws Exception {
Assume.assumeFalse("Skipping JNLPLauncherTest.testDelegatingComputerLauncher because we are running headless", GraphicsEnvironment.isHeadless());
File workDir = tmpDir.newFolder("workDir");

ComputerLauncher launcher = new JNLPLauncher("", "", new RemotingWorkDirSettings(false, workDir.getAbsolutePath(), "internalDir", false));
launcher = new DelegatingComputerLauncherImpl(launcher);
Computer c = addTestSlave(launcher);
launchJnlpAndVerify(c, buildJnlpArgs(c));
assertTrue("Remoting work dir should have been created", new File(workDir, "internalDir").exists());
}

@Test
@Issue("JENKINS-47056")
public void testComputerLauncherFilter() throws Exception {
Assume.assumeFalse("Skipping JNLPLauncherTest.testComputerLauncherFilter because we are running headless", GraphicsEnvironment.isHeadless());
File workDir = tmpDir.newFolder("workDir");

ComputerLauncher launcher = new JNLPLauncher("", "", new RemotingWorkDirSettings(false, workDir.getAbsolutePath(), "internalDir", false));
launcher = new ComputerLauncherFilterImpl(launcher);
Computer c = addTestSlave(launcher);
launchJnlpAndVerify(c, buildJnlpArgs(c));
assertTrue("Remoting work dir should have been created", new File(workDir, "internalDir").exists());
}

@TestExtension("testHeadlessLaunch")
public static class ListenerImpl extends ComputerListener {
int offlined = 0;
Expand All @@ -163,13 +191,25 @@ public void onOffline(Computer c) {
}
}

private static class DelegatingComputerLauncherImpl extends DelegatingComputerLauncher {
public DelegatingComputerLauncherImpl(ComputerLauncher launcher) {
super(launcher);
}
}

private static class ComputerLauncherFilterImpl extends ComputerLauncherFilter {
public ComputerLauncherFilterImpl(ComputerLauncher launcher) {
super(launcher);
}
}

private ArgumentListBuilder buildJnlpArgs(Computer c) throws Exception {
ArgumentListBuilder args = new ArgumentListBuilder();
args.add(new File(new File(System.getProperty("java.home")),"bin/java").getPath(),"-jar");
args.add(Which.jarFile(netx.jnlp.runtime.JNLPRuntime.class).getAbsolutePath());
args.add("-headless","-basedir");
args.add(j.createTmpDir());
args.add("-nosecurity","-jnlp", getJnlpLink(c));
args.add("-nosecurity","-jnlp", j.getURL() + "computer/"+c.getName()+"/slave-agent.jnlp");

if (c instanceof SlaveComputer) {
SlaveComputer sc = (SlaveComputer)c;
Expand Down Expand Up @@ -213,23 +253,20 @@ private void launchJnlpAndVerify(Computer c, ArgumentListBuilder args) throws Ex
}

/**
* Determines the link to the .jnlp file.
* Adds a JNLP {@link Slave} to the system and returns it.
*/
private String getJnlpLink(Computer c) throws Exception {
HtmlPage p = j.createWebClient().goTo("computer/"+c.getName()+"/");
String href = ((HtmlAnchor) p.getElementById("jnlp-link")).getHrefAttribute();
href = new URL(new URL(p.getUrl().toExternalForm()),href).toExternalForm();
return href;
private Computer addTestSlave(boolean enableWorkDir) throws Exception {
return addTestSlave(new JNLPLauncher(enableWorkDir));
}

/**
* Adds a JNLP {@link Slave} to the system and returns it.
*/
private Computer addTestSlave(boolean enableWorkDir) throws Exception {
private Computer addTestSlave(ComputerLauncher launcher) throws Exception {
List<Node> slaves = new ArrayList<Node>(j.jenkins.getNodes());
File dir = Util.createTempDir();
slaves.add(new DumbSlave("test","dummy",dir.getAbsolutePath(),"1", Mode.NORMAL, "",
new JNLPLauncher(enableWorkDir), RetentionStrategy.INSTANCE, new ArrayList<NodeProperty<?>>()));
launcher, RetentionStrategy.INSTANCE, new ArrayList<NodeProperty<?>>()));
j.jenkins.setNodes(slaves);
Computer c = j.jenkins.getComputer("test");
assertNotNull(c);
Expand Down

0 comments on commit 257cc23

Please sign in to comment.