From 6adf4d336d3f07c4e25d57ff76d64f605366ff1b Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 16 Apr 2025 16:23:17 +0530 Subject: [PATCH 1/4] Return details of the storage pool in the response including url, and update capacityBytes and capacityIops if applicable while creating storage pool --- .../api/response/StoragePoolResponse.java | 12 ++++ .../cloud/upgrade/DatabaseUpgradeChecker.java | 2 + .../upgrade/dao/Upgrade41920to41930.java | 66 +++++++++++++++++++ .../datastore/db/PrimaryDataStoreDaoImpl.java | 6 +- .../db/schema-41920to41930-cleanup.sql | 20 ++++++ .../META-INF/db/schema-41920to41930.sql | 23 +++++++ ...oudStackPrimaryDataStoreLifeCycleImpl.java | 21 +++++- .../api/query/dao/StoragePoolJoinDaoImpl.java | 3 + .../com/cloud/storage/StorageManagerImpl.java | 3 + 9 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41920to41930.java create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-41920to41930-cleanup.sql create mode 100644 engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql diff --git a/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java index 06d5103d7319..6cadb0be5643 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java @@ -145,6 +145,10 @@ public class StoragePoolResponse extends BaseResponseWithAnnotations { @Param(description = "whether this pool is managed or not") private Boolean managed; + @SerializedName(ApiConstants.DETAILS) + @Param(description = "additional key/value details of the storage pool", since = "4.19.3") + private Map details; + public Map getCaps() { return caps; } @@ -395,4 +399,12 @@ public Boolean getManaged() { public void setManaged(Boolean managed) { this.managed = managed; } + + public Map getDetails() { + return details; + } + + public void setDetails(Map details) { + this.details = details; + } } diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java index aecf4cc05908..1ffef0b251b6 100644 --- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -34,6 +34,7 @@ import javax.inject.Inject; import com.cloud.upgrade.dao.Upgrade41910to41920; +import com.cloud.upgrade.dao.Upgrade41920to41930; import com.cloud.utils.FileUtil; import org.apache.cloudstack.utils.CloudStackVersion; import org.apache.commons.lang3.StringUtils; @@ -229,6 +230,7 @@ public DatabaseUpgradeChecker() { .next("4.18.1.0", new Upgrade41810to41900()) .next("4.19.0.0", new Upgrade41900to41910()) .next("4.19.1.0", new Upgrade41910to41920()) + .next("4.19.2.0", new Upgrade41920to41930()) .build(); } diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41920to41930.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41920to41930.java new file mode 100644 index 000000000000..66b15d7a5306 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41920to41930.java @@ -0,0 +1,66 @@ +// 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.upgrade.dao; + +import com.cloud.utils.exception.CloudRuntimeException; + +import java.io.InputStream; +import java.sql.Connection; + +public class Upgrade41920to41930 implements DbUpgrade { + + @Override + public String[] getUpgradableVersionRange() { + return new String[]{"4.19.2.0", "4.19.3.0"}; + } + + @Override + public String getUpgradedVersion() { + return "4.19.3.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-41920to41930.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[]{script}; + } + + @Override + public void performDataMigration(Connection conn) { + } + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-41920to41930-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[]{script}; + } +} diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index 9b03bfe29a7a..a5f80a3588f8 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -303,7 +303,11 @@ public StoragePoolVO persist(StoragePoolVO pool, Map details, Li pool = super.persist(pool); if (details != null) { for (Map.Entry detail : details.entrySet()) { - StoragePoolDetailVO vo = new StoragePoolDetailVO(pool.getId(), detail.getKey(), detail.getValue(), true); + boolean display = true; + if (detail.getKey().toLowerCase().contains("password")) { + display = false; + } + StoragePoolDetailVO vo = new StoragePoolDetailVO(pool.getId(), detail.getKey(), detail.getValue(), display); _detailsDao.persist(vo); } } diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41920to41930-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930-cleanup.sql new file mode 100644 index 000000000000..8988e78a294f --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930-cleanup.sql @@ -0,0 +1,20 @@ +-- 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. + +--; +-- Schema upgrade cleanup from 4.19.2.0 to 4.19.3.0 +--; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql new file mode 100644 index 000000000000..3371699a3e37 --- /dev/null +++ b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql @@ -0,0 +1,23 @@ +-- 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. + +--; +-- Schema upgrade from 4.19.2.0 to 4.19.3.0 +--; + +-- Updated display to false for password detail of the storage pool details +UPDATE `cloud`.`storage_pool_details` SET display = 0 WHERE name LIKE '%password%'; diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index 4d6fc09dc572..14045487bd3a 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -134,17 +134,32 @@ public DataStore initialize(Map dsInfos) { PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters(); - String tags = (String)dsInfos.get("tags"); + if (dsInfos.get("capacityBytes") != null) { + Long capacityBytes = (Long)dsInfos.get("capacityBytes"); + if (capacityBytes <= 0) { + throw new IllegalArgumentException("'capacityBytes' must be greater than 0."); + } + parameters.setCapacityBytes(capacityBytes); + } + + if (dsInfos.get("capacityIops") != null) { + Long capacityIops = (Long)dsInfos.get("capacityIops"); + if (capacityIops <= 0) { + throw new IllegalArgumentException("'capacityIops' must be greater than 0."); + } + parameters.setCapacityIops(capacityIops); + } + Map details = (Map)dsInfos.get("details"); + parameters.setDetails(details); + String tags = (String)dsInfos.get("tags"); parameters.setTags(tags); parameters.setIsTagARule((Boolean)dsInfos.get("isTagARule")); - parameters.setDetails(details); String scheme = dsInfos.get("scheme").toString(); String storageHost = dsInfos.get("host").toString(); String hostPath = dsInfos.get("hostPath").toString(); - String uri = String.format("%s://%s%s", scheme, storageHost, hostPath); Object localStorage = dsInfos.get("localStorage"); if (localStorage != null) { diff --git a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java index 186e121b62c4..336003ce9f6e 100644 --- a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java @@ -19,6 +19,7 @@ import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.StoragePoolJoinVO; import com.cloud.capacity.CapacityManager; +import com.cloud.server.ResourceTag; import com.cloud.storage.DataStoreRole; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage; @@ -172,6 +173,8 @@ public StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO pool, boolea poolResponse.setIsTagARule(pool.getIsTagARule()); poolResponse.setOverProvisionFactor(Double.toString(CapacityManager.StorageOverprovisioningFactor.valueIn(pool.getId()))); poolResponse.setManaged(storagePool.isManaged()); + Map details = ApiDBUtils.getResourceDetails(pool.getId(), ResourceTag.ResourceObjectType.Storage); + poolResponse.setDetails(details); // set async job if (pool.getJobId() != null) { diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index fbe332c6fdfd..99649173bd4c 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -992,6 +992,9 @@ public PrimaryDataStoreInfo createPool(CreateStoragePoolCmd cmd) throws Resource Map details = extractApiParamAsMap(cmd.getDetails()); checkNFSMountOptionsForCreate(details, hypervisorType, uriParams.get("scheme")); + if (StringUtils.isNotBlank(cmd.getUrl())) { + details.put("url", cmd.getUrl()); + } DataCenterVO zone = _dcDao.findById(cmd.getZoneId()); if (zone == null) { From 333a395722eb4fad1552462ef08835556c7a664c Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 16 Apr 2025 17:31:49 +0530 Subject: [PATCH 2/4] Added capacitybytes parameter to the storage pool response in sync with the capacityiops response parameter and createStoragePool cmd request parameter (existing disksizetotal parameter in the storage pool response can be deprecated) --- .../api/response/StoragePoolResponse.java | 19 ++++++++++++++++--- .../api/query/dao/StoragePoolJoinDaoImpl.java | 2 ++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java index 6cadb0be5643..7025d2207f62 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/StoragePoolResponse.java @@ -77,19 +77,24 @@ public class StoragePoolResponse extends BaseResponseWithAnnotations { @Param(description = "the name of the cluster for the storage pool") private String clusterName; + @SerializedName(ApiConstants.CAPACITY_BYTES) + @Param(description = "bytes CloudStack can provision from this storage pool", since = "4.19.3") + private Long capacityBytes; + + @Deprecated(since = "4.19.3") @SerializedName("disksizetotal") @Param(description = "the total disk size of the storage pool") private Long diskSizeTotal; @SerializedName("disksizeallocated") - @Param(description = "the host's currently allocated disk size") + @Param(description = "the pool's currently allocated disk size") private Long diskSizeAllocated; @SerializedName("disksizeused") - @Param(description = "the host's currently used disk size") + @Param(description = "the pool's currently used disk size") private Long diskSizeUsed; - @SerializedName("capacityiops") + @SerializedName(ApiConstants.CAPACITY_IOPS) @Param(description = "IOPS CloudStack can provision from this storage pool") private Long capacityIops; @@ -280,6 +285,14 @@ public void setClusterName(String clusterName) { this.clusterName = clusterName; } + public Long getCapacityBytes() { + return capacityBytes; + } + + public void setCapacityBytes(Long capacityBytes) { + this.capacityBytes = capacityBytes; + } + public Long getDiskSizeTotal() { return diskSizeTotal; } diff --git a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java index 336003ce9f6e..78bb57f4a8ce 100644 --- a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java @@ -141,6 +141,7 @@ public StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO pool, boolea } } } + poolResponse.setCapacityBytes(pool.getCapacityBytes()); poolResponse.setDiskSizeTotal(pool.getCapacityBytes()); poolResponse.setDiskSizeAllocated(allocatedSize); poolResponse.setCapacityIops(pool.getCapacityIops()); @@ -231,6 +232,7 @@ public StoragePoolResponse newStoragePoolForMigrationResponse(StoragePoolJoinVO } long allocatedSize = pool.getUsedCapacity(); + poolResponse.setCapacityBytes(pool.getCapacityBytes()); poolResponse.setDiskSizeTotal(pool.getCapacityBytes()); poolResponse.setDiskSizeAllocated(allocatedSize); poolResponse.setCapacityIops(pool.getCapacityIops()); From d676cef285b56f48707bacdf16bad1a3d0844cf7 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Wed, 16 Apr 2025 20:14:42 +0530 Subject: [PATCH 3/4] Don't keep url in details --- .../storage/datastore/db/PrimaryDataStoreDaoImpl.java | 2 +- .../src/main/resources/META-INF/db/schema-41920to41930.sql | 3 ++- .../storage/volume/datastore/PrimaryDataStoreHelper.java | 3 +-- .../lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java | 1 - server/src/main/java/com/cloud/storage/StorageManagerImpl.java | 3 --- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index a5f80a3588f8..cdd0f3ff2781 100644 --- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -304,7 +304,7 @@ public StoragePoolVO persist(StoragePoolVO pool, Map details, Li if (details != null) { for (Map.Entry detail : details.entrySet()) { boolean display = true; - if (detail.getKey().toLowerCase().contains("password")) { + if (detail.getKey().toLowerCase().contains("password") || detail.getKey().toLowerCase().contains("token")) { display = false; } StoragePoolDetailVO vo = new StoragePoolDetailVO(pool.getId(), detail.getKey(), detail.getValue(), display); diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql index 3371699a3e37..81d212cc4b5c 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41920to41930.sql @@ -19,5 +19,6 @@ -- Schema upgrade from 4.19.2.0 to 4.19.3.0 --; --- Updated display to false for password detail of the storage pool details +-- Updated display to false for password/token detail of the storage pool details UPDATE `cloud`.`storage_pool_details` SET display = 0 WHERE name LIKE '%password%'; +UPDATE `cloud`.`storage_pool_details` SET display = 0 WHERE name LIKE '%token%'; diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java index 216d6042f364..12ded005c19d 100644 --- a/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java +++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java @@ -75,8 +75,7 @@ public class PrimaryDataStoreHelper { private AnnotationDao annotationDao; public DataStore createPrimaryDataStore(PrimaryDataStoreParameters params) { - if(params == null) - { + if (params == null) { throw new InvalidParameterValueException("createPrimaryDataStore: Input params is null, please check"); } StoragePoolVO dataStoreVO = dataStoreDao.findPoolByUUID(params.getUuid()); diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index 14045487bd3a..9d62b88959df 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -125,7 +125,6 @@ public DataStore initialize(Map dsInfos) { Long clusterId = (Long)dsInfos.get("clusterId"); Long podId = (Long)dsInfos.get("podId"); Long zoneId = (Long)dsInfos.get("zoneId"); - String url = (String)dsInfos.get("url"); String providerName = (String)dsInfos.get("providerName"); HypervisorType hypervisorType = (HypervisorType)dsInfos.get("hypervisorType"); if (clusterId != null && podId == null) { diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 99649173bd4c..fbe332c6fdfd 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -992,9 +992,6 @@ public PrimaryDataStoreInfo createPool(CreateStoragePoolCmd cmd) throws Resource Map details = extractApiParamAsMap(cmd.getDetails()); checkNFSMountOptionsForCreate(details, hypervisorType, uriParams.get("scheme")); - if (StringUtils.isNotBlank(cmd.getUrl())) { - details.put("url", cmd.getUrl()); - } DataCenterVO zone = _dcDao.findById(cmd.getZoneId()); if (zone == null) { From f150493afaf306a92902cb19be4dc2435a207840 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Thu, 17 Apr 2025 01:02:19 +0530 Subject: [PATCH 4/4] Persist the capacityBytes and capacityIops in the storage_pool_details table while creating storage pool as well, for consistency - as these are updated with during update storage pool --- .../api/storage/PrimaryDataStoreLifeCycle.java | 4 ++-- .../CloudStackPrimaryDataStoreLifeCycleImpl.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java index 54f3c63f8d73..1acaccf09df4 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java @@ -24,8 +24,8 @@ import com.cloud.storage.StoragePool; public interface PrimaryDataStoreLifeCycle extends DataStoreLifeCycle { - public static final String CAPACITY_BYTES = "capacityBytes"; - public static final String CAPACITY_IOPS = "capacityIops"; + String CAPACITY_BYTES = "capacityBytes"; + String CAPACITY_IOPS = "capacityIops"; void updateStoragePool(StoragePool storagePool, Map details); void enableStoragePool(DataStore store); diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index 9d62b88959df..697c5a9209eb 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -68,6 +68,7 @@ import javax.inject.Inject; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -133,11 +134,17 @@ public DataStore initialize(Map dsInfos) { PrimaryDataStoreParameters parameters = new PrimaryDataStoreParameters(); + Map details = (Map)dsInfos.get("details"); + if (dsInfos.get("capacityBytes") != null) { Long capacityBytes = (Long)dsInfos.get("capacityBytes"); if (capacityBytes <= 0) { throw new IllegalArgumentException("'capacityBytes' must be greater than 0."); } + if (details == null) { + details = new HashMap<>(); + } + details.put(PrimaryDataStoreLifeCycle.CAPACITY_BYTES, String.valueOf(capacityBytes)); parameters.setCapacityBytes(capacityBytes); } @@ -146,10 +153,13 @@ public DataStore initialize(Map dsInfos) { if (capacityIops <= 0) { throw new IllegalArgumentException("'capacityIops' must be greater than 0."); } + if (details == null) { + details = new HashMap<>(); + } + details.put(PrimaryDataStoreLifeCycle.CAPACITY_IOPS, String.valueOf(capacityIops)); parameters.setCapacityIops(capacityIops); } - Map details = (Map)dsInfos.get("details"); parameters.setDetails(details); String tags = (String)dsInfos.get("tags");