diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs index 896a3247441..f8ca49e1927 100644 --- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs +++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/CloudStackTypes.cs @@ -301,20 +301,34 @@ namespace HypervResource { get { - if (String.IsNullOrEmpty(this.path)) + string fileName = null; + if (this.primaryDataStore != null) { - string fileName = null; - if (this.primaryDataStore.isLocal) + PrimaryDataStoreTO store = this.primaryDataStore; + if (store.isLocal) { - fileName = Path.Combine(this.primaryDataStore.Path, this.name); + fileName = Path.Combine(store.Path, this.name); } else { - fileName = @"\\" + this.primaryDataStore.uri.Host + this.primaryDataStore.uri.LocalPath + @"\" + this.name; + fileName = @"\\" + store.uri.Host + store.uri.LocalPath + @"\" + this.name; } - return fileName +'.' + this.format.ToLowerInvariant(); + fileName = fileName + '.' + this.format.ToLowerInvariant(); } - return this.path; + else if (this.nfsDataStoreTO != null) + { + NFSTO store = this.nfsDataStoreTO; + fileName = store.UncPath + @"\" + this.path + @"\" + this.name; + if (!this.format.Equals("RAW")) + { + fileName = fileName + '.' + this.format.ToLowerInvariant(); + } + } + else + { + fileName = this.path; + } + return Utils.NormalizePath(fileName); } } diff --git a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs index 35bce5d42f5..700b7da0d04 100644 --- a/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs +++ b/plugins/hypervisors/hyperv/DotNet/ServerResource/HypervResource/HypervResourceController.cs @@ -1262,13 +1262,22 @@ namespace HypervResource VolumeObjectTO destVolumeObjectTO = VolumeObjectTO.ParseJson(cmd.destTO); string destFile = null; - if (destTemplateObjectTO != null && destTemplateObjectTO.primaryDataStore != null) + if (destTemplateObjectTO != null) { - destFile = destTemplateObjectTO.FullFileName; - if (!destTemplateObjectTO.primaryDataStore.isLocal) + if (destTemplateObjectTO.primaryDataStore != null) { - PrimaryDataStoreTO primary = destTemplateObjectTO.primaryDataStore; - Utils.ConnectToRemote(primary.UncPath, primary.Domain, primary.User, primary.Password); + destFile = destTemplateObjectTO.FullFileName; + if (!destTemplateObjectTO.primaryDataStore.isLocal) + { + PrimaryDataStoreTO primary = destTemplateObjectTO.primaryDataStore; + Utils.ConnectToRemote(primary.UncPath, primary.Domain, primary.User, primary.Password); + } + } + else if (destTemplateObjectTO.nfsDataStoreTO != null) + { + destFile = destTemplateObjectTO.FullFileName; + NFSTO store = destTemplateObjectTO.nfsDataStoreTO; + Utils.ConnectToRemote(store.UncPath, store.Domain, store.User, store.Password); } } @@ -1428,6 +1437,38 @@ namespace HypervResource result = true; } } + else if (srcVolumeObjectTO != null && destTemplateObjectTO != null) + { + var guessedDestFile = destTemplateObjectTO.FullFileName; + if (File.Exists(guessedDestFile)) + { + logger.Info("Deleting existing file " + guessedDestFile); + File.Delete(guessedDestFile); + } + + destTemplateObjectTO.format = srcVolumeObjectTO.format; + destFile = destTemplateObjectTO.FullFileName; + if (File.Exists(destFile)) + { + logger.Info("Deleting existing file " + destFile); + File.Delete(destFile); + } + + string srcFile = srcVolumeObjectTO.FullFileName; + if (!File.Exists(srcFile)) + { + details = "Local template file missing from " + srcFile; + } + else + { + // Create the directory before copying the files. CreateDirectory + // doesn't do anything if the directory is already present. + Directory.CreateDirectory(Path.GetDirectoryName(destFile)); + File.Copy(srcFile, destFile); + newData = cmd.destTO; + result = true; + } + } else { details = "Data store combination not supported";