mirror of https://github.com/jenkinsci/jenkins.git
Merge branch 'master' into improve-tooltips-dropdowns
This commit is contained in:
commit
3dd0b9f421
|
@ -63,7 +63,7 @@ THE SOFTWARE.
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
<artifactId>spring-framework-bom</artifactId>
|
<artifactId>spring-framework-bom</artifactId>
|
||||||
<version>6.2.4</version>
|
<version>6.2.5</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -89,7 +89,7 @@ THE SOFTWARE.
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<version>33.4.0-jre</version>
|
<version>33.4.5-jre</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.xml.txw2</groupId>
|
<groupId>com.sun.xml.txw2</groupId>
|
||||||
|
|
|
@ -2633,11 +2633,13 @@ public class Functions {
|
||||||
StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
|
StaplerRequest2 currentRequest = Stapler.getCurrentRequest2();
|
||||||
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse2());
|
currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse2());
|
||||||
String userAgent = currentRequest.getHeader("User-Agent");
|
String userAgent = currentRequest.getHeader("User-Agent");
|
||||||
|
if (userAgent != null) {
|
||||||
List<String> platformsThatUseCommand = List.of("MAC", "IPHONE", "IPAD");
|
List<String> platformsThatUseCommand = List.of("MAC", "IPHONE", "IPAD");
|
||||||
boolean useCmdKey = platformsThatUseCommand.stream().anyMatch(e -> userAgent.toUpperCase().contains(e));
|
boolean useCmdKey = platformsThatUseCommand.stream().anyMatch(e -> userAgent.toUpperCase().contains(e));
|
||||||
|
return keyboardShortcut.replace("CMD", useCmdKey ? "⌘" : "CTRL");
|
||||||
return keyboardShortcut.replace("CMD", useCmdKey ? "⌘" : "CTRL");
|
} else {
|
||||||
|
return keyboardShortcut;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Restricted(NoExternalUse.class)
|
@Restricted(NoExternalUse.class)
|
||||||
|
|
|
@ -350,7 +350,7 @@ THE SOFTWARE.
|
||||||
<artifactItem>
|
<artifactItem>
|
||||||
<groupId>io.jenkins.plugins</groupId>
|
<groupId>io.jenkins.plugins</groupId>
|
||||||
<artifactId>design-library</artifactId>
|
<artifactId>design-library</artifactId>
|
||||||
<version>358.vcc903045e088</version>
|
<version>371.v171782a_56701</version>
|
||||||
<type>hpi</type>
|
<type>hpi</type>
|
||||||
<outputDirectory>${project.build.outputDirectory}/plugins</outputDirectory>
|
<outputDirectory>${project.build.outputDirectory}/plugins</outputDirectory>
|
||||||
<destFileName>design-library.jpi</destFileName>
|
<destFileName>design-library.jpi</destFileName>
|
||||||
|
|
|
@ -85,75 +85,55 @@ public class DisconnectNodeCommandTest {
|
||||||
@Test
|
@Test
|
||||||
public void disconnectNodeShouldSucceed() throws Exception {
|
public void disconnectNodeShouldSucceed() throws Exception {
|
||||||
DumbSlave slave = j.createSlave("aNode", "", null);
|
DumbSlave slave = j.createSlave("aNode", "", null);
|
||||||
slave.toComputer().waitUntilOnline();
|
assertOnline(slave);
|
||||||
assertThat(slave.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
CLICommandInvoker.Result result = command
|
CLICommandInvoker.Result result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode");
|
.invokeWithArgs("aNode");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, null);
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null));
|
|
||||||
|
|
||||||
slave.toComputer().connect(true);
|
slave.toComputer().connect(true);
|
||||||
slave.toComputer().waitUntilOnline();
|
assertOnline(slave);
|
||||||
assertThat(slave.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
result = command
|
result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode");
|
.invokeWithArgs("aNode");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, null);
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null));
|
|
||||||
|
|
||||||
result = command
|
result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode");
|
.invokeWithArgs("aNode");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, null);
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo(null));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void disconnectNodeShouldSucceedWithCause() throws Exception {
|
public void disconnectNodeShouldSucceedWithCause() throws Exception {
|
||||||
DumbSlave slave = j.createSlave("aNode", "", null);
|
DumbSlave slave = j.createSlave("aNode", "", null);
|
||||||
slave.toComputer().waitUntilOnline();
|
assertOnline(slave);
|
||||||
assertThat(slave.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
CLICommandInvoker.Result result = command
|
CLICommandInvoker.Result result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode", "-m", "aCause");
|
.invokeWithArgs("aNode", "-m", "aCause");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, "aCause");
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("aCause"));
|
|
||||||
|
|
||||||
slave.toComputer().connect(true);
|
slave.toComputer().connect(true);
|
||||||
slave.toComputer().waitUntilOnline();
|
assertOnline(slave);
|
||||||
assertThat(slave.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
result = command
|
result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode", "-m", "anotherCause");
|
.invokeWithArgs("aNode", "-m", "anotherCause");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, "anotherCause");
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("anotherCause"));
|
|
||||||
|
|
||||||
result = command
|
result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode", "-m", "yetAnotherCause");
|
.invokeWithArgs("aNode", "-m", "yetAnotherCause");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave, "yetAnotherCause");
|
||||||
assertThat(slave.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave.toComputer().getOfflineCause()).message, equalTo("yetAnotherCause"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -161,29 +141,17 @@ public class DisconnectNodeCommandTest {
|
||||||
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
||||||
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
||||||
DumbSlave slave3 = j.createSlave("aNode3", "", null);
|
DumbSlave slave3 = j.createSlave("aNode3", "", null);
|
||||||
slave1.toComputer().waitUntilOnline();
|
assertOnline(slave1);
|
||||||
assertThat(slave1.toComputer().isOnline(), equalTo(true));
|
assertOnline(slave2);
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), equalTo(null));
|
assertOnline(slave3);
|
||||||
slave2.toComputer().waitUntilOnline();
|
|
||||||
assertThat(slave2.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
slave3.toComputer().waitUntilOnline();
|
|
||||||
assertThat(slave3.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave3.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
final CLICommandInvoker.Result result = command
|
final CLICommandInvoker.Result result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode1", "aNode2", "aNode3");
|
.invokeWithArgs("aNode1", "aNode2", "aNode3");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave1.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave1, null);
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
assertOffline(slave2, null);
|
||||||
assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null));
|
assertOffline(slave3, null);
|
||||||
assertThat(slave2.toComputer().isOffline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo(null));
|
|
||||||
assertThat(slave3.toComputer().isOffline(), equalTo(true));
|
|
||||||
assertThat(slave3.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave3.toComputer().getOfflineCause()).message, equalTo(null));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -194,10 +162,7 @@ public class DisconnectNodeCommandTest {
|
||||||
agents.add(j.createSlave("aNode" + i, "", null));
|
agents.add(j.createSlave("aNode" + i, "", null));
|
||||||
}
|
}
|
||||||
for (var agent : agents) {
|
for (var agent : agents) {
|
||||||
var computer = agent.toComputer();
|
assertOnline(agent);
|
||||||
computer.waitUntilOnline();
|
|
||||||
assertThat(computer.isOnline(), equalTo(true));
|
|
||||||
assertThat(computer.getOfflineCause(), equalTo(null));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var args = new ArrayList<String>();
|
var args = new ArrayList<String>();
|
||||||
|
@ -211,14 +176,7 @@ public class DisconnectNodeCommandTest {
|
||||||
.invokeWithArgs(args.toArray(String[]::new));
|
.invokeWithArgs(args.toArray(String[]::new));
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
for (var agent : agents) {
|
for (var agent : agents) {
|
||||||
var computer = agent.toComputer();
|
assertOffline(agent, "aCause");
|
||||||
assertThat(computer.isOffline(), equalTo(true));
|
|
||||||
var cause = computer.getOfflineCause();
|
|
||||||
if (cause instanceof OfflineCause.ByCLI cliCause) {
|
|
||||||
assertThat(cliCause.message, equalTo("aCause"));
|
|
||||||
} else {
|
|
||||||
assertThat("seen occasionally in CI", cause, instanceOf(OfflineCause.ChannelTermination.class));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,12 +184,8 @@ public class DisconnectNodeCommandTest {
|
||||||
public void disconnectNodeManyShouldFailIfANodeDoesNotExist() throws Exception {
|
public void disconnectNodeManyShouldFailIfANodeDoesNotExist() throws Exception {
|
||||||
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
||||||
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
||||||
slave1.toComputer().waitUntilOnline();
|
assertOnline(slave1);
|
||||||
assertThat(slave1.toComputer().isOnline(), equalTo(true));
|
assertOnline(slave2);
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
slave2.toComputer().waitUntilOnline();
|
|
||||||
assertThat(slave2.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
final CLICommandInvoker.Result result = command
|
final CLICommandInvoker.Result result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
|
@ -240,34 +194,40 @@ public class DisconnectNodeCommandTest {
|
||||||
assertThat(result, hasNoStandardOutput());
|
assertThat(result, hasNoStandardOutput());
|
||||||
assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?"));
|
assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?"));
|
||||||
assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT));
|
assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT));
|
||||||
assertThat(slave1.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave1, "aCause");
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
assertOffline(slave2, "aCause");
|
||||||
assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause"));
|
|
||||||
assertThat(slave2.toComputer().isOffline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
|
||||||
assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void disconnectNodeManyShouldSucceedEvenANodeIsSpecifiedTwice() throws Exception {
|
public void disconnectNodeManyShouldSucceedEvenANodeIsSpecifiedTwice() throws Exception {
|
||||||
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
DumbSlave slave1 = j.createSlave("aNode1", "", null);
|
||||||
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
DumbSlave slave2 = j.createSlave("aNode2", "", null);
|
||||||
slave1.toComputer().waitUntilOnline();
|
assertOnline(slave1);
|
||||||
assertThat(slave1.toComputer().isOnline(), equalTo(true));
|
assertOnline(slave2);
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
slave2.toComputer().waitUntilOnline();
|
|
||||||
assertThat(slave2.toComputer().isOnline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), equalTo(null));
|
|
||||||
|
|
||||||
final CLICommandInvoker.Result result = command
|
final CLICommandInvoker.Result result = command
|
||||||
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
.authorizedTo(Computer.DISCONNECT, Jenkins.READ)
|
||||||
.invokeWithArgs("aNode1", "aNode2", "aNode1", "-m", "aCause");
|
.invokeWithArgs("aNode1", "aNode2", "aNode1", "-m", "aCause");
|
||||||
assertThat(result, succeededSilently());
|
assertThat(result, succeededSilently());
|
||||||
assertThat(slave1.toComputer().isOffline(), equalTo(true));
|
assertOffline(slave1, "aCause");
|
||||||
assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
assertOffline(slave2, "aCause");
|
||||||
assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause"));
|
}
|
||||||
assertThat(slave2.toComputer().isOffline(), equalTo(true));
|
|
||||||
assertThat(slave2.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class));
|
private static void assertOnline(DumbSlave slave) throws InterruptedException {
|
||||||
assertThat(((OfflineCause.ByCLI) slave2.toComputer().getOfflineCause()).message, equalTo("aCause"));
|
var computer = slave.toComputer();
|
||||||
|
computer.waitUntilOnline();
|
||||||
|
assertThat(computer.isOnline(), equalTo(true));
|
||||||
|
assertThat(computer.getOfflineCause(), equalTo(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertOffline(DumbSlave slave, String message) {
|
||||||
|
var computer = slave.toComputer();
|
||||||
|
assertThat(computer.isOffline(), equalTo(true));
|
||||||
|
var offlineCause = computer.getOfflineCause();
|
||||||
|
if (offlineCause instanceof OfflineCause.ByCLI cliCause) {
|
||||||
|
assertThat(cliCause.message, equalTo(message));
|
||||||
|
} else {
|
||||||
|
assertThat("sometimes overrides ByCLI", offlineCause, instanceOf(OfflineCause.ChannelTermination.class));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -375,7 +375,7 @@ THE SOFTWARE.
|
||||||
<!-- dependency of trilead-api -->
|
<!-- dependency of trilead-api -->
|
||||||
<groupId>io.jenkins.plugins</groupId>
|
<groupId>io.jenkins.plugins</groupId>
|
||||||
<artifactId>eddsa-api</artifactId>
|
<artifactId>eddsa-api</artifactId>
|
||||||
<version>0.3.0-13.v7cb_69ed68f00</version>
|
<version>0.3.0.1-16.vcb_4a_98a_3531c</version>
|
||||||
<type>hpi</type>
|
<type>hpi</type>
|
||||||
</artifactItem>
|
</artifactItem>
|
||||||
<artifactItem>
|
<artifactItem>
|
||||||
|
|
Loading…
Reference in New Issue