CLOUDSTACK-9368: Fix for Support configurable NFS version for Secondary Storage mounts

This commit is contained in:
nvazquez 2016-04-22 12:47:05 -07:00
parent cb55624af8
commit 2d2819974e
40 changed files with 398 additions and 164 deletions

View File

@ -24,6 +24,7 @@ public class NfsTO implements DataStoreTO {
private DataStoreRole _role; private DataStoreRole _role;
private String uuid; private String uuid;
private static final String pathSeparator = "/"; private static final String pathSeparator = "/";
private Integer nfsVersion;
public NfsTO() { public NfsTO() {
@ -71,4 +72,12 @@ public class NfsTO implements DataStoreTO {
public String getPathSeparator() { public String getPathSeparator() {
return pathSeparator; return pathSeparator;
} }
public Integer getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(Integer nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -39,7 +39,6 @@ public class BackupSnapshotCommand extends SnapshotCommand {
private S3TO s3; private S3TO s3;
StorageFilerTO pool; StorageFilerTO pool;
private Long secHostId; private Long secHostId;
private String nfsVersion;
protected BackupSnapshotCommand() { protected BackupSnapshotCommand() {
@ -109,11 +108,4 @@ public class BackupSnapshotCommand extends SnapshotCommand {
return secHostId; return secHostId;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -28,7 +28,6 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand {
private String origTemplateInstallPath; private String origTemplateInstallPath;
private Long newTemplateId; private Long newTemplateId;
private String templateName; private String templateName;
private String nfsVersion;
protected CreatePrivateTemplateFromSnapshotCommand() { protected CreatePrivateTemplateFromSnapshotCommand() {
@ -74,11 +73,4 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand {
return templateName; return templateName;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -32,7 +32,6 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
StorageFilerTO _primaryPool; StorageFilerTO _primaryPool;
// For XenServer // For XenServer
private String _secondaryStorageUrl; private String _secondaryStorageUrl;
private String nfsVersion;
public CreatePrivateTemplateFromVolumeCommand() { public CreatePrivateTemplateFromVolumeCommand() {
} }
@ -101,11 +100,4 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand {
_templateId = templateId; _templateId = templateId;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -26,8 +26,6 @@ import com.cloud.storage.StoragePool;
*/ */
public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { public class CreateVolumeFromSnapshotCommand extends SnapshotCommand {
private String nfsVersion;
protected CreateVolumeFromSnapshotCommand() { protected CreateVolumeFromSnapshotCommand() {
} }
@ -53,11 +51,4 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand {
setWait(wait); setWait(wait);
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -20,17 +20,17 @@
package com.cloud.agent.api; package com.cloud.agent.api;
import com.cloud.agent.api.LogLevel.Log4jLevel; import com.cloud.agent.api.LogLevel.Log4jLevel;
import com.cloud.agent.api.storage.StorageNfsVersionCommand;
import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
@LogLevel(Log4jLevel.Trace) @LogLevel(Log4jLevel.Trace)
public class GetStorageStatsCommand extends Command { public class GetStorageStatsCommand extends StorageNfsVersionCommand {
private String id; private String id;
private String localPath; private String localPath;
private StoragePoolType pooltype; private StoragePoolType pooltype;
private String secUrl; private String secUrl;
private DataStoreTO store; private DataStoreTO store;
private String nfsVersion;
public String getSecUrl() { public String getSecUrl() {
return secUrl; return secUrl;
@ -55,9 +55,9 @@ public class GetStorageStatsCommand extends Command {
this.store = store; this.store = store;
} }
public GetStorageStatsCommand(DataStoreTO store, String nfsVersion) { public GetStorageStatsCommand(DataStoreTO store, Integer nfsVersion) {
super(nfsVersion);
this.store = store; this.store = store;
this.nfsVersion = nfsVersion;
} }
public GetStorageStatsCommand(String secUrl) { public GetStorageStatsCommand(String secUrl) {
@ -87,14 +87,6 @@ public class GetStorageStatsCommand extends Command {
return this.store; return this.store;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
@Override @Override
public boolean executeInSequence() { public boolean executeInSequence() {
return false; return false;

View File

@ -21,14 +21,14 @@ package com.cloud.agent.api;
import org.apache.cloudstack.framework.security.keystore.KeystoreManager; import org.apache.cloudstack.framework.security.keystore.KeystoreManager;
import com.cloud.agent.api.storage.StorageNfsVersionCommand;
import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.DataStoreTO;
public class SecStorageSetupCommand extends Command { public class SecStorageSetupCommand extends StorageNfsVersionCommand {
private DataStoreTO store; private DataStoreTO store;
private String secUrl; private String secUrl;
private KeystoreManager.Certificates certs; private KeystoreManager.Certificates certs;
private String postUploadKey; private String postUploadKey;
private String nfsVersion;
public SecStorageSetupCommand() { public SecStorageSetupCommand() {
@ -76,11 +76,4 @@ public class SecStorageSetupCommand extends Command {
this.postUploadKey = postUploadKey; this.postUploadKey = postUploadKey;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -19,6 +19,7 @@
package com.cloud.agent.api; package com.cloud.agent.api;
import com.cloud.agent.api.storage.StorageNfsVersionCommand;
import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
@ -26,7 +27,7 @@ import com.cloud.storage.StoragePool;
* This currently assumes that both primary and secondary storage are mounted on * This currently assumes that both primary and secondary storage are mounted on
* the XenServer. * the XenServer.
*/ */
public class SnapshotCommand extends Command { public class SnapshotCommand extends StorageNfsVersionCommand {
protected String primaryStoragePoolNameLabel; protected String primaryStoragePoolNameLabel;
StorageFilerTO primaryPool; StorageFilerTO primaryPool;
private String snapshotUuid; private String snapshotUuid;

View File

@ -19,11 +19,10 @@
package com.cloud.agent.api.storage; package com.cloud.agent.api.storage;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.StorageFilerTO;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
public class CopyVolumeCommand extends Command { public class CopyVolumeCommand extends StorageNfsVersionCommand {
long volumeId; long volumeId;
String volumePath; String volumePath;
@ -32,7 +31,6 @@ public class CopyVolumeCommand extends Command {
boolean toSecondaryStorage; boolean toSecondaryStorage;
String vmName; String vmName;
boolean executeInSequence = false; boolean executeInSequence = false;
String nfsVersion;
public CopyVolumeCommand() { public CopyVolumeCommand() {
} }
@ -77,11 +75,4 @@ public class CopyVolumeCommand extends Command {
return vmName; return vmName;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -23,21 +23,17 @@ import com.cloud.agent.api.to.DataStoreTO;
public class ListTemplateCommand extends StorageCommand { public class ListTemplateCommand extends StorageCommand {
private DataStoreTO store; private DataStoreTO store;
private String nfsVersion;
//private String secUrl;
public ListTemplateCommand() { public ListTemplateCommand() {
} }
public ListTemplateCommand(DataStoreTO store) { public ListTemplateCommand(DataStoreTO store) {
this.store = store; this.store = store;
// this.secUrl = url;
} }
public ListTemplateCommand(DataStoreTO store, String nfsVersion) { public ListTemplateCommand(DataStoreTO store, Integer nfsVersion) {
super(nfsVersion);
this.store = store; this.store = store;
this.nfsVersion = nfsVersion;
} }
@Override @Override
@ -49,12 +45,4 @@ public class ListTemplateCommand extends StorageCommand {
return store; return store;
} }
public String getNfsVersion() {
return nfsVersion;
}
// public String getSecUrl() {
// return secUrl;
// }
} }

View File

@ -35,7 +35,6 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
String secondaryStorageUrl; String secondaryStorageUrl;
String primaryStorageUrl; String primaryStorageUrl;
String nfsVersion;
protected PrimaryStorageDownloadCommand() { protected PrimaryStorageDownloadCommand() {
} }
@ -89,11 +88,4 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
return true; return true;
} }
public String getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(String nfsVersion) {
this.nfsVersion = nfsVersion;
}
} }

View File

@ -19,9 +19,7 @@
package com.cloud.agent.api.storage; package com.cloud.agent.api.storage;
import com.cloud.agent.api.Command; public abstract class SsCommand extends StorageNfsVersionCommand {
public abstract class SsCommand extends Command {
private String secUrl; private String secUrl;
public SsCommand() { public SsCommand() {

View File

@ -19,11 +19,13 @@
package com.cloud.agent.api.storage; package com.cloud.agent.api.storage;
import com.cloud.agent.api.Command; public abstract class StorageCommand extends StorageNfsVersionCommand {
public abstract class StorageCommand extends Command {
protected StorageCommand() { protected StorageCommand() {
super(); super();
} }
protected StorageCommand(Integer nfsVersion){
super(nfsVersion);
}
} }

View File

@ -0,0 +1,44 @@
//
// 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.agent.api.storage;
import com.cloud.agent.api.Command;
public abstract class StorageNfsVersionCommand extends Command {
protected StorageNfsVersionCommand(){
super();
}
protected StorageNfsVersionCommand(Integer nfsVersion){
super();
this.nfsVersion = nfsVersion;
}
private Integer nfsVersion;
public Integer getNfsVersion() {
return nfsVersion;
}
public void setNfsVersion(Integer nfsVersion) {
this.nfsVersion = nfsVersion;
}
}

View File

@ -53,7 +53,7 @@ public class TemplateOrVolumePostUploadCommand {
private long accountId; private long accountId;
private String nfsVersion; private Integer nfsVersion;
public TemplateOrVolumePostUploadCommand(long entityId, String entityUUID, String absolutePath, String checksum, String type, String name, String imageFormat, String dataTo, public TemplateOrVolumePostUploadCommand(long entityId, String entityUUID, String absolutePath, String checksum, String type, String name, String imageFormat, String dataTo,
String dataToRole) { String dataToRole) {
@ -199,11 +199,11 @@ public class TemplateOrVolumePostUploadCommand {
return accountId; return accountId;
} }
public String getNfsVersion() { public Integer getNfsVersion() {
return nfsVersion; return nfsVersion;
} }
public void setNfsVersion(String nfsVersion) { public void setNfsVersion(Integer nfsVersion) {
this.nfsVersion = nfsVersion; this.nfsVersion = nfsVersion;
} }
} }

View File

@ -638,7 +638,8 @@ public class TemplateServiceImpl implements TemplateService {
} }
private Map<String, TemplateProp> listTemplate(DataStore ssStore) { private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), nfsVersion);
EndPoint ep = _epSelector.select(ssStore); EndPoint ep = _epSelector.select(ssStore);
Answer answer = null; Answer answer = null;
if (ep == null) { if (ep == null) {

View File

@ -51,7 +51,7 @@ public class MockLocalNfsSecondaryStorageResource extends NfsSecondaryStorageRes
} }
@Override @Override
public String getRootDir(String secUrl, String nfsVersion) { public String getRootDir(String secUrl, Integer nfsVersion) {
return "/mnt"; return "/mnt";
} }

View File

@ -79,6 +79,7 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
VMTemplateZoneDao _vmTemplateZoneDao; VMTemplateZoneDao _vmTemplateZoneDao;
@Inject @Inject
AlertManager _alertMgr; AlertManager _alertMgr;
protected String _proxy = null; protected String _proxy = null;
protected Proxy getHttpProxy() { protected Proxy getHttpProxy() {

View File

@ -0,0 +1,48 @@
/*
* 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 org.apache.cloudstack.storage.image;
import java.util.Map;
import javax.inject.Inject;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
public abstract class NfsImageStoreDriverImpl extends BaseImageStoreDriverImpl {
@Inject
ImageStoreDetailsDao _imageStoreDetailsDao;
private static final String NFS_VERSION_DETAILS_KEY = "nfs.version";
/**
* Retrieve NFS version to be used for imgStoreId store, if provided in image_store_details table
* @param imgStoreId store id
* @return "nfs.version" associated value for imgStoreId in image_store_details table if exists, null if not
*/
protected Integer getNfsVersion(long imgStoreId){
Map<String, String> imgStoreDetails = _imageStoreDetailsDao.getDetails(imgStoreId);
if (imgStoreDetails != null && imgStoreDetails.containsKey(NFS_VERSION_DETAILS_KEY)){
String nfsVersionParam = imgStoreDetails.get(NFS_VERSION_DETAILS_KEY);
return (nfsVersionParam != null ? Integer.valueOf(nfsVersionParam) : null);
}
return null;
}
}

View File

@ -109,7 +109,7 @@ public class AgentStorageResource extends AgentResourceBase implements Secondary
} }
@Override @Override
public String getRootDir(String url, String nfsVersion) { public String getRootDir(String url, Integer nfsVersion) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return null; return null;
} }

View File

@ -35,7 +35,7 @@ import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl; import org.apache.cloudstack.storage.image.NfsImageStoreDriverImpl;
import org.apache.cloudstack.storage.image.store.ImageStoreImpl; import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.DownloadAnswer;
@ -47,7 +47,7 @@ import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDao;
public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { public class SimulatorImageStoreDriverImpl extends NfsImageStoreDriverImpl {
private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class); private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class);
@Inject @Inject
@ -67,6 +67,7 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl {
NfsTO nfsTO = new NfsTO(); NfsTO nfsTO = new NfsTO();
nfsTO.setRole(store.getRole()); nfsTO.setRole(store.getRole());
nfsTO.setUrl(nfsStore.getUri()); nfsTO.setUrl(nfsStore.getUri());
nfsTO.setNfsVersion(getNfsVersion(nfsStore.getId()));
return nfsTO; return nfsTO;
} }

View File

@ -553,7 +553,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
@Override @Override
public void prepareSecondaryStorageStore(String storageUrl, Long storeId) { public void prepareSecondaryStorageStore(String storageUrl, Long storeId) {
String mountPoint = getMountPoint(storageUrl, imageStoreDetailsUtil.getNfsVersion(storeId)); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(storeId);
String mountPoint = getMountPoint(storageUrl, nfsVersion);
GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm"); GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm");
try { try {
@ -661,7 +662,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
} }
@Override @Override
public String getMountPoint(String storageUrl, String nfsVersion) { public String getMountPoint(String storageUrl, Integer nfsVersion) {
String mountPoint = null; String mountPoint = null;
synchronized (_storageMounts) { synchronized (_storageMounts) {
mountPoint = _storageMounts.get(storageUrl); mountPoint = _storageMounts.get(storageUrl);
@ -752,7 +753,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
} }
} }
protected String mount(String path, String parent, String nfsVersion) { protected String mount(String path, String parent, Integer nfsVersion) {
String mountPoint = setupMountPoint(parent); String mountPoint = setupMountPoint(parent);
if (mountPoint == null) { if (mountPoint == null) {
s_logger.warn("Unable to create a mount point"); s_logger.warn("Unable to create a mount point");

View File

@ -93,7 +93,7 @@ import com.cloud.vm.snapshot.VMSnapshot;
public class VmwareStorageManagerImpl implements VmwareStorageManager { public class VmwareStorageManagerImpl implements VmwareStorageManager {
private String _nfsVersion; private Integer _nfsVersion;
@Override @Override
public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) { public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) {
@ -141,7 +141,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
_mountService = mountService; _mountService = mountService;
} }
public VmwareStorageManagerImpl(VmwareStorageMount mountService, String nfsVersion) { public VmwareStorageManagerImpl(VmwareStorageMount mountService, Integer nfsVersion) {
assert (mountService != null); assert (mountService != null);
_mountService = mountService; _mountService = mountService;
_nfsVersion = nfsVersion; _nfsVersion = nfsVersion;
@ -555,7 +555,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
// templateName: name in secondary storage // templateName: name in secondary storage
// templateUuid: will be used at hypervisor layer // templateUuid: will be used at hypervisor layer
private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl,
String templatePathAtSecondaryStorage, String templateName, String templateUuid, String nfsVersion) throws Exception { String templatePathAtSecondaryStorage, String templateName, String templateUuid, Integer nfsVersion) throws Exception {
s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " +
templatePathAtSecondaryStorage + ", templateName: " + templateName); templatePathAtSecondaryStorage + ", templateName: " + templateName);
@ -611,7 +611,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, long accountId, long templateId, String templateUniqueName, String secStorageUrl, private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, long accountId, long templateId, String templateUniqueName, String secStorageUrl,
String volumePath, String workerVmName, String nfsVersion) throws Exception { String volumePath, String workerVmName, Integer nfsVersion) throws Exception {
String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId);
@ -676,7 +676,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private Ternary<String, Long, Long> createTemplateFromSnapshot(long accountId, long templateId, String templateUniqueName, String secStorageUrl, long volumeId, private Ternary<String, Long, Long> createTemplateFromSnapshot(long accountId, long templateId, String templateUniqueName, String secStorageUrl, long volumeId,
String backedUpSnapshotUuid, String nfsVersion) throws Exception { String backedUpSnapshotUuid, Integer nfsVersion) throws Exception {
String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId); String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId);
@ -860,14 +860,14 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private String createVolumeFromSnapshot(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, long accountId, long volumeId, private String createVolumeFromSnapshot(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, long accountId, long volumeId,
String secStorageUrl, String snapshotBackupUuid, String nfsVersion) throws Exception { String secStorageUrl, String snapshotBackupUuid, Integer nfsVersion) throws Exception {
restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), snapshotBackupUuid, nfsVersion); restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), snapshotBackupUuid, nfsVersion);
return null; return null;
} }
private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir,
String backupName, String nfsVersion) throws Exception { String backupName, Integer nfsVersion) throws Exception {
String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
String srcOVAFileName = secondaryMountPoint + "/" + secStorageDir + "/" + backupName + "." + ImageFormat.OVA.getFileExtension(); String srcOVAFileName = secondaryMountPoint + "/" + secStorageDir + "/" + backupName + "." + ImageFormat.OVA.getFileExtension();
@ -927,7 +927,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private String backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, long accountId, long volumeId, String volumePath, String snapshotUuid, String secStorageUrl, private String backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, long accountId, long volumeId, String volumePath, String snapshotUuid, String secStorageUrl,
String prevSnapshotUuid, String prevBackupUuid, String workerVmName, String nfsVersion) throws Exception { String prevSnapshotUuid, String prevBackupUuid, String workerVmName, Integer nfsVersion) throws Exception {
String backupUuid = UUID.randomUUID().toString(); String backupUuid = UUID.randomUUID().toString();
exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), backupUuid, workerVmName, nfsVersion); exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), backupUuid, workerVmName, nfsVersion);
@ -935,7 +935,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private void exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName, private void exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName,
String workerVmName, String nfsVersion) throws Exception { String workerVmName, Integer nfsVersion) throws Exception {
String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName;
@ -980,7 +980,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
private Pair<String, String> copyVolumeToSecStorage(VmwareHostService hostService, VmwareHypervisorHost hyperHost, CopyVolumeCommand cmd, String vmName, private Pair<String, String> copyVolumeToSecStorage(VmwareHostService hostService, VmwareHypervisorHost hyperHost, CopyVolumeCommand cmd, String vmName,
long volumeId, String poolId, String volumePath, String secStorageUrl, String workerVmName, String nfsVersion) throws Exception { long volumeId, String poolId, String volumePath, String secStorageUrl, String workerVmName, Integer nfsVersion) throws Exception {
String volumeFolder = String.valueOf(volumeId) + "/"; String volumeFolder = String.valueOf(volumeId) + "/";
VirtualMachineMO workerVm = null; VirtualMachineMO workerVm = null;
@ -1038,7 +1038,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
return datastoreVolumePath; return datastoreVolumePath;
} }
private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, long volumeId, DatastoreMO dsMo, String secStorageUrl, String exportName, String nfsVersion) private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, long volumeId, DatastoreMO dsMo, String secStorageUrl, String exportName, Integer nfsVersion)
throws Exception { throws Exception {
String volumeFolder = String.valueOf(volumeId) + "/"; String volumeFolder = String.valueOf(volumeId) + "/";
@ -1458,7 +1458,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager {
} }
} }
private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl, String nfsVersion) throws Exception { private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl, Integer nfsVersion) throws Exception {
String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
String volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId); String volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId);

View File

@ -17,5 +17,5 @@
package com.cloud.hypervisor.vmware.manager; package com.cloud.hypervisor.vmware.manager;
public interface VmwareStorageMount { public interface VmwareStorageMount {
String getMountPoint(String storageUrl, String nfsVersion); String getMountPoint(String storageUrl, Integer nfsVersion);
} }

View File

@ -97,7 +97,9 @@ import com.vmware.vim25.VirtualMachineRuntimeInfo;
import com.vmware.vim25.VirtualMachineVideoCard; import com.vmware.vim25.VirtualMachineVideoCard;
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec; import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
import org.apache.cloudstack.storage.command.CopyCommand;
import org.apache.cloudstack.storage.command.StorageSubSystemCommand; import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.TemplateObjectTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO;
import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang.math.NumberUtils;
@ -306,6 +308,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
protected String _password; protected String _password;
protected String _guid; protected String _guid;
protected String _vCenterAddress; protected String _vCenterAddress;
protected Integer storageNfsVersion;
protected String _privateNetworkVSwitchName; protected String _privateNetworkVSwitchName;
protected VmwareTrafficLabel _guestTrafficInfo = new VmwareTrafficLabel(TrafficType.Guest); protected VmwareTrafficLabel _guestTrafficInfo = new VmwareTrafficLabel(TrafficType.Guest);
@ -475,6 +478,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
} else if (clz == UnregisterVMCommand.class) { } else if (clz == UnregisterVMCommand.class) {
return execute((UnregisterVMCommand) cmd); return execute((UnregisterVMCommand) cmd);
} else if (cmd instanceof StorageSubSystemCommand) { } else if (cmd instanceof StorageSubSystemCommand) {
checkStorageProcessorAndHandlerNfsVersionAttribute((StorageSubSystemCommand)cmd);
return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd); return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd);
} else if (clz == ScaleVmCommand.class) { } else if (clz == ScaleVmCommand.class) {
return execute((ScaleVmCommand)cmd); return execute((ScaleVmCommand)cmd);
@ -523,6 +527,64 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
return answer; return answer;
} }
/**
* Check if storage NFS version is already set or needs to be reconfigured.<br>
* If _storageNfsVersion is not null -> nothing to do, version already set.<br>
* If _storageNfsVersion is null -> examine StorageSubSystemCommand to get NFS version and set it
* to the storage processor and storage handler.
* @param cmd command to execute
*/
protected void checkStorageProcessorAndHandlerNfsVersionAttribute(StorageSubSystemCommand cmd) {
if (storageNfsVersion != null) return;
if (cmd instanceof CopyCommand){
examineStorageSubSystemCommandNfsVersion((CopyCommand) cmd);
}
}
/**
* Examine StorageSubSystem command to get storage NFS version, if provided
* @param cmd command to execute
*/
protected void examineStorageSubSystemCommandNfsVersion(CopyCommand cmd){
DataStoreTO srcDataStore = cmd.getSrcTO().getDataStore();
boolean nfsVersionFound = false;
if (srcDataStore instanceof NfsTO){
nfsVersionFound = getStorageNfsVersionFromNfsTO((NfsTO) srcDataStore);
}
if (nfsVersionFound){
setCurrentNfsVersionInProcessorAndHandler();
}
}
/**
* Get storage NFS version from NfsTO
* @param nfsTO nfsTO
* @return true if NFS version was found and not null, false in other case
*/
protected boolean getStorageNfsVersionFromNfsTO(NfsTO nfsTO){
if (nfsTO != null && nfsTO.getNfsVersion() != null){
storageNfsVersion = nfsTO.getNfsVersion();
return true;
}
return false;
}
/**
* Sets _storageNfsVersion into storage processor and storage handler by calling reconfigureNfsVersion on the storage handler,
* which will set NFS version into it and the storage processor.
*/
protected void setCurrentNfsVersionInProcessorAndHandler() {
VmwareStorageSubsystemCommandHandler handler = (VmwareStorageSubsystemCommandHandler) storageHandler;
boolean success = handler.reconfigureNfsVersion(storageNfsVersion);
if (success){
s_logger.info("NFS version " + storageNfsVersion + " successfully set in VmwareStorageProcessor and VmwareStorageSubsystemCommandHandler");
} else {
s_logger.error("Error while setting NFS version " + storageNfsVersion);
}
}
/** /**
* Registers the vm to the inventory given the vmx file. * Registers the vm to the inventory given the vmx file.
*/ */
@ -5311,8 +5373,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
value = (String)params.get("scripts.timeout"); value = (String)params.get("scripts.timeout");
int timeout = NumbersUtil.parseInt(value, 1440) * 1000; int timeout = NumbersUtil.parseInt(value, 1440) * 1000;
_storageProcessor = new VmwareStorageProcessor((VmwareHostService)this, _fullCloneFlag, (VmwareStorageMount)mgr, timeout, this, _shutdownWaitMs, null, (String)params.get("nfsVersion"));
storageHandler = new VmwareStorageSubsystemCommandHandler(_storageProcessor, (String)params.get("nfsVersion")); storageNfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
_storageProcessor = new VmwareStorageProcessor((VmwareHostService)this, _fullCloneFlag, (VmwareStorageMount)mgr, timeout, this, _shutdownWaitMs, null, storageNfsVersion);
storageHandler = new VmwareStorageSubsystemCommandHandler(_storageProcessor, storageNfsVersion);
_vrResource = new VirtualRoutingResource(this); _vrResource = new VirtualRoutingResource(this);
if (!_vrResource.configure(name, params)) { if (!_vrResource.configure(name, params)) {

View File

@ -102,7 +102,8 @@ public class PremiumSecondaryStorageResource extends NfsSecondaryStorageResource
VmwareSecondaryStorageContextFactory.initFactoryEnvironment(); VmwareSecondaryStorageContextFactory.initFactoryEnvironment();
} }
registerHandler(Hypervisor.HypervisorType.VMware, new VmwareSecondaryStorageResourceHandler(this, (String)params.get("nfsVersion"))); Integer nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
registerHandler(Hypervisor.HypervisorType.VMware, new VmwareSecondaryStorageResourceHandler(this, nfsVersion));
return true; return true;
} }
} }

View File

@ -66,7 +66,7 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe
* private Map<String, HostMO> _activeHosts = new HashMap<String, HostMO>(); * private Map<String, HostMO> _activeHosts = new HashMap<String, HostMO>();
*/ */
public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, String nfsVersion) { public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, Integer nfsVersion) {
_resource = resource; _resource = resource;
_storageMgr = new VmwareStorageManagerImpl(this, nfsVersion); _storageMgr = new VmwareStorageManagerImpl(this, nfsVersion);
_gson = GsonHelper.getGsonLogger(); _gson = GsonHelper.getGsonLogger();
@ -304,7 +304,7 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe
} }
@Override @Override
public String getMountPoint(String storageUrl, String nfsVersion) { public String getMountPoint(String storageUrl, Integer nfsVersion) {
return _resource.getRootDir(storageUrl, nfsVersion); return _resource.getRootDir(storageUrl, nfsVersion);
} }
} }

View File

@ -125,10 +125,10 @@ public class VmwareStorageProcessor implements StorageProcessor {
protected Integer _shutdownWaitMs; protected Integer _shutdownWaitMs;
private final Gson _gson; private final Gson _gson;
private final StorageLayer _storage = new JavaStorageLayer(); private final StorageLayer _storage = new JavaStorageLayer();
private String _nfsVersion; private Integer _nfsVersion;
public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFlag, VmwareStorageMount mountService, Integer timeout, VmwareResource resource, public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFlag, VmwareStorageMount mountService, Integer timeout, VmwareResource resource,
Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource, String nfsVersion) { Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource, Integer nfsVersion) {
this.hostService = hostService; this.hostService = hostService;
_fullCloneFlag = fullCloneFlag; _fullCloneFlag = fullCloneFlag;
this.mountService = mountService; this.mountService = mountService;
@ -169,7 +169,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
private VirtualMachineMO copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, private VirtualMachineMO copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl,
String templatePathAtSecondaryStorage, String templateName, String templateUuid, boolean createSnapshot, String nfsVersion) throws Exception { String templatePathAtSecondaryStorage, String templateName, String templateUuid, boolean createSnapshot, Integer nfsVersion) throws Exception {
s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " +
templatePathAtSecondaryStorage + ", templateName: " + templateName); templatePathAtSecondaryStorage + ", templateName: " + templateName);
@ -532,7 +532,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
} }
private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, String srcVolumePath, DatastoreMO dsMo, String secStorageUrl, long wait, String nfsVersion) throws Exception { private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, String srcVolumePath, DatastoreMO dsMo, String secStorageUrl, long wait, Integer nfsVersion) throws Exception {
String volumeFolder = null; String volumeFolder = null;
String volumeName = null; String volumeName = null;
@ -552,7 +552,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
return new Pair<String, String>(volumeFolder, newVolume); return new Pair<String, String>(volumeFolder, newVolume);
} }
private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl, String nfsVersion) throws Exception { private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl, Integer nfsVersion) throws Exception {
String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
String volumeMountRoot = secondaryMountPoint + File.separator + volumeDir; String volumeMountRoot = secondaryMountPoint + File.separator + volumeDir;
@ -734,7 +734,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, String installPath, long templateId, String templateUniqueName, private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, String installPath, long templateId, String templateUniqueName,
String secStorageUrl, String volumePath, String workerVmName, String nfsVersion) throws Exception { String secStorageUrl, String volumePath, String workerVmName, Integer nfsVersion) throws Exception {
String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
String installFullPath = secondaryMountPoint + "/" + installPath; String installFullPath = secondaryMountPoint + "/" + installPath;
@ -899,7 +899,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
private Ternary<String, Long, Long> createTemplateFromSnapshot(String installPath, String templateUniqueName, String secStorageUrl, String snapshotPath, private Ternary<String, Long, Long> createTemplateFromSnapshot(String installPath, String templateUniqueName, String secStorageUrl, String snapshotPath,
Long templateId, long wait, String nfsVersion) throws Exception { Long templateId, long wait, Integer nfsVersion) throws Exception {
//Snapshot path is decoded in this form: /snapshots/account/volumeId/uuid/uuid //Snapshot path is decoded in this form: /snapshots/account/volumeId/uuid/uuid
String backupSSUuid; String backupSSUuid;
String snapshotFolder; String snapshotFolder;
@ -1066,7 +1066,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
// return Pair<String(divice bus name), String[](disk chain)> // return Pair<String(divice bus name), String[](disk chain)>
private Pair<String, String[]> exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, private Pair<String, String[]> exportVolumeToSecondaryStroage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir,
String exportName, String workerVmName, String nfsVersion) throws Exception { String exportName, String workerVmName, Integer nfsVersion) throws Exception {
String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion); String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName; String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName;
@ -1110,7 +1110,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
// Ternary<String(backup uuid in secondary storage), String(device bus name), String[](original disk chain in the snapshot)> // Ternary<String(backup uuid in secondary storage), String(device bus name), String[](original disk chain in the snapshot)>
private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, String installPath, String volumePath, String snapshotUuid, private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, String installPath, String volumePath, String snapshotUuid,
String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName, String nfsVersion) throws Exception { String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName, Integer nfsVersion) throws Exception {
String backupUuid = UUID.randomUUID().toString(); String backupUuid = UUID.randomUUID().toString();
Pair<String, String[]> snapshotInfo = exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, installPath, backupUuid, workerVmName, nfsVersion); Pair<String, String[]> snapshotInfo = exportVolumeToSecondaryStroage(vmMo, volumePath, secStorageUrl, installPath, backupUuid, workerVmName, nfsVersion);
@ -2212,7 +2212,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir, private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir,
String backupName, long wait, String nfsVersion) throws Exception { String backupName, long wait, Integer nfsVersion) throws Exception {
String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null);
String srcOVAFileName = null; String srcOVAFileName = null;
@ -2389,4 +2389,9 @@ public class VmwareStorageProcessor implements StorageProcessor {
private String getLegacyVmDataDiskController() throws Exception { private String getLegacyVmDataDiskController() throws Exception {
return DiskControllerType.lsilogic.toString(); return DiskControllerType.lsilogic.toString();
} }
public void setNfsVersion(Integer nfsVersion){
this._nfsVersion = nfsVersion;
s_logger.debug("VmwareProcessor instance now using NFS version: " + nfsVersion);
}
} }

View File

@ -43,7 +43,7 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman
private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class);
private VmwareStorageManager storageManager; private VmwareStorageManager storageManager;
private PremiumSecondaryStorageResource storageResource; private PremiumSecondaryStorageResource storageResource;
private String _nfsVersion; private Integer _nfsVersion;
public PremiumSecondaryStorageResource getStorageResource() { public PremiumSecondaryStorageResource getStorageResource() {
return storageResource; return storageResource;
@ -61,11 +61,28 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman
this.storageManager = storageManager; this.storageManager = storageManager;
} }
public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, String nfsVersion) { public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, Integer nfsVersion) {
super(processor); super(processor);
this._nfsVersion = nfsVersion; this._nfsVersion = nfsVersion;
} }
/**
* Reconfigure NFS version for storage operations
* @param nfsVersion NFS version to set
* @return true if NFS version could be configured, false in other case
*/
public boolean reconfigureNfsVersion(Integer nfsVersion){
try {
VmwareStorageProcessor processor = (VmwareStorageProcessor) this.processor;
processor.setNfsVersion(nfsVersion);
this._nfsVersion = nfsVersion;
return true;
} catch (Exception e){
s_logger.error("Error while reconfiguring NFS version " + nfsVersion);
return false;
}
}
@Override @Override
protected Answer execute(CopyCommand cmd) { protected Answer execute(CopyCommand cmd) {
DataTO srcData = cmd.getSrcTO(); DataTO srcData = cmd.getSrcTO();

View File

@ -20,17 +20,27 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.never;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.apache.cloudstack.storage.command.CopyCommand;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.Spy; import org.mockito.Spy;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.vmware.vim25.VirtualDevice; import com.vmware.vim25.VirtualDevice;
import com.vmware.vim25.VirtualMachineConfigSpec; import com.vmware.vim25.VirtualMachineConfigSpec;
@ -38,14 +48,26 @@ import com.vmware.vim25.VirtualMachineVideoCard;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.ScaleVmAnswer; import com.cloud.agent.api.ScaleVmAnswer;
import com.cloud.agent.api.ScaleVmCommand; import com.cloud.agent.api.ScaleVmCommand;
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.agent.api.to.VirtualMachineTO;
import com.cloud.hypervisor.vmware.mo.VirtualMachineMO; import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost; import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
import com.cloud.hypervisor.vmware.util.VmwareContext; import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.storage.resource.VmwareStorageProcessor;
import com.cloud.storage.resource.VmwareStorageSubsystemCommandHandler;
@RunWith(PowerMockRunner.class)
@PrepareForTest(CopyCommand.class)
public class VmwareResourceTest { public class VmwareResourceTest {
@Mock
VmwareStorageProcessor storageProcessor;
@Mock
VmwareStorageSubsystemCommandHandler storageHandler;
@Spy @Spy
@InjectMocks
VmwareResource _resource = new VmwareResource() { VmwareResource _resource = new VmwareResource() {
@Override @Override
@ -57,6 +79,7 @@ public class VmwareResourceTest {
public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) { public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) {
return hyperHost; return hyperHost;
} }
}; };
@Mock @Mock
@ -75,12 +98,25 @@ public class VmwareResourceTest {
VirtualMachineMO vmMo3dgpu; VirtualMachineMO vmMo3dgpu;
@Mock @Mock
VirtualMachineTO vmSpec3dgpu; VirtualMachineTO vmSpec3dgpu;
@Mock
DataTO srcDataTO;
@Mock
NfsTO srcDataNfsTO;
CopyCommand storageCmd;
private static final Integer NFS_VERSION = Integer.valueOf(3);
private static final Integer NFS_VERSION_NOT_PRESENT = null;
@Before @Before
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
storageCmd = PowerMockito.mock(CopyCommand.class);
doReturn(context).when(_resource).getServiceContext(null); doReturn(context).when(_resource).getServiceContext(null);
when(cmd.getVirtualMachine()).thenReturn(vmSpec); when(cmd.getVirtualMachine()).thenReturn(vmSpec);
when(storageCmd.getSrcTO()).thenReturn(srcDataTO);
when(srcDataTO.getDataStore()).thenReturn(srcDataNfsTO);
when(srcDataNfsTO.getNfsVersion()).thenReturn(NFS_VERSION);
} }
//Test successful scaling up the vm //Test successful scaling up the vm
@ -117,4 +153,61 @@ public class VmwareResourceTest {
verify(vmMo3dgpu).configureVm(any(VirtualMachineConfigSpec.class)); verify(vmMo3dgpu).configureVm(any(VirtualMachineConfigSpec.class));
} }
// ---------------------------------------------------------------------------------------------------
@Test
public void testgetNfsVersionFromNfsTONull(){
assertFalse(_resource.getStorageNfsVersionFromNfsTO(null));
}
@Test
public void testgetNfsVersionFromNfsTONfsVersionNull(){
when(srcDataNfsTO.getNfsVersion()).thenReturn(NFS_VERSION_NOT_PRESENT);
assertFalse(_resource.getStorageNfsVersionFromNfsTO(srcDataNfsTO));
}
@Test
public void testgetNfsVersionFromNfsTONfsVersion(){
assertTrue(_resource.getStorageNfsVersionFromNfsTO(srcDataNfsTO));
}
// ---------------------------------------------------------------------------------------------------
@Test
public void testSetCurrentNfsVersionInProcessorAndHandler(){
_resource.setCurrentNfsVersionInProcessorAndHandler();
verify(storageHandler).reconfigureNfsVersion(any(Integer.class));
}
// ---------------------------------------------------------------------------------------------------
@Test
public void testExamineStorageSubSystemCommandNfsVersionNotPresent(){
when(srcDataNfsTO.getNfsVersion()).thenReturn(NFS_VERSION_NOT_PRESENT);
_resource.examineStorageSubSystemCommandNfsVersion(storageCmd);
verify(_resource, never()).setCurrentNfsVersionInProcessorAndHandler();
}
@Test
public void testExamineStorageSubSystemCommandNfsVersion(){
_resource.examineStorageSubSystemCommandNfsVersion(storageCmd);
verify(_resource).setCurrentNfsVersionInProcessorAndHandler();
}
// ---------------------------------------------------------------------------------------------------
@Test
public void checkStorageProcessorAndHandlerNfsVersionAttributeVersionNotSet(){
_resource.checkStorageProcessorAndHandlerNfsVersionAttribute(storageCmd);
verify(_resource).examineStorageSubSystemCommandNfsVersion(storageCmd);
assertEquals(NFS_VERSION, _resource.storageNfsVersion);
}
@Test
public void checkStorageProcessorAndHandlerNfsVersionAttributeVersionSet(){
_resource.storageNfsVersion = NFS_VERSION;
_resource.checkStorageProcessorAndHandlerNfsVersionAttribute(storageCmd);
verify(_resource, never()).examineStorageSubSystemCommandNfsVersion(storageCmd);
}
} }

