diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java index e2035c94b9f5..390e978f34d0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/AddSecondaryStorageCmd.java @@ -30,7 +30,6 @@ import com.cloud.user.Account; import org.apache.commons.collections.MapUtils; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -49,7 +48,7 @@ public class AddSecondaryStorageCmd extends BaseCmd { protected Long zoneId; @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].copytemplatesfromothersecondarystorages=true") - protected Map details; + protected Map> details; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -66,12 +65,8 @@ public Long getZoneId() { public Map getDetails() { Map detailsMap = new HashMap<>(); if (MapUtils.isNotEmpty(details)) { - Collection props = details.values(); - for (Object prop : props) { - HashMap detail = (HashMap) prop; - for (Map.Entry entry: detail.entrySet()) { - detailsMap.put(entry.getKey(),entry.getValue()); - } + for (Map detail : details.values()) { + detailsMap.putAll(detail); } } return detailsMap; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java index 9df253d6db54..5a9d23f3b3ed 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreCmd.java @@ -16,9 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.admin.storage; -import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; @@ -57,7 +55,7 @@ public class AddImageStoreCmd extends BaseCmd { @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "The details for the image store. Example: details[0].key=accesskey&details[0].value=s389ddssaa&details[1].key=secretkey&details[1].value=8dshfsss") - private Map details; + private Map> details; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -78,11 +76,8 @@ public Long getZoneId() { public Map getDetails() { Map detailsMap = null; if (details != null && !details.isEmpty()) { - detailsMap = new HashMap(); - Collection props = details.values(); - Iterator iter = props.iterator(); - while (iter.hasNext()) { - HashMap detail = (HashMap)iter.next(); + detailsMap = new HashMap<>(); + for (Map detail : details.values()) { String key = detail.get("key"); String value = detail.get("value"); detailsMap.put(key, value); @@ -107,7 +102,7 @@ public void setProviderName(String providerName) { this.providerName = providerName; } - public void setDetails(Map details) { + public void setDetails(Map> details) { this.details = details; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreS3CMD.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreS3CMD.java index cdb43e007886..d9684c52deb4 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreS3CMD.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/AddImageStoreS3CMD.java @@ -97,7 +97,7 @@ public final class AddImageStoreS3CMD extends BaseCmd implements ClientOptions { public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { - Map dm = new HashMap(); + Map dm = new HashMap<>(); dm.put(ApiConstants.S3_ACCESS_KEY, getAccessKey()); dm.put(ApiConstants.SECRET_KEY, getSecretKey()); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java index f1f0f28cdd32..a231d45ce990 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/CreateStoragePoolCmd.java @@ -47,7 +47,7 @@ public class CreateStoragePoolCmd extends BaseCmd { private Long clusterId; @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "The details for the storage pool") - private Map details; + private Map> details; @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "The name for the storage pool") private String storagePoolName; @@ -100,7 +100,7 @@ public Long getClusterId() { return clusterId; } - public Map getDetails() { + public Map> getDetails() { return details; } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java index fa55b424eaf3..85e80573b82e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java @@ -68,7 +68,7 @@ public class UpdateStoragePoolCmd extends BaseCmd { required = false, description = "the details for the storage pool", since = "4.19.0") - private Map details; + private Map> details; @Parameter(name = ApiConstants.URL, type = CommandType.STRING, @@ -131,13 +131,10 @@ public ApiCommandResourceType getApiResourceType() { return ApiCommandResourceType.StoragePool; } - public Map getDetails() { + public Map> getDetails() { return details; } - public void setDetails(Map details) { - this.details = details; - } public String getUrl() { return url; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/swift/AddSwiftCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/swift/AddSwiftCmd.java index 2e18a321d095..c322db8581a2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/swift/AddSwiftCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/swift/AddSwiftCmd.java @@ -82,7 +82,7 @@ public long getEntityOwnerId() { @Override public void execute() { - Map dm = new HashMap(); + Map dm = new HashMap<>(); dm.put(ApiConstants.ACCOUNT, getAccount()); dm.put(ApiConstants.USERNAME, getUsername()); dm.put(ApiConstants.KEY, getKey()); diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index d335f37ae583..28742f949f86 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -143,8 +143,8 @@ import org.apache.cloudstack.storage.object.ObjectStore; import org.apache.cloudstack.storage.object.ObjectStoreEntity; import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.BooleanUtils; @@ -670,6 +670,8 @@ protected DataStore createLocalStorage(Map poolInfos) throws Con long capacityBytes = poolInfos.get("capacityBytes") != null ? Long.parseLong(poolInfos.get("capacityBytes").toString()) : 0; + @SuppressWarnings("unchecked") // the local storage configuration is parsed into untyped maps + Map poolDetails = (Map) poolInfos.get("details"); StoragePoolInfo pInfo = new StoragePoolInfo(poolInfos.get("uuid").toString(), host.getPrivateIpAddress(), hostPath, @@ -677,7 +679,7 @@ protected DataStore createLocalStorage(Map poolInfos) throws Con StoragePoolType.Filesystem, capacityBytes, 0, - (Map)poolInfos.get("details"), + poolDetails, poolInfos.get("name").toString()); return createLocalStorage(host, pInfo); @@ -1030,18 +1032,11 @@ protected Map extractUriParamsAsMap(String url) { return uriParams; } - private Map extractApiParamAsMap(Map ds) { + private Map extractApiParamAsMap(Map> ds) { Map details = new HashMap<>(); if (ds != null) { - Collection detailsCollection = ds.values(); - Iterator it = detailsCollection.iterator(); - while (it.hasNext()) { - HashMap d = (HashMap)it.next(); - Iterator it2 = d.entrySet().iterator(); - while (it2.hasNext()) { - Map.Entry entry = (Map.Entry)it2.next(); - details.put((String)entry.getKey(), (String)entry.getValue()); - } + for (Map d : ds.values()) { + details.putAll(d); } } return details; @@ -1421,9 +1416,8 @@ protected void checkIfStorageAccessGroupsExistsOnZone(long zoneId, List String storageAccessGroupsOnZone = zoneVO.getStorageAccessGroups(); List zoneTagsList = parseTags(storageAccessGroupsOnZone); - List newTags = storageAccessGroups; - List existingTagsOnZone = (List) CollectionUtils.intersection(newTags, zoneTagsList); + List existingTagsOnZone = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, zoneTagsList)); if (CollectionUtils.isNotEmpty(existingTagsOnZone)) { throw new CloudRuntimeException(String.format("access groups already exist on the zone: %s", existingTagsOnZone)); @@ -1439,10 +1433,9 @@ protected void checkIfStorageAccessGroupsExistsOnPod(long podId, List st List podTagsList = parseTags(storageAccessGroupsOnPod); List zoneTagsList = parseTags(storageAccessGroupsOnZone); - List newTags = storageAccessGroups; - List existingTagsOnPod = (List) CollectionUtils.intersection(newTags, podTagsList); - List existingTagsOnZone = (List) CollectionUtils.intersection(newTags, zoneTagsList); + List existingTagsOnPod = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, podTagsList)); + List existingTagsOnZone = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, zoneTagsList)); if (CollectionUtils.isNotEmpty(existingTagsOnPod) || CollectionUtils.isNotEmpty(existingTagsOnZone)) { String message = "access groups already exist "; @@ -1473,11 +1466,10 @@ protected void checkIfStorageAccessGroupsExistsOnCluster(long clusterId, List podTagsList = parseTags(storageAccessGroupsOnPod); List zoneTagsList = parseTags(storageAccessGroupsOnZone); List clusterTagsList = parseTags(storageAccessGroupsOnCluster); - List newTags = storageAccessGroups; - List existingTagsOnCluster = (List) CollectionUtils.intersection(newTags, clusterTagsList); - List existingTagsOnPod = (List) CollectionUtils.intersection(newTags, podTagsList); - List existingTagsOnZone = (List) CollectionUtils.intersection(newTags, zoneTagsList); + List existingTagsOnCluster = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, clusterTagsList)); + List existingTagsOnPod = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, podTagsList)); + List existingTagsOnZone = new ArrayList<>(CollectionUtils.intersection(storageAccessGroups, zoneTagsList)); if (CollectionUtils.isNotEmpty(existingTagsOnCluster) || CollectionUtils.isNotEmpty(existingTagsOnPod) || CollectionUtils.isNotEmpty(existingTagsOnZone)) { String message = "access groups already exist "; @@ -1573,14 +1565,14 @@ public void doInTransactionWithoutResult(TransactionStatus status) { @Override public Pair, Boolean> getStoragePoolNFSMountOpts(StoragePool pool, Map details) { boolean details_added = false; - if (!pool.getPoolType().equals(Storage.StoragePoolType.NetworkFilesystem)) { - return new Pair<>(details, details_added); - } - - StoragePoolDetailVO nfsMountOpts = _storagePoolDetailsDao.findDetail(pool.getId(), ApiConstants.NFS_MOUNT_OPTIONS); - if (nfsMountOpts != null) { - if (details == null) { - details = new HashMap<>(); + if (pool.getPoolType().equals(Storage.StoragePoolType.NetworkFilesystem)) { + StoragePoolDetailVO nfsMountOpts = _storagePoolDetailsDao.findDetail(pool.getId(), ApiConstants.NFS_MOUNT_OPTIONS); + if (nfsMountOpts != null) { + if (details == null) { + details = new HashMap<>(); + } + details.put(ApiConstants.NFS_MOUNT_OPTIONS, nfsMountOpts.getValue()); + details_added = true; } details.put(ApiConstants.NFS_MOUNT_OPTIONS, nfsMountOpts.getValue()); details_added = true; @@ -4483,7 +4475,7 @@ private void setVolumeObjectTOThrottling(VolumeObjectTO volumeTO, final ServiceO @Override @ActionEvent(eventType = EventTypes.EVENT_OBJECT_STORE_CREATE, eventDescription = "creating object storage") - public ObjectStore discoverObjectStore(String name, String url, Long size, String providerName, Map details) + public ObjectStore discoverObjectStore(String name, String url, Long size, String providerName, Map details) throws IllegalArgumentException, InvalidParameterValueException { DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName);