/** * Create an image of a VM * @param vmi the VMInstance to use * @return id of the image */ public String createImage(VMInstance vmi){ AMIApi ami=ec2api.getAMIApi().get(); String id=""; Image img = checkIfImageExist(vmi.getName()+"-image"); if(img == null){ journal.log(Level.INFO, ">> Creating an image of VM: "+vmi.getName()); id=ami.createImageInRegion(vmi.getId().split("/")[0],vmi.getName()+"-image",vmi.getId().split("/")[1], CreateImageOptions.Builder.noReboot()); String status=""; while (!status.toLowerCase().equals("available")){ Image i=compute.getImage("eu-west-1/"+id); status=i.getStatus().name(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } journal.log(Level.INFO, ">> Image created with ID: "+id); }else{ id=img.getId().split("/")[1]; } return "eu-west-1/"+id; }
@Override public ListenableFuture<Image> createImage(ImageTemplate template) { checkState(template instanceof CloneImageTemplate, " ec2 only supports creating images through cloning."); CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; String[] parts = AWSUtils.parseHandle(cloneTemplate.getSourceNodeId()); String region = parts[0]; String instanceId = parts[1]; String imageId = ec2Api.getAMIApi().get().createImageInRegion(region, cloneTemplate.getName(), instanceId, CreateImageOptions.NONE); final AtomicReference<Image> image = Atomics.newReference(new ImageBuilder() .location(find(locations.get(), idEquals(region))) .id(region + "/" + imageId) .providerId(imageId) .description(cloneTemplate.getName()) .operatingSystem(OperatingSystem.builder().description(cloneTemplate.getName()).build()) .status(Image.Status.PENDING).build()); return userExecutor.submit(new Callable<Image>() { @Override public Image call() throws Exception { if (imageAvailablePredicate.apply(image)) return image.get(); // TODO: get rid of the expectation that the image will be available, as it is very brittle throw new UncheckedTimeoutException("Image was not created within the time limit: " + image.get()); } }); }
@Override public ListenableFuture<Image> createImage(ImageTemplate template) { checkState(template instanceof CloneImageTemplate, " ec2 only supports creating images through cloning."); CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; String[] parts = AWSUtils.parseHandle(cloneTemplate.getSourceNodeId()); String region = parts[0]; String instanceId = parts[1]; String imageId = ec2Api.getAMIApi().get().createImageInRegion(region, cloneTemplate.getName(), instanceId, CreateImageOptions.NONE); final AtomicReference<Image> image = Atomics.newReference(new ImageBuilder() .location(find(locations.get(), idEquals(region))) .id(region + "/" + imageId) .providerId(imageId) .description(cloneTemplate.getName()) .operatingSystem(OperatingSystem.builder().description(cloneTemplate.getName()).build()) .status(Image.Status.PENDING).build()); return userExecutor.submit(new Callable<Image>() { @Override public Image call() throws Exception { if (imageAvailablePredicate.apply(image)) return image.get(); // TODO: get rid of the expectation that the image will be available, as it is very brittle throw new UncheckedTimeoutException("Image was not created within the time limit: " + image.get()); } }); }
@Override public ListenableFuture<Image> createImage(ImageTemplate template) { checkState(template instanceof CloneImageTemplate, " ec2 only supports creating images through cloning."); CloneImageTemplate cloneTemplate = (CloneImageTemplate) template; String[] parts = AWSUtils.parseHandle(cloneTemplate.getSourceNodeId()); String region = parts[0]; String instanceId = parts[1]; String imageId = ec2Api.getAMIApi().get().createImageInRegion(region, cloneTemplate.getName(), instanceId, CreateImageOptions.NONE); final AtomicReference<Image> image = Atomics.newReference(new ImageBuilder() .location(find(locations.get(), idEquals(region))) .id(region + "/" + imageId) .providerId(imageId) .description(cloneTemplate.getName()) .operatingSystem(OperatingSystem.builder().description(cloneTemplate.getName()).build()) .status(Image.Status.PENDING).build()); return userExecutor.submit(new Callable<Image>() { @Override public Image call() throws Exception { if (imageAvailablePredicate.apply(image)) return image.get(); // TODO: get rid of the expectation that the image will be available, as it is very brittle throw new UncheckedTimeoutException("Image was not created within the time limit: " + image.get()); } }); }