You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/07/04 02:57:43 UTC

[10/10] git commit: updated refs/heads/vmsync to 3ecc52a

Re-absorb delta in master into vmsync


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/3ecc52a4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/3ecc52a4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/3ecc52a4

Branch: refs/heads/vmsync
Commit: 3ecc52a4f34906c03825f1e3f6c2ce6590edb023
Parents: 306d090 43ab950
Author: Alex Huang <al...@gmail.com>
Authored: Wed Jul 3 17:58:38 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Wed Jul 3 17:58:38 2013 -0700

----------------------------------------------------------------------
 .../agent/manager/allocator/PodAllocator.java   |  33 ++
 .../classes/resources/messages_ar.properties    |   2 +-
 .../classes/resources/messages_fr_FR.properties |  13 +-
 .../classes/resources/messages_it_IT.properties |   6 +-
 .../classes/resources/messages_ja.properties    | 540 ++++++++-----------
 .../classes/resources/messages_ko_KR.properties |   2 -
 .../classes/resources/messages_pt_BR.properties |   4 +-
 .../classes/resources/messages_ru_RU.properties |   2 -
 .../classes/resources/messages_zh_CN.properties | 422 +++++++--------
 .../src/com/cloud/resource/ResourceManager.java |  94 ++--
 .../agent/manager/allocator/PodAllocator.java   |  35 --
 .../allocator/impl/FirstFitAllocator.java       | 117 ++--
 .../allocator/impl/TestingAllocator.java        |   3 -
 .../impl/UserConcentratedAllocator.java         |  30 +-
 .../src/com/cloud/capacity/CapacityManager.java |   1 -
 .../com/cloud/resource/ResourceManagerImpl.java |   5 +-
 .../src/com/cloud/storage/StorageManager.java   |   5 +-
 .../com/cloud/storage/StorageManagerImpl.java   |   4 +-
 .../com/cloud/storage/VolumeManagerImpl.java    |   8 +-
 .../com/cloud/template/TemplateAdapterBase.java |  23 +-
 .../cloud/resource/MockResourceManagerImpl.java |  24 +-
 tools/marvin/marvin/deployDataCenter.py         |   3 +-
 ui/scripts/domains.js                           |  48 +-
 ui/scripts/zoneWizard.js                        |  49 +-
 utils/src/com/cloud/utils/net/NetUtils.java     |  20 +-
 25 files changed, 708 insertions(+), 785 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/engine/components-api/src/com/cloud/resource/ResourceManager.java
----------------------------------------------------------------------
diff --cc engine/components-api/src/com/cloud/resource/ResourceManager.java
index b0ab926,0000000..e35e89a
mode 100755,000000..100755
--- a/engine/components-api/src/com/cloud/resource/ResourceManager.java
+++ b/engine/components-api/src/com/cloud/resource/ResourceManager.java
@@@ -1,153 -1,0 +1,155 @@@
 +// 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.resource;
 +
 +import java.util.List;
 +import java.util.Map;
 +import java.util.Set;
 +
 +import com.cloud.agent.api.StartupCommand;
 +import com.cloud.agent.api.StartupRoutingCommand;
 +import com.cloud.dc.DataCenterVO;
 +import com.cloud.dc.HostPodVO;
++import com.cloud.dc.Pod;
 +import com.cloud.dc.PodCluster;
 +import com.cloud.exception.AgentUnavailableException;
 +import com.cloud.host.Host;
 +import com.cloud.host.Host.Type;
 +import com.cloud.host.HostStats;
 +import com.cloud.host.HostVO;
 +import com.cloud.host.Status;
 +import com.cloud.hypervisor.Hypervisor.HypervisorType;
 +import com.cloud.resource.ResourceState.Event;
 +import com.cloud.service.ServiceOfferingVO;
 +import com.cloud.template.VirtualMachineTemplate;
 +import com.cloud.utils.Pair;
 +import com.cloud.utils.fsm.NoTransitionException;
 +
 +/**
 + * ResourceManager manages how physical resources are organized within the
 + * CloudStack. It also manages the life cycle of the physical resources.
 + */
