/******************************************************************************* * * Copyright (c) 2010, InfraDNA, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * * * *******************************************************************************/ package hudson.slaves; import java.io.IOException; import java.util.logging.Logger; import static hudson.util.TimeUnit2.*; import static java.util.logging.Level.*; /** * {@link RetentionStrategy} implementation for {@link AbstractCloudComputer} * that terminates it if it remains idle for X minutes. * * @author Kohsuke Kawaguchi * @since 1.382 */ public class CloudRetentionStrategy extends RetentionStrategy<AbstractCloudComputer> { private int idleMinutes; public CloudRetentionStrategy(int idleMinutes) { this.idleMinutes = idleMinutes; } public synchronized long check(AbstractCloudComputer c) { if (c.isIdle() && !disabled) { final long idleMilliseconds = System.currentTimeMillis() - c.getIdleStartMilliseconds(); if (idleMilliseconds > MINUTES.toMillis(idleMinutes)) { LOGGER.info("Disconnecting " + c.getName()); try { c.getNode().terminate(); } catch (InterruptedException e) { LOGGER.log(WARNING, "Failed to terminate " + c.getName(), e); } catch (IOException e) { LOGGER.log(WARNING, "Failed to terminate " + c.getName(), e); } } } return 1; } /** * Try to connect to it ASAP. */ @Override public void start(AbstractCloudComputer c) { c.connect(false); } private static final Logger LOGGER = Logger.getLogger(CloudRetentionStrategy.class.getName()); public static boolean disabled = Boolean.getBoolean(CloudRetentionStrategy.class.getName() + ".disabled"); }