blob: a3cef2ce3ffe8ec88bb3be62b4c8c370cbaa21ab [file] [log] [blame]
package brooklyn.location.jclouds;
import java.io.File;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.config.ConfigUtils;
import brooklyn.entity.basic.BrooklynConfigKeys;
import brooklyn.location.basic.DeprecatedKeysMappingBuilder;
import brooklyn.location.basic.LocationPropertiesFromBrooklynProperties;
import com.google.common.base.Splitter;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
/**
* <p>
* The properties to use for a jclouds location, loaded from brooklyn.properties file
* </p>
*
* Preferred format is:
*
* <ul>
* <li>
* brooklyn.location.named.NAME.key
* </li>
* <li>
* brooklyn.location.jclouds.PROVIDER.key
* </li>
* </ul>
*
* <p>
* A number of properties are also supported, listed in the {@code JcloudsLocationConfig}
* </p>
*
* @author andrea
**/
public class JcloudsPropertiesFromBrooklynProperties extends LocationPropertiesFromBrooklynProperties {
private static final Logger LOG = LoggerFactory.getLogger(JcloudsPropertiesFromBrooklynProperties.class);
@SuppressWarnings("deprecation")
private static final Map<String, String> DEPRECATED_JCLOUDS_KEYS_MAPPING = new DeprecatedKeysMappingBuilder(LOG)
.putAll(LocationPropertiesFromBrooklynProperties.DEPRECATED_KEYS_MAPPING)
.camelToHyphen(JcloudsLocation.IMAGE_ID)
.camelToHyphen(JcloudsLocation.IMAGE_NAME_REGEX)
.camelToHyphen(JcloudsLocation.IMAGE_DESCRIPTION_REGEX)
.camelToHyphen(JcloudsLocation.HARDWARE_ID)
.build();
@Override
public Map<String, Object> getLocationProperties(String provider, String namedLocation, Map<String, ?> properties) {
throw new UnsupportedOperationException("Instead use getJcloudsProperties(String,String,String,Map)");
}
/**
* @see LocationPropertiesFromBrooklynProperties#getLocationProperties(String, String, Map)
*/
public Map<String, Object> getJcloudsProperties(String providerOrApi, String regionName, String namedLocation, Map<String, ?> properties) {
if(Strings.isNullOrEmpty(namedLocation) && Strings.isNullOrEmpty(providerOrApi)) {
throw new IllegalArgumentException("Neither cloud provider/API nor location name have been specified correctly");
}
Map<String, Object> jcloudsProperties = Maps.newHashMap();
String provider = getProviderName(providerOrApi, namedLocation, properties);
// named properties are preferred over providerOrApi properties
jcloudsProperties.put("provider", provider);
jcloudsProperties.putAll(transformDeprecated(getGenericLocationSingleWordProperties(properties)));
jcloudsProperties.putAll(transformDeprecated(getGenericJcloudsSingleWordProperties(providerOrApi, properties)));
jcloudsProperties.putAll(transformDeprecated(getProviderOrApiJcloudsProperties(providerOrApi, properties)));
jcloudsProperties.putAll(transformDeprecated(getRegionJcloudsProperties(providerOrApi, regionName, properties)));
if (!Strings.isNullOrEmpty(namedLocation)) jcloudsProperties.putAll(transformDeprecated(getNamedJcloudsProperties(namedLocation, properties)));
String brooklynDataDir = (String) properties.get(BrooklynConfigKeys.BROOKLYN_DATA_DIR.getName());
if (brooklynDataDir != null && brooklynDataDir.length() > 0) {
jcloudsProperties.put("localTempDir", new File(brooklynDataDir));
}
return jcloudsProperties;
}
protected String getProviderName(String providerOrApi, String locationName, Map<String, ?> properties) {
String provider = providerOrApi;
if (!Strings.isNullOrEmpty(locationName)) {
String providerDefinition = (String) properties.get(String.format("brooklyn.location.named.%s", locationName));
if (providerDefinition!=null)
provider = getProviderFromDefinition(providerDefinition);
}
return provider;
}
protected String getProviderFromDefinition(String definition) {
return Iterables.get(Splitter.on(":").split(definition), 1);
}
protected Map<String, Object> getGenericJcloudsSingleWordProperties(String providerOrApi, Map<String, ?> properties) {
if (Strings.isNullOrEmpty(providerOrApi)) return Maps.newHashMap();
String deprecatedPrefix = "brooklyn.jclouds.";
String preferredPrefix = "brooklyn.location.jclouds.";
return getMatchingSingleWordProperties(preferredPrefix, deprecatedPrefix, properties);
}
protected Map<String, Object> getProviderOrApiJcloudsProperties(String providerOrApi, Map<String, ?> properties) {
if (Strings.isNullOrEmpty(providerOrApi)) return Maps.newHashMap();
String preferredPrefix = String.format("brooklyn.location.jclouds.%s.", providerOrApi);
String deprecatedPrefix = String.format("brooklyn.jclouds.%s.", providerOrApi);
return getMatchingProperties(preferredPrefix, deprecatedPrefix, properties);
}
protected Map<String, Object> getRegionJcloudsProperties(String providerOrApi, String regionName, Map<String, ?> properties) {
if (Strings.isNullOrEmpty(providerOrApi) || Strings.isNullOrEmpty(regionName)) return Maps.newHashMap();
String preferredPrefix = String.format("brooklyn.location.jclouds.%s@%s.", providerOrApi, regionName);
String deprecatedPrefix = String.format("brooklyn.jclouds.%s@%s.", providerOrApi, regionName);
return getMatchingProperties(preferredPrefix, deprecatedPrefix, properties);
}
protected Map<String, Object> getNamedJcloudsProperties(String locationName, Map<String, ?> properties) {
if(locationName == null) return Maps.newHashMap();
String prefix = String.format("brooklyn.location.named.%s.", locationName);
return ConfigUtils.filterForPrefixAndStrip(properties, prefix).asMapWithStringKeys();
}
@Override
protected Map<String, String> getDeprecatedKeysMapping() {
return DEPRECATED_JCLOUDS_KEYS_MAPPING;
}
}