All Downloads are FREE. Search and download functionalities are using the official Maven repository.

hudson.slaves.RetentionStrategy Maven / Gradle / Ivy

package hudson.slaves;

import hudson.ExtensionPoint;
import hudson.Util;
import hudson.model.Computer;
import hudson.model.Describable;
import hudson.model.Descriptor;
import hudson.util.DescriptorList;
import org.kohsuke.stapler.DataBoundConstructor;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Controls when to take {@link Computer} offline, bring it back online, or even to destroy it.
 * 

* EXPERIMENTAL: SIGNATURE MAY CHANGE IN FUTURE RELEASES * * @author Stephen Connolly * @author Kohsuke Kawaguchi */ public abstract class RetentionStrategy implements Describable>, ExtensionPoint { /** * This method will be called periodically to allow this strategy to decide what to do with it's owning slave. * * @param c {@link Computer} for which this strategy is assigned. This object also exposes a bunch of properties * that the callee can use to decide what action to take. * @return The number of minutes after which the strategy would like to be checked again. The strategy may be * rechecked earlier or later that this! */ public abstract long check(T c); /** * All registered {@link RetentionStrategy} implementations. */ public static final DescriptorList> LIST = new DescriptorList>(); /** * Dummy instance that doesn't do any attempt to retention. */ public static final RetentionStrategy NOOP = new RetentionStrategy() { public long check(Computer c) { return 1; } public Descriptor> getDescriptor() { throw new UnsupportedOperationException(); } }; /** * Convenient singleton instance, since this {@link RetentionStrategy} is stateless. */ public static final Always INSTANCE = new Always(); /** * {@link RetentionStrategy} that tries to keep the node online all the time. */ public static class Always extends RetentionStrategy { /** * Constructs a new Always. */ @DataBoundConstructor public Always() { } /** * {@inheritDoc} */ public long check(SlaveComputer c) { if (c.isOffline() && c.isLaunchSupported()) c.tryReconnect(); return 1; } /** * {@inheritDoc} */ public DescriptorImpl getDescriptor() { return DESCRIPTOR; } public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); private static class DescriptorImpl extends Descriptor> { /** * Constructs a new DescriptorImpl. */ public DescriptorImpl() { super(Always.class); } /** * {@inheritDoc} */ public String getDisplayName() { return Messages.RetentionStrategy_Always_displayName(); } } static { LIST.add(DESCRIPTOR); } } /** * {@link hudson.slaves.RetentionStrategy} that tries to keep the node offline when not in use. */ public static class Demand extends RetentionStrategy { private static final Logger logger = Logger.getLogger(Demand.class.getName()); /** * The delay (in minutes) for which the slave must be in demand before tring to launch it. */ private final long inDemandDelay; /** * The delay (in minutes) for which the slave must be idle before taking it offline. */ private final long idleDelay; @DataBoundConstructor public Demand(long inDemandDelay, long idleDelay) { this.inDemandDelay = Math.max(1, inDemandDelay); this.idleDelay = Math.max(1, idleDelay); } /** * Getter for property 'inDemandDelay'. * * @return Value for property 'inDemandDelay'. */ public long getInDemandDelay() { return inDemandDelay; } /** * Getter for property 'idleDelay'. * * @return Value for property 'idleDelay'. */ public long getIdleDelay() { return idleDelay; } public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); /** * {@inheritDoc} */ public synchronized long check(SlaveComputer c) { if (c.isOffline()) { final long demandMilliseconds = System.currentTimeMillis() - c.getDemandStartMilliseconds(); if (demandMilliseconds > inDemandDelay * 1000 * 60 /*MINS->MILLIS*/) { // we've been in demand for long enough logger.log(Level.INFO, "Launching computer {0} as it has been in demand for {1}", new Object[]{c.getNode().getNodeName(), Util.getTimeSpanString(demandMilliseconds)}); if (c.isLaunchSupported()) c.launch(); } } else if (c.isIdle()) { final long idleMilliseconds = System.currentTimeMillis() - c.getIdleStartMilliseconds(); if (idleMilliseconds > idleDelay * 1000 * 60 /*MINS->MILLIS*/) { // we've been idle for long enough logger.log(Level.INFO, "Disconnecting computer {0} as it has been idle for {1}", new Object[]{c.getNode().getNodeName(), Util.getTimeSpanString(idleMilliseconds)}); c.disconnect(); } } return 1; } /** * {@inheritDoc} */ public Descriptor> getDescriptor() { return DESCRIPTOR; } private static class DescriptorImpl extends Descriptor> { /** * Constructs a new DescriptorImpl. */ public DescriptorImpl() { super(Demand.class); } /** * {@inheritDoc} */ public String getDisplayName() { return Messages.RetentionStrategy_Demand_displayName(); } } static { LIST.add(DESCRIPTOR); } } static { LIST.load(Demand.class); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy