Updated Branches:
  refs/heads/4.3-forward f0b861fed -> 95e41fdf0

CLOUDSTACK-6023: Non windows instances are created on XenServer with a vcpu-max 
above supported xenserver limits

Changed the VCPU max limit to 16 and provided a cluster level configuration 
parameter for this max limit named xen.vm.vcpu.max


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

Branch: refs/heads/4.3-forward
Commit: 95e41fdf0da50c165a9317847058fce4efeddbcf
Parents: f0b861f
Author: Harikrishna Patnala <harikrishna.patn...@citrix.com>
Authored: Fri Feb 7 16:44:11 2014 +0530
Committer: Nitin Mehta <nitin.me...@citrix.com>
Committed: Fri Feb 7 12:50:55 2014 -0800

----------------------------------------------------------------------
 .../cloud/agent/api/to/VirtualMachineTO.java    |  9 ++++++
 .../src/com/cloud/hypervisor/XenServerGuru.java | 30 +++++++++++++++++++-
 .../xen/resource/CitrixResourceBase.java        | 14 ++++++---
 3 files changed, 48 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/95e41fdf/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java 
b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
index e6240ff..a5860d7 100644
--- a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
+++ b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
@@ -60,6 +60,7 @@ public class VirtualMachineTO {
 
     DiskTO[] disks;
     NicTO[] nics;
+    Integer vcpuMaxLimit;
 
     public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type 
type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType 
bootloader, String os, boolean enableHA, boolean limitCpuUse, String 
vncPassword) {
         this.id = id;
@@ -263,5 +264,13 @@ public class VirtualMachineTO {
         this.uuid = uuid;
     }
 
+    public Integer getVcpuMaxLimit() {
+        return vcpuMaxLimit;
+    }
+
+    public void setVcpuMaxLimit(Integer vcpuMaxLimit) {
+        this.vcpuMaxLimit = vcpuMaxLimit;
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/95e41fdf/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
index 28bd724..47ab90a 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
@@ -35,19 +35,24 @@ import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
 import com.cloud.utils.Pair;
+import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.UserVmDao;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.DettachCommand;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.framework.config.ConfigKey;
+
 
 @Local(value=HypervisorGuru.class)
-public class XenServerGuru extends HypervisorGuruBase implements 
HypervisorGuru {
+public class XenServerGuru extends HypervisorGuruBase implements 
HypervisorGuru, Configurable{
     @Inject GuestOSDao _guestOsDao;
     @Inject
     EndPointSelector endPointSelector;
@@ -59,6 +64,11 @@ public class XenServerGuru extends HypervisorGuruBase 
implements HypervisorGuru
     PrimaryDataStoreDao _storagePoolDao;
     @Inject
     VolumeDataFactory _volFactory;
+    @Inject
+    UserVmDao _userVmDao;
+
+    static final ConfigKey<Integer> MaxNumberOfVCPUSPerVM = new 
ConfigKey<Integer>("Advanced", Integer.class, "xen.vm.vcpu.max", "16",
+            "Maximum number of VCPUs that VM can get in XenServer.", true, 
ConfigKey.Scope.Cluster);
 
     protected XenServerGuru() {
         super();
@@ -76,6 +86,14 @@ public class XenServerGuru extends HypervisorGuruBase 
implements HypervisorGuru
                 bt = vm.getBootLoaderType();
         }
         VirtualMachineTO to = toVirtualMachineTO(vm);
+        UserVmVO userVmVO = _userVmDao.findById(vm.getId());
+        if (userVmVO != null) {
+            HostVO host = hostDao.findById(userVmVO.getHostId());
+            if (host != null) {
+                
to.setVcpuMaxLimit(MaxNumberOfVCPUSPerVM.valueIn(host.getClusterId()));
+            }
+        }
+
         to.setBootloader(bt);
         
         // Determine the VM's OS description
@@ -151,4 +169,14 @@ public class XenServerGuru extends HypervisorGuruBase 
implements HypervisorGuru
         }
         return new Pair<Boolean, Long>(Boolean.FALSE, new Long(hostId));
     }
+
+    @Override
+    public String getConfigComponentName() {
+        return XenServerGuru.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] {MaxNumberOfVCPUSPerVM};
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/95e41fdf/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index aa1ef83..b398ca5 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -1265,6 +1265,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         vmr.nameLabel = vmSpec.getName();
         vmr.actionsAfterCrash = Types.OnCrashBehaviour.DESTROY;
         vmr.actionsAfterShutdown = Types.OnNormalExit.DESTROY;
+        vmr.VCPUsMax = (long) vmSpec.getCpus(); // FIX ME: In case of dynamic 
scaling this VCPU max should be the minumum of
+                                                // recommended value for that 
template and capacity remaining on host
 
         if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) {
             //scaling is allowed
@@ -1272,6 +1274,14 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             vmr.memoryStaticMax = getStaticMax(vmSpec.getOs(), 
vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), 
vmSpec.getMaxRam());
             vmr.memoryDynamicMin = vmSpec.getMinRam();
             vmr.memoryDynamicMax = vmSpec.getMaxRam();
+
+            if (guestOsTypeName.toLowerCase().contains("windows")) {
+                vmr.VCPUsMax = (long) vmSpec.getCpus();
+            } else {
+                if (vmSpec.getVcpuMaxLimit() != null) {
+                    vmr.VCPUsMax = (long) vmSpec.getVcpuMaxLimit();
+                }
+            }
         } else {
             //scaling disallowed, set static memory target
             if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, 
host)) {
@@ -1281,12 +1291,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             vmr.memoryStaticMax = vmSpec.getMaxRam();
             vmr.memoryDynamicMin = vmSpec.getMinRam();
             vmr.memoryDynamicMax = vmSpec.getMaxRam();
-        }
 
-        if (guestOsTypeName.toLowerCase().contains("windows")) {
             vmr.VCPUsMax = (long) vmSpec.getCpus();
-        } else {
-            vmr.VCPUsMax = 32L;
         }
 
         vmr.VCPUsAtStartup = (long) vmSpec.getCpus();

Reply via email to