This is an automated email from the ASF dual-hosted git repository.

sureshanaparti pushed a commit to branch 4.16
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.16 by this push:
     new 3e92a63  [XenServer/XCP-ng] Pass the image store NFS version on 
storage commands (#5886)
3e92a63 is described below

commit 3e92a631558cecc63f968a0af58b0c788a039fce
Author: Nicolas Vazquez <[email protected]>
AuthorDate: Mon Jan 31 03:51:13 2022 -0300

    [XenServer/XCP-ng] Pass the image store NFS version on storage commands 
(#5886)
    
    * Add NFS version to mount command
    
    * Remove extra line
    
    * Extend NFS version to mount secondary storage
    
    * Unused import
    
    * Refactor NFS version to be granular
    
    * Make use of the ConfigKey on the NFS version setting value
---
 .../diagnostics/CopyToSecondaryStorageCommand.java |  8 +++-
 .../storage/image/NfsImageStoreDriverImpl.java     | 22 ++-------
 .../xenserver/resource/CitrixResourceBase.java     | 19 ++++----
 .../resource/XenServerStorageProcessor.java        | 18 ++++---
 .../resource/Xenserver625StorageProcessor.java     | 55 +++++++++++++---------
 .../vm/hypervisor/xenserver/cloud-plugin-storage   |  4 ++
 scripts/vm/hypervisor/xenserver/vmopsSnapshot      | 13 +++--
 .../diagnostics/DiagnosticsServiceImpl.java        |  4 +-
 8 files changed, 79 insertions(+), 64 deletions(-)

diff --git 
a/core/src/main/java/org/apache/cloudstack/diagnostics/CopyToSecondaryStorageCommand.java
 
b/core/src/main/java/org/apache/cloudstack/diagnostics/CopyToSecondaryStorageCommand.java
index 8e76aad..5cd4991 100644
--- 
a/core/src/main/java/org/apache/cloudstack/diagnostics/CopyToSecondaryStorageCommand.java
+++ 
b/core/src/main/java/org/apache/cloudstack/diagnostics/CopyToSecondaryStorageCommand.java
@@ -22,11 +22,13 @@ public class CopyToSecondaryStorageCommand extends 
StorageSubSystemCommand {
     private String secondaryStorageUrl;
     private String systemVmIp;
     private String fileName;
+    private String nfsVersion;
 
-    public CopyToSecondaryStorageCommand(String secondaryStorageUrl, String 
systemVmIp, String fileName) {
+    public CopyToSecondaryStorageCommand(String secondaryStorageUrl, String 
systemVmIp, String fileName, String nfsVersion) {
         this.secondaryStorageUrl = secondaryStorageUrl;
         this.systemVmIp = systemVmIp;
         this.fileName = fileName;
+        this.nfsVersion = nfsVersion;
     }
 
     public String getSecondaryStorageUrl() {
@@ -41,6 +43,10 @@ public class CopyToSecondaryStorageCommand extends 
StorageSubSystemCommand {
         return fileName;
     }
 
+    public String getNfsVersion() {
+        return nfsVersion;
+    }
+
     @Override
     public boolean executeInSequence() {
         return false;
diff --git 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
index aea7922..6e5c979 100755
--- 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
+++ 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
@@ -18,31 +18,15 @@
  */
 package org.apache.cloudstack.storage.image;
 
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
-
 import com.cloud.capacity.CapacityManager;
 
 public abstract class NfsImageStoreDriverImpl extends BaseImageStoreDriverImpl 
{
 
-    @Inject
-    ImageStoreDetailsDao _imageStoreDetailsDao;
-
     /**
-     * Retrieve NFS version to be used for imgStoreId store, if provided in 
image_store_details table
-     * @param imgStoreId store id
-     * @return "secstorage.nfs.version" associated value for imgStoreId in 
image_store_details table if exists, null if not
+     * Retrieve the NFS version to be used for the imgStoreId store
      */
-    protected String getNfsVersion(long imgStoreId){
-        Map<String, String> imgStoreDetails = 
_imageStoreDetailsDao.getDetails(imgStoreId);
-        String nfsVersionKey = CapacityManager.ImageStoreNFSVersion.key();
-        if (imgStoreDetails != null && 
imgStoreDetails.containsKey(nfsVersionKey)){
-            return imgStoreDetails.get(nfsVersionKey);
-        }
-        return null;
+    protected String getNfsVersion(long imgStoreId) {
+        return CapacityManager.ImageStoreNFSVersion.valueIn(imgStoreId);
     }
 
 }
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index a971576..9348bca 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -1110,8 +1110,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return cdromVBD;
     }
 
-    protected boolean createSecondaryStorageFolder(final Connection conn, 
final String remoteMountPath, final String newFolder) {
-        final String result = callHostPlugin(conn, "vmopsSnapshot", 
"create_secondary_storage_folder", "remoteMountPath", remoteMountPath, 
"newFolder", newFolder);
+    protected boolean createSecondaryStorageFolder(final Connection conn, 
final String remoteMountPath, final String newFolder, final String nfsVersion) {
+        final String result = callHostPlugin(conn, "vmopsSnapshot", 
"create_secondary_storage_folder", "remoteMountPath", remoteMountPath, 
"newFolder", newFolder, "nfsVersion", nfsVersion);
         return result != null;
     }
 
@@ -1482,8 +1482,8 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         return vm;
     }
 
-    protected boolean deleteSecondaryStorageFolder(final Connection conn, 
final String remoteMountPath, final String folder) {
-        final String details = callHostPlugin(conn, "vmopsSnapshot", 
"delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, 
"folder", folder);
+    protected boolean deleteSecondaryStorageFolder(final Connection conn, 
final String remoteMountPath, final String folder, final String nfsVersion) {
+        final String details = callHostPlugin(conn, "vmopsSnapshot", 
"delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, 
"folder", folder, "nfsVersion", nfsVersion);
         return details != null && details.equals("1");
     }
 
@@ -4102,7 +4102,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
     }
 
     protected boolean postCreatePrivateTemplate(final Connection conn, final 
String templatePath, final String tmpltFilename, final String templateName, 
String templateDescription, String checksum,
-            final long size, final long virtualSize, final long templateId) {
+            final long size, final long virtualSize, final long templateId, 
final String nfsVersion) {
 
         if (templateDescription == null) {
             templateDescription = "";
@@ -4113,7 +4113,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         }
 
         final String result = callHostPlugin(conn, "vmopsSnapshot", 
"post_create_private_template", "templatePath", templatePath, 
"templateFilename", tmpltFilename, "templateName", templateName,
-                "templateDescription", templateDescription, "checksum", 
checksum, "size", String.valueOf(size), "virtualSize", 
String.valueOf(virtualSize), "templateId", String.valueOf(templateId));
+                "templateDescription", templateDescription, "checksum", 
checksum, "size", String.valueOf(size), "virtualSize", 
String.valueOf(virtualSize), "templateId", String.valueOf(templateId), 
"nfsVersion", nfsVersion);
 
         boolean success = false;
         if (result != null && !result.isEmpty()) {
@@ -5661,6 +5661,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         String secondaryStorageUrl = cmd.getSecondaryStorageUrl();
         String vmIP = cmd.getSystemVmIp();
         String diagnosticsZipFile = cmd.getFileName();
+        String nfsVersion = cmd.getNfsVersion();
 
         String localDir = null;
         boolean success;
@@ -5671,7 +5672,7 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
             URI uri = new URI(secondaryStorageUrl);
             secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
             localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(secondaryStorageMountPath.getBytes());
-            String mountPoint = mountNfs(conn, secondaryStorageMountPath, 
localDir);
+            String mountPoint = mountNfs(conn, secondaryStorageMountPath, 
localDir, nfsVersion);
             if (org.apache.commons.lang.StringUtils.isBlank(mountPoint)) {
                 return new CopyToSecondaryStorageAnswer(cmd, false, "Could not 
mount secondary storage " + secondaryStorageMountPath + " on host " + localDir);
             }
@@ -5698,11 +5699,11 @@ public abstract class CitrixResourceBase implements 
ServerResource, HypervisorRe
         }
     }
 
-    private String mountNfs(Connection conn, String remoteDir, String 
localDir) {
+    private String mountNfs(Connection conn, String remoteDir, String 
localDir, String nfsVersion) {
         if (localDir == null) {
             localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(remoteDir.getBytes());
         }
-        return callHostPlugin(conn, "cloud-plugin-storage", 
"mountNfsSecondaryStorage", "localDir", localDir, "remoteDir", remoteDir);
+        return callHostPlugin(conn, "cloud-plugin-storage", 
"mountNfsSecondaryStorage", "localDir", localDir, "remoteDir", remoteDir, 
"nfsVersion", nfsVersion);
     }
 
     // Unmount secondary storage from host
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
index a035eac..69f60c5 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
@@ -916,8 +916,9 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             try {
                 final NfsTO nfsStore = (NfsTO) destStore;
                 final URI uri = new URI(nfsStore.getUrl());
+                final String nfsVersion = nfsStore.getNfsVersion();
                 // Create the volume folder
-                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
uri.getHost() + ":" + uri.getPath(), destVolume.getPath())) {
+                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
uri.getHost() + ":" + uri.getPath(), destVolume.getPath(), nfsVersion)) {
                     throw new InternalErrorException("Failed to create the 
volume folder.");
                 }
 
@@ -1179,6 +1180,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             secondaryStorageUrl = cacheStore.getUrl();
             destPath = destData.getPath();
         }
+        String nfsVersion = cacheStore.getNfsVersion();
 
         final SnapshotObjectTO snapshotTO = (SnapshotObjectTO) srcData;
         final SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO) destData;
@@ -1235,7 +1237,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             if (fullbackup) {
                 // the first snapshot is always a full snapshot
 
-                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, folder)) {
+                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, folder, nfsVersion)) {
                     details = " Filed to create folder " + folder + " in 
secondary storage";
                     s_logger.warn(details);
                     return new CopyCmdAnswer(details);
@@ -1349,6 +1351,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
         final TemplateObjectTO template = (TemplateObjectTO) cmd.getDestTO();
         final NfsTO destStore = (NfsTO) cmd.getDestTO().getDataStore();
         final int wait = cmd.getWait();
+        final String nfsVersion = destStore.getNfsVersion();
 
         final String secondaryStoragePoolURL = destStore.getUrl();
         final String volumeUUID = volume.getPath();
@@ -1364,7 +1367,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             final URI uri = new URI(secondaryStoragePoolURL);
             secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
             installPath = template.getPath();
-            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath)) {
+            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath, nfsVersion)) {
                 details = " Filed to create folder " + installPath + " in 
secondary storage";
                 s_logger.warn(details);
                 return new CopyCmdAnswer(details);
@@ -1391,7 +1394,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             final String templatePath = secondaryStorageMountPath + "/" + 
installPath;
             result =
                     hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, 
virtualSize,
-                            template.getId());
+                            template.getId(), nfsVersion);
             if (!result) {
                 throw new CloudRuntimeException("Could not create the 
template.properties file on secondary storage dir: " + tmpltURI);
             }
@@ -1411,7 +1414,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
                 hypervisorResource.removeSR(conn, tmpltSR);
             }
             if (secondaryStorageMountPath != null) {
-                hypervisorResource.deleteSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath);
+                hypervisorResource.deleteSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath, nfsVersion);
             }
             details = "Creating template from volume " + volumeUUID + " failed 
