| /** |
| * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. |
| * |
| * This software is licensed under the GNU General Public License v3 or later. |
| * |
| * It is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation, either version 3 of the License, or any later version. |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| */ |
| |
| /** |
| * |
| */ |
| package com.cloud.deploy; |
| |
| 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.VirtualMachine; |
| import com.cloud.vm.VirtualMachineProfile; |
| |
| /** |
| * Returns a deployment destination for the VM. |
| */ |
| 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. |
| */ |
| DeployDestination plan(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException; |
| |
| /** |
| * check() is called right before the virtual machine starts to make sure |
| * the host has enough capacity. |
| * |
| * @param vm virtual machine in question. |
| * @param plan deployment plan used to determined the deploy destination. |
| * @param dest destination returned by plan. |
| * @param avoid what to avoid. |
| * @return true if it's okay to start; false if not. If false, the exclude list will include what should be excluded. |
| */ |
| boolean check(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, DeployDestination dest, ExcludeList exclude); |
| |
| /** |
| * 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<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid); |
| |
| public static class ExcludeList { |
| 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){ |
| this._dcIds = _dcIds; |
| this._podIds = _podIds; |
| this._clusterIds = _clusterIds; |
| this._poolIds = _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 addCluster(long clusterId) { |
| if (_clusterIds == null) { |
| _clusterIds = new HashSet<Long>(); |
| } |
| _clusterIds.add(clusterId); |
| } |
| |
| public void addHost(long hostId) { |
| if (_hostIds == null) { |
| _hostIds = new HashSet<Long>(); |
| } |
| _hostIds.add(hostId); |
| } |
| |
| 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 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; |
| } |
| } |
| } |