Skip to content

Commit

Permalink
added a convenient partial implementation for cloud related code
Browse files Browse the repository at this point in the history
git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@36117 71c3de6d-444a-0410-be80-ed276b4c234a
  • Loading branch information
kohsuke committed Oct 21, 2010
1 parent 6f29e4f commit f62fff5
Show file tree
Hide file tree
Showing 4 changed files with 236 additions and 0 deletions.
63 changes: 63 additions & 0 deletions core/src/main/java/hudson/slaves/AbstractCloudComputer.java
@@ -0,0 +1,63 @@
/*
* The MIT License
*
* Copyright (c) 2010, InfraDNA, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.slaves;

import hudson.model.Computer;
import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses;

import java.io.IOException;

/**
* Partial implementation of {@link Computer} to be used in conjunction with
* {@link AbstractCloudSlave}.
*
* @author Kohsuke Kawaguchi
* @since 1.382
*/
public class AbstractCloudComputer<T extends AbstractCloudSlave> extends SlaveComputer {
public AbstractCloudComputer(T slave) {
super(slave);
}

@Override
public T getNode() {
return (T) super.getNode();
}

/**
* When the slave is deleted, free the node.
*/
@Override
public HttpResponse doDoDelete() throws IOException {
checkPermission(DELETE);
try {
getNode().terminate();
return new HttpRedirect("..");
} catch (InterruptedException e) {
return HttpResponses.error(500,e);
}
}
}
78 changes: 78 additions & 0 deletions core/src/main/java/hudson/slaves/AbstractCloudSlave.java
@@ -0,0 +1,78 @@
/*
* The MIT License
*
* Copyright (c) 2010, InfraDNA, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
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.getInstance().removeNode(this);
} 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());
}
74 changes: 74 additions & 0 deletions core/src/main/java/hudson/slaves/CloudRetentionStrategy.java
@@ -0,0 +1,74 @@
/*
* The MIT License
*
* Copyright (c) 2010, InfraDNA, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
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");
}
21 changes: 21 additions & 0 deletions core/src/main/java/hudson/slaves/ComputerConnector.java
@@ -0,0 +1,21 @@
package hudson.slaves;

import hudson.model.AbstractDescribableImpl;
import hudson.model.TaskListener;

import java.io.IOException;

/**
* @author Kohsuke Kawaguchi
*/
public abstract class ComputerConnector extends AbstractDescribableImpl<ComputerConnector> {
/**
* Creates a {@link ComputerLauncher} for connecting to the given host.
*
* @param host
* The host name / IP address of the machine to connect to.
* @param listener
* If
*/
public abstract ComputerLauncher launch(String host, TaskListener listener) throws IOException, InterruptedException;
}

0 comments on commit f62fff5

Please sign in to comment.