- public interface ResourceManager extends ResourceService{
++public interface ResourceManager extends ResourceService {
 +    /**
 +     * Register a listener for different types of resource life cycle events.
 +     * There can only be one type of listener per type of host.
 +     * 
 +     * @param Event type see ResourceListener.java, allow combination of multiple events.
 +     * @param listener the listener to notify.
 +     */
 +    public void registerResourceEvent(Integer event, ResourceListener listener);
-     
++
 +    public void unregisterResourceEvent(ResourceListener listener);
-     
++
 +    /**
 +     * 
 +     * @param name of adapter
 +     * @param adapter
-      * @param hates, a list of names which will be eliminated by this adapter. Especially for the case where 
++     * @param hates, a list of names which will be eliminated by this adapter. Especially for the case where
 +     * can be only one adapter responds to an event, e.g. startupCommand
 +     */
 +    public void registerResourceStateAdapter(String name, ResourceStateAdapter adapter);
-     
++
 +    public void unregisterResourceStateAdapter(String name);
-     
- 	public Host createHostAndAgent(Long hostId, ServerResource resource, Map<String, String> details, boolean old, List<String> hostTags,
- 	        boolean forRebalance);
- 	
- 	public Host addHost(long zoneId, ServerResource resource, Type hostType, Map<String, String> hostDetails);
- 	
- 	public HostVO createHostVOForConnectedAgent(StartupCommand[] cmds);
- 	
- 	public void checkCIDR(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask);
- 	
- 	public HostVO fillRoutingHostVO(HostVO host, StartupRoutingCommand ssCmd, HypervisorType hyType, Map<String, String> details, List<String> hostTags);
- 	
- 	public void deleteRoutingHost(HostVO host, boolean isForced, boolean forceDestroyStorage) throws UnableDeleteHostException;
- 	
++
++    public Host createHostAndAgent(Long hostId, ServerResource resource, Map<String, String> details, boolean old, List<String> hostTags,
++            boolean forRebalance);
++
++    public Host addHost(long zoneId, ServerResource resource, Type hostType, Map<String, String> hostDetails);
++
++    public HostVO createHostVOForConnectedAgent(StartupCommand[] cmds);
++
++    public void checkCIDR(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask);
++
++    public HostVO fillRoutingHostVO(HostVO host, StartupRoutingCommand ssCmd, HypervisorType hyType, Map<String, String> details, List<String> hostTags);
++
++    public void deleteRoutingHost(HostVO host, boolean isForced, boolean forceDestroyStorage) throws UnableDeleteHostException;
++
 +    public boolean executeUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException;
 +
- 	boolean resourceStateTransitTo(Host host, Event event, long msId) throws NoTransitionException;
++    boolean resourceStateTransitTo(Host host, Event event, long msId) throws NoTransitionException;
++
++    boolean umanageHost(long hostId);
++
++    boolean maintenanceFailed(long hostId);
 +
- 	boolean umanageHost(long hostId);
++    public boolean maintain(final long hostId) throws AgentUnavailableException;
 +
- 	boolean maintenanceFailed(long hostId);
- 	
- 	public boolean maintain(final long hostId) throws AgentUnavailableException;
- 	
 +    @Override
 +    public boolean deleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage);
-     
++
 +    public List<HostVO> findDirectlyConnectedHosts();
-     
++
 +    public List<HostVO> listAllUpAndEnabledHosts(Host.Type type, Long clusterId, Long podId, long dcId);
-     
++
 +    public List<HostVO> listAllHostsInCluster(long clusterId);
-     
++
 +    public List<HostVO> listHostsInClusterByStatus(long clusterId, Status status);
-     
++
 +    public List<HostVO> listAllUpAndEnabledHostsInOneZoneByType(Host.Type type, long dcId);
++
 +    public List<HostVO> listAllUpAndEnabledHostsInOneZoneByHypervisor(HypervisorType type, long dcId);
-     
++
 +    public List<HostVO> listAllHostsInOneZoneByType(Host.Type type, long dcId);
-     
++
 +    public List<HostVO> listAllHostsInAllZonesByType(Type type);
-     
++
 +    public List<HypervisorType> listAvailHypervisorInZone(Long hostId, Long zoneId);
-     
++
 +    public HostVO findHostByGuid(String guid);
-     
++
 +    public HostVO findHostByName(String name);
-     
++
 +    public List<HostVO> listHostsByNameLike(String name);
-     
++
 +    /**
 +     * Find a pod based on the user id, template, and data center.
 +     * 
 +     * @param template
 +     * @param dc
 +     * @param userId
 +     * @return
 +     */
-     Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long accountId, Set<Long> avoids);
-     
++    Pair<Pod, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long accountId, Set<Long> avoids);
++
 +    HostStats getHostStatistics(long hostId);
