Repository: cloudstack
Updated Branches:
  refs/heads/4.4 6e093514e -> 36fa355f0


Add support for XS6.2 Fox hotfix


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

Branch: refs/heads/4.4
Commit: 36fa355f0bf5c3093f0bbd0aa6329180d3fc33ae
Parents: 6e09351
Author: Anthony Xu <anthony...@citrix.com>
Authored: Fri Mar 28 16:45:16 2014 -0700
Committer: Anthony Xu <anthony...@citrix.com>
Committed: Fri Mar 28 16:54:18 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/hypervisor/XenServerGuru.java |  6 +-
 .../xen/discoverer/XcpServerDiscoverer.java     | 52 +++++++++++-----
 .../xen/resource/CitrixResourceBase.java        | 26 +++++++-
 .../xen/resource/Xenserver625Resource.java      | 65 +++++++++++++++++---
 .../hypervisor/xenserver/XenserverConfigs.java  | 24 ++++++++
 .../vm/hypervisor/xenserver/xenserver62/patch   |  1 -
 6 files changed, 143 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/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 059e6e4..4d88740 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/XenServerGuru.java
@@ -29,7 +29,6 @@ import com.cloud.agent.api.to.DataTO;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.NfsTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.host.HostInfo;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
@@ -42,6 +41,7 @@ import com.cloud.utils.Pair;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 
+import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
 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;
@@ -148,8 +148,8 @@ public class XenServerGuru extends HypervisorGuruBase 
implements HypervisorGuru
                     EndPoint ep = endPointSelector.selectHypervisorHost(new 
ZoneScope(host.getDataCenterId()));
                     host = hostDao.findById(ep.getId());
                     hostDao.loadDetails(host);
-                    boolean snapshotHotFix = 
Boolean.parseBoolean(host.getDetail(HostInfo.XS620_SNAPSHOT_HOTFIX));
-                    if (snapshotHotFix) {
+                    String snapshotHotFixVersion = 
host.getDetail(XenserverConfigs.XSHasFixFox);
+                    if (snapshotHotFixVersion != null && 
snapshotHotFixVersion.equalsIgnoreCase("true")) {
                         return new Pair<Boolean, Long>(Boolean.TRUE, new 
Long(ep.getId()));
                     }
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index 14e993e..6ead6b7 100755
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -74,6 +74,7 @@ import com.cloud.hypervisor.xen.resource.XenServer610Resource;
 import com.cloud.hypervisor.xen.resource.XenServer620Resource;
 import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
 import com.cloud.hypervisor.xen.resource.Xenserver625Resource;
+import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
 import com.cloud.resource.Discoverer;
 import com.cloud.resource.DiscovererBase;
 import com.cloud.resource.ResourceStateAdapter;
@@ -93,8 +94,12 @@ import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.Host;
 import com.xensource.xenapi.Pool;
 import com.xensource.xenapi.Session;
+import com.xensource.xenapi.PoolPatch;
+import com.xensource.xenapi.HostPatch;
 import com.xensource.xenapi.Types.SessionAuthenticationFailed;
 import com.xensource.xenapi.Types.XenAPIException;
+import com.xensource.xenapi.Types.UuidInvalid;
+
 
 @Local(value = Discoverer.class)
 public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, 
Listener, ResourceStateAdapter {
@@ -143,11 +148,36 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
         }
     }
 
