@Override public Set<? extends Reservation<? extends RunningInstance>> apply(String from) { return client.getInstanceApi().get() .describeInstancesInRegion(from, toArray(idsByRegions.get(from), String.class)); }
protected void destroyInstanceInRegion(String instanceId, String region) { client.getInstanceApi().get().terminateInstancesInRegion(region, instanceId); } }
@Override public NodeMetadata rebootNode(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.rebootInstancesInRegion(region, instanceId); return getNode.getNode(id); }
protected Snapshot createSnapshot() throws RunNodesException { String instanceId = null; try { RunningInstance instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().runInstancesInRegion( regionId, null, imageId, 1, 1))); instanceId = instance.getId(); assertTrue(runningTester.apply(instance), instanceId + "didn't achieve the state running!"); instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().describeInstancesInRegion(regionId, instanceId))); BlockDevice device = instance.getEbsBlockDevices().get("/dev/sda1"); assertNotNull(device, "device: /dev/sda1 not present on: " + instance); Snapshot snapshot = ec2Api.getElasticBlockStoreApi().get().createSnapshotInRegion(regionId, device.getVolumeId()); snapshotsToDelete.add(snapshot.getId()); Predicate<Snapshot> snapshotted = retry(new SnapshotCompleted(ec2Api.getElasticBlockStoreApi().get()), 600, 10, SECONDS); assert snapshotted.apply(snapshot); return snapshot; } finally { if (instanceId != null) ec2Api.getInstanceApi().get().terminateInstancesInRegion(regionId, instanceId); } }
@Test void testFilterInstances() { for (String region : view.unwrapApi(EC2Api.class).getAvailabilityZoneAndRegionApi().get().describeRegions().keySet()) { Set<? extends Reservation<? extends RunningInstance>> allResults = client.describeInstancesInRegion(region); assertNotNull(allResults); if (!allResults.isEmpty()) { RunningInstance instance = getFirst(getFirst(allResults, null), null); assertNotNull(instance); Set<? extends Reservation<? extends RunningInstance>> filterResults = client.describeInstancesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("key-name", instance.getKeyName()) .build()); assertNotNull(filterResults); assertTrue(!filterResults.isEmpty(), "No results found for filter, but there should be."); } } }
protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, int count, Template template, RunInstancesOptions instanceOptions) { int countStarted = 0; int tries = 0; Set<RunningInstance> started = ImmutableSet.<RunningInstance> of(); int maxCount = EC2TemplateOptions.class.cast(template.getOptions()).getMaxCount(); int countToProvision; if (maxCount == 0) { maxCount = count; countToProvision = 1; } else { countToProvision = count; } while (countStarted < count && tries++ < count) { if (logger.isDebugEnabled()) logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count - countStarted, region, zone, template.getImage().getProviderId(), instanceOptions.buildFormParameters()); started = ImmutableSet.copyOf(concat( started, client.getInstanceApi().get().runInstancesInRegion(region, zone, template.getImage().getProviderId(), countToProvision, maxCount - countStarted, instanceOptions))); countStarted = size(started); if (countStarted < count) logger.debug(">> not enough instances (%d/%d) started, attempting again", countStarted, count); } return started; }
@Test(enabled = false, dependsOnMethods = { "testAMIFromBundle" }) public void testInstanceFromEBS() throws Exception { System.out.printf("%d: %s creating instance from ebs-backed ami%n", System.currentTimeMillis(), ebsImage.getId()); ebsInstance = createInstance(ebsImage.getId()); client.getInstanceApi().get().stopInstancesInRegion(ebsInstance.getRegion(), true, ebsInstance.getId()); System.out.printf("%d: %s awaiting instance to stop %n", System.currentTimeMillis(), ebsInstance.getId()); stoppedTester.apply(ebsInstance); tryToChangeStuff(); System.out.printf("%d: %s awaiting instance to start %n", System.currentTimeMillis(), ebsInstance.getId()); client.getInstanceApi().get().startInstancesInRegion(ebsInstance.getRegion(), ebsInstance.getId()); ebsInstance = blockUntilWeCanSshIntoInstance(ebsInstance); }
@Test(expectedExceptions = AWSResponseException.class) void testInvalidFilterInstances() { for (String region : view.unwrapApi(EC2Api.class).getAvailabilityZoneAndRegionApi().get().describeRegions().keySet()) { Set<? extends Reservation<? extends RunningInstance>> filterResults = client.describeInstancesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("invalid-key", "some-value") .build()); } }}
@Override public NodeMetadata suspendNode(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.stopInstancesInRegion(region, true, instanceId); return getNode.getNode(id); }
@Override public NodeMetadata resumeNode(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.startInstancesInRegion(region, instanceId); return getNode.getNode(id); }
private void setInstanceInitiatedShutdownBehaviorForInstanceInRegion() { try { client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId(), InstanceInitiatedShutdownBehavior.STOP); assertEquals(InstanceInitiatedShutdownBehavior.STOP, client.getInstanceApi().get() .getInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId())); client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId(), InstanceInitiatedShutdownBehavior.TERMINATE); assertEquals(InstanceInitiatedShutdownBehavior.TERMINATE, client.getInstanceApi().get() .getInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, ebsInstance.getId())); System.out.println("OK: setInstanceInitiatedShutdownBehaviorForInstanceInRegion"); } catch (Exception e) { System.err.println("setInstanceInitiatedShutdownBehaviorForInstanceInRegion"); e.printStackTrace(); } }
@Override public void postStartupSetup(NodeMetadata node) { String host = node.getPublicAddresses().iterator().next(); try (Ssh ssh = new Ssh(host)) { authenticator().authenticate(ssh.getConnection()); ssh.getConnection().exec(String.format("pkill -u $(id -u %s)", config.getUser()), System.out); //set instance initiated shutdown behavior to terminate. This means any shutdown will result in to instance // termination EC2Api client = contextBuilder.buildApi(EC2Api.class); client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(config.getRegion(), node.getProviderId(), Volume.InstanceInitiatedShutdownBehavior.TERMINATE); copyAutoterminateScript(host); } catch (IOException | InterruptedException e) { logger.error(e.getMessage()); throw new RuntimeException(e); } }
.<BlockDeviceMapping> of(mapping)); RunningInstance instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().runInstancesInRegion( regionId, null, imageId, 1, 1, options))); instanceId = instance.getId(); instance = getOnlyElement(concat(ec2Api.getInstanceApi().get().describeInstancesInRegion(regionId, instanceId))); BlockDevice gp2Device = instance.getEbsBlockDevices().get("/dev/sdb"); } finally { if (instanceId != null) ec2Api.getInstanceApi().get().terminateInstancesInRegion(regionId, instanceId);
protected Set<RunningInstance> createNodesInRegionAndZone(String region, String zone, String group, int count, Template template, RunInstancesOptions instanceOptions) { int countStarted = 0; int tries = 0; Set<RunningInstance> started = ImmutableSet.<RunningInstance> of(); int maxCount = EC2TemplateOptions.class.cast(template.getOptions()).getMaxCount(); int countToProvision; if (maxCount == 0) { maxCount = count; countToProvision = 1; } else { countToProvision = count; } while (countStarted < count && tries++ < count) { if (logger.isDebugEnabled()) logger.debug(">> running %d instance region(%s) zone(%s) ami(%s) params(%s)", count - countStarted, region, zone, template.getImage().getProviderId(), instanceOptions.buildFormParameters()); started = ImmutableSet.copyOf(concat( started, client.getInstanceApi().get().runInstancesInRegion(region, zone, template.getImage().getProviderId(), countToProvision, maxCount - countStarted, instanceOptions))); countStarted = size(started); if (countStarted < count) logger.debug(">> not enough instances (%d/%d) started, attempting again", countStarted, count); } return started; }
@VisibleForTesting void deleteKeyPair(String region, String group) { for (KeyPair keyPair : client.getKeyPairApi().get().describeKeyPairsInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("key-name", String.format("jclouds#%s#*", group).replace('#', delimiter)) .build())) { String keyName = keyPair.getKeyName(); Predicate<String> keyNameMatcher = namingConvention.create().containsGroup(group); String oldKeyNameRegex = String.format("jclouds#%s#%s#%s", group, region, "[0-9a-f]+").replace('#', delimiter); // old keypair pattern too verbose as it has an unnecessary region qualifier if (keyNameMatcher.apply(keyName) || keyName.matches(oldKeyNameRegex)) { Set<String> instancesUsingKeyPair = extractIdsFromInstances(concat(client.getInstanceApi().get() .describeInstancesInRegionWithFilter(region, ImmutableMultimap.<String, String>builder() .put("instance-state-name", InstanceState.TERMINATED.toString()) .put("instance-state-name", InstanceState.SHUTTING_DOWN.toString()) .put("key-name", keyPair.getKeyName()).build()))); if (!instancesUsingKeyPair.isEmpty()) { logger.debug("<< inUse keyPair(%s), by (%s)", keyPair.getKeyName(), instancesUsingKeyPair); } else { logger.debug(">> deleting keyPair(%s)", keyPair.getKeyName()); client.getKeyPairApi().get().deleteKeyPairInRegion(region, keyPair.getKeyName()); // TODO: test this clear happens credentialsMap.remove(new RegionAndName(region, keyPair.getKeyName())); credentialsMap.remove(new RegionAndName(region, group)); logger.debug("<< deleted keyPair(%s)", keyPair.getKeyName()); } } } }
@Override public NodeMetadata suspendNode(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.stopInstancesInRegion(region, true, instanceId); return getNode.getNode(id); }
@Override public NodeMetadata resumeNode(String id) { String[] parts = AWSUtils.parseHandle(id); String region = parts[0]; String instanceId = parts[1]; client.startInstancesInRegion(region, instanceId); return getNode.getNode(id); }
private void setInstanceInitiatedShutdownBehaviorForInstanceInRegion() { try { client.getInstanceApi().get().setInstanceInitiatedShutdownBehaviorForInstanceInRegion(null, instanceId, InstanceInitiatedShutdownBehavior.STOP); fail("shouldn't be allowed, as instance needs to be ebs based-ami"); } catch (AWSResponseException e) { assertEquals("UnsupportedInstanceAttribute", e.getError().getCode()); } }
@Override public Set<? extends Reservation<? extends RunningInstance>> apply(String from) { return client.getInstanceApi().get() .describeInstancesInRegion(from, toArray(idsByRegions.get(from), String.class)); }
protected void destroyInstanceInRegion(String instanceId, String region) { client.getInstanceApi().get().terminateInstancesInRegion(region, instanceId); } }