CLOUDSTACK-9368: Fix for Support configurable NFS version for Secondary Storage mounts
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/2d281997 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/2d281997 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/2d281997 Branch: refs/heads/master Commit: 2d2819974eb44928599053445bc5b2876c9102e5 Parents: cb55624 Author: nvazquez <nicolas.m.vazq...@gmail.com> Authored: Fri Apr 22 12:47:05 2016 -0700 Committer: nvazquez <nicolas.m.vazq...@gmail.com> Committed: Fri May 20 07:31:16 2016 -0700 ---------------------------------------------------------------------- api/src/com/cloud/agent/api/to/NfsTO.java | 9 ++ .../cloud/agent/api/BackupSnapshotCommand.java | 8 -- ...reatePrivateTemplateFromSnapshotCommand.java | 8 -- .../CreatePrivateTemplateFromVolumeCommand.java | 8 -- .../api/CreateVolumeFromSnapshotCommand.java | 9 -- .../cloud/agent/api/GetStorageStatsCommand.java | 16 +--- .../cloud/agent/api/SecStorageSetupCommand.java | 11 +-- .../com/cloud/agent/api/SnapshotCommand.java | 3 +- .../agent/api/storage/CopyVolumeCommand.java | 11 +-- .../agent/api/storage/ListTemplateCommand.java | 16 +--- .../storage/PrimaryStorageDownloadCommand.java | 8 -- .../com/cloud/agent/api/storage/SsCommand.java | 4 +- .../cloud/agent/api/storage/StorageCommand.java | 8 +- .../api/storage/StorageNfsVersionCommand.java | 44 +++++++++ .../TemplateOrVolumePostUploadCommand.java | 6 +- .../storage/image/TemplateServiceImpl.java | 3 +- .../MockLocalNfsSecondaryStorageResource.java | 2 +- .../storage/image/BaseImageStoreDriverImpl.java | 1 + .../storage/image/NfsImageStoreDriverImpl.java | 48 ++++++++++ .../cloud/resource/AgentStorageResource.java | 2 +- .../driver/SimulatorImageStoreDriverImpl.java | 5 +- .../vmware/manager/VmwareManagerImpl.java | 7 +- .../manager/VmwareStorageManagerImpl.java | 24 ++--- .../vmware/manager/VmwareStorageMount.java | 2 +- .../vmware/resource/VmwareResource.java | 68 +++++++++++++- .../PremiumSecondaryStorageResource.java | 3 +- .../VmwareSecondaryStorageResourceHandler.java | 4 +- .../resource/VmwareStorageProcessor.java | 25 +++--- .../VmwareStorageSubsystemCommandHandler.java | 21 ++++- .../vmware/resource/VmwareResourceTest.java | 95 +++++++++++++++++++- .../driver/CloudStackImageStoreDriverImpl.java | 5 +- server/src/com/cloud/server/StatsCollector.java | 3 +- .../cloud/storage/ImageStoreDetailsUtil.java | 6 +- .../storage/ImageStoreDetailsUtilTest.java | 14 +-- .../SecondaryStorageManagerImpl.java | 5 +- .../LocalNfsSecondaryStorageResource.java | 4 +- .../resource/LocalSecondaryStorageResource.java | 2 +- .../resource/NfsSecondaryStorageResource.java | 37 ++++++-- .../resource/SecondaryStorageResource.java | 2 +- .../storage/template/DownloadManagerImpl.java | 5 +- 40 files changed, 398 insertions(+), 164 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/api/src/com/cloud/agent/api/to/NfsTO.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/agent/api/to/NfsTO.java b/api/src/com/cloud/agent/api/to/NfsTO.java index 51d1aad..1cf7218 100644 --- a/api/src/com/cloud/agent/api/to/NfsTO.java +++ b/api/src/com/cloud/agent/api/to/NfsTO.java @@ -24,6 +24,7 @@ public class NfsTO implements DataStoreTO { private DataStoreRole _role; private String uuid; private static final String pathSeparator = "/"; + private Integer nfsVersion; public NfsTO() { @@ -71,4 +72,12 @@ public class NfsTO implements DataStoreTO { public String getPathSeparator() { return pathSeparator; } + + public Integer getNfsVersion() { + return nfsVersion; + } + + public void setNfsVersion(Integer nfsVersion) { + this.nfsVersion = nfsVersion; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/BackupSnapshotCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java index d93c32f..2c8c0cc 100644 --- a/core/src/com/cloud/agent/api/BackupSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/BackupSnapshotCommand.java @@ -39,7 +39,6 @@ public class BackupSnapshotCommand extends SnapshotCommand { private S3TO s3; StorageFilerTO pool; private Long secHostId; - private String nfsVersion; protected BackupSnapshotCommand() { @@ -109,11 +108,4 @@ public class BackupSnapshotCommand extends SnapshotCommand { return secHostId; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java index 5a09994..30b59ff 100644 --- a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromSnapshotCommand.java @@ -28,7 +28,6 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand { private String origTemplateInstallPath; private Long newTemplateId; private String templateName; - private String nfsVersion; protected CreatePrivateTemplateFromSnapshotCommand() { @@ -74,11 +73,4 @@ public class CreatePrivateTemplateFromSnapshotCommand extends SnapshotCommand { return templateName; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java index b6cc6ac..38a2f94 100644 --- a/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java +++ b/core/src/com/cloud/agent/api/CreatePrivateTemplateFromVolumeCommand.java @@ -32,7 +32,6 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand { StorageFilerTO _primaryPool; // For XenServer private String _secondaryStorageUrl; - private String nfsVersion; public CreatePrivateTemplateFromVolumeCommand() { } @@ -101,11 +100,4 @@ public class CreatePrivateTemplateFromVolumeCommand extends SnapshotCommand { _templateId = templateId; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java index 933be03..4526ce7 100644 --- a/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java +++ b/core/src/com/cloud/agent/api/CreateVolumeFromSnapshotCommand.java @@ -26,8 +26,6 @@ import com.cloud.storage.StoragePool; */ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { - private String nfsVersion; - protected CreateVolumeFromSnapshotCommand() { } @@ -53,11 +51,4 @@ public class CreateVolumeFromSnapshotCommand extends SnapshotCommand { setWait(wait); } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/GetStorageStatsCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/GetStorageStatsCommand.java b/core/src/com/cloud/agent/api/GetStorageStatsCommand.java index 84b5426..94a574c 100644 --- a/core/src/com/cloud/agent/api/GetStorageStatsCommand.java +++ b/core/src/com/cloud/agent/api/GetStorageStatsCommand.java @@ -20,17 +20,17 @@ package com.cloud.agent.api; import com.cloud.agent.api.LogLevel.Log4jLevel; +import com.cloud.agent.api.storage.StorageNfsVersionCommand; import com.cloud.agent.api.to.DataStoreTO; import com.cloud.storage.Storage.StoragePoolType; @LogLevel(Log4jLevel.Trace) -public class GetStorageStatsCommand extends Command { +public class GetStorageStatsCommand extends StorageNfsVersionCommand { private String id; private String localPath; private StoragePoolType pooltype; private String secUrl; private DataStoreTO store; - private String nfsVersion; public String getSecUrl() { return secUrl; @@ -55,9 +55,9 @@ public class GetStorageStatsCommand extends Command { this.store = store; } - public GetStorageStatsCommand(DataStoreTO store, String nfsVersion) { + public GetStorageStatsCommand(DataStoreTO store, Integer nfsVersion) { + super(nfsVersion); this.store = store; - this.nfsVersion = nfsVersion; } public GetStorageStatsCommand(String secUrl) { @@ -87,14 +87,6 @@ public class GetStorageStatsCommand extends Command { return this.store; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } - @Override public boolean executeInSequence() { return false; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/SecStorageSetupCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/SecStorageSetupCommand.java b/core/src/com/cloud/agent/api/SecStorageSetupCommand.java index 316e469..061346c 100644 --- a/core/src/com/cloud/agent/api/SecStorageSetupCommand.java +++ b/core/src/com/cloud/agent/api/SecStorageSetupCommand.java @@ -21,14 +21,14 @@ package com.cloud.agent.api; import org.apache.cloudstack.framework.security.keystore.KeystoreManager; +import com.cloud.agent.api.storage.StorageNfsVersionCommand; import com.cloud.agent.api.to.DataStoreTO; -public class SecStorageSetupCommand extends Command { +public class SecStorageSetupCommand extends StorageNfsVersionCommand { private DataStoreTO store; private String secUrl; private KeystoreManager.Certificates certs; private String postUploadKey; - private String nfsVersion; public SecStorageSetupCommand() { @@ -76,11 +76,4 @@ public class SecStorageSetupCommand extends Command { this.postUploadKey = postUploadKey; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/SnapshotCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/SnapshotCommand.java b/core/src/com/cloud/agent/api/SnapshotCommand.java index cf4eeb5..0e527e2 100644 --- a/core/src/com/cloud/agent/api/SnapshotCommand.java +++ b/core/src/com/cloud/agent/api/SnapshotCommand.java @@ -19,6 +19,7 @@ package com.cloud.agent.api; +import com.cloud.agent.api.storage.StorageNfsVersionCommand; import com.cloud.agent.api.to.StorageFilerTO; 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 * the XenServer. */ -public class SnapshotCommand extends Command { +public class SnapshotCommand extends StorageNfsVersionCommand { protected String primaryStoragePoolNameLabel; StorageFilerTO primaryPool; private String snapshotUuid; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java b/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java index 7ab822c..a75e9ba 100644 --- a/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java +++ b/core/src/com/cloud/agent/api/storage/CopyVolumeCommand.java @@ -19,11 +19,10 @@ package com.cloud.agent.api.storage; -import com.cloud.agent.api.Command; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.storage.StoragePool; -public class CopyVolumeCommand extends Command { +public class CopyVolumeCommand extends StorageNfsVersionCommand { long volumeId; String volumePath; @@ -32,7 +31,6 @@ public class CopyVolumeCommand extends Command { boolean toSecondaryStorage; String vmName; boolean executeInSequence = false; - String nfsVersion; public CopyVolumeCommand() { } @@ -77,11 +75,4 @@ public class CopyVolumeCommand extends Command { return vmName; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java b/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java index bacc83a..6f60933 100644 --- a/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java +++ b/core/src/com/cloud/agent/api/storage/ListTemplateCommand.java @@ -23,21 +23,17 @@ import com.cloud.agent.api.to.DataStoreTO; public class ListTemplateCommand extends StorageCommand { private DataStoreTO store; - private String nfsVersion; - - //private String secUrl; public ListTemplateCommand() { } public ListTemplateCommand(DataStoreTO 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.nfsVersion = nfsVersion; } @Override @@ -49,12 +45,4 @@ public class ListTemplateCommand extends StorageCommand { return store; } - public String getNfsVersion() { - return nfsVersion; - } - - // public String getSecUrl() { - // return secUrl; - // } - } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java index 9dae513..725bd0c 100644 --- a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java +++ b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java @@ -35,7 +35,6 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand { String secondaryStorageUrl; String primaryStorageUrl; - String nfsVersion; protected PrimaryStorageDownloadCommand() { } @@ -89,11 +88,4 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand { return true; } - public String getNfsVersion() { - return nfsVersion; - } - - public void setNfsVersion(String nfsVersion) { - this.nfsVersion = nfsVersion; - } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/SsCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/SsCommand.java b/core/src/com/cloud/agent/api/storage/SsCommand.java index 187ae03..575b245 100644 --- a/core/src/com/cloud/agent/api/storage/SsCommand.java +++ b/core/src/com/cloud/agent/api/storage/SsCommand.java @@ -19,9 +19,7 @@ package com.cloud.agent.api.storage; -import com.cloud.agent.api.Command; - -public abstract class SsCommand extends Command { +public abstract class SsCommand extends StorageNfsVersionCommand { private String secUrl; public SsCommand() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/StorageCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/StorageCommand.java b/core/src/com/cloud/agent/api/storage/StorageCommand.java index a6719c4..429755c 100644 --- a/core/src/com/cloud/agent/api/storage/StorageCommand.java +++ b/core/src/com/cloud/agent/api/storage/StorageCommand.java @@ -19,11 +19,13 @@ package com.cloud.agent.api.storage; -import com.cloud.agent.api.Command; - -public abstract class StorageCommand extends Command { +public abstract class StorageCommand extends StorageNfsVersionCommand { protected StorageCommand() { super(); } + protected StorageCommand(Integer nfsVersion){ + super(nfsVersion); + } + } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/com/cloud/agent/api/storage/StorageNfsVersionCommand.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/agent/api/storage/StorageNfsVersionCommand.java b/core/src/com/cloud/agent/api/storage/StorageNfsVersionCommand.java new file mode 100755 index 0000000..b99713d --- /dev/null +++ b/core/src/com/cloud/agent/api/storage/StorageNfsVersionCommand.java @@ -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; + } + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java ---------------------------------------------------------------------- diff --git a/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java index bfcd9ae..29fdd19 100644 --- a/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java +++ b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java @@ -53,7 +53,7 @@ public class TemplateOrVolumePostUploadCommand { 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, String dataToRole) { @@ -199,11 +199,11 @@ public class TemplateOrVolumePostUploadCommand { return accountId; } - public String getNfsVersion() { + public Integer getNfsVersion() { return nfsVersion; } - public void setNfsVersion(String nfsVersion) { + public void setNfsVersion(Integer nfsVersion) { this.nfsVersion = nfsVersion; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java ---------------------------------------------------------------------- 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 0d96660..8dcc439 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 @@ -638,7 +638,8 @@ public class TemplateServiceImpl implements TemplateService { } 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); Answer answer = null; if (ep == null) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/engine/storage/integration-test/test/org/apache/cloudstack/storage/MockLocalNfsSecondaryStorageResource.java ---------------------------------------------------------------------- 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 5c41dca..f732805 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 class MockLocalNfsSecondaryStorageResource extends NfsSecondaryStorageRes } @Override - public String getRootDir(String secUrl, String nfsVersion) { + public String getRootDir(String secUrl, Integer nfsVersion) { return "/mnt"; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java index 0068c2d..288fae4 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java @@ -79,6 +79,7 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver { VMTemplateZoneDao _vmTemplateZoneDao; @Inject AlertManager _alertMgr; + protected String _proxy = null; protected Proxy getHttpProxy() { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java new file mode 100755 index 0000000..28d9d46 --- /dev/null +++ b/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java @@ -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; + } + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java b/plugins/hypervisors/simulator/src/com/cloud/resource/AgentStorageResource.java index 9b1f091..c77550e 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 class AgentStorageResource extends AgentResourceBase implements Secondary } @Override - public String getRootDir(String url, String nfsVersion) { + public String getRootDir(String url, Integer nfsVersion) { // TODO Auto-generated method stub return null; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java index 4497448..14d75f8 100644 --- a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java +++ b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java @@ -35,7 +35,7 @@ import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; 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 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.VolumeDao; -public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { +public class SimulatorImageStoreDriverImpl extends NfsImageStoreDriverImpl { private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class); @Inject @@ -67,6 +67,7 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { NfsTO nfsTO = new NfsTO(); nfsTO.setRole(store.getRole()); nfsTO.setUrl(nfsStore.getUri()); + nfsTO.setNfsVersion(getNfsVersion(nfsStore.getId())); return nfsTO; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java ---------------------------------------------------------------------- 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 63124e1..da83283 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 @@ -553,7 +553,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override 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"); try { @@ -661,7 +662,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } @Override - public String getMountPoint(String storageUrl, String nfsVersion) { + public String getMountPoint(String storageUrl, Integer nfsVersion) { String mountPoint = null; synchronized (_storageMounts) { 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); if (mountPoint == null) { s_logger.warn("Unable to create a mount point"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java ---------------------------------------------------------------------- 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 c7c53ba..c5c1c43 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 @@ -93,7 +93,7 @@ import com.cloud.vm.snapshot.VMSnapshot; public class VmwareStorageManagerImpl implements VmwareStorageManager { - private String _nfsVersion; + private Integer _nfsVersion; @Override public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) { @@ -141,7 +141,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { _mountService = mountService; } - public VmwareStorageManagerImpl(VmwareStorageMount mountService, String nfsVersion) { + public VmwareStorageManagerImpl(VmwareStorageMount mountService, Integer nfsVersion) { assert (mountService != null); _mountService = mountService; _nfsVersion = nfsVersion; @@ -555,7 +555,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { // 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, String nfsVersion) throws Exception { + String templatePathAtSecondaryStorage, String templateName, String templateUuid, Integer nfsVersion) throws Exception { s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + 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, - String volumePath, String workerVmName, String nfsVersion) throws Exception { + String volumePath, String workerVmName, Integer nfsVersion) throws Exception { String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); 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, - String backedUpSnapshotUuid, String nfsVersion) throws Exception { + String backedUpSnapshotUuid, Integer nfsVersion) throws Exception { String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); 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, - 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); return null; } 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 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, - 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(); 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, - String workerVmName, String nfsVersion) throws Exception { + String workerVmName, Integer nfsVersion) throws Exception { String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion); 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, - 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) + "/"; VirtualMachineMO workerVm = null; @@ -1038,7 +1038,7 @@ public class VmwareStorageManagerImpl implements VmwareStorageManager { 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 { 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 volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java ---------------------------------------------------------------------- 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 54b52f6..fd139e4 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 nfsVersion); + String getMountPoint(String storageUrl, Integer nfsVersion); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java ---------------------------------------------------------------------- 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 a640f3a..238ba3e 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 @@ -97,7 +97,9 @@ import com.vmware.vim25.VirtualMachineRuntimeInfo; import com.vmware.vim25.VirtualMachineVideoCard; import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec; +import org.apache.cloudstack.storage.command.CopyCommand; 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.VolumeObjectTO; import org.apache.commons.lang.math.NumberUtils; @@ -306,6 +308,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa protected String _password; protected String _guid; protected String _vCenterAddress; + protected Integer storageNfsVersion; protected String _privateNetworkVSwitchName; protected VmwareTrafficLabel _guestTrafficInfo = new VmwareTrafficLabel(TrafficType.Guest); @@ -475,6 +478,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } else if (clz == UnregisterVMCommand.class) { return execute((UnregisterVMCommand) cmd); } else if (cmd instanceof StorageSubSystemCommand) { + checkStorageProcessorAndHandlerNfsVersionAttribute((StorageSubSystemCommand)cmd); return storageHandler.handleStorageCommands((StorageSubSystemCommand) cmd); } else if (clz == ScaleVmCommand.class) { return execute((ScaleVmCommand)cmd); @@ -524,6 +528,64 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } /** + * 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. */ private void registerVm(String vmName, DatastoreMO dsMo) throws Exception{ @@ -5311,8 +5373,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa 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, (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); if (!_vrResource.configure(name, params)) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/storage/resource/PremiumSecondaryStorageResource.java ---------------------------------------------------------------------- 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 1ec4958..fd89cc7 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,8 @@ public class PremiumSecondaryStorageResource extends NfsSecondaryStorageResource 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; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java ---------------------------------------------------------------------- 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 3c4e634..9a8c37a 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java @@ -66,7 +66,7 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe * private Map<String, HostMO> _activeHosts = new HashMap<String, HostMO>(); */ - public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, String nfsVersion) { + public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, Integer nfsVersion) { _resource = resource; _storageMgr = new VmwareStorageManagerImpl(this, nfsVersion); _gson = GsonHelper.getGsonLogger(); @@ -304,7 +304,7 @@ public class VmwareSecondaryStorageResourceHandler implements SecondaryStorageRe } @Override - public String getMountPoint(String storageUrl, String nfsVersion) { + public String getMountPoint(String storageUrl, Integer nfsVersion) { return _resource.getRootDir(storageUrl, nfsVersion); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java ---------------------------------------------------------------------- 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 b2766e6..eb18e0b 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -125,10 +125,10 @@ public class VmwareStorageProcessor implements StorageProcessor { protected Integer _shutdownWaitMs; private final Gson _gson; private final StorageLayer _storage = new JavaStorageLayer(); - private String _nfsVersion; + private Integer _nfsVersion; 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; _fullCloneFlag = fullCloneFlag; this.mountService = mountService; @@ -169,7 +169,7 @@ public class VmwareStorageProcessor implements StorageProcessor { } 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: " + 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 volumeName = null; @@ -552,7 +552,7 @@ public class VmwareStorageProcessor implements StorageProcessor { 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 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, - 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 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, - 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 String backupSSUuid; String snapshotFolder; @@ -1066,7 +1066,7 @@ public class VmwareStorageProcessor implements StorageProcessor { // return Pair<String(divice bus name), String[](disk chain)> 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 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)> 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(); 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, - String backupName, long wait, String nfsVersion) throws Exception { + String backupName, long wait, Integer nfsVersion) throws Exception { String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null); String srcOVAFileName = null; @@ -2389,4 +2389,9 @@ public class VmwareStorageProcessor implements StorageProcessor { private String getLegacyVmDataDiskController() throws Exception { return DiskControllerType.lsilogic.toString(); } + + public void setNfsVersion(Integer nfsVersion){ + this._nfsVersion = nfsVersion; + s_logger.debug("VmwareProcessor instance now using NFS version: " + nfsVersion); + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java ---------------------------------------------------------------------- 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 40fa47b..7252f51 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -43,7 +43,7 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class); private VmwareStorageManager storageManager; private PremiumSecondaryStorageResource storageResource; - private String _nfsVersion; + private Integer _nfsVersion; public PremiumSecondaryStorageResource getStorageResource() { return storageResource; @@ -61,11 +61,28 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman this.storageManager = storageManager; } - public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, String nfsVersion) { + public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, Integer nfsVersion) { super(processor); 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 protected Answer execute(CopyCommand cmd) { DataTO srcData = cmd.getSrcTO(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java ---------------------------------------------------------------------- diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java index f554da9..22388a8 100644 --- a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java +++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java @@ -20,17 +20,27 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; 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.never; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import org.apache.cloudstack.storage.command.CopyCommand; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; 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.VirtualMachineConfigSpec; @@ -38,14 +48,26 @@ import com.vmware.vim25.VirtualMachineVideoCard; import com.cloud.agent.api.Command; import com.cloud.agent.api.ScaleVmAnswer; 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.hypervisor.vmware.mo.VirtualMachineMO; import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost; 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 { + @Mock + VmwareStorageProcessor storageProcessor; + @Mock + VmwareStorageSubsystemCommandHandler storageHandler; + @Spy + @InjectMocks VmwareResource _resource = new VmwareResource() { @Override @@ -57,6 +79,7 @@ public class VmwareResourceTest { public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) { return hyperHost; } + }; @Mock @@ -75,12 +98,25 @@ public class VmwareResourceTest { VirtualMachineMO vmMo3dgpu; @Mock 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 public void setup() { MockitoAnnotations.initMocks(this); + storageCmd = PowerMockito.mock(CopyCommand.class); doReturn(context).when(_resource).getServiceContext(null); 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 @@ -117,4 +153,61 @@ public class VmwareResourceTest { 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); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java ---------------------------------------------------------------------- diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java index 05222c8..b8b5226 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java @@ -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.EndPointSelector; 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.store.ImageStoreImpl; @@ -44,7 +44,7 @@ import com.cloud.configuration.Config; import com.cloud.storage.Storage.ImageFormat; 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); @Inject @@ -60,6 +60,7 @@ public class CloudStackImageStoreDriverImpl extends BaseImageStoreDriverImpl { NfsTO nfsTO = new NfsTO(); nfsTO.setRole(store.getRole()); nfsTO.setUrl(nfsStore.getUri()); + nfsTO.setNfsVersion(getNfsVersion(nfsStore.getId())); return nfsTO; } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/server/src/com/cloud/server/StatsCollector.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java index 4204b76..e4687e4 100644 --- a/server/src/com/cloud/server/StatsCollector.java +++ b/server/src/com/cloud/server/StatsCollector.java @@ -770,7 +770,8 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc 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); if (ssAhost == null) { s_logger.debug("There is no secondary storage VM for secondary storage host " + store.getName()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/server/src/com/cloud/storage/ImageStoreDetailsUtil.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java index 63bd5c5..7107650 100755 --- a/server/src/com/cloud/storage/ImageStoreDetailsUtil.java +++ b/server/src/com/cloud/storage/ImageStoreDetailsUtil.java @@ -38,7 +38,7 @@ public class ImageStoreDetailsUtil { * @return {@code null} if {@code nfs.version} is not found for storeId <br/> * {@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; if (imageStoreDetailsDao.getDetails(storeId) != null){ Map<String, String> storeDetails = imageStoreDetailsDao.getDetails(storeId); @@ -46,7 +46,7 @@ public class ImageStoreDetailsUtil { 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/> * {@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); if (imageStore != null){ return getNfsVersion(imageStore.getId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/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 index 026a7d3..4b3ce40 100755 --- a/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java +++ b/server/test/com/cloud/storage/ImageStoreDetailsUtilTest.java @@ -34,7 +34,7 @@ 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"; + private final static Integer NFS_VERSION = 3; ImageStoreDetailsUtil imageStoreDetailsUtil = new ImageStoreDetailsUtil(); @@ -44,7 +44,7 @@ public class ImageStoreDetailsUtilTest { @Before public void setup() throws Exception { 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); ImageStoreVO imgStoreVO = mock(ImageStoreVO.class); @@ -57,7 +57,7 @@ public class ImageStoreDetailsUtilTest { @Test public void testGetNfsVersion(){ - String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); assertEquals(NFS_VERSION, nfsVersion); } @@ -67,7 +67,7 @@ public class ImageStoreDetailsUtilTest { imgStoreDetails.put("other.prop", "propValue"); when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); - String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); assertNull(nfsVersion); } @@ -76,20 +76,20 @@ public class ImageStoreDetailsUtilTest { Map<String, String> imgStoreDetails = new HashMap<String, String>(); when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails); - String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); + Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID); assertNull(nfsVersion); } @Test public void testGetNfsVersionByUuid(){ - String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); + Integer 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); + Integer nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID); assertNull(nfsVersion); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/controller/src/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java ---------------------------------------------------------------------- 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 eeec23d..176c7e9 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 @@ -313,7 +313,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar 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 String postUploadKey = _configDao.getValue(Config.SSVMPSK.key()); @@ -1135,7 +1136,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar if (dc.getDns2() != null) { 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); String bootArgs = buf.toString(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java ---------------------------------------------------------------------- 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 6f189ef..c02fe8a 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,7 +53,7 @@ public class LocalNfsSecondaryStorageResource extends NfsSecondaryStorageResourc } @Override - synchronized public String getRootDir(String secUrl, String nfsVersion) { + synchronized public String getRootDir(String secUrl, Integer nfsVersion) { try { URI uri = new URI(secUrl); String dir = mountUri(uri, nfsVersion); @@ -66,7 +66,7 @@ public class LocalNfsSecondaryStorageResource extends NfsSecondaryStorageResourc } @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); if (mountExists(localRootPath, uri)) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java ---------------------------------------------------------------------- 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 d953338..c6f6ba8 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 class LocalSecondaryStorageResource extends ServerResourceBase implements } @Override - public String getRootDir(String url, String nfsVersion) { + public String getRootDir(String url, Integer nfsVersion) { return getRootDir(); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java ---------------------------------------------------------------------- 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 e7a9076..420842f 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 @@ -205,7 +205,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S private String _storageIp; private String _storageNetmask; private String _storageGateway; - private String _nfsVersion; + private Integer _nfsVersion; private final List<String> nfsIps = new ArrayList<String>(); protected String _parent = "/mnt/SecStorage"; final private String _tmpltpp = "template.properties"; @@ -229,6 +229,26 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S _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 public Answer executeRequest(Command cmd) { if (cmd instanceof DownloadProgressCommand) { @@ -559,7 +579,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S 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; File f = new File(filePath); 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)); } - 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); } @@ -2046,7 +2066,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S } @Override - synchronized public String getRootDir(String secUrl, String nfsVersion) { + synchronized public String getRootDir(String secUrl, Integer nfsVersion) { if (!_inSystemVM) { return _parent; } @@ -2209,7 +2229,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S startAdditionalServices(); _params.put("install.numthreads", "50"); _params.put("secondary.storage.vm", "true"); - _nfsVersion = (String)params.get("nfsVersion"); + _nfsVersion = retrieveNfsVersionFromParams(params); } try { @@ -2385,10 +2405,11 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S * crresponding to the remote device. Will throw for unsupported * scheme. * @param imgStoreId + * @param nfsVersion NFS version to use in mount command * @return name of folder in _parent that device was mounted. * @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 nfsPath = uriHostIp + ":" + uri.getPath(); @@ -2432,7 +2453,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S 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 : "")); ensureLocalRootPathExists(localRootPath, uri); @@ -2448,7 +2469,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S 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; s_logger.debug("Make cmdline call to mount " + remoteDevice + " at " + localRootPath + " based on uri " + uri + ((nfsVersion != null) ? " nfsVersion=" + nfsVersion : "")); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/server/src/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java ---------------------------------------------------------------------- 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 3c24b6c..d7e0c7e 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 @@ import com.cloud.resource.ServerResource; */ public interface SecondaryStorageResource extends ServerResource { - String getRootDir(String cmd, String nfsVersion); + String getRootDir(String cmd, Integer nfsVersion); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2d281997/services/secondary-storage/server/src/org/apache/cloudstack/storage/template/DownloadManagerImpl.java ---------------------------------------------------------------------- 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 affe8a7..40a1e1c 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 @@ -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.DownloadProgressCommand; 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.log4j.Logger; @@ -89,7 +90,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager StorageLayer _storage; public Map<String, Processor> _processors; - private String _nfsVersion; + private Integer _nfsVersion; public class Completion implements DownloadCompleteCallback { private final String jobId; @@ -984,7 +985,7 @@ public class DownloadManagerImpl extends ManagerBase implements DownloadManager 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"); + _nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params); startAdditionalServices(); blockOutgoingOnPrivate(); }