due to " + e.toString();
             s_logger.error(details, e);
@@ -1465,7 +1468,8 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
 
             final String destNfsPath = destUri.getHost() + ":" + 
destUri.getPath();
 
-            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
destNfsPath, destDir)) {
+            String destNfsVersion = destStore.getNfsVersion();
+            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
destNfsPath, destDir, destNfsVersion)) {
                 final String details = " Failed to create folder " + destDir + 
" in secondary storage";
 
                 s_logger.warn(details);
@@ -1500,7 +1504,7 @@ public class XenServerStorageProcessor implements 
StorageProcessor {
             templatePath = templatePath.replaceAll("//", "/");
 
             result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, templateFilename, templateUuid, userSpecifiedTemplateName, null,
-                    physicalSize, virtualSize, templateObjTO.getId());
+                    physicalSize, virtualSize, templateObjTO.getId(), 
destNfsVersion);
 
             if (!result) {
                 throw new CloudRuntimeException("Could not create the 
template.properties file on secondary storage dir: " + templateUri);
diff --git 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
index 7e2c701..a31b597 100644
--- 
a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
+++ 
b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
@@ -73,11 +73,11 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
         super(resource);
     }
 
-    private void mountNfs(Connection conn, String remoteDir, String localDir) {
+    private void mountNfs(Connection conn, String remoteDir, String localDir, 
String nfsVersion) {
         if (localDir == null) {
             localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(remoteDir.getBytes());
         }
-        String result = hypervisorResource.callHostPluginAsync(conn, 
"cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, "localDir", 
localDir, "remoteDir", remoteDir);
+        String result = hypervisorResource.callHostPluginAsync(conn, 
"cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, "localDir", 
localDir, "remoteDir", remoteDir, "nfsVersion", nfsVersion);
         if (StringUtils.isBlank(result)) {
             String errMsg = "Could not mount secondary storage " + remoteDir + 
" on host " + localDir;
             s_logger.warn(errMsg);
@@ -244,9 +244,9 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
         }
     }
 
-    protected SR createFileSr(Connection conn, String remotePath, String dir) {
+    protected SR createFileSr(Connection conn, String remotePath, String dir, 
String nfsVersion) {
         String localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(remotePath.getBytes());
-        mountNfs(conn, remotePath, localDir);
+        mountNfs(conn, remotePath, localDir, nfsVersion);
         return createFileSR(conn, localDir + "/" + dir);
     }
 
@@ -269,6 +269,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                 final String storeUrl = srcImageStore.getUrl();
                 final URI uri = new URI(storeUrl);
                 String volumePath = srcData.getPath();
+                String nfsVersion = srcImageStore.getNfsVersion();
 
                 volumePath = StringUtils.stripEnd(volumePath, "/");
 
@@ -282,7 +283,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                     volumeDirectory = volumePath.substring(0, index);
                 }
 
-                srcSr = createFileSr(conn, uri.getHost() + ":" + 
uri.getPath(), volumeDirectory);
+                srcSr = createFileSr(conn, uri.getHost() + ":" + 
uri.getPath(), volumeDirectory, nfsVersion);
 
                 final Set<VDI> setVdis = srcSr.getVDIs(conn);
 
@@ -416,7 +417,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
     }
 
     protected String backupSnapshot(final Connection conn, final String 
primaryStorageSRUuid, final String localMountPoint, final String path, final 
String secondaryStorageMountPath,
-            final String snapshotUuid, String prevBackupUuid, final String 
prevSnapshotUuid, final Boolean isISCSI, int wait) {
+            final String snapshotUuid, String prevBackupUuid, final String 
prevSnapshotUuid, final Boolean isISCSI, int wait, String nfsVersion) {
         boolean filesrcreated = false;
         // boolean copied = false;
 
@@ -427,7 +428,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
         final String remoteDir = secondaryStorageMountPath;
         try {
-            ssSR = createFileSr(conn, remoteDir, path);
+            ssSR = createFileSr(conn, remoteDir, path, nfsVersion);
             filesrcreated = true;
 
             final VDI snapshotvdi = VDI.getByUuid(conn, snapshotUuid);
@@ -509,6 +510,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             secondaryStorageUrl = cacheStore.getUrl();
             destPath = destData.getPath();
         }
+        String nfsVersion = cacheStore != null ? cacheStore.getNfsVersion() : 
null;
 
         final SnapshotObjectTO snapshotTO = (SnapshotObjectTO)srcData;
         final SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO)destData;
@@ -569,7 +571,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                 Task task = null;
                 try {
                     final String localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(secondaryStorageMountPath.getBytes());
-                    mountNfs(conn, secondaryStorageMountPath, localDir);
+                    mountNfs(conn, secondaryStorageMountPath, localDir, 
nfsVersion);
                     final boolean result = makeDirectory(conn, localDir + "/" 
+ folder);
                     if (!result) {
                         details = " Failed to create folder " + folder + " in 
secondary storage";
@@ -577,7 +579,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                         return new CopyCmdAnswer(details);
                     }
 
-                    snapshotSr = createFileSr(conn, secondaryStorageMountPath, 
folder);
+                    snapshotSr = createFileSr(conn, secondaryStorageMountPath, 
folder, nfsVersion);
 
                     task = snapshotVdi.copyAsync(conn, snapshotSr, null, null);
                     // poll every 1 seconds ,
@@ -649,7 +651,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                         throw new CloudRuntimeException("S3 upload of 
snapshots " + snapshotPaUuid + " failed");
                     }
                 } else {
-                    final String result = backupSnapshot(conn, 
primaryStorageSRUuid, localMountPoint, folder, secondaryStorageMountPath, 
snapshotUuid, prevBackupUuid, prevSnapshotUuid, isISCSI, wait);
+                    final String result = backupSnapshot(conn, 
primaryStorageSRUuid, localMountPoint, folder, secondaryStorageMountPath, 
snapshotUuid, prevBackupUuid, prevSnapshotUuid, isISCSI, wait, nfsVersion);
                     final String[] tmp = result.split("#");
                     snapshotBackupUuid = tmp[0];
                     physicalSize = Long.parseLong(tmp[1]);
@@ -695,6 +697,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
         final String secondaryStoragePoolURL = destStore.getUrl();
         final String volumeUUID = volume.getPath();
+        final String nfsVersion = destStore.getNfsVersion();
 
         final String userSpecifiedName = template.getName();
 
@@ -708,7 +711,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             final URI uri = new URI(secondaryStoragePoolURL);
             secondaryStorageMountPath = uri.getHost() + ":" + uri.getPath();
             installPath = template.getPath();
-            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath)) {
+            if (!hypervisorResource.createSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath, nfsVersion)) {
                 details = " Filed to create folder " + installPath + " in 
secondary storage";
                 s_logger.warn(details);
                 return new CopyCmdAnswer(details);
@@ -716,7 +719,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
             final VDI vol = getVDIbyUuid(conn, volumeUUID);
             // create template SR
-            tmpltSR = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), 
installPath);
+            tmpltSR = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), 
installPath, nfsVersion);
 
             // copy volume to template SR
             task = vol.copyAsync(conn, tmpltSR, null, null);