View File

@ -32,7 +32,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.storage.image.BaseImageStoreDriverImpl; import org.apache.cloudstack.storage.image.NfsImageStoreDriverImpl;
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.cloudstack.storage.image.store.ImageStoreImpl; import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
@ -44,7 +44,7 @@ import com.cloud.configuration.Config;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
public class CloudStackImageStoreDriverImpl extends BaseImageStoreDriverImpl { public class CloudStackImageStoreDriverImpl extends NfsImageStoreDriverImpl {
private static final Logger s_logger = Logger.getLogger(CloudStackImageStoreDriverImpl.class); private static final Logger s_logger = Logger.getLogger(CloudStackImageStoreDriverImpl.class);
@Inject @Inject
@ -60,6 +60,7 @@ public class CloudStackImageStoreDriverImpl extends BaseImageStoreDriverImpl {
NfsTO nfsTO = new NfsTO(); NfsTO nfsTO = new NfsTO();
nfsTO.setRole(store.getRole()); nfsTO.setRole(store.getRole());
nfsTO.setUrl(nfsStore.getUri()); nfsTO.setUrl(nfsStore.getUri());
nfsTO.setNfsVersion(getNfsVersion(nfsStore.getId()));
return nfsTO; return nfsTO;
} }

View File

@ -770,7 +770,8 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
continue; continue;
} }
GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), imageStoreDetailsUtil.getNfsVersion(store.getId())); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(store.getId());
GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), nfsVersion);
EndPoint ssAhost = _epSelector.select(store); EndPoint ssAhost = _epSelector.select(store);
if (ssAhost == null) { if (ssAhost == null) {
s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName());

View File

@ -38,7 +38,7 @@ public class ImageStoreDetailsUtil {
* @return {@code null} if {@code nfs.version} is not found for storeId <br/> * @return {@code null} if {@code nfs.version} is not found for storeId <br/>
* {@code X} if {@code nfs.version} is found found for storeId * {@code X} if {@code nfs.version} is found found for storeId
*/ */
public String getNfsVersion(long storeId) { public Integer getNfsVersion(long storeId) throws NumberFormatException {
String nfsVersion = null; String nfsVersion = null;
if (imageStoreDetailsDao.getDetails(storeId) != null){ if (imageStoreDetailsDao.getDetails(storeId) != null){
Map<String, String> storeDetails = imageStoreDetailsDao.getDetails(storeId); Map<String, String> storeDetails = imageStoreDetailsDao.getDetails(storeId);
@ -46,7 +46,7 @@ public class ImageStoreDetailsUtil {
nfsVersion = storeDetails.get("nfs.version"); nfsVersion = storeDetails.get("nfs.version");
} }
} }
return nfsVersion; return (nfsVersion != null ? Integer.valueOf(nfsVersion) : null);
} }
/** /**
@ -56,7 +56,7 @@ public class ImageStoreDetailsUtil {
* @return {@code null} if {@code nfs.version} is not found for storeUuid <br/> * @return {@code null} if {@code nfs.version} is not found for storeUuid <br/>
* {@code X} if {@code nfs.version} is found found for storeUuid * {@code X} if {@code nfs.version} is found found for storeUuid
*/ */
public String getNfsVersionByUuid(String storeUuid){ public Integer getNfsVersionByUuid(String storeUuid){
ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid); ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid);
if (imageStore != null){ if (imageStore != null){
return getNfsVersion(imageStore.getId()); return getNfsVersion(imageStore.getId());

View File

@ -34,7 +34,7 @@ public class ImageStoreDetailsUtilTest {
private final static long STORE_ID = 1l; private final static long STORE_ID = 1l;
private final static String STORE_UUID = "aaaa-aaaa-aaaa-aaaa"; private final static String STORE_UUID = "aaaa-aaaa-aaaa-aaaa";
private final static String NFS_VERSION = "3"; private final static Integer NFS_VERSION = 3;
ImageStoreDetailsUtil imageStoreDetailsUtil = new ImageStoreDetailsUtil(); ImageStoreDetailsUtil imageStoreDetailsUtil = new ImageStoreDetailsUtil();
@ -44,7 +44,7 @@ public class ImageStoreDetailsUtilTest {
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
Map<String, String> imgStoreDetails = new HashMap<String, String>(); Map<String, String> imgStoreDetails = new HashMap<String, String>();
imgStoreDetails.put("nfs.version", NFS_VERSION); imgStoreDetails.put("nfs.version", String.valueOf(NFS_VERSION));
when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails);
ImageStoreVO imgStoreVO = mock(ImageStoreVO.class); ImageStoreVO imgStoreVO = mock(ImageStoreVO.class);
@ -57,7 +57,7 @@ public class ImageStoreDetailsUtilTest {
@Test @Test
public void testGetNfsVersion(){ public void testGetNfsVersion(){
String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
assertEquals(NFS_VERSION, nfsVersion); assertEquals(NFS_VERSION, nfsVersion);
} }
@ -67,7 +67,7 @@ public class ImageStoreDetailsUtilTest {
imgStoreDetails.put("other.prop", "propValue"); imgStoreDetails.put("other.prop", "propValue");
when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails);
String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
assertNull(nfsVersion); assertNull(nfsVersion);
} }
@ -76,20 +76,20 @@ public class ImageStoreDetailsUtilTest {
Map<String, String> imgStoreDetails = new HashMap<String, String>(); Map<String, String> imgStoreDetails = new HashMap<String, String>();
when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails);
String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
assertNull(nfsVersion); assertNull(nfsVersion);
} }
@Test @Test
public void testGetNfsVersionByUuid(){ public void testGetNfsVersionByUuid(){
String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
assertEquals(NFS_VERSION, nfsVersion); assertEquals(NFS_VERSION, nfsVersion);
} }
@Test @Test
public void testGetNfsVersionByUuidNoImgStore(){ public void testGetNfsVersionByUuidNoImgStore(){
when(imgStoreDao.findByUuid(STORE_UUID)).thenReturn(null); when(imgStoreDao.findByUuid(STORE_UUID)).thenReturn(null);
String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
assertNull(nfsVersion); assertNull(nfsVersion);
} }
} }

View File

@ -313,7 +313,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar
setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs); setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs);
} }
setupCmd.setNfsVersion(imageStoreDetailsUtil.getNfsVersion(ssStore.getId())); Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
setupCmd.setNfsVersion(nfsVersion);
//template/volume file upload key //template/volume file upload key
String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); String postUploadKey = _configDao.getValue(Config.SSVMPSK.key());
@ -1135,7 +1136,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar
if (dc.getDns2() != null) { if (dc.getDns2() != null) {
buf.append(" dns2=").append(dc.getDns2()); buf.append(" dns2=").append(dc.getDns2());
} }
String nfsVersion = imageStoreDetailsUtil != null ? imageStoreDetailsUtil.getNfsVersion(secStore.getId()) : null; Integer nfsVersion = imageStoreDetailsUtil != null ? imageStoreDetailsUtil.getNfsVersion(secStore.getId()) : null;
buf.append(" nfsVersion=").append(nfsVersion); buf.append(" nfsVersion=").append(nfsVersion);
String bootArgs = buf.toString(); String bootArgs = buf.toString();

View File

@ -53,7 +53,7 @@ public class LocalNfsSecondaryStorageResource extends NfsSecondaryStorageResourc
} }
@Override @Override
synchronized public String getRootDir(String secUrl, String nfsVersion) { synchronized public String getRootDir(String secUrl, Integer nfsVersion) {
try { try {
URI uri = new URI(secUrl); URI uri = new URI(secUrl);
String dir = mountUri(uri, nfsVersion); String dir = mountUri(uri, nfsVersion);
@ -66,7 +66,7 @@ public class LocalNfsSecondaryStorageResource extends NfsSecondaryStorageResourc
} }
@Override @Override
protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { protected void mount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
ensureLocalRootPathExists(localRootPath, uri); ensureLocalRootPathExists(localRootPath, uri);
if (mountExists(localRootPath, uri)) { if (mountExists(localRootPath, uri)) {

View File

@ -72,7 +72,7 @@ public class LocalSecondaryStorageResource extends ServerResourceBase implements
} }
@Override @Override
public String getRootDir(String url, String nfsVersion) { public String getRootDir(String url, Integer nfsVersion) {
return getRootDir(); return getRootDir();
} }

View File

@ -205,7 +205,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
private String _storageIp; private String _storageIp;
private String _storageNetmask; private String _storageNetmask;
private String _storageGateway; private String _storageGateway;
private String _nfsVersion; private Integer _nfsVersion;
private final List<String> nfsIps = new ArrayList<String>(); private final List<String> nfsIps = new ArrayList<String>();
protected String _parent = "/mnt/SecStorage"; protected String _parent = "/mnt/SecStorage";
final private String _tmpltpp = "template.properties"; final private String _tmpltpp = "template.properties";
@ -229,6 +229,26 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
_inSystemVM = inSystemVM; _inSystemVM = inSystemVM;
} }
/**
* Retrieve converted "nfsVersion" value from params
* @param params
* @return nfsVersion value if exists, null in other case
*/
public static Integer retrieveNfsVersionFromParams(Map<String, Object> params){
Integer nfsVersion = null;
if (params.get("nfsVersion") != null){
String nfsVersionParam = (String)params.get("nfsVersion");
try {
nfsVersion = Integer.valueOf(nfsVersionParam);
}
catch (NumberFormatException e){
s_logger.error("Couldn't cast " + nfsVersionParam + " to integer");
return null;
}
}
return nfsVersion;
}
@Override @Override
public Answer executeRequest(Command cmd) { public Answer executeRequest(Command cmd) {
if (cmd instanceof DownloadProgressCommand) { if (cmd instanceof DownloadProgressCommand) {
@ -559,7 +579,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return new CopyCmdAnswer(""); return new CopyCmdAnswer("");
} }
protected File getFile(String path, String nfsPath, String nfsVersion) { protected File getFile(String path, String nfsPath, Integer nfsVersion) {
String filePath = getRootDir(nfsPath, nfsVersion) + File.separator + path; String filePath = getRootDir(nfsPath, nfsVersion) + File.separator + path;
File f = new File(filePath); File f = new File(filePath);
if (!f.exists()) { if (!f.exists()) {
@ -688,7 +708,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
return Long.parseLong(StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR)); return Long.parseLong(StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR));
} }
private String determineStorageTemplatePath(final String storagePath, String dataPath, String nfsVersion) { private String determineStorageTemplatePath(final String storagePath, String dataPath, Integer nfsVersion) {
return join(asList(getRootDir(storagePath, nfsVersion), dataPath), File.separator); return join(asList(getRootDir(storagePath, nfsVersion), dataPath), File.separator);
} }
@ -2046,7 +2066,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
} }
@Override @Override
synchronized public String getRootDir(String secUrl, String nfsVersion) { synchronized public String getRootDir(String secUrl, Integer nfsVersion) {
if (!_inSystemVM) { if (!_inSystemVM) {
return _parent; return _parent;
} }
@ -2209,7 +2229,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
startAdditionalServices(); startAdditionalServices();
_params.put("install.numthreads", "50"); _params.put("install.numthreads", "50");
_params.put("secondary.storage.vm", "true"); _params.put("secondary.storage.vm", "true");
_nfsVersion = (String)params.get("nfsVersion"); _nfsVersion = retrieveNfsVersionFromParams(params);
} }
try { try {
@ -2385,10 +2405,11 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
* crresponding to the remote device. Will throw for unsupported * crresponding to the remote device. Will throw for unsupported
* scheme. * scheme.
* @param imgStoreId * @param imgStoreId
* @param nfsVersion NFS version to use in mount command
* @return name of folder in _parent that device was mounted. * @return name of folder in _parent that device was mounted.
* @throws UnknownHostException * @throws UnknownHostException
*/ */
protected String mountUri(URI uri, String nfsVersion) throws UnknownHostException { protected String mountUri(URI uri, Integer nfsVersion) throws UnknownHostException {
String uriHostIp = getUriHostIp(uri); String uriHostIp = getUriHostIp(uri);
String nfsPath = uriHostIp + ":" + uri.getPath(); String nfsPath = uriHostIp + ":" + uri.getPath();
@ -2432,7 +2453,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
s_logger.debug("Successfully umounted " + localRootPath); s_logger.debug("Successfully umounted " + localRootPath);
} }
protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { protected void mount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
s_logger.debug("mount " + uri.toString() + " on " + localRootPath + ((nfsVersion != null) ? " nfsVersion="+nfsVersion : "")); s_logger.debug("mount " + uri.toString() + " on " + localRootPath + ((nfsVersion != null) ? " nfsVersion="+nfsVersion : ""));
ensureLocalRootPathExists(localRootPath, uri); ensureLocalRootPathExists(localRootPath, uri);
@ -2448,7 +2469,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
checkForVolumesDir(localRootPath); checkForVolumesDir(localRootPath);
} }
protected void attemptMount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) { protected void attemptMount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
String result; 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 : "")); + ((nfsVersion != null) ? " nfsVersion=" + nfsVersion : ""));

View File

@ -23,6 +23,6 @@ import com.cloud.resource.ServerResource;
*/ */
public interface SecondaryStorageResource extends ServerResource { public interface SecondaryStorageResource extends ServerResource {
String getRootDir(String cmd, String nfsVersion); String getRootDir(String cmd, Integer nfsVersion);
} }

View File

@ -44,6 +44,7 @@ import org.apache.cloudstack.storage.command.DownloadCommand;
import org.apache.cloudstack.storage.command.DownloadCommand.ResourceType; import org.apache.cloudstack.storage.command.DownloadCommand.ResourceType;
import org.apache.cloudstack.storage.command.DownloadProgressCommand; import org.apache.cloudstack.storage.command.DownloadProgressCommand;
import org.apache.cloudstack.storage.command.DownloadProgressCommand.RequestType; import org.apache.cloudstack.storage.command.DownloadProgressCommand.RequestType;
import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
import org.apache.cloudstack.storage.resource.SecondaryStorageResource; import org.apache.cloudstack.storage.resource.SecondaryStorageResource;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -89,7 +90,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
StorageLayer _storage; StorageLayer _storage;
public Map<String, Processor> _processors; public Map<String, Processor> _processors;
private String _nfsVersion; private Integer _nfsVersion;
public class Completion implements DownloadCompleteCallback { public class Completion implements DownloadCompleteCallback {
private final String jobId; private final String jobId;
@ -984,7 +985,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager
String inSystemVM = (String)params.get("secondary.storage.vm"); String inSystemVM = (String)params.get("secondary.storage.vm");
if (inSystemVM != null && "true".equalsIgnoreCase(inSystemVM)) { if (inSystemVM != null && "true".equalsIgnoreCase(inSystemVM)) {
s_logger.info("DownloadManager: starting additional services since we are inside system vm"); s_logger.info("DownloadManager: starting additional services since we are inside system vm");
_nfsVersion = (String)params.get("nfsVersion"); _nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
startAdditionalServices(); startAdditionalServices();
blockOutgoingOnPrivate(); blockOutgoingOnPrivate();
} }