Updated Branches:
  refs/heads/master 2af678902 -> 5f3e0c578

   CS-15155 : after system VMs boot up, destroy CD virtual device for System VM
               when reconnect XenServer host, try to destroy CD virtual device 
for System VM, this is for upgrade


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

Branch: refs/heads/master
Commit: 5f3e0c57839d58ac7acca3f7749e885b2280eebd
Parents: 2af6789
Author: anthony <[email protected]>
Authored: Fri Jun 15 11:27:53 2012 -0700
Committer: anthony <[email protected]>
Committed: Fri Jun 15 11:27:53 2012 -0700

----------------------------------------------------------------------
 .../xen/resource/CitrixResourceBase.java           |   32 ++++++++++++++-
 1 files changed, 31 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/5f3e0c57/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java 
b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 121675e..3917242 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -1104,6 +1104,27 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return cdromVBD;
     }
 
+    protected void destroyPatchVbd(Connection conn, String vmName) throws 
XmlRpcException, XenAPIException {
+        try {
+            if( !vmName.startsWith("r-") && !vmName.startsWith("s-") && 
!vmName.startsWith("v-") ) {
+                return;
+            }
+            Set<VM> vms = VM.getByNameLabel(conn, vmName);
+            for ( VM vm : vms ) {
+                Set<VBD> vbds = vm.getVBDs(conn);
+                for( VBD vbd : vbds ) {
+                   if (vbd.getType(conn) == Types.VbdType.CD ) {
+                       vbd.eject(conn);
+                       vbd.destroy(conn);
+                       break;
+                   }
+                }
+            }
+        } catch (Exception e) {
+            s_logger.debug("Cannot destory CD-ROM device for VM " + vmName + " 
due to " + e.toString(), e);
+        }
+    }
+
     protected CheckSshAnswer execute(CheckSshCommand cmd) {
         Connection conn = getConnection();
         String vmName = cmd.getName();
@@ -1119,6 +1140,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             if (result != null) {
                 return new CheckSshAnswer(cmd, "Can not ping System vm " + 
vmName + "due to:" + result);
             }
+            destroyPatchVbd(conn, vmName);
         } catch (Exception e) {
             return new CheckSshAnswer(cmd, e);
         }
@@ -2683,7 +2705,15 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         callHostPlugin(conn, "vmopsSnapshot", "unmountSnapshotsDir", "dcId", 
dcId.toString());
 
         setupLinkLocalNetwork(conn);
-
+        // try to destroy CD-ROM device for all system VMs on this host
+        try {
+            Host host = Host.getByUuid(conn, _host.uuid);
+            Set<VM> vms = host.getResidentVMs(conn);
+            for ( VM vm : vms ) {
+                destroyPatchVbd(conn, vm.getNameLabel(conn));
+            }
+        } catch (Exception e) {
+        }
         try {
             boolean result = cleanupHaltedVms(conn);
             if (!result) {

Reply via email to