@@ -736,7 +739,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             final long physicalSize = tmpltVDI.getPhysicalUtilisation(conn);
             // create the template.properties file
             final String templatePath = secondaryStorageMountPath + "/" + 
installPath;
-            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, 
virtualSize, template.getId());
+            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, tmpltFilename, tmpltUUID, userSpecifiedName, null, physicalSize, 
virtualSize, template.getId(), nfsVersion);
             if (!result) {
                 throw new CloudRuntimeException("Could not create the 
template.properties file on secondary storage dir");
             }
@@ -756,7 +759,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
                 hypervisorResource.removeSR(conn, tmpltSR);
             }
             if (secondaryStorageMountPath != null) {
-                hypervisorResource.deleteSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath);
+                hypervisorResource.deleteSecondaryStorageFolder(conn, 
secondaryStorageMountPath, installPath, nfsVersion);
             }
             details = "Creating template from volume " + volumeUUID + " failed 
due to " + e.toString();
             s_logger.error(details, e);
@@ -805,6 +808,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
         }
 
         final NfsTO nfsImageStore = (NfsTO)imageStore;
+        final String nfsVersion = nfsImageStore.getNfsVersion();
         final String primaryStorageNameLabel = pool.getUuid();
         final String secondaryStorageUrl = nfsImageStore.getUrl();
         final int wait = cmd.getWait();
