Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7BC3710FCD for ; Fri, 14 Mar 2014 13:59:18 +0000 (UTC) Received: (qmail 9613 invoked by uid 500); 14 Mar 2014 13:58:55 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 9496 invoked by uid 500); 14 Mar 2014 13:58:53 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 366 invoked by uid 99); 14 Mar 2014 13:57:59 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Mar 2014 13:57:59 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 28B499819E8; Fri, 14 Mar 2014 13:57:59 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: hugo@apache.org To: commits@cloudstack.apache.org Date: Fri, 14 Mar 2014 13:58:07 -0000 Message-Id: <3dbefcc49d6d49559fdca530602d5805@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [10/50] [abbrv] git commit: updated refs/heads/4.4 to 48f8a95 Merge branch 'master' into rbac Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/84a528fa Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/84a528fa Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/84a528fa Branch: refs/heads/4.4 Commit: 84a528fad6979ed6745ad9eb9806d6b9a9fdb0f4 Parents: fa80c63 90c485e Author: Min Chen Authored: Thu Mar 13 14:52:37 2014 -0700 Committer: Min Chen Committed: Thu Mar 13 14:52:37 2014 -0700 ---------------------------------------------------------------------- api/src/com/cloud/domain/Domain.java | 3 - .../org/apache/cloudstack/api/ApiConstants.java | 2 +- .../org/apache/cloudstack/api/BaseListCmd.java | 2 +- .../api/command/user/vm/DeployVMCmd.java | 7 + .../api/command/user/vm/StartVMCmd.java | 11 +- .../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 +- .../security/dao/VmRulesetLogDaoImpl.java | 2 +- .../src/com/cloud/projects/ProjectVO.java | 5 + .../cloud/entity/api/db/VMReservationVO.java | 11 + .../jobs/impl/JobSerializerHelper.java | 5 +- .../mom/rabbitmq/RabbitMQEventBus.java | 18 +- .../lb/InternalLoadBalancerVMManagerImpl.java | 2 +- .../allocator/impl/FirstFitAllocator.java | 29 +-- .../dispatch/ParamGenericValidationWorker.java | 3 + .../src/com/cloud/dc/DedicatedResourceVO.java | 7 + .../deploy/DeploymentPlanningManagerImpl.java | 31 ++- .../src/com/cloud/deploy/FirstFitPlanner.java | 3 +- .../com/cloud/network/IpAddressManagerImpl.java | 4 +- .../cloud/network/as/AutoScaleManagerImpl.java | 4 +- .../com/cloud/server/ManagementServerImpl.java | 217 +------------------ server/src/com/cloud/vm/UserVmManager.java | 2 +- server/src/com/cloud/vm/UserVmManagerImpl.java | 35 ++- .../ParamGenericValidationWorkerTest.java | 24 ++ setup/db/db/schema-430to440.sql | 2 + 31 files changed, 175 insertions(+), 321 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/ApiConstants.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java ---------------------------------------------------------------------- diff --cc api/src/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java index 4e91c7b,f55aa59..13b7442 --- 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,13 +16,19 @@@ // 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.IAMEntityType; + import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.ACL; 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.ResponseObject.ResponseView; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.UserVmResponse; @@@ -70,6 -68,6 +74,7 @@@ public class StartVMCmd extends BaseAsy // ///////////////// Accessors /////////////////////// // /////////////////////////////////////////////////// ++ @Override public Long getId() { return id; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java index c1f336c,5312e15..9cbbb10 --- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java +++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java @@@ -1,57 -1,56 +1,56 @@@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.deploy; - -import java.util.ArrayList; +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.deploy; + +import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.List; +import java.util.Map; import java.util.Set; -import java.util.Timer; -import java.util.TreeSet; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.affinity.AffinityGroupProcessor; -import org.apache.cloudstack.affinity.AffinityGroupService; +import java.util.Timer; +import java.util.TreeSet; + +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; -import org.apache.cloudstack.affinity.AffinityGroupVO; -import org.apache.cloudstack.affinity.dao.AffinityGroupDao; -import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; -import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO; -import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; -import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.framework.messagebus.MessageBus; -import org.apache.cloudstack.framework.messagebus.MessageSubscriber; -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.cloudstack.affinity.AffinityGroupVO; +import org.apache.cloudstack.affinity.dao.AffinityGroupDao; +import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.engine.cloud.entity.api.db.VMReservationVO; +import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMReservationDao; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.MessageSubscriber; +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; import com.cloud.agent.api.AgentControlAnswer; @@@ -230,99 -229,94 +229,94 @@@ public class DeploymentPlanningManagerI public void setPlanners(List planners) { _planners = planners; - } + } + + protected List _affinityProcessors; - protected List _affinityProcessors; + public List getAffinityGroupProcessors() { + return _affinityProcessors; + } - public List getAffinityGroupProcessors() { - return _affinityProcessors; - } - - public void setAffinityGroupProcessors(List affinityProcessors) { + public void setAffinityGroupProcessors(List affinityProcessors) { _affinityProcessors = affinityProcessors; - } - - @Override + } + + @Override public DeployDestination planDeployment(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException { - - // call affinitygroup chain - VirtualMachine vm = vmProfile.getVirtualMachine(); - long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId()); + + // call affinitygroup chain + VirtualMachine vm = vmProfile.getVirtualMachine(); + long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId()); DataCenter dc = _dcDao.findById(vm.getDataCenterId()); - - if (vmGroupCount > 0) { - for (AffinityGroupProcessor processor : _affinityProcessors) { - processor.process(vmProfile, plan, avoids); - } + + if (vmGroupCount > 0) { + for (AffinityGroupProcessor processor : _affinityProcessors) { + processor.process(vmProfile, plan, avoids); + } + } + + if (vm.getType() == VirtualMachine.Type.User) { + checkForNonDedicatedResources(vmProfile, dc, avoids); } - - if (vm.getType() == VirtualMachine.Type.User) { - checkForNonDedicatedResources(vmProfile, dc, avoids); - } - if (s_logger.isDebugEnabled()) { + if (s_logger.isDebugEnabled()) { s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid()); - } - - // call planners + } + + // call planners //DataCenter dc = _dcDao.findById(vm.getDataCenterId()); - // check if datacenter is in avoid set - if (avoids.shouldAvoid(dc)) { - if (s_logger.isDebugEnabled()) { + // check if datacenter is in avoid set + if (avoids.shouldAvoid(dc)) { + if (s_logger.isDebugEnabled()) { s_logger.debug("DataCenter id = '" + dc.getId() + "' provided is in avoid set, DeploymentPlanner cannot allocate the VM, returning."); - } - return null; - } - - ServiceOffering offering = vmProfile.getServiceOffering(); + } + return null; + } + + ServiceOffering offering = vmProfile.getServiceOffering(); if(planner == null){ - String plannerName = offering.getDeploymentPlanner(); - if (plannerName == null) { - if (vm.getHypervisorType() == HypervisorType.BareMetal) { - plannerName = "BareMetalPlanner"; - } else { - plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key()); - } - } + String plannerName = offering.getDeploymentPlanner(); + if (plannerName == null) { + if (vm.getHypervisorType() == HypervisorType.BareMetal) { + plannerName = "BareMetalPlanner"; + } else { + 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(); - long ram_requested = offering.getRamSize() * 1024L * 1024L; - - if (s_logger.isDebugEnabled()) { - s_logger.debug("DeploymentPlanner allocation algorithm: " + planner); - + + int cpu_requested = offering.getCpu() * offering.getSpeed(); + long ram_requested = offering.getRamSize() * 1024L * 1024L; + + if (s_logger.isDebugEnabled()) { + s_logger.debug("DeploymentPlanner allocation algorithm: " + planner); + s_logger.debug("Trying to allocate a host and storage pools from dc:" + plan.getDataCenterId() + ", pod:" + plan.getPodId() + ",cluster:" + plan.getClusterId() + ", requested cpu: " + cpu_requested + ", requested ram: " + ram_requested); - + s_logger.debug("Is ROOT volume READY (pool already allocated)?: " + (plan.getPoolId() != null ? "Yes" : "No")); - } - + } + String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag); - - if (plan.getHostId() != null && haVmTag == null) { - Long hostIdSpecified = plan.getHostId(); - if (s_logger.isDebugEnabled()) { + + if (plan.getHostId() != null && haVmTag == null) { + Long hostIdSpecified = plan.getHostId(); + if (s_logger.isDebugEnabled()) { s_logger.debug("DeploymentPlan has host_id specified, choosing this host and making no checks on this host: " + hostIdSpecified); - } - HostVO host = _hostDao.findById(hostIdSpecified); - if (host == null) { - s_logger.debug("The specified host cannot be found"); - } else if (avoids.shouldAvoid(host)) { - s_logger.debug("The specified host is in avoid set"); - } else { - if (s_logger.isDebugEnabled()) { + } + HostVO host = _hostDao.findById(hostIdSpecified); + if (host == null) { + s_logger.debug("The specified host cannot be found"); + } else if (avoids.shouldAvoid(host)) { + s_logger.debug("The specified host is in avoid set"); + } else { + if (s_logger.isDebugEnabled()) { s_logger.debug("Looking for suitable pools for this host under zone: " + host.getDataCenterId() + ", pod: " + host.getPodId() + ", cluster: " + host.getClusterId()); - } - - // search for storage under the zone, pod, cluster of the host. + } + + // search for storage under the zone, pod, cluster of the host. DataCenterDeployment lastPlan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), hostIdSpecified, plan.getPoolId(), null, plan.getReservationContext()); @@@ -440,100 -434,114 +434,114 @@@ } else { s_logger.debug("The last host of this VM is not UP or is not enabled, host status is: " + host.getStatus().name() + ", host resource state is: " + host.getResourceState()); - } - } - s_logger.debug("Cannot choose the last host to deploy this VM "); - } - - DeployDestination dest = null; - List clusterList = null; - - if (planner != null && planner.canHandle(vmProfile, plan, avoids)) { - while (true) { - if (planner instanceof DeploymentClusterPlanner) { - + } + } + s_logger.debug("Cannot choose the last host to deploy this VM "); + } + + DeployDestination dest = null; + List clusterList = null; + + if (planner != null && planner.canHandle(vmProfile, plan, avoids)) { + while (true) { - + if (planner instanceof DeploymentClusterPlanner) { + ExcludeList plannerAvoidInput = new ExcludeList(avoids.getDataCentersToAvoid(), avoids.getPodsToAvoid(), avoids.getClustersToAvoid(), avoids.getHostsToAvoid(), - avoids.getPoolsToAvoid()); - + avoids.getPoolsToAvoid()); + clusterList = ((DeploymentClusterPlanner)planner).orderClusters(vmProfile, plan, avoids); - - if (clusterList != null && !clusterList.isEmpty()) { - // planner refactoring. call allocators to list hosts + + if (clusterList != null && !clusterList.isEmpty()) { + // planner refactoring. call allocators to list hosts ExcludeList plannerAvoidOutput = new ExcludeList(avoids.getDataCentersToAvoid(), avoids.getPodsToAvoid(), avoids.getClustersToAvoid(), avoids.getHostsToAvoid(), - avoids.getPoolsToAvoid()); - - resetAvoidSet(plannerAvoidOutput, plannerAvoidInput); - + avoids.getPoolsToAvoid()); + + resetAvoidSet(plannerAvoidOutput, plannerAvoidInput); + dest = checkClustersforDestination(clusterList, vmProfile, plan, avoids, dc, getPlannerUsage(planner, vmProfile, plan, avoids), plannerAvoidOutput); - if (dest != null) { - return dest; - } - // reset the avoid input to the planners - resetAvoidSet(avoids, plannerAvoidOutput); - - } else { - return null; - } - } else { - dest = planner.plan(vmProfile, plan, avoids); - if (dest != null) { - long hostId = dest.getHost().getId(); - avoids.addHost(dest.getHost().getId()); - - if (checkIfHostFitsPlannerUsage(hostId, DeploymentPlanner.PlannerResourceUsage.Shared)) { - // found destination - return dest; - } else { - // find another host - seems some concurrent - // deployment picked it up for dedicated access - continue; - } - } else { - return null; - } - } - } - } - - return dest; - } - + if (dest != null) { + return dest; + } + // reset the avoid input to the planners + resetAvoidSet(avoids, plannerAvoidOutput); + + } else { + return null; + } + } else { + dest = planner.plan(vmProfile, plan, avoids); + if (dest != null) { + long hostId = dest.getHost().getId(); + avoids.addHost(dest.getHost().getId()); + + if (checkIfHostFitsPlannerUsage(hostId, DeploymentPlanner.PlannerResourceUsage.Shared)) { + // found destination + return dest; + } else { + // find another host - seems some concurrent + // deployment picked it up for dedicated access + continue; + } + } else { + return null; + } + } + } + } + + 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(); - - // check if zone is dedicated. if yes check if vm owner has acess to it. - DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId()); - if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getType())) { - long accountDomainId = vmProfile.getOwner().getDomainId(); - long accountId = vmProfile.getOwner().getAccountId(); - - // If a zone is dedicated to an account then all hosts in this zone - // will be explicitly dedicated to - // that account. So there won't be any shared hosts in the zone, the - // only way to deploy vms from that - // account will be to use explicit dedication affinity group. - if (dedicatedZone.getAccountId() != null) { - if (dedicatedZone.getAccountId().equals(accountId)) { - return; - } else { + boolean isExplicit = false; + VirtualMachine vm = vmProfile.getVirtualMachine(); + + // check if zone is dedicated. if yes check if vm owner has acess to it. + DedicatedResourceVO dedicatedZone = _dedicatedDao.findByZoneId(dc.getId()); + if (dedicatedZone != null && !_accountMgr.isRootAdmin(vmProfile.getOwner().getId())) { + long accountDomainId = vmProfile.getOwner().getDomainId(); + long accountId = vmProfile.getOwner().getAccountId(); + + // If a zone is dedicated to an account then all hosts in this zone + // will be explicitly dedicated to + // that account. So there won't be any shared hosts in the zone, the + // only way to deploy vms from that + // account will be to use explicit dedication affinity group. + if (dedicatedZone.getAccountId() != null) { + if (dedicatedZone.getAccountId().equals(accountId)) { + return; + } else { throw new CloudRuntimeException("Failed to deploy VM, Zone " + dc.getName() + " not available for the user account " + vmProfile.getOwner()); - } - } - - // if zone is dedicated to a domain. Check owner's access to the - // domain level dedication group + } + } + + // if zone is dedicated to a domain. Check owner's access to the + // domain level dedication group if (!_affinityGroupService.isAffinityGroupAvailableInDomain(dedicatedZone.getAffinityGroupId(), accountDomainId)) { throw new CloudRuntimeException("Failed to deploy VM, Zone " + dc.getName() + " not available for the user domain " + vmProfile.getOwner()); - } - - } - - // check affinity group of type Explicit dedication exists. If No put + } + + } + + // check affinity group of type Explicit dedication exists. If No put // dedicated pod/cluster/host in avoid list List vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), "ExplicitDedication"); @@@ -1302,111 -1310,114 +1310,114 @@@ avoid.getPoolsToAvoid().addAll(poolsToAvoidOutput); } - if (suitableVolumeStoragePools.isEmpty()) { - s_logger.debug("No suitable pools found"); - } - - return new Pair>, List>(suitableVolumeStoragePools, readyAndReusedVolumes); - } - - private boolean isEnabledForAllocation(long zoneId, Long podId, Long clusterId) { - // Check if the zone exists in the system - DataCenterVO zone = _dcDao.findById(zoneId); - if (zone != null && Grouping.AllocationState.Disabled == zone.getAllocationState()) { - s_logger.info("Zone is currently disabled, cannot allocate to this zone: " + zoneId); - return false; - } - - Pod pod = _podDao.findById(podId); - if (pod != null && Grouping.AllocationState.Disabled == pod.getAllocationState()) { - s_logger.info("Pod is currently disabled, cannot allocate to this pod: " + podId); - return false; - } - - Cluster cluster = _clusterDao.findById(clusterId); - if (cluster != null && Grouping.AllocationState.Disabled == cluster.getAllocationState()) { - s_logger.info("Cluster is currently disabled, cannot allocate to this cluster: " + clusterId); - return false; - } - - return true; - } - - private boolean isRootAdmin(ReservationContext reservationContext) { - if (reservationContext != null) { - if (reservationContext.getAccount() != null) { - return _accountMgr.isRootAdmin(reservationContext.getAccount().getType()); - } else { - return false; - } - } - return false; - } - - @DB - @Override + if (suitableVolumeStoragePools.isEmpty()) { + s_logger.debug("No suitable pools found"); + } + + return new Pair>, List>(suitableVolumeStoragePools, readyAndReusedVolumes); + } + + private boolean isEnabledForAllocation(long zoneId, Long podId, Long clusterId) { + // Check if the zone exists in the system + DataCenterVO zone = _dcDao.findById(zoneId); + if (zone != null && Grouping.AllocationState.Disabled == zone.getAllocationState()) { + s_logger.info("Zone is currently disabled, cannot allocate to this zone: " + zoneId); + return false; + } + + Pod pod = _podDao.findById(podId); + if (pod != null && Grouping.AllocationState.Disabled == pod.getAllocationState()) { + s_logger.info("Pod is currently disabled, cannot allocate to this pod: " + podId); + return false; + } + + Cluster cluster = _clusterDao.findById(clusterId); + if (cluster != null && Grouping.AllocationState.Disabled == cluster.getAllocationState()) { + s_logger.info("Cluster is currently disabled, cannot allocate to this cluster: " + clusterId); + return false; + } + + return true; + } + + private boolean isRootAdmin(ReservationContext reservationContext) { + if (reservationContext != null) { + if (reservationContext.getAccount() != null) { + return _accountMgr.isRootAdmin(reservationContext.getAccount().getId()); + } else { + return false; + } + } + return false; + } + + @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(); - final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId()); - - return Transaction.execute(new TransactionCallback() { - @Override - public String doInTransaction(TransactionStatus status) { - boolean saveReservation = true; - - if (vmGroupCount > 0) { - List groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId()); - SearchCriteria criteria = _affinityGroupDao.createSearchCriteria(); - criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()])); - List groups = _affinityGroupDao.lockRows(criteria, null, true); - - for (AffinityGroupProcessor processor : _affinityProcessors) { - if (!processor.check(vmProfile, plannedDestination)) { - saveReservation = false; - break; - } - } - } - - if (saveReservation) { + throws InsufficientServerCapacityException, AffinityConflictException { + + final VirtualMachine vm = vmProfile.getVirtualMachine(); + final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId()); + + return Transaction.execute(new TransactionCallback() { + @Override + public String doInTransaction(TransactionStatus status) { + boolean saveReservation = true; + + if (vmGroupCount > 0) { + List groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId()); + SearchCriteria criteria = _affinityGroupDao.createSearchCriteria(); + criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()])); + List groups = _affinityGroupDao.lockRows(criteria, null, true); + + for (AffinityGroupProcessor processor : _affinityProcessors) { + if (!processor.check(vmProfile, plannedDestination)) { + saveReservation = false; + break; + } + } + } + + if (saveReservation) { 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) { - for (Volume vo : plannedDestination.getStorageForDisks().keySet()) { - volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId()); - } - vmReservation.setVolumeReservation(volumeReservationMap); - } - _reservationDao.persist(vmReservation); - return vmReservation.getUuid(); - } - - return null; - } - }); - } - - @Override + Map volumeReservationMap = new HashMap(); + + if (vm.getHypervisorType() != HypervisorType.BareMetal) { + for (Volume vo : plannedDestination.getStorageForDisks().keySet()) { + volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId()); + } + vmReservation.setVolumeReservation(volumeReservationMap); + } + _reservationDao.persist(vmReservation); + return vmReservation.getUuid(); + } + + return null; + } + }); + } + + @Override public boolean preStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) { - return true; - } - - @Override + return true; + } + + @Override public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vo, boolean status, Object opaque) { - if (!status) { - return false; - } - if ((oldState == State.Starting) && (newState != State.Starting)) { - // cleanup all VM reservation entries - SearchCriteria sc = _reservationDao.createSearchCriteria(); - sc.addAnd("vmId", SearchCriteria.Op.EQ, vo.getId()); - _reservationDao.expunge(sc); - } - return true; - } -} + if (!status) { + return false; + } + if ((oldState == State.Starting) && (newState != State.Starting)) { + // cleanup all VM reservation entries + SearchCriteria sc = _reservationDao.createSearchCriteria(); + sc.addAnd("vmId", SearchCriteria.Op.EQ, vo.getId()); + _reservationDao.expunge(sc); + } + return true; + } +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/deploy/FirstFitPlanner.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/network/IpAddressManagerImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/network/as/AutoScaleManagerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 755fc54,61b7f4b..99189fe --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@@ -1375,18 -1366,18 +1375,18 @@@ public class AutoScaleManagerImpl, Integer>(result.first(), result.second()); } -- /* TODO: this method should go away. Keep here just in case that our latest refactoring using template_store_ref missed anything -- * in handling Swift or S3. -- private Set> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso, -- Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady, -- List permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map tags, String zoneType) { -- -- VMTemplateVO template = null; -- if (templateId != null) { -- template = _templateDao.findById(templateId); -- if (template == null) { -- throw new InvalidParameterValueException("Please specify a valid template ID."); -- }// If ISO requested then it should be ISO. -- if (isIso && template.getFormat() != ImageFormat.ISO) { -- s_logger.error("Template Id " + templateId + " is not an ISO"); -- InvalidParameterValueException ex = new InvalidParameterValueException("Specified Template Id is not an ISO"); -- ex.addProxyObject(template.getUuid(), "templateId"); -- throw ex; -- }// If ISO not requested then it shouldn't be an ISO. -- if (!isIso && template.getFormat() == ImageFormat.ISO) { -- s_logger.error("Incorrect format of the template id " + templateId); -- InvalidParameterValueException ex = new InvalidParameterValueException("Incorrect format " + template.getFormat() -- + " of the specified template id"); -- ex.addProxyObject(template.getUuid(), "templateId"); -- throw ex; -- } -- } -- -- DomainVO domain = null; -- if (!permittedAccounts.isEmpty()) { -- domain = _domainDao.findById(permittedAccounts.get(0).getDomainId()); -- } else { -- domain = _domainDao.findById(DomainVO.ROOT_DOMAIN); -- } -- -- List hypers = null; -- if (!isIso) { -- hypers = _resourceMgr.listAvailHypervisorInZone(null, null); -- } -- Set> templateZonePairSet = new HashSet>(); -- if (_swiftMgr.isSwiftEnabled()) { -- if (template == null) { -- templateZonePairSet = _templateDao.searchSwiftTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize, -- startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, tags); -- Set> templateZonePairSet2 = new HashSet>(); -- templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize, -- startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType); -- -- for (Pair tmpltPair : templateZonePairSet2) { -- if (!templateZonePairSet.contains(new Pair(tmpltPair.first(), -1L))) { -- templateZonePairSet.add(tmpltPair); -- } -- } -- -- } else { -- // if template is not public, perform permission check here -- if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { -- Account owner = _accountMgr.getAccount(template.getAccountId()); -- _accountMgr.checkAccess(caller, null, true, owner); -- } -- templateZonePairSet.add(new Pair(template.getId(), zoneId)); -- } -- } else if (_s3Mgr.isS3Enabled()) { -- if (template == null) { -- templateZonePairSet = _templateDao.searchSwiftTemplates(name, keyword, templateFilter, isIso, -- hypers, bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr, -- permittedAccounts, caller, tags); -- Set> templateZonePairSet2 = new HashSet>(); -- templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, -- bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr, -- permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType); -- -- for (Pair tmpltPair : templateZonePairSet2) { -- if (!templateZonePairSet.contains(new Pair(tmpltPair.first(), -1L))) { -- templateZonePairSet.add(tmpltPair); -- } -- } -- } else { -- // if template is not public, perform permission check here -- if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { -- Account owner = _accountMgr.getAccount(template.getAccountId()); -- _accountMgr.checkAccess(caller, null, true, owner); -- } -- templateZonePairSet.add(new Pair(template.getId(), zoneId)); -- } -- } else { -- if (template == null) { -- templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize, -- startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType); -- } else { -- // if template is not public, perform permission check here -- if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { -- Account owner = _accountMgr.getAccount(template.getAccountId()); -- _accountMgr.checkAccess(caller, null, true, owner); -- } -- templateZonePairSet.add(new Pair(template.getId(), zoneId)); -- } -- } -- -- return templateZonePairSet; -- } -- */ -- - 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.OperateEntry, true, template); - - if(cmd.isRoutingType() != null){ - if (!_accountService.isRootAdmin(account.getId())) { - 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(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/vm/UserVmManager.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/vm/UserVmManager.java index 0e48414,11b110f..afe1002 --- a/server/src/com/cloud/vm/UserVmManager.java +++ b/server/src/com/cloud/vm/UserVmManager.java @@@ -88,7 -92,23 +88,7 @@@ public interface UserVmManager extends boolean expunge(UserVmVO vm, long callerUserId, Account caller); - Pair> startVirtualMachine(long vmId, Long hostId, Map additionalParams) - /** - * Obtains a list of virtual machines by the specified search criteria. - * Can search by: "userId", "name", "state", "dataCenterId", "podId", "hostId" - * @param c - * @param caller TODO - * @param domainId TODO - * @param isRecursive TODO - * @param permittedAccounts TODO - * @param listAll TODO - * @param listProjectResourcesCriteria TODO - * @param tags TODO - * @return List of UserVMs + count - */ - 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, String deploymentPlannerToUse) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; boolean upgradeVirtualMachine(Long id, Long serviceOfferingId, Map customParameters) throws ResourceUnavailableException, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/server/src/com/cloud/vm/UserVmManagerImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/84a528fa/setup/db/db/schema-430to440.sql ----------------------------------------------------------------------