@Override protected void destroyInstanceInRegion(String id, String region) { String spotId = id; if (id.indexOf("sir-") != 0) { try { spotId = getOnlyElement( Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, id))) .getSpotInstanceRequestId(); credentialStore.remove("node#" + region + "/" + spotId); } catch (NoSuchElementException e) { } super.destroyInstanceInRegion(id, region); } else { client.getSpotInstanceApi().get().cancelSpotInstanceRequestsInRegion(region, spotId); credentialStore.remove("node#" + region + "/" + id); } } }
@Override public Set<SpotInstanceRequest> apply(String from) { return client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegion(from, toArray(idsByRegions.get(from), String.class)); } };
@Test(enabled = true) public void testCreateSpotInstance() { String launchGroup = PREFIX + "1"; for (String region : Region.DEFAULT_REGIONS) for (SpotInstanceRequest request : client.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegion( region)) if (launchGroup.equals(request.getLaunchGroup())) client.getSpotInstanceApi().get().cancelSpotInstanceRequestsInRegion(region, request.getId()); start = System.currentTimeMillis(); requests = client.getSpotInstanceApi().get().requestSpotInstancesInRegion( "sa-east-1", 0.09f, 1, LaunchSpecification.builder().imageId("ami-3e3be423").instanceType(InstanceType.M1_SMALL).build(), launchGroup(launchGroup).availabilityZoneGroup(launchGroup).validFrom( new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(2))).validUntil( new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(SPOT_DELAY_SECONDS)))); assertNotNull(requests); for (SpotInstanceRequest request : requests) verifySpotInstance(request); }
@Test(expectedExceptions = AWSResponseException.class) public void testDescribeSpotRequestsInRegionFilterInvalid() { for (String region : Region.DEFAULT_REGIONS) { SortedSet<SpotInstanceRequest> allResults = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { SpotInstanceRequest request = allResults.last(); SortedSet<SpotInstanceRequest> result = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("invalid-filter", request.getId()).build())); } } }
@Override protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, int count, Template template, RunInstancesOptions instanceOptions) { Float spotPrice = getSpotPriceOrNull(template.getOptions()); if (spotPrice != null) { AWSEC2TemplateOptions awsOptions = AWSEC2TemplateOptions.class.cast(template.getOptions()); LaunchSpecification spec = AWSRunInstancesOptions.class.cast(instanceOptions).getLaunchSpecificationBuilder() .imageId(template.getImage().getProviderId()).availabilityZone(zone).subnetId(awsOptions.getSubnetId()) .iamInstanceProfileArn(awsOptions.getIAMInstanceProfileArn()) .iamInstanceProfileName(awsOptions.getIAMInstanceProfileName()).build(); RequestSpotInstancesOptions options = awsOptions.getSpotOptions(); if (logger.isDebugEnabled()) logger.debug(">> requesting %d spot instances region(%s) price(%f) spec(%s) options(%s)", count, region, spotPrice, spec, options); return ImmutableSet.<RunningInstance> copyOf(transform(client.getSpotInstanceApi().get() .requestSpotInstancesInRegion(region, spotPrice, count, spec, options), spotConverter)); } return super.createNodesInRegionAndZone(region, zone, group, count, template, instanceOptions); }
@Test public void testDescribeSpotPriceHistoryInRegion() { for (String region : Region.DEFAULT_REGIONS) { Set<Spot> spots = client.getSpotInstanceApi().get().describeSpotPriceHistoryInRegion(region, from(new Date())); assertNotNull(spots); assert !spots.isEmpty(); for (Spot spot : spots) { assert spot.getSpotPrice() > 0 : spots; assertEquals(spot.getRegion(), region); assert in( ImmutableSet.of("Linux/UNIX", "Linux/UNIX (Amazon VPC)", "SUSE Linux", "SUSE Linux (Amazon VPC)", "Windows", "Windows (Amazon VPC)")).apply(spot.getProductDescription()) : spot; assert // sometimes get D2 type, which we don't yet enumerate spot.getInstanceType().startsWith("d2.") || in(ImmutableSet.of("c1.medium", "c1.xlarge", "cc1.4xlarge", "cg1.4xlarge", "cc2.8xlarge", "m1.large", "m1.small", "m1.medium", "m1.xlarge", "m2.2xlarge", "m2.4xlarge", "m2.xlarge", "m3.xlarge", "m3.2xlarge", "t1.micro", "cr1.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge")).apply(spot.getInstanceType()) : spot; } } }
public void describeSpotInstanceRequestsInRegionWithFilter() throws Exception { enqueueRegions(DEFAULT_REGION); enqueueXml(DEFAULT_REGION, "/describe_spot_instance.xml"); SpotInstanceRequest result = getOnlyElement(spotApi() .describeSpotInstanceRequestsInRegionWithFilter(DEFAULT_REGION, ImmutableMultimap.of("instance-id", "i-ef308e8e"))); assertEquals(result.getId(), "sir-1ede0012"); assertPosted(DEFAULT_REGION, "Action=DescribeRegions"); assertPosted(DEFAULT_REGION, "Action=DescribeSpotInstanceRequests&Filter.1.Name=instance-id&Filter.1.Value.1=i-ef308e8e"); }
@Test public void testDescribeSpotRequestsInRegionFilter() { for (String region : Region.DEFAULT_REGIONS) { SortedSet<SpotInstanceRequest> allResults = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegion(region)); assertNotNull(allResults); if (allResults.size() >= 1) { SpotInstanceRequest request = allResults.last(); SortedSet<SpotInstanceRequest> result = ImmutableSortedSet.copyOf(client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("spot-instance-request-id", request.getId()).build())); assertNotNull(result); SpotInstanceRequest compare = result.last(); assertEquals(compare, request); } } }
@Override protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, int count, Template template, RunInstancesOptions instanceOptions) { Float spotPrice = getSpotPriceOrNull(template.getOptions()); if (spotPrice != null) { AWSEC2TemplateOptions awsOptions = AWSEC2TemplateOptions.class.cast(template.getOptions()); LaunchSpecification spec = AWSRunInstancesOptions.class.cast(instanceOptions).getLaunchSpecificationBuilder() .imageId(template.getImage().getProviderId()).availabilityZone(zone).subnetId(awsOptions.getSubnetId()) .iamInstanceProfileArn(awsOptions.getIAMInstanceProfileArn()) .iamInstanceProfileName(awsOptions.getIAMInstanceProfileName()).build(); RequestSpotInstancesOptions options = awsOptions.getSpotOptions(); if (logger.isDebugEnabled()) logger.debug(">> requesting %d spot instances region(%s) price(%f) spec(%s) options(%s)", count, region, spotPrice, spec, options); return ImmutableSet.<RunningInstance> copyOf(transform(client.getSpotInstanceApi().get() .requestSpotInstancesInRegion(region, spotPrice, count, spec, options), spotConverter)); } return super.createNodesInRegionAndZone(region, zone, group, count, template, instanceOptions); }
public void describeSpotPriceHistoryInRegion() throws Exception { enqueueRegions(DEFAULT_REGION); enqueueXml(DEFAULT_REGION, "/describe_spot_price_history.xml"); Set<Spot> result = spotApi().describeSpotPriceHistoryInRegion(DEFAULT_REGION); assertEquals(result.size(), 3); assertPosted(DEFAULT_REGION, "Action=DescribeRegions"); assertPosted(DEFAULT_REGION, "Action=DescribeSpotPriceHistory"); }
public void describeSpotInstanceRequestsInRegionWithFilter_404() throws Exception { enqueueRegions(DEFAULT_REGION); enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404)); assertEquals(spotApi().describeSpotInstanceRequestsInRegionWithFilter(DEFAULT_REGION, ImmutableMultimap.of("instance-id", "i-ef308e8e")), ImmutableSet.of()); assertPosted(DEFAULT_REGION, "Action=DescribeRegions"); assertPosted(DEFAULT_REGION, "Action=DescribeSpotInstanceRequests&Filter.1.Name=instance-id&Filter.1.Value.1=i-ef308e8e"); }
@Override public Set<SpotInstanceRequest> apply(String from) { return client.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegion(from); } };
@Override protected void destroyInstanceInRegion(String id, String region) { String spotId = id; if (id.indexOf("sir-") != 0) { try { spotId = getOnlyElement( Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, id))) .getSpotInstanceRequestId(); credentialStore.remove("node#" + region + "/" + spotId); } catch (NoSuchElementException e) { } super.destroyInstanceInRegion(id, region); } else { client.getSpotInstanceApi().get().cancelSpotInstanceRequestsInRegion(region, spotId); credentialStore.remove("node#" + region + "/" + id); } } }
@Override protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, int count, Template template, RunInstancesOptions instanceOptions) { Float spotPrice = getSpotPriceOrNull(template.getOptions()); if (spotPrice != null) { AWSEC2TemplateOptions awsOptions = AWSEC2TemplateOptions.class.cast(template.getOptions()); LaunchSpecification spec = AWSRunInstancesOptions.class.cast(instanceOptions).getLaunchSpecificationBuilder() .imageId(template.getImage().getProviderId()).availabilityZone(zone).subnetId(awsOptions.getSubnetId()) .iamInstanceProfileArn(awsOptions.getIAMInstanceProfileArn()) .iamInstanceProfileName(awsOptions.getIAMInstanceProfileName()).build(); RequestSpotInstancesOptions options = awsOptions.getSpotOptions(); if (logger.isDebugEnabled()) logger.debug(">> requesting %d spot instances region(%s) price(%f) spec(%s) options(%s)", count, region, spotPrice, spec, options); return ImmutableSet.<RunningInstance> copyOf(transform(client.getSpotInstanceApi().get() .requestSpotInstancesInRegion(region, spotPrice, count, spec, options), spotConverter)); } return super.createNodesInRegionAndZone(region, zone, group, count, template, instanceOptions); }
public void describeSpotPriceHistoryInRegionOptions() throws Exception { enqueueRegions(DEFAULT_REGION); enqueueXml(DEFAULT_REGION, "/describe_spot_price_history.xml"); Date from = new Date(12345678910L); Date to = new Date(1234567891011L); Set<Spot> result = spotApi().describeSpotPriceHistoryInRegion(DEFAULT_REGION, from(from).to(to).productDescription("description").instanceType("m1.small")); assertEquals(result.size(), 3); assertPosted(DEFAULT_REGION, "Action=DescribeRegions"); assertPosted(DEFAULT_REGION, "Action=DescribeSpotPriceHistory&StartTime=1970-05-23T21%3A21%3A18.910Z&EndTime=2009-02-13T23%3A31%3A31.011Z&ProductDescription=description&InstanceType.1=m1.small"); }
@Override public Set<SpotInstanceRequest> apply(String from) { return client.getSpotInstanceApi().get() .describeSpotInstanceRequestsInRegion(from, toArray(idsByRegions.get(from), String.class)); } };
@Override protected void destroyInstanceInRegion(String id, String region) { String spotId = id; if (id.indexOf("sir-") != 0) { try { spotId = getOnlyElement( Iterables.concat(client.getInstanceApi().get().describeInstancesInRegion(region, id))) .getSpotInstanceRequestId(); credentialStore.remove("node#" + region + "/" + spotId); } catch (NoSuchElementException e) { } super.destroyInstanceInRegion(id, region); } else { client.getSpotInstanceApi().get().cancelSpotInstanceRequestsInRegion(region, spotId); credentialStore.remove("node#" + region + "/" + id); } } }
public void describeSpotPriceHistoryInRegion_404() throws Exception { enqueueRegions(DEFAULT_REGION); enqueue(DEFAULT_REGION, new MockResponse().setResponseCode(404)); Set<Spot> result = spotApi().describeSpotPriceHistoryInRegion(DEFAULT_REGION); assertTrue(result.isEmpty()); assertPosted(DEFAULT_REGION, "Action=DescribeRegions"); assertPosted(DEFAULT_REGION, "Action=DescribeSpotPriceHistory"); }
@Override public Set<SpotInstanceRequest> apply(String from) { return client.getSpotInstanceApi().get().describeSpotInstanceRequestsInRegion(from); } };
@Override @AfterClass(groups = { "integration", "live" }) protected void tearDownContext() { if (requests != null) { for (SpotInstanceRequest request : requests) client.getSpotInstanceApi().get().cancelSpotInstanceRequestsInRegion(request.getRegion(), request.getId()); // assert deletedTester.apply(request) : request; } if (instance != null) { client.getInstanceApi().get().terminateInstancesInRegion(instance.getRegion(), instance.getId()); } super.tearDownContext(); } }