Repository: cloudstack Updated Branches: refs/heads/master 46e0a2506 -> 5c388a5c8
Add properties file in same folder as template Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5c388a5c Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5c388a5c Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5c388a5c Branch: refs/heads/master Commit: 5c388a5c8087d544ff89dccf20f8af88f8f73d1b Parents: 46e0a25 Author: Mike Tutkowski <mike.tutkow...@solidfire.com> Authored: Tue Nov 11 17:02:48 2014 -0700 Committer: Mike Tutkowski <mike.tutkow...@solidfire.com> Committed: Tue Nov 11 17:03:08 2014 -0700 ---------------------------------------------------------------------- .../resource/Xenserver625StorageProcessor.java | 64 +++++++++++++++++--- 1 file changed, 55 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5c388a5c/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java index 3529400..925d41f 100644 --- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java @@ -866,6 +866,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { @Override public Answer createTemplateFromSnapshot(CopyCommand cmd) { Connection conn = hypervisorResource.getConnection(); + DataTO srcData = cmd.getSrcTO(); DataTO destData = cmd.getDestTO(); @@ -874,18 +875,22 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { } 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()); } @@ -893,61 +898,95 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { 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++) { + 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) { + for (VDI snapChain : snapshotChains) { Task task = snapChain.copyAsync(conn, null, null, destVdi); // poll every 1 seconds , hypervisorResource.waitForTask(conn, task, 1000, wait * 1000); hypervisorResource.checkForSuccess(conn, task); + task.destroy(conn); } destVdi = VDI.getByUuid(conn, destVdiUuid); - String templatePath = destDir + "/" + destVdiUuid + ".vhd"; + + // scan makes XenServer pick up VDI physicalSize + destSr.scan(conn); + + String templateUuid = destVdi.getUuid(conn); + String templateFilename = templateUuid + ".vhd"; + long virtualSize = destVdi.getVirtualSize(conn); + long physicalSize = destVdi.getPhysicalUtilisation(conn); + + String templatePath = destNfsPath + "/" + destDir; + templatePath = templatePath.replaceAll("//","/"); + + result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null, + physicalSize, virtualSize, destObj.getId()); + + if (!result) { + throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir"); + } + TemplateObjectTO newTemplate = new TemplateObjectTO(); - newTemplate.setPath(templatePath); + + newTemplate.setPath(destDir + "/" + templateFilename); 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) { @@ -960,13 +999,13 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { } } - if (destSr != null) { - hypervisorResource.removeSR(conn, destSr); - } - if (srcSr != null) { hypervisorResource.removeSR(conn, srcSr); } + + if (destSr != null) { + hypervisorResource.removeSR(conn, destSr); + } } } @@ -1014,7 +1053,7 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { String destNfsPath = destUri.getHost() + ":" + destUri.getPath(); String localDir = "/var/cloud_mount/" + UUID.nameUUIDFromBytes(destNfsPath.getBytes()); - mountNfs(conn, destUri.getHost() + ":" + destUri.getPath(), localDir); + mountNfs(conn, destNfsPath, localDir); makeDirectory(conn, localDir + "/" + destDir); destSr = createFileSR(conn, localDir + "/" + destDir); @@ -1041,6 +1080,13 @@ public class Xenserver625StorageProcessor extends XenServerStorageProcessor { templatePath = templatePath.replaceAll("//", "/"); + result = hypervisorResource.postCreatePrivateTemplate(conn, templatePath, templateFilename, templateUuid, nameLabel, null, + physicalSize, virtualSize, templateObjTO.getId()); + + if (!result) { + throw new CloudRuntimeException("Could not create the template.properties file on secondary storage dir"); + } + TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(destDir + "/" + templateFilename);