strategy for tags based on empty strings in a map & comma-delimited known key

This commit is contained in:
Adrian Cole 2012-05-18 19:56:20 -07:00
parent b4f01eda7b
commit 408584582c
2 changed files with 81 additions and 1 deletions

View File

@ -18,30 +18,39 @@
*/
package org.jclouds.compute.util;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Predicates.not;
import static com.google.common.base.Throwables.getStackTraceAsString;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Maps.*;
import static org.jclouds.scriptbuilder.domain.Statements.pipeHttpResponseToBash;
import java.net.URI;
import java.util.Formatter;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Map.Entry;
import java.util.regex.Pattern;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.domain.Processor;
import org.jclouds.compute.domain.Volume;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.http.HttpRequest;
import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.scriptbuilder.domain.Statements;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.reflect.TypeToken;
/**
@ -157,6 +166,49 @@ public class ComputeServiceUtils {
return org.jclouds.rest.Providers.getSupportedProvidersOfType(TypeToken.of(ComputeServiceContext.class));
}
/**
* For cloud apis that have a pattern of using empty strings as tags, return a map that contains
* that.
*/
public static Map<String, String> metadataAndTagsAsValuesOfEmptyString(TemplateOptions options) {
Builder<String, String> builder = ImmutableMap.<String, String> builder();
builder.putAll(options.getUserMetadata());
for (String tag : options.getTags())
builder.put(tag, "");
return builder.build();
}
/**
* @see #metadataAndTagsAsValuesOfEmptyString
*/
public static NodeMetadataBuilder addMetadataAndParseTagsFromValuesOfEmptyString(NodeMetadataBuilder builder,
Map<String, String> map) {
return builder.tags(filterValues(map, equalTo("")).keySet()).userMetadata(filterValues(map, not(equalTo(""))));
}
/**
* For cloud apis that need to namespace tags as the value of the key {@code jclouds.tags}
*/
public static Map<String, String> metadataAndTagsAsCommaDelimitedValue(TemplateOptions options) {
Builder<String, String> builder = ImmutableMap.<String, String> builder();
builder.putAll(options.getUserMetadata());
if (options.getTags().size() > 0)
builder.put("jclouds.tags", Joiner.on(',').join(options.getTags()));
return builder.build();
}
/**
* @see #metadataAndTagsAsCommaDelimitedValue
*/
public static NodeMetadataBuilder addMetadataAndParseTagsFromCommaDelimitedValue(NodeMetadataBuilder builder,
Map<String, String> map) {
String tagString = map.get("jclouds.tags");
if (tagString != null)
builder.tags(Splitter.on(',').split(tagString));
builder.userMetadata(filterKeys(map, not(equalTo("jclouds.tags"))));
return builder;
}
public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, String in,
Map<OsFamily, Map<String, String>> osVersionMap) {
if (osVersionMap.containsKey(family)) {

View File

@ -19,6 +19,7 @@
package org.jclouds.compute.util;
import static org.jclouds.compute.util.ComputeServiceUtils.parseVersionOrReturnEmptyString;
import static org.jclouds.compute.util.ComputeServiceUtils.*;
import static org.testng.Assert.assertEquals;
import java.net.URI;
@ -26,13 +27,16 @@ import java.util.Map;
import org.jclouds.compute.config.BaseComputeServiceContextModule;
import org.jclouds.compute.domain.OsFamily;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.compute.reference.ComputeServiceConstants;
import org.jclouds.http.HttpRequest;
import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Guice;
/**
@ -47,6 +51,30 @@ public class ComputeServiceUtilsTest {
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
.getInstance(Json.class));
@Test
public void testMetadataAndTagsAsValuesOfEmptyString() {
TemplateOptions options = TemplateOptions.Builder.tags(ImmutableSet.of("tag")).userMetadata(ImmutableMap.<String, String>of("foo", "bar"));
assertEquals(metadataAndTagsAsValuesOfEmptyString(options), ImmutableMap.<String, String>of("foo", "bar", "tag", ""));
}
@Test
public void testMetadataAndTagsAsCommaDelimitedValue() {
TemplateOptions options = TemplateOptions.Builder.tags(ImmutableSet.of("tag")).userMetadata(ImmutableMap.<String, String>of("foo", "bar"));
assertEquals(metadataAndTagsAsCommaDelimitedValue(options), ImmutableMap.<String, String>of("foo", "bar", "jclouds.tags", "tag"));
}
@Test
public void testMetadataAndTagsAsValuesOfEmptyStringNoTags() {
TemplateOptions options = TemplateOptions.Builder.userMetadata(ImmutableMap.<String, String>of("foo", "bar"));
assertEquals(metadataAndTagsAsValuesOfEmptyString(options), ImmutableMap.<String, String>of("foo", "bar"));
}
@Test
public void testMetadataAndTagsAsCommaDelimitedValueNoTags() {
TemplateOptions options = TemplateOptions.Builder.userMetadata(ImmutableMap.<String, String>of("foo", "bar"));
assertEquals(metadataAndTagsAsCommaDelimitedValue(options), ImmutableMap.<String, String>of("foo", "bar"));
}
@Test
public void testParseVersionOrReturnEmptyStringUbuntu1004() {
assertEquals(parseVersionOrReturnEmptyString(OsFamily.UBUNTU, "Ubuntu 10.04", map), "10.04");