-     
++
 +    Long getGuestOSCategoryId(long hostId);
-     
++
 +    String getHostTags(long hostId);
-     
++
 +    List<PodCluster> listByDataCenter(long dcId);
 +
- 	List<HostVO> listAllNotInMaintenanceHostsInOneZone(Type type, Long dcId);
++    List<HostVO> listAllNotInMaintenanceHostsInOneZone(Type type, Long dcId);
 +
- 	HypervisorType getDefaultHypervisor(long zoneId);
++    HypervisorType getDefaultHypervisor(long zoneId);
 +
- 	HypervisorType getAvailableHypervisor(long zoneId);
++    HypervisorType getAvailableHypervisor(long zoneId);
 +
 +    Discoverer getMatchingDiscover(HypervisorType hypervisorType);
 +
- 	List<HostVO> findHostByGuid(long dcId, String guid);
++    List<HostVO> findHostByGuid(long dcId, String guid);
 +
 +    /**
 +     * @param type
 +     * @param clusterId
 +     * @param podId
 +     * @param dcId
 +     * @return
 +     */
 +    List<HostVO> listAllUpAndEnabledNonHAHosts(Type type, Long clusterId, Long podId, long dcId);
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
index 778ec84,4329c70..a6b92cf
--- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
+++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java
@@@ -86,42 -101,43 +101,42 @@@ public class FirstFitAllocator extends 
      float _factor = 1;
      boolean _checkHvm = true;
      protected String _allocationAlgorithm = "random";