@@ -851,7 +855,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             final String snapshotUuid = getSnapshotUuid(snapshotInstallPath);
 
             final URI uri = new URI(secondaryStorageUrl);
-            srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), 
snapshotDirectory);
+            srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), 
snapshotDirectory, nfsVersion);
 
             final String[] parents = snapshot.getParents();
             final List<VDI> snapshotChains = new ArrayList<VDI>();
@@ -940,14 +944,15 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             Task task = null;
             try {
                 final NfsTO nfsStore = (NfsTO)destStore;
+                final String nfsVersion = nfsStore.getNfsVersion();
                 final URI uri = new URI(nfsStore.getUrl());
                 // Create the volume folder
-                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
uri.getHost() + ":" + uri.getPath(), destVolume.getPath())) {
+                if (!hypervisorResource.createSecondaryStorageFolder(conn, 
uri.getHost() + ":" + uri.getPath(), destVolume.getPath(), nfsVersion)) {
                     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());
+                secondaryStorage = createFileSr(conn, uri.getHost() + ":" + 
uri.getPath(), destVolume.getPath(), nfsVersion);
                 // Look up the volume on the source primary storage pool
                 final VDI srcVdi = getVDIbyUuid(conn, srcVolume.getPath());
                 // Copy the volume to secondary storage
@@ -992,6 +997,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
         if (srcStore instanceof NfsTO) {
             final NfsTO nfsStore = (NfsTO)srcStore;
+            final String nfsVersion = nfsStore.getNfsVersion();
             final String volumePath = srcVolume.getPath();
             int index = volumePath.lastIndexOf("/");
             final String volumeDirectory = volumePath.substring(0, index);
@@ -1006,7 +1012,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             } catch (final Exception e) {
                 return new CopyCmdAnswer(e.toString());
             }
-            final SR srcSr = createFileSr(conn, uri.getHost() + ":" + 
uri.getPath(), volumeDirectory);
+            final SR srcSr = createFileSr(conn, uri.getHost() + ":" + 
uri.getPath(), volumeDirectory, nfsVersion);
             Task task = null;
             try {
                 final SR primaryStoragePool = 
hypervisorResource.getStorageRepository(conn,
@@ -1089,12 +1095,14 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
         boolean result = false;
 
         try {
-            srcSr = createFileSr(conn, srcUri.getHost() + ":" + 
srcUri.getPath(), srcDir);
+            String srcNfsVersion = srcStore.getNfsVersion();
+            srcSr = createFileSr(conn, srcUri.getHost() + ":" + 
srcUri.getPath(), srcDir, srcNfsVersion);
 
             final String destNfsPath = destUri.getHost() + ":" + 
destUri.getPath();
             final String localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(destNfsPath.getBytes());
 
-            mountNfs(conn, destUri.getHost() + ":" + destUri.getPath(), 
localDir);
+            String destNfsVersion = destStore.getNfsVersion();
+            mountNfs(conn, destUri.getHost() + ":" + destUri.getPath(), 
localDir, destNfsVersion);
             makeDirectory(conn, localDir + "/" + destDir);
 
             destSr = createFileSR(conn, localDir + "/" + destDir);
@@ -1148,7 +1156,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
             templatePath = templatePath.replaceAll("//", "/");
 
-            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, 
virtualSize, destObj.getId());
+            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, 
virtualSize, destObj.getId(), destNfsVersion);
 
             if (!result) {
                 throw new CloudRuntimeException("Could not create the 
template.properties file on secondary storage dir");
@@ -1236,7 +1244,8 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
             final String destNfsPath = destUri.getHost() + ":" + 
destUri.getPath();
             final String localDir = BASE_MOUNT_POINT_ON_REMOTE + 
UUID.nameUUIDFromBytes(destNfsPath.getBytes());
 
-            mountNfs(conn, destNfsPath, localDir);
+            String nfsVersion = destStore.getNfsVersion();
+            mountNfs(conn, destNfsPath, localDir, nfsVersion);
             makeDirectory(conn, localDir + "/" + destDir);
 
             destSr = createFileSR(conn, localDir + "/" + destDir);
@@ -1263,7 +1272,7 @@ public class Xenserver625StorageProcessor extends 
XenServerStorageProcessor {
 
             templatePath = templatePath.replaceAll("//", "/");
 
-            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, 
virtualSize, templateObjTO.getId());
+            result = hypervisorResource.postCreatePrivateTemplate(conn, 
templatePath, templateFilename, templateUuid, nameLabel, null, physicalSize, 
virtualSize, templateObjTO.getId(), nfsVersion);
 
             if (!result) {
                 throw new CloudRuntimeException("Could not create the 
template.properties file on secondary storage dir");
diff --git a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage 
b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage
index 207d4f4..bc90947 100644
--- a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage
+++ b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage
@@ -238,6 +238,8 @@ def umount(localDir):
 def mountNfsSecondaryStorage(session, args):
     remoteDir = args['remoteDir']
     localDir  = args['localDir']
+    nfsVersion = args['nfsVersion']
+    logging.debug("mountNfsSecondaryStorage with params: " + str(args))
     mounted = False
     f = open("/proc/mounts", 'r')
     for line in f:
@@ -250,6 +252,8 @@ def mountNfsSecondaryStorage(session, args):
 
     makedirs(localDir)
     options = "soft,tcp,timeo=133,retrans=1"
+    if nfsVersion:
+        options += ",vers=" + nfsVersion
     try:
         cmd = ['mount', '-o', options, remoteDir, localDir]
         txt = util.pread2(cmd)
diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot 
b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
index 6b4693c..b74a855 100755
--- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot
+++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
@@ -68,7 +68,8 @@ def create_secondary_storage_folder(session, args):
             # Mount the remote resource folder locally
             remote_mount_path = args["remoteMountPath"]
             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid())
-            mount(remote_mount_path, local_mount_path)
+            nfsVersion = args["nfsVersion"]
+            mount(remote_mount_path, local_mount_path, nfsVersion)
 
             # Create the new folder
             new_folder = local_mount_path + "/" + args["newFolder"]
@@ -104,7 +105,8 @@ def delete_secondary_storage_folder(session, args):
             # Mount the remote resource folder locally
             remote_mount_path = args["remoteMountPath"]
             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid())
-            mount(remote_mount_path, local_mount_path)
+            nfsVersion = args["nfsVersion"]
+            mount(remote_mount_path, local_mount_path, nfsVersion)
 
             # Delete the specified folder
             folder = local_mount_path + "/" + args["folder"]
@@ -136,7 +138,8 @@ def post_create_private_template(session, args):
             # get local template folder 
             templatePath = args["templatePath"]
             local_mount_path = os.path.join(CLOUD_DIR, util.gen_uuid())
-            mount(templatePath, local_mount_path)
+            nfsVersion = args["nfsVersion"]
+            mount(templatePath, local_mount_path, nfsVersion)
             # Retrieve args
             filename = args["templateFilename"]
             name = args["templateName"]
@@ -307,9 +310,11 @@ def makedirs(path):
             raise xs_errors.XenError(errMsg)
     return
 
-def mount(remoteDir, localDir):
+def mount(remoteDir, localDir, nfsVersion=None):
     makedirs(localDir)
     options = "soft,tcp,timeo=133,retrans=1"
+    if nfsVersion:
+        options += ",vers=" + nfsVersion
     try: 
         cmd = ['mount', '-o', options, remoteDir, localDir]
         txt = util.pread2(cmd)
diff --git 
a/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
 
b/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
index de370b3..e00d898 100644
--- 
a/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
+++ 
b/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.capacity.CapacityManager;
 import 
org.apache.cloudstack.api.command.admin.diagnostics.GetDiagnosticsDataCmd;
 import org.apache.cloudstack.api.command.admin.diagnostics.RunDiagnosticsCmd;
 import org.apache.cloudstack.diagnostics.fileprocessor.DiagnosticsFilesList;
@@ -313,7 +314,8 @@ public class DiagnosticsServiceImpl extends ManagerBase 
implements PluggableServ
     }
 
     private Pair<Boolean, String> copyToSecondaryStorageNonVMware(final 
DataStore store, final String vmControlIp, String fileToCopy, Long vmHostId) {
-        CopyToSecondaryStorageCommand toSecondaryStorageCommand = new 
CopyToSecondaryStorageCommand(store.getUri(), vmControlIp, fileToCopy);
+        String nfsVersion = 
CapacityManager.ImageStoreNFSVersion.valueIn(store.getId());
+        CopyToSecondaryStorageCommand toSecondaryStorageCommand = new 
CopyToSecondaryStorageCommand(store.getUri(), vmControlIp, fileToCopy, 
nfsVersion);
         Answer copyToSecondaryAnswer = agentManager.easySend(vmHostId, 
toSecondaryStorageCommand);
         Pair<Boolean, String> copyAnswer;
         if (copyToSecondaryAnswer != null) {

Reply via email to