You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by an...@apache.org on 2014/03/28 19:48:29 UTC
[2/2] git commit: updated refs/heads/4.4 to 9493b4d
change below file names for consistency
Xenserver625Resource.java -> XenServer625Resource.java
Xenserver625StorageProcessor.java -> XenServer625StorageProcessor.java
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9493b4d6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9493b4d6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9493b4d6
Branch: refs/heads/4.4
Commit: 9493b4d65cdf50a93913176fe69e63bb1a47e3d1
Parents: 61a0c12
Author: Anthony Xu <an...@citrix.com>
Authored: Fri Mar 28 11:46:26 2014 -0700
Committer: Anthony Xu <an...@citrix.com>
Committed: Fri Mar 28 11:46:26 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/9493b4d6/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..aad7ce1 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/9493b4d6/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..2d3d45b
--- /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) {
+
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9493b4d6/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
new file mode 100644
index 0000000..cb7a299
--- /dev/null
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer625StorageProcessor.java
@@ -0,0 +1,822 @@
+/*
+ * 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/9493b4d6/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 e9c3f29..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) {
-
- }
-
-
-}
\ No newline at end of file