in cloudsigma2/src/main/java/org/jclouds/cloudsigma2/compute/strategy/CloudSigma2ComputeServiceAdapter.java [124:220]
public NodeAndInitialCredentials<ServerInfo> createNodeWithGroupEncodedIntoName(String group, String name,
Template template) {
CloudSigma2TemplateOptions options = template.getOptions().as(CloudSigma2TemplateOptions.class);
Image image = template.getImage();
Hardware hardware = template.getHardware();
DriveInfo drive = api.getLibraryDrive(image.getProviderId());
if (!drive.getMedia().equals(MediaType.CDROM)) {
logger.debug(">> cloning library drive %s...", image.getProviderId());
drive = api.cloneLibraryDrive(image.getProviderId(), null);
driveCloned.apply(drive);
// Refresh the drive object and verify the clone operation didn't time out
drive = api.getDriveInfo(drive.getUuid());
DriveStatus status = drive.getStatus();
if (DriveStatus.UNMOUNTED != status) {
if (destroyDrives) {
// Rollback the cloned drive, if needed
logger.error(">> clone operation failed. Rolling back drive (%s)...", drive);
destroyDrives(ImmutableList.of(drive.getUuid()));
}
throw new IllegalStateException("Resource is in invalid status: " + status);
}
logger.debug(">> drive cloned (%s)...", drive);
}
ImmutableList.Builder<FirewallRule> firewallRulesBuilder = ImmutableList.builder();
for (int port : options.getInboundPorts()) {
firewallRulesBuilder.add(new FirewallRule.Builder().action(FirewallAction.ACCEPT)
.ipProtocol(FirewallIpProtocol.TCP).direction(FirewallDirection.IN).destinationPort("" + port).build());
}
List<NIC> nics = null;
try {
logger.debug(">> creating firewall policies...");
FirewallPolicy firewallPolicy = api.createFirewallPolicy(new FirewallPolicy.Builder().rules(
firewallRulesBuilder.build()).build());
nics = configureNICs(options, firewallPolicy);
} catch (Exception ex) {
if (destroyDrives) {
logger.debug(">> rolling back the cloned drive...", drive.getUuid());
destroyDrives(ImmutableList.of(drive.getUuid()));
}
throw propagate(ex);
}
List<Tag> tagIds = configureTags(options);
// Cloud init images expect the public key in the server metadata
Map<String, String> metadata = Maps.newLinkedHashMap();
metadata.put("image_id", image.getProviderId());
if (!Strings.isNullOrEmpty(options.getPublicKey())) {
metadata.put("ssh_public_key", options.getPublicKey());
}
metadata.putAll(options.getUserMetadata());
ServerInfo serverInfo = null;
try {
logger.debug(">> creating server...");
serverInfo = api.createServer(new ServerInfo.Builder()
.name(name)
.cpu((int) hardware.getProcessors().get(0).getSpeed())
.memory(BigInteger.valueOf(hardware.getRam()).multiply(BigInteger.valueOf(1024 * 1024)))
.drives(ImmutableList.of(drive.toServerDrive(1, "0:1", options.getDeviceEmulationType())))
.nics(nics)
.meta(metadata)
.tags(tagIds)
.vncPassword(Optional.fromNullable(options.getVncPassword()).or(defaultVncPassword)).build());
api.startServer(serverInfo.getUuid());
return new NodeAndInitialCredentials<ServerInfo>(serverInfo, serverInfo.getUuid(), LoginCredentials.builder()
.build());
} catch (Exception ex) {
try {
if (serverInfo != null) {
logger.debug(">> rolling back the server...");
api.deleteServer(serverInfo.getUuid());
}
} finally {
try {
if (destroyDrives) {
logger.debug(">> rolling back the cloned drive...");
destroyDrives(ImmutableList.of(drive.getUuid()));
}
} finally {
deleteTags(tagIds);
}
}
throw propagate(ex);
}
}