mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
server: fix nfs version option during mount (#9559)
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
This commit is contained in:
parent
2398b5c8c9
commit
53aa92199b
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user