Revert "change below file names for consistency" This reverts commit f8996fe837cd7906359652f327267fe6201d2407.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d68e13fc Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d68e13fc Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d68e13fc Branch: refs/heads/master Commit: d68e13fcbd376030bb21cd1d634b3c245d50ee15 Parents: f8996fe Author: Anthony Xu <[email protected]> Authored: Fri Mar 28 12:05:25 2014 -0700 Committer: Anthony Xu <[email protected]> Committed: Fri Mar 28 12:05:25 2014 -0700 ---------------------------------------------------------------------- .../xen/discoverer/XcpServerDiscoverer.java | 12 +- .../xen/resource/XenServer625Resource.java | 115 --- .../resource/XenServer625StorageProcessor.java | 822 ------------------- .../xen/resource/Xenserver625Resource.java | 115 +++ .../resource/Xenserver625StorageProcessor.java | 822 +++++++++++++++++++ 5 files changed, 943 insertions(+), 943 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d68e13fc/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 aad7ce1..14e993e 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 @@ -73,7 +73,7 @@ import com.cloud.hypervisor.xen.resource.XenServer602Resource; 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 com.cloud.hypervisor.xen.resource.Xenserver625Resource; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; import com.cloud.resource.ResourceStateAdapter; @@ -384,7 +384,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L return new XcpServerResource(); } else if (prodBrand.equals("XCP") && prodVersion.startsWith("1.6")) { return new XcpServer16Resource(); - } // Citrix XenServer group of hypervisors + } // Citrix Xenserver group of hypervisors else if (prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) return new XenServer56Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.0")) @@ -403,7 +403,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L }*/ boolean hotfix = xenserverHotFixEnabled(); if (hotfix) { - return new XenServer625Resource(); + return new Xenserver625Resource(); } else { return new XenServer620Resource(); } @@ -419,7 +419,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } String msg = - "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, XenServer 6.0, 6.0.2, 6.1.0, 6.2.0 but this one is " + + "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.1.0, 6.2.0 but this one is " + prodBrand + " " + prodVersion; _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, dcId, podId, msg, msg); s_logger.debug(msg); @@ -562,7 +562,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } else if (prodBrand.equals("XenServer") && prodVersion.equals("6.2.0")) { String hotfix = details.get("Xenserer620HotFix"); if (hotfix != null && hotfix.equalsIgnoreCase("Xenserver-Vdi-Copy-HotFix")) { - resource = XenServer625Resource.class.getName(); + resource = Xenserver625Resource.class.getName(); } else { resource = XenServer620Resource.class.getName(); } @@ -579,7 +579,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L if (resource == null) { String msg = - "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, 5.6 FP1, 5.6 SP2 and XenServer 6.0 , 6.0.2, 6.1.0, 6.2.0 but this one is " + + "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2, 6.1.0, 6.2.0 but this one is " + prodBrand + " " + prodVersion; s_logger.debug(msg); throw new RuntimeException(msg); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d68e13fc/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 deleted file mode 100644 index 2d3d45b..0000000 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625Resource.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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 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 com.xensource.xenapi.Connection; - -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; - -@Local(value=ServerResource.class) -public class XenServer625Resource extends XenServerResourceNewBase { - private static final Logger s_logger = Logger.getLogger(XenServer625Resource.class); - - public XenServer625Resource() { - super(); - } - - @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); - } - - @Override - protected List<File> getPatchFiles() { - List<File> files = new ArrayList<File>(); - String patch = "scripts/vm/hypervisor/xenserver/xenserver62/patch"; - String patchfilePath = Script.findScript("", patch); - if (patchfilePath == null) { - throw new CloudRuntimeException("Unable to find patch file " + patch); - } - File file = new File(patchfilePath); - files.add(file); - return files; - } - - @Override - public long getStaticMax(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ - long recommendedValue = CitrixHelper.getXenServer625StaticMax(os, b); - if(recommendedValue == 0){ - s_logger.warn("No recommended value found for dynamic max, setting static max and dynamic max equal"); - return dynamicMaxRam; - } - long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS constraint for stability - if (dynamicMaxRam > staticMax){ // XS contraint that dynamic max <= static max - s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max "); - return dynamicMaxRam; - } - return staticMax; - } - - @Override - public long getStaticMin(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ - long recommendedValue = CitrixHelper.getXenServer625StaticMin(os, b); - if(recommendedValue == 0){ - s_logger.warn("No recommended value found for dynamic min"); - return dynamicMinRam; - } - - if(dynamicMinRam < recommendedValue){ // XS contraint that dynamic min > static min - s_logger.warn("Vm is set to dynamixMin " + dynamicMinRam + " less than the recommended static min " + recommendedValue + ", could lead to stability issues"); - } - return dynamicMinRam; - } - - @Override - protected StorageSubsystemCommandHandler getStorageHandler() { - XenServerStorageProcessor processor = new XenServer625StorageProcessor(this); - return new StorageSubsystemCommandHandlerBase(processor); - } - - @Override - protected void umountSnapshotDir(Connection conn, Long dcId) { - - } - - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d68e13fc/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625StorageProcessor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625StorageProcessor.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625StorageProcessor.java deleted file mode 100644 index cb7a299..0000000 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625StorageProcessor.java +++ /dev/null @@ -1,822 +0,0 @@ -/* - * 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 com.cloud.hypervisor.xen.resource; - -import java.io.File; -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import org.apache.cloudstack.storage.command.CopyCmdAnswer; -import org.apache.cloudstack.storage.command.CopyCommand; -import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; -import org.apache.cloudstack.storage.to.SnapshotObjectTO; -import org.apache.cloudstack.storage.to.TemplateObjectTO; -import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; - -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.to.DataObjectType; -import com.cloud.agent.api.to.DataStoreTO; -import com.cloud.agent.api.to.DataTO; -import com.cloud.agent.api.to.NfsTO; -import com.cloud.agent.api.to.S3TO; -import com.cloud.agent.api.to.SwiftTO; -import com.cloud.exception.InternalErrorException; -import com.cloud.storage.Storage; -import com.cloud.utils.exception.CloudRuntimeException; -import com.xensource.xenapi.Connection; -import com.xensource.xenapi.Host; -import com.xensource.xenapi.PBD; -import com.xensource.xenapi.SR; -import com.xensource.xenapi.Task; -import com.xensource.xenapi.Types; -import com.xensource.xenapi.VDI; - -public class XenServer625StorageProcessor extends XenServerStorageProcessor { - private static final Logger s_logger = Logger.getLogger(XenServerStorageProcessor.class); - - public XenServer625StorageProcessor(CitrixResourceBase resource) { - super(resource); - } - protected boolean mountNfs(Connection conn, String remoteDir, String localDir) { - if (localDir == null) { - localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(remoteDir.getBytes()); - } - String results = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, - "localDir", localDir, "remoteDir", remoteDir); - if (results == null || results.isEmpty()) { - String errMsg = "Could not mount secondary storage " + remoteDir + " on host "; - s_logger.warn(errMsg); - throw new CloudRuntimeException(errMsg); - } - return true; - } - - protected boolean makeDirectory(Connection conn, String path) { - String result = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "makeDirectory", "path", path); - if (result == null || result.isEmpty()) { - return false; - } - return true; - } - - protected SR createFileSR(Connection conn, String path) { - SR sr = null; - PBD pbd = null; - try { - Map<String, String> smConfig = new HashMap<String, String>(); - Host host = Host.getByUuid(conn, hypervisorResource.getHost().uuid); - String uuid = UUID.randomUUID().toString(); - - sr = SR.introduce(conn,uuid, uuid, uuid, "file", "file", false, smConfig); - PBD.Record record = new PBD.Record(); - record.host = host; - record.SR = sr; - smConfig.put("location", path); - record.deviceConfig = smConfig; - pbd = PBD.create(conn, record); - pbd.plug(conn); - sr.scan(conn); - return sr; - } catch (Exception e) { - try { - if (pbd != null) { - pbd.destroy(conn); - } - } catch (Exception e1) { - s_logger.debug("Failed to destroy pbd", e); - } - try { - if (sr != null) { - sr.forget(conn); - } - } catch (Exception e2) { - s_logger.error("Failed to forget sr", e); - } - String msg = "createFileSR failed! due to " + e.toString(); - s_logger.warn(msg, e); - throw new CloudRuntimeException(msg, e); - } - } - - protected SR createFileSr(Connection conn, String remotePath, String dir) { - String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(remotePath.getBytes()); - mountNfs(conn, remotePath, localDir); - SR sr = createFileSR(conn, localDir + "/" + dir); - return sr; - } - - @Override - public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { - DataTO srcData = cmd.getSrcTO(); - DataTO destData = cmd.getDestTO(); - int wait = cmd.getWait(); - DataStoreTO srcStore = srcData.getDataStore(); - Connection conn = hypervisorResource.getConnection(); - SR srcSr = null; - try { - if ((srcStore instanceof NfsTO) && (srcData.getObjectType() == DataObjectType.TEMPLATE)) { - NfsTO srcImageStore = (NfsTO)srcStore; - TemplateObjectTO srcTemplate = (TemplateObjectTO)srcData; - String storeUrl = srcImageStore.getUrl(); - URI uri = new URI(storeUrl); - String volumePath = srcData.getPath(); - volumePath = StringUtils.stripEnd(volumePath, "/"); - String[] splits = volumePath.split("/"); - String volumeDirectory = volumePath; - if (splits.length > 4) { - //"template/tmpl/dcid/templateId/templatename" - int index = volumePath.lastIndexOf("/"); - volumeDirectory = volumePath.substring(0, index); - } - srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory); - Set<VDI> vdis = srcSr.getVDIs(conn); - if (vdis.size() != 1) { - return new CopyCmdAnswer("Can't find template VDI under: " + uri.getHost() + ":" + uri.getPath() + "/" + volumeDirectory); - } - - VDI srcVdi = vdis.iterator().next(); - - PrimaryDataStoreTO destStore = (PrimaryDataStoreTO)destData.getDataStore(); - String poolName = destStore.getUuid(); - - - SR poolsr = null; - Set<SR> srs = SR.getByNameLabel(conn, poolName); - if (srs.size() != 1) { - String msg = "There are " + srs.size() + " SRs with same name: " + poolName; - s_logger.warn(msg); - return new CopyCmdAnswer(msg); - } else { - poolsr = srs.iterator().next(); - } - String pUuid = poolsr.getUuid(conn); - boolean isISCSI = IsISCSI(poolsr.getType(conn)); - Task task = srcVdi.copyAsync2(conn, poolsr, null, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - VDI tmpl = Types.toVDI(task, conn); - VDI snapshotvdi = tmpl.snapshot(conn, new HashMap<String, String>()); - snapshotvdi.setNameLabel(conn, "Template " + srcTemplate.getName()); - tmpl.destroy(conn); - poolsr.scan(conn); - try{ - Thread.sleep(5000); - } catch (Exception e) { - } - - TemplateObjectTO newVol = new TemplateObjectTO(); - newVol.setUuid(snapshotvdi.getUuid(conn)); - newVol.setPath(newVol.getUuid()); - newVol.setFormat(Storage.ImageFormat.VHD); - return new CopyCmdAnswer(newVol); - } - }catch (Exception e) { - String msg = "Catch Exception " + e.getClass().getName() + " for template + " + " due to " + e.toString(); - s_logger.warn(msg, e); - return new CopyCmdAnswer(msg); - } finally { - if (srcSr != null) { - hypervisorResource.removeSR(conn, srcSr); - } - } - return new CopyCmdAnswer("not implemented yet"); - } - - protected String backupSnapshot(Connection conn, String primaryStorageSRUuid, String localMountPoint, String path, String secondaryStorageMountPath, String snapshotUuid, String prevBackupUuid, String prevSnapshotUuid, Boolean isISCSI, int wait) { - String errMsg = null; - boolean mounted = false; - boolean filesrcreated = false; - boolean copied = false; - if (prevBackupUuid == null) { - prevBackupUuid = ""; - } - SR ssSR = null; - - String remoteDir = secondaryStorageMountPath; - - try { - ssSR = createFileSr(conn, remoteDir, path); - filesrcreated = true; - - VDI snapshotvdi = VDI.getByUuid(conn, snapshotUuid); - Task task = null; - if (wait == 0) { - wait = 2 * 60 * 60; - } - VDI dvdi = null; - try { - VDI previousSnapshotVdi = null; - if (prevSnapshotUuid != null) { - previousSnapshotVdi = VDI.getByUuid(conn,prevSnapshotUuid); - } - task = snapshotvdi.copyAsync2(conn, ssSR, previousSnapshotVdi, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - dvdi = Types.toVDI(task, conn); - copied = true; - } finally { - if (task != null) { - try { - task.destroy(conn); - } catch (Exception e1) { - s_logger.warn("unable to destroy task(" + task.toString() + ") on host(" - + ") due to ", e1); - } - } - } - String backupUuid = dvdi.getUuid(conn); - return backupUuid; - } catch (Exception e) { - String msg = "Exception in backupsnapshot stage due to " + e.toString(); - s_logger.debug(msg); - throw new CloudRuntimeException(msg, e); - } finally { - try { - if (filesrcreated && ssSR != null) { - hypervisorResource.removeSR(conn, ssSR); - } - } catch (Exception e) { - s_logger.debug("Exception in backupsnapshot cleanup stage due to " + e.toString()); - } - } - } - - @Override - protected String getVhdParent(Connection conn, String primaryStorageSRUuid, String snapshotUuid, Boolean isISCSI) { - String parentUuid = hypervisorResource.callHostPlugin(conn, "cloud-plugin-storage", "getVhdParent", "primaryStorageSRUuid", primaryStorageSRUuid, - "snapshotUuid", snapshotUuid, "isISCSI", isISCSI.toString()); - - if (parentUuid == null || parentUuid.isEmpty() || parentUuid.equalsIgnoreCase("None")) { - s_logger.debug("Unable to get parent of VHD " + snapshotUuid + " in SR " + primaryStorageSRUuid); - // errString is already logged. - return null; - } - return parentUuid; - } - - @Override - public Answer backupSnapshot(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - DataTO srcData = cmd.getSrcTO(); - DataTO cacheData = cmd.getCacheTO(); - DataTO destData = cmd.getDestTO(); - int wait = cmd.getWait(); - PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore(); - String primaryStorageNameLabel = primaryStore.getUuid(); - String secondaryStorageUrl = null; - NfsTO cacheStore = null; - String destPath = null; - if (cacheData != null) { - cacheStore = (NfsTO)cacheData.getDataStore(); - secondaryStorageUrl = cacheStore.getUrl(); - destPath = cacheData.getPath(); - } else { - cacheStore = (NfsTO)destData.getDataStore(); - secondaryStorageUrl = cacheStore.getUrl(); - destPath = destData.getPath(); - } - - SnapshotObjectTO snapshotTO = (SnapshotObjectTO)srcData; - SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO)destData; - String snapshotUuid = snapshotTO.getPath(); - - String prevBackupUuid = snapshotOnImage.getParentSnapshotPath(); - String prevSnapshotUuid = snapshotTO.getParentSnapshotPath(); - Map<String, String> options = cmd.getOptions(); - // By default assume failure - String details = null; - String snapshotBackupUuid = null; - boolean fullbackup = Boolean.parseBoolean(options.get("fullSnapshot")); - try { - SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel); - if (primaryStorageSR == null) { - throw new InternalErrorException("Could not backup snapshot because the primary Storage SR could not be created from the name label: " + primaryStorageNameLabel); - } - String psUuid = primaryStorageSR.getUuid(conn); - Boolean isISCSI = IsISCSI(primaryStorageSR.getType(conn)); - - VDI snapshotVdi = getVDIbyUuid(conn, snapshotUuid); - String snapshotPaUuid = null; - - URI uri = new URI(secondaryStorageUrl); - String secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath(); - DataStoreTO destStore = destData.getDataStore(); - String folder = destPath; - String finalPath = null; - - String localMountPoint = BaseMountPointOnHost + File.separator + UUID.nameUUIDFromBytes(secondaryStorageUrl.getBytes()).toString(); - if (fullbackup) { - SR snapshotSr = null; - try { - String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(secondaryStorageMountPath.getBytes()); - mountNfs(conn, secondaryStorageMountPath, localDir); - boolean result = makeDirectory(conn, localDir + "/" + folder); - if (!result) { - details = " Filed to create folder " + folder + " in secondary storage"; - s_logger.warn(details); - return new CopyCmdAnswer(details); - } - - snapshotSr = createFileSr(conn, secondaryStorageMountPath, folder); - - Task task = snapshotVdi.copyAsync2(conn, snapshotSr, null, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - VDI backedVdi = Types.toVDI(task, conn); - snapshotBackupUuid = backedVdi.getUuid(conn); - - if( destStore instanceof SwiftTO) { - try { - String container = "S-" + snapshotTO.getVolume().getVolumeId().toString(); - String destSnapshotName = swiftBackupSnapshot(conn, (SwiftTO)destStore, snapshotSr.getUuid(conn), snapshotBackupUuid, container, false, wait); - String swiftPath = container + File.separator + destSnapshotName; - finalPath = swiftPath; - } finally { - try { - deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid); - } catch (Exception e) { - s_logger.debug("Failed to delete snapshot on cache storages" ,e); - } - } - - } else if (destStore instanceof S3TO) { - try { - finalPath = backupSnapshotToS3(conn, (S3TO) destStore, snapshotSr.getUuid(conn), folder, snapshotBackupUuid, isISCSI, wait); - if (finalPath == null) { - throw new CloudRuntimeException("S3 upload of snapshots " + snapshotBackupUuid + " failed"); - } - } finally { - try { - deleteSnapshotBackup(conn, localMountPoint, folder, secondaryStorageMountPath, snapshotBackupUuid); - } catch (Exception e) { - s_logger.debug("Failed to delete snapshot on cache storages" ,e); - } - } - // finalPath = folder + File.separator + snapshotBackupUuid; - } else { - finalPath = folder + File.separator + snapshotBackupUuid; - } - - } finally { - if( snapshotSr != null) { - hypervisorResource.removeSR(conn, snapshotSr); - } - } - } else { - String primaryStorageSRUuid = primaryStorageSR.getUuid(conn); - if( destStore instanceof SwiftTO ) { - String container = "S-" + snapshotTO.getVolume().getVolumeId().toString(); - snapshotBackupUuid = swiftBackupSnapshot(conn, (SwiftTO)destStore, primaryStorageSRUuid, snapshotPaUuid, "S-" + snapshotTO.getVolume().getVolumeId().toString(), isISCSI, wait); - finalPath = container + File.separator + snapshotBackupUuid; - } else if (destStore instanceof S3TO ) { - finalPath = backupSnapshotToS3(conn, (S3TO) destStore, primaryStorageSRUuid, folder, snapshotPaUuid, isISCSI, wait); - if (finalPath == null) { - throw new CloudRuntimeException("S3 upload of snapshots " + snapshotPaUuid + " failed"); - } - } else { - snapshotBackupUuid = backupSnapshot(conn, primaryStorageSRUuid, localMountPoint, folder, - secondaryStorageMountPath, snapshotUuid, prevBackupUuid, prevSnapshotUuid, isISCSI, wait); - - finalPath = folder + File.separator + snapshotBackupUuid; - } - } - String volumeUuid = snapshotTO.getVolume().getPath(); - destroySnapshotOnPrimaryStorageExceptThis(conn, volumeUuid, snapshotUuid); - - SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); - newSnapshot.setPath(finalPath); - if (fullbackup) { - newSnapshot.setParentSnapshotPath(null); - } else { - newSnapshot.setParentSnapshotPath(prevBackupUuid); - } - return new CopyCmdAnswer(newSnapshot); - } catch (Types.XenAPIException e) { - details = "BackupSnapshot Failed due to " + e.toString(); - s_logger.warn(details, e); - } catch (Exception e) { - details = "BackupSnapshot Failed due to " + e.getMessage(); - s_logger.warn(details, e); - } - - return new CopyCmdAnswer(details); - } - - @Override - public Answer createTemplateFromVolume(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - VolumeObjectTO volume = (VolumeObjectTO)cmd.getSrcTO(); - TemplateObjectTO template = (TemplateObjectTO)cmd.getDestTO(); - NfsTO destStore = (NfsTO)cmd.getDestTO().getDataStore(); - int wait = cmd.getWait(); - - String secondaryStoragePoolURL = destStore.getUrl(); - String volumeUUID = volume.getPath(); - - String userSpecifiedName = template.getName(); - - - String details = null; - SR tmpltSR = null; - boolean result = false; - String secondaryStorageMountPath = null; - String installPath = null; - try { - URI uri = new URI(secondaryStoragePoolURL); - secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath(); - installPath = template.getPath(); - if( !hypervisorResource.createSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath)) { - details = " Filed to create folder " + installPath + " in secondary storage"; - s_logger.warn(details); - return new CopyCmdAnswer(details); - } - - VDI vol = getVDIbyUuid(conn, volumeUUID); - // create template SR - tmpltSR = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), installPath); - - // copy volume to template SR - Task task = vol.copyAsync2(conn, tmpltSR, null, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - VDI tmpltVDI = Types.toVDI(task, conn); - // scan makes XenServer pick up VDI physicalSize - tmpltSR.scan(conn); - if (userSpecifiedName != null) { - tmpltVDI.setNameLabel(conn, userSpecifiedName); - } - - String tmpltUUID = tmpltVDI.getUuid(conn); - String tmpltFilename = tmpltUUID + ".vhd"; - long virtualSize = tmpltVDI.getVirtualSize(conn); - long physicalSize = tmpltVDI.getPhysicalUtilisation(conn); - // create the template.properties file - String templatePath = secondaryStorageMountPath + "/" + installPath; - result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, virtualSize, template.getId()); - if (!result) { - throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir"); - } - installPath = installPath + "/" + tmpltFilename; - hypervisorResource.removeSR(conn, tmpltSR); - tmpltSR = null; - TemplateObjectTO newTemplate = new TemplateObjectTO(); - newTemplate.setPath(installPath); - newTemplate.setFormat(Storage.ImageFormat.VHD); - newTemplate.setSize(virtualSize); - newTemplate.setPhysicalSize(physicalSize); - newTemplate.setName(tmpltUUID); - CopyCmdAnswer answer = new CopyCmdAnswer(newTemplate); - return answer; - } catch (Exception e) { - if (tmpltSR != null) { - hypervisorResource.removeSR(conn, tmpltSR); - } - if ( secondaryStorageMountPath != null) { - hypervisorResource.deleteSecondaryStorageFolder(conn, secondaryStorageMountPath, installPath); - } - details = "Creating template from volume " + volumeUUID + " failed due to " + e.toString(); - s_logger.error(details, e); - } - return new CopyCmdAnswer(details); - } - - protected String getSnapshotUuid(String snapshotPath) { - int index = snapshotPath.lastIndexOf(File.separator); - String snapshotUuid = snapshotPath.substring(index + 1); - index = snapshotUuid.lastIndexOf("."); - if (index != -1) { - snapshotUuid = snapshotUuid.substring(0, index); - } - return snapshotUuid; - } - - @Override - public Answer createVolumeFromSnapshot(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - DataTO srcData = cmd.getSrcTO(); - SnapshotObjectTO snapshot = (SnapshotObjectTO)srcData; - DataTO destData = cmd.getDestTO(); - PrimaryDataStoreTO pool = (PrimaryDataStoreTO)destData.getDataStore(); - VolumeObjectTO volume = (VolumeObjectTO)destData; - DataStoreTO imageStore = srcData.getDataStore(); - - if (!(imageStore instanceof NfsTO)) { - return new CopyCmdAnswer("unsupported protocol"); - } - - NfsTO nfsImageStore = (NfsTO)imageStore; - String primaryStorageNameLabel = pool.getUuid(); - String secondaryStorageUrl = nfsImageStore.getUrl(); - int wait = cmd.getWait(); - boolean result = false; - // Generic error message. - String details = null; - String volumeUUID = null; - - if (secondaryStorageUrl == null) { - details += " because the URL passed: " + secondaryStorageUrl + " is invalid."; - return new CopyCmdAnswer(details); - } - SR srcSr = null; - VDI destVdi = null; - try { - SR primaryStorageSR = hypervisorResource.getSRByNameLabelandHost(conn, primaryStorageNameLabel); - if (primaryStorageSR == null) { - throw new InternalErrorException("Could not create volume from snapshot because the primary Storage SR could not be created from the name label: " - + primaryStorageNameLabel); - } - String nameLabel = "cloud-" + UUID.randomUUID().toString(); - destVdi = createVdi(conn, nameLabel, primaryStorageSR, volume.getSize()); - volumeUUID = destVdi.getUuid(conn); - String snapshotInstallPath = snapshot.getPath(); - int index = snapshotInstallPath.lastIndexOf(File.separator); - String snapshotDirectory = snapshotInstallPath.substring(0, index); - String snapshotUuid = getSnapshotUuid(snapshotInstallPath); - - URI uri = new URI(secondaryStorageUrl); - srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), snapshotDirectory); - - String[] parents = snapshot.getParents(); - List<VDI> snapshotChains = new ArrayList<VDI>(); - if (parents != null) { - for(int i = 0; i < parents.length; i++) { - String snChainPath = parents[i]; - String uuid = getSnapshotUuid(snChainPath); - VDI chain = VDI.getByUuid(conn, uuid); - snapshotChains.add(chain); - } - } - - VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid); - snapshotChains.add(snapshotVdi); - - for(VDI snapChain : snapshotChains) { - Task task = snapChain.copyAsync2(conn, null, null, destVdi); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - } - - result = true; - destVdi = VDI.getByUuid(conn, volumeUUID); - VDI.Record vdir = destVdi.getRecord(conn); - VolumeObjectTO newVol = new VolumeObjectTO(); - newVol.setPath(volumeUUID); - newVol.setSize(vdir.virtualSize); - return new CopyCmdAnswer(newVol); - } catch (Types.XenAPIException e) { - details += " due to " + e.toString(); - s_logger.warn(details, e); - } catch (Exception e) { - details += " due to " + e.getMessage(); - s_logger.warn(details, e); - } finally { - if (srcSr != null) { - hypervisorResource.removeSR(conn, srcSr); - } - if (!result && destVdi != null) { - try { - destVdi.destroy(conn); - } catch (Exception e) { - s_logger.debug("destroy dest vdi failed", e); - } - } - } - if (!result) { - // Is this logged at a higher level? - s_logger.error(details); - } - - // In all cases return something. - return new CopyCmdAnswer(details); - } - - @Override - public Answer copyVolumeFromPrimaryToSecondary(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - VolumeObjectTO srcVolume = (VolumeObjectTO)cmd.getSrcTO(); - VolumeObjectTO destVolume = (VolumeObjectTO)cmd.getDestTO(); - int wait = cmd.getWait(); - DataStoreTO destStore = destVolume.getDataStore(); - - if (destStore instanceof NfsTO) { - SR secondaryStorage = null; - try { - NfsTO nfsStore = (NfsTO)destStore; - URI uri = new URI(nfsStore.getUrl()); - // Create the volume folder - if (!hypervisorResource.createSecondaryStorageFolder(conn, uri.getHost() + ":" + uri.getPath(), destVolume.getPath())) { - throw new InternalErrorException("Failed to create the volume folder."); - } - - // Create a SR for the volume UUID folder - secondaryStorage = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), destVolume.getPath()); - // Look up the volume on the source primary storage pool - VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath()); - // Copy the volume to secondary storage - Task task = srcVdi.copyAsync2(conn, secondaryStorage, null, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - VDI destVdi = Types.toVDI(task, conn); - String destVolumeUUID = destVdi.getUuid(conn); - - VolumeObjectTO newVol = new VolumeObjectTO(); - newVol.setPath(destVolume.getPath() + File.separator + destVolumeUUID + ".vhd"); - newVol.setSize(srcVolume.getSize()); - return new CopyCmdAnswer(newVol); - } catch (Exception e) { - s_logger.debug("Failed to copy volume to secondary: " + e.toString()); - return new CopyCmdAnswer("Failed to copy volume to secondary: " + e.toString()); - } finally { - hypervisorResource.removeSR(conn, secondaryStorage); - } - } - return new CopyCmdAnswer("unsupported protocol"); - } - - @Override - public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - DataTO srcData = cmd.getSrcTO(); - DataTO destData = cmd.getDestTO(); - int wait = cmd.getWait(); - VolumeObjectTO srcVolume = (VolumeObjectTO)srcData; - VolumeObjectTO destVolume = (VolumeObjectTO)destData; - PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)destVolume.getDataStore(); - DataStoreTO srcStore = srcVolume.getDataStore(); - - if (srcStore instanceof NfsTO) { - NfsTO nfsStore = (NfsTO)srcStore; - String volumePath = srcVolume.getPath(); - int index = volumePath.lastIndexOf("/"); - String volumeDirectory = volumePath.substring(0, index); - String volumeUuid = volumePath.substring(index + 1); - index = volumeUuid.indexOf("."); - if (index != -1) { - volumeUuid = volumeUuid.substring(0, index); - } - URI uri = null; - try { - uri = new URI(nfsStore.getUrl()); - } catch (Exception e) { - return new CopyCmdAnswer(e.toString()); - } - SR srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory); - try { - SR primaryStoragePool = hypervisorResource.getStorageRepository(conn, primaryStore.getUuid()); - VDI srcVdi = VDI.getByUuid(conn, volumeUuid); - Task task = srcVdi.copyAsync2(conn, primaryStoragePool, null, null); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - VDI destVdi = Types.toVDI(task, conn); - VolumeObjectTO newVol = new VolumeObjectTO(); - newVol.setPath(destVdi.getUuid(conn)); - newVol.setSize(srcVolume.getSize()); - - return new CopyCmdAnswer(newVol); - } catch (Exception e) { - String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString(); - s_logger.warn(msg, e); - return new CopyCmdAnswer(e.toString()); - } finally { - if (srcSr != null) { - hypervisorResource.removeSR(conn, srcSr); - } - } - } - - s_logger.debug("unsupported protocol"); - return new CopyCmdAnswer("unsupported protocol"); - } - - @Override - public Answer createTemplateFromSnapshot(CopyCommand cmd) { - Connection conn = hypervisorResource.getConnection(); - DataTO srcData = cmd.getSrcTO(); - DataTO destData = cmd.getDestTO(); - int wait = cmd.getWait(); - SnapshotObjectTO srcObj = (SnapshotObjectTO)srcData; - TemplateObjectTO destObj = (TemplateObjectTO)destData; - NfsTO srcStore = (NfsTO)srcObj.getDataStore(); - NfsTO destStore = (NfsTO)destObj.getDataStore(); - - URI srcUri = null; - URI destUri = null; - try { - srcUri = new URI(srcStore.getUrl()); - destUri = new URI(destStore.getUrl()); - } catch (Exception e) { - s_logger.debug("incorrect url", e); - return new CopyCmdAnswer("incorrect url" + e.toString()); - } - - String srcPath = srcObj.getPath(); - int index = srcPath.lastIndexOf("/"); - String srcDir = srcPath.substring(0, index); - String destDir = destObj.getPath(); - SR srcSr = null; - SR destSr = null; - VDI destVdi = null; - boolean result = false; - try { - srcSr = createFileSr(conn, srcUri.getHost() + ":" + srcUri.getPath(), srcDir); - - String destNfsPath = destUri.getHost() + ":" + destUri.getPath(); - String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes()); - mountNfs(conn, destUri.getHost() + ":" + destUri.getPath(), localDir); - makeDirectory(conn, localDir + "/" + destDir); - destSr = createFileSR(conn, localDir + "/" + destDir); - - String nameLabel = "cloud-" + UUID.randomUUID().toString(); - - String[] parents = srcObj.getParents(); - List<VDI> snapshotChains = new ArrayList<VDI>(); - if (parents != null) { - for(int i = 0; i < parents.length; i++) { - String snChainPath = parents[i]; - String uuid = getSnapshotUuid(snChainPath); - VDI chain = VDI.getByUuid(conn, uuid); - snapshotChains.add(chain); - } - } - String snapshotUuid = getSnapshotUuid(srcPath); - VDI snapshotVdi = VDI.getByUuid(conn, snapshotUuid); - snapshotChains.add(snapshotVdi); - - long templateVirtualSize = snapshotChains.get(0).getVirtualSize(conn); - destVdi = createVdi(conn, nameLabel, destSr, templateVirtualSize); - String destVdiUuid = destVdi.getUuid(conn); - - for(VDI snapChain : snapshotChains) { - Task task = snapChain.copyAsync2(conn, null, null, destVdi); - // poll every 1 seconds , - hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); - hypervisorResource.checkForSuccess(conn, task); - } - - destVdi = VDI.getByUuid(conn, destVdiUuid); - String templatePath = destDir + "/" + destVdiUuid + ".vhd"; - templatePath = templatePath.replaceAll("//","/"); - TemplateObjectTO newTemplate = new TemplateObjectTO(); - newTemplate.setPath(templatePath); - newTemplate.setFormat(Storage.ImageFormat.VHD); - newTemplate.setSize(destVdi.getVirtualSize(conn)); - newTemplate.setPhysicalSize(destVdi.getPhysicalUtilisation(conn)); - newTemplate.setName(destVdiUuid); - - result = true; - return new CopyCmdAnswer(newTemplate); - } catch (Exception e) { - s_logger.error("Failed create template from snapshot", e); - return new CopyCmdAnswer("Failed create template from snapshot " + e.toString()); - } finally { - if (!result) { - if (destVdi != null) { - try { - destVdi.destroy(conn); - } catch (Exception e) { - s_logger.debug("Clean up left over on dest storage failed: ", e); - } - } - } - - if (destSr != null) { - hypervisorResource.removeSR(conn, destSr); - } - - if (srcSr != null) { - hypervisorResource.removeSR(conn, srcSr); - } - } - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d68e13fc/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 new file mode 100644 index 0000000..e9c3f29 --- /dev/null +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/Xenserver625Resource.java @@ -0,0 +1,115 @@ +/* + * 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 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 com.xensource.xenapi.Connection; + +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; + +@Local(value=ServerResource.class) +public class Xenserver625Resource extends XenServerResourceNewBase { + private static final Logger s_logger = Logger.getLogger(Xenserver625Resource.class); + + public Xenserver625Resource() { + super(); + } + + @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); + } + + @Override + protected List<File> getPatchFiles() { + List<File> files = new ArrayList<File>(); + String patch = "scripts/vm/hypervisor/xenserver/xenserver62/patch"; + String patchfilePath = Script.findScript("", patch); + if (patchfilePath == null) { + throw new CloudRuntimeException("Unable to find patch file " + patch); + } + File file = new File(patchfilePath); + files.add(file); + return files; + } + + @Override + public long getStaticMax(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ + long recommendedValue = CitrixHelper.getXenServer625StaticMax(os, b); + if(recommendedValue == 0){ + s_logger.warn("No recommended value found for dynamic max, setting static max and dynamic max equal"); + return dynamicMaxRam; + } + long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS constraint for stability + if (dynamicMaxRam > staticMax){ // XS contraint that dynamic max <= static max + s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max "); + return dynamicMaxRam; + } + return staticMax; + } + + @Override + public long getStaticMin(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ + long recommendedValue = CitrixHelper.getXenServer625StaticMin(os, b); + if(recommendedValue == 0){ + s_logger.warn("No recommended value found for dynamic min"); + return dynamicMinRam; + } + + if(dynamicMinRam < recommendedValue){ // XS contraint that dynamic min > static min + s_logger.warn("Vm is set to dynamixMin " + dynamicMinRam + " less than the recommended static min " + recommendedValue + ", could lead to stability issues"); + } + return dynamicMinRam; + } + + @Override + protected StorageSubsystemCommandHandler getStorageHandler() { + XenServerStorageProcessor processor = new Xenserver625StorageProcessor(this); + return new StorageSubsystemCommandHandlerBase(processor); + } + + @Override + protected void umountSnapshotDir(Connection conn, Long dcId) { + + } + + +} \ No newline at end of file