-     @Inject CapacityManager _capacityMgr;
-     
+     @Inject
+     CapacityManager _capacityMgr;
 -
 +    
 +	@Override
 +    public List<Host> allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type,
 +			ExcludeList avoid, int returnUpTo) {
 +	    return allocateTo(vmProfile, plan, type, avoid, returnUpTo, true);
 +	}
 +	
      @Override
 -    public List<Host> allocateTo(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type,
 -            ExcludeList avoid, int returnUpTo) {
 -        return allocateTo(vmProfile, plan, type, avoid, returnUpTo, true);
 -    }
 -
 -    @Override
 -    public List<Host> allocateTo(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo,
 -            boolean considerReservedCapacity) {
 -
 -        long dcId = plan.getDataCenterId();
 -        Long podId = plan.getPodId();
 -        Long clusterId = plan.getClusterId();
 -        ServiceOffering offering = vmProfile.getServiceOffering();
 -        VMTemplateVO template = (VMTemplateVO)vmProfile.getTemplate();
 -        Account account = vmProfile.getOwner();
 +    public List<Host> allocateTo(VirtualMachineProfile vmProfile, DeploymentPlan plan, Type type, ExcludeList avoid, int returnUpTo, boolean considerReservedCapacity) {
 +	
 +	    long dcId = plan.getDataCenterId();
 +		Long podId = plan.getPodId();
 +		Long clusterId = plan.getClusterId();
 +		ServiceOffering offering = vmProfile.getServiceOffering();
 +		VMTemplateVO template = (VMTemplateVO)vmProfile.getTemplate();
 +		Account account = vmProfile.getOwner();
  
          if (type == Host.Type.Storage) {
              // FirstFitAllocator should be used for user VMs only since it won't care whether the host is capable of routing or not
 -            return new ArrayList<Host>();
 +        	return new ArrayList<Host>();
          }
 -
 +        
-         if(s_logger.isDebugEnabled()){
-             s_logger.debug("Looking for hosts in dc: " + dcId + "  pod:" + podId + "  cluster:" + clusterId );
+         if (s_logger.isDebugEnabled()) {
+             s_logger.debug("Looking for hosts in dc: " + dcId + "  pod:" + podId + "  cluster:" + clusterId);
          }
 -
 +        
          String hostTagOnOffering = offering.getHostTag();
          String hostTagOnTemplate = template.getTemplateTag();
 -
 +        
          boolean hasSvcOfferingTag = hostTagOnOffering != null ? true : false;
          boolean hasTemplateTag = hostTagOnTemplate != null ? true : false;
 -
 -        List<HostVO> clusterHosts = new ArrayList<HostVO>();
 -
 +        
 +        List<? extends Host> clusterHosts = new ArrayList<Host>();
 +        
          String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag);
          if (haVmTag != null) {
              clusterHosts = _hostDao.listByHostTag(type, clusterId, podId, dcId, haVmTag);
@@@ -145,21 -161,21 +160,21 @@@
                          s_logger.debug("Looking for hosts having tag specified on Template:" + hostTagOnTemplate);
                      }
                      hostsMatchingTemplateTag = _hostDao.listByHostTag(type, clusterId, podId, dcId, hostTagOnTemplate);
-                     if (s_logger.isDebugEnabled()){
-                         s_logger.debug("Hosts with tag '" + hostTagOnTemplate+"' are:" + hostsMatchingTemplateTag);
+                     if (s_logger.isDebugEnabled()) {
+                         s_logger.debug("Hosts with tag '" + hostTagOnTemplate + "' are:" + hostsMatchingTemplateTag);
                      }
                  }
 -
 +                
-                 if (hasSvcOfferingTag && hasTemplateTag){
+                 if (hasSvcOfferingTag && hasTemplateTag) {
                      hostsMatchingOfferingTag.retainAll(hostsMatchingTemplateTag);
                      clusterHosts = _hostDao.listByHostTag(type, clusterId, podId, dcId, hostTagOnTemplate);
-                     if (s_logger.isDebugEnabled()){
-                         s_logger.debug("Found "+ hostsMatchingOfferingTag.size() +" Hosts satisfying both tags, host ids are:" + hostsMatchingOfferingTag);
+                     if (s_logger.isDebugEnabled()) {
+                         s_logger.debug("Found " + hostsMatchingOfferingTag.size() + " Hosts satisfying both tags, host ids are:" + hostsMatchingOfferingTag);
                      }
 -
 +                    
                      clusterHosts = hostsMatchingOfferingTag;
                  } else {
-                     if (hasSvcOfferingTag){
+                     if (hasSvcOfferingTag) {
                          clusterHosts = hostsMatchingOfferingTag;
                      } else {
                          clusterHosts = hostsMatchingTemplateTag;
@@@ -228,16 -244,16 +243,16 @@@
      protected List<Host> allocateTo(DeploymentPlan plan, ServiceOffering offering, VMTemplateVO template, ExcludeList avoid, List<? extends Host> hosts, int returnUpTo,
              boolean considerReservedCapacity, Account account) {
          if (_allocationAlgorithm.equals("random") || _allocationAlgorithm.equals("userconcentratedpod_random")) {
 -            // Shuffle this so that we don't check the hosts in the same order.
 +        	// Shuffle this so that we don't check the hosts in the same order.
              Collections.shuffle(hosts);
-         }else if(_allocationAlgorithm.equals("userdispersing")){
+         } else if (_allocationAlgorithm.equals("userdispersing")) {
              hosts = reorderHostsByNumberOfVms(plan, hosts, account);
          }
 -
 -        if (s_logger.isDebugEnabled()) {
 +    	
 +    	if (s_logger.isDebugEnabled()) {
-             s_logger.debug("FirstFitAllocator has " + hosts.size() + " hosts to check for allocation: "+hosts);
+             s_logger.debug("FirstFitAllocator has " + hosts.size() + " hosts to check for allocation: " + hosts);
          }
 -
 +        
          // We will try to reorder the host lists such that we give priority to hosts that have
          // the minimums to support a VM's requirements
          hosts = prioritizeHosts(template, hosts);
@@@ -253,31 -269,32 +268,32 @@@
          List<Host> suitableHosts = new ArrayList<Host>();
  
          for (Host host : hosts) {
-         	if(suitableHosts.size() == returnUpTo){
+             if (suitableHosts.size() == returnUpTo) {
 -                break;
 -            }
 +        		break;
 +        	}
              if (avoid.shouldAvoid(host)) {
                  if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() +" is in avoid set, skipping this and trying other available hosts");
+                     s_logger.debug("Host name: " + host.getName() + ", hostId: " + host.getId() + " is in avoid set, skipping this and trying other available hosts");
                  }
                  continue;
              }
 -
 +                        
              //find number of guest VMs occupying capacity on this host.
-             if (_capacityMgr.checkIfHostReachMaxGuestLimit(host)){
+             if (_capacityMgr.checkIfHostReachMaxGuestLimit(host)) {
                  if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Host name: " + host.getName() + ", hostId: "+ host.getId() +" already has max Running VMs(count includes system VMs), skipping this and trying other available hosts");
+                     s_logger.debug("Host name: " + host.getName() + ", hostId: " + host.getId()
+                             + " already has max Running VMs(count includes system VMs), skipping this and trying other available hosts");
                  }
                  continue;
              }
  
              boolean numCpusGood = host.getCpus().intValue() >= offering.getCpu();
              boolean cpuFreqGood = host.getSpeed().intValue() >= offering.getSpeed();
 -            int cpu_requested = offering.getCpu() * offering.getSpeed();
 -            long ram_requested = offering.getRamSize() * 1024L * 1024L;
 +    		int cpu_requested = offering.getCpu() * offering.getSpeed();
 +    		long ram_requested = offering.getRamSize() * 1024L * 1024L;
              Cluster cluster = _clusterDao.findById(host.getClusterId());
-             ClusterDetailsVO clusterDetailsCpuOvercommit = _clusterDetailsDao.findDetail(cluster.getId(),"cpuOvercommitRatio");
-             ClusterDetailsVO clusterDetailsRamOvercommmt = _clusterDetailsDao.findDetail(cluster.getId(),"memoryOvercommitRatio");
+             ClusterDetailsVO clusterDetailsCpuOvercommit = _clusterDetailsDao.findDetail(cluster.getId(), "cpuOvercommitRatio");
+             ClusterDetailsVO clusterDetailsRamOvercommmt = _clusterDetailsDao.findDetail(cluster.getId(), "memoryOvercommitRatio");
              Float cpuOvercommitRatio = Float.parseFloat(clusterDetailsCpuOvercommit.getValue());
              Float memoryOvercommitRatio = Float.parseFloat(clusterDetailsRamOvercommmt.getValue());
  
@@@ -295,11 -313,11 +312,11 @@@
                  avoid.addHost(host.getId());
              }
          }
 -
 +        
          if (s_logger.isDebugEnabled()) {
-             s_logger.debug("Host Allocator returning "+suitableHosts.size() +" suitable hosts");
+             s_logger.debug("Host Allocator returning " + suitableHosts.size() + " suitable hosts");
          }
 -
 +        
          return suitableHosts;
      }
  
@@@ -310,26 -328,26 +327,26 @@@
          long dcId = plan.getDataCenterId();
          Long podId = plan.getPodId();
          Long clusterId = plan.getClusterId();
 -
 +        
          List<Long> hostIdsByVmCount = _vmInstanceDao.listHostIdsByVmCount(dcId, podId, clusterId, account.getAccountId());
          if (s_logger.isDebugEnabled()) {
-             s_logger.debug("List of hosts in ascending order of number of VMs: "+ hostIdsByVmCount);
+             s_logger.debug("List of hosts in ascending order of number of VMs: " + hostIdsByVmCount);
          }
 -
 +        
          //now filter the given list of Hosts by this ordered list
          Map<Long, Host> hostMap = new HashMap<Long, Host>();
          for (Host host : hosts) {
              hostMap.put(host.getId(), host);
          }
          List<Long> matchingHostIds = new ArrayList<Long>(hostMap.keySet());
 -
 +        
          hostIdsByVmCount.retainAll(matchingHostIds);
 -
 +        
          List<Host> reorderedHosts = new ArrayList<Host>();
-         for(Long id: hostIdsByVmCount){
+         for (Long id : hostIdsByVmCount) {
              reorderedHosts.add(hostMap.get(id));
          }
 -
 +        
          return reorderedHosts;
      }
  
@@@ -341,120 -359,120 +358,120 @@@
      }
  
      protected List<? extends Host> prioritizeHosts(VMTemplateVO template, List<? extends Host> hosts) {
 -        if (template == null) {
 -            return hosts;
 -        }
 -
 -        // Determine the guest OS category of the template
 -        String templateGuestOSCategory = getTemplateGuestOSCategory(template);
 -
 +    	if (template == null) {
 +    		return hosts;
 +    	}
 +    	
 +    	// Determine the guest OS category of the template
 +    	String templateGuestOSCategory = getTemplateGuestOSCategory(template);
 +    	
          List<Host> prioritizedHosts = new ArrayList<Host>();
          List<Host> noHvmHosts = new ArrayList<Host>();
 -
 -        // If a template requires HVM and a host doesn't support HVM, remove it from consideration
 +    	
 +    	// If a template requires HVM and a host doesn't support HVM, remove it from consideration
          List<Host> hostsToCheck = new ArrayList<Host>();
 -        if (template.isRequiresHvm()) {
 +    	if (template.isRequiresHvm()) {
              for (Host host : hosts) {
 -                if (hostSupportsHVM(host)) {
 -                    hostsToCheck.add(host);
 -                } else {
 -                    noHvmHosts.add(host);
 -                }
 -            }
 -        } else {
 -            hostsToCheck.addAll(hosts);
 -        }
 -
 -        if (s_logger.isDebugEnabled()) {
 -            if (noHvmHosts.size() > 0) {
 +    			if (hostSupportsHVM(host)) {
 +    				hostsToCheck.add(host);
 +			} else {
 +				noHvmHosts.add(host);
 +    			}
 +    		}
 +    	} else {
 +    		hostsToCheck.addAll(hosts);
 +    	}
 +    	
 +	if (s_logger.isDebugEnabled()) {
 +		if (noHvmHosts.size() > 0) {
- 			s_logger.debug("Not considering hosts: "  + noHvmHosts + "  to deploy template: " + template +" as they are not HVM enabled");
+                 s_logger.debug("Not considering hosts: " + noHvmHosts + "  to deploy template: " + template + " as they are not HVM enabled");
 -            }
 -        }
 -        // If a host is tagged with the same guest OS category as the template, move it to a high priority list
 -        // If a host is tagged with a different guest OS category than the template, move it to a low priority list
 +		}
 +	}
 +    	// If a host is tagged with the same guest OS category as the template, move it to a high priority list
 +    	// If a host is tagged with a different guest OS category than the template, move it to a low priority list
          List<Host> highPriorityHosts = new ArrayList<Host>();
          List<Host> lowPriorityHosts = new ArrayList<Host>();
          for (Host host : hostsToCheck) {
 -            String hostGuestOSCategory = getHostGuestOSCategory(host);
 -            if (hostGuestOSCategory == null) {
 -                continue;
 -            } else if (templateGuestOSCategory.equals(hostGuestOSCategory)) {
 -                highPriorityHosts.add(host);
 -            } else {
 -                lowPriorityHosts.add(host);
 -            }
 -        }
 -
 -        hostsToCheck.removeAll(highPriorityHosts);
 -        hostsToCheck.removeAll(lowPriorityHosts);
 -
 -        // Prioritize the remaining hosts by HVM capability
 +    		String hostGuestOSCategory = getHostGuestOSCategory(host);
 +    		if (hostGuestOSCategory == null) {
 +    			continue;
 +    		} else if (templateGuestOSCategory.equals(hostGuestOSCategory)) {
 +    			highPriorityHosts.add(host);
 +    		} else {
 +    			lowPriorityHosts.add(host);
 +    		}
 +    	}
 +    	
 +    	hostsToCheck.removeAll(highPriorityHosts);
 +    	hostsToCheck.removeAll(lowPriorityHosts);
 +    	
 +    	// Prioritize the remaining hosts by HVM capability
          for (Host host : hostsToCheck) {
 -            if (!template.isRequiresHvm() && !hostSupportsHVM(host)) {
 -                // Host and template both do not support hvm, put it as first consideration
 -                prioritizedHosts.add(0, host);
 -            } else {
 -                // Template doesn't require hvm, but the machine supports it, make it last for consideration
 -                prioritizedHosts.add(host);
 -            }
 -        }
 -
 -        // Merge the lists
 -        prioritizedHosts.addAll(0, highPriorityHosts);
 -        prioritizedHosts.addAll(lowPriorityHosts);
 -
 -        return prioritizedHosts;
 +    		if (!template.isRequiresHvm() && !hostSupportsHVM(host)) {
 +    			// Host and template both do not support hvm, put it as first consideration
 +    			prioritizedHosts.add(0, host);
 +    		} else {
 +    			// Template doesn't require hvm, but the machine supports it, make it last for consideration
 +    			prioritizedHosts.add(host);
 +    		}
 +    	}
 +    	
 +    	// Merge the lists
 +    	prioritizedHosts.addAll(0, highPriorityHosts);
 +    	prioritizedHosts.addAll(lowPriorityHosts);
 +    	
 +    	return prioritizedHosts;
      }
 -
 +    
      protected boolean hostSupportsHVM(Host host) {
-         if ( !_checkHvm ) {
+         if (!_checkHvm) {
              return true;
          }
 -        // Determine host capabilities
 -        String caps = host.getCapabilities();
 -
 -        if (caps != null) {
 +    	// Determine host capabilities
 +		String caps = host.getCapabilities();
 +		
 +		if (caps != null) {
              String[] tokens = caps.split(",");
              for (String token : tokens) {
 -                if (token.contains("hvm")) {
 -                    return true;
 -                }
 +            	if (token.contains("hvm")) {
 +            	    return true;
 +            	}
              }
 -        }
 -
 -        return false;
 +		}
 +		
 +		return false;
      }
 -
 +    
      protected String getHostGuestOSCategory(Host host) {
 -        DetailVO hostDetail = _hostDetailsDao.findDetail(host.getId(), "guest.os.category.id");
 -        if (hostDetail != null) {
 -            String guestOSCategoryIdString = hostDetail.getValue();
 -            long guestOSCategoryId;
 -
 -            try {
 -                guestOSCategoryId = Long.parseLong(guestOSCategoryIdString);
 -            } catch (Exception e) {
 -                return null;
 -            }
 -
 -            GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
 -
 -            if (guestOSCategory != null) {
 -                return guestOSCategory.getName();
 -            } else {
 -                return null;
 -            }
 -        } else {
 -            return null;
 -        }
 +		DetailVO hostDetail = _hostDetailsDao.findDetail(host.getId(), "guest.os.category.id");
 +		if (hostDetail != null) {
 +			String guestOSCategoryIdString = hostDetail.getValue();
 +			long guestOSCategoryId;
 +			
 +			try {
 +				guestOSCategoryId = Long.parseLong(guestOSCategoryIdString);
 +			} catch (Exception e) {
 +				return null;
 +			}
 +			
 +			GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
 +			
 +			if (guestOSCategory != null) {
 +				return guestOSCategory.getName();
 +			} else {
 +				return null;
 +			}
 +		} else {
 +			return null;
 +		}
      }
 -
 +    
      protected String getTemplateGuestOSCategory(VMTemplateVO template) {
 -        long guestOSId = template.getGuestOSId();
 -        GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
 -        long guestOSCategoryId = guestOS.getCategoryId();
 -        GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
 -        return guestOSCategory.getName();
 +    	long guestOSId = template.getGuestOSId();
 +    	GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
 +    	long guestOSCategoryId = guestOS.getCategoryId();
 +    	GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
 +    	return guestOSCategory.getName();
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/resource/ResourceManagerImpl.java
index c0e4254,054ac40..428febc
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@@ -2468,10 -2470,10 +2469,10 @@@ public class ResourceManagerImpl extend
      }
  
      @Override
-     public Pair<HostPodVO, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long accountId,
+     public Pair<Pod, Long> findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long accountId,
 -            Set<Long> avoids) {
 -        for (PodAllocator allocator : _podAllocators) {
 +			Set<Long> avoids) {
 +		for (PodAllocator allocator : _podAllocators) {
-             final Pair<HostPodVO, Long> pod = allocator.allocateTo(template, offering, dc, accountId, avoids);
+             final Pair<Pod, Long> pod = allocator.allocateTo(template, offering, dc, accountId, avoids);
              if (pod != null) {
                  return pod;
              }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/StorageManagerImpl.java
index 13eb98a,d9ef853..c6233db
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@@ -401,22 -400,22 +401,22 @@@ public class StorageManagerImpl extend
      }
  
      @Override
-     public StoragePool findStoragePool(DiskProfile dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, Long hostId, VMInstanceVO vm,
+     public StoragePool findStoragePool(DiskProfile dskCh, final DataCenterVO dc, Pod pod, Long clusterId, Long hostId, VMInstanceVO vm,
 -                                       final Set<StoragePool> avoid) {
 +            final Set<StoragePool> avoid) {
  
 -        VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
 +        VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
          for (StoragePoolAllocator allocator : _storagePoolAllocators) {
 -
 -            ExcludeList avoidList = new ExcludeList();
 +        	
 +        	ExcludeList avoidList = new ExcludeList();
              for (StoragePool pool : avoid) {
 -                avoidList.addPool(pool.getId());
 -            }
 -            DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), pod.getId(), clusterId, hostId, null, null);
 -
 -            final List<StoragePool> poolList = allocator.allocateToPool(dskCh, profile, plan, avoidList, 1);
 -            if (poolList != null && !poolList.isEmpty()) {
 +        		avoidList.addPool(pool.getId());
 +        	}
 +        	DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), pod.getId(), clusterId, hostId, null, null);
 +        	
 +        	final List<StoragePool> poolList = allocator.allocateToPool(dskCh, profile, plan, avoidList, 1);
 +        	if (poolList != null && !poolList.isEmpty()) {
                  return (StoragePool) dataStoreMgr.getDataStore(poolList.get(0).getId(), DataStoreRole.Primary);
 -            }
 +        	}
          }
          return null;
      }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/storage/VolumeManagerImpl.java
