mirror of https://github.com/apache/jclouds.git
circular dependencies problem with CreateAndInstallVm
This commit is contained in:
parent
40a95be772
commit
e00181d74e
|
@ -29,8 +29,7 @@ import java.util.Map;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceAdapter;
|
import org.jclouds.compute.ComputeServiceAdapter;
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.ComputeServiceContext;
|
||||||
import org.jclouds.compute.domain.HardwareBuilder;
|
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
|
|
|
@ -25,7 +25,6 @@ import java.io.InputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
@ -56,12 +55,12 @@ import org.jclouds.virtualbox.domain.ExecutionType;
|
||||||
import org.jclouds.virtualbox.domain.IsoSpec;
|
import org.jclouds.virtualbox.domain.IsoSpec;
|
||||||
import org.jclouds.virtualbox.domain.MasterSpec;
|
import org.jclouds.virtualbox.domain.MasterSpec;
|
||||||
import org.jclouds.virtualbox.domain.YamlImage;
|
import org.jclouds.virtualbox.domain.YamlImage;
|
||||||
|
import org.jclouds.virtualbox.functions.CreateAndInstallVm;
|
||||||
import org.jclouds.virtualbox.functions.IMachineToHardware;
|
import org.jclouds.virtualbox.functions.IMachineToHardware;
|
||||||
import org.jclouds.virtualbox.functions.IMachineToImage;
|
import org.jclouds.virtualbox.functions.IMachineToImage;
|
||||||
import org.jclouds.virtualbox.functions.IMachineToNodeMetadata;
|
import org.jclouds.virtualbox.functions.IMachineToNodeMetadata;
|
||||||
import org.jclouds.virtualbox.functions.IMachineToSshClient;
|
import org.jclouds.virtualbox.functions.IMachineToSshClient;
|
||||||
import org.jclouds.virtualbox.functions.MasterImages;
|
import org.jclouds.virtualbox.functions.MasterImages;
|
||||||
import org.jclouds.virtualbox.functions.MasterLoader;
|
|
||||||
import org.jclouds.virtualbox.functions.NodeCreator;
|
import org.jclouds.virtualbox.functions.NodeCreator;
|
||||||
import org.jclouds.virtualbox.functions.YamlImagesFromFileConfig;
|
import org.jclouds.virtualbox.functions.YamlImagesFromFileConfig;
|
||||||
import org.jclouds.virtualbox.functions.admin.ImagesToYamlImagesFromYamlDescriptor;
|
import org.jclouds.virtualbox.functions.admin.ImagesToYamlImagesFromYamlDescriptor;
|
||||||
|
@ -126,9 +125,9 @@ public class VirtualBoxComputeServiceContextModule extends
|
||||||
// the master machines cache
|
// the master machines cache
|
||||||
bind(new TypeLiteral<LoadingCache<Image, IMachine>>() {
|
bind(new TypeLiteral<LoadingCache<Image, IMachine>>() {
|
||||||
}).to((Class) MasterImages.class);
|
}).to((Class) MasterImages.class);
|
||||||
// the master machines loading/creating function
|
// the master creating function
|
||||||
bind(new TypeLiteral<Function<MasterSpec, IMachine>>() {
|
bind(new TypeLiteral<Function<MasterSpec, IMachine>>() {
|
||||||
}).to((Class) MasterLoader.class);
|
}).to((Class) CreateAndInstallVm.class);
|
||||||
// the machine cloning function
|
// the machine cloning function
|
||||||
bind(new TypeLiteral<Function<IMachine, NodeAndInitialCredentials<IMachine>>>() {
|
bind(new TypeLiteral<Function<IMachine, NodeAndInitialCredentials<IMachine>>>() {
|
||||||
}).to((Class) NodeCreator.class);
|
}).to((Class) NodeCreator.class);
|
||||||
|
@ -188,8 +187,8 @@ public class VirtualBoxComputeServiceContextModule extends
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Supplier provideHardware(
|
protected Supplier provideHardware(ComputeServiceAdapter<IMachine, IMachine, Image, Location> adapter,
|
||||||
ComputeServiceAdapter<IMachine, IMachine, Image, Location> adapter, Function<IMachine, Hardware> transformer) {
|
Function<IMachine, Hardware> transformer) {
|
||||||
return Suppliers.ofInstance(Collections.singleton(new HardwareBuilder().id("").build()));
|
return Suppliers.ofInstance(Collections.singleton(new HardwareBuilder().id("").build()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import static org.jclouds.virtualbox.config.VirtualBoxConstants.VIRTUALBOX_WORKI
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -47,12 +48,12 @@ import org.virtualbox_4_1.CleanupMode;
|
||||||
import org.virtualbox_4_1.IMachine;
|
import org.virtualbox_4_1.IMachine;
|
||||||
import org.virtualbox_4_1.StorageBus;
|
import org.virtualbox_4_1.StorageBus;
|
||||||
|
|
||||||
import com.beust.jcommander.internal.Maps;
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.cache.AbstractLoadingCache;
|
import com.google.common.cache.AbstractLoadingCache;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does most of the work wrt to creating the master image.
|
* Does most of the work wrt to creating the master image.
|
||||||
|
@ -62,13 +63,14 @@ import com.google.common.collect.Iterables;
|
||||||
*/
|
*/
|
||||||
public class MasterImages extends AbstractLoadingCache<Image, IMachine> {
|
public class MasterImages extends AbstractLoadingCache<Image, IMachine> {
|
||||||
|
|
||||||
private final Map<Image, IMachine> masters = Maps.newHashMap();
|
private final Map<String, IMachine> masters = Maps.newHashMap();
|
||||||
private final Function<MasterSpec, IMachine> mastersLoader;
|
private final Function<MasterSpec, IMachine> mastersLoader;
|
||||||
private final Map<Image, YamlImage> imageMapping;
|
private final Map<String, YamlImage> imageMapping;
|
||||||
private final String workingDir;
|
private final String workingDir;
|
||||||
private final String adminDisk;
|
private final String adminDisk;
|
||||||
private String guestAdditionsIso;
|
private final String guestAdditionsIso;
|
||||||
private String installationKeySequence;
|
private final String installationKeySequence;
|
||||||
|
private final String isosDir;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public MasterImages(@Named(Constants.PROPERTY_BUILD_VERSION) String version,
|
public MasterImages(@Named(Constants.PROPERTY_BUILD_VERSION) String version,
|
||||||
|
@ -84,31 +86,39 @@ public class MasterImages extends AbstractLoadingCache<Image, IMachine> {
|
||||||
if (!wdFile.exists()) {
|
if (!wdFile.exists()) {
|
||||||
wdFile.mkdirs();
|
wdFile.mkdirs();
|
||||||
}
|
}
|
||||||
|
this.isosDir = wdFile.getAbsolutePath() + File.separator + "isos";
|
||||||
this.adminDisk = workingDir + "/testadmin.vdi";
|
this.adminDisk = workingDir + "/testadmin.vdi";
|
||||||
this.imageMapping = yamlMapper.get();
|
this.imageMapping = Maps.newLinkedHashMap();
|
||||||
this.guestAdditionsIso = String.format("%s/VBoxGuestAdditions_%s.iso", workingDir,
|
for (Entry<Image, YamlImage> entry : yamlMapper.get().entrySet()) {
|
||||||
|
this.imageMapping.put(entry.getKey().getId(), entry.getValue());
|
||||||
|
}
|
||||||
|
this.guestAdditionsIso = String.format("%s/VBoxGuestAdditions_%s.iso", isosDir,
|
||||||
Iterables.get(Splitter.on('r').split(version), 0));
|
Iterables.get(Splitter.on('r').split(version), 0));
|
||||||
|
checkState(new File(guestAdditionsIso).exists(), "guest additions iso does not exist at: " + guestAdditionsIso);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMachine get(Image key) throws ExecutionException {
|
public IMachine get(Image key) throws ExecutionException {
|
||||||
if (masters.containsKey(key)) {
|
if (masters.containsKey(key.getId())) {
|
||||||
return masters.get(key);
|
return masters.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkNotNull(key, key);
|
checkNotNull(key, "key");
|
||||||
checkState(new File(guestAdditionsIso).exists(), "guest additions iso does not exist at: " + guestAdditionsIso);
|
|
||||||
|
|
||||||
YamlImage yamlImage = imageMapping.get(key);
|
// the yaml image
|
||||||
|
YamlImage yamlImage = imageMapping.get(key.getId());
|
||||||
|
|
||||||
checkNotNull(yamlImage, "could not find yaml image for image: " + key);
|
checkNotNull(yamlImage, "could not find yaml image for image: " + key);
|
||||||
|
|
||||||
|
// check if the iso is here, download if not
|
||||||
|
String localIsoUrl = getFilePathOrDownload(yamlImage.iso);
|
||||||
|
|
||||||
String vmName = VIRTUALBOX_IMAGE_PREFIX + yamlImage.id;
|
String vmName = VIRTUALBOX_IMAGE_PREFIX + yamlImage.id;
|
||||||
|
|
||||||
HardDisk hardDisk = HardDisk.builder().diskpath(adminDisk).autoDelete(true).controllerPort(0).deviceSlot(1).build();
|
HardDisk hardDisk = HardDisk.builder().diskpath(adminDisk).autoDelete(true).controllerPort(0).deviceSlot(1).build();
|
||||||
|
|
||||||
StorageController ideController = StorageController.builder().name("IDE Controller").bus(StorageBus.IDE)
|
StorageController ideController = StorageController.builder().name("IDE Controller").bus(StorageBus.IDE)
|
||||||
.attachISO(0, 0, yamlImage.iso).attachHardDisk(hardDisk).attachISO(1, 1, guestAdditionsIso).build();
|
.attachISO(0, 0, localIsoUrl).attachHardDisk(hardDisk).attachISO(1, 1, guestAdditionsIso).build();
|
||||||
|
|
||||||
VmSpec vmSpecification = VmSpec.builder().id(yamlImage.id).name(vmName).memoryMB(512).osTypeId("")
|
VmSpec vmSpecification = VmSpec.builder().id(yamlImage.id).name(vmName).memoryMB(512).osTypeId("")
|
||||||
.controller(ideController).forceOverwrite(true).cleanUpMode(CleanupMode.Full).build();
|
.controller(ideController).forceOverwrite(true).cleanUpMode(CleanupMode.Full).build();
|
||||||
|
@ -117,7 +127,7 @@ public class MasterImages extends AbstractLoadingCache<Image, IMachine> {
|
||||||
.builder()
|
.builder()
|
||||||
.vm(vmSpecification)
|
.vm(vmSpecification)
|
||||||
.iso(
|
.iso(
|
||||||
IsoSpec.builder().sourcePath(yamlImage.iso)
|
IsoSpec.builder().sourcePath(localIsoUrl)
|
||||||
.installationScript(installationKeySequence.replace("HOSTNAME", vmSpecification.getVmName())).build())
|
.installationScript(installationKeySequence.replace("HOSTNAME", vmSpecification.getVmName())).build())
|
||||||
.network(
|
.network(
|
||||||
NetworkSpec.builder()
|
NetworkSpec.builder()
|
||||||
|
@ -125,14 +135,23 @@ public class MasterImages extends AbstractLoadingCache<Image, IMachine> {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
IMachine masterMachine = mastersLoader.apply(masterSpec);
|
IMachine masterMachine = mastersLoader.apply(masterSpec);
|
||||||
masters.put(key, masterMachine);
|
masters.put(key.getId(), masterMachine);
|
||||||
return masterMachine;
|
return masterMachine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getFilePathOrDownload(String httpUrl) throws ExecutionException {
|
||||||
|
// TODO validation
|
||||||
|
String fileName = httpUrl.substring(httpUrl.lastIndexOf('/') + 1, httpUrl.length());
|
||||||
|
File localFile = new File(isosDir, fileName);
|
||||||
|
// TODO download. for now just expect the file to be there
|
||||||
|
checkState(localFile.exists(), "iso file has not been downloaded: " + fileName);
|
||||||
|
return localFile.getAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IMachine getIfPresent(Image key) {
|
public IMachine getIfPresent(Image key) {
|
||||||
if (masters.containsKey(key)) {
|
if (masters.containsKey(key.getId())) {
|
||||||
return masters.get(key);
|
return masters.get(key.getId());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
package org.jclouds.virtualbox.functions;
|
|
||||||
|
|
||||||
import org.jclouds.virtualbox.domain.MasterSpec;
|
|
||||||
import org.virtualbox_4_1.IMachine;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
|
|
||||||
public class MasterLoader implements Function<MasterSpec, IMachine> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IMachine apply(MasterSpec input) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue