From 0bc1b2727ae80f60518d091410f7538a67161233 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 22 Jan 2016 16:39:47 -0200 Subject: [PATCH 01/10] CLOUDSTACK-9252: Add nfs version to commands --- .../cloud/agent/api/GetStorageStatsCommand.java | 14 ++++++++++++++ .../cloud/agent/api/SecStorageSetupCommand.java | 9 +++++++++ .../agent/api/storage/ListTemplateCommand.java | 10 ++++++++++ .../storage/image/TemplateServiceImpl.java | 16 +++++++++++++++- .../SecondaryStorageManagerImpl.java | 16 ++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) diff --git a/core/src/com/cloud/agent/api/GetStorageStatsCommand.java b/core/src/com/cloud/agent/api/GetStorageStatsCommand.java index 23e8f9e3e55d..84b54264511c 100644 --- a/core/src/com/cloud/agent/api/GetStorageStatsCommand.java +++ b/core/src/com/cloud/agent/api/GetStorageStatsCommand.java @@ -30,6 +30,7 @@ public class GetStorageStatsCommand extends Command { private StoragePoolType pooltype; private String secUrl; private DataStoreTO store; + private String nfsVersion; public String getSecUrl() { return secUrl; @@ -54,6 +55,11 @@ public GetStorageStatsCommand(DataStoreTO store) { this.store = store; } + public GetStorageStatsCommand(DataStoreTO store, String nfsVersion) { + this.store = store; + this.nfsVersion = nfsVersion; + } + public GetStorageStatsCommand(String secUrl) { this.secUrl = secUrl; } @@ -81,6 +87,14 @@ public DataStoreTO getStore() { return this.store; } + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } + @Override public boolean executeInSequence() { return false; diff --git a/core/src/com/cloud/agent/api/SecStorageSetupCommand.java b/core/src/com/cloud/agent/api/SecStorageSetupCommand.java index 28e55c2f4efc..316e4698dc50 100644 --- a/core/src/com/cloud/agent/api/SecStorageSetupCommand.java +++ b/core/src/com/cloud/agent/api/SecStorageSetupCommand.java @@ -28,6 +28,7 @@ public class SecStorageSetupCommand extends Command { private String secUrl; private KeystoreManager.Certificates certs; private String postUploadKey; + private String nfsVersion; public SecStorageSetupCommand() { @@ -74,4 +75,12 @@ public String getPostUploadKey() { public void setPostUploadKey(String postUploadKey) { this.postUploadKey = postUploadKey; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java b/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java index 855095280d7d..bacc83aea50a 100644 --- a/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java +++ b/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java @@ -23,6 +23,7 @@ public class ListTemplateCommand extends StorageCommand { private DataStoreTO store; + private String nfsVersion; //private String secUrl; @@ -34,6 +35,11 @@ public ListTemplateCommand(DataStoreTO store) { // this.secUrl = url; } + public ListTemplateCommand(DataStoreTO store, String nfsVersion) { + this.store = store; + this.nfsVersion = nfsVersion; + } + @Override public boolean executeInSequence() { return true; @@ -43,6 +49,10 @@ public DataStoreTO getDataStore() { return store; } + public String getNfsVersion() { + return nfsVersion; + } + // public String getSecUrl() { // return secUrl; // } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index 9ab35953711d..cbfcb42668d9 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -56,6 +56,7 @@ import org.apache.cloudstack.storage.command.DeleteCommand; import org.apache.cloudstack.storage.datastore.DataObjectManager; import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; @@ -135,6 +136,8 @@ public class TemplateServiceImpl implements TemplateService { ConfigurationDao _configDao; @Inject StorageCacheManager _cacheMgr; + @Inject + ImageStoreDetailsDao _imageStoreDetailsDao; class TemplateOpContext extends AsyncRpcContext { final TemplateObject template; @@ -564,7 +567,7 @@ public void associateCrosszoneTemplatesToZone(long dcId) { } private Map listTemplate(DataStore ssStore) { - ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO()); + ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), getNfsVersion(ssStore.getId())); EndPoint ep = _epSelector.select(ssStore); Answer answer = null; if (ep == null) { @@ -586,6 +589,17 @@ private Map listTemplate(DataStore ssStore) { return null; } + private String getNfsVersion(long storeId) { + String nfsVersion = null; + if (_imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } + protected Void createTemplateCallback(AsyncCallbackDispatcher callback, TemplateOpContext context) { TemplateObject template = context.getTemplate(); AsyncCompletionCallback parentCallback = context.getParentCallback(); diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index 4891b71967ac..1ae5d5b30424 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -39,6 +39,7 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.security.keystore.KeystoreManager; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; @@ -236,6 +237,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar @Inject ImageStoreDao _imageStoreDao; @Inject + ImageStoreDetailsDao _imageStoreDetailsDao; + @Inject TemplateDataStoreDao _tmplStoreDao; @Inject VolumeDataStoreDao _volumeStoreDao; @@ -310,6 +313,8 @@ public boolean generateSetupCommand(Long ssHostId) { setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); } + setupCmd.setNfsVersion(getNfsVersion(ssStore.getId())); + //template/volume file upload key String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); setupCmd.setPostUploadKey(postUploadKey); @@ -358,6 +363,17 @@ else if( cssHost.getType() == Host.Type.SecondaryStorage ) { return true; } + private String getNfsVersion(long storeId) { + String nfsVersion = null; + if (_imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } + @Override public boolean generateVMSetupCommand(Long ssAHostId) { HostVO ssAHost = _hostDao.findById(ssAHostId); From e524f6557033f92da7cf9c099662630580b6a9e5 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 22 Jan 2016 16:41:23 -0200 Subject: [PATCH 02/10] CLOUDSTACK-9252: Support configurable nfs version --- .../cloud/resource/AgentStorageResource.java | 2 +- .../vmware/manager/VmwareManager.java | 4 +- .../vmware/manager/VmwareManagerImpl.java | 34 ++++++-- .../manager/VmwareStorageManagerImpl.java | 16 ++-- .../vmware/manager/VmwareStorageMount.java | 2 +- .../vmware/resource/VmwareResource.java | 18 +++-- ...VmwareSecondaryStorageResourceHandler.java | 4 +- .../resource/VmwareStorageProcessor.java | 14 ++-- .../VmwareStorageSubsystemCommandHandler.java | 6 +- .../vmware/VmwareDatacenterApiUnitTest.java | 6 ++ .../src/com/cloud/server/StatsCollector.java | 16 +++- .../LocalNfsSecondaryStorageResource.java | 8 +- .../LocalSecondaryStorageResource.java | 2 +- .../resource/NfsSecondaryStorageResource.java | 79 ++++++++++++------- .../resource/SecondaryStorageResource.java | 2 +- .../storage/template/DownloadManagerImpl.java | 2 +- .../NfsSecondaryStorageResourceTest.java | 2 +- 17 files changed, 144 insertions(+), 73 deletions(-) diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java index 751da9e3d2a3..9b1f091db71b 100644 --- a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java +++ b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java @@ -109,7 +109,7 @@ public boolean configure(String name, Map params) throws Configu } @Override - public String getRootDir(String url) { + public String getRootDir(String url, String nfsVersion) { // TODO Auto-generated method stub return null; } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java index 72ee2184e399..65590500a07f 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java @@ -36,7 +36,7 @@ public interface VmwareManager { String getSystemVMDefaultNicAdapterType(); - void prepareSecondaryStorageStore(String strStorageUrl); + void prepareSecondaryStorageStore(String strStorageUrl, Long storeId); void setupResourceStartupParams(Map params); @@ -48,7 +48,7 @@ public interface VmwareManager { String getManagementPortGroupName(); - String getSecondaryStorageStoreUrl(long dcId); + Pair getSecondaryStorageStoreUrlAndId(long dcId); File getSystemVMKeyFile(); diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 575801fa6034..602a5444858a 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -46,6 +46,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.agent.AgentManager; @@ -167,6 +168,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private ManagementServerHostPeerDao _mshostPeerDao; @Inject private ClusterManager _clusterMgr; + @Inject + private ImageStoreDetailsDao _imageDetailsStoreDao; private String _mountParent; private StorageLayer _storage; @@ -439,12 +442,14 @@ public List addHostToPodCluster(VmwareContext serviceCon } @Override - public String getSecondaryStorageStoreUrl(long dcId) { + public Pair getSecondaryStorageStoreUrlAndId(long dcId) { String secUrl = null; + Long secId = null; DataStore secStore = _dataStoreMgr.getImageStore(dcId); if (secStore != null) { secUrl = secStore.getUri(); + secId = secStore.getId(); } if (secUrl == null) { @@ -453,12 +458,13 @@ public String getSecondaryStorageStoreUrl(long dcId) { DataStore cacheStore = _dataStoreMgr.getImageCacheStore(dcId); if (cacheStore != null) { secUrl = cacheStore.getUri(); + secId = cacheStore.getId(); } else { s_logger.warn("No staging storage is found when non-NFS secondary storage is used"); } } - return secUrl; + return new Pair(secUrl, secId); } @Override @@ -546,8 +552,17 @@ public boolean needRecycle(String workerTag) { } @Override - public void prepareSecondaryStorageStore(String storageUrl) { - String mountPoint = getMountPoint(storageUrl); + public void prepareSecondaryStorageStore(String storageUrl, Long storeId) { + String nfsVersion = null; + if (storeId != null){ + Map details = _imageDetailsStoreDao.getDetails(storeId); + for (String detailKey : details.keySet()) { + if (detailKey.equals("nfs.version")){ + nfsVersion = details.get(detailKey); + } + } + } + String mountPoint = getMountPoint(storageUrl, nfsVersion); GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm"); try { @@ -655,7 +670,7 @@ public void run() { } @Override - public String getMountPoint(String storageUrl) { + public String getMountPoint(String storageUrl, String nfsVersion) { String mountPoint = null; synchronized (_storageMounts) { mountPoint = _storageMounts.get(storageUrl); @@ -670,7 +685,8 @@ public String getMountPoint(String storageUrl) { s_logger.error("Invalid storage URL format ", e); throw new CloudRuntimeException("Unable to create mount point due to invalid storage URL format " + storageUrl); } - mountPoint = mount(uri.getHost() + ":" + uri.getPath(), _mountParent); + + mountPoint = mount(uri.getHost() + ":" + uri.getPath(), _mountParent, nfsVersion); if (mountPoint == null) { s_logger.error("Unable to create mount point for " + storageUrl); return "/mnt/sec"; // throw new CloudRuntimeException("Unable to create mount point for " + storageUrl); @@ -745,7 +761,7 @@ private void shutdownCleanup() { } } - protected String mount(String path, String parent) { + protected String mount(String path, String parent, String nfsVersion) { String mountPoint = setupMountPoint(parent); if (mountPoint == null) { s_logger.warn("Unable to create a mount point"); @@ -756,6 +772,9 @@ protected String mount(String path, String parent) { String result = null; Script command = new Script(true, "mount", _timeout, s_logger); command.add("-t", "nfs"); + if (nfsVersion != null){ + command.add("-o", "vers=" + nfsVersion); + } // command.add("-o", "soft,timeo=133,retrans=2147483647,tcp,acdirmax=0,acdirmin=0"); if ("Mac OS X".equalsIgnoreCase(System.getProperty("os.name"))) { command.add("-o", "resvport"); @@ -1234,4 +1253,5 @@ public boolean hasNexusVSM(Long clusterId) { return true; } } + } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index 4109ff2345b9..f87fe6c4a816 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -156,7 +156,7 @@ public String createOvaForTemplate(TemplateObjectTO template) { String secStorageUrl = nfsStore.getUrl(); assert (secStorageUrl != null); String installPath = template.getPath(); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String installFullPath = secondaryMountPoint + "/" + installPath; try { if (installFullPath.endsWith(".ova")) { @@ -194,7 +194,7 @@ public String createOvaForVolume(VolumeObjectTO volume) { String installPath = volume.getPath(); int index = installPath.lastIndexOf(File.separator); String volumeUuid = installPath.substring(index + 1); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); //The real volume path String volumePath = installPath + File.separator + volumeUuid + ".ova"; String installFullPath = secondaryMountPoint + "/" + installPath; @@ -547,7 +547,7 @@ private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage + ", templateName: " + templateName); - String secondaryMountPoint = _mountService.getMountPoint(secondaryStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secondaryStorageUrl, null); s_logger.info("Secondary storage mount point: " + secondaryMountPoint); String srcOVAFileName = secondaryMountPoint + "/" + templatePathAtSecondaryStorage + templateName + "." + ImageFormat.OVA.getFileExtension(); @@ -600,7 +600,7 @@ private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, private Ternary createTemplateFromVolume(VirtualMachineMO vmMo, long accountId, long templateId, String templateUniqueName, String secStorageUrl, String volumePath, String workerVmName) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installFullPath = secondaryMountPoint + "/" + installPath; synchronized (installPath.intern()) { @@ -665,7 +665,7 @@ private Ternary createTemplateFromVolume(VirtualMachineMO vm private Ternary createTemplateFromSnapshot(long accountId, long templateId, String templateUniqueName, String secStorageUrl, long volumeId, String backedUpSnapshotUuid) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installFullPath = secondaryMountPoint + "/" + installPath; String installFullOVAName = installFullPath + "/" + templateUniqueName + ".ova"; //Note: volss for tmpl @@ -856,7 +856,7 @@ private String createVolumeFromSnapshot(VmwareHypervisorHost hyperHost, Datastor private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, String backupName) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String srcOVAFileName = secondaryMountPoint + "/" + secStorageDir + "/" + backupName + "." + ImageFormat.OVA.getFileExtension(); String snapshotDir = ""; if (backupName.contains("/")) { @@ -924,7 +924,7 @@ private String backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, long acco private void exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName, String workerVmName) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; synchronized (exportPath.intern()) { @@ -1446,7 +1446,7 @@ public RevertToVMSnapshotAnswer execute(VmwareHostService hostService, RevertToV } private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); String volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId); return deleteDir(volumeMountRoot); diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java index dd07029766c4..54b52f6dff4c 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java @@ -17,5 +17,5 @@ package com.cloud.hypervisor.vmware.manager; public interface VmwareStorageMount { - String getMountPoint(String storageUrl); + String getMountPoint(String storageUrl, String nfsVersion); } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index fdbc244997d0..56f929824c34 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -1636,12 +1636,14 @@ protected StartAnswer execute(StartCommand cmd) { // prepare systemvm patch ISO if (vmSpec.getType() != VirtualMachine.Type.User) { // attach ISO (for patching of system VM) - String secStoreUrl = mgr.getSecondaryStorageStoreUrl(Long.parseLong(_dcId)); + Pair secStoreUrlAndId = mgr.getSecondaryStorageStoreUrlAndId(Long.parseLong(_dcId)); + String secStoreUrl = secStoreUrlAndId.first(); + Long secStoreId = secStoreUrlAndId.second(); if (secStoreUrl == null) { String msg = "secondary storage for dc " + _dcId + " is not ready yet?"; throw new Exception(msg); } - mgr.prepareSecondaryStorageStore(secStoreUrl); + mgr.prepareSecondaryStorageStore(secStoreUrl, secStoreId); ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnHost(secStoreUrl); if (morSecDs == null) { @@ -3134,12 +3136,14 @@ protected Answer execute(PrepareForMigrationCommand cmd) { prepareNetworkFromNicInfo(new HostMO(getServiceContext(), _morHyperHost), nic, false, cmd.getVirtualMachine().getType()); } - String secStoreUrl = mgr.getSecondaryStorageStoreUrl(Long.parseLong(_dcId)); + Pair secStoreUrlAndId = mgr.getSecondaryStorageStoreUrlAndId(Long.parseLong(_dcId)); + String secStoreUrl = secStoreUrlAndId.first(); + Long secStoreId = secStoreUrlAndId.second(); if (secStoreUrl == null) { String msg = "secondary storage for dc " + _dcId + " is not ready yet?"; throw new Exception(msg); } - mgr.prepareSecondaryStorageStore(secStoreUrl); + mgr.prepareSecondaryStorageStore(secStoreUrl, secStoreId); ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnHost(secStoreUrl); if (morSecDs == null) { @@ -3350,12 +3354,14 @@ protected Answer execute(MigrateWithStorageCommand cmd) { } // Ensure secondary storage mounted on target host - String secStoreUrl = mgr.getSecondaryStorageStoreUrl(Long.parseLong(_dcId)); + Pair secStoreUrlAndId = mgr.getSecondaryStorageStoreUrlAndId(Long.parseLong(_dcId)); + String secStoreUrl = secStoreUrlAndId.first(); + Long secStoreId = secStoreUrlAndId.second(); if (secStoreUrl == null) { String msg = "secondary storage for dc " + _dcId + " is not ready yet?"; throw new Exception(msg); } - mgr.prepareSecondaryStorageStore(secStoreUrl); + mgr.prepareSecondaryStorageStore(secStoreUrl, secStoreId); ManagedObjectReference morSecDs = prepareSecondaryDatastoreOnSpecificHost(secStoreUrl, tgtHyperHost); if (morSecDs == null) { String msg = "Failed to prepare secondary storage on host, secondary store url: " + secStoreUrl; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java index 8a277991aac6..c3f65cbc47f3 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java @@ -304,7 +304,7 @@ public String getWorkerName(VmwareContext context, Command cmd, int workerSequen } @Override - public String getMountPoint(String storageUrl) { - return _resource.getRootDir(storageUrl); + public String getMountPoint(String storageUrl, String nfsVersion) { + return _resource.getRootDir(storageUrl, nfsVersion); } } diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index fa2f369afaf6..35e775fbc738 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -160,7 +160,7 @@ private VirtualMachineMO copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage + ", templateName: " + templateName); - String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, null); s_logger.info("Secondary storage mount point: " + secondaryMountPoint); String srcOVAFileName = @@ -539,7 +539,7 @@ private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyper } private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String volumeMountRoot = secondaryMountPoint + File.separator + volumeDir; return deleteDir(volumeMountRoot); @@ -722,7 +722,7 @@ private void postCreatePrivateTemplate(String installFullPath, long templateId, private Ternary createTemplateFromVolume(VirtualMachineMO vmMo, String installPath, long templateId, String templateUniqueName, String secStorageUrl, String volumePath, String workerVmName) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String installFullPath = secondaryMountPoint + "/" + installPath; synchronized (installPath.intern()) { Script command = new Script(false, "mkdir", _timeout, s_logger); @@ -899,7 +899,7 @@ private Ternary createTemplateFromSnapshot(String installPat snapshotFolder = StringUtils.join(tokens, File.separator, 0, tokens.length - 1); } - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String installFullPath = secondaryMountPoint + "/" + installPath; String installFullOVAName = installFullPath + "/" + templateUniqueName + ".ova"; //Note: volss for tmpl String snapshotRoot = secondaryMountPoint + "/" + snapshotFolder; @@ -1054,7 +1054,7 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { private Pair exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName, String workerVmName) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; synchronized (exportPath.intern()) { @@ -1186,7 +1186,7 @@ public Answer backupSnapshot(CopyCommand cmd) { // Get snapshot physical size long physicalSize = 0l; - String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, null); String snapshotDir = destSnapshot.getPath() + "/" + snapshotBackupUuid; File[] files = new File(secondaryMountPoint + "/" + snapshotDir).listFiles(); if(files != null) { @@ -2146,7 +2146,7 @@ private List getManagedIqnsFromVirtualDisks(List virtualDis private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, String backupName, long wait) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String srcOVAFileName = null; String srcOVFFileName = null; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index 431286248b2d..5beab056c584 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -82,7 +82,7 @@ protected Answer execute(CopyCommand cmd) { //need to take extra processing for vmware, such as packing to ova, before sending to S3 if (srcData.getObjectType() == DataObjectType.VOLUME) { NfsTO cacheStore = (NfsTO)srcDataStore; - String parentPath = storageResource.getRootDir(cacheStore.getUrl()); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), null); VolumeObjectTO vol = (VolumeObjectTO)srcData; String path = vol.getPath(); int index = path.lastIndexOf(File.separator); @@ -95,7 +95,7 @@ protected Answer execute(CopyCommand cmd) { } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT) { // pack ova first // sync snapshot from NFS cache to S3 in NFS migration to S3 case - String parentPath = storageResource.getRootDir(srcDataStore.getUrl()); + String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), null); SnapshotObjectTO snap = (SnapshotObjectTO)srcData; String path = snap.getPath(); int index = path.lastIndexOf(File.separator); @@ -138,7 +138,7 @@ protected Answer execute(CopyCommand cmd) { return answer; } NfsTO cacheStore = (NfsTO)cmd.getCacheTO().getDataStore(); - String parentPath = storageResource.getRootDir(cacheStore.getUrl()); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), null); SnapshotObjectTO newSnapshot = (SnapshotObjectTO)answer.getNewData(); String path = newSnapshot.getPath(); int index = path.lastIndexOf(File.separator); diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 3b3dd4794991..6b89e7bb9c88 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -54,6 +54,7 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.test.utils.SpringUtils; import com.cloud.agent.AgentManager; @@ -431,6 +432,11 @@ public DataStoreManager dataStoreManager() { return Mockito.mock(DataStoreManager.class); } + @Bean + public ImageStoreDetailsDao imageStoreDetailsDao(){ + return Mockito.mock(ImageStoreDetailsDao.class); + } + public static class Library implements TypeFilter { @Override diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index ca86cfd08049..c66ada8d3f69 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -44,6 +44,7 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.graphite.GraphiteClient; @@ -198,6 +199,8 @@ public String toString() { private ServiceOfferingDao _serviceOfferingDao; @Inject private HostGpuGroupsDao _hostGpuGroupsDao; + @Inject + private ImageStoreDetailsDao _imageStoreDetailsDao; private ConcurrentHashMap _hostStats = new ConcurrentHashMap(); private final ConcurrentHashMap _VmStats = new ConcurrentHashMap(); @@ -715,7 +718,7 @@ protected void runInContext() { continue; } - GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO()); + GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), getNfsVersion(store.getId())); EndPoint ssAhost = _epSelector.select(store); if (ssAhost == null) { s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); @@ -762,6 +765,17 @@ protected void runInContext() { s_logger.error("Error trying to retrieve storage stats", t); } } + + private String getNfsVersion(long storeId) { + String nfsVersion = null; + if (_imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } } class AutoScaleMonitor extends ManagedContextRunnable { diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java index 9393ee217a10..6f189ef5f3c6 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java @@ -53,10 +53,10 @@ public Answer executeRequest(Command cmd) { } @Override - synchronized public String getRootDir(String secUrl) { + synchronized public String getRootDir(String secUrl, String nfsVersion) { try { URI uri = new URI(secUrl); - String dir = mountUri(uri); + String dir = mountUri(uri, nfsVersion); return _parent + "/" + dir; } catch (Exception e) { String msg = "GetRootDir for " + secUrl + " failed due to " + e.toString(); @@ -66,14 +66,14 @@ synchronized public String getRootDir(String secUrl) { } @Override - protected void mount(String localRootPath, String remoteDevice, URI uri) { + protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { ensureLocalRootPathExists(localRootPath, uri); if (mountExists(localRootPath, uri)) { return; } - attemptMount(localRootPath, remoteDevice, uri); + attemptMount(localRootPath, remoteDevice, uri, nfsVersion); // Change permissions for the mountpoint - seems to bypass authentication Script script = new Script(true, "chmod", _timeout, s_logger); diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java index bdfe7e837f26..d953338c911d 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java @@ -72,7 +72,7 @@ public void disconnected() { } @Override - public String getRootDir(String url) { + public String getRootDir(String url, String nfsVersion) { return getRootDir(); } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index 768a177cdc52..b71c96f1133d 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -44,6 +44,7 @@ import java.util.Map; import java.util.UUID; +import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.exception.InvalidParameterValueException; @@ -91,6 +92,9 @@ import org.apache.cloudstack.storage.command.DownloadProgressCommand; import org.apache.cloudstack.storage.command.UploadStatusAnswer; import org.apache.cloudstack.storage.command.UploadStatusAnswer.UploadStatus; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.command.UploadStatusCommand; import org.apache.cloudstack.storage.template.DownloadManager; import org.apache.cloudstack.storage.template.DownloadManagerImpl; @@ -212,6 +216,14 @@ public void setTimeout(int timeout) { private HashMap uploadEntityStateMap = new HashMap(); private String _ssvmPSK = null; + @Inject + ImageStoreDao dataStoreDao; + + @Inject + ImageStoreDetailsDao detailsStoreDao; + + public static final String IMAGE_STORE_PARAMETER_ID = "imageStoreId"; + public void setParentPath(String path) { _parent = path; } @@ -412,7 +424,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { - String srcMountPoint = getRootDir(srcDataStore.getUrl()); + String srcMountPoint = getRootDir(srcDataStore.getUrl(), null); String snapshotPath = srcData.getPath(); int index = snapshotPath.lastIndexOf("/"); String snapshotName = snapshotPath.substring(index + 1); @@ -422,7 +434,7 @@ protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, Sn snapshotPath = snapshotPath.substring(0, index); snapshotPath = srcMountPoint + File.separator + snapshotPath; - String destMountPoint = getRootDir(destDataStore.getUrl()); + String destMountPoint = getRootDir(destDataStore.getUrl(), null); String destPath = destMountPoint + File.separator + destData.getPath(); String errMsg = null; @@ -566,7 +578,7 @@ protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObj } protected File getFile(String path, String nfsPath) { - String filePath = getRootDir(nfsPath) + File.separator + path; + String filePath = getRootDir(nfsPath, null) + File.separator + path; File f = new File(filePath); if (!f.exists()) { _storage.mkdirs(filePath); @@ -706,7 +718,7 @@ protected Long determineS3VolumeIdFromKey(String key) { } private String determineStorageTemplatePath(final String storagePath, String dataPath) { - return join(asList(getRootDir(storagePath), dataPath), File.separator); + return join(asList(getRootDir(storagePath, null), dataPath), File.separator); } protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String name) { @@ -720,7 +732,7 @@ protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String n throw new CloudRuntimeException("Failed to get url: " + url); } - String nfsMountPath = getRootDir(nfs.getUrl()); + String nfsMountPath = getRootDir(nfs.getUrl(), null); String filePath = nfsMountPath + File.separator + path; File directory = new File(filePath); @@ -1098,7 +1110,7 @@ public Answer execute(DeleteSnapshotsDirCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeSnapshotPath = cmd.getDirectory(); - String parent = getRootDir(nfs.getUrl()); + String parent = getRootDir(nfs.getUrl(), null); if (relativeSnapshotPath.startsWith(File.separator)) { relativeSnapshotPath = relativeSnapshotPath.substring(1); @@ -1176,7 +1188,7 @@ private Answer execute(ComputeChecksumCommand cmd) { return new Answer(cmd, false, "can't handle non nfs data store"); } NfsTO nfsStore = (NfsTO)store; - String parent = getRootDir(nfsStore.getUrl()); + String parent = getRootDir(nfsStore.getUrl(), null); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1297,6 +1309,16 @@ private void configCerts(KeystoreManager.Certificates certs) { } } + private Long getImageStoreId(DataStoreTO dataStore){ + Long imgStoreId = null; + if (dataStore.getRole().equals(DataStoreRole.Image)){ + String uuid = dataStore.getUuid(); + ImageStoreVO imageStoreVO = dataStoreDao.findByUuid(uuid); + imgStoreId = imageStoreVO.getId(); + } + return imgStoreId; + } + private Answer execute(SecStorageSetupCommand cmd) { if (!_inSystemVM) { return new Answer(cmd, true, null); @@ -1310,7 +1332,8 @@ private Answer execute(SecStorageSetupCommand cmd) { String nfsHostIp = getUriHostIp(uri); addRouteToInternalIpOrCidr(_storageGateway, _storageIp, _storageNetmask, nfsHostIp); - String dir = mountUri(uri); + + String dir = mountUri(uri, cmd.getNfsVersion()); configCerts(cmd.getCerts()); @@ -1386,7 +1409,7 @@ protected Answer deleteSnapshot(final DeleteCommand cmd) { DataStoreTO dstore = obj.getDataStore(); if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; - String parent = getRootDir(nfs.getUrl()); + String parent = getRootDir(nfs.getUrl(), null); if (!parent.endsWith(File.separator)) { parent += File.separator; } @@ -1557,7 +1580,7 @@ private Answer execute(ListTemplateCommand cmd) { if (store instanceof NfsTO) { NfsTO nfs = (NfsTO)store; String secUrl = nfs.getUrl(); - String root = getRootDir(secUrl); + String root = getRootDir(secUrl, cmd.getNfsVersion()); Map templateInfos = _dlMgr.gatherTemplateInfo(root); return new ListTemplateAnswer(secUrl, templateInfos); } else if (store instanceof SwiftTO) { @@ -1579,7 +1602,7 @@ private Answer execute(ListVolumeCommand cmd) { } DataStoreTO store = cmd.getDataStore(); if (store instanceof NfsTO) { - String root = getRootDir(cmd.getSecUrl()); + String root = getRootDir(cmd.getSecUrl(), null); Map templateInfos = _dlMgr.gatherVolumeInfo(root); return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos); } else if (store instanceof S3TO) { @@ -1714,7 +1737,7 @@ protected GetStorageStatsAnswer execute(final GetStorageStatsCommand cmd) { return new GetStorageStatsAnswer(cmd, infinity, 0L); } - String rootDir = getRootDir(((NfsTO)store).getUrl()); + String rootDir = getRootDir(((NfsTO)store).getUrl(), cmd.getNfsVersion()); final long usedSize = getUsedSize(rootDir); final long totalSize = getTotalSize(rootDir); if (usedSize == -1 || totalSize == -1) { @@ -1748,7 +1771,7 @@ protected Answer deleteTemplate(DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeTemplatePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl()); + String parent = getRootDir(nfs.getUrl(), null); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1852,7 +1875,7 @@ protected Answer deleteVolume(final DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeVolumePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl()); + String parent = getRootDir(nfs.getUrl(), null); if (relativeVolumePath.startsWith(File.separator)) { relativeVolumePath = relativeVolumePath.substring(1); @@ -1954,13 +1977,13 @@ protected Answer deleteVolume(final DeleteCommand cmd) { } @Override - synchronized public String getRootDir(String secUrl) { + synchronized public String getRootDir(String secUrl, String nfsVersion) { if (!_inSystemVM) { return _parent; } try { URI uri = new URI(secUrl); - String dir = mountUri(uri); + String dir = mountUri(uri, nfsVersion); return _parent + "/" + dir; } catch (Exception e) { String msg = "GetRootDir for " + secUrl + " failed due to " + e.toString(); @@ -2291,10 +2314,11 @@ private String configureIpFirewall(List ipList, boolean isAppend) { * @param uri * crresponding to the remote device. Will throw for unsupported * scheme. + * @param imgStoreId * @return name of folder in _parent that device was mounted. * @throws UnknownHostException */ - protected String mountUri(URI uri) throws UnknownHostException { + protected String mountUri(URI uri, String nfsVersion) throws UnknownHostException { String uriHostIp = getUriHostIp(uri); String nfsPath = uriHostIp + ":" + uri.getPath(); @@ -2312,7 +2336,7 @@ protected String mountUri(URI uri) throws UnknownHostException { s_logger.debug("Mounting device with nfs-style path of " + remoteDevice); } - mount(localRootPath, remoteDevice, uri); + mount(localRootPath, remoteDevice, uri, nfsVersion); return dir; } @@ -2340,15 +2364,15 @@ protected void umount(String localRootPath, URI uri) { s_logger.debug("Successfully umounted " + localRootPath); } - protected void mount(String localRootPath, String remoteDevice, URI uri) { - s_logger.debug("mount " + uri.toString() + " on " + localRootPath); + protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { + s_logger.debug("mount " + uri.toString() + " on " + localRootPath + ((nfsVersion != null) ? " nfsVersion="+nfsVersion : "")); ensureLocalRootPathExists(localRootPath, uri); if (mountExists(localRootPath, uri)) { return; } - attemptMount(localRootPath, remoteDevice, uri); + attemptMount(localRootPath, remoteDevice, uri, nfsVersion); // XXX: Adding the check for creation of snapshots dir here. Might have // to move it somewhere more logical later. @@ -2356,9 +2380,10 @@ protected void mount(String localRootPath, String remoteDevice, URI uri) { checkForVolumesDir(localRootPath); } - protected void attemptMount(String localRootPath, String remoteDevice, URI uri) { + protected void attemptMount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { String result; - s_logger.debug("Make cmdline call to mount " + remoteDevice + " at " + localRootPath + " based on uri " + uri); + s_logger.debug("Make cmdline call to mount " + remoteDevice + " at " + localRootPath + " based on uri " + uri + + ((nfsVersion != null) ? " nfsVersion=" + nfsVersion : "")); Script command = new Script(!_inSystemVM, "mount", _timeout, s_logger); String scheme = uri.getScheme().toLowerCase(); @@ -2370,7 +2395,7 @@ protected void attemptMount(String localRootPath, String remoteDevice, URI uri) command.add("-o", "resvport"); } if (_inSystemVM) { - command.add("-o", "soft,timeo=133,retrans=2147483647,tcp,acdirmax=0,acdirmin=0"); + command.add("-o", "soft,timeo=133,retrans=2147483647,tcp,acdirmax=0,acdirmin=0" + ((nfsVersion != null) ? ",vers=" + nfsVersion : "")); } } else if (scheme.equals("cifs")) { String extraOpts = parseCifsMountOptions(uri); @@ -2647,7 +2672,7 @@ public UploadEntity createUploadEntity(String uuid, String metadata, long conten //relative path with out ssvm mount info. uploadEntity.setTemplatePath(absolutePath); String dataStoreUrl = cmd.getDataTo(); - String installPathPrefix = this.getRootDir(dataStoreUrl) + File.separator + absolutePath; + String installPathPrefix = this.getRootDir(dataStoreUrl, null) + File.separator + absolutePath; uploadEntity.setInstallPathPrefix(installPathPrefix); uploadEntity.setHvm(cmd.getRequiresHvm()); uploadEntity.setChksum(cmd.getChecksum()); @@ -2669,7 +2694,7 @@ public UploadEntity createUploadEntity(String uuid, String metadata, long conten } private synchronized void checkSecondaryStorageResourceLimit(TemplateOrVolumePostUploadCommand cmd, int contentLengthInGB) { - String rootDir = this.getRootDir(cmd.getDataTo()) + File.separator; + String rootDir = this.getRootDir(cmd.getDataTo(), null) + File.separator; long accountId = cmd.getAccountId(); long accountTemplateDirSize = 0; @@ -2716,7 +2741,7 @@ private String getSnapshotPathForAccount(long accountId) { private boolean isOneTimePostUrlUsed(TemplateOrVolumePostUploadCommand cmd) { String uuid = cmd.getEntityUUID(); - String uploadPath = this.getRootDir(cmd.getDataTo()) + File.separator + cmd.getAbsolutePath(); + String uploadPath = this.getRootDir(cmd.getDataTo(), null) + File.separator + cmd.getAbsolutePath(); return uploadEntityStateMap.containsKey(uuid) || new File(uploadPath).exists(); } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java index 4d3f04819e84..3c24b6c6de3e 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java @@ -23,6 +23,6 @@ */ public interface SecondaryStorageResource extends ServerResource { - String getRootDir(String cmd); + String getRootDir(String cmd, String nfsVersion); } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java index 9cf37e56596c..7829bf662541 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java @@ -708,7 +708,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D String installPathPrefix = cmd.getInstallPath(); // for NFS, we need to get mounted path if (dstore instanceof NfsTO) { - installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl()) + File.separator + installPathPrefix; + installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), null) + File.separator + installPathPrefix; } String user = null; String password = null; diff --git a/services/secondary-storage/server/test/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResourceTest.java b/services/secondary-storage/server/test/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResourceTest.java index 13ddb3531a82..9da5c53a9034 100644 --- a/services/secondary-storage/server/test/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResourceTest.java +++ b/services/secondary-storage/server/test/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResourceTest.java @@ -80,7 +80,7 @@ public void testMount() throws Exception { if (!sampleMount.isEmpty()) { s_logger.info("functional test, mount " + sampleMount); URI realMntUri = new URI(sampleMount); - String mntSubDir = resource.mountUri(realMntUri); + String mntSubDir = resource.mountUri(realMntUri, null); s_logger.info("functional test, umount " + mntSubDir); resource.umount(resource.getMountingRoot() + mntSubDir, realMntUri); } else { From 76dc2705b7873f52b35c07ae742190c3515f4245 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 28 Jan 2016 17:57:33 -0200 Subject: [PATCH 03/10] CLOUDSTACK-9252: Remove duplicates getNfsVersion, refactor --- .../agent/api/BackupSnapshotCommand.java | 9 +++ ...atePrivateTemplateFromSnapshotCommand.java | 9 +++ ...reatePrivateTemplateFromVolumeCommand.java | 9 +++ .../api/CreateVolumeFromSnapshotCommand.java | 10 +++ .../agent/api/storage/CopyVolumeCommand.java | 9 +++ .../PrimaryStorageDownloadCommand.java | 9 +++ .../TemplateOrVolumePostUploadCommand.java | 10 +++ .../storage/image/TemplateServiceImpl.java | 17 +---- .../MockLocalNfsSecondaryStorageResource.java | 2 +- .../vmware/manager/VmwareManagerImpl.java | 12 +--- .../manager/VmwareStorageManagerImpl.java | 65 ++++++++++--------- .../resource/VmwareStorageProcessor.java | 54 ++++++++------- .../VmwareStorageSubsystemCommandHandler.java | 9 +-- .../src/com/cloud/server/StatsCollector.java | 14 +--- .../cloud/storage/ImageStoreDetailsUtil.java | 59 +++++++++++++++++ .../SecondaryStorageManagerImpl.java | 18 +---- .../resource/NfsSecondaryStorageResource.java | 48 +++++++------- .../storage/template/DownloadManagerImpl.java | 3 +- 18 files changed, 231 insertions(+), 135 deletions(-) create mode 100755 server/src/com/cloud/storage/ImageStoreDetailsUtil.java diff --git a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java index 2a46610117f8..d93c32f99086 100644 --- a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java @@ -39,6 +39,7 @@ public class BackupSnapshotCommand extends SnapshotCommand { private S3TO s3; StorageFilerTO pool; private Long secHostId; + private String nfsVersion; protected BackupSnapshotCommand() { @@ -107,4 +108,12 @@ public Long getSnapshotId() { public Long getSecHostId() { return secHostId; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java index 7ac2ddedd2e3..5a09994ab728 100644 --- a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java @@ -28,6 +28,7 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand { private String origTemplateInstallPath; private Long newTemplateId; private String templateName; + private String nfsVersion; protected CreatePrivateTemplateFromSnapshotCommand() { @@ -72,4 +73,12 @@ public Long getNewTemplateId() { public String getTemplateName() { return templateName; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java index 3025147a3044..b6cc6ac4475a 100644 --- a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java +++ b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java @@ -32,6 +32,7 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand { StorageFilerTO _primaryPool; // For XenServer private String _secondaryStorageUrl; + private String nfsVersion; public CreatePrivateTemplateFromVolumeCommand() { } @@ -99,4 +100,12 @@ public Long getAccountId() { public void setTemplateId(long templateId) { _templateId = templateId; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java index fa9a4d584613..933be0360686 100644 --- a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java @@ -26,6 +26,8 @@ */ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { + private String nfsVersion; + protected CreateVolumeFromSnapshotCommand() { } @@ -50,4 +52,12 @@ public CreateVolumeFromSnapshotCommand(StoragePool pool, String secondaryStorage super(pool, secondaryStoragePoolURL, backedUpSnapshotUuid, backedUpSnapshotName, dcId, accountId, volumeId); setWait(wait); } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java b/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java index 43c84ee2bc0b..7ab822c03bc3 100644 --- a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java +++ b/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java @@ -32,6 +32,7 @@ public class CopyVolumeCommand extends Command { boolean toSecondaryStorage; String vmName; boolean executeInSequence = false; + String nfsVersion; public CopyVolumeCommand() { } @@ -75,4 +76,12 @@ public boolean toSecondaryStorage() { public String getVmName() { return vmName; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java index ce8ed217a562..9dae513b989b 100644 --- a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java +++ b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java @@ -35,6 +35,7 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand { String secondaryStorageUrl; String primaryStorageUrl; + String nfsVersion; protected PrimaryStorageDownloadCommand() { } @@ -87,4 +88,12 @@ public String getPrimaryStorageUrl() { public boolean executeInSequence() { return true; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java index 5d1e56bd7733..bfcd9ae9b41d 100644 --- a/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java +++ b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java @@ -53,6 +53,8 @@ public class TemplateOrVolumePostUploadCommand { private long accountId; + private String nfsVersion; + public TemplateOrVolumePostUploadCommand(long entityId, String entityUUID, String absolutePath, String checksum, String type, String name, String imageFormat, String dataTo, String dataToRole) { this.entityId = entityId; @@ -196,4 +198,12 @@ public void setAccountId(long accountId) { public long getAccountId() { return accountId; } + + public String getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(String nfsVersion) { + this.nfsVersion = nfsVersion; + } } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index cbfcb42668d9..2a6159e85fd2 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -56,7 +56,6 @@ import org.apache.cloudstack.storage.command.DeleteCommand; import org.apache.cloudstack.storage.datastore.DataObjectManager; import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; @@ -74,6 +73,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.StoragePool; @@ -136,8 +136,6 @@ public class TemplateServiceImpl implements TemplateService { ConfigurationDao _configDao; @Inject StorageCacheManager _cacheMgr; - @Inject - ImageStoreDetailsDao _imageStoreDetailsDao; class TemplateOpContext extends AsyncRpcContext { final TemplateObject template; @@ -567,7 +565,7 @@ public void associateCrosszoneTemplatesToZone(long dcId) { } private Map listTemplate(DataStore ssStore) { - ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), getNfsVersion(ssStore.getId())); + ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), ImageStoreDetailsUtil.getNfsVersion(ssStore.getId())); EndPoint ep = _epSelector.select(ssStore); Answer answer = null; if (ep == null) { @@ -589,17 +587,6 @@ private Map listTemplate(DataStore ssStore) { return null; } - private String getNfsVersion(long storeId) { - String nfsVersion = null; - if (_imageStoreDetailsDao.getDetails(storeId) != null){ - Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); - if (storeDetails != null && storeDetails.containsKey("nfs.version")){ - nfsVersion = storeDetails.get("nfs.version"); - } - } - return nfsVersion; - } - protected Void createTemplateCallback(AsyncCallbackDispatcher callback, TemplateOpContext context) { TemplateObject template = context.getTemplate(); AsyncCompletionCallback parentCallback = context.getParentCallback(); diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java index 896342890c82..5c41dcab0ee5 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java @@ -51,7 +51,7 @@ public MockLocalNfsSecondaryStorageResource() { } @Override - public String getRootDir(String secUrl) { + public String getRootDir(String secUrl, String nfsVersion) { return "/mnt"; } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 602a5444858a..d51d96fe949a 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -106,6 +106,7 @@ import com.cloud.org.Cluster.ClusterType; import com.cloud.secstorage.CommandExecLogDao; import com.cloud.server.ConfigurationServer; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.StorageLayer; import com.cloud.utils.FileUtil; @@ -553,16 +554,7 @@ public boolean needRecycle(String workerTag) { @Override public void prepareSecondaryStorageStore(String storageUrl, Long storeId) { - String nfsVersion = null; - if (storeId != null){ - Map details = _imageDetailsStoreDao.getDetails(storeId); - for (String detailKey : details.keySet()) { - if (detailKey.equals("nfs.version")){ - nfsVersion = details.get(detailKey); - } - } - } - String mountPoint = getMountPoint(storageUrl, nfsVersion); + String mountPoint = getMountPoint(storageUrl, ImageStoreDetailsUtil.getNfsVersion(storeId)); GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm"); try { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index f87fe6c4a816..b41a14725c55 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -77,6 +77,7 @@ import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareHelper; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; @@ -156,7 +157,7 @@ public String createOvaForTemplate(TemplateObjectTO template) { String secStorageUrl = nfsStore.getUrl(); assert (secStorageUrl != null); String installPath = template.getPath(); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, ImageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); String installFullPath = secondaryMountPoint + "/" + installPath; try { if (installFullPath.endsWith(".ova")) { @@ -194,7 +195,7 @@ public String createOvaForVolume(VolumeObjectTO volume) { String installPath = volume.getPath(); int index = installPath.lastIndexOf(File.separator); String volumeUuid = installPath.substring(index + 1); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, ImageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); //The real volume path String volumePath = installPath + File.separator + volumeUuid + ".ova"; String installFullPath = secondaryMountPoint + "/" + installPath; @@ -271,7 +272,8 @@ public Answer execute(VmwareHostService hostService, PrimaryStorageDownloadComma assert (morDs != null); DatastoreMO primaryStorageDatastoreMo = new DatastoreMO(context, morDs); - copyTemplateFromSecondaryToPrimary(hyperHost, primaryStorageDatastoreMo, secondaryStorageUrl, mountPoint, templateName, templateUuidName); + copyTemplateFromSecondaryToPrimary(hyperHost, primaryStorageDatastoreMo, secondaryStorageUrl, mountPoint, templateName, templateUuidName, + cmd.getNfsVersion()); } else { s_logger.info("Template " + templateName + " has already been setup, skip the template setup process in primary storage"); } @@ -345,7 +347,7 @@ public Answer execute(VmwareHostService hostService, BackupSnapshotCommand cmd) snapshotBackupUuid = backupSnapshotToSecondaryStorage(vmMo, accountId, volumeId, cmd.getVolumePath(), snapshotUuid, secondaryStorageUrl, prevSnapshotUuid, prevBackupUuid, - hostService.getWorkerName(context, cmd, 1)); + hostService.getWorkerName(context, cmd, 1), cmd.getNfsVersion()); success = (snapshotBackupUuid != null); if (success) { @@ -413,7 +415,7 @@ public Answer execute(VmwareHostService hostService, CreatePrivateTemplateFromVo Ternary result = createTemplateFromVolume(vmMo, accountId, templateId, cmd.getUniqueName(), secondaryStoragePoolURL, volumePath, - hostService.getWorkerName(context, cmd, 0)); + hostService.getWorkerName(context, cmd, 0), cmd.getNfsVersion()); return new CreatePrivateTemplateAnswer(cmd, true, null, result.first(), result.third(), result.second(), cmd.getUniqueName(), ImageFormat.OVA); @@ -441,7 +443,8 @@ public Answer execute(VmwareHostService hostService, CreatePrivateTemplateFromSn VmwareContext context = hostService.getServiceContext(cmd); try { - Ternary result = createTemplateFromSnapshot(accountId, newTemplateId, uniqeName, secondaryStorageUrl, volumeId, backedUpSnapshotUuid); + Ternary result = createTemplateFromSnapshot(accountId, newTemplateId, uniqeName, secondaryStorageUrl, volumeId, backedUpSnapshotUuid, + cmd.getNfsVersion()); return new CreatePrivateTemplateAnswer(cmd, true, null, result.first(), result.third(), result.second(), uniqeName, ImageFormat.OVA); } catch (Throwable e) { @@ -471,7 +474,7 @@ public Answer execute(VmwareHostService hostService, CopyVolumeCommand cmd) { if (cmd.toSecondaryStorage()) { result = copyVolumeToSecStorage(hostService, hyperHost, cmd, vmName, volumeId, cmd.getPool().getUuid(), volumePath, secondaryStorageURL, - hostService.getWorkerName(context, cmd, 0)); + hostService.getWorkerName(context, cmd, 0), cmd.getNfsVersion()); } else { StorageFilerTO poolTO = cmd.getPool(); @@ -484,8 +487,9 @@ public Answer execute(VmwareHostService hostService, CopyVolumeCommand cmd) { } } - result = copyVolumeFromSecStorage(hyperHost, volumeId, new DatastoreMO(context, morDatastore), secondaryStorageURL, volumePath); - deleteVolumeDirOnSecondaryStorage(volumeId, secondaryStorageURL); + result = copyVolumeFromSecStorage(hyperHost, volumeId, new DatastoreMO(context, morDatastore), secondaryStorageURL, volumePath, + cmd.getNfsVersion()); + deleteVolumeDirOnSecondaryStorage(volumeId, secondaryStorageURL, cmd.getNfsVersion()); } return new CopyVolumeAnswer(cmd, true, null, result.first(), result.second()); } catch (Throwable e) { @@ -523,7 +527,8 @@ public Answer execute(VmwareHostService hostService, CreateVolumeFromSnapshotCom } DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs); - details = createVolumeFromSnapshot(hyperHost, primaryDsMo, newVolumeName, accountId, volumeId, secondaryStorageUrl, backedUpSnapshotUuid); + details = createVolumeFromSnapshot(hyperHost, primaryDsMo, newVolumeName, accountId, volumeId, secondaryStorageUrl, backedUpSnapshotUuid, + cmd.getNfsVersion()); if (details == null) { success = true; } @@ -542,12 +547,12 @@ public Answer execute(VmwareHostService hostService, CreateVolumeFromSnapshotCom // templateName: name in secondary storage // templateUuid: will be used at hypervisor layer private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, - String templatePathAtSecondaryStorage, String templateName, String templateUuid) throws Exception { + String templatePathAtSecondaryStorage, String templateName, String templateUuid, String nfsVersion) throws Exception { s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage + ", templateName: " + templateName); - String secondaryMountPoint = _mountService.getMountPoint(secondaryStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secondaryStorageUrl, nfsVersion); s_logger.info("Secondary storage mount point: " + secondaryMountPoint); String srcOVAFileName = secondaryMountPoint + "/" + templatePathAtSecondaryStorage + templateName + "." + ImageFormat.OVA.getFileExtension(); @@ -598,9 +603,9 @@ private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, } private Ternary createTemplateFromVolume(VirtualMachineMO vmMo, long accountId, long templateId, String templateUniqueName, String secStorageUrl, - String volumePath, String workerVmName) throws Exception { + String volumePath, String workerVmName, String nfsVersion) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installFullPath = secondaryMountPoint + "/" + installPath; synchronized (installPath.intern()) { @@ -663,9 +668,9 @@ private Ternary createTemplateFromVolume(VirtualMachineMO vm } private Ternary createTemplateFromSnapshot(long accountId, long templateId, String templateUniqueName, String secStorageUrl, long volumeId, - String backedUpSnapshotUuid) throws Exception { + String backedUpSnapshotUuid, String nfsVersion) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installFullPath = secondaryMountPoint + "/" + installPath; String installFullOVAName = installFullPath + "/" + templateUniqueName + ".ova"; //Note: volss for tmpl @@ -847,16 +852,16 @@ private void writeMetaOvaForTemplate(String installFullPath, String ovfFilename, } private String createVolumeFromSnapshot(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, long accountId, long volumeId, - String secStorageUrl, String snapshotBackupUuid) throws Exception { + String secStorageUrl, String snapshotBackupUuid, String nfsVersion) throws Exception { - restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), snapshotBackupUuid); + restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), snapshotBackupUuid, nfsVersion); return null; } private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, - String backupName) throws Exception { + String backupName, String nfsVersion) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String srcOVAFileName = secondaryMountPoint + "/" + secStorageDir + "/" + backupName + "." + ImageFormat.OVA.getFileExtension(); String snapshotDir = ""; if (backupName.contains("/")) { @@ -914,17 +919,17 @@ private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, Datasto } private String backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, long accountId, long volumeId, String volumePath, String snapshotUuid, String secStorageUrl, - String prevSnapshotUuid, String prevBackupUuid, String workerVmName) throws Exception { + String prevSnapshotUuid, String prevBackupUuid, String workerVmName, String nfsVersion) throws Exception { String backupUuid = UUID.randomUUID().toString(); - exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), backupUuid, workerVmName); + exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), backupUuid, workerVmName, nfsVersion); return backupUuid + "/" + backupUuid; } private void exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName, - String workerVmName) throws Exception { + String workerVmName, String nfsVersion) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; synchronized (exportPath.intern()) { @@ -967,7 +972,7 @@ private void exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volume } private Pair copyVolumeToSecStorage(VmwareHostService hostService, VmwareHypervisorHost hyperHost, CopyVolumeCommand cmd, String vmName, - long volumeId, String poolId, String volumePath, String secStorageUrl, String workerVmName) throws Exception { + long volumeId, String poolId, String volumePath, String secStorageUrl, String workerVmName, String nfsVersion) throws Exception { String volumeFolder = String.valueOf(volumeId) + "/"; VirtualMachineMO workerVm = null; @@ -1004,7 +1009,7 @@ private Pair copyVolumeToSecStorage(VmwareHostService hostServic vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false); exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, "volumes/" + volumeFolder, exportName, - hostService.getWorkerName(hyperHost.getContext(), cmd, 1)); + hostService.getWorkerName(hyperHost.getContext(), cmd, 1), nfsVersion); return new Pair(volumeFolder, exportName); } finally { @@ -1025,12 +1030,12 @@ private String getVolumePathInDatastore(DatastoreMO dsMo, String volumeFileName) return datastoreVolumePath; } - private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, long volumeId, DatastoreMO dsMo, String secStorageUrl, String exportName) + private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, long volumeId, DatastoreMO dsMo, String secStorageUrl, String exportName, String nfsVersion) throws Exception { String volumeFolder = String.valueOf(volumeId) + "/"; String newVolume = UUID.randomUUID().toString().replaceAll("-", ""); - restoreVolumeFromSecStorage(hyperHost, dsMo, newVolume, secStorageUrl, "volumes/" + volumeFolder, exportName); + restoreVolumeFromSecStorage(hyperHost, dsMo, newVolume, secStorageUrl, "volumes/" + volumeFolder, exportName, nfsVersion); return new Pair(volumeFolder, newVolume); } @@ -1445,8 +1450,8 @@ public RevertToVMSnapshotAnswer execute(VmwareHostService hostService, RevertToV } } - private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl) throws Exception { - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, null); + private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl, String nfsVersion) throws Exception { + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId); return deleteDir(volumeMountRoot); diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 35e775fbc738..216332491792 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -96,6 +96,7 @@ import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.serializer.GsonHelper; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; @@ -155,12 +156,12 @@ private String getOVFFilePath(String srcOVAFileName) { } private VirtualMachineMO copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, - String templatePathAtSecondaryStorage, String templateName, String templateUuid, boolean createSnapshot) throws Exception { + String templatePathAtSecondaryStorage, String templateName, String templateUuid, boolean createSnapshot, String nfsVersion) throws Exception { s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage + ", templateName: " + templateName); - String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, null); + String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, nfsVersion); s_logger.info("Secondary storage mount point: " + secondaryMountPoint); String srcOVAFileName = @@ -316,7 +317,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { if (managed) { VirtualMachineMO vmMo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - managedStoragePoolRootVolumeName, false); + managedStoragePoolRootVolumeName, false, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); vmMo.unregisterVm(); @@ -333,7 +334,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { } else { copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - templateUuidName, true); + templateUuidName, true, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); } } else { s_logger.info("Template " + templateInfo.second() + " has already been setup, skip the template setup process in primary storage"); @@ -518,7 +519,7 @@ public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) { } } - private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, String srcVolumePath, DatastoreMO dsMo, String secStorageUrl, long wait) throws Exception { + private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, String srcVolumePath, DatastoreMO dsMo, String secStorageUrl, long wait, String nfsVersion) throws Exception { String volumeFolder = null; String volumeName = null; @@ -533,13 +534,13 @@ private Pair copyVolumeFromSecStorage(VmwareHypervisorHost hyper } String newVolume = VmwareHelper.getVCenterSafeUuid(); - restoreVolumeFromSecStorage(hyperHost, dsMo, newVolume, secStorageUrl, volumeFolder, volumeName, wait); + restoreVolumeFromSecStorage(hyperHost, dsMo, newVolume, secStorageUrl, volumeFolder, volumeName, wait, nfsVersion); return new Pair(volumeFolder, newVolume); } - private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); + private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl, String nfsVersion) throws Exception { + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String volumeMountRoot = secondaryMountPoint + File.separator + volumeDir; return deleteDir(volumeMountRoot); @@ -578,8 +579,8 @@ public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { } } - Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000); - deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl()); + Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(uuid)); VolumeObjectTO newVolume = new VolumeObjectTO(); newVolume.setPath(result.second()); return new CopyCmdAnswer(newVolume); @@ -636,7 +637,8 @@ private Pair copyVolumeToSecStorage(VmwareHostService hostServic vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false); - exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1)); + exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), + ImageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); return new Pair(destVolumePath, exportName); } finally { @@ -720,9 +722,9 @@ private void postCreatePrivateTemplate(String installFullPath, long templateId, } private Ternary createTemplateFromVolume(VirtualMachineMO vmMo, String installPath, long templateId, String templateUniqueName, - String secStorageUrl, String volumePath, String workerVmName) throws Exception { + String secStorageUrl, String volumePath, String workerVmName, String nfsVersion) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String installFullPath = secondaryMountPoint + "/" + installPath; synchronized (installPath.intern()) { Script command = new Script(false, "mkdir", _timeout, s_logger); @@ -838,7 +840,7 @@ public Answer createTemplateFromVolume(CopyCommand cmd) { Ternary result = createTemplateFromVolume(vmMo, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath, - hostService.getWorkerName(context, cmd, 0)); + hostService.getWorkerName(context, cmd, 0), ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -885,7 +887,7 @@ private void writeMetaOvaForTemplate(String installFullPath, String ovfFilename, } private Ternary createTemplateFromSnapshot(String installPath, String templateUniqueName, String secStorageUrl, String snapshotPath, - Long templateId, long wait) throws Exception { + Long templateId, long wait, String nfsVersion) throws Exception { //Snapshot path is decoded in this form: /snapshots/account/volumeId/uuid/uuid String backupSSUuid; String snapshotFolder; @@ -899,7 +901,7 @@ private Ternary createTemplateFromSnapshot(String installPat snapshotFolder = StringUtils.join(tokens, File.separator, 0, tokens.length - 1); } - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String installFullPath = secondaryMountPoint + "/" + installPath; String installFullOVAName = installFullPath + "/" + templateUniqueName + ".ova"; //Note: volss for tmpl String snapshotRoot = secondaryMountPoint + "/" + snapshotFolder; @@ -1029,7 +1031,8 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { } NfsTO nfsSvr = (NfsTO)imageStore; - Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000); + Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000, + ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1052,9 +1055,9 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { // return Pair private Pair exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, - String exportName, String workerVmName) throws Exception { + String exportName, String workerVmName, String nfsVersion) throws Exception { - String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); + String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; synchronized (exportPath.intern()) { @@ -1096,10 +1099,10 @@ private Pair exportVolumeToSecondaryStroage(VirtualMachineMO v // Ternary private Ternary backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, String installPath, String volumePath, String snapshotUuid, - String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName) throws Exception { + String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName, String nfsVersion) throws Exception { String backupUuid = UUID.randomUUID().toString(); - Pair snapshotInfo = exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, installPath, backupUuid, workerVmName); + Pair snapshotInfo = exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, installPath, backupUuid, workerVmName, nfsVersion); return new Ternary(backupUuid, snapshotInfo.first(), snapshotInfo.second()); } @@ -1172,9 +1175,10 @@ public Answer backupSnapshot(CopyCommand cmd) { throw new Exception("Failed to take snapshot " + srcSnapshot.getName() + " on vm: " + vmName); } + String nfsVersion = ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); backupResult = backupSnapshotToSecondaryStorage(vmMo, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl, - prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1)); + prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), nfsVersion); snapshotBackupUuid = backupResult.first(); success = (snapshotBackupUuid != null); @@ -1186,7 +1190,7 @@ public Answer backupSnapshot(CopyCommand cmd) { // Get snapshot physical size long physicalSize = 0l; - String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, null); + String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, nfsVersion); String snapshotDir = destSnapshot.getPath() + "/" + snapshotBackupUuid; File[] files = new File(secondaryMountPoint + "/" + snapshotDir).listFiles(); if(files != null) { @@ -2144,7 +2148,7 @@ private List getManagedIqnsFromVirtualDisks(List virtualDis } private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, - String backupName, long wait) throws Exception { + String backupName, long wait, String nfsVersion) throws Exception { String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String srcOVAFileName = null; @@ -2248,7 +2252,7 @@ public Answer createVolumeFromSnapshot(CopyCommand cmd) { backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ovf", ""); } DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs); - restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000); + restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(newVolumeName); diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index 5beab056c584..77a71f549ef7 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -21,7 +21,6 @@ import java.io.File; import org.apache.log4j.Logger; - import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CopyCommand; import org.apache.cloudstack.storage.command.DeleteCommand; @@ -38,6 +37,7 @@ import com.cloud.agent.api.to.SwiftTO; import com.cloud.hypervisor.vmware.manager.VmwareStorageManager; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.ImageStoreDetailsUtil; public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemCommandHandlerBase { private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); @@ -78,11 +78,12 @@ protected Answer execute(CopyCommand cmd) { } } + String nfsVersion = ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) { //need to take extra processing for vmware, such as packing to ova, before sending to S3 if (srcData.getObjectType() == DataObjectType.VOLUME) { NfsTO cacheStore = (NfsTO)srcDataStore; - String parentPath = storageResource.getRootDir(cacheStore.getUrl(), null); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), nfsVersion); VolumeObjectTO vol = (VolumeObjectTO)srcData; String path = vol.getPath(); int index = path.lastIndexOf(File.separator); @@ -95,7 +96,7 @@ protected Answer execute(CopyCommand cmd) { } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT) { // pack ova first // sync snapshot from NFS cache to S3 in NFS migration to S3 case - String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), null); + String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), nfsVersion); SnapshotObjectTO snap = (SnapshotObjectTO)srcData; String path = snap.getPath(); int index = path.lastIndexOf(File.separator); @@ -138,7 +139,7 @@ protected Answer execute(CopyCommand cmd) { return answer; } NfsTO cacheStore = (NfsTO)cmd.getCacheTO().getDataStore(); - String parentPath = storageResource.getRootDir(cacheStore.getUrl(), null); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), nfsVersion); SnapshotObjectTO newSnapshot = (SnapshotObjectTO)answer.getNewData(); String path = newSnapshot.getPath(); int index = path.lastIndexOf(File.separator); diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index c66ada8d3f69..cb73ecbd4d19 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -36,7 +36,6 @@ import org.apache.cloudstack.utils.usage.UsageUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; - import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; @@ -91,6 +90,7 @@ import com.cloud.resource.ResourceState; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.StorageManager; import com.cloud.storage.StorageStats; import com.cloud.storage.VolumeStats; @@ -718,7 +718,7 @@ protected void runInContext() { continue; } - GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), getNfsVersion(store.getId())); + GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), ImageStoreDetailsUtil.getNfsVersion(store.getId())); EndPoint ssAhost = _epSelector.select(store); if (ssAhost == null) { s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); @@ -766,16 +766,6 @@ protected void runInContext() { } } - private String getNfsVersion(long storeId) { - String nfsVersion = null; - if (_imageStoreDetailsDao.getDetails(storeId) != null){ - Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); - if (storeDetails != null && storeDetails.containsKey("nfs.version")){ - nfsVersion = storeDetails.get("nfs.version"); - } - } - return nfsVersion; - } } class AutoScaleMonitor extends ManagedContextRunnable { diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java new file mode 100755 index 000000000000..48b33fa522c5 --- /dev/null +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java @@ -0,0 +1,59 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage; + +import java.util.Map; + +import javax.inject.Inject; + +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; + +public class ImageStoreDetailsUtil { + + @Inject + private static ImageStoreDao imageStoreDao; + @Inject + private static ImageStoreDetailsDao imageStoreDetailsDao; + + /** + * Obtain NFS protocol version (if provided) for a store id.
+ * It can be set by adding an entry in {@code image_store_details} table, providing {@code name=nfs.version} and {@code value=X} (e.g. 3) + * @param storeId image store id + * @return {@code null} if {@code nfs.version} is not found for storeId
+ * {@code X} if {@code nfs.version} is found found for storeId + */ + public static String getNfsVersion(long storeId) { + String nfsVersion = null; + if (imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } + + public static String getNfsVersionByUuid(String storeUuid){ + ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); + if (imageStore != null){ + return getNfsVersion(imageStore.getId()); + } + return null; + } +} diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index 1ae5d5b30424..a51b8d52c77c 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -39,7 +39,6 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.security.keystore.KeystoreManager; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; @@ -102,6 +101,7 @@ import com.cloud.resource.UnableDeleteHostException; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage; import com.cloud.storage.UploadVO; import com.cloud.storage.VMTemplateVO; @@ -237,8 +237,6 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar @Inject ImageStoreDao _imageStoreDao; @Inject - ImageStoreDetailsDao _imageStoreDetailsDao; - @Inject TemplateDataStoreDao _tmplStoreDao; @Inject VolumeDataStoreDao _volumeStoreDao; @@ -313,7 +311,7 @@ public boolean generateSetupCommand(Long ssHostId) { setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); } - setupCmd.setNfsVersion(getNfsVersion(ssStore.getId())); + setupCmd.setNfsVersion(ImageStoreDetailsUtil.getNfsVersion(ssStore.getId())); //template/volume file upload key String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); @@ -363,17 +361,6 @@ else if( cssHost.getType() == Host.Type.SecondaryStorage ) { return true; } - private String getNfsVersion(long storeId) { - String nfsVersion = null; - if (_imageStoreDetailsDao.getDetails(storeId) != null){ - Map storeDetails = _imageStoreDetailsDao.getDetails(storeId); - if (storeDetails != null && storeDetails.containsKey("nfs.version")){ - nfsVersion = storeDetails.get("nfs.version"); - } - } - return nfsVersion; - } - @Override public boolean generateVMSetupCommand(Long ssAHostId) { HostVO ssAHost = _hostDao.findById(ssAHostId); @@ -1446,4 +1433,5 @@ public List getSecondaryStorageVmAllocators() { public void setSecondaryStorageVmAllocators(List ssVmAllocators) { _ssVmAllocators = ssVmAllocators; } + } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index b71c96f1133d..3b32961d6f28 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -53,6 +53,7 @@ import com.cloud.utils.EncryptionUtil; import com.google.gson.Gson; import com.google.gson.GsonBuilder; + import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; @@ -66,6 +67,7 @@ import io.netty.handler.codec.http.HttpResponseEncoder; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; + import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand; import org.apache.cloudstack.storage.template.UploadEntity; import org.apache.cloudstack.utils.imagestore.ImageStoreUtil; @@ -144,6 +146,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateStorageResourceAssoc; @@ -165,6 +168,7 @@ import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.Script; import com.cloud.vm.SecondaryStorageVm; + import org.joda.time.DateTime; import org.joda.time.format.ISODateTimeFormat; @@ -364,7 +368,7 @@ protected Answer copyFromSwiftToNfs(CopyCommand cmd, DataTO srcData, SwiftTO swi final String storagePath = destImageStore.getUrl(); final String destPath = destData.getPath(); try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, ImageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -391,7 +395,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, ImageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -424,7 +428,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { - String srcMountPoint = getRootDir(srcDataStore.getUrl(), null); + String srcMountPoint = getRootDir(srcDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); String snapshotPath = srcData.getPath(); int index = snapshotPath.lastIndexOf("/"); String snapshotName = snapshotPath.substring(index + 1); @@ -434,7 +438,7 @@ protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, Sn snapshotPath = snapshotPath.substring(0, index); snapshotPath = srcMountPoint + File.separator + snapshotPath; - String destMountPoint = getRootDir(destDataStore.getUrl(), null); + String destMountPoint = getRootDir(destDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); String destPath = destMountPoint + File.separator + destData.getPath(); String errMsg = null; @@ -492,8 +496,8 @@ protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObj if (srcData.getHypervisorType() == HypervisorType.XenServer) { return copySnapshotToTemplateFromNfsToNfsXenserver(cmd, srcData, srcDataStore, destData, destDataStore); } else if (srcData.getHypervisorType() == HypervisorType.KVM) { - File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl()); - File destFile = getFile(destData.getPath(), destDataStore.getUrl()); + File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + File destFile = getFile(destData.getPath(), destDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); VolumeObjectTO volumeObjectTO = srcData.getVolume(); ImageFormat srcFormat = null; @@ -577,8 +581,8 @@ protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObj return new CopyCmdAnswer(""); } - protected File getFile(String path, String nfsPath) { - String filePath = getRootDir(nfsPath, null) + File.separator + path; + protected File getFile(String path, String nfsPath, String nfsVersion) { + String filePath = getRootDir(nfsPath, nfsVersion) + File.separator + path; File f = new File(filePath); if (!f.exists()) { _storage.mkdirs(filePath); @@ -610,7 +614,7 @@ protected Answer createTemplateFromSnapshot(CopyCommand cmd) { } s_logger.debug("starting copy template to swift"); DataTO newTemplate = answer.getNewData(); - File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl()); + File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); SwiftTO swift = (SwiftTO)destDataStore; String containterName = SwiftUtil.getContainerName(destData.getObjectType().toString(), destData.getId()); String swiftPath = SwiftUtil.putObject(swift, templateFile, containterName, templateFile.getName()); @@ -717,8 +721,8 @@ protected Long determineS3VolumeIdFromKey(String key) { return Long.parseLong(StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR)); } - private String determineStorageTemplatePath(final String storagePath, String dataPath) { - return join(asList(getRootDir(storagePath, null), dataPath), File.separator); + private String determineStorageTemplatePath(final String storagePath, String dataPath, String nfsVersion) { + return join(asList(getRootDir(storagePath, nfsVersion), dataPath), File.separator); } protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String name) { @@ -732,7 +736,7 @@ protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String n throw new CloudRuntimeException("Failed to get url: " + url); } - String nfsMountPath = getRootDir(nfs.getUrl(), null); + String nfsMountPath = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(nfs.getUuid())); String filePath = nfsMountPath + File.separator + path; File directory = new File(filePath); @@ -897,7 +901,7 @@ protected Answer copyFromNfsToS3(CopyCommand cmd) { final S3TO s3 = (S3TO)destDataStore; try { - final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath()); + final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); if (s_logger.isDebugEnabled()) { s_logger.debug("Found " + srcData.getObjectType() + " from directory " + templatePath + " to upload to S3."); @@ -1110,7 +1114,7 @@ public Answer execute(DeleteSnapshotsDirCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeSnapshotPath = cmd.getDirectory(); - String parent = getRootDir(nfs.getUrl(), null); + String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeSnapshotPath.startsWith(File.separator)) { relativeSnapshotPath = relativeSnapshotPath.substring(1); @@ -1188,7 +1192,7 @@ private Answer execute(ComputeChecksumCommand cmd) { return new Answer(cmd, false, "can't handle non nfs data store"); } NfsTO nfsStore = (NfsTO)store; - String parent = getRootDir(nfsStore.getUrl(), null); + String parent = getRootDir(nfsStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1409,7 +1413,7 @@ protected Answer deleteSnapshot(final DeleteCommand cmd) { DataStoreTO dstore = obj.getDataStore(); if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; - String parent = getRootDir(nfs.getUrl(), null); + String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (!parent.endsWith(File.separator)) { parent += File.separator; } @@ -1602,7 +1606,7 @@ private Answer execute(ListVolumeCommand cmd) { } DataStoreTO store = cmd.getDataStore(); if (store instanceof NfsTO) { - String root = getRootDir(cmd.getSecUrl(), null); + String root = getRootDir(cmd.getSecUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); Map templateInfos = _dlMgr.gatherVolumeInfo(root); return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos); } else if (store instanceof S3TO) { @@ -1771,7 +1775,7 @@ protected Answer deleteTemplate(DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeTemplatePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), null); + String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1875,7 +1879,7 @@ protected Answer deleteVolume(final DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeVolumePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), null); + String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeVolumePath.startsWith(File.separator)) { relativeVolumePath = relativeVolumePath.substring(1); @@ -2672,7 +2676,7 @@ public UploadEntity createUploadEntity(String uuid, String metadata, long conten //relative path with out ssvm mount info. uploadEntity.setTemplatePath(absolutePath); String dataStoreUrl = cmd.getDataTo(); - String installPathPrefix = this.getRootDir(dataStoreUrl, null) + File.separator + absolutePath; + String installPathPrefix = this.getRootDir(dataStoreUrl, cmd.getNfsVersion()) + File.separator + absolutePath; uploadEntity.setInstallPathPrefix(installPathPrefix); uploadEntity.setHvm(cmd.getRequiresHvm()); uploadEntity.setChksum(cmd.getChecksum()); @@ -2694,7 +2698,7 @@ public UploadEntity createUploadEntity(String uuid, String metadata, long conten } private synchronized void checkSecondaryStorageResourceLimit(TemplateOrVolumePostUploadCommand cmd, int contentLengthInGB) { - String rootDir = this.getRootDir(cmd.getDataTo(), null) + File.separator; + String rootDir = this.getRootDir(cmd.getDataTo(), cmd.getNfsVersion()) + File.separator; long accountId = cmd.getAccountId(); long accountTemplateDirSize = 0; @@ -2741,7 +2745,7 @@ private String getSnapshotPathForAccount(long accountId) { private boolean isOneTimePostUrlUsed(TemplateOrVolumePostUploadCommand cmd) { String uuid = cmd.getEntityUUID(); - String uploadPath = this.getRootDir(cmd.getDataTo(), null) + File.separator + cmd.getAbsolutePath(); + String uploadPath = this.getRootDir(cmd.getDataTo(), cmd.getNfsVersion()) + File.separator + cmd.getAbsolutePath(); return uploadEntityStateMap.containsKey(uuid) || new File(uploadPath).exists(); } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java index 7829bf662541..dec6005043e8 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java @@ -53,6 +53,7 @@ import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.exception.InternalErrorException; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateHostVO; @@ -708,7 +709,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D String installPathPrefix = cmd.getInstallPath(); // for NFS, we need to get mounted path if (dstore instanceof NfsTO) { - installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), null) + File.separator + installPathPrefix; + installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; } String user = null; String password = null; From cc50c20b4b1aceb8b5817c820fb1be173d805a14 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Mon, 1 Feb 2016 12:56:04 -0800 Subject: [PATCH 04/10] CLOUDSTACK-9252: Remove static dependencies, refactor --- ...ring-engine-storage-image-core-context.xml | 4 +- .../storage/image/TemplateServiceImpl.java | 4 +- .../vmware/manager/VmwareManagerImpl.java | 5 +- .../manager/VmwareStorageManagerImpl.java | 10 +- .../resource/VmwareStorageProcessor.java | 24 +++-- .../VmwareStorageSubsystemCommandHandler.java | 8 +- .../vmware/VmwareDatacenterApiUnitTest.java | 21 +++- .../src/com/cloud/server/StatsCollector.java | 5 +- .../cloud/storage/ImageStoreDetailsUtil.java | 40 +++----- .../storage/ImageStoreDetailsUtilImpl.java | 97 +++++++++++++++++++ .../SecondaryStorageManagerImpl.java | 4 +- .../resource/NfsSecondaryStorageResource.java | 35 ++++--- .../storage/template/DownloadManagerImpl.java | 8 +- 13 files changed, 195 insertions(+), 70 deletions(-) create mode 100755 server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java diff --git a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml index db517dbd863d..40f724b64309 100644 --- a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml +++ b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml @@ -29,7 +29,7 @@ + depends-on="dataObjectManagerImpl, dataStoreManagerImpl, dataMotionServiceImpl, objectInDataStoreManagerImpl, defaultEndPointSelector, templateDataFactoryImpl, imageStoreDetailsUtilImpl" /> @@ -38,6 +38,8 @@ class="org.apache.cloudstack.storage.image.datastore.ImageStoreHelper" /> + diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index 2a6159e85fd2..edad9776db86 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -136,6 +136,8 @@ public class TemplateServiceImpl implements TemplateService { ConfigurationDao _configDao; @Inject StorageCacheManager _cacheMgr; + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; class TemplateOpContext extends AsyncRpcContext { final TemplateObject template; @@ -565,7 +567,7 @@ public void associateCrosszoneTemplatesToZone(long dcId) { } private Map listTemplate(DataStore ssStore) { - ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), ImageStoreDetailsUtil.getNfsVersion(ssStore.getId())); + ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), _imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); EndPoint ep = _epSelector.select(ssStore); Answer answer = null; if (ep == null) { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index d51d96fe949a..bf478453de08 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -46,7 +46,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.agent.AgentManager; @@ -170,7 +169,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Inject private ClusterManager _clusterMgr; @Inject - private ImageStoreDetailsDao _imageDetailsStoreDao; + private ImageStoreDetailsUtil _imageStoreDetailsUtil; private String _mountParent; private StorageLayer _storage; @@ -554,7 +553,7 @@ public boolean needRecycle(String workerTag) { @Override public void prepareSecondaryStorageStore(String storageUrl, Long storeId) { - String mountPoint = getMountPoint(storageUrl, ImageStoreDetailsUtil.getNfsVersion(storeId)); + String mountPoint = getMountPoint(storageUrl, _imageStoreDetailsUtil.getNfsVersion(storeId)); GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm"); try { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index b41a14725c55..35d1dad7b78c 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -29,6 +29,8 @@ import java.util.Properties; import java.util.UUID; +import javax.inject.Inject; + import org.apache.log4j.Logger; import com.vmware.vim25.FileInfo; @@ -93,6 +95,10 @@ import com.cloud.vm.snapshot.VMSnapshot; public class VmwareStorageManagerImpl implements VmwareStorageManager { + + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; + @Override public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) { DataTO data = cmd.getData(); @@ -157,7 +163,7 @@ public String createOvaForTemplate(TemplateObjectTO template) { String secStorageUrl = nfsStore.getUrl(); assert (secStorageUrl != null); String installPath = template.getPath(); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, ImageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); String installFullPath = secondaryMountPoint + "/" + installPath; try { if (installFullPath.endsWith(".ova")) { @@ -195,7 +201,7 @@ public String createOvaForVolume(VolumeObjectTO volume) { String installPath = volume.getPath(); int index = installPath.lastIndexOf(File.separator); String volumeUuid = installPath.substring(index + 1); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, ImageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); //The real volume path String volumePath = installPath + File.separator + volumeUuid + ".ova"; String installFullPath = secondaryMountPoint + "/" + installPath; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 216332491792..b469ae28877b 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -33,6 +33,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import javax.inject.Inject; + import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -110,6 +112,10 @@ import com.cloud.vm.VmDetailConstants; public class VmwareStorageProcessor implements StorageProcessor { + + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; + private static final Logger s_logger = Logger.getLogger(VmwareStorageProcessor.class); private static final int DEFAULT_NFS_PORT = 2049; @@ -317,7 +323,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { if (managed) { VirtualMachineMO vmMo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - managedStoragePoolRootVolumeName, false, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + managedStoragePoolRootVolumeName, false, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); vmMo.unregisterVm(); @@ -334,7 +340,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { } else { copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - templateUuidName, true, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + templateUuidName, true, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); } } else { s_logger.info("Template " + templateInfo.second() + " has already been setup, skip the template setup process in primary storage"); @@ -579,8 +585,8 @@ public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { } } - Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); - deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(uuid)); + Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(uuid)); VolumeObjectTO newVolume = new VolumeObjectTO(); newVolume.setPath(result.second()); return new CopyCmdAnswer(newVolume); @@ -638,7 +644,7 @@ private Pair copyVolumeToSecStorage(VmwareHostService hostServic vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false); exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), - ImageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); + _imageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); return new Pair(destVolumePath, exportName); } finally { @@ -840,7 +846,7 @@ public Answer createTemplateFromVolume(CopyCommand cmd) { Ternary result = createTemplateFromVolume(vmMo, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath, - hostService.getWorkerName(context, cmd, 0), ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + hostService.getWorkerName(context, cmd, 0), _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1032,7 +1038,7 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { NfsTO nfsSvr = (NfsTO)imageStore; Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000, - ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1175,7 +1181,7 @@ public Answer backupSnapshot(CopyCommand cmd) { throw new Exception("Failed to take snapshot " + srcSnapshot.getName() + " on vm: " + vmName); } - String nfsVersion = ImageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); + String nfsVersion = _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); backupResult = backupSnapshotToSecondaryStorage(vmMo, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl, prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), nfsVersion); @@ -2252,7 +2258,7 @@ public Answer createVolumeFromSnapshot(CopyCommand cmd) { backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ovf", ""); } DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs); - restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, ImageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(newVolumeName); diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index 77a71f549ef7..b8544d086f7d 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -20,6 +20,8 @@ import java.io.File; +import javax.inject.Inject; + import org.apache.log4j.Logger; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CopyCommand; @@ -40,6 +42,10 @@ import com.cloud.storage.ImageStoreDetailsUtil; public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemCommandHandlerBase { + + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; + private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); private VmwareStorageManager storageManager; private PremiumSecondaryStorageResource storageResource; @@ -78,7 +84,7 @@ protected Answer execute(CopyCommand cmd) { } } - String nfsVersion = ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); + String nfsVersion = _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) { //need to take extra processing for vmware, such as packing to ova, before sending to S3 if (srcData.getObjectType() == DataObjectType.VOLUME) { diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 6b89e7bb9c88..c4c48a5dd0aa 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -28,6 +28,7 @@ import javax.naming.ConfigurationException; import com.cloud.user.User; + import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -48,12 +49,12 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; - import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.test.utils.SpringUtils; @@ -87,6 +88,7 @@ import com.cloud.org.Managed.ManagedState; import com.cloud.secstorage.CommandExecLogDao; import com.cloud.server.ConfigurationServer; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountService; @@ -131,6 +133,9 @@ public class VmwareDatacenterApiUnitTest { @Inject AccountManager _acctMgr; + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; + long zoneId; long podId; long clusterId; @@ -225,6 +230,8 @@ public void testSetUp() { Mockito.when(addCmd.getPassword()).thenReturn(password); Mockito.when(addCmd.getName()).thenReturn(vmwareDcName); Mockito.when(removeCmd.getZoneId()).thenReturn(1L); + Mockito.when(_imageStoreDetailsUtil.getNfsVersion(Mockito.anyLong())).thenReturn(null); + Mockito.when(_imageStoreDetailsUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn(null); } @After @@ -433,7 +440,17 @@ public DataStoreManager dataStoreManager() { } @Bean - public ImageStoreDetailsDao imageStoreDetailsDao(){ + public ImageStoreDetailsUtil imageStoreDetailsUtil() { + return Mockito.mock(ImageStoreDetailsUtil.class); + } + + @Bean + public ImageStoreDao imageStoreDao() { + return Mockito.mock(ImageStoreDao.class); + } + + @Bean + public ImageStoreDetailsDao imageStoreDetailsDao() { return Mockito.mock(ImageStoreDetailsDao.class); } diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index cb73ecbd4d19..b5d6b799d3b6 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -43,7 +43,6 @@ import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.graphite.GraphiteClient; @@ -200,7 +199,7 @@ public String toString() { @Inject private HostGpuGroupsDao _hostGpuGroupsDao; @Inject - private ImageStoreDetailsDao _imageStoreDetailsDao; + ImageStoreDetailsUtil _imageStoreDetailsUtil; private ConcurrentHashMap _hostStats = new ConcurrentHashMap(); private final ConcurrentHashMap _VmStats = new ConcurrentHashMap(); @@ -718,7 +717,7 @@ protected void runInContext() { continue; } - GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), ImageStoreDetailsUtil.getNfsVersion(store.getId())); + GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), _imageStoreDetailsUtil.getNfsVersion(store.getId())); EndPoint ssAhost = _epSelector.select(store); if (ssAhost == null) { s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java index 48b33fa522c5..201fdb4866ac 100755 --- a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java @@ -16,20 +16,10 @@ // under the License. package com.cloud.storage; -import java.util.Map; +import com.cloud.utils.component.Manager; -import javax.inject.Inject; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; - -public class ImageStoreDetailsUtil { - - @Inject - private static ImageStoreDao imageStoreDao; - @Inject - private static ImageStoreDetailsDao imageStoreDetailsDao; +public interface ImageStoreDetailsUtil extends Manager { /** * Obtain NFS protocol version (if provided) for a store id.
@@ -38,22 +28,14 @@ public class ImageStoreDetailsUtil { * @return {@code null} if {@code nfs.version} is not found for storeId
* {@code X} if {@code nfs.version} is found found for storeId */ - public static String getNfsVersion(long storeId) { - String nfsVersion = null; - if (imageStoreDetailsDao.getDetails(storeId) != null){ - Map storeDetails = imageStoreDetailsDao.getDetails(storeId); - if (storeDetails != null && storeDetails.containsKey("nfs.version")){ - nfsVersion = storeDetails.get("nfs.version"); - } - } - return nfsVersion; - } + public String getNfsVersion(long storeId); - public static String getNfsVersionByUuid(String storeUuid){ - ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); - if (imageStore != null){ - return getNfsVersion(imageStore.getId()); - } - return null; - } + /** + * Obtain NFS protocol version (if provided) for a store uuid.
+ * It can be set by adding an entry in {@code image_store_details} table, providing {@code name=nfs.version} and {@code value=X} (e.g. 3) + * @param storeId image store id + * @return {@code null} if {@code nfs.version} is not found for storeUuid
+ * {@code X} if {@code nfs.version} is found found for storeUuid + */ + public String getNfsVersionByUuid(String storeUuid); } diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java b/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java new file mode 100755 index 000000000000..d0207ba1311b --- /dev/null +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java @@ -0,0 +1,97 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage; + +import java.util.Map; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; +import org.springframework.stereotype.Component; + +@Component +public class ImageStoreDetailsUtilImpl implements ImageStoreDetailsUtil { + + @Inject + private ImageStoreDao imageStoreDao; + @Inject + private ImageStoreDetailsDao imageStoreDetailsDao; + + public String getNfsVersion(long storeId) { + String nfsVersion = null; + if (imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } + + public String getNfsVersionByUuid(String storeUuid){ + ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); + if (imageStore != null){ + return getNfsVersion(imageStore.getId()); + } + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public void setName(String name) { + } + + @Override + public void setConfigParams(Map params) { + } + + @Override + public Map getConfigParams() { + return null; + } + + @Override + public int getRunLevel() { + return 0; + } + + @Override + public void setRunLevel(int level) { + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + return false; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return false; + } +} diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index a51b8d52c77c..ba17b552eeee 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -240,6 +240,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar TemplateDataStoreDao _tmplStoreDao; @Inject VolumeDataStoreDao _volumeStoreDao; + @Inject + ImageStoreDetailsUtil _imageStoreDetailsUtil; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; private int _secStorageVmMtuSize; @@ -311,7 +313,7 @@ public boolean generateSetupCommand(Long ssHostId) { setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); } - setupCmd.setNfsVersion(ImageStoreDetailsUtil.getNfsVersion(ssStore.getId())); + setupCmd.setNfsVersion(_imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); //template/volume file upload key String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index 3b32961d6f28..bae66b62c5a5 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -146,7 +146,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.DataStoreRole; -import com.cloud.storage.ImageStoreDetailsUtil; +import com.cloud.storage.ImageStoreDetailsUtilImpl; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateStorageResourceAssoc; @@ -174,6 +174,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements SecondaryStorageResource { + @Inject + ImageStoreDetailsUtilImpl _imageStoreDetailsUtil; + private static final Logger s_logger = Logger.getLogger(NfsSecondaryStorageResource.class); private static final String TEMPLATE_ROOT_DIR = "template/tmpl"; @@ -368,7 +371,7 @@ protected Answer copyFromSwiftToNfs(CopyCommand cmd, DataTO srcData, SwiftTO swi final String storagePath = destImageStore.getUrl(); final String destPath = destData.getPath(); try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath, ImageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, _imageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -395,7 +398,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath, ImageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, _imageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -428,7 +431,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { - String srcMountPoint = getRootDir(srcDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + String srcMountPoint = getRootDir(srcDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); String snapshotPath = srcData.getPath(); int index = snapshotPath.lastIndexOf("/"); String snapshotName = snapshotPath.substring(index + 1); @@ -438,7 +441,7 @@ protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, Sn snapshotPath = snapshotPath.substring(0, index); snapshotPath = srcMountPoint + File.separator + snapshotPath; - String destMountPoint = getRootDir(destDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); + String destMountPoint = getRootDir(destDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); String destPath = destMountPoint + File.separator + destData.getPath(); String errMsg = null; @@ -496,8 +499,8 @@ protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObj if (srcData.getHypervisorType() == HypervisorType.XenServer) { return copySnapshotToTemplateFromNfsToNfsXenserver(cmd, srcData, srcDataStore, destData, destDataStore); } else if (srcData.getHypervisorType() == HypervisorType.KVM) { - File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); - File destFile = getFile(destData.getPath(), destDataStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); + File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + File destFile = getFile(destData.getPath(), destDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); VolumeObjectTO volumeObjectTO = srcData.getVolume(); ImageFormat srcFormat = null; @@ -614,7 +617,7 @@ protected Answer createTemplateFromSnapshot(CopyCommand cmd) { } s_logger.debug("starting copy template to swift"); DataTO newTemplate = answer.getNewData(); - File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); SwiftTO swift = (SwiftTO)destDataStore; String containterName = SwiftUtil.getContainerName(destData.getObjectType().toString(), destData.getId()); String swiftPath = SwiftUtil.putObject(swift, templateFile, containterName, templateFile.getName()); @@ -736,7 +739,7 @@ protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String n throw new CloudRuntimeException("Failed to get url: " + url); } - String nfsMountPath = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(nfs.getUuid())); + String nfsMountPath = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(nfs.getUuid())); String filePath = nfsMountPath + File.separator + path; File directory = new File(filePath); @@ -901,7 +904,7 @@ protected Answer copyFromNfsToS3(CopyCommand cmd) { final S3TO s3 = (S3TO)destDataStore; try { - final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath(), ImageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); if (s_logger.isDebugEnabled()) { s_logger.debug("Found " + srcData.getObjectType() + " from directory " + templatePath + " to upload to S3."); @@ -1114,7 +1117,7 @@ public Answer execute(DeleteSnapshotsDirCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeSnapshotPath = cmd.getDirectory(); - String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeSnapshotPath.startsWith(File.separator)) { relativeSnapshotPath = relativeSnapshotPath.substring(1); @@ -1192,7 +1195,7 @@ private Answer execute(ComputeChecksumCommand cmd) { return new Answer(cmd, false, "can't handle non nfs data store"); } NfsTO nfsStore = (NfsTO)store; - String parent = getRootDir(nfsStore.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); + String parent = getRootDir(nfsStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1413,7 +1416,7 @@ protected Answer deleteSnapshot(final DeleteCommand cmd) { DataStoreTO dstore = obj.getDataStore(); if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; - String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (!parent.endsWith(File.separator)) { parent += File.separator; } @@ -1606,7 +1609,7 @@ private Answer execute(ListVolumeCommand cmd) { } DataStoreTO store = cmd.getDataStore(); if (store instanceof NfsTO) { - String root = getRootDir(cmd.getSecUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); + String root = getRootDir(cmd.getSecUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); Map templateInfos = _dlMgr.gatherVolumeInfo(root); return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos); } else if (store instanceof S3TO) { @@ -1775,7 +1778,7 @@ protected Answer deleteTemplate(DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeTemplatePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1879,7 +1882,7 @@ protected Answer deleteVolume(final DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeVolumePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); if (relativeVolumePath.startsWith(File.separator)) { relativeVolumePath = relativeVolumePath.substring(1); diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java index dec6005043e8..c6f2ac8406fe 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java @@ -38,6 +38,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.storage.command.DownloadCommand; @@ -53,7 +54,7 @@ import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.exception.InternalErrorException; -import com.cloud.storage.ImageStoreDetailsUtil; +import com.cloud.storage.ImageStoreDetailsUtilImpl; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateHostVO; @@ -90,6 +91,9 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager StorageLayer _storage; public Map _processors; + @Inject + ImageStoreDetailsUtilImpl _imageStoreDetailsUtil; + public class Completion implements DownloadCompleteCallback { private final String jobId; @@ -709,7 +713,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D String installPathPrefix = cmd.getInstallPath(); // for NFS, we need to get mounted path if (dstore instanceof NfsTO) { - installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), ImageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; + installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; } String user = null; String password = null; From 3fb18bd4946caf0ba89a00aa7504b472c4806a09 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 3 Feb 2016 07:08:39 -0800 Subject: [PATCH 05/10] CLOUDSTACK-9252: New refactor --- ...ring-engine-storage-image-core-context.xml | 6 +- .../storage/image/TemplateServiceImpl.java | 4 +- .../vmware/manager/VmwareManagerImpl.java | 8 +- .../manager/VmwareStorageManagerImpl.java | 12 +-- .../resource/VmwareStorageProcessor.java | 26 ++--- .../VmwareStorageSubsystemCommandHandler.java | 10 +- .../vmware/VmwareDatacenterApiUnitTest.java | 6 +- .../src/com/cloud/server/StatsCollector.java | 4 +- .../cloud/storage/ImageStoreDetailsUtil.java | 36 ++++++- .../storage/ImageStoreDetailsUtilImpl.java | 97 ------------------- .../SecondaryStorageManagerImpl.java | 4 +- .../resource/NfsSecondaryStorageResource.java | 4 +- .../storage/template/DownloadManagerImpl.java | 11 ++- 13 files changed, 81 insertions(+), 147 deletions(-) delete mode 100755 server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java diff --git a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml index 40f724b64309..2441d1c56fe4 100644 --- a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml +++ b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml @@ -29,7 +29,7 @@ + depends-on="dataObjectManagerImpl, dataStoreManagerImpl, dataMotionServiceImpl, objectInDataStoreManagerImpl, defaultEndPointSelector, templateDataFactoryImpl, imageStoreDetailsUtil" /> @@ -38,8 +38,8 @@ class="org.apache.cloudstack.storage.image.datastore.ImageStoreHelper" /> - + diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index edad9776db86..a1d10e328077 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -137,7 +137,7 @@ public class TemplateServiceImpl implements TemplateService { @Inject StorageCacheManager _cacheMgr; @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + ImageStoreDetailsUtil imageStoreDetailsUtil; class TemplateOpContext extends AsyncRpcContext { final TemplateObject template; @@ -567,7 +567,7 @@ public void associateCrosszoneTemplatesToZone(long dcId) { } private Map listTemplate(DataStore ssStore) { - ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), _imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); + ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); EndPoint ep = _epSelector.select(ssStore); Answer answer = null; if (ep == null) { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index bf478453de08..71383c33331d 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -47,6 +47,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.springframework.context.ApplicationContext; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -168,8 +169,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private ManagementServerHostPeerDao _mshostPeerDao; @Inject private ClusterManager _clusterMgr; - @Inject - private ImageStoreDetailsUtil _imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; private String _mountParent; private StorageLayer _storage; @@ -202,6 +202,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw public VmwareManagerImpl() { _storageMgr = new VmwareStorageManagerImpl(this); + ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } @Override @@ -553,7 +555,7 @@ public boolean needRecycle(String workerTag) { @Override public void prepareSecondaryStorageStore(String storageUrl, Long storeId) { - String mountPoint = getMountPoint(storageUrl, _imageStoreDetailsUtil.getNfsVersion(storeId)); + String mountPoint = getMountPoint(storageUrl, imageStoreDetailsUtil.getNfsVersion(storeId)); GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm"); try { diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index 35d1dad7b78c..8d5fc104585f 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -29,8 +29,6 @@ import java.util.Properties; import java.util.UUID; -import javax.inject.Inject; - import org.apache.log4j.Logger; import com.vmware.vim25.FileInfo; @@ -44,6 +42,7 @@ import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.BackupSnapshotAnswer; @@ -96,8 +95,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { - @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; @Override public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) { @@ -143,6 +141,8 @@ public void createOva(String path, String name) { public VmwareStorageManagerImpl(VmwareStorageMount mountService) { assert (mountService != null); _mountService = mountService; + ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } public void configure(Map params) { @@ -163,7 +163,7 @@ public String createOvaForTemplate(TemplateObjectTO template) { String secStorageUrl = nfsStore.getUrl(); assert (secStorageUrl != null); String installPath = template.getPath(); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); String installFullPath = secondaryMountPoint + "/" + installPath; try { if (installFullPath.endsWith(".ova")) { @@ -201,7 +201,7 @@ public String createOvaForVolume(VolumeObjectTO volume) { String installPath = volume.getPath(); int index = installPath.lastIndexOf(File.separator); String volumeUuid = installPath.substring(index + 1); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); //The real volume path String volumePath = installPath + File.separator + volumeUuid + ".ova"; String installFullPath = secondaryMountPoint + "/" + installPath; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index b469ae28877b..660b93bb9035 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -33,8 +33,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import javax.inject.Inject; - import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -69,6 +67,7 @@ import org.apache.cloudstack.storage.to.SnapshotObjectTO; import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -113,8 +112,7 @@ public class VmwareStorageProcessor implements StorageProcessor { - @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; private static final Logger s_logger = Logger.getLogger(VmwareStorageProcessor.class); private static final int DEFAULT_NFS_PORT = 2049; @@ -137,6 +135,8 @@ public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFl this.resource = resource; _shutdownWaitMs = shutdownWaitMs; _gson = GsonHelper.getGsonLogger(); + ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } @Override @@ -323,7 +323,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { if (managed) { VirtualMachineMO vmMo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - managedStoragePoolRootVolumeName, false, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + managedStoragePoolRootVolumeName, false, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); vmMo.unregisterVm(); @@ -340,7 +340,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { } else { copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - templateUuidName, true, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + templateUuidName, true, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); } } else { s_logger.info("Template " + templateInfo.second() + " has already been setup, skip the template setup process in primary storage"); @@ -585,8 +585,8 @@ public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { } } - Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); - deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(uuid)); + Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), imageStoreDetailsUtil.getNfsVersionByUuid(uuid)); VolumeObjectTO newVolume = new VolumeObjectTO(); newVolume.setPath(result.second()); return new CopyCmdAnswer(newVolume); @@ -644,7 +644,7 @@ private Pair copyVolumeToSecStorage(VmwareHostService hostServic vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false); exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), - _imageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); + imageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); return new Pair(destVolumePath, exportName); } finally { @@ -846,7 +846,7 @@ public Answer createTemplateFromVolume(CopyCommand cmd) { Ternary result = createTemplateFromVolume(vmMo, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath, - hostService.getWorkerName(context, cmd, 0), _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + hostService.getWorkerName(context, cmd, 0), imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1038,7 +1038,7 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { NfsTO nfsSvr = (NfsTO)imageStore; Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000, - _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1181,7 +1181,7 @@ public Answer backupSnapshot(CopyCommand cmd) { throw new Exception("Failed to take snapshot " + srcSnapshot.getName() + " on vm: " + vmName); } - String nfsVersion = _imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); + String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); backupResult = backupSnapshotToSecondaryStorage(vmMo, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl, prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), nfsVersion); @@ -2258,7 +2258,7 @@ public Answer createVolumeFromSnapshot(CopyCommand cmd) { backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ovf", ""); } DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs); - restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, _imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(newVolumeName); diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index b8544d086f7d..212c8111bfd1 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -20,8 +20,6 @@ import java.io.File; -import javax.inject.Inject; - import org.apache.log4j.Logger; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CopyCommand; @@ -29,6 +27,7 @@ import org.apache.cloudstack.storage.to.SnapshotObjectTO; import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.to.DataObjectType; @@ -43,8 +42,7 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemCommandHandlerBase { - @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); private VmwareStorageManager storageManager; @@ -68,6 +66,8 @@ public void setStorageManager(VmwareStorageManager storageManager) { public VmwareStorageSubsystemCommandHandler(StorageProcessor processor) { super(processor); + ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } @Override @@ -84,7 +84,7 @@ protected Answer execute(CopyCommand cmd) { } } - String nfsVersion = _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); + String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) { //need to take extra processing for vmware, such as packing to ova, before sending to S3 if (srcData.getObjectType() == DataObjectType.VOLUME) { diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index c4c48a5dd0aa..c72d9d44f5c4 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -134,7 +134,7 @@ public class VmwareDatacenterApiUnitTest { AccountManager _acctMgr; @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + ImageStoreDetailsUtil imageStoreDetailsUtil; long zoneId; long podId; @@ -230,8 +230,8 @@ public void testSetUp() { Mockito.when(addCmd.getPassword()).thenReturn(password); Mockito.when(addCmd.getName()).thenReturn(vmwareDcName); Mockito.when(removeCmd.getZoneId()).thenReturn(1L); - Mockito.when(_imageStoreDetailsUtil.getNfsVersion(Mockito.anyLong())).thenReturn(null); - Mockito.when(_imageStoreDetailsUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn(null); + Mockito.when(imageStoreDetailsUtil.getNfsVersion(Mockito.anyLong())).thenReturn(null); + Mockito.when(imageStoreDetailsUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn(null); } @After diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index b5d6b799d3b6..6f0c928197ab 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -199,7 +199,7 @@ public String toString() { @Inject private HostGpuGroupsDao _hostGpuGroupsDao; @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + ImageStoreDetailsUtil imageStoreDetailsUtil; private ConcurrentHashMap _hostStats = new ConcurrentHashMap(); private final ConcurrentHashMap _VmStats = new ConcurrentHashMap(); @@ -717,7 +717,7 @@ protected void runInContext() { continue; } - GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), _imageStoreDetailsUtil.getNfsVersion(store.getId())); + GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), imageStoreDetailsUtil.getNfsVersion(store.getId())); EndPoint ssAhost = _epSelector.select(store); if (ssAhost == null) { s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java index 201fdb4866ac..4ce0bd727119 100755 --- a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java @@ -16,10 +16,22 @@ // under the License. package com.cloud.storage; -import com.cloud.utils.component.Manager; +import java.util.Map; +import javax.inject.Inject; -public interface ImageStoreDetailsUtil extends Manager { +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; +import org.springframework.stereotype.Component; + +@Component +public class ImageStoreDetailsUtil { + + @Inject + protected ImageStoreDao imageStoreDao; + @Inject + protected ImageStoreDetailsDao imageStoreDetailsDao; /** * Obtain NFS protocol version (if provided) for a store id.
@@ -28,7 +40,16 @@ public interface ImageStoreDetailsUtil extends Manager { * @return {@code null} if {@code nfs.version} is not found for storeId
* {@code X} if {@code nfs.version} is found found for storeId */ - public String getNfsVersion(long storeId); + public String getNfsVersion(long storeId) { + String nfsVersion = null; + if (imageStoreDetailsDao.getDetails(storeId) != null){ + Map storeDetails = imageStoreDetailsDao.getDetails(storeId); + if (storeDetails != null && storeDetails.containsKey("nfs.version")){ + nfsVersion = storeDetails.get("nfs.version"); + } + } + return nfsVersion; + } /** * Obtain NFS protocol version (if provided) for a store uuid.
@@ -37,5 +58,12 @@ public interface ImageStoreDetailsUtil extends Manager { * @return {@code null} if {@code nfs.version} is not found for storeUuid
* {@code X} if {@code nfs.version} is found found for storeUuid */ - public String getNfsVersionByUuid(String storeUuid); + public String getNfsVersionByUuid(String storeUuid){ + ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); + if (imageStore != null){ + return getNfsVersion(imageStore.getId()); + } + return null; + } + } diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java b/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java deleted file mode 100755 index d0207ba1311b..000000000000 --- a/server/src/com/cloud/storage/ImageStoreDetailsUtilImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.storage; - -import java.util.Map; - -import javax.inject.Inject; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; -import org.springframework.stereotype.Component; - -@Component -public class ImageStoreDetailsUtilImpl implements ImageStoreDetailsUtil { - - @Inject - private ImageStoreDao imageStoreDao; - @Inject - private ImageStoreDetailsDao imageStoreDetailsDao; - - public String getNfsVersion(long storeId) { - String nfsVersion = null; - if (imageStoreDetailsDao.getDetails(storeId) != null){ - Map storeDetails = imageStoreDetailsDao.getDetails(storeId); - if (storeDetails != null && storeDetails.containsKey("nfs.version")){ - nfsVersion = storeDetails.get("nfs.version"); - } - } - return nfsVersion; - } - - public String getNfsVersionByUuid(String storeUuid){ - ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); - if (imageStore != null){ - return getNfsVersion(imageStore.getId()); - } - return null; - } - - @Override - public String getName() { - return null; - } - - @Override - public void setName(String name) { - } - - @Override - public void setConfigParams(Map params) { - } - - @Override - public Map getConfigParams() { - return null; - } - - @Override - public int getRunLevel() { - return 0; - } - - @Override - public void setRunLevel(int level) { - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - return false; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return false; - } -} diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index ba17b552eeee..c1445ad944ce 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -241,7 +241,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar @Inject VolumeDataStoreDao _volumeStoreDao; @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; + ImageStoreDetailsUtil imageStoreDetailsUtil; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; private int _secStorageVmMtuSize; @@ -313,7 +313,7 @@ public boolean generateSetupCommand(Long ssHostId) { setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); } - setupCmd.setNfsVersion(_imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); + setupCmd.setNfsVersion(imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); //template/volume file upload key String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index bae66b62c5a5..25a987844a45 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -146,7 +146,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.DataStoreRole; -import com.cloud.storage.ImageStoreDetailsUtilImpl; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateStorageResourceAssoc; @@ -175,7 +175,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements SecondaryStorageResource { @Inject - ImageStoreDetailsUtilImpl _imageStoreDetailsUtil; + ImageStoreDetailsUtil _imageStoreDetailsUtil; private static final Logger s_logger = Logger.getLogger(NfsSecondaryStorageResource.class); diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java index c6f2ac8406fe..6fb2aa239ae6 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java @@ -38,7 +38,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.storage.command.DownloadCommand; @@ -47,6 +46,7 @@ import org.apache.cloudstack.storage.command.DownloadProgressCommand.RequestType; import org.apache.cloudstack.storage.resource.SecondaryStorageResource; import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.utils.net.Proxy; @@ -54,7 +54,7 @@ import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.exception.InternalErrorException; -import com.cloud.storage.ImageStoreDetailsUtilImpl; +import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateHostVO; @@ -91,8 +91,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager StorageLayer _storage; public Map _processors; - @Inject - ImageStoreDetailsUtilImpl _imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; public class Completion implements DownloadCompleteCallback { private final String jobId; @@ -713,7 +712,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D String installPathPrefix = cmd.getInstallPath(); // for NFS, we need to get mounted path if (dstore instanceof NfsTO) { - installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; + installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; } String user = null; String password = null; @@ -955,6 +954,8 @@ public boolean drain() { } public DownloadManagerImpl() { + ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } @Override From 068fceae95c620c1b86e27a64aa20b5137744808 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 3 Feb 2016 07:09:08 -0800 Subject: [PATCH 06/10] CLOUDSTACK-9252: Add unit tests --- .../storage/ImageStoreDetailsUtilTest.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java diff --git a/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java b/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java new file mode 100755 index 000000000000..e588029eb95d --- /dev/null +++ b/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java @@ -0,0 +1,79 @@ +package com.cloud.storage; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; +import org.junit.Before; +import org.junit.Test; + +public class ImageStoreDetailsUtilTest { + + private final static long STORE_ID = 1l; + private final static String STORE_UUID = "aaaa-aaaa-aaaa-aaaa"; + private final static String NFS_VERSION = "3"; + + ImageStoreDetailsUtil imageStoreDetailsUtil = new ImageStoreDetailsUtil(); + + ImageStoreDao imgStoreDao = mock(ImageStoreDao.class); + ImageStoreDetailsDao imgStoreDetailsDao = mock(ImageStoreDetailsDao.class); + + @Before + public void setup() throws Exception { + Map imgStoreDetails = new HashMap(); + imgStoreDetails.put("nfs.version", NFS_VERSION); + when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); + + ImageStoreVO imgStoreVO = mock(ImageStoreVO.class); + when(imgStoreVO.getId()).thenReturn(Long.valueOf(STORE_ID)); + when(imgStoreDao.findByUuid(STORE_UUID)).thenReturn(imgStoreVO); + + imageStoreDetailsUtil.imageStoreDao = imgStoreDao; + imageStoreDetailsUtil.imageStoreDetailsDao = imgStoreDetailsDao; + } + + @Test + public void testGetNfsVersion(){ + String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + assertEquals(NFS_VERSION, nfsVersion); + } + + @Test + public void testGetNfsVersionNotFound(){ + Map imgStoreDetails = new HashMap(); + imgStoreDetails.put("other.prop", "propValue"); + when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); + + String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + assertNull(nfsVersion); + } + + @Test + public void testGetNfsVersionNoDetails(){ + Map imgStoreDetails = new HashMap(); + when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); + + String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + assertNull(nfsVersion); + } + + @Test + public void testGetNfsVersionByUuid(){ + String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); + assertEquals(NFS_VERSION, nfsVersion); + } + + @Test + public void testGetNfsVersionByUuidNoImgStore(){ + when(imgStoreDao.findByUuid(STORE_UUID)).thenReturn(null); + String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); + assertNull(nfsVersion); + } +} \ No newline at end of file From c5677cf634c66d1bc85ae8dbb3a8b50fb8823969 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 4 Feb 2016 09:50:25 -0800 Subject: [PATCH 07/10] CLOUDSTACK-9252: Mock application context for unit test --- .../vmware/manager/VmwareManagerImpl.java | 7 ++-- .../vmware/VmwareDatacenterApiUnitTest.java | 32 ++++++------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 71383c33331d..a47743761293 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -112,6 +112,7 @@ import com.cloud.utils.FileUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; +import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; @@ -200,10 +201,12 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private final ScheduledExecutorService _hostScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vmware-Host-Scan")); + private ApplicationContext applicationContext; + public VmwareManagerImpl() { - _storageMgr = new VmwareStorageManagerImpl(this); - ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); + applicationContext = ComponentContext.getApplicationContext(); imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); + _storageMgr = new VmwareStorageManagerImpl(this); } @Override diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index c72d9d44f5c4..0f056ee5b2cf 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -38,6 +38,8 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan.Filter; @@ -54,8 +56,6 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.test.utils.SpringUtils; import com.cloud.agent.AgentManager; @@ -101,6 +101,7 @@ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class) +@PrepareForTest({ComponentContext.class, ApplicationContext.class}) public class VmwareDatacenterApiUnitTest { @Inject @@ -133,9 +134,6 @@ public class VmwareDatacenterApiUnitTest { @Inject AccountManager _acctMgr; - @Inject - ImageStoreDetailsUtil imageStoreDetailsUtil; - long zoneId; long podId; long clusterId; @@ -163,6 +161,13 @@ public class VmwareDatacenterApiUnitTest { @BeforeClass public static void setUp() throws ConfigurationException { + ComponentContext ctx = new ComponentContext(); + ImageStoreDetailsUtil imgSDUtil = Mockito.mock(ImageStoreDetailsUtil.class); + Mockito.when(imgSDUtil.getNfsVersion(Mockito.anyLong())).thenReturn("3"); + Mockito.when(imgSDUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn("3"); + ApplicationContext appCtx = Mockito.mock(ApplicationContext.class); + Mockito.when(appCtx.getBean(Mockito.anyString(), Mockito.any(ImageStoreDetailsUtil.class))).thenReturn(imgSDUtil); + ctx.setApplicationContext(appCtx); } @Before @@ -230,8 +235,6 @@ public void testSetUp() { Mockito.when(addCmd.getPassword()).thenReturn(password); Mockito.when(addCmd.getName()).thenReturn(vmwareDcName); Mockito.when(removeCmd.getZoneId()).thenReturn(1L); - Mockito.when(imageStoreDetailsUtil.getNfsVersion(Mockito.anyLong())).thenReturn(null); - Mockito.when(imageStoreDetailsUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn(null); } @After @@ -439,21 +442,6 @@ public DataStoreManager dataStoreManager() { return Mockito.mock(DataStoreManager.class); } - @Bean - public ImageStoreDetailsUtil imageStoreDetailsUtil() { - return Mockito.mock(ImageStoreDetailsUtil.class); - } - - @Bean - public ImageStoreDao imageStoreDao() { - return Mockito.mock(ImageStoreDao.class); - } - - @Bean - public ImageStoreDetailsDao imageStoreDetailsDao() { - return Mockito.mock(ImageStoreDetailsDao.class); - } - public static class Library implements TypeFilter { @Override From 64c6debf0046e26dde81e915bb23a85fa3eae250 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 5 Feb 2016 06:22:23 -0800 Subject: [PATCH 08/10] CLOUDSTACK-9252: Little refactor --- .../spring-engine-storage-image-core-context.xml | 2 -- .../core/spring-engine-storage-core-context.xml | 2 ++ .../vmware/manager/VmwareManagerImpl.java | 4 +--- .../resource/NfsSecondaryStorageResource.java | 13 ------------- 4 files changed, 3 insertions(+), 18 deletions(-) diff --git a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml index 2441d1c56fe4..51be9d99faa8 100644 --- a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml +++ b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml @@ -38,8 +38,6 @@ class="org.apache.cloudstack.storage.image.datastore.ImageStoreHelper" /> - diff --git a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml index 8040d801b3e5..a45e4ee3e40c 100644 --- a/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml +++ b/engine/storage/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml @@ -69,5 +69,7 @@ + + diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index a47743761293..a938d38f78bd 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -201,10 +201,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private final ScheduledExecutorService _hostScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vmware-Host-Scan")); - private ApplicationContext applicationContext; - public VmwareManagerImpl() { - applicationContext = ComponentContext.getApplicationContext(); + ApplicationContext applicationContext = ComponentContext.getApplicationContext(); imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); _storageMgr = new VmwareStorageManagerImpl(this); } diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index 25a987844a45..0fa2b54901bd 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -96,7 +96,6 @@ import org.apache.cloudstack.storage.command.UploadStatusAnswer.UploadStatus; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.command.UploadStatusCommand; import org.apache.cloudstack.storage.template.DownloadManager; import org.apache.cloudstack.storage.template.DownloadManagerImpl; @@ -229,8 +228,6 @@ public void setTimeout(int timeout) { @Inject ImageStoreDetailsDao detailsStoreDao; - public static final String IMAGE_STORE_PARAMETER_ID = "imageStoreId"; - public void setParentPath(String path) { _parent = path; } @@ -1316,16 +1313,6 @@ private void configCerts(KeystoreManager.Certificates certs) { } } - private Long getImageStoreId(DataStoreTO dataStore){ - Long imgStoreId = null; - if (dataStore.getRole().equals(DataStoreRole.Image)){ - String uuid = dataStore.getUuid(); - ImageStoreVO imageStoreVO = dataStoreDao.findByUuid(uuid); - imgStoreId = imageStoreVO.getId(); - } - return imgStoreId; - } - private Answer execute(SecStorageSetupCommand cmd) { if (!_inSystemVM) { return new Answer(cmd, true, null); From 5c0728a792de5f9707a3c1740b067839faf1252f Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 5 Feb 2016 08:33:54 -0800 Subject: [PATCH 09/10] CLOUDSTACK-9252: Add missing licence header --- .../cloud/storage/ImageStoreDetailsUtilTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java b/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java index e588029eb95d..026a7d346d2e 100755 --- a/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java +++ b/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java @@ -1,3 +1,19 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. package com.cloud.storage; import static org.junit.Assert.assertEquals; From db3e18df313f1be043e3f1fc920aa4e7c2771afd Mon Sep 17 00:00:00 2001 From: nvazquez Date: Fri, 12 Feb 2016 10:07:32 -0800 Subject: [PATCH 10/10] CLOUDSTACK-9252: Last refactor, passing nfs version to ssvm --- .../vmware/manager/VmwareManagerImpl.java | 5 +-- .../manager/VmwareStorageManagerImpl.java | 16 ++++--- .../vmware/resource/VmwareResource.java | 4 +- .../PremiumSecondaryStorageResource.java | 2 +- ...VmwareSecondaryStorageResourceHandler.java | 8 ++-- .../resource/VmwareStorageProcessor.java | 33 ++++++-------- .../VmwareStorageSubsystemCommandHandler.java | 17 +++---- .../vmware/VmwareDatacenterApiUnitTest.java | 31 +++++++------ .../src/com/cloud/server/StatsCollector.java | 2 +- .../cloud/storage/ImageStoreDetailsUtil.java | 2 - .../SecondaryStorageManagerImpl.java | 5 ++- .../resource/NfsSecondaryStorageResource.java | 45 +++++++------------ .../storage/template/DownloadManagerImpl.java | 9 ++-- 13 files changed, 78 insertions(+), 101 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index a938d38f78bd..f27e938e7334 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -47,7 +47,6 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.utils.identity.ManagementServerNode; -import org.springframework.context.ApplicationContext; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -112,7 +111,6 @@ import com.cloud.utils.FileUtil; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; -import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; @@ -170,6 +168,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private ManagementServerHostPeerDao _mshostPeerDao; @Inject private ClusterManager _clusterMgr; + @Inject private ImageStoreDetailsUtil imageStoreDetailsUtil; private String _mountParent; @@ -202,8 +201,6 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private final ScheduledExecutorService _hostScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vmware-Host-Scan")); public VmwareManagerImpl() { - ApplicationContext applicationContext = ComponentContext.getApplicationContext(); - imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); _storageMgr = new VmwareStorageManagerImpl(this); } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java index 8d5fc104585f..c7c53bacba99 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java @@ -42,7 +42,6 @@ import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.BackupSnapshotAnswer; @@ -78,7 +77,6 @@ import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost; import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareHelper; -import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; @@ -95,7 +93,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { - private ImageStoreDetailsUtil imageStoreDetailsUtil; + private String _nfsVersion; @Override public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) { @@ -141,8 +139,12 @@ public void createOva(String path, String name) { public VmwareStorageManagerImpl(VmwareStorageMount mountService) { assert (mountService != null); _mountService = mountService; - ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); - imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); + } + + public VmwareStorageManagerImpl(VmwareStorageMount mountService, String nfsVersion) { + assert (mountService != null); + _mountService = mountService; + _nfsVersion = nfsVersion; } public void configure(Map params) { @@ -163,7 +165,7 @@ public String createOvaForTemplate(TemplateObjectTO template) { String secStorageUrl = nfsStore.getUrl(); assert (secStorageUrl != null); String installPath = template.getPath(); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _nfsVersion); String installFullPath = secondaryMountPoint + "/" + installPath; try { if (installFullPath.endsWith(".ova")) { @@ -201,7 +203,7 @@ public String createOvaForVolume(VolumeObjectTO volume) { String installPath = volume.getPath(); int index = installPath.lastIndexOf(File.separator); String volumeUuid = installPath.substring(index + 1); - String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, imageStoreDetailsUtil.getNfsVersionByUuid(storeTO.getUuid())); + String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, _nfsVersion); //The real volume path String volumePath = installPath + File.separator + volumeUuid + ".ova"; String installFullPath = secondaryMountPoint + "/" + installPath; diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 56f929824c34..e71425b9488f 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -5197,8 +5197,8 @@ else if (value != null && value.equalsIgnoreCase("ide")) value = (String)params.get("scripts.timeout"); int timeout = NumbersUtil.parseInt(value, 1440) * 1000; - _storageProcessor = new VmwareStorageProcessor((VmwareHostService)this, _fullCloneFlag, (VmwareStorageMount)mgr, timeout, this, _shutdownWaitMs, null); - storageHandler = new VmwareStorageSubsystemCommandHandler(_storageProcessor); + _storageProcessor = new VmwareStorageProcessor((VmwareHostService)this, _fullCloneFlag, (VmwareStorageMount)mgr, timeout, this, _shutdownWaitMs, null, (String)params.get("nfsVersion")); + storageHandler = new VmwareStorageSubsystemCommandHandler(_storageProcessor, (String)params.get("nfsVersion")); _vrResource = new VirtualRoutingResource(this); if (!_vrResource.configure(name, params)) { diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/PremiumSecondaryStorageResource.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/PremiumSecondaryStorageResource.java index 8e4a0d2a83db..1ec4958509bc 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/PremiumSecondaryStorageResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/PremiumSecondaryStorageResource.java @@ -102,7 +102,7 @@ public boolean configure(String name, Map params) throws Configu VmwareSecondaryStorageContextFactory.initFactoryEnvironment(); } - registerHandler(Hypervisor.HypervisorType.VMware, new VmwareSecondaryStorageResourceHandler(this)); + registerHandler(Hypervisor.HypervisorType.VMware, new VmwareSecondaryStorageResourceHandler(this, (String)params.get("nfsVersion"))); return true; } } diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java index c3f65cbc47f3..3c4e6340d31f 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java @@ -66,13 +66,13 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe * private Map _activeHosts = new HashMap(); */ - public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource) { + public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, String nfsVersion) { _resource = resource; - _storageMgr = new VmwareStorageManagerImpl(this); + _storageMgr = new VmwareStorageManagerImpl(this, nfsVersion); _gson = GsonHelper.getGsonLogger(); - VmwareStorageProcessor storageProcessor = new VmwareStorageProcessor(this, true, this, resource.getTimeout(), null, null, _resource); - VmwareStorageSubsystemCommandHandler vmwareStorageSubsystemCommandHandler = new VmwareStorageSubsystemCommandHandler(storageProcessor); + VmwareStorageProcessor storageProcessor = new VmwareStorageProcessor(this, true, this, resource.getTimeout(), null, null, _resource, nfsVersion); + VmwareStorageSubsystemCommandHandler vmwareStorageSubsystemCommandHandler = new VmwareStorageSubsystemCommandHandler(storageProcessor, nfsVersion); vmwareStorageSubsystemCommandHandler.setStorageResource(_resource); vmwareStorageSubsystemCommandHandler.setStorageManager(_storageMgr); storageSubsystemHandler = vmwareStorageSubsystemCommandHandler; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 660b93bb9035..ffa839d4598a 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -67,7 +67,6 @@ import org.apache.cloudstack.storage.to.SnapshotObjectTO; import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -97,7 +96,6 @@ import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.serializer.GsonHelper; import com.cloud.storage.DataStoreRole; -import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; @@ -112,8 +110,6 @@ public class VmwareStorageProcessor implements StorageProcessor { - private ImageStoreDetailsUtil imageStoreDetailsUtil; - private static final Logger s_logger = Logger.getLogger(VmwareStorageProcessor.class); private static final int DEFAULT_NFS_PORT = 2049; @@ -125,9 +121,10 @@ public class VmwareStorageProcessor implements StorageProcessor { protected Integer _shutdownWaitMs; private final Gson _gson; private final StorageLayer _storage = new JavaStorageLayer(); + private String _nfsVersion; public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFlag, VmwareStorageMount mountService, Integer timeout, VmwareResource resource, - Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource) { + Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource, String nfsVersion) { this.hostService = hostService; _fullCloneFlag = fullCloneFlag; this.mountService = mountService; @@ -135,8 +132,7 @@ public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFl this.resource = resource; _shutdownWaitMs = shutdownWaitMs; _gson = GsonHelper.getGsonLogger(); - ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); - imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); + _nfsVersion = nfsVersion; } @Override @@ -323,7 +319,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { if (managed) { VirtualMachineMO vmMo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - managedStoragePoolRootVolumeName, false, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + managedStoragePoolRootVolumeName, false, _nfsVersion); vmMo.unregisterVm(); @@ -340,7 +336,7 @@ public Answer copyTemplateToPrimaryStorage(CopyCommand cmd) { } else { copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(), - templateUuidName, true, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); + templateUuidName, true, _nfsVersion); } } else { s_logger.info("Template " + templateInfo.second() + " has already been setup, skip the template setup process in primary storage"); @@ -585,8 +581,8 @@ public Answer copyVolumeFromImageCacheToPrimary(CopyCommand cmd) { } } - Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid())); - deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), imageStoreDetailsUtil.getNfsVersionByUuid(uuid)); + Pair result = copyVolumeFromSecStorage(hyperHost, srcVolume.getPath(), new DatastoreMO(context, morDatastore), srcStore.getUrl(), (long)cmd.getWait() * 1000, _nfsVersion); + deleteVolumeDirOnSecondaryStorage(result.first(), srcStore.getUrl(), _nfsVersion); VolumeObjectTO newVolume = new VolumeObjectTO(); newVolume.setPath(result.second()); return new CopyCmdAnswer(newVolume); @@ -643,8 +639,7 @@ private Pair copyVolumeToSecStorage(VmwareHostService hostServic vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false); - exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), - imageStoreDetailsUtil.getNfsVersionByUuid(cmd.getDestTO().getDataStore().getUuid())); + exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), _nfsVersion); return new Pair(destVolumePath, exportName); } finally { @@ -846,7 +841,7 @@ public Answer createTemplateFromVolume(CopyCommand cmd) { Ternary result = createTemplateFromVolume(vmMo, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath, - hostService.getWorkerName(context, cmd, 0), imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + hostService.getWorkerName(context, cmd, 0), _nfsVersion); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1037,8 +1032,7 @@ public Answer createTemplateFromSnapshot(CopyCommand cmd) { } NfsTO nfsSvr = (NfsTO)imageStore; - Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000, - imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + Ternary result = createTemplateFromSnapshot(template.getPath(), uniqeName, nfsSvr.getUrl(), snapshot.getPath(), template.getId(), (long)cmd.getWait() * 1000, _nfsVersion); TemplateObjectTO newTemplate = new TemplateObjectTO(); newTemplate.setPath(result.first()); @@ -1181,10 +1175,9 @@ public Answer backupSnapshot(CopyCommand cmd) { throw new Exception("Failed to take snapshot " + srcSnapshot.getName() + " on vm: " + vmName); } - String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(destStore.getUuid()); backupResult = backupSnapshotToSecondaryStorage(vmMo, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl, - prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), nfsVersion); + prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), _nfsVersion); snapshotBackupUuid = backupResult.first(); success = (snapshotBackupUuid != null); @@ -1196,7 +1189,7 @@ public Answer backupSnapshot(CopyCommand cmd) { // Get snapshot physical size long physicalSize = 0l; - String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, nfsVersion); + String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, _nfsVersion); String snapshotDir = destSnapshot.getPath() + "/" + snapshotBackupUuid; File[] files = new File(secondaryMountPoint + "/" + snapshotDir).listFiles(); if(files != null) { @@ -2258,7 +2251,7 @@ public Answer createVolumeFromSnapshot(CopyCommand cmd) { backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ovf", ""); } DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs); - restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, imageStoreDetailsUtil.getNfsVersionByUuid(imageStore.getUuid())); + restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, _nfsVersion); VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(newVolumeName); diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index 212c8111bfd1..40fa47b03bb3 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -27,7 +27,6 @@ import org.apache.cloudstack.storage.to.SnapshotObjectTO; import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.springframework.context.ApplicationContext; import com.cloud.agent.api.Answer; import com.cloud.agent.api.to.DataObjectType; @@ -38,15 +37,13 @@ import com.cloud.agent.api.to.SwiftTO; import com.cloud.hypervisor.vmware.manager.VmwareStorageManager; import com.cloud.storage.DataStoreRole; -import com.cloud.storage.ImageStoreDetailsUtil; public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemCommandHandlerBase { - private ImageStoreDetailsUtil imageStoreDetailsUtil; - private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); private VmwareStorageManager storageManager; private PremiumSecondaryStorageResource storageResource; + private String _nfsVersion; public PremiumSecondaryStorageResource getStorageResource() { return storageResource; @@ -64,10 +61,9 @@ public void setStorageManager(VmwareStorageManager storageManager) { this.storageManager = storageManager; } - public VmwareStorageSubsystemCommandHandler(StorageProcessor processor) { + public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, String nfsVersion) { super(processor); - ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); - imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); + this._nfsVersion = nfsVersion; } @Override @@ -84,12 +80,11 @@ protected Answer execute(CopyCommand cmd) { } } - String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid()); if (srcDataStore.getRole() == DataStoreRole.ImageCache && destDataStore.getRole() == DataStoreRole.Image) { //need to take extra processing for vmware, such as packing to ova, before sending to S3 if (srcData.getObjectType() == DataObjectType.VOLUME) { NfsTO cacheStore = (NfsTO)srcDataStore; - String parentPath = storageResource.getRootDir(cacheStore.getUrl(), nfsVersion); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), _nfsVersion); VolumeObjectTO vol = (VolumeObjectTO)srcData; String path = vol.getPath(); int index = path.lastIndexOf(File.separator); @@ -102,7 +97,7 @@ protected Answer execute(CopyCommand cmd) { } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT) { // pack ova first // sync snapshot from NFS cache to S3 in NFS migration to S3 case - String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), nfsVersion); + String parentPath = storageResource.getRootDir(srcDataStore.getUrl(), _nfsVersion); SnapshotObjectTO snap = (SnapshotObjectTO)srcData; String path = snap.getPath(); int index = path.lastIndexOf(File.separator); @@ -145,7 +140,7 @@ protected Answer execute(CopyCommand cmd) { return answer; } NfsTO cacheStore = (NfsTO)cmd.getCacheTO().getDataStore(); - String parentPath = storageResource.getRootDir(cacheStore.getUrl(), nfsVersion); + String parentPath = storageResource.getRootDir(cacheStore.getUrl(), _nfsVersion); SnapshotObjectTO newSnapshot = (SnapshotObjectTO)answer.getNewData(); String path = newSnapshot.getPath(); int index = path.lastIndexOf(File.separator); diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java index 0f056ee5b2cf..fec2aba40f64 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java @@ -25,13 +25,11 @@ import java.util.UUID; import javax.inject.Inject; -import javax.naming.ConfigurationException; import com.cloud.user.User; import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Matchers; @@ -56,6 +54,8 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.test.utils.SpringUtils; import com.cloud.agent.AgentManager; @@ -159,17 +159,6 @@ public class VmwareDatacenterApiUnitTest { @Mock private static RemoveVmwareDcCmd removeCmd; - @BeforeClass - public static void setUp() throws ConfigurationException { - ComponentContext ctx = new ComponentContext(); - ImageStoreDetailsUtil imgSDUtil = Mockito.mock(ImageStoreDetailsUtil.class); - Mockito.when(imgSDUtil.getNfsVersion(Mockito.anyLong())).thenReturn("3"); - Mockito.when(imgSDUtil.getNfsVersionByUuid(Mockito.anyString())).thenReturn("3"); - ApplicationContext appCtx = Mockito.mock(ApplicationContext.class); - Mockito.when(appCtx.getBean(Mockito.anyString(), Mockito.any(ImageStoreDetailsUtil.class))).thenReturn(imgSDUtil); - ctx.setApplicationContext(appCtx); - } - @Before public void testSetUp() { Mockito.when(_configDao.isPremium()).thenReturn(true); @@ -442,6 +431,22 @@ public DataStoreManager dataStoreManager() { return Mockito.mock(DataStoreManager.class); } + @Bean + public ImageStoreDetailsUtil imageStoreDetailsUtil() { + return Mockito.mock(ImageStoreDetailsUtil.class); + } + + //Mocks for ImageStoreDetailsUtil + @Bean + public ImageStoreDao imageStoreDao() { + return Mockito.mock(ImageStoreDao.class); + } + + @Bean + public ImageStoreDetailsDao imageStoreDetailsDao() { + return Mockito.mock(ImageStoreDetailsDao.class); + } + public static class Library implements TypeFilter { @Override diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index 6f0c928197ab..0702335308da 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -199,7 +199,7 @@ public String toString() { @Inject private HostGpuGroupsDao _hostGpuGroupsDao; @Inject - ImageStoreDetailsUtil imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; private ConcurrentHashMap _hostStats = new ConcurrentHashMap(); private final ConcurrentHashMap _VmStats = new ConcurrentHashMap(); diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java index 4ce0bd727119..63bd5c54d67d 100755 --- a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java @@ -23,9 +23,7 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; -import org.springframework.stereotype.Component; -@Component public class ImageStoreDetailsUtil { @Inject diff --git a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index c1445ad944ce..2ff54c8dc9a7 100644 --- a/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -241,7 +241,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar @Inject VolumeDataStoreDao _volumeStoreDao; @Inject - ImageStoreDetailsUtil imageStoreDetailsUtil; + private ImageStoreDetailsUtil imageStoreDetailsUtil; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; private int _secStorageVmMtuSize; @@ -1051,7 +1051,6 @@ private String getSecStorageVmLockName(long id) { @Override public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - SecondaryStorageVmVO vm = _secStorageVmDao.findById(profile.getId()); Map details = _vmDetailsDao.listDetailsKeyPairs(vm.getId()); vm.setDetails(details); @@ -1136,6 +1135,8 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl if (dc.getDns2() != null) { buf.append(" dns2=").append(dc.getDns2()); } + String nfsVersion = imageStoreDetailsUtil != null ? imageStoreDetailsUtil.getNfsVersion(secStore.getId()) : null; + buf.append(" nfsVersion=").append(nfsVersion); String bootArgs = buf.toString(); if (s_logger.isDebugEnabled()) { diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index 0fa2b54901bd..663699aad2e8 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -44,7 +44,6 @@ import java.util.Map; import java.util.UUID; -import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.exception.InvalidParameterValueException; @@ -94,8 +93,6 @@ import org.apache.cloudstack.storage.command.DownloadProgressCommand; import org.apache.cloudstack.storage.command.UploadStatusAnswer; import org.apache.cloudstack.storage.command.UploadStatusAnswer.UploadStatus; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.apache.cloudstack.storage.command.UploadStatusCommand; import org.apache.cloudstack.storage.template.DownloadManager; import org.apache.cloudstack.storage.template.DownloadManagerImpl; @@ -145,7 +142,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ServerResourceBase; import com.cloud.storage.DataStoreRole; -import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateStorageResourceAssoc; @@ -173,9 +169,6 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements SecondaryStorageResource { - @Inject - ImageStoreDetailsUtil _imageStoreDetailsUtil; - private static final Logger s_logger = Logger.getLogger(NfsSecondaryStorageResource.class); private static final String TEMPLATE_ROOT_DIR = "template/tmpl"; @@ -215,6 +208,7 @@ public void setTimeout(int timeout) { private String _storageIp; private String _storageNetmask; private String _storageGateway; + private String _nfsVersion; private final List nfsIps = new ArrayList(); protected String _parent = "/mnt/SecStorage"; final private String _tmpltpp = "template.properties"; @@ -222,12 +216,6 @@ public void setTimeout(int timeout) { private HashMap uploadEntityStateMap = new HashMap(); private String _ssvmPSK = null; - @Inject - ImageStoreDao dataStoreDao; - - @Inject - ImageStoreDetailsDao detailsStoreDao; - public void setParentPath(String path) { _parent = path; } @@ -368,7 +356,7 @@ protected Answer copyFromSwiftToNfs(CopyCommand cmd, DataTO srcData, SwiftTO swi final String storagePath = destImageStore.getUrl(); final String destPath = destData.getPath(); try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath, _imageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, _nfsVersion); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -395,7 +383,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT try { - String downloadPath = determineStorageTemplatePath(storagePath, destPath, _imageStoreDetailsUtil.getNfsVersionByUuid(destImageStore.getUuid())); + String downloadPath = determineStorageTemplatePath(storagePath, destPath, _nfsVersion); final File downloadDirectory = _storage.getFile(downloadPath); if (downloadDirectory.exists()) { @@ -428,7 +416,7 @@ protected Answer copyFromS3ToNfs(CopyCommand cmd, DataTO srcData, S3TO s3, DataT protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, SnapshotObjectTO srcData, NfsTO srcDataStore, TemplateObjectTO destData, NfsTO destDataStore) { - String srcMountPoint = getRootDir(srcDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + String srcMountPoint = getRootDir(srcDataStore.getUrl(), _nfsVersion); String snapshotPath = srcData.getPath(); int index = snapshotPath.lastIndexOf("/"); String snapshotName = snapshotPath.substring(index + 1); @@ -438,7 +426,7 @@ protected Answer copySnapshotToTemplateFromNfsToNfsXenserver(CopyCommand cmd, Sn snapshotPath = snapshotPath.substring(0, index); snapshotPath = srcMountPoint + File.separator + snapshotPath; - String destMountPoint = getRootDir(destDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); + String destMountPoint = getRootDir(destDataStore.getUrl(), _nfsVersion); String destPath = destMountPoint + File.separator + destData.getPath(); String errMsg = null; @@ -496,8 +484,8 @@ protected Answer copySnapshotToTemplateFromNfsToNfs(CopyCommand cmd, SnapshotObj if (srcData.getHypervisorType() == HypervisorType.XenServer) { return copySnapshotToTemplateFromNfsToNfsXenserver(cmd, srcData, srcDataStore, destData, destDataStore); } else if (srcData.getHypervisorType() == HypervisorType.KVM) { - File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); - File destFile = getFile(destData.getPath(), destDataStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(destDataStore.getUuid())); + File srcFile = getFile(srcData.getPath(), srcDataStore.getUrl(), _nfsVersion); + File destFile = getFile(destData.getPath(), destDataStore.getUrl(), _nfsVersion); VolumeObjectTO volumeObjectTO = srcData.getVolume(); ImageFormat srcFormat = null; @@ -614,7 +602,7 @@ protected Answer createTemplateFromSnapshot(CopyCommand cmd) { } s_logger.debug("starting copy template to swift"); DataTO newTemplate = answer.getNewData(); - File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + File templateFile = getFile(newTemplate.getPath(), ((NfsTO)srcDataStore).getUrl(), _nfsVersion); SwiftTO swift = (SwiftTO)destDataStore; String containterName = SwiftUtil.getContainerName(destData.getObjectType().toString(), destData.getId()); String swiftPath = SwiftUtil.putObject(swift, templateFile, containterName, templateFile.getName()); @@ -736,7 +724,7 @@ protected File downloadFromUrlToNfs(String url, NfsTO nfs, String path, String n throw new CloudRuntimeException("Failed to get url: " + url); } - String nfsMountPath = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(nfs.getUuid())); + String nfsMountPath = getRootDir(nfs.getUrl(), _nfsVersion); String filePath = nfsMountPath + File.separator + path; File directory = new File(filePath); @@ -901,7 +889,7 @@ protected Answer copyFromNfsToS3(CopyCommand cmd) { final S3TO s3 = (S3TO)destDataStore; try { - final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath(), _imageStoreDetailsUtil.getNfsVersionByUuid(srcDataStore.getUuid())); + final String templatePath = determineStorageTemplatePath(srcStore.getUrl(), srcData.getPath(), _nfsVersion); if (s_logger.isDebugEnabled()) { s_logger.debug("Found " + srcData.getObjectType() + " from directory " + templatePath + " to upload to S3."); @@ -1114,7 +1102,7 @@ public Answer execute(DeleteSnapshotsDirCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeSnapshotPath = cmd.getDirectory(); - String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _nfsVersion); if (relativeSnapshotPath.startsWith(File.separator)) { relativeSnapshotPath = relativeSnapshotPath.substring(1); @@ -1192,7 +1180,7 @@ private Answer execute(ComputeChecksumCommand cmd) { return new Answer(cmd, false, "can't handle non nfs data store"); } NfsTO nfsStore = (NfsTO)store; - String parent = getRootDir(nfsStore.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); + String parent = getRootDir(nfsStore.getUrl(), _nfsVersion); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1403,7 +1391,7 @@ protected Answer deleteSnapshot(final DeleteCommand cmd) { DataStoreTO dstore = obj.getDataStore(); if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; - String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _nfsVersion); if (!parent.endsWith(File.separator)) { parent += File.separator; } @@ -1596,7 +1584,7 @@ private Answer execute(ListVolumeCommand cmd) { } DataStoreTO store = cmd.getDataStore(); if (store instanceof NfsTO) { - String root = getRootDir(cmd.getSecUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(store.getUuid())); + String root = getRootDir(cmd.getSecUrl(), _nfsVersion); Map templateInfos = _dlMgr.gatherVolumeInfo(root); return new ListVolumeAnswer(cmd.getSecUrl(), templateInfos); } else if (store instanceof S3TO) { @@ -1765,7 +1753,7 @@ protected Answer deleteTemplate(DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeTemplatePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _nfsVersion); if (relativeTemplatePath.startsWith(File.separator)) { relativeTemplatePath = relativeTemplatePath.substring(1); @@ -1869,7 +1857,7 @@ protected Answer deleteVolume(final DeleteCommand cmd) { if (dstore instanceof NfsTO) { NfsTO nfs = (NfsTO)dstore; String relativeVolumePath = obj.getPath(); - String parent = getRootDir(nfs.getUrl(), _imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())); + String parent = getRootDir(nfs.getUrl(), _nfsVersion); if (relativeVolumePath.startsWith(File.separator)) { relativeVolumePath = relativeVolumePath.substring(1); @@ -2134,6 +2122,7 @@ public boolean configure(String name, Map params) throws Configu startAdditionalServices(); _params.put("install.numthreads", "50"); _params.put("secondary.storage.vm", "true"); + _nfsVersion = (String)params.get("nfsVersion"); } try { diff --git a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java index 6fb2aa239ae6..affe8a716a72 100644 --- a/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java +++ b/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java @@ -46,7 +46,6 @@ import org.apache.cloudstack.storage.command.DownloadProgressCommand.RequestType; import org.apache.cloudstack.storage.resource.SecondaryStorageResource; import org.apache.log4j.Logger; -import org.springframework.context.ApplicationContext; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.utils.net.Proxy; @@ -54,7 +53,6 @@ import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.S3TO; import com.cloud.exception.InternalErrorException; -import com.cloud.storage.ImageStoreDetailsUtil; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.VMTemplateHostVO; @@ -91,7 +89,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager StorageLayer _storage; public Map _processors; - private ImageStoreDetailsUtil imageStoreDetailsUtil; + private String _nfsVersion; public class Completion implements DownloadCompleteCallback { private final String jobId; @@ -712,7 +710,7 @@ public DownloadAnswer handleDownloadCommand(SecondaryStorageResource resource, D String installPathPrefix = cmd.getInstallPath(); // for NFS, we need to get mounted path if (dstore instanceof NfsTO) { - installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), imageStoreDetailsUtil.getNfsVersionByUuid(dstore.getUuid())) + File.separator + installPathPrefix; + installPathPrefix = resource.getRootDir(((NfsTO)dstore).getUrl(), _nfsVersion) + File.separator + installPathPrefix; } String user = null; String password = null; @@ -954,8 +952,6 @@ public boolean drain() { } public DownloadManagerImpl() { - ApplicationContext applicationContext = com.cloud.utils.component.ComponentContext.getApplicationContext(); - imageStoreDetailsUtil = applicationContext.getBean("imageStoreDetailsUtil", ImageStoreDetailsUtil.class); } @Override @@ -988,6 +984,7 @@ public boolean configure(String name, Map params) throws Configu String inSystemVM = (String)params.get("secondary.storage.vm"); if (inSystemVM != null && "true".equalsIgnoreCase(inSystemVM)) { s_logger.info("DownloadManager: starting additional services since we are inside system vm"); + _nfsVersion = (String)params.get("nfsVersion"); startAdditionalServices(); blockOutgoingOnPrivate(); }