// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package com.cloud.deploy; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.Set; import com.cloud.dc.DataCenter; import com.cloud.dc.Pod; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.host.Host; import com.cloud.org.Cluster; import com.cloud.storage.StoragePool; import com.cloud.utils.component.Adapter; import com.cloud.vm.VirtualMachineProfile; /** */ public interface DeploymentPlanner extends Adapter { /** * plan is called to determine where a virtual machine should be running. * * @param vm * virtual machine. * @param plan * deployment plan that tells you where it's being deployed to. * @param avoid * avoid these data centers, pods, clusters, or hosts. * @return DeployDestination for that virtual machine. */ @Deprecated DeployDestination plan(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException; /** * canHandle is called before plan to determine if the plan can do the allocation. Planers should be exclusive so * planner writer must * make sure only one planer->canHandle return true in the planner list * * @param vm * virtual machine. * @param plan * deployment plan that tells you where it's being deployed to. * @param avoid * avoid these data centers, pods, clusters, or hosts. * @return true if it's okay to allocate; false or not */ boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid); public enum AllocationAlgorithm { random, firstfit, userdispersing, userconcentratedpod_random, userconcentratedpod_firstfit; } public enum PlannerResourceUsage { Shared, Dedicated; } public static class ExcludeList implements Serializable { private static final long serialVersionUID = -482175549460148301L; private Set<Long> _dcIds; private Set<Long> _podIds; private Set<Long> _clusterIds; private Set<Long> _hostIds; private Set<Long> _poolIds; public ExcludeList() { } public ExcludeList(Set<Long> dcIds, Set<Long> podIds, Set<Long> clusterIds, Set<Long> hostIds, Set<Long> poolIds) { if (dcIds != null) { this._dcIds = new HashSet<Long>(dcIds); } if (podIds != null) { this._podIds = new HashSet<Long>(podIds); } if (clusterIds != null) { this._clusterIds = new HashSet<Long>(clusterIds); } if (hostIds != null) { this._hostIds = new HashSet<Long>(hostIds); } if (poolIds != null) { this._poolIds = new HashSet<Long>(poolIds); } } public boolean add(InsufficientCapacityException e) { Class<?> scope = e.getScope(); if (scope == null) { return false; } if (Host.class.isAssignableFrom(scope)) { addHost(e.getId()); } else if (Pod.class.isAssignableFrom(scope)) { addPod(e.getId()); } else if (DataCenter.class.isAssignableFrom(scope)) { addDataCenter(e.getId()); } else if (Cluster.class.isAssignableFrom(scope)) { addCluster(e.getId()); } else if (StoragePool.class.isAssignableFrom(scope)) { addPool(e.getId()); } else { return false; } return true; } public boolean add(ResourceUnavailableException e) { Class<?> scope = e.getScope(); if (scope == null) { return false; } if (Host.class.isAssignableFrom(scope)) { addHost(e.getResourceId()); } else if (Pod.class.isAssignableFrom(scope)) { addPod(e.getResourceId()); } else if (DataCenter.class.isAssignableFrom(scope)) { addDataCenter(e.getResourceId()); } else if (Cluster.class.isAssignableFrom(scope)) { addCluster(e.getResourceId()); } else if (StoragePool.class.isAssignableFrom(scope)) { addPool(e.getResourceId()); } else { return false; } return true; } public void addPool(long poolId) { if (_poolIds == null) { _poolIds = new HashSet<Long>(); } _poolIds.add(poolId); } public void addDataCenter(long dataCenterId) { if (_dcIds == null) { _dcIds = new HashSet<Long>(); } _dcIds.add(dataCenterId); } public void addPod(long podId) { if (_podIds == null) { _podIds = new HashSet<Long>(); } _podIds.add(podId); } public void addPodList(Collection<Long> podList) { if (_podIds == null) { _podIds = new HashSet<Long>(); } _podIds.addAll(podList); } public void addCluster(long clusterId) { if (_clusterIds == null) { _clusterIds = new HashSet<Long>(); } _clusterIds.add(clusterId); } public void addClusterList(Collection<Long> clusterList) { if (_clusterIds == null) { _clusterIds = new HashSet<Long>(); } _clusterIds.addAll(clusterList); } public void addHost(long hostId) { if (_hostIds == null) { _hostIds = new HashSet<Long>(); } _hostIds.add(hostId); } public void addHostList(Collection<Long> hostList) { if (_hostIds == null) { _hostIds = new HashSet<Long>(); } _hostIds.addAll(hostList); } public boolean shouldAvoid(Host host) { if (_dcIds != null && _dcIds.contains(host.getDataCenterId())) { return true; } if (_podIds != null && _podIds.contains(host.getPodId())) { return true; } if (_clusterIds != null && _clusterIds.contains(host.getClusterId())) { return true; } if (_hostIds != null && _hostIds.contains(host.getId())) { return true; } return false; } public boolean shouldAvoid(Cluster cluster) { if (_dcIds != null && _dcIds.contains(cluster.getDataCenterId())) { return true; } if (_podIds != null && _podIds.contains(cluster.getPodId())) { return true; } if (_clusterIds != null && _clusterIds.contains(cluster.getId())) { return true; } return false; } public boolean shouldAvoid(Pod pod) { if (_dcIds != null && _dcIds.contains(pod.getDataCenterId())) { return true; } if (_podIds != null && _podIds.contains(pod.getId())) { return true; } return false; } public boolean shouldAvoid(StoragePool pool) { if (_dcIds != null && _dcIds.contains(pool.getDataCenterId())) { return true; } if (_podIds != null && _podIds.contains(pool.getPodId())) { return true; } if (_clusterIds != null && _clusterIds.contains(pool.getClusterId())) { return true; } if (_poolIds != null && _poolIds.contains(pool.getId())) { return true; } return false; } public boolean shouldAvoid(DataCenter dc) { if (_dcIds != null && _dcIds.contains(dc.getId())) { return true; } return false; } public Set<Long> getDataCentersToAvoid() { return _dcIds; } public Set<Long> getPodsToAvoid() { return _podIds; } public Set<Long> getClustersToAvoid() { return _clusterIds; } public Set<Long> getHostsToAvoid() { return _hostIds; } public Set<Long> getPoolsToAvoid() { return _poolIds; } } }