/*******************************************************************************
*
* 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 hudson.model.Descriptor.FormException;
import hudson.model.Hudson;
import hudson.model.Slave;
import hudson.model.TaskListener;
import hudson.util.StreamTaskListener;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Partial implementation of {@link Slave} to be used by
* {@link AbstractCloudImpl}.
*
* @author Kohsuke Kawaguchi
* @since 1.382
*/
public abstract class AbstractCloudSlave extends Slave {
public AbstractCloudSlave(String name, String nodeDescription, String remoteFS, String numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, List<? extends NodeProperty<?>> nodeProperties) throws FormException, IOException {
super(name, nodeDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, nodeProperties);
}
public AbstractCloudSlave(String name, String nodeDescription, String remoteFS, int numExecutors, Mode mode, String labelString, ComputerLauncher launcher, RetentionStrategy retentionStrategy, List<? extends NodeProperty<?>> nodeProperties) throws FormException, IOException {
super(name, nodeDescription, remoteFS, numExecutors, mode, labelString, launcher, retentionStrategy, nodeProperties);
}
@Override
public abstract AbstractCloudComputer createComputer();
/**
* Releases and removes this slave.
*/
public void terminate() throws InterruptedException, IOException {
try {
// TODO: send the output to somewhere real
_terminate(new StreamTaskListener(System.out, Charset.defaultCharset()));
} finally {
try {
Hudson hudson = Hudson.getInstance();
hudson.removeNode(this);
if (hudson.isTeamManagementEnabled()) {
hudson.getTeamManager().removeNode(getNodeName());
}
} catch (IOException e) {
LOGGER.log(Level.WARNING, "Failed to remove " + name, e);
}
}
}
/**
* Performs the removal of the underlying resource from the cloud.
*/
protected abstract void _terminate(TaskListener listener) throws IOException, InterruptedException;
private static final Logger LOGGER = Logger.getLogger(AbstractCloudSlave.class.getName());
}