Skip to content

Commit

Permalink
Merge pull request #123 from stepstone-tech/cloud-stats
Browse files Browse the repository at this point in the history
Support cloud statistics plugin
  • Loading branch information
felfert committed Nov 13, 2017
2 parents 76c7ae6 + f1f8bea commit c16b15c
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 8 deletions.
5 changes: 5 additions & 0 deletions jclouds-plugin/pom.xml
Expand Up @@ -72,6 +72,11 @@ limitations under the License.
<artifactId>config-file-provider</artifactId>
<version>2.15.6</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>cloud-stats</artifactId>
<version>0.13</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jclouds-shaded</artifactId>
Expand Down
Expand Up @@ -66,6 +66,8 @@

import static org.jclouds.reflect.Reflection2.typeToken;

import org.jenkinsci.plugins.cloudstats.ProvisioningActivity;
import org.jenkinsci.plugins.cloudstats.TrackedPlannedNode;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;

Expand Down Expand Up @@ -367,10 +369,12 @@ public Collection<NodeProvisioner.PlannedNode> provision(Label label, int excess
break; // maxed out
}

plannedNodeList.add(new PlannedNode(template.name, Computer.threadPoolForRemoting.submit(new Callable<Node>() {
final ProvisioningActivity.Id provisioningId = new ProvisioningActivity.Id(this.name, template.name);

plannedNodeList.add(new TrackedPlannedNode(provisioningId, template.getNumExecutors(), Computer.threadPoolForRemoting.submit(new Callable<Node>() {
public Node call() throws Exception {
// TODO: record the output somewhere
JCloudsSlave jcloudsSlave = template.provisionSlave(StreamTaskListener.fromStdout());
JCloudsSlave jcloudsSlave = template.provisionSlave(StreamTaskListener.fromStdout(), provisioningId);
Jenkins.getInstance().addNode(jcloudsSlave);

/* Cloud instances may have a long init script. If we declare the provisioning complete by returning
Expand All @@ -381,7 +385,7 @@ because it sees that (1) all the slaves are offline (because it's still being la
ensureLaunched(jcloudsSlave);
return jcloudsSlave;
}
}), template.getNumExecutors()));
})));
excessWorkload -= template.getNumExecutors();
}
return plannedNodeList;
Expand Down Expand Up @@ -436,7 +440,8 @@ public JCloudsSlaveTemplate getTemplate(Label label) {
JCloudsSlave doProvisionFromTemplate(final JCloudsSlaveTemplate t) throws IOException {
final StringWriter sw = new StringWriter();
final StreamTaskListener listener = new StreamTaskListener(sw);
JCloudsSlave node = t.provisionSlave(listener);
final ProvisioningActivity.Id provisioningId = new ProvisioningActivity.Id(this.name, t.name);
JCloudsSlave node = t.provisionSlave(listener, provisioningId);
Jenkins.getInstance().addNode(node);
return node;
}
Expand Down
Expand Up @@ -27,7 +27,10 @@
import java.util.logging.Logger;

import javax.annotation.CheckForNull;
import javax.annotation.Nullable;

import org.jenkinsci.plugins.cloudstats.ProvisioningActivity;
import org.jenkinsci.plugins.cloudstats.TrackedItem;
import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;

Expand All @@ -41,18 +44,22 @@
*
* @author Vijay Kiran
*/
public class JCloudsComputer extends AbstractCloudComputer<JCloudsSlave> {
public class JCloudsComputer extends AbstractCloudComputer<JCloudsSlave> implements TrackedItem {

private static final Logger LOGGER = Logger.getLogger(JCloudsComputer.class.getName());

private final ProvisioningActivity.Id provisioningId;

public JCloudsComputer(JCloudsSlave slave) {
super(slave);
this.provisioningId = slave.getId();
}

public String getInstanceId() {
return getName();
}


public int getRetentionTime() {
final JCloudsSlave node = getNode();
return null == node ? CloudInstanceDefaults.DEFAULT_INSTANCE_RETENTION_TIME_IN_MINUTES : node.getRetentionTime();
Expand Down Expand Up @@ -171,4 +178,10 @@ public String getPublicIpAddresses() {
public String getPrivateIpAddresses() {
return MarkPreferredAddress(Joiner.on(" ").join(getIpAddresses(false)), "<b>", "</b>");
}

@Nullable
@Override
public ProvisioningActivity.Id getId() {
return provisioningId;
}
}
Expand Up @@ -37,18 +37,25 @@
import org.jclouds.compute.ComputeService;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.domain.LoginCredentials;
import org.jenkinsci.plugins.cloudstats.CloudStatistics;
import org.jenkinsci.plugins.cloudstats.ProvisioningActivity;
import org.jenkinsci.plugins.cloudstats.TrackedItem;
import org.kohsuke.stapler.DataBoundConstructor;

import javax.annotation.Nullable;

/**
* Jenkins Slave node - managed by JClouds.
*
* @author Vijay Kiran
*/
public class JCloudsSlave extends AbstractCloudSlave {
public class JCloudsSlave extends AbstractCloudSlave implements TrackedItem{

private static final long serialVersionUID = 42L;

private static final Logger LOGGER = Logger.getLogger(JCloudsSlave.class.getName());

private ProvisioningActivity.Id provisioningId;
private transient NodeMetadata nodeMetaData;
public final boolean stopOnTerminate;
private final String cloudName;
Expand Down Expand Up @@ -138,6 +145,19 @@ public JCloudsSlave(final String cloudName, final String fsRoot, NodeMetadata me
this.nodeId = nodeMetaData.getId();
}

public JCloudsSlave(ProvisioningActivity.Id provisioningId, final String cloudName, final String fsRoot, NodeMetadata metadata, final String labelString,

final String description, final String numExecutors, final boolean stopOnTerminate, final Integer overrideRetentionTime,
String jvmOptions, final boolean waitPhoneHome, final int waitPhoneHomeTimeout, final String credentialsId,
final Mode mode, final String preferredAddress, boolean useJnlp) throws IOException, Descriptor.FormException {
this(cloudName, fsRoot, metadata, labelString,
description, numExecutors, stopOnTerminate, overrideRetentionTime,
jvmOptions, waitPhoneHome, waitPhoneHomeTimeout, credentialsId,
mode, preferredAddress, useJnlp);
this.provisioningId = provisioningId;
}


// JENKINS-19935 Instances on EC2 don't get random suffix
final static String uniqueName(final NodeMetadata md, final String cloudName) {
JCloudsCloud c = JCloudsCloud.getByName(cloudName);
Expand Down Expand Up @@ -285,6 +305,12 @@ public AbstractCloudComputer<JCloudsSlave> createComputer() {
return new JCloudsComputer(this);
}

@Nullable
@Override
public ProvisioningActivity.Id getId() {
return provisioningId;
}

@Extension
public static final class JCloudsSlaveDescriptor extends SlaveDescriptor {

Expand Down Expand Up @@ -321,6 +347,10 @@ protected void _terminate(TaskListener listener) throws IOException, Interrupted
} else {
LOGGER.info("Slave " + getNodeName() + " is already not running.");
}
ProvisioningActivity activity = CloudStatistics.get().getActivityFor(this);
if (activity != null) {
activity.enterIfNotAlready(ProvisioningActivity.Phase.COMPLETED);
}
}

public void waitForPhoneHome(PrintStream logger) throws InterruptedException {
Expand Down
Expand Up @@ -86,6 +86,7 @@
import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.domain.Statements;
import org.jclouds.scriptbuilder.statements.login.AdminAccess;
import org.jenkinsci.plugins.cloudstats.ProvisioningActivity;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
Expand Down Expand Up @@ -341,11 +342,11 @@ public Set<LabelAtom> getLabelSet() {
return labelSet;
}

public JCloudsSlave provisionSlave(TaskListener listener) throws IOException {
public JCloudsSlave provisionSlave(TaskListener listener, ProvisioningActivity.Id provisioningId) throws IOException {
NodeMetadata nodeMetadata = get();

try {
return new JCloudsSlave(getCloud().getDisplayName(), getFsRoot(), nodeMetadata, labelString, description,
return new JCloudsSlave(provisioningId , getCloud().getDisplayName(), getFsRoot(), nodeMetadata, labelString, description,
Integer.toString(numExecutors), stopOnTerminate, overrideRetentionTime, getJvmOptions(), waitPhoneHome,
waitPhoneHomeTimeout, credentialsId, mode, preferredAddress, useJnlp);
} catch (Descriptor.FormException e) {
Expand Down

0 comments on commit c16b15c

Please sign in to comment.