}
@Override
public List<BaseNode> getPlacementPlan(IContainer container,
ClusterCreate cluster, List<BaseNode> existedNodes, Map<String, List<String>> filteredHosts) {
IPlacementPlanner planner = new PlacementPlanner();
/*
* assert the getBadNodes method is called before this method and bad nodes
* have been removed
*
* TODO: handle the case when nodes are vMotioned between host before a resize operation
*/
List<BaseNode> badNodes = planner.getBadNodes(cluster, existedNodes);
AuAssert.check(badNodes == null || badNodes.size() == 0);
AuAssert.check(((Container) container).getTemplateNode() != null);
planner.init(cluster, ((Container) container).getTemplateNode(),
existedNodes, ((Container) container).getRackMap());
/*
* pre-process the cluster and split them into virtual groups, by
* analyzing the instance_per_host and group association policy
*/
List<VirtualGroup> vGroups = planner.getVirtualGroups(existedNodes);
// place virtual groups that are referred by others at first
List<VirtualGroup> referredGroups = new ArrayList<VirtualGroup>();
List<VirtualGroup> normalGroups = new ArrayList<VirtualGroup>();
for (VirtualGroup vGroup : vGroups) {