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.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
|
||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDaoImpl;
|
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.ImageStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreDaoImpl;
|
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.ImageStoreVO;
|
||||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
||||||
@ -83,7 +86,6 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
public class SystemVmTemplateRegistration {
|
public class SystemVmTemplateRegistration {
|
||||||
private static final Logger LOGGER = Logger.getLogger(SystemVmTemplateRegistration.class);
|
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 UMOUNT_COMMAND = "sudo umount %s";
|
||||||
private static final String RELATIVE_TEMPLATE_PATH = "./engine/schema/dist/systemvm-templates/";
|
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/";
|
private static final String ABSOLUTE_TEMPLATE_PATH = "/usr/share/cloudstack-management/templates/systemvm/";
|
||||||
@ -116,6 +118,8 @@ public class SystemVmTemplateRegistration {
|
|||||||
@Inject
|
@Inject
|
||||||
ImageStoreDao imageStoreDao;
|
ImageStoreDao imageStoreDao;
|
||||||
@Inject
|
@Inject
|
||||||
|
ImageStoreDetailsDao imageStoreDetailsDao;
|
||||||
|
@Inject
|
||||||
ClusterDao clusterDao;
|
ClusterDao clusterDao;
|
||||||
@Inject
|
@Inject
|
||||||
ConfigurationDao configurationDao;
|
ConfigurationDao configurationDao;
|
||||||
@ -129,6 +133,7 @@ public class SystemVmTemplateRegistration {
|
|||||||
templateDataStoreDao = new BasicTemplateDataStoreDaoImpl();
|
templateDataStoreDao = new BasicTemplateDataStoreDaoImpl();
|
||||||
vmInstanceDao = new VMInstanceDaoImpl();
|
vmInstanceDao = new VMInstanceDaoImpl();
|
||||||
imageStoreDao = new ImageStoreDaoImpl();
|
imageStoreDao = new ImageStoreDaoImpl();
|
||||||
|
imageStoreDetailsDao = new ImageStoreDetailsDaoImpl();
|
||||||
clusterDao = new ClusterDaoImpl();
|
clusterDao = new ClusterDaoImpl();
|
||||||
configurationDao = new ConfigurationDaoImpl();
|
configurationDao = new ConfigurationDaoImpl();
|
||||||
}
|
}
|
||||||
@ -141,6 +146,14 @@ public class SystemVmTemplateRegistration {
|
|||||||
this.systemVmTemplateVersion = systemVmTemplateVersion;
|
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() {
|
public String getSystemVmTemplateVersion() {
|
||||||
if (StringUtils.isEmpty(systemVmTemplateVersion)) {
|
if (StringUtils.isEmpty(systemVmTemplateVersion)) {
|
||||||
return String.format("%s.%s", CS_MAJOR_VERSION, CS_TINY_VERSION);
|
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;
|
String filePath = null;
|
||||||
try {
|
try {
|
||||||
filePath = Files.createTempDirectory(TEMPORARY_SECONDARY_STORE).toString();
|
filePath = Files.createTempDirectory(TEMPORARY_SECONDARY_STORE).toString();
|
||||||
if (filePath == null) {
|
if (filePath == null) {
|
||||||
throw new CloudRuntimeException("Failed to create temporary directory to mount secondary store");
|
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);
|
int lastIdx = path.lastIndexOf(File.separator);
|
||||||
String partialDirPath = path.substring(0, lastIdx);
|
String partialDirPath = path.substring(0, lastIdx);
|
||||||
String templatePath = filePath + File.separator + partialDirPath;
|
String templatePath = filePath + File.separator + partialDirPath;
|
||||||
@ -426,14 +439,13 @@ public class SystemVmTemplateRegistration {
|
|||||||
return new Pair<>(url, storeId);
|
return new Pair<>(url, storeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void mountStore(String storeUrl, String path) {
|
public static void mountStore(String storeUrl, String path, String nfsVersion) {
|
||||||
try {
|
try {
|
||||||
if (storeUrl != null) {
|
if (storeUrl != null) {
|
||||||
URI uri = new URI(UriUtils.encodeURIComponent(storeUrl));
|
URI uri = new URI(UriUtils.encodeURIComponent(storeUrl));
|
||||||
String host = uri.getHost();
|
String host = uri.getHost();
|
||||||
String mountPath = uri.getPath();
|
String mountPath = uri.getPath();
|
||||||
String mount = String.format(MOUNT_COMMAND, host + ":" + mountPath, path);
|
Script.runSimpleBashScript(getMountCommand(nfsVersion, host + ":" + mountPath, path));
|
||||||
Script.runSimpleBashScript(mount);
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
String msg = "NFS Store URL is not in the correct format";
|
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");
|
throw new CloudRuntimeException("Failed to create temporary file path to mount the store");
|
||||||
}
|
}
|
||||||
Pair<String, Long> storeUrlAndId = getNfsStoreInZone(zoneId);
|
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);
|
List<String> hypervisorList = fetchAllHypervisors(zoneId);
|
||||||
for (String hypervisor : hypervisorList) {
|
for (String hypervisor : hypervisorList) {
|
||||||
Hypervisor.HypervisorType name = Hypervisor.HypervisorType.getType(hypervisor);
|
Hypervisor.HypervisorType name = Hypervisor.HypervisorType.getType(hypervisor);
|
||||||
@ -783,7 +796,7 @@ public class SystemVmTemplateRegistration {
|
|||||||
VMTemplateVO templateVO = vmTemplateDao.findById(templateId);
|
VMTemplateVO templateVO = vmTemplateDao.findById(templateId);
|
||||||
TemplateDataStoreVO templateDataStoreVO = templateDataStoreDao.findByTemplate(templateId, DataStoreRole.Image);
|
TemplateDataStoreVO templateDataStoreVO = templateDataStoreDao.findByTemplate(templateId, DataStoreRole.Image);
|
||||||
String installPath = templateDataStoreVO.getInstallPath();
|
String installPath = templateDataStoreVO.getInstallPath();
|
||||||
if (validateIfSeeded(storeUrlAndId.first(), installPath)) {
|
if (validateIfSeeded(storeUrlAndId.first(), installPath, nfsVersion)) {
|
||||||
continue;
|
continue;
|
||||||
} else if (templateVO != null) {
|
} else if (templateVO != null) {
|
||||||
registerTemplate(hypervisorAndTemplateName, storeUrlAndId, templateVO, templateDataStoreVO, filePath);
|
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;
|
ConfigDepot configDepot;
|
||||||
@Inject
|
@Inject
|
||||||
ConfigurationDao configurationDao;
|
ConfigurationDao configurationDao;
|
||||||
|
@Inject
|
||||||
|
private ImageStoreDetailsUtil imageStoreDetailsUtil;
|
||||||
|
|
||||||
protected List<StoragePoolDiscoverer> _discoverers;
|
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");
|
throw new CloudRuntimeException("Failed to create temporary file path to mount the store");
|
||||||
}
|
}
|
||||||
Pair<String, Long> storeUrlAndId = new Pair<>(url, store.getId());
|
Pair<String, Long> storeUrlAndId = new Pair<>(url, store.getId());
|
||||||
|
String nfsVersion = imageStoreDetailsUtil.getNfsVersion(store.getId());
|
||||||
for (HypervisorType hypervisorType : hypSet) {
|
for (HypervisorType hypervisorType : hypSet) {
|
||||||
try {
|
try {
|
||||||
if (HypervisorType.Simulator == hypervisorType) {
|
if (HypervisorType.Simulator == hypervisorType) {
|
||||||
@ -3441,7 +3444,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
templateVO = _templateStoreDao.findByTemplate(templateId, DataStoreRole.Image);
|
templateVO = _templateStoreDao.findByTemplate(templateId, DataStoreRole.Image);
|
||||||
if (templateVO != null) {
|
if (templateVO != null) {
|
||||||
try {
|
try {
|
||||||
if (SystemVmTemplateRegistration.validateIfSeeded(url, templateVO.getInstallPath())) {
|
if (SystemVmTemplateRegistration.validateIfSeeded(
|
||||||
|
url, templateVO.getInstallPath(), nfsVersion)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} 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) {
|
if (templateVO != null && vmTemplateVO != null) {
|
||||||
systemVmTemplateRegistration.registerTemplate(hypervisorAndTemplateName, storeUrlAndId, vmTemplateVO, templateVO, filePath);
|
systemVmTemplateRegistration.registerTemplate(hypervisorAndTemplateName, storeUrlAndId, vmTemplateVO, templateVO, filePath);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -480,7 +480,8 @@ public class DiagnosticsServiceImpl extends ManagerBase implements PluggableServ
|
|||||||
|
|
||||||
private void cleanupOldDiagnosticFiles(DataStore store) {
|
private void cleanupOldDiagnosticFiles(DataStore store) {
|
||||||
String mountPoint = null;
|
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)) {
|
if (StringUtils.isNotBlank(mountPoint)) {
|
||||||
File directory = new File(mountPoint + File.separator + DIAGNOSTICS_DIRECTORY);
|
File directory = new File(mountPoint + File.separator + DIAGNOSTICS_DIRECTORY);
|
||||||
if (directory.isDirectory()) {
|
if (directory.isDirectory()) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user