From 1b83698dac712e3497d4140b15c9fcba3870c705 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Tue, 11 Mar 2014 10:14:08 -0700 Subject: [PATCH 1/5] deployVm/startVm APIs: ability to define deploymentPlanner for VmToStart in the api call (available to ROOT admin only) --- .../api/command/user/vm/DeployVMCmd.java | 7 ++++ .../api/command/user/vm/StartVMCmd.java | 13 +++++-- .../com/cloud/vm/VirtualMachineManager.java | 2 +- .../entity/api/VirtualMachineEntity.java | 3 +- .../deploy/DeploymentPlanningManager.java | 4 ++- .../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 +- .../network/as/AutoScaleManagerImpl.java | 4 +-- server/src/com/cloud/vm/UserVmManager.java | 2 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 35 +++++++++---------- setup/db/db/schema-430to440.sql | 2 ++ 18 files changed, 113 insertions(+), 64 deletions(-) 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 bd363da7918..44edef8cab4 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; } 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 553b753ba27..f55aa596d36 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()); diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java index 350f3960e35..99f55955793 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 params); - void start(String vmUuid, Map params, DeploymentPlan planToDeploy); + void start(String vmUuid, Map params, DeploymentPlan planToDeploy, DeploymentPlanner planner); void stop(String vmUuid) throws ResourceUnavailableException; 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 773c683ebf5..37501f014d0 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; /** diff --git a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java index de2fc0eaf5a..ee6721ab445 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); } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 609aefa4b2a..2cbde359d82 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 params) { - start(vmUuid, params, null); + start(vmUuid, params, null, null); } @Override - public void start(String vmUuid, Map params, DeploymentPlan planToDeploy) { + public void start(String vmUuid, Map 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 outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy); + Outcome outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy, planner); try { VirtualMachine vm = outcome.get(); @@ -4451,7 +4450,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // public Outcome startVmThroughJobQueue(final String vmUuid, final Map 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.SUCCEEDED, null); } diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStart.java b/engine/orchestration/src/com/cloud/vm/VmWorkStart.java index f1b2efdbeac..bb9f375e267 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 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 getRawParams() { return rawParams; } 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 7c533026f99..314531459d6 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 params) 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 36481ab5a43..b1ac2f85337 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); } } 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 7f2e4fff240..706748f4f75 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); } 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 dabed151593..b934a5d6118 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 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; + } + } 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 8b823063e5f..aa763d582bc 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 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); diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index f76e4852849..5312e15f0f7 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 volumeReservationMap = new HashMap(); if (vm.getHypervisorType() != HypervisorType.BareMetal) { diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java index 1c79a67e780..c09fa7acfd6 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; diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 2fa3821c7a5..61b7f4b4fcd 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 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()); diff --git a/server/src/com/cloud/vm/UserVmManager.java b/server/src/com/cloud/vm/UserVmManager.java index 7371692ebe3..11b110f9d93 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, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags); - Pair> startVirtualMachine(long vmId, Long hostId, Map additionalParams) + Pair> startVirtualMachine(long vmId, Long hostId, Map additionalParams, String deploymentPlannerToUse) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; boolean upgradeVirtualMachine(Long id, Long serviceOfferingId, Map customParameters) throws ResourceUnavailableException, diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index be00aa8c569..0751d27d846 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 additonalParams) throws ResourceUnavailableException, + protected UserVm startVirtualMachine(DeployVMCmd cmd, Map additonalParams, String deploymentPlannerToUse) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException { long vmId = cmd.getEntityId(); @@ -2986,7 +2986,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir Pair> 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> startVirtualMachine(long vmId, Long hostId, Map additionalParams) + public Pair> startVirtualMachine(long vmId, Long hostId, Map 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> vmParamPair = new Pair(vm, params); diff --git a/setup/db/db/schema-430to440.sql b/setup/db/db/schema-430to440.sql index ab6bc98bcf9..235f357dbee 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'; From 39e5b768e8fcae9622e01b2ca72a49675eb6d3fb Mon Sep 17 00:00:00 2001 From: Antonio Fornie Date: Wed, 12 Mar 2014 18:47:50 -0500 Subject: [PATCH 2/5] More generic parameters that are not unknown Adding some more parameter names that should not be considered unknown since they belong to general use paramters Signed-off-by: Alena Prokharchyk --- .../apache/cloudstack/api/ApiConstants.java | 2 +- .../ParamGenericValidationWorker.java | 3 +++ .../ParamGenericValidationWorkerTest.java | 24 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 089affb801d..d5e97e6e5b0 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -59,7 +59,7 @@ public class ApiConstants { public static final String CTX_ACCOUNT_ID = "ctxaccountid"; public static final String CTX_USER_ID = "ctxuserid"; public static final String CTXSTARTEVENTID = "ctxstarteventid"; - public static final String CTX_START_EVENT_ID = "ctxStartEventId"; + public static final String CTX_START_EVENT_ID = "ctxstarteventid"; public static final String CUSTOMIZED = "customized"; public static final String CUSTOMIZED_IOPS = "customizediops"; public static final String CUSTOM_ID = "customid"; diff --git a/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java b/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java index f456468948b..7a73b8aef97 100644 --- a/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java +++ b/server/src/com/cloud/api/dispatch/ParamGenericValidationWorker.java @@ -42,6 +42,7 @@ public class ParamGenericValidationWorker implements DispatchWorker { protected static final List defaultParamNames = new ArrayList(); static { + defaultParamNames.add(ApiConstants.ACCOUNT_ID); defaultParamNames.add(ApiConstants.CTX_START_EVENT_ID); defaultParamNames.add(ApiConstants.COMMAND); defaultParamNames.add(ApiConstants.CMD_EVENT_TYPE); @@ -62,6 +63,8 @@ public class ParamGenericValidationWorker implements DispatchWorker { defaultParamNames.add(ApiConstants.CTX_ACCOUNT_ID); defaultParamNames.add(ApiConstants.CTX_START_EVENT_ID); defaultParamNames.add(ApiConstants.CTX_USER_ID); + defaultParamNames.add(ApiConstants.UUID); + defaultParamNames.add(ApiConstants.ID); defaultParamNames.add("_"); } diff --git a/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java b/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java index 0803a2b0dbc..8f9709ca9da 100644 --- a/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java +++ b/server/test/com/cloud/api/dispatch/ParamGenericValidationWorkerTest.java @@ -75,6 +75,30 @@ public class ParamGenericValidationWorkerTest { final BaseCmd cmd = new FakeCmd(); final Map params = new HashMap(); params.put(ApiConstants.COMMAND, ""); + params.put(ApiConstants.ACCOUNT_ID, ""); + params.put(ApiConstants.CTX_START_EVENT_ID, ""); + params.put(ApiConstants.COMMAND, ""); + params.put(ApiConstants.CMD_EVENT_TYPE, ""); + params.put(ApiConstants.USERNAME, ""); + params.put(ApiConstants.USER_ID, ""); + params.put(ApiConstants.PASSWORD, ""); + params.put(ApiConstants.DOMAIN, ""); + params.put(ApiConstants.DOMAIN_ID, ""); + params.put(ApiConstants.DOMAIN__ID, ""); + params.put(ApiConstants.SESSIONKEY, ""); + params.put(ApiConstants.RESPONSE, ""); + params.put(ApiConstants.PAGE, ""); + params.put(ApiConstants.USER_API_KEY, ""); + params.put(ApiConstants.API_KEY, ""); + params.put(ApiConstants.PAGE_SIZE, ""); + params.put(ApiConstants.HTTPMETHOD, ""); + params.put(ApiConstants.SIGNATURE, ""); + params.put(ApiConstants.CTX_ACCOUNT_ID, ""); + params.put(ApiConstants.CTX_START_EVENT_ID, ""); + params.put(ApiConstants.CTX_USER_ID, ""); + params.put(ApiConstants.UUID, ""); + params.put(ApiConstants.ID, ""); + params.put("_", ""); params.put("addedParam", ""); Account account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); From df8521194569668a923443767e783cd87ab5ea0c Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 13 Mar 2014 11:05:37 -0700 Subject: [PATCH 3/5] Removed unused imports and instance vars from FirstFitAllocator --- .../allocator/impl/FirstFitAllocator.java | 29 ++++--------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 8abb5cd316f..37368846da9 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -48,7 +48,6 @@ import com.cloud.offering.ServiceOffering; import com.cloud.org.Cluster; import com.cloud.resource.ResourceManager; import com.cloud.service.ServiceOfferingDetailsVO; -import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSVO; @@ -56,14 +55,9 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.user.Account; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.AdapterBase; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.dao.ConsoleProxyDao; -import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.SecondaryStorageVmDao; -import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; /** @@ -74,20 +68,10 @@ import com.cloud.vm.dao.VMInstanceDao; public class FirstFitAllocator extends AdapterBase implements HostAllocator { private static final Logger s_logger = Logger.getLogger(FirstFitAllocator.class); @Inject - HostDao _hostDao = null; + protected HostDao _hostDao = null; @Inject HostDetailsDao _hostDetailsDao = null; @Inject - UserVmDao _vmDao = null; - @Inject - ServiceOfferingDao _offeringDao = null; - @Inject - DomainRouterDao _routerDao = null; - @Inject - ConsoleProxyDao _consoleProxyDao = null; - @Inject - SecondaryStorageVmDao _secStorgaeVmDao = null; - @Inject ConfigurationDao _configDao = null; @Inject GuestOSDao _guestOSDao = null; @@ -96,19 +80,20 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator { @Inject VMInstanceDao _vmInstanceDao = null; @Inject - ResourceManager _resourceMgr; + protected ResourceManager _resourceMgr; @Inject ClusterDao _clusterDao; @Inject ClusterDetailsDao _clusterDetailsDao; @Inject ServiceOfferingDetailsDao _serviceOfferingDetailsDao; - float _factor = 1; - boolean _checkHvm = true; - protected String _allocationAlgorithm = "random"; @Inject CapacityManager _capacityMgr; + boolean _checkHvm = true; + protected String _allocationAlgorithm = "random"; + + @Override public List allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo) { return allocateTo(vmProfile, plan, type, avoid, returnUpTo, true); @@ -489,8 +474,6 @@ public class FirstFitAllocator extends AdapterBase implements HostAllocator { public boolean configure(String name, Map params) throws ConfigurationException { if (_configDao != null) { Map configs = _configDao.getConfiguration(params); - String opFactor = configs.get("cpu.overprovisioning.factor"); - _factor = NumbersUtil.parseFloat(opFactor, 1); String allocationAlgorithm = configs.get("vm.allocation.algorithm"); if (allocationAlgorithm != null) { From 67ab3211bd49724ee4a15aa4933c19c0e7adddff Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 13 Mar 2014 12:54:13 -0700 Subject: [PATCH 4/5] Removed getUUID() method from Domain interface as this interface already implements @Identity where getUUID is defined --- api/src/com/cloud/domain/Domain.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/src/com/cloud/domain/Domain.java b/api/src/com/cloud/domain/Domain.java index c4755d79c96..365a705041c 100644 --- a/api/src/com/cloud/domain/Domain.java +++ b/api/src/com/cloud/domain/Domain.java @@ -60,7 +60,4 @@ public interface Domain extends OwnedBy, Identity, InternalIdentity { String getNetworkDomain(); - @Override - public String getUuid(); - } From 90c485e5d659afdd8a6a09ec3b81e54ab7398296 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 13 Mar 2014 13:29:25 -0700 Subject: [PATCH 5/5] Fixed some problems reported by FindBugs --- .../apache/cloudstack/api/BaseListCmd.java | 2 +- .../security/dao/VmRulesetLogDaoImpl.java | 2 +- .../src/com/cloud/projects/ProjectVO.java | 5 + .../jobs/impl/JobSerializerHelper.java | 5 +- .../mom/rabbitmq/RabbitMQEventBus.java | 18 ++- .../src/com/cloud/dc/DedicatedResourceVO.java | 7 + .../cloud/network/IpAddressManagerImpl.java | 4 +- .../cloud/server/ManagementServerImpl.java | 123 +----------------- 8 files changed, 29 insertions(+), 137 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/BaseListCmd.java b/api/src/org/apache/cloudstack/api/BaseListCmd.java index f2800035ad5..407ad22b606 100644 --- a/api/src/org/apache/cloudstack/api/BaseListCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseListCmd.java @@ -24,7 +24,7 @@ import com.cloud.utils.exception.CSExceptionErrorCode; public abstract class BaseListCmd extends BaseCmd { private static Long s_maxPageSize = null; - public static Long s_pageSizeUnlimited = -1L; + public static final Long s_pageSizeUnlimited = -1L; // /////////////////////////////////////////////////// // ///////// BaseList API parameters ///////////////// diff --git a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java index c941055ef8d..90f8349349d 100644 --- a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java +++ b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java @@ -39,7 +39,7 @@ import com.cloud.utils.db.TransactionLegacy; @Component @Local(value = {VmRulesetLogDao.class}) public class VmRulesetLogDaoImpl extends GenericDaoBase implements VmRulesetLogDao { - protected static Logger s_logger = Logger.getLogger(VmRulesetLogDaoImpl.class); + protected static final Logger s_logger = Logger.getLogger(VmRulesetLogDaoImpl.class); private SearchBuilder VmIdSearch; private String InsertOrUpdateSQl = "INSERT INTO op_vm_ruleset_log (instance_id, created, logsequence) " + " VALUES(?, now(), 1) ON DUPLICATE KEY UPDATE logsequence=logsequence+1"; diff --git a/engine/schema/src/com/cloud/projects/ProjectVO.java b/engine/schema/src/com/cloud/projects/ProjectVO.java index d49e484dd31..77eed40d7ba 100644 --- a/engine/schema/src/com/cloud/projects/ProjectVO.java +++ b/engine/schema/src/com/cloud/projects/ProjectVO.java @@ -31,6 +31,7 @@ import javax.persistence.Table; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; +import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.GenericDao; @Entity @@ -161,4 +162,8 @@ public class ProjectVO implements Project, Identity, InternalIdentity { this.uuid = uuid; } + @Override + public int hashCode() { + return NumbersUtil.hash(id); + } } diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java index 67c4b867afe..735d7cf73e2 100644 --- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java +++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java @@ -29,6 +29,7 @@ import java.lang.reflect.Type; import org.apache.commons.codec.binary.Base64; import org.apache.log4j.Logger; +import com.cloud.utils.exception.CloudRuntimeException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; @@ -40,14 +41,12 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import com.cloud.utils.exception.CloudRuntimeException; - /** * Note: toPairList and appendPairList only support simple POJO objects currently */ public class JobSerializerHelper { private static final Logger s_logger = Logger.getLogger(JobSerializerHelper.class); - public static String token = "/"; + public static final String token = "/"; private static Gson s_gson; static { diff --git a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java index 8ad7033400b..8403271af8d 100644 --- a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java +++ b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java @@ -30,8 +30,16 @@ import java.util.concurrent.Executors; import javax.ejb.Local; import javax.naming.ConfigurationException; +import org.apache.cloudstack.framework.events.Event; +import org.apache.cloudstack.framework.events.EventBus; +import org.apache.cloudstack.framework.events.EventBusException; +import org.apache.cloudstack.framework.events.EventSubscriber; +import org.apache.cloudstack.framework.events.EventTopic; +import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.log4j.Logger; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.ManagerBase; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AlreadyClosedException; import com.rabbitmq.client.Channel; @@ -43,16 +51,6 @@ import com.rabbitmq.client.MessageProperties; import com.rabbitmq.client.ShutdownListener; import com.rabbitmq.client.ShutdownSignalException; -import org.apache.cloudstack.framework.events.Event; -import org.apache.cloudstack.framework.events.EventBus; -import org.apache.cloudstack.framework.events.EventBusException; -import org.apache.cloudstack.framework.events.EventSubscriber; -import org.apache.cloudstack.framework.events.EventTopic; -import org.apache.cloudstack.managed.context.ManagedContextRunnable; - -import com.cloud.utils.Ternary; -import com.cloud.utils.component.ManagerBase; - @Local(value = EventBus.class) public class RabbitMQEventBus extends ManagerBase implements EventBus { diff --git a/server/src/com/cloud/dc/DedicatedResourceVO.java b/server/src/com/cloud/dc/DedicatedResourceVO.java index 2e0fde7529b..79c563ced6e 100644 --- a/server/src/com/cloud/dc/DedicatedResourceVO.java +++ b/server/src/com/cloud/dc/DedicatedResourceVO.java @@ -25,6 +25,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import com.cloud.utils.NumbersUtil; + @Entity @Table(name = "dedicated_resources") public class DedicatedResourceVO implements DedicatedResources { @@ -163,4 +165,9 @@ public class DedicatedResourceVO implements DedicatedResources { return false; } } + + @Override + public int hashCode() { + return NumbersUtil.hash(id); + } } diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java index 15d1458fb59..20eae3ab294 100644 --- a/server/src/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/com/cloud/network/IpAddressManagerImpl.java @@ -1346,7 +1346,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage PublicIp publicIp = PublicIp.createFromAddrAndVlan(ipToAssoc, _vlanDao.findById(ipToAssoc.getVlanId())); ipList.add(publicIp); Map> ipToServices = _networkModel.getIpToServices(ipList, false, true); - if (ipToServices != null & !ipToServices.isEmpty()) { + if (!ipToServices.isEmpty()) { Set services = ipToServices.get(publicIp); if (services != null && !services.isEmpty()) { throw new InvalidParameterValueException("IP " + ipToAssoc + " has services and rules associated in the network " + networkId); @@ -1387,7 +1387,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId())); ipList.add(publicIp); Map> ipToServices = _networkModel.getIpToServices(ipList, false, true); - if (ipToServices != null & !ipToServices.isEmpty()) { + if (!ipToServices.isEmpty()) { Set ipServices = ipToServices.get(publicIp); if (ipServices != null && !ipServices.isEmpty()) { return false; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index cb735192610..2b63ae97428 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -40,15 +40,10 @@ import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; - import org.apache.cloudstack.acl.ControlledEntity; -import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroupProcessor; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd; import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd; import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd; import org.apache.cloudstack.api.command.admin.account.DisableAccountCmd; @@ -465,6 +460,8 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; 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.commons.codec.binary.Base64; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.GetVncPortAnswer; @@ -556,18 +553,14 @@ import com.cloud.storage.GuestOSHypervisor; import com.cloud.storage.GuestOSHypervisorVO; import com.cloud.storage.GuestOSVO; import com.cloud.storage.GuestOsCategory; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSDao; import com.cloud.storage.dao.GuestOSHypervisorDao; -import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.tags.ResourceTagVO; @@ -575,7 +568,6 @@ import com.cloud.tags.dao.ResourceTagDao; import com.cloud.template.TemplateManager; import com.cloud.user.Account; import com.cloud.user.AccountManager; -import com.cloud.user.AccountService; import com.cloud.user.SSHKeyPair; import com.cloud.user.SSHKeyPairVO; import com.cloud.user.User; @@ -583,7 +575,6 @@ import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; -import com.cloud.utils.EnumUtils; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.PasswordGenerator; @@ -668,8 +659,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Inject private DiskOfferingDao _diskOfferingDao; @Inject - private VMTemplateDao _templateDao; - @Inject private DomainDao _domainDao; @Inject private AccountDao _accountDao; @@ -734,15 +723,11 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Inject private UserVmManager _userVmMgr; @Inject - private AccountService _accountService; - @Inject private ServiceOfferingDao _offeringDao; - @Inject private DeploymentPlanningManager _dpMgr; private LockMasterListener _lockMasterListener; - private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker")); private final ScheduledExecutorService _alertExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("AlertChecker")); @Inject @@ -1809,108 +1794,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } */ - private VMTemplateVO updateTemplateOrIso(BaseUpdateTemplateOrIsoCmd cmd) { - Long id = cmd.getId(); - String name = cmd.getTemplateName(); - String displayText = cmd.getDisplayText(); - String format = cmd.getFormat(); - Long guestOSId = cmd.getOsTypeId(); - Boolean passwordEnabled = cmd.isPasswordEnabled(); - Boolean bootable = cmd.isBootable(); - Integer sortKey = cmd.getSortKey(); - Boolean isDynamicallyScalable = cmd.isDynamicallyScalable(); - Boolean isRoutingTemplate = cmd.isRoutingType(); - Account account = CallContext.current().getCallingAccount(); - - // verify that template exists - VMTemplateVO template = _templateDao.findById(id); - if (template == null || template.getRemoved() != null) { - InvalidParameterValueException ex = new InvalidParameterValueException("unable to find template/iso with specified id"); - ex.addProxyObject(id.toString(), "templateId"); - throw ex; - } - - // Don't allow to modify system template - if (id.equals(Long.valueOf(1))) { - InvalidParameterValueException ex = new InvalidParameterValueException("Unable to update template/iso of specified id"); - ex.addProxyObject(template.getUuid(), "templateId"); - throw ex; - } - - // do a permission check - _accountMgr.checkAccess(account, AccessType.ModifyEntry, true, template); - - if (cmd.isRoutingType() != null) { - if (!_accountService.isRootAdmin(account.getType())) { - throw new PermissionDeniedException("Parameter isrouting can only be specified by a Root Admin, permission denied"); - } - } - boolean updateNeeded = !(name == null && displayText == null && format == null && guestOSId == null && passwordEnabled == null && bootable == null && sortKey == null - && isDynamicallyScalable == null && isRoutingTemplate == null); - if (!updateNeeded) { - return template; - } - - template = _templateDao.createForUpdate(id); - - if (name != null) { - template.setName(name); - } - - if (displayText != null) { - template.setDisplayText(displayText); - } - - if (sortKey != null) { - template.setSortKey(sortKey); - } - - ImageFormat imageFormat = null; - if (format != null) { - try { - imageFormat = ImageFormat.valueOf(format.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new InvalidParameterValueException("Image format: " + format + " is incorrect. Supported formats are " + EnumUtils.listValues(ImageFormat.values())); - } - - template.setFormat(imageFormat); - } - - if (guestOSId != null) { - GuestOSVO guestOS = _guestOSDao.findById(guestOSId); - - if (guestOS == null) { - throw new InvalidParameterValueException("Please specify a valid guest OS ID."); - } else { - template.setGuestOSId(guestOSId); - } - } - - if (passwordEnabled != null) { - template.setEnablePassword(passwordEnabled); - } - - if (bootable != null) { - template.setBootable(bootable); - } - - if (isDynamicallyScalable != null) { - template.setDynamicallyScalable(isDynamicallyScalable); - } - - if (isRoutingTemplate != null) { - if (isRoutingTemplate) { - template.setTemplateType(TemplateType.ROUTING); - } else { - template.setTemplateType(TemplateType.USER); - } - } - - _templateDao.update(id, template); - - return _templateDao.findById(id); - } - @Override public Pair, Integer> searchForIPAddresses(ListPublicIpAddressesCmd cmd) { Object keyword = cmd.getKeyword(); @@ -3462,7 +3345,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } } - long diskOffMaxSize = _volumeMgr.CustomDiskOfferingMaxSize.value(); + long diskOffMaxSize = VolumeOrchestrationService.CustomDiskOfferingMaxSize.value(); KVMSnapshotEnabled = Boolean.parseBoolean(_configDao.getValue("KVM.snapshot.enabled")); boolean userPublicTemplateEnabled = TemplateManager.AllowPublicUserTemplates.valueIn(caller.getId());