Repository: cloudstack Updated Branches: refs/heads/rbac fa80c63c3 -> 84a528fad
deployVm/startVm APIs: ability to define deploymentPlanner for VmToStart in the api call (available to ROOT admin only) Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/1b83698d Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/1b83698d Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/1b83698d Branch: refs/heads/rbac Commit: 1b83698dac712e3497d4140b15c9fcba3870c705 Parents: 5779292 Author: Alena Prokharchyk <[email protected]> Authored: Tue Mar 11 10:14:08 2014 -0700 Committer: Alena Prokharchyk <[email protected]> Committed: Thu Mar 13 10:23:34 2014 -0700 ---------------------------------------------------------------------- .../api/command/user/vm/DeployVMCmd.java | 7 ++++ .../api/command/user/vm/StartVMCmd.java | 13 ++++++-- .../src/com/cloud/vm/VirtualMachineManager.java | 2 +- .../cloud/entity/api/VirtualMachineEntity.java | 3 +- .../cloud/deploy/DeploymentPlanningManager.java | 4 ++- .../com/cloud/vm/VirtualMachineManagerImpl.java | 20 ++++++----- .../src/com/cloud/vm/VmWorkStart.java | 12 +++++-- .../cloud/entity/api/VMEntityManager.java | 3 +- .../cloud/entity/api/VMEntityManagerImpl.java | 19 ++++++----- .../entity/api/VirtualMachineEntityImpl.java | 4 +-- .../cloud/entity/api/db/VMReservationVO.java | 11 ++++++ .../lb/InternalLoadBalancerVMManagerImpl.java | 2 +- .../deploy/DeploymentPlanningManagerImpl.java | 31 +++++++++++------ .../src/com/cloud/deploy/FirstFitPlanner.java | 3 +- .../cloud/network/as/AutoScaleManagerImpl.java | 4 +-- server/src/com/cloud/vm/UserVmManager.java | 2 +- server/src/com/cloud/vm/UserVmManagerImpl.java | 35 ++++++++++---------- setup/db/db/schema-430to440.sql | 2 ++ 18 files changed, 113 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index bd363da..44edef8 100755 --- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -178,6 +178,9 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd { @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, since = "4.3", description = "used to specify the custom parameters.") private Map details; + @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin }) + private String deploymentPlanner; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -193,6 +196,10 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd { return diskOfferingId; } + public String getDeploymentPlanner() { + return deploymentPlanner; + } + public String getDisplayName() { return displayName; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java index 553b753..f55aa59 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java @@ -16,18 +16,18 @@ // under the License. package org.apache.cloudstack.api.command.user.vm; -import org.apache.cloudstack.api.BaseAsyncVMCmd; -import org.apache.log4j.Logger; - +import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiCommandJobType; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncVMCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -61,6 +61,9 @@ public class StartVMCmd extends BaseAsyncVMCmd { since = "3.0.1") private Long hostId; + @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin }) + private String deploymentPlanner; + // /////////////////////////////////////////////////// // ///////////////// Accessors /////////////////////// // /////////////////////////////////////////////////// @@ -86,6 +89,10 @@ public class StartVMCmd extends BaseAsyncVMCmd { return "virtualmachine"; } + public String getDeploymentPlanner() { + return deploymentPlanner; + } + @Override public long getEntityOwnerId() { UserVm vm = _responseGenerator.findUserVmById(getId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/api/src/com/cloud/vm/VirtualMachineManager.java ---------------------------------------------------------------------- diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java index 350f396..99f5595 100644 --- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java +++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java @@ -85,7 +85,7 @@ public interface VirtualMachineManager extends Manager { void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params); - void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy); + void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner); void stop(String vmUuid) throws ResourceUnavailableException; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java index 773c683..37501f0 100755 --- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java +++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java @@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlRootElement; import org.apache.cloudstack.engine.entity.api.CloudStackEntity; import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner; import com.cloud.deploy.DeploymentPlanner.ExcludeList; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.CloudException; @@ -90,7 +91,7 @@ public interface VirtualMachineEntity extends CloudStackEntity { * @param exclude list of areas to exclude * @return a reservation id */ - String reserve(String plannerToUse, @BeanParam DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException, + String reserve(DeploymentPlanner plannerToUse, @BeanParam DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException, ResourceUnavailableException; /** http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java ---------------------------------------------------------------------- diff --git a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java index de2fc0e..ee6721a 100644 --- a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java +++ b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java @@ -43,8 +43,10 @@ public interface DeploymentPlanningManager extends Manager { ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException; String finalizeReservation(DeployDestination plannedDestination, - VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids) + VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException; void cleanupVMReservations(); + + DeploymentPlanner getDeploymentPlannerByName(String plannerName); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 609aefa..2cbde35 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -40,8 +40,6 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -70,6 +68,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -80,8 +79,8 @@ import com.cloud.agent.api.CheckVirtualMachineAnswer; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.ClusterSyncAnswer; import com.cloud.agent.api.ClusterSyncCommand; -import com.cloud.agent.api.ClusterVMMetaDataSyncCommand; import com.cloud.agent.api.ClusterVMMetaDataSyncAnswer; +import com.cloud.agent.api.ClusterVMMetaDataSyncCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.MigrateAnswer; import com.cloud.agent.api.MigrateCommand; @@ -608,13 +607,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params) { - start(vmUuid, params, null); + start(vmUuid, params, null, null); } @Override - public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy) { + public void start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner) { try { - advanceStart(vmUuid, params, planToDeploy, null); + advanceStart(vmUuid, params, planToDeploy, planner); } catch (ConcurrentOperationException e) { throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e).add(VirtualMachine.class, vmUuid); } catch (InsufficientCapacityException e) { @@ -779,7 +778,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac _workJobDao.expunge(placeHolder.getId()); } } else { - Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy); + Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy, planner); try { VirtualMachine vm = outcome.get(); @@ -4451,7 +4450,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // public Outcome<VirtualMachine> startVmThroughJobQueue(final String vmUuid, final Map<VirtualMachineProfile.Param, Object> params, - final DeploymentPlan planToDeploy) { + final DeploymentPlan planToDeploy, final DeploymentPlanner planner) { final CallContext context = CallContext.current(); final User callingUser = context.getCallingUser(); @@ -4488,6 +4487,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // save work context info (there are some duplications) VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER); workInfo.setPlan(planToDeploy); + if (planner != null) { + workInfo.setDeploymentPlanner(planner.getName()); + } workInfo.setParams(params); workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo)); @@ -5123,7 +5125,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } assert (vm != null); - orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), null); + orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), _dpMgr.getDeploymentPlannerByName(work.getDeploymentPlanner())); return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/com/cloud/vm/VmWorkStart.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java index f1b2efd..bb9f375 100644 --- a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java +++ b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java @@ -21,10 +21,9 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import org.apache.log4j.Logger; - import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper; +import org.apache.log4j.Logger; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeploymentPlan; @@ -46,6 +45,7 @@ public class VmWorkStart extends VmWork { String reservationId; String journalName; + String planner; // use serialization friendly map private Map<String, String> rawParams; @@ -91,6 +91,14 @@ public class VmWorkStart extends VmWork { } } + public void setDeploymentPlanner(String planner) { + this.planner = planner; + } + + public String getDeploymentPlanner() { + return this.planner; + } + public Map<String, String> getRawParams() { return rawParams; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java index 7c53302..3145314 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java @@ -21,6 +21,7 @@ import java.util.Map; import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO; import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner; import com.cloud.deploy.DeploymentPlanner.ExcludeList; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; @@ -35,7 +36,7 @@ public interface VMEntityManager { void saveVirtualMachine(VMEntityVO vmInstanceVO); - String reserveVirtualMachine(VMEntityVO vmEntityVO, String plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException, + String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException, ResourceUnavailableException; void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map<VirtualMachineProfile.Param, Object> params) http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java index 36481ab..b1ac2f8 100755 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java @@ -22,9 +22,6 @@ import java.util.UUID; import javax.inject.Inject; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO; import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO; @@ -32,6 +29,8 @@ import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMEntityDao; import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.dc.DataCenter; import com.cloud.deploy.DataCenterDeployment; @@ -114,6 +113,8 @@ public class VMEntityManagerImpl implements VMEntityManager { @Inject protected AffinityGroupVMMapDao _affinityGroupVMMapDao; + @Inject + DeploymentPlanningManager _planningMgr; @Override public VMEntityVO loadVirtualMachine(String vmId) { @@ -138,7 +139,7 @@ public class VMEntityManagerImpl implements VMEntityManager { } @Override - public String reserveVirtualMachine(VMEntityVO vmEntityVO, String plannerToUse, DeploymentPlan planToDeploy, ExcludeList exclude) + public String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner plannerToUse, DeploymentPlan planToDeploy, ExcludeList exclude) throws InsufficientCapacityException, ResourceUnavailableException { //call planner and get the deployDestination. @@ -189,13 +190,13 @@ public class VMEntityManagerImpl implements VMEntityManager { while (true) { DeployDestination dest = null; try { - dest = _dpMgr.planDeployment(vmProfile, plan, exclude, null); + dest = _dpMgr.planDeployment(vmProfile, plan, exclude, plannerToUse); } catch (AffinityConflictException e) { throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict"); } if (dest != null) { - String reservationId = _dpMgr.finalizeReservation(dest, vmProfile, plan, exclude); + String reservationId = _dpMgr.finalizeReservation(dest, vmProfile, plan, exclude, plannerToUse); if (reservationId != null) { return reservationId; } else { @@ -229,7 +230,7 @@ public class VMEntityManagerImpl implements VMEntityManager { DataCenterDeployment reservedPlan = new DataCenterDeployment(vm.getDataCenterId(), vmReservation.getPodId(), vmReservation.getClusterId(), vmReservation.getHostId(), null, null); try { - _itMgr.start(vm.getUuid(), params, reservedPlan); + _itMgr.start(vm.getUuid(), params, reservedPlan, _planningMgr.getDeploymentPlannerByName(vmReservation.getDeploymentPlanner())); } catch (Exception ex) { // Retry the deployment without using the reservation plan DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); @@ -238,11 +239,11 @@ public class VMEntityManagerImpl implements VMEntityManager { plan.setAvoids(reservedPlan.getAvoids()); } - _itMgr.start(vm.getUuid(), params, plan); + _itMgr.start(vm.getUuid(), params, plan, null); } } else { // no reservation found. Let VirtualMachineManager retry - _itMgr.start(vm.getUuid(), params, null); + _itMgr.start(vm.getUuid(), params, null, null); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java index 7f2e4ff..706748f 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java @@ -24,10 +24,10 @@ import java.util.Map; import javax.inject.Inject; import org.springframework.stereotype.Component; - import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO; import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner; import com.cloud.deploy.DeploymentPlanner.ExcludeList; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; @@ -195,7 +195,7 @@ public class VirtualMachineEntityImpl implements VirtualMachineEntity { } @Override - public String reserve(String plannerToUse, DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException, + public String reserve(DeploymentPlanner plannerToUse, DeploymentPlan plan, ExcludeList exclude, String caller) throws InsufficientCapacityException, ResourceUnavailableException { return manager.reserveVirtualMachine(this.vmEntityVO, plannerToUse, plan, exclude); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java index dabed15..b934a5d 100644 --- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java +++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMReservationVO.java @@ -66,6 +66,9 @@ public class VMReservationVO implements Identity, InternalIdentity { @Column(name = GenericDao.REMOVED_COLUMN) private Date removed; + @Column(name = "deployment_planner") + private String deploymentPlanner; + // VolumeId -> poolId @Transient Map<Long, Long> volumeReservationMap; @@ -124,4 +127,12 @@ public class VMReservationVO implements Identity, InternalIdentity { this.volumeReservationMap = volumeReservationMap; } + public void setDeploymentPlanner(String planner) { + this.deploymentPlanner = planner; + } + + public String getDeploymentPlanner() { + return this.deploymentPlanner; + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java index 8b82306..aa763d5 100644 --- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java +++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java @@ -805,7 +805,7 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In protected DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, Account caller, long callerUserId, Map<Param, Object> params) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Starting Internal LB VM " + internalLbVm); - _itMgr.start(internalLbVm.getUuid(), params, null); + _itMgr.start(internalLbVm.getUuid(), params, null, null); if (internalLbVm.isStopPending()) { s_logger.info("Clear the stop pending flag of Internal LB VM " + internalLbVm.getHostName() + " after start router successfully!"); internalLbVm.setStopPending(false); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index f76e485..5312e15 100644 --- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@ -31,8 +31,6 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.affinity.AffinityGroupProcessor; import org.apache.cloudstack.affinity.AffinityGroupService; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; @@ -51,6 +49,7 @@ import org.apache.cloudstack.managed.context.ManagedContextTimerTask; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -284,12 +283,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key()); } } - for (DeploymentPlanner plannerInList : _planners) { - if (plannerName.equals(plannerInList.getName())) { - planner = plannerInList; - break; - } - } + planner = getDeploymentPlannerByName(plannerName); } int cpu_requested = offering.getCpu() * offering.getSpeed(); @@ -450,7 +444,6 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy if (planner != null && planner.canHandle(vmProfile, plan, avoids)) { while (true) { - if (planner instanceof DeploymentClusterPlanner) { ExcludeList plannerAvoidInput = @@ -502,6 +495,21 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy return dest; } + @Override + public DeploymentPlanner getDeploymentPlannerByName(String plannerName) { + if (plannerName != null) { + for (DeploymentPlanner plannerInList : _planners) { + if (plannerName != null) { + } + if (plannerName.equalsIgnoreCase(plannerInList.getName())) { + return plannerInList; + } + } + } + + return null; + } + private void checkForNonDedicatedResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) { boolean isExplicit = false; VirtualMachine vm = vmProfile.getVirtualMachine(); @@ -1345,7 +1353,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy @DB @Override - public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids) + public String finalizeReservation(final DeployDestination plannedDestination, final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, final DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException { final VirtualMachine vm = vmProfile.getVirtualMachine(); @@ -1374,6 +1382,9 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy VMReservationVO vmReservation = new VMReservationVO(vm.getId(), plannedDestination.getDataCenter().getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster() .getId(), plannedDestination.getHost().getId()); + if (planner != null) { + vmReservation.setDeploymentPlanner(planner.getName()); + } Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>(); if (vm.getHypervisorType() != HypervisorType.BareMetal) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/deploy/FirstFitPlanner.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index 1c79a67..c09fa7a 100755 --- a/server/src/com/cloud/deploy/FirstFitPlanner.java +++ b/server/src/com/cloud/deploy/FirstFitPlanner.java @@ -25,13 +25,12 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.log4j.Logger; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityManager; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/network/as/AutoScaleManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 2fa3821..61b7f4b 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -53,7 +53,6 @@ import org.apache.cloudstack.api.command.user.vm.DeployVMCmd; import org.apache.cloudstack.config.ApiServiceConfiguration; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; - import org.apache.log4j.Logger; import com.cloud.api.ApiDBUtils; @@ -120,7 +119,6 @@ import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.net.NetUtils; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmService; - import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -1371,7 +1369,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale private boolean startNewVM(final long vmId) { try { CallContext.current().setEventDetails("Vm Id: " + vmId); - _userVmManager.startVirtualMachine(vmId, null, null); + _userVmManager.startVirtualMachine(vmId, null, null, null); } catch (final ResourceUnavailableException ex) { s_logger.warn("Exception: ", ex); throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/vm/UserVmManager.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index 7371692..11b110f 100755 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@ -108,7 +108,7 @@ public interface UserVmManager extends UserVmService { Pair<List<UserVmJoinVO>, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags); - Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams) + Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; boolean upgradeVirtualMachine(Long id, Long serviceOfferingId, Map<String, String> customParameters) throws ResourceUnavailableException, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/server/src/com/cloud/vm/UserVmManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index be00aa8..0751d27 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -115,7 +115,9 @@ import com.cloud.dc.dao.DedicatedResourceDao; import com.cloud.dc.dao.HostPodDao; import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlanner; import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.deploy.DeploymentPlanningManager; import com.cloud.deploy.PlannerHostReservationVO; import com.cloud.deploy.dao.PlannerHostReservationDao; import com.cloud.domain.DomainVO; @@ -396,7 +398,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir protected ProjectManager _projectMgr; @Inject protected ResourceManager _resourceMgr; - @Inject protected NetworkServiceMapDao _ntwkSrvcDao; @Inject @@ -415,17 +416,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir protected GuestOSCategoryDao _guestOSCategoryDao; @Inject UsageEventDao _usageEventDao; - @Inject SecondaryStorageVmDao _secondaryDao; @Inject VmDiskStatisticsDao _vmDiskStatsDao; - @Inject protected VMSnapshotDao _vmSnapshotDao; @Inject protected VMSnapshotManager _vmSnapshotMgr; - @Inject AffinityGroupVMMapDao _affinityGroupVMMapDao; @Inject @@ -450,6 +448,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir UserVmDetailsDao _uservmDetailsDao; @Inject UUIDManager _uuidMgr; + @Inject + DeploymentPlanningManager _planningMgr; protected ScheduledExecutorService _executor = null; protected int _expungeInterval; @@ -1975,7 +1975,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir @Override @ActionEvent(eventType = EventTypes.EVENT_VM_START, eventDescription = "starting Vm", async = true) public UserVm startVirtualMachine(StartVMCmd cmd) throws ExecutionException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { - return startVirtualMachine(cmd.getId(), cmd.getHostId(), null).first(); + return startVirtualMachine(cmd.getId(), cmd.getHostId(), null, cmd.getDeploymentPlanner()).first(); } @Override @@ -2974,10 +2974,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir @Override @ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "starting Vm", async = true) public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { - return startVirtualMachine(cmd, null); + return startVirtualMachine(cmd, null, cmd.getDeploymentPlanner()); } - protected UserVm startVirtualMachine(DeployVMCmd cmd, Map<VirtualMachineProfile.Param, Object> additonalParams) throws ResourceUnavailableException, + protected UserVm startVirtualMachine(DeployVMCmd cmd, Map<VirtualMachineProfile.Param, Object> additonalParams, String deploymentPlannerToUse) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { long vmId = cmd.getEntityId(); @@ -2986,7 +2986,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> vmParamPair = null; try { - vmParamPair = startVirtualMachine(vmId, hostId, additonalParams); + vmParamPair = startVirtualMachine(vmId, hostId, additonalParams, deploymentPlannerToUse); vm = vmParamPair.first(); } finally { updateVmStateForFailedVmCreation(vm.getId(), hostId); @@ -3232,7 +3232,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } @Override - public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams) + public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { // Input validation Account callerAccount = CallContext.current().getCallingAccount(); @@ -3324,18 +3324,17 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir VirtualMachineEntity vmEntity = _orchSrvc.getVirtualMachine(vm.getUuid()); - // Get serviceOffering for Virtual Machine - ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()); - String plannerName = offering.getDeploymentPlanner(); - if (plannerName == null) { - if (vm.getHypervisorType() == HypervisorType.BareMetal) { - plannerName = "BareMetalPlanner"; - } else { - plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key()); + DeploymentPlanner planner = null; + if (deploymentPlannerToUse != null) { + // if set to null, the deployment planner would be later figured out either from global config var, or from + // the service offering + planner = _planningMgr.getDeploymentPlannerByName(deploymentPlannerToUse); + if (planner == null) { + throw new InvalidParameterValueException("Can't find a planner by name " + deploymentPlannerToUse); } } - String reservationId = vmEntity.reserve(plannerName, plan, new ExcludeList(), Long.toString(callerUser.getId())); + String reservationId = vmEntity.reserve(planner, plan, new ExcludeList(), Long.toString(callerUser.getId())); vmEntity.deploy(reservationId, Long.toString(callerUser.getId()), params); Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> vmParamPair = new Pair(vm, params); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1b83698d/setup/db/db/schema-430to440.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql index ab6bc98..235f357 100644 --- a/setup/db/db/schema-430to440.sql +++ b/setup/db/db/schema-430to440.sql @@ -621,3 +621,5 @@ UPDATE `cloud`.`guest_os_hypervisor` SET `created` = now(); ALTER TABLE `cloud`.`guest_os` ADD COLUMN `created` datetime COMMENT 'Time when Guest OS was created in system'; ALTER TABLE `cloud`.`guest_os` ADD COLUMN `removed` datetime COMMENT 'Time when Guest OS was removed if deleted, else NULL'; UPDATE `cloud`.`guest_os` SET `created` = now(); + +ALTER TABLE `cloud`.`vm_reservation` ADD COLUMN `deployment_planner` varchar(40) DEFAULT NULL COMMENT 'Preferred deployment planner for the vm';
