From 5da21a9c2255a0243b664162b04086e02490a30b Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 20 Jan 2022 12:17:56 -0300 Subject: [PATCH 1/6] Add NFS version to mount command --- .../xenserver/resource/CitrixResourceBase.java | 11 ++++++++--- .../xenserver/resource/XenServerStorageProcessor.java | 4 ++++ .../resource/Xenserver625StorageProcessor.java | 3 ++- scripts/vm/hypervisor/xenserver/cloud-plugin-storage | 3 +++ 4 files changed, 17 insertions(+), 4 deletions(-) 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 a9715765bf72..b2254a494594 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 @@ -294,6 +294,8 @@ private static boolean isAlienVm(final VM vm, final Connection conn) throws XenA protected String _configDriveSRName = "ConfigDriveISOs"; public String _attachIsoDeviceNum = "3"; + protected String nfsVersion; + protected XenServerUtilitiesHelper xenServerUtilitiesHelper = new XenServerUtilitiesHelper(); protected int _wait; @@ -841,6 +843,9 @@ public boolean configure(final String name, final Map params) th value = (String)params.get("migratewait"); _migratewait = NumbersUtil.parseInt(value, 3600); + s_logger.debug("Checking NFS version is set"); + nfsVersion = (String) params.get("secstorage.nfs.version"); + _maxNics = NumbersUtil.parseInt((String)params.get("xenserver.nics.max"), 7); if (_pod == null) { @@ -5671,7 +5676,7 @@ public Answer copyDiagnosticsFileToSecondaryStorage(Connection conn, CopyToSecon 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 +5703,11 @@ public Answer copyDiagnosticsFileToSecondaryStorage(Connection conn, CopyToSecon } } - 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 a035eac30fbe..74fb75aba9fd 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 @@ -95,6 +95,10 @@ public class XenServerStorageProcessor implements StorageProcessor { protected final static String BASE_MOUNT_POINT_ON_REMOTE = "/var/cloud_mount/"; + protected String getNfsVersion() { + return hypervisorResource.nfsVersion; + } + public XenServerStorageProcessor(final CitrixResourceBase resource) { hypervisorResource = resource; } 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 7e2c701e51a1..cbf20cbb5dbc 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 @@ -77,7 +77,8 @@ private void mountNfs(Connection conn, String remoteDir, String localDir) { 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 nfsVersion = getNfsVersion(); + 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); diff --git a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage index 207d4f4800be..2599504c6326 100644 --- a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage +++ b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage @@ -238,6 +238,7 @@ def umount(localDir): def mountNfsSecondaryStorage(session, args): remoteDir = args['remoteDir'] localDir = args['localDir'] + nfsVersion = args['nfsVersion'] mounted = False f = open("/proc/mounts", 'r') for line in f: @@ -250,6 +251,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) From 3059c442f8b094966ba00612834d9b4d784fb401 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 21 Jan 2022 07:10:21 -0300 Subject: [PATCH 2/6] Remove extra line --- .../xenserver/resource/Xenserver625StorageProcessor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 cbf20cbb5dbc..4d1de2010ab5 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 @@ -77,8 +77,7 @@ private void mountNfs(Connection conn, String remoteDir, String localDir) { if (localDir == null) { localDir = BASE_MOUNT_POINT_ON_REMOTE + UUID.nameUUIDFromBytes(remoteDir.getBytes()); } - String nfsVersion = getNfsVersion(); - String result = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, "localDir", localDir, "remoteDir", remoteDir, "nfsVersion", nfsVersion); + String result = hypervisorResource.callHostPluginAsync(conn, "cloud-plugin-storage", "mountNfsSecondaryStorage", 100 * 1000, "localDir", localDir, "remoteDir", remoteDir, "nfsVersion", getNfsVersion()); if (StringUtils.isBlank(result)) { String errMsg = "Could not mount secondary storage " + remoteDir + " on host " + localDir; s_logger.warn(errMsg); From f2bf8de5ea53c34aeedc76c0cb4c2e93df98b880 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 21 Jan 2022 11:37:01 -0300 Subject: [PATCH 3/6] Extend NFS version to mount secondary storage --- .../xenserver/discoverer/XcpServerDiscoverer.java | 1 + .../xenserver/resource/CitrixResourceBase.java | 13 ++++++++----- .../vm/hypervisor/xenserver/cloud-plugin-storage | 1 + scripts/vm/hypervisor/xenserver/vmopsSnapshot | 13 +++++++++---- .../java/com/cloud/resource/DiscovererBase.java | 15 +++++++++++++++ 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index bbf3686750d7..4caabbebead5 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -363,6 +363,7 @@ protected boolean poolHasHotFix(Connection conn, String hostIp, String hotFixUui params.put(Config.XenServerHeartBeatInterval.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatInterval.toString())); params.put(Config.InstanceName.toString().toLowerCase(), _instance); details.put(Config.InstanceName.toString().toLowerCase(), _instance); + setSecondaryStorageNfsVersionToParams(zone.getId(), params); try { resource.configure("XenServer", params); } catch (ConfigurationException e) { 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 b2254a494594..d009b2c64713 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 @@ -52,6 +52,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import com.cloud.capacity.CapacityManager; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand; @@ -843,8 +844,10 @@ public boolean configure(final String name, final Map params) th value = (String)params.get("migratewait"); _migratewait = NumbersUtil.parseInt(value, 3600); - s_logger.debug("Checking NFS version is set"); - nfsVersion = (String) params.get("secstorage.nfs.version"); + nfsVersion = (String) params.get(CapacityManager.ImageStoreNFSVersion.key()); + if (org.apache.commons.lang3.StringUtils.isNotBlank(nfsVersion)) { + s_logger.debug("Setting image store NFS version = " + nfsVersion + " on host " + _name); + } _maxNics = NumbersUtil.parseInt((String)params.get("xenserver.nics.max"), 7); @@ -1116,7 +1119,7 @@ public VBD createPatchVbd(final Connection conn, final String vmName, final VM v } 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); + final String result = callHostPlugin(conn, "vmopsSnapshot", "create_secondary_storage_folder", "remoteMountPath", remoteMountPath, "newFolder", newFolder, "nfsVersion", nfsVersion); return result != null; } @@ -1488,7 +1491,7 @@ public VM createWorkingVM(final Connection conn, final String vmName, final Stri } 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); + final String details = callHostPlugin(conn, "vmopsSnapshot", "delete_secondary_storage_folder", "remoteMountPath", remoteMountPath, "folder", folder, "nfsVersion", nfsVersion); return details != null && details.equals("1"); } @@ -4118,7 +4121,7 @@ protected boolean postCreatePrivateTemplate(final Connection conn, final String } 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()) { diff --git a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage index 2599504c6326..bc909474dcbb 100644 --- a/scripts/vm/hypervisor/xenserver/cloud-plugin-storage +++ b/scripts/vm/hypervisor/xenserver/cloud-plugin-storage @@ -239,6 +239,7 @@ 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: diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot index 6b4693ca62eb..b74a8550e052 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/com/cloud/resource/DiscovererBase.java b/server/src/main/java/com/cloud/resource/DiscovererBase.java index ad32b9fda567..f63f118c826b 100644 --- a/server/src/main/java/com/cloud/resource/DiscovererBase.java +++ b/server/src/main/java/com/cloud/resource/DiscovererBase.java @@ -16,8 +16,10 @@ // under the License. package com.cloud.resource; +import com.cloud.capacity.CapacityManager; import com.cloud.configuration.Config; import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.host.HostVO; @@ -26,6 +28,8 @@ import com.cloud.utils.component.AdapterBase; import com.cloud.utils.net.UrlUtil; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.log4j.Logger; import javax.inject.Inject; @@ -51,6 +55,16 @@ public abstract class DiscovererBase extends AdapterBase implements Discoverer { protected ResourceManager _resourceMgr; @Inject protected DataCenterDao _dcDao; + @Inject + private ImageStoreDao imageStoreDao; + + protected void setSecondaryStorageNfsVersionToParams(Long zoneId, Map params) { + ImageStoreVO imageStoreInZone = imageStoreDao.findOneByZoneAndProtocol(zoneId, "nfs"); + String nfsVersion = imageStoreInZone != null ? + CapacityManager.ImageStoreNFSVersion.valueIn(imageStoreInZone.getId()) : + CapacityManager.ImageStoreNFSVersion.value(); + params.put(CapacityManager.ImageStoreNFSVersion.key(), nfsVersion); + } @Override public boolean configure(String name, Map params) throws ConfigurationException { @@ -139,6 +153,7 @@ protected HashMap buildConfigParams(HostVO host) { params.put(Config.XenServerHeartBeatInterval.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatInterval.toString())); params.put(Config.XenServerHeartBeatTimeout.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatTimeout.toString())); params.put("router.aggregation.command.each.timeout", _configDao.getValue(Config.RouterAggregationCommandEachTimeout.toString())); + setSecondaryStorageNfsVersionToParams(host.getDataCenterId(), params); return params; From ac2f9c0b49d926389b871b139026709dcdc3c477 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 21 Jan 2022 11:49:34 -0300 Subject: [PATCH 4/6] Unused import --- server/src/main/java/com/cloud/resource/DiscovererBase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/com/cloud/resource/DiscovererBase.java b/server/src/main/java/com/cloud/resource/DiscovererBase.java index f63f118c826b..be9fa86b173e 100644 --- a/server/src/main/java/com/cloud/resource/DiscovererBase.java +++ b/server/src/main/java/com/cloud/resource/DiscovererBase.java @@ -19,7 +19,6 @@ import com.cloud.capacity.CapacityManager; import com.cloud.configuration.Config; import com.cloud.dc.ClusterVO; -import com.cloud.dc.DataCenter; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.host.HostVO; From e88563adee0354ac897f68084fd9184801127d5f Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 26 Jan 2022 08:51:09 -0300 Subject: [PATCH 5/6] Refactor NFS version to be granular --- .../CopyToSecondaryStorageCommand.java | 8 ++- .../discoverer/XcpServerDiscoverer.java | 1 - .../resource/CitrixResourceBase.java | 15 ++--- .../resource/XenServerStorageProcessor.java | 22 ++++---- .../Xenserver625StorageProcessor.java | 55 +++++++++++-------- .../com/cloud/resource/DiscovererBase.java | 14 ----- .../diagnostics/DiagnosticsServiceImpl.java | 4 +- 7 files changed, 57 insertions(+), 62 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 8e76aad580f7..5cd4991c2871 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 String getFileName() { return fileName; } + public String getNfsVersion() { + return nfsVersion; + } + @Override public boolean executeInSequence() { return false; diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java index 4caabbebead5..bbf3686750d7 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java @@ -363,7 +363,6 @@ protected boolean poolHasHotFix(Connection conn, String hostIp, String hotFixUui params.put(Config.XenServerHeartBeatInterval.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatInterval.toString())); params.put(Config.InstanceName.toString().toLowerCase(), _instance); details.put(Config.InstanceName.toString().toLowerCase(), _instance); - setSecondaryStorageNfsVersionToParams(zone.getId(), params); try { resource.configure("XenServer", params); } catch (ConfigurationException e) { 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 d009b2c64713..9348bcaab9f2 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 @@ -52,7 +52,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import com.cloud.capacity.CapacityManager; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageAnswer; import org.apache.cloudstack.diagnostics.CopyToSecondaryStorageCommand; @@ -295,8 +294,6 @@ private static boolean isAlienVm(final VM vm, final Connection conn) throws XenA protected String _configDriveSRName = "ConfigDriveISOs"; public String _attachIsoDeviceNum = "3"; - protected String nfsVersion; - protected XenServerUtilitiesHelper xenServerUtilitiesHelper = new XenServerUtilitiesHelper(); protected int _wait; @@ -844,11 +841,6 @@ public boolean configure(final String name, final Map params) th value = (String)params.get("migratewait"); _migratewait = NumbersUtil.parseInt(value, 3600); - nfsVersion = (String) params.get(CapacityManager.ImageStoreNFSVersion.key()); - if (org.apache.commons.lang3.StringUtils.isNotBlank(nfsVersion)) { - s_logger.debug("Setting image store NFS version = " + nfsVersion + " on host " + _name); - } - _maxNics = NumbersUtil.parseInt((String)params.get("xenserver.nics.max"), 7); if (_pod == null) { @@ -1118,7 +1110,7 @@ public VBD createPatchVbd(final Connection conn, final String vmName, final VM v return cdromVBD; } - protected boolean createSecondaryStorageFolder(final Connection conn, final String remoteMountPath, final String 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; } @@ -1490,7 +1482,7 @@ public VM createWorkingVM(final Connection conn, final String vmName, final Stri return vm; } - protected boolean deleteSecondaryStorageFolder(final Connection conn, final String remoteMountPath, final String 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"); } @@ -4110,7 +4102,7 @@ protected void plugDom0Vif(final Connection conn, final VIF dom0Vif) throws XmlR } 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 = ""; @@ -5669,6 +5661,7 @@ public Answer copyDiagnosticsFileToSecondaryStorage(Connection conn, CopyToSecon String secondaryStorageUrl = cmd.getSecondaryStorageUrl(); String vmIP = cmd.getSystemVmIp(); String diagnosticsZipFile = cmd.getFileName(); + String nfsVersion = cmd.getNfsVersion(); String localDir = null; boolean success; 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 74fb75aba9fd..69f60c5f5438 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 @@ -95,10 +95,6 @@ public class XenServerStorageProcessor implements StorageProcessor { protected final static String BASE_MOUNT_POINT_ON_REMOTE = "/var/cloud_mount/"; - protected String getNfsVersion() { - return hypervisorResource.nfsVersion; - } - public XenServerStorageProcessor(final CitrixResourceBase resource) { hypervisorResource = resource; } @@ -920,8 +916,9 @@ public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) { 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."); } @@ -1183,6 +1180,7 @@ public Answer backupSnapshot(final CopyCommand cmd) { secondaryStorageUrl = cacheStore.getUrl(); destPath = destData.getPath(); } + String nfsVersion = cacheStore.getNfsVersion(); final SnapshotObjectTO snapshotTO = (SnapshotObjectTO) srcData; final SnapshotObjectTO snapshotOnImage = (SnapshotObjectTO) destData; @@ -1239,7 +1237,7 @@ public Answer backupSnapshot(final CopyCommand cmd) { 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); @@ -1353,6 +1351,7 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { 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(); @@ -1368,7 +1367,7 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { 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); @@ -1395,7 +1394,7 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { 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); } @@ -1415,7 +1414,7 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { 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); @@ -1469,7 +1468,8 @@ public Answer createTemplateFromSnapshot(final CopyCommand cmd) { 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); @@ -1504,7 +1504,7 @@ public Answer createTemplateFromSnapshot(final CopyCommand cmd) { 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 4d1de2010ab5..a31b597f89b3 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 Xenserver625StorageProcessor(final CitrixResourceBase resource) { 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, "nfsVersion", getNfsVersion()); + 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 @@ protected void unplugPbd(Connection conn, PBD pbd) { } } - 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 Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) { 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 Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) { volumeDirectory = volumePath.substring(0, index); } - srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory); + srcSr = createFileSr(conn, uri.getHost() + ":" + uri.getPath(), volumeDirectory, nfsVersion); final Set setVdis = srcSr.getVDIs(conn); @@ -416,7 +417,7 @@ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) { } 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 @@ protected String backupSnapshot(final Connection conn, final String primaryStora 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 Answer backupSnapshot(final CopyCommand cmd) { 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 Answer backupSnapshot(final CopyCommand cmd) { 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 Answer backupSnapshot(final CopyCommand cmd) { 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 Answer backupSnapshot(final CopyCommand cmd) { 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 Answer createTemplateFromVolume(final CopyCommand cmd) { 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 Answer createTemplateFromVolume(final CopyCommand cmd) { 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 Answer createTemplateFromVolume(final CopyCommand cmd) { 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 Answer createTemplateFromVolume(final CopyCommand cmd) { 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 Answer createTemplateFromVolume(final CopyCommand cmd) { 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 Answer createVolumeFromSnapshot(final CopyCommand cmd) { } 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 Answer createVolumeFromSnapshot(final CopyCommand cmd) { 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 snapshotChains = new ArrayList(); @@ -940,14 +944,15 @@ public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) { 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 Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) { 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 Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) { } 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 Answer createTemplateFromSnapshot(final CopyCommand cmd) { 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 Answer createTemplateFromSnapshot(final CopyCommand cmd) { 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 @@ private Answer createTemplateFromSnapshot2(final CopyCommand cmd) { 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 @@ private Answer createTemplateFromSnapshot2(final CopyCommand cmd) { 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/server/src/main/java/com/cloud/resource/DiscovererBase.java b/server/src/main/java/com/cloud/resource/DiscovererBase.java index be9fa86b173e..ad32b9fda567 100644 --- a/server/src/main/java/com/cloud/resource/DiscovererBase.java +++ b/server/src/main/java/com/cloud/resource/DiscovererBase.java @@ -16,7 +16,6 @@ // under the License. package com.cloud.resource; -import com.cloud.capacity.CapacityManager; import com.cloud.configuration.Config; import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; @@ -27,8 +26,6 @@ import com.cloud.utils.component.AdapterBase; import com.cloud.utils.net.UrlUtil; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.log4j.Logger; import javax.inject.Inject; @@ -54,16 +51,6 @@ public abstract class DiscovererBase extends AdapterBase implements Discoverer { protected ResourceManager _resourceMgr; @Inject protected DataCenterDao _dcDao; - @Inject - private ImageStoreDao imageStoreDao; - - protected void setSecondaryStorageNfsVersionToParams(Long zoneId, Map params) { - ImageStoreVO imageStoreInZone = imageStoreDao.findOneByZoneAndProtocol(zoneId, "nfs"); - String nfsVersion = imageStoreInZone != null ? - CapacityManager.ImageStoreNFSVersion.valueIn(imageStoreInZone.getId()) : - CapacityManager.ImageStoreNFSVersion.value(); - params.put(CapacityManager.ImageStoreNFSVersion.key(), nfsVersion); - } @Override public boolean configure(String name, Map params) throws ConfigurationException { @@ -152,7 +139,6 @@ protected HashMap buildConfigParams(HostVO host) { params.put(Config.XenServerHeartBeatInterval.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatInterval.toString())); params.put(Config.XenServerHeartBeatTimeout.toString().toLowerCase(), _configDao.getValue(Config.XenServerHeartBeatTimeout.toString())); params.put("router.aggregation.command.each.timeout", _configDao.getValue(Config.RouterAggregationCommandEachTimeout.toString())); - setSecondaryStorageNfsVersionToParams(host.getDataCenterId(), params); return params; 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 de370b3ae2b8..e00d898c1aa0 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 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 @@ private List getFileListToBeRetrieved(List optionalFileList, VMI } private Pair 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 copyAnswer; if (copyToSecondaryAnswer != null) { From ca2823150252c8f2e9e7448080d6a0cb9b90c27a Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 26 Jan 2022 09:01:44 -0300 Subject: [PATCH 6/6] Make use of the ConfigKey on the NFS version setting value --- .../image/NfsImageStoreDriverImpl.java | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) 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 aea792211dd6..6e5c979f111e 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 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); } }