in src/main/java/com/amazon/jenkins/ec2fleet/EC2FleetCloud.java [605:666]
private void addNewSlave(final AmazonEC2 ec2, final Instance instance, FleetStateStats stats) throws Exception {
final String instanceId = instance.getInstanceId();
// instance state check enabled and not running, skip adding
if (addNodeOnlyIfRunning && InstanceStateName.Running != InstanceStateName.fromValue(instance.getState().getName()))
return;
final String address = privateIpUsed ? instance.getPrivateIpAddress() : instance.getPublicIpAddress();
// Check if we have the address to use. Nodes don't get it immediately.
if (address == null) {
if (!privateIpUsed) {
info("%s instance public IP address not assigned, it could take some time or" +
" Spot Request is not configured to assign public IPs", instance.getInstanceId());
}
return; // wait more time, probably IP address not yet assigned
}
// Generate a random FS root if one isn't specified
final String effectiveFsRoot;
if (StringUtils.isBlank(fsRoot)) {
effectiveFsRoot = "/tmp/jenkins-" + UUID.randomUUID().toString().substring(0, 8);
} else {
effectiveFsRoot = fsRoot;
}
final Double instanceTypeWeight = stats.getInstanceTypeWeights().get(instance.getInstanceType());
final int effectiveNumExecutors;
if (scaleExecutorsByWeight && instanceTypeWeight != null) {
effectiveNumExecutors = (int) Math.max(Math.round(numExecutors * instanceTypeWeight), 1);
} else {
effectiveNumExecutors = numExecutors;
}
final EC2FleetAutoResubmitComputerLauncher computerLauncher = new EC2FleetAutoResubmitComputerLauncher(
computerConnector.launch(address, TaskListener.NULL));
final Node.Mode nodeMode = restrictUsage ? Node.Mode.EXCLUSIVE : Node.Mode.NORMAL;
final EC2FleetNode node = new EC2FleetNode(instanceId, "Fleet slave for " + instanceId,
effectiveFsRoot, effectiveNumExecutors, nodeMode, labelString, new ArrayList<NodeProperty<?>>(),
this, computerLauncher);
// Initialize our retention strategy
node.setRetentionStrategy(new IdleRetentionStrategy());
final Jenkins jenkins = Jenkins.getInstance();
// jenkins automatically remove old node with same name if any
jenkins.addNode(node);
final SettableFuture<Node> future;
if (plannedNodesCache.isEmpty()) {
future = SettableFuture.create();
} else {
final NodeProvisioner.PlannedNode plannedNode = plannedNodesCache.iterator().next();
plannedNodesCache.remove(plannedNode);
future = ((SettableFuture<Node>) plannedNode.future);
}
// use getters for timeout and interval as they provide default value
// when user just install new version and did't recreate fleet
EC2FleetOnlineChecker.start(node, future,
TimeUnit.SECONDS.toMillis(getInitOnlineTimeoutSec()),
TimeUnit.SECONDS.toMillis(getInitOnlineCheckIntervalSec()));
}