-    protected boolean xenserverHotFixEnabled() {
-        //temporary fix, we should call xenserver api to get the hot fix is 
enabled or not.
-        return 
Boolean.parseBoolean(_configDao.getValue(Config.XenServerHotFix.name()));
+    protected boolean poolHasHotFix(Connection conn, String hostIp) {
+        try {
+            Map<Host, Host.Record> hosts = Host.getAllRecords(conn);
+            for (Map.Entry<Host, Host.Record> entry : hosts.entrySet()) {
+
+                Host.Record re = entry.getValue();
+                if (!re.address.equalsIgnoreCase(hostIp)){
+                    continue;
+                }
+                Set<HostPatch> patches = re.patches;
+                PoolPatch poolPatch = PoolPatch.getByUuid(conn, 
XenserverConfigs.FixFoxUuid);
+                for(HostPatch patch : patches) {
+                    PoolPatch pp = patch.getPoolPatch(conn);
+                    if (pp.equals(poolPatch) && patch.getApplied(conn)) {
+                        s_logger.debug("host " + hostIp + " does have Fox 
Hotfix");
+                        return true;
+                    }
+                }
+            }
+            return false;
+        } catch (UuidInvalid e) {
+            s_logger.debug("host " + hostIp + " doesn't have Fox Hotfix");
+        } catch (Exception e) {
+            s_logger.debug("can't get patches information, consider it doesn't 
have Fox Hotfix");
+        }
+        return false;
     }
 
+
+
     @Override
     public Map<? extends ServerResource, Map<String, String>>
     find(long dcId, Long podId, Long clusterId, URI url, String username, 
String password, List<String> hostTags) throws DiscoveryException {
@@ -195,6 +225,7 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
             Pool.Record pr = pool.getRecord(conn);
             String poolUuid = pr.uuid;
             Map<Host, Host.Record> hosts = Host.getAllRecords(conn);
+            boolean xsHotFixFoxEnabled = poolHasHotFix(conn, hostIp);
 
             /*set cluster hypervisor type to xenserver*/
             ClusterVO clu = _clusterDao.findById(clusterId);
@@ -260,8 +291,6 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
                     hostOS = record.softwareVersion.get("platform_name");
                 }
 
-                //Boolean xs620hotfix = 
record.tags.contains(xs620snapshothotfix);
-                Boolean xs620hotfix = xenserverHotFixEnabled();
                 String hostOSVer = prodVersion;
                 String hostKernelVer = record.softwareVersion.get("linux");
 
@@ -270,7 +299,7 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
                     continue;
                 }
 
-                CitrixResourceBase resource = createServerResource(dcId, 
podId, record);
+                CitrixResourceBase resource = createServerResource(dcId, 
podId, record, xsHotFixFoxEnabled);
                 s_logger.info("Found host " + record.hostname + " ip=" + 
record.address + " product version=" + prodVersion);
 
                 Map<String, String> details = new HashMap<String, String>();
@@ -291,7 +320,6 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
                 details.put(HostInfo.HOST_OS_VERSION, hostOSVer);
                 details.put(HostInfo.HOST_OS_KERNEL_VERSION, hostKernelVer);
                 details.put(HostInfo.HYPERVISOR_VERSION, xenVersion);
-                details.put(HostInfo.XS620_SNAPSHOT_HOTFIX, 
xs620hotfix.toString());
 
                 String privateNetworkLabel = 
_networkMgr.getDefaultManagementTrafficLabel(dcId, HypervisorType.XenServer);
                 String storageNetworkLabel = 
_networkMgr.getDefaultStorageTrafficLabel(dcId, HypervisorType.XenServer);
@@ -364,7 +392,7 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
     }
 
 
-    protected CitrixResourceBase createServerResource(long dcId, Long podId, 
Host.Record record) {
+    protected CitrixResourceBase createServerResource(long dcId, Long podId, 
Host.Record record, boolean hotfix) {
         String prodBrand = record.softwareVersion.get("product_brand");
         if (prodBrand == null) {
             prodBrand = record.softwareVersion.get("platform_name").trim();
@@ -394,14 +422,6 @@ public class XcpServerDiscoverer extends DiscovererBase 
implements Discoverer, L
         else if (prodBrand.equals("XenServer") && prodVersion.equals("6.1.0"))
             return new XenServer610Resource();
         else if (prodBrand.equals("XenServer") && prodVersion.equals("6.2.0")) 
{
-            /*
-            Set<String> tags =record.tags;
-            if (tags.contains(xs620snapshothotfix)) {
-                return new Xenserver625Resource();
-            } else {
-                return new XenServer620Resource();
-            }*/
-            boolean hotfix = xenserverHotFixEnabled();
             if (hotfix) {
                 return new Xenserver625Resource();
             } else {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/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 bc25a94..8556e4e 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
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.hypervisor.xen.resource;
 
+import org.apache.cloudstack.hypervisor.xenserver.XenserverConfigs;
 import com.cloud.agent.IAgentControl;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.AttachIsoCommand;
@@ -185,6 +186,8 @@ import com.xensource.xenapi.GPUGroup;
 import com.xensource.xenapi.Host;
 import com.xensource.xenapi.HostCpu;
 import com.xensource.xenapi.HostMetrics;
+import com.xensource.xenapi.HostPatch;
+import com.xensource.xenapi.PoolPatch;
 import com.xensource.xenapi.Network;
 import com.xensource.xenapi.PBD;
 import com.xensource.xenapi.PGPU;
@@ -852,7 +855,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         }
     }
 
-    private String revertToSnapshot(Connection conn, VM vmSnapshot, String 
vmName, String oldVmUuid, Boolean snapshotMemory, String hostUUID) throws 
XenAPIException,
+    protected String revertToSnapshot(Connection conn, VM vmSnapshot, String 
vmName, String oldVmUuid, Boolean snapshotMemory, String hostUUID) throws 
XenAPIException,
     XmlRpcException {
 
         String results =
@@ -5600,6 +5603,25 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return ConnPool.connect(_host.uuid, _host.pool, _host.ip, _username, 
_password, _wait);
     }
 
+
+    protected boolean hostHasFixFox(Connection conn) {
+        try {
+            Host host = Host.getByUuid(conn, _host.uuid);
+            Host.Record re = host.getRecord(conn);
+            Set<HostPatch> patches = re.patches;
+            PoolPatch poolPatch = PoolPatch.getByUuid(conn, 
XenserverConfigs.FixFoxUuid);
+            for(HostPatch patch : patches) {
+                PoolPatch pp = patch.getPoolPatch(conn);
+                if (pp.equals(poolPatch) && patch.getApplied(conn)) {
+                    return true;
+                }
+            }
+         } catch (Exception e) {
+            s_logger.debug("can't get patches information", e);
+        }
+        return false;
+    }
+
     protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) {
         final StringBuilder caps = new StringBuilder();
         try {
@@ -5618,6 +5640,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             }
             details.put("product_brand", productBrand);
             details.put("product_version", _host.productVersion);
+            Boolean hasFixFox = hostHasFixFox(conn);
+            details.put(XenserverConfigs.XSHasFixFox, hasFixFox.toString());
 
             if (hr.softwareVersion.get("product_version_text_short") != null) {
                 details.put("product_version_text_short", 
hr.softwareVersion.get("product_version_text_short"));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java
index e9c3f29..b1442de 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java
@@ -21,22 +21,24 @@ package com.cloud.hypervisor.xen.resource;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import javax.ejb.Local;
 
 import org.apache.log4j.Logger;
+import org.apache.xmlrpc.XmlRpcException;
 
 import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.Types;
+import com.xensource.xenapi.VM;
 
 import org.apache.cloudstack.hypervisor.xenserver.XenServerResourceNewBase;
 
-import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.resource.ServerResource;
 import com.cloud.storage.resource.StorageSubsystemCommandHandler;
 import com.cloud.storage.resource.StorageSubsystemCommandHandlerBase;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
+import com.cloud.utils.ssh.SSHCmdHelper;
 
 @Local(value=ServerResource.class)
 public class Xenserver625Resource extends XenServerResourceNewBase {
@@ -47,13 +49,6 @@ public class Xenserver625Resource extends 
XenServerResourceNewBase {
     }
 
     @Override
-    protected void fillHostInfo(Connection conn, StartupRoutingCommand cmd) {
-        super.fillHostInfo(conn, cmd);
-        Map<String, String> details = cmd.getHostDetails();
-        details.put("Xenserer620HotFix", "Xenserver-Vdi-Copy-HotFix");
-    }
-
-    @Override
     protected String getGuestOsType(String stdType, boolean bootFromCD) {
         return CitrixHelper.getXenServer625GuestOsType(stdType, bootFromCD);
     }
@@ -111,5 +106,55 @@ public class Xenserver625Resource extends 
XenServerResourceNewBase {
 
     }
 
+    @Override
+    protected boolean setupServer(Connection conn) {
+        com.trilead.ssh2.Connection sshConnection = new 
com.trilead.ssh2.Connection(_host.ip, 22);
+        try {
+            sshConnection.connect(null, 60000, 60000);
+            if (!sshConnection.authenticateWithPassword(_username, 
_password.peek())) {
+                throw new CloudRuntimeException("Unable to authenticate");
+            }
+
+            String cmd = "rm -f /opt/xensource/sm/hostvmstats.py " +
+                         "/opt/xensource/bin/copy_vhd_to_secondarystorage.sh " 
+
+                         "/opt/xensource/bin/copy_vhd_from_secondarystorage.sh 
" +
+                         
"/opt/xensource/bin/create_privatetemplate_from_snapshot.sh " +
+                         "/opt/xensource/bin/vhd-util " +
+                         "/opt/cloud/bin/copy_vhd_to_secondarystorage.sh " +
+                         "/opt/cloud/bin/copy_vhd_from_secondarystorage.sh " +
+                         
"/opt/cloud/bin/create_privatetemplate_from_snapshot.sh " +
+                         "/opt/cloud/bin/vhd-util";
+
+            SSHCmdHelper.sshExecuteCmd(sshConnection, cmd);
+        } catch (Exception e) {
+            s_logger.debug("Catch exception " + e.toString(), e);
+        } finally {
+            sshConnection.close();
+        }
+        return super.setupServer(conn);
+    }
+
+    @Override
+    protected String revertToSnapshot(Connection conn, VM vmSnapshot,
+                                      String vmName, String oldVmUuid, Boolean 
snapshotMemory, String hostUUID)
+            throws Types.XenAPIException, XmlRpcException {
+
+        String results = callHostPluginAsync(conn, "cloud-plugin-storage",
+                "revert_memory_snapshot", 10 * 60 * 1000, "snapshotUUID",
+                vmSnapshot.getUuid(conn), "vmName", vmName, "oldVmUuid",
+                oldVmUuid, "snapshotMemory", snapshotMemory.toString(), 
"hostUUID", hostUUID);
+        String errMsg = null;
+        if (results == null || results.isEmpty()) {
+            errMsg = "revert_memory_snapshot return null";
+        } else {
+            if (results.equals("0")) {
+                return results;
+            } else {
+                errMsg = "revert_memory_snapshot exception";
+            }
+        }
+        s_logger.warn(errMsg);
+        throw new CloudRuntimeException(errMsg);
+    }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenserverConfigs.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenserverConfigs.java
 
b/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenserverConfigs.java
new file mode 100644
index 0000000..8df803b
--- /dev/null
+++ 
b/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenserverConfigs.java
@@ -0,0 +1,24 @@
+/*
+ * 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 org.apache.cloudstack.hypervisor.xenserver;
+
+public final class XenserverConfigs {
+    public static final String XSHasFixFox = "xs_has_fixfox";
+    public static final String FixFoxUuid = 
"996dd2e7-ad95-49cc-a0be-2c9adc4dfb0b";
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/36fa355f/scripts/vm/hypervisor/xenserver/xenserver62/patch
----------------------------------------------------------------------
diff --git a/scripts/vm/hypervisor/xenserver/xenserver62/patch 
b/scripts/vm/hypervisor/xenserver/xenserver62/patch
index 4ac2968..13f4f93 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver62/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver62/patch
@@ -49,7 +49,6 @@ setup_heartbeat_file.sh=..,0755,/opt/cloud/bin
 check_heartbeat.sh=..,0755,/opt/cloud/bin
 xenheartbeat.sh=..,0755,/opt/cloud/bin
 launch_hb.sh=..,0755,/opt/cloud/bin
-vhd-util=..,0755,/opt/cloud/bin
 upgrade_snapshot.sh=..,0755,/opt/cloud/bin
 cloud-clean-vlan.sh=..,0755,/opt/cloud/bin
 cloud-prepare-upgrade.sh=..,0755,/opt/cloud/bin

Reply via email to