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()) {