public Image getImageInRegion(String region, String id) { return getOnlyElement(client.getAMIApi().get().describeImagesInRegion(region, DescribeImagesOptions.Builder.imageIds(id))); }
@Override public boolean deleteImage(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; try { ec2Api.getAMIApi().get().deregisterImageInRegion(region, instanceId); return true; } catch (Exception e) { return false; } }
/** * Transform a snapshot into an image * @param vmi the VMInstance to use * @param snapshotID identifier of the snapshot * @return id of the image */ public String snapshotToImage(VMInstance vmi, String snapshotID){ AMIApi ami=ec2api.getAMIApi().get(); journal.log(Level.INFO, ">> Creating an image from snapshot: "+snapshotID); String id=ami.registerUnixImageBackedByEbsInRegion("eu-west-1",vmi.getName()+"-image",snapshotID); journal.log(Level.INFO, ">> Image created with ID: "+id); return id; }
int sizeBefore = client.describeImagesInRegionWithFilter(regionId, ImmutableMultimap.<String, String>builder() .put("name", ebsBackedImageName).build()).size(); ebsBackedImageId = client.registerUnixImageBackedByEbsInRegion(regionId, ebsBackedImageName, snapshot.getId(), newBlockDeviceOption()); imagesToDeregister.add(ebsBackedImageId); final Image ebsBackedImage = getOnlyElement(client.describeImagesInRegion(regionId, imageIds(ebsBackedImageId))); assertEquals(ebsBackedImage.getName(), ebsBackedImageName); assertEquals(ebsBackedImage.getImageType(), ImageType.MACHINE); Thread.sleep(30000); after = client.describeImagesInRegionWithFilter(regionId, ImmutableMultimap.<String, String>builder() .put("name", ebsBackedImageName).build()).size();
@Test public void testDescribeImagesWithFilter() { // Just run in the first region - no need to take the time on all of them. String region = getFirst(ec2Api.getConfiguredRegions(), null); assertNotNull(region, "region should not be null"); Set<? extends Image> allResults = client.describeImagesInRegion(region); assertNotNull(allResults); assertTrue(allResults.size() >= 2); String id1 = allResults.iterator().next().getId(); Set<? extends Image> filterResult = client.describeImagesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("image-id", id1) .build()); assertNotNull(filterResult); assertEquals(filterResult.size(), 1); assertEquals(filterResult.iterator().next().getId(), id1); }
Image image = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(), imageIds(IMAGE_ID))); String description = image.getDescription() == null ? "jclouds" : image.getDescription(); String amiId = client.getAMIApi().get().registerUnixImageBackedByEbsInRegion( snapshot.getRegion(), "ebsboot-" + image.getId(), .asArchitecture(Architecture.I386)); try { ebsImage = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(), imageIds(amiId))); } catch (AWSResponseException e) { ebsImage = Iterables.getOnlyElement(client.getAMIApi().get().describeImagesInRegion(snapshot.getRegion(), imageIds(amiId))); else
/** * 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 @BeforeClass(groups = { "integration", "live" }) public void setupContext() { super.setupContext(); ec2Api = view.unwrapApi(EC2Api.class); runningTester = retry(new InstanceStateRunning(ec2Api), 600, 5, SECONDS); client = ec2Api.getAMIApi().get(); if (ebsTemplate != null) { Template template = view.getComputeService().templateBuilder().from(ebsTemplate).build(); regionId = template.getLocation().getId(); imageId = template.getImage().getProviderId(); for (Image image : client.describeImagesInRegionWithFilter(regionId, ImmutableMultimap.<String, String>builder() .put("name", ebsBackedImageName).build())) { if (ebsBackedImageName.equals(image.getName())) client.deregisterImageInRegion(regionId, image.getId()); } } }
public void testFilterWhenResponseIs404() { HttpResponse filterResponse = HttpResponse.builder().statusCode(404).build(); EC2Api apiWhenNotExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse); assertEquals(apiWhenNotExist.getAMIApi().get().describeImagesInRegionWithFilter("us-east-1", ImmutableMultimap.<String, String>builder() .put("owner-id", "206029621532") .build()), ImmutableSet.of()); } }
@Test(dependsOnMethods = "testCreateAndListEBSBackedImage") public void testGetLaunchPermissionForImage() { client.getLaunchPermissionForImageInRegion(regionId, ebsBackedImageId); }
@Test(expectedExceptions = AWSResponseException.class) public void testDescribeImagesWithInvalidFilter() { // Just run in the first region - no need to take the time on all of them. String region = getFirst(ec2Api.getConfiguredRegions(), null); assertNotNull(region, "region should not be null"); Set<? extends Image> allResults = client.describeImagesInRegion(region); assertNotNull(allResults); assertTrue(allResults.size() >= 2); String id1 = allResults.iterator().next().getId(); Set<? extends Image> filterResult = client.describeImagesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("invalid-filter-id", id1) .build()); assertNotNull(filterResult); assertEquals(filterResult.size(), 1); assertEquals(filterResult.iterator().next().getId(), id1); }
@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()); } }); }
public void testFilterWhenResponseIs2xx() { HttpResponse filterResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResourceWithContentType("/describe_images.xml", "text/xml")).build(); EC2Api apiWhenExist = requestsSendResponses(describeRegionsRequest, describeRegionsResponse, filter, filterResponse); Image image = getOnlyElement(apiWhenExist.getAMIApi().get().describeImagesInRegionWithFilter("us-east-1", ImmutableMultimap.<String, String>builder() .put("owner-id", "206029621532") .build())); assertEquals(image.getId(), "ami-be3adfd7"); }
public Image getImageInRegion(String region, String id) { return getOnlyElement(client.getAMIApi().get().describeImagesInRegion(region, DescribeImagesOptions.Builder.imageIds(id))); }
@Override public boolean deleteImage(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; try { ec2Api.getAMIApi().get().deregisterImageInRegion(region, instanceId); return true; } catch (Exception e) { return false; } }
@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()); } }); }
public Image getImageInRegion(String region, String id) { return getOnlyElement(client.getAMIApi().get().describeImagesInRegion(region, DescribeImagesOptions.Builder.imageIds(id))); }
@Override public boolean deleteImage(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; try { ec2Api.getAMIApi().get().deregisterImageInRegion(region, instanceId); return true; } catch (Exception e) { return false; } }
@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 Image load(RegionAndName key) throws ExecutionException { try { org.jclouds.ec2.domain.Image image = Iterables.getOnlyElement(sync.getAMIApi().get() .describeImagesInRegion(key.getRegion(), imageIds(key.getName()))); return parser.apply(image); } catch (Exception e) { throw new ExecutionException(message(key, e), e); } }