kvm upgrade issue from 2.2.14: 1. the uuid passed by mgt server is malformat, 
libvirt can't start vm. 2. the template path on primary storage is incorrect, 
which contains absolute path
(cherry picked from commit ffc53e81e0de998f15a91b90eb05104402c4538c)

Signed-off-by: animesh <[email protected]>


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

Branch: refs/heads/4.2
Commit: def926ca5e0253ba2b8e6ad95312b98fa6de2484
Parents: 97cb5f3
Author: Edison Su <[email protected]>
Authored: Fri Aug 30 18:06:08 2013 -0700
Committer: animesh <[email protected]>
Committed: Tue Sep 3 16:31:22 2013 -0700

----------------------------------------------------------------------
 .../kvm/resource/LibvirtComputingResource.java  | 20 +++++++++++++++++++-
 .../kvm/storage/KVMStorageProcessor.java        |  4 ++++
 .../resource/LibvirtComputingResourceTest.java  | 15 +++++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/def926ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 67819bc..3ee811f 100755
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -3374,10 +3374,28 @@ ServerResource {
         }
     }
 
+    protected  String getUuid(String uuid) {
+        if (uuid == null) {
+            uuid = UUID.randomUUID().toString();
+        } else {
+            try {
+                UUID uuid2 = UUID.fromString(uuid);
+                String uuid3 = uuid2.toString();
+                if (!uuid3.equals(uuid)) {
+                    uuid = UUID.randomUUID().toString();
+                }
+            } catch (IllegalArgumentException e) {
+                uuid = UUID.randomUUID().toString();
+            }
+        }
+        return uuid;
+    }
     protected LibvirtVMDef createVMFromSpec(VirtualMachineTO vmTO) {
         LibvirtVMDef vm = new LibvirtVMDef();
         vm.setDomainName(vmTO.getName());
-        vm.setDomUUID(vmTO.getUuid());
+        String uuid = vmTO.getUuid();
+        uuid = getUuid(uuid);
+        vm.setDomUUID(uuid);
         vm.setDomDescription(vmTO.getOs());
 
         GuestDef guest = new GuestDef();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/def926ca/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
index 8482a8d..99ea04f 100644
--- 
a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
+++ 
b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java
@@ -289,6 +289,10 @@ public class KVMStorageProcessor implements 
StorageProcessor {
             if (primaryPool.getType() == StoragePoolType.CLVM) {
                 vol = templateToPrimaryDownload(templatePath, primaryPool);
             } else {
+                if (templatePath.contains("/mnt")) {
+                    //upgrade issue, if the path contains path, need to 
extract the volume uuid from path
+                    templatePath = 
templatePath.substring(templatePath.lastIndexOf(File.separator) + 1);
+                }
                 BaseVol = 
storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), 
primaryStore.getUuid(), templatePath);
                 vol = storagePoolMgr.createDiskFromTemplate(BaseVol, 
UUID.randomUUID().toString(), BaseVol.getPool());
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/def926ca/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
 
b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index 3640030..d6e8dc2 100644
--- 
a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++ 
b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -24,11 +24,13 @@ import 
com.cloud.template.VirtualMachineTemplate.BootloaderType;
 import com.cloud.utils.Pair;
 import com.cloud.vm.VirtualMachine;
 
+import junit.framework.Assert;
 import org.apache.commons.lang.SystemUtils;
 import org.junit.Assume;
 import org.junit.Test;
 
 import java.util.Random;
+import java.util.UUID;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -195,4 +197,17 @@ public class LibvirtComputingResourceTest {
         Pair<Double, Double> stats = 
LibvirtComputingResource.getNicStats("lo");
         assertNotNull(stats);
     }
+
+    @Test
+    public void testUUID() {
+        String uuid = "1";
+        LibvirtComputingResource lcr = new LibvirtComputingResource();
+        uuid =lcr.getUuid(uuid);
+        Assert.assertTrue(!uuid.equals("1"));
+
+        String oldUuid = UUID.randomUUID().toString();
+        uuid = oldUuid;
+        uuid = lcr.getUuid(uuid);
+        Assert.assertTrue(uuid.equals(oldUuid));
+    }
 }

Reply via email to