This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.14
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.14 by this push:
     new 93f3d35  kvm: FIX cpucorespersocket is not working on KVM (#4497)
93f3d35 is described below

commit 93f3d352071be326ab3b810e23da7c27a948aedd
Author: Wei Zhou <[email protected]>
AuthorDate: Wed Dec 9 15:07:51 2020 +0100

    kvm: FIX cpucorespersocket is not working on KVM (#4497)
---
 .../kvm/resource/LibvirtComputingResource.java     | 31 ++++++++++++++++------
 .../main/java/com/cloud/vm/UserVmManagerImpl.java  |  9 +++++++
 2 files changed, 32 insertions(+), 8 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index fd95a8c..c438833 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -2302,14 +2302,7 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
             if (vmTO.getType() == VirtualMachine.Type.User) {
                 cmd.setFeatures(_cpuFeatures);
             }
-            // multi cores per socket, for larger core configs
-            if (vcpus % 6 == 0) {
-                final int sockets = vcpus / 6;
-                cmd.setTopology(6, sockets);
-            } else if (vcpus % 4 == 0) {
-                final int sockets = vcpus / 4;
-                cmd.setTopology(4, sockets);
-            }
+            setCpuTopology(cmd, vcpus, vmTO.getDetails());
             vm.addComp(cmd);
         }
 
@@ -4230,4 +4223,26 @@ public class LibvirtComputingResource extends 
ServerResourceBase implements Serv
 
         return false;
     }
+
+    private void setCpuTopology(CpuModeDef cmd, int vcpus, Map<String, String> 
details) {
+        // multi cores per socket, for larger core configs
+        int numCoresPerSocket = -1;
+        if (details != null) {
+            final String coresPerSocket = 
details.get(VmDetailConstants.CPU_CORE_PER_SOCKET);
+            final int intCoresPerSocket = NumbersUtil.parseInt(coresPerSocket, 
numCoresPerSocket);
+            if (intCoresPerSocket > 0 && vcpus % intCoresPerSocket == 0) {
+                numCoresPerSocket = intCoresPerSocket;
+            }
+        }
+        if (numCoresPerSocket <= 0) {
+            if (vcpus % 6 == 0) {
+                numCoresPerSocket = 6;
+            } else if (vcpus % 4 == 0) {
+                numCoresPerSocket = 4;
+            } else {
+                numCoresPerSocket = 1;
+            }
+        }
+        cmd.setTopology(numCoresPerSocket, vcpus / numCoresPerSocket);
+    }
 }
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 192a027..fe8d8a4 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -2478,6 +2478,15 @@ public class UserVmManagerImpl extends ManagerBase 
implements UserVmManager, Vir
                         if (ovfPropertyVO != null && 
ovfPropertyVO.isPassword()) {
                             details.put(detailName, 
DBEncryptionUtil.encrypt(details.get(detailName)));
                         }
+                    } else if 
(VmDetailConstants.CPU_CORE_PER_SOCKET.equals(detailName)) {
+                        try {
+                            final int val = 
Integer.parseInt(details.get(detailName));
+                            if (val <= 0) {
+                                throw new 
InvalidParameterValueException("Please enter a positive integer value for the 
vm setting: " + detailName);
+                            }
+                        } catch (final NumberFormatException e) {
+                            throw new InvalidParameterValueException("Please 
enter an integer value for vm setting: " + detailName);
+                        }
                     }
                 }
                 vmInstance.setDetails(details);

Reply via email to