diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index ab0f83f86b797499421440ef173488fc4ac3e1e0..12e20101adbe65836502aad44c5d455751e40adb 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -509,6 +509,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces public void setTemporarilyOffline(boolean temporarilyOffline, OfflineCause cause) { offlineCause = temporarilyOffline ? cause : null; this.temporarilyOffline = temporarilyOffline; + getNode().setTemporaryOfflineCause(offlineCause); Hudson.getInstance().getQueue().scheduleMaintenance(); } @@ -563,6 +564,16 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces this.nodeName = null; setNumExecutors(node.getNumExecutors()); + if (this.temporarilyOffline) { + // When we get a new node, push our current temp offline + // status to it (as the status is not carried across + // configuration changes that recreate the node). + // Since this is also called the very first time this + // Computer is created, avoid pushing an empty status + // as that could overwrite any status that the Node + // brought along from its persisted config data. + node.setTemporaryOfflineCause(this.offlineCause); + } } /** diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index b48c4e6b46e4d048e87ca36367de8682f2a4aa60..a0546893f8614fd3e3d2354c4e093253a49fb351 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -25,6 +25,7 @@ package hudson.model; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; +import hudson.Extension; import hudson.ExtensionPoint; import hudson.FilePath; import hudson.FileSystemProvisioner; @@ -37,9 +38,11 @@ import hudson.remoting.VirtualChannel; import hudson.security.ACL; import hudson.security.AccessControlled; import hudson.security.Permission; +import hudson.slaves.ComputerListener; import hudson.slaves.NodeDescriptor; import hudson.slaves.NodeProperty; import hudson.slaves.NodePropertyDescriptor; +import hudson.slaves.OfflineCause; import hudson.util.ClockDifference; import hudson.util.DescribableList; import hudson.util.EnumConverter; @@ -51,6 +54,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.List; +import java.util.logging.Logger; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.export.ExportedBean; @@ -68,6 +72,9 @@ import org.kohsuke.stapler.export.Exported; */ @ExportedBean public abstract class Node extends AbstractModelObject implements Describable, ExtensionPoint, AccessControlled { + + private static final Logger LOGGER = Logger.getLogger(Node.class.getName()); + /** * Newly copied slaves get this flag set, so that Hudson doesn't try to start this node until its configuration * is saved once. @@ -165,6 +172,41 @@ public abstract class Node extends AbstractModelObject implements Describable