index 0554f22,d63e631..31a0ac2
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@@ -549,10 -549,9 +548,9 @@@ public class VolumeManagerImpl extends 
              while ((pool = storageMgr.findStoragePool(dskCh, dc, pod.first(), null, null,
                      null, poolsToAvoid)) != null) {
                  break;
-                 
              }
          }
 -
 +        
          if (pool == null) {
              String msg = "There are no available storage pools to store the volume in";
              s_logger.info(msg);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3ecc52a4/server/src/com/cloud/template/TemplateAdapterBase.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/template/TemplateAdapterBase.java
index 88909d8,fce2506..b67d759
--- a/server/src/com/cloud/template/TemplateAdapterBase.java
+++ b/server/src/com/cloud/template/TemplateAdapterBase.java
@@@ -21,17 -21,16 +21,17 @@@ import java.util.Map
  
  import javax.inject.Inject;
  
++import org.apache.log4j.Logger;
++
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
  import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
  import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
- import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
  import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
 -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 +import org.apache.cloudstack.context.CallContext;
- import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
  import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
--import org.apache.log4j.Logger;
  
  import com.cloud.api.ApiDBUtils;
  import com.cloud.configuration.Config;
@@@ -289,9 -291,16 +291,16 @@@ public abstract class TemplateAdapterBa
  
  				if ((template != null)
  						&& (!template.isPublicTemplate() && (account.getId() != template.getAccountId()) && (template.getTemplateType() != TemplateType.PERHOST))) {
+ 				    //special handling for the project case
+ 				    Account owner = _accountMgr.getAccount(template.getAccountId());
+ 				    if (owner.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+ 				        if (!_projectMgr.canAccessProjectAccount(account, owner.getId())) {
+ 	                        throw new PermissionDeniedException(msg + ". Permission denied. The caller can't access project's template");
+ 				        }
+ 		            } else {
 -		                throw new PermissionDeniedException(msg + ". Permission denied.");
 -		            }
 +					throw new PermissionDeniedException(msg + ". Permission denied.");
 +				}
- 
+ 				}
  			} else {
  				if ((vmInstanceCheck != null) && !_domainDao.isChildDomain(account.getDomainId(), vmInstanceCheck.getDomainId())) {
  					throw new PermissionDeniedException(msg + ". Permission denied.");
@@@ -337,9 -346,9 +346,10 @@@
  		return new TemplateProfile(userId, template, zoneId);
  	}
  
--	public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd cmd) {
++	@Override
++    public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd cmd) {
  		Long templateId = cmd.getId();
 -		Long userId = UserContext.current().getCallerUserId();
 +		Long userId = CallContext.current().getCallingUserId();
  	        Long zoneId = cmd.getZoneId();
  
  		VMTemplateVO template = _tmpltDao.findById(templateId.longValue());
@@@ -349,12 -358,12 +359,13 @@@
  		return new TemplateProfile(userId, template, zoneId);
  	}
  
--	public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
++	@Override
++    public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
  		Long templateId = cmd.getId();
 -        Long userId = UserContext.current().getCallerUserId();
 -        Account account = UserContext.current().getCaller();
 +        Long userId = CallContext.current().getCallingUserId();
 +        Account account = CallContext.current().getCallingAccount();
          Long zoneId = cmd.getZoneId();
 -
 +        
          VMTemplateVO template = _tmpltDao.findById(templateId.longValue());
          if (template == null) {
              throw new InvalidParameterValueException("unable to find iso with id " + templateId);