package org.cloudfoundry.community.servicebroker.brooklyn.service.plan; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.brooklyn.util.text.Strings; import org.cloudfoundry.community.servicebroker.brooklyn.config.BrooklynConfig; import org.cloudfoundry.community.servicebroker.brooklyn.model.DefaultBlueprintPlan; import org.cloudfoundry.community.servicebroker.brooklyn.service.BrooklynRestAdmin; import org.cloudfoundry.community.servicebroker.brooklyn.service.ServiceUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.servicebroker.model.Plan; import com.google.common.collect.Maps; import com.google.common.collect.Sets; public class SizePlanStrategy extends AbstractCatalogPlanStrategy { private final BrooklynConfig brooklynConfig; private static final Logger LOG = LoggerFactory.getLogger(SizePlanStrategy.class); @Autowired public SizePlanStrategy(BrooklynRestAdmin admin, BrooklynConfig brooklynConfig, PlaceholderReplacer replacer) { super(admin, replacer, brooklynConfig); this.brooklynConfig = brooklynConfig; } @Override public List<Plan> makePlans(String serviceId, String appName, Object rootElement) { List<Plan> plans = new ArrayList<>(); if (rootElement == null) { return plans; } if (rootElement instanceof Map) { Map<String, Object> map = (Map<String, Object>) rootElement; if (map.containsKey("brooklyn.config")) { Map<String, Object> brooklynConfig = (Map<String, Object>) map.get("brooklyn.config"); return parseConfig(brooklynConfig, serviceId, appName); } } return plans; } private List<Plan> parseConfig(Map<String, Object> brooklynConfigMap, String serviceId, String displayName) { Map<String, Object> brokerConfig = (Map<String, Object>)brooklynConfigMap.get("broker.config"); brokerConfig = replacer().replaceValues(brokerConfig); Map<String, Object> planConfig = (Map<String, Object>)brokerConfig.get("plan.config"); Object plans = brokerConfig.get("plans"); if (plans instanceof Map) { Map<String, Object> planDefinitions = (Map<String, Object>)plans; return getPlansFromMap(planDefinitions, serviceId, displayName, planConfig); } else if (plans instanceof List) { List<Object> planDefinitions = (List<Object>) plans; return getPlansfromList(planDefinitions, serviceId, displayName, planConfig); } else { LOG.error("Unable to parse config {}", plans); return Collections.emptyList(); } } private List<Plan> getPlansFromMap(Map<String, Object> planDefinitions, String serviceId, String displayName, Map<String, Object> planConfig) { List<Plan> plans = new ArrayList<>(); Set<String> names = Sets.newHashSet(); for (String planName : planDefinitions.keySet()) { Map<String, Object> planDefinition = (Map<String, Object>) planDefinitions.get(planName); Map<String, Object> properties = Maps.newHashMap(); if(planConfig != null){ properties.putAll(planConfig); } if(planDefinition != null){ properties.putAll(planDefinition); } properties.put("location", brooklynConfig.getLocation()); String id = serviceId + "." + planName; String name = ServiceUtil.getUniqueName(planName, names); String description = planName; Plan plan = new DefaultBlueprintPlan(id, name, description, displayName, properties); plans.add(plan); } return plans; } private List<Plan> getPlansfromList(List<Object> planDefinitions, String serviceId, String displayName, Map<String, Object> planConfig) { List<Plan> plans = new ArrayList<>(); Set<String> names = Sets.newHashSet(); for(Object planDefinition : planDefinitions){ Map<String, Object> planMap = (Map<String, Object>) planDefinition; String planName = String.valueOf(planMap.get("name")); Map<String, Object> properties = Maps.newHashMap(); Map<String, Object> config = (Map<String, Object>) planMap.get("plan.config"); if(planConfig != null){ properties.putAll(planConfig); } if(config != null){ properties.putAll(config); } String location = (String)planMap.get("location"); if (Strings.isBlank(location)) { location = brooklynConfig.getLocation(); } properties.put("location", location); String id = serviceId + "." + planName; String name = ServiceUtil.getUniqueName(planName, names); String description = String.valueOf(planMap.get("description")); Plan plan = new DefaultBlueprintPlan(id, name, description, displayName, properties); plans.add(plan); } return plans; } }