package alien4cloud.deployment.matching.services.location;
import java.util.Map;
import org.apache.commons.collections4.MapUtils;
import alien4cloud.deployment.exceptions.LocationRequiredException;
import alien4cloud.model.deployment.DeploymentTopology;
import org.alien4cloud.tosca.model.templates.AbstractPolicy;
import org.alien4cloud.tosca.model.templates.LocationPlacementPolicy;
import org.alien4cloud.tosca.model.templates.NodeGroup;
import com.google.common.collect.Maps;
/**
* Utility class to get Topology Location from a Deployment Topology.
*/
public final class TopologyLocationUtils {
private TopologyLocationUtils() {
}
/**
* Get the location on which a Deployment Topology should be deployed.
*
* @param deploymentTopology the deployment topology.
* @return map of location group to location id
*/
public static Map<String, String> getLocationIdsOrFail(DeploymentTopology deploymentTopology) {
Map<String, String> locationIds = getLocationIds(deploymentTopology);
if (MapUtils.isNotEmpty(locationIds)) {
return locationIds;
}
throw new LocationRequiredException("No location placement policy has been found for the topology.");
}
/**
* Get the location on which a Deployment Topology should be deployed.
*
* @param deploymentTopology the deployment topology.
* @return map of location group to location id
*/
public static Map<String, String> getLocationIds(DeploymentTopology deploymentTopology) {
Map<String, String> locationIds = Maps.newHashMap();
if (MapUtils.isNotEmpty(deploymentTopology.getLocationGroups())) {
for (NodeGroup group : deploymentTopology.getLocationGroups().values()) {
for (AbstractPolicy policy : group.getPolicies()) {
if (policy instanceof LocationPlacementPolicy) {
locationIds.put(group.getName(), ((LocationPlacementPolicy) policy).getLocationId());
}
}
}
}
return locationIds;
}
}