/** * returns template options, except of type {@link NovaTemplateOptions}. */ @Override public NovaTemplateOptions templateOptions() { return NovaTemplateOptions.class.cast(super.templateOptions()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count) throws RunNodesException { return createNodesInGroup(group, count, templateOptions()); }
/** * {@inheritDoc} */ @Override public void destroyNode(String id) { NodeMetadata destroyedNodeOrNull = doDestroyNode(id); if (destroyedNodeOrNull != null) cleanUpIncidentalResourcesOfDeadNodes(ImmutableSet.of(destroyedNodeOrNull)); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions) throws RunNodesException { return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, final Template template) throws RunNodesException { Set<? extends NodeMetadata> nodes = super.createNodesInGroup(group, count, template); String region = AWSUtils.getRegionFromLocationOrNull(template.getLocation()); if (client.getTagApiForRegion(region).isPresent()) { Map<String, String> common = metadataAndTagsAsValuesOfEmptyString(template.getOptions()); if (common.size() > 0 || generateInstanceNames) { return addTagsToInstancesInRegion(common, nodes, region, group); } } return nodes; }
/** * {@inheritDoc} */ @Override public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) { logger.debug(">> destroying nodes matching(%s)", filter); Set<NodeMetadata> set = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), new Function<NodeMetadata, ListenableFuture<? extends NodeMetadata>>() { // TODO make an async interface instead of re-wrapping @Override public ListenableFuture<NodeMetadata> apply(final NodeMetadata from) { return userExecutor.submit(new Callable<NodeMetadata>() { public NodeMetadata call() throws Exception { doDestroyNode(from.getId()); return from; } public String toString() { return "destroyNode(" + from.getId() + ")"; } }); } }, userExecutor, null, logger, "destroyNodesMatching(" + filter + ")")); logger.debug("<< destroyed(%d)", set.size()); cleanUpIncidentalResourcesOfDeadNodes(set); return set; }
Iterable<? extends NodeMetadata> nodesMatchingFilterAndNotTerminated(Predicate<NodeMetadata> filter) { return filter(detailsOnAllNodes(), and(checkNotNull(filter, "filter"), not(TERMINATED))); }
@Override public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) { // GCE does not return TERMINATED nodes, so in practice no node will never reach the TERMINATED // state, and the deleted nodes will never be returned. // In order to be able to clean up the resources associated to the deleted nodes, we have to retrieve // the details of the nodes before deleting them. Set<? extends NodeMetadata> nodes = newHashSet(filter(listNodesDetailsMatching(all()), filter)); super.destroyNodesMatching(filter); // This returns an empty list (a list of null elements) in GCE, as the api does not return deleted nodes cleanUpIncidentalResourcesOfDeadNodes(nodes); return nodes; }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions) throws RunNodesException { return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, final Template template) throws RunNodesException { Set<? extends NodeMetadata> nodes = super.createNodesInGroup(group, count, template); String region = AWSUtils.getRegionFromLocationOrNull(template.getLocation()); if (client.getTagApiForRegion(region).isPresent()) { Map<String, String> common = metadataAndTagsAsValuesOfEmptyString(template.getOptions()); if (common.size() > 0 || generateInstanceNames) { return addTagsToInstancesInRegion(common, nodes, region, group); } } return nodes; }
/** * {@inheritDoc} */ @Override public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<NodeMetadata> filter) { logger.debug(">> destroying nodes matching(%s)", filter); Set<NodeMetadata> set = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), new Function<NodeMetadata, ListenableFuture<? extends NodeMetadata>>() { // TODO make an async interface instead of re-wrapping @Override public ListenableFuture<NodeMetadata> apply(final NodeMetadata from) { return userExecutor.submit(new Callable<NodeMetadata>() { public NodeMetadata call() throws Exception { doDestroyNode(from.getId()); return from; } public String toString() { return "destroyNode(" + from.getId() + ")"; } }); } }, userExecutor, null, logger, "destroyNodesMatching(" + filter + ")")); logger.debug("<< destroyed(%d)", set.size()); cleanUpIncidentalResourcesOfDeadNodes(set); return set; }
Iterable<? extends NodeMetadata> nodesMatchingFilterAndNotTerminated(Predicate<? super NodeMetadata> filter) { return filter(detailsOnAllNodes(), and(checkNotNull(filter, "filter"), not(TERMINATED))); }
@Override public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<? super NodeMetadata> filter) { // GCE does not return TERMINATED nodes, so in practice no node will never reach the TERMINATED // state, and the deleted nodes will never be returned. // In order to be able to clean up the resources associated to the deleted nodes, we have to retrieve // the details of the nodes before deleting them. Set<? extends NodeMetadata> nodes = newHashSet(filter(listNodesDetailsMatching(all()), filter)); super.destroyNodesMatching(filter); // This returns an empty list (a list of null elements) in GCE, as the api does not return deleted nodes cleanUpIncidentalResourcesOfDeadNodes(nodes); return nodes; }
/** * returns template options, except of type {@link EC2TemplateOptions}. */ @Override public EC2TemplateOptions templateOptions() { return EC2TemplateOptions.class.cast(super.templateOptions()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count) throws RunNodesException { return createNodesInGroup(group, count, templateOptions()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, TemplateOptions templateOptions) throws RunNodesException { return createNodesInGroup(group, count, templateBuilder().any().options(templateOptions).build()); }
@Override public Set<? extends NodeMetadata> createNodesInGroup(String group, int count, final Template template) throws RunNodesException { Set<? extends NodeMetadata> nodes = super.createNodesInGroup(group, count, template); String region = AWSUtils.getRegionFromLocationOrNull(template.getLocation()); if (client.getTagApiForRegion(region).isPresent()) { Map<String, String> common = metadataAndTagsAsValuesOfEmptyString(template.getOptions()); if (generateInstanceNames || !common.isEmpty() || !template.getOptions().getNodeNames().isEmpty()) { return addTagsAndNamesToInstancesInRegion(common, template.getOptions().getNodeNames(), nodes, region, group); } } return nodes; }
/** * {@inheritDoc} */ @Override public void destroyNode(String id) { NodeMetadata destroyedNodeOrNull = doDestroyNode(id); if (destroyedNodeOrNull != null) cleanUpIncidentalResourcesOfDeadNodes(ImmutableSet.of(destroyedNodeOrNull)); }
/** * {@inheritDoc} */ @Override public Set<? extends NodeMetadata> destroyNodesMatching(Predicate<? super NodeMetadata> filter) { logger.debug(">> destroying nodes matching(%s)", filter); Set<NodeMetadata> destroyNodes = ImmutableSet.copyOf(transformParallel(nodesMatchingFilterAndNotTerminated(filter), new Function<NodeMetadata, ListenableFuture<? extends NodeMetadata>>() { // TODO make an async interface instead of re-wrapping @Override public ListenableFuture<NodeMetadata> apply(final NodeMetadata from) { return userExecutor.submit(new Callable<NodeMetadata>() { public NodeMetadata call() throws Exception { doDestroyNode(from.getId()); return from; } public String toString() { return "destroyNode(" + from.getId() + ")"; } }); } }, userExecutor, null, logger, "destroyNodesMatching(" + filter + ")")); logger.debug("<< destroyed(%d)", destroyNodes.size()); cleanUpIncidentalResourcesOfDeadNodes(destroyNodes); return destroyNodes; }
Iterable<? extends NodeMetadata> nodesMatchingFilterAndNotTerminated(Predicate<NodeMetadata> filter) { return filter(detailsOnAllNodes(), and(checkNotNull(filter, "filter"), not(TERMINATED))); }