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