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

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


The following commit(s) were added to refs/heads/4.19 by this push:
     new 53aa92199b2 server: fix nfs version option during mount (#9559)
53aa92199b2 is described below

commit 53aa92199b2a71168140ae63267a9040f5330dd8
Author: Abhishek Kumar <[email protected]>
AuthorDate: Wed Sep 25 20:17:16 2024 +0530

    server: fix nfs version option during mount (#9559)
    
    Signed-off-by: Abhishek Kumar <[email protected]>
---
 .../upgrade/SystemVmTemplateRegistration.java      | 42 +++++++++++++++++-----
 .../java/com/cloud/storage/StorageManagerImpl.java |  8 +++--
 .../diagnostics/DiagnosticsServiceImpl.java        |  3 +-
 3 files changed, 42 insertions(+), 11 deletions(-)

diff --git 
a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java
 
b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java
index 1ee42674480..671fb8c95d5 100644
--- 
a/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java
+++ 
b/engine/schema/src/main/java/com/cloud/upgrade/SystemVmTemplateRegistration.java
@@ -49,8 +49,11 @@ import com.cloud.vm.dao.VMInstanceDaoImpl;
 import 
org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDaoImpl;
+import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDaoImpl;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDaoImpl;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
@@ -83,7 +86,6 @@ import java.util.stream.Collectors;
 
 public class SystemVmTemplateRegistration {
     private static final Logger LOGGER = 
Logger.getLogger(SystemVmTemplateRegistration.class);
-    private static final String MOUNT_COMMAND = "sudo mount -t nfs %s %s";
     private static final String UMOUNT_COMMAND = "sudo umount %s";
     private static final String RELATIVE_TEMPLATE_PATH = 
"./engine/schema/dist/systemvm-templates/";
     private static final String ABSOLUTE_TEMPLATE_PATH = 
"/usr/share/cloudstack-management/templates/systemvm/";
@@ -116,6 +118,8 @@ public class SystemVmTemplateRegistration {
     @Inject
     ImageStoreDao imageStoreDao;
     @Inject
+    ImageStoreDetailsDao imageStoreDetailsDao;
+    @Inject
     ClusterDao clusterDao;
     @Inject
     ConfigurationDao configurationDao;
@@ -129,6 +133,7 @@ public class SystemVmTemplateRegistration {
         templateDataStoreDao = new BasicTemplateDataStoreDaoImpl();
         vmInstanceDao = new VMInstanceDaoImpl();
         imageStoreDao = new ImageStoreDaoImpl();
+        imageStoreDetailsDao = new ImageStoreDetailsDaoImpl();
         clusterDao = new ClusterDaoImpl();
         configurationDao = new ConfigurationDaoImpl();
     }
@@ -141,6 +146,14 @@ public class SystemVmTemplateRegistration {
         this.systemVmTemplateVersion = systemVmTemplateVersion;
     }
 
+    public static String getMountCommand(String nfsVersion, String device, 
String dir) {
+        String cmd = "sudo mount -t nfs";
+        if (StringUtils.isNotBlank(nfsVersion)) {
+            cmd = String.format("%s -o vers=%s", cmd, nfsVersion);
+        }
+        return String.format("%s %s %s", cmd, device, dir);
+    }
+
     public String getSystemVmTemplateVersion() {
         if (StringUtils.isEmpty(systemVmTemplateVersion)) {
             return String.format("%s.%s", CS_MAJOR_VERSION, CS_TINY_VERSION);
@@ -319,14 +332,14 @@ public class SystemVmTemplateRegistration {
         }
     };
 
-    public static boolean validateIfSeeded(String url, String path) {
+    public static boolean validateIfSeeded(String url, String path, String 
nfsVersion) {
         String filePath = null;
         try {
             filePath = 
Files.createTempDirectory(TEMPORARY_SECONDARY_STORE).toString();
             if (filePath == null) {
                 throw new CloudRuntimeException("Failed to create temporary 
directory to mount secondary store");
             }
-            mountStore(url, filePath);
+            mountStore(url, filePath, nfsVersion);
             int lastIdx = path.lastIndexOf(File.separator);
             String partialDirPath = path.substring(0, lastIdx);
             String templatePath = filePath + File.separator + partialDirPath;
@@ -426,14 +439,13 @@ public class SystemVmTemplateRegistration {
         return new Pair<>(url, storeId);
     }
 
-    public static void mountStore(String storeUrl, String path) {
+    public static void mountStore(String storeUrl, String path, String 
nfsVersion) {
         try {
             if (storeUrl != null) {
                 URI uri = new URI(UriUtils.encodeURIComponent(storeUrl));
                 String host = uri.getHost();
                 String mountPath = uri.getPath();
-                String mount = String.format(MOUNT_COMMAND, host + ":" + 
mountPath, path);
-                Script.runSimpleBashScript(mount);
+                Script.runSimpleBashScript(getMountCommand(nfsVersion, host + 
":" + mountPath, path));
             }
         } catch (Exception e) {
             String msg = "NFS Store URL is not in the correct format";
@@ -772,7 +784,8 @@ public class SystemVmTemplateRegistration {
                                     throw new CloudRuntimeException("Failed to 
create temporary file path to mount the store");
                                 }
                                 Pair<String, Long> storeUrlAndId = 
getNfsStoreInZone(zoneId);
-                                mountStore(storeUrlAndId.first(), filePath);
+                                String nfsVersion = 
getNfsVersion(storeUrlAndId.second());
+                                mountStore(storeUrlAndId.first(), filePath, 
nfsVersion);
                                 List<String> hypervisorList = 
fetchAllHypervisors(zoneId);
                                 for (String hypervisor : hypervisorList) {
                                     Hypervisor.HypervisorType name = 
Hypervisor.HypervisorType.getType(hypervisor);
@@ -783,7 +796,7 @@ public class SystemVmTemplateRegistration {
                                         VMTemplateVO templateVO = 
vmTemplateDao.findById(templateId);
                                         TemplateDataStoreVO 
templateDataStoreVO = templateDataStoreDao.findByTemplate(templateId, 
DataStoreRole.Image);
                                         String installPath = 
templateDataStoreVO.getInstallPath();
-                                        if 
(validateIfSeeded(storeUrlAndId.first(), installPath)) {
+                                        if 
(validateIfSeeded(storeUrlAndId.first(), installPath, nfsVersion)) {
                                             continue;
                                         } else if (templateVO != null) {
                                             
registerTemplate(hypervisorAndTemplateName, storeUrlAndId, templateVO, 
templateDataStoreVO, filePath);
@@ -888,4 +901,17 @@ public class SystemVmTemplateRegistration {
             }
         });
     }
+
+    public String getNfsVersion(long storeId) {
+        final String configKey = "secstorage.nfs.version";
+        final Map<String, String> storeDetails = 
imageStoreDetailsDao.getDetails(storeId);
+        if (storeDetails != null && storeDetails.containsKey(configKey)) {
+            return storeDetails.get(configKey);
+        }
+        ConfigurationVO globalNfsVersion = 
configurationDao.findByName(configKey);
+        if (globalNfsVersion != null) {
+            return globalNfsVersion.getValue();
+        }
+        return null;
+    }
 }
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java 
b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 73b9ac8960d..f966098c959 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -391,6 +391,8 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
     ConfigDepot configDepot;
     @Inject
     ConfigurationDao configurationDao;
+    @Inject
+    private ImageStoreDetailsUtil imageStoreDetailsUtil;
 
     protected List<StoragePoolDiscoverer> _discoverers;
 
@@ -3425,6 +3427,7 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
                                 throw new CloudRuntimeException("Failed to 
create temporary file path to mount the store");
                             }
                             Pair<String, Long> storeUrlAndId = new Pair<>(url, 
store.getId());
+                            String nfsVersion = 
imageStoreDetailsUtil.getNfsVersion(store.getId());
                             for (HypervisorType hypervisorType : hypSet) {
                                 try {
                                     if (HypervisorType.Simulator == 
hypervisorType) {
@@ -3441,7 +3444,8 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
                                         templateVO = 
_templateStoreDao.findByTemplate(templateId, DataStoreRole.Image);
                                         if (templateVO != null) {
                                             try {
-                                                if 
(SystemVmTemplateRegistration.validateIfSeeded(url, 
templateVO.getInstallPath())) {
+                                                if 
(SystemVmTemplateRegistration.validateIfSeeded(
+                                                        url, 
templateVO.getInstallPath(), nfsVersion)) {
                                                     continue;
                                                 }
                                             } catch (Exception e) {
@@ -3449,7 +3453,7 @@ public class StorageManagerImpl extends ManagerBase 
implements StorageManager, C
                                             }
                                         }
                                     }
-                                    
SystemVmTemplateRegistration.mountStore(storeUrlAndId.first(), filePath);
+                                    
SystemVmTemplateRegistration.mountStore(storeUrlAndId.first(), filePath, 
nfsVersion);
                                     if (templateVO != null && vmTemplateVO != 
null) {
                                         
systemVmTemplateRegistration.registerTemplate(hypervisorAndTemplateName, 
storeUrlAndId, vmTemplateVO, templateVO, filePath);
                                     } else {
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 72f4a3c5b86..b4081333e87 100644
--- 
a/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
+++ 
b/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
@@ -480,7 +480,8 @@ public class DiagnosticsServiceImpl extends ManagerBase 
implements PluggableServ
 
         private void cleanupOldDiagnosticFiles(DataStore store) {
             String mountPoint = null;
-            mountPoint = 
serviceImpl.mountManager.getMountPoint(store.getUri(), null);
+            mountPoint = serviceImpl.mountManager.getMountPoint(store.getUri(),
+                    
serviceImpl.imageStoreDetailsUtil.getNfsVersion(store.getId()));
             if (StringUtils.isNotBlank(mountPoint)) {
                 File directory = new File(mountPoint + File.separator + 
DIAGNOSTICS_DIRECTORY);
                 if (directory.isDirectory()) {

Reply via email to