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);