in providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java [114:243]
protected NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, TemplateWithDataCenter template) {
checkArgument(template.getLocation().getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
final String dataCenterId = template.getDataCenter().id();
Hardware hardware = template.getHardware();
TemplateOptions options = template.getOptions();
final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser();
final String password = options.hasLoginPassword() ? options.getLoginPassword() : passwordGenerator.generate();
final org.jclouds.compute.domain.Image image = template.getImage();
// provision all storages based on hardware
List<? extends Volume> volumes = hardware.getVolumes();
List<String> storageIds = Lists.newArrayListWithExpectedSize(volumes.size());
int i = 1;
for (final Volume volume : volumes)
try {
logger.trace("<< provisioning storage '%s'", volume);
final Storage.Request.CreatePayload.Builder storageBuilder = Storage.Request.creatingBuilder();
if (i == 1) {
storageBuilder.mountImageId(image.getId());
// we don't need to pass password to the API if we're using a snapshot
Provisionable.Type provisionableType = Provisionable.Type.fromValue(
image.getUserMetadata().get(ProvisionableToImage.KEY_PROVISIONABLE_TYPE));
if (provisionableType == Provisionable.Type.IMAGE)
storageBuilder.imagePassword(password);
}
storageBuilder.dataCenterId(dataCenterId)
.name(format("%s-disk-%d", name, i++))
.size(volume.getSize());
String storageId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
@Override
public Object get() {
return api.storageApi().createStorage(storageBuilder.build());
}
}));
storageIds.add(storageId);
logger.trace(">> provisioning complete for storage. returned id='%s'", storageId);
} catch (Exception ex) {
if (i - 1 == 1) // if first storage (one with image) provisioning fails; stop method
throw Throwables.propagate(ex);
logger.warn(ex, ">> failed to provision storage. skipping..");
}
int lanId = DEFAULT_LAN_ID;
if (options.getNetworks() != null)
try {
String networkId = Iterables.get(options.getNetworks(), 0);
lanId = Integer.parseInt(networkId);
} catch (Exception ex) {
logger.warn("no valid network id found from options. using default id='%d'", DEFAULT_LAN_ID);
}
Double cores = ComputeServiceUtils.getCores(hardware);
// provision server and connect boot storage (first provisioned)
String serverId = null;
try {
String storageBootDeviceId = Iterables.get(storageIds, 0); // must have atleast 1
final Server.Request.CreatePayload serverRequest = Server.Request.creatingBuilder()
.dataCenterId(dataCenterId)
.name(name)
.bootFromStorageId(storageBootDeviceId)
.cores(cores.intValue())
.ram(hardware.getRam())
.availabilityZone(AvailabilityZone.AUTO)
.hasInternetAccess(true)
.lanId(lanId)
.build();
logger.trace("<< provisioning server '%s'", serverRequest);
serverId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
@Override
public Object get() {
return api.serverApi().createServer(serverRequest);
}
}));
logger.trace(">> provisioning complete for server. returned id='%s'", serverId);
} catch (Exception ex) {
logger.error(ex, ">> failed to provision server. rollbacking..");
destroyStorages(storageIds, dataCenterId);
throw Throwables.propagate(ex);
}
// connect the rest of storages to server; delete if fails
final int storageCount = storageIds.size();
for (int j = 1; j < storageCount; j++) { // skip first; already connected
String storageId = storageIds.get(j);
try {
logger.trace("<< connecting storage '%s' to server '%s'", storageId, serverId);
final Storage.Request.ConnectPayload request = Storage.Request.connectingBuilder()
.storageId(storageId)
.serverId(serverId)
.build();
provisioningManager.provision(jobFactory.create(group, new Supplier<Object>() {
@Override
public Object get() {
return api.storageApi().connectStorageToServer(request);
}
}));
logger.trace(">> storage connected.");
} catch (Exception ex) {
// delete unconnected storage
logger.warn(ex, ">> failed to connect storage '%s'. deleting..", storageId);
destroyStorage(storageId, dataCenterId);
}
}
// Last paranoid check
waitDcUntilAvailable.apply(dataCenterId);
LoginCredentials serverCredentials = LoginCredentials.builder()
.user(loginUser)
.password(password)
.build();
Server server = getNode(serverId);
return new NodeAndInitialCredentials<Server>(server, serverId, serverCredentials);
}