From df628529c80dfe0fb2f78657b8ff96430e98a532 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Mon, 19 Aug 2024 17:46:40 +0530 Subject: [PATCH 1/4] Added update, enable, disable events for the primary storage --- .../main/java/com/cloud/event/EventTypes.java | 2 ++ .../com/cloud/storage/StorageService.java | 4 ++++ .../admin/storage/UpdateStoragePoolCmd.java | 17 +++++++++++++- .../com/cloud/storage/StorageManagerImpl.java | 22 +++++++++---------- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java index d4235cbc9bcb..13b5b1c72f47 100644 --- a/api/src/main/java/com/cloud/event/EventTypes.java +++ b/api/src/main/java/com/cloud/event/EventTypes.java @@ -448,6 +448,7 @@ public class EventTypes { public static final String EVENT_MAINTENANCE_PREPARE_PRIMARY_STORAGE = "MAINT.PREPARE.PS"; // Primary storage pool + public static final String EVENT_UPDATE_PRIMARY_STORAGE = "UPDATE.PS"; public static final String EVENT_ENABLE_PRIMARY_STORAGE = "ENABLE.PS"; public static final String EVENT_DISABLE_PRIMARY_STORAGE = "DISABLE.PS"; public static final String EVENT_SYNC_STORAGE_POOL = "SYNC.STORAGE.POOL"; @@ -1001,6 +1002,7 @@ public class EventTypes { entityEventDetails.put(EVENT_MAINTENANCE_PREPARE_PRIMARY_STORAGE, Host.class); // Primary storage pool + entityEventDetails.put(EVENT_UPDATE_PRIMARY_STORAGE, StoragePool.class); entityEventDetails.put(EVENT_ENABLE_PRIMARY_STORAGE, StoragePool.class); entityEventDetails.put(EVENT_DISABLE_PRIMARY_STORAGE, StoragePool.class); entityEventDetails.put(EVENT_CHANGE_STORAGE_POOL_SCOPE, StoragePool.class); diff --git a/api/src/main/java/com/cloud/storage/StorageService.java b/api/src/main/java/com/cloud/storage/StorageService.java index 1ce335b01153..b8df75cd3e4c 100644 --- a/api/src/main/java/com/cloud/storage/StorageService.java +++ b/api/src/main/java/com/cloud/storage/StorageService.java @@ -95,6 +95,10 @@ public interface StorageService { StoragePool updateStoragePool(UpdateStoragePoolCmd cmd) throws IllegalArgumentException; + StoragePool enablePrimaryStoragePool(Long id); + + StoragePool disablePrimaryStoragePool(Long id); + StoragePool getStoragePool(long id); boolean deleteImageStore(DeleteImageStoreCmd cmd); 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 13f02ef83c28..4745e0f842e3 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 @@ -147,7 +147,22 @@ public void setUrl(String url) { @Override public void execute() { - StoragePool result = _storageService.updateStoragePool(this); + StoragePool result = null; + if (name != null || + (tags != null && !tags.isEmpty()) || + capacityIops != null || + capacityBytes != null || + (details != null && !details.isEmpty()) || + url != null || + isTagARule != null) { + result = _storageService.updateStoragePool(this); + } + + if (enabled != null) { + result = enabled ? _storageService.enablePrimaryStoragePool(id) + : _storageService.disablePrimaryStoragePool(id); + } + if (result != null) { StoragePoolResponse response = _responseGenerator.createStoragePoolResponse(result); response.setResponseName(getCommandName()); diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 102997c09509..64b664fd94c8 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -1127,8 +1127,10 @@ private Map extractApiParamAsMap(Map ds) { return details; } + @Override @ActionEvent(eventType = EventTypes.EVENT_DISABLE_PRIMARY_STORAGE, eventDescription = "disable storage pool") - private void disablePrimaryStoragePool(StoragePoolVO primaryStorage) { + public StoragePool disablePrimaryStoragePool(Long id) { + StoragePoolVO primaryStorage = _storagePoolDao.findById(id); if (!primaryStorage.getStatus().equals(StoragePoolStatus.Up)) { throw new InvalidParameterValueException("Primary storage with id " + primaryStorage.getId() + " cannot be disabled. Storage pool state : " + primaryStorage.getStatus().toString()); } @@ -1137,10 +1139,14 @@ private void disablePrimaryStoragePool(StoragePoolVO primaryStorage) { DataStoreLifeCycle dataStoreLifeCycle = provider.getDataStoreLifeCycle(); DataStore store = _dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary); ((PrimaryDataStoreLifeCycle)dataStoreLifeCycle).disableStoragePool(store); + + return (PrimaryDataStoreInfo)_dataStoreMgr.getDataStore(id, DataStoreRole.Primary); } + @Override @ActionEvent(eventType = EventTypes.EVENT_ENABLE_PRIMARY_STORAGE, eventDescription = "enable storage pool") - private void enablePrimaryStoragePool(StoragePoolVO primaryStorage) { + public StoragePool enablePrimaryStoragePool(Long id) { + StoragePoolVO primaryStorage = _storagePoolDao.findById(id); if (!primaryStorage.getStatus().equals(StoragePoolStatus.Disabled)) { throw new InvalidParameterValueException("Primary storage with id " + primaryStorage.getId() + " cannot be enabled. Storage pool state : " + primaryStorage.getStatus().toString()); } @@ -1149,9 +1155,12 @@ private void enablePrimaryStoragePool(StoragePoolVO primaryStorage) { DataStoreLifeCycle dataStoreLifeCycle = provider.getDataStoreLifeCycle(); DataStore store = _dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary); ((PrimaryDataStoreLifeCycle)dataStoreLifeCycle).enableStoragePool(store); + + return (PrimaryDataStoreInfo)_dataStoreMgr.getDataStore(id, DataStoreRole.Primary); } @Override + @ActionEvent(eventType = EventTypes.EVENT_UPDATE_PRIMARY_STORAGE, eventDescription = "update storage pool") public PrimaryDataStoreInfo updateStoragePool(UpdateStoragePoolCmd cmd) throws IllegalArgumentException { // Input validation Long id = cmd.getId(); @@ -1236,15 +1245,6 @@ public PrimaryDataStoreInfo updateStoragePool(UpdateStoragePoolCmd cmd) throws I } } - Boolean enabled = cmd.getEnabled(); - if (enabled != null) { - if (enabled) { - enablePrimaryStoragePool(pool); - } else { - disablePrimaryStoragePool(pool); - } - } - return (PrimaryDataStoreInfo)_dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary); } From 35dcb154713036d96222d87c8adbb3f1a130e0f1 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Wed, 21 Aug 2024 10:55:56 +0530 Subject: [PATCH 2/4] code refactoring --- .../command/admin/storage/UpdateStoragePoolCmd.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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 4745e0f842e3..70ab272accf2 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 @@ -31,6 +31,9 @@ import com.cloud.storage.StoragePool; import com.cloud.user.Account; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.ObjectUtils; @SuppressWarnings("rawtypes") @APICommand(name = "updateStoragePool", description = "Updates a storage pool.", responseObject = StoragePoolResponse.class, since = "3.0.0", @@ -148,13 +151,9 @@ public void setUrl(String url) { @Override public void execute() { StoragePool result = null; - if (name != null || - (tags != null && !tags.isEmpty()) || - capacityIops != null || - capacityBytes != null || - (details != null && !details.isEmpty()) || - url != null || - isTagARule != null) { + if (ObjectUtils.anyNotNull(name, capacityIops, capacityBytes, url, isTagARule) || + CollectionUtils.isNotEmpty(tags) || + MapUtils.isNotEmpty(details)) { result = _storageService.updateStoragePool(this); } From a923bc3e968c89af15e88b34efe4c364bfd64b16 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Fri, 23 Aug 2024 11:15:54 +0530 Subject: [PATCH 3/4] Allow tags to be empty to remove tags on the primary storage --- .../api/command/admin/storage/UpdateStoragePoolCmd.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 70ab272accf2..f2d7bbeb189e 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 @@ -31,7 +31,6 @@ import com.cloud.storage.StoragePool; import com.cloud.user.Account; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.ObjectUtils; @@ -151,8 +150,7 @@ public void setUrl(String url) { @Override public void execute() { StoragePool result = null; - if (ObjectUtils.anyNotNull(name, capacityIops, capacityBytes, url, isTagARule) || - CollectionUtils.isNotEmpty(tags) || + if (ObjectUtils.anyNotNull(name, capacityIops, capacityBytes, url, isTagARule, tags) || MapUtils.isNotEmpty(details)) { result = _storageService.updateStoragePool(this); } From fe0a3bd759224bd9ae4ede143126e863e94fc2a6 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Wed, 28 Aug 2024 12:22:29 +0530 Subject: [PATCH 4/4] validate pool ID --- .../src/main/java/com/cloud/storage/StorageManagerImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 64b664fd94c8..d5e3c0aea6f6 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -1131,6 +1131,9 @@ private Map extractApiParamAsMap(Map ds) { @ActionEvent(eventType = EventTypes.EVENT_DISABLE_PRIMARY_STORAGE, eventDescription = "disable storage pool") public StoragePool disablePrimaryStoragePool(Long id) { StoragePoolVO primaryStorage = _storagePoolDao.findById(id); + if (primaryStorage == null) { + throw new IllegalArgumentException(String.format("Unable to find storage pool with ID: %d", id)); + } if (!primaryStorage.getStatus().equals(StoragePoolStatus.Up)) { throw new InvalidParameterValueException("Primary storage with id " + primaryStorage.getId() + " cannot be disabled. Storage pool state : " + primaryStorage.getStatus().toString()); } @@ -1147,6 +1150,9 @@ public StoragePool disablePrimaryStoragePool(Long id) { @ActionEvent(eventType = EventTypes.EVENT_ENABLE_PRIMARY_STORAGE, eventDescription = "enable storage pool") public StoragePool enablePrimaryStoragePool(Long id) { StoragePoolVO primaryStorage = _storagePoolDao.findById(id); + if (primaryStorage == null) { + throw new IllegalArgumentException(String.format("Unable to find storage pool with ID: %d", id)); + } if (!primaryStorage.getStatus().equals(StoragePoolStatus.Disabled)) { throw new InvalidParameterValueException("Primary storage with id " + primaryStorage.getId() + " cannot be enabled. Storage pool state : " + primaryStorage.getStatus().toString()); }