|
31 | 31 | import com.cloud.resource.ResourceManager; |
32 | 32 | import com.cloud.storage.dao.StoragePoolAndAccessGroupMapDao; |
33 | 33 | import org.apache.cloudstack.api.ApiConstants; |
| 34 | +import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; |
34 | 35 | import org.apache.cloudstack.api.command.admin.storage.ChangeStoragePoolScopeCmd; |
35 | 36 | import org.apache.cloudstack.api.command.admin.storage.ConfigureStorageAccessCmd; |
36 | 37 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; |
37 | 38 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle; |
38 | 39 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; |
39 | 40 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider; |
40 | 41 | import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; |
| 42 | +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore; |
41 | 43 | import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; |
| 44 | +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle; |
42 | 45 | import org.apache.cloudstack.framework.config.ConfigDepot; |
43 | 46 | import org.apache.cloudstack.framework.config.ConfigKey; |
44 | 47 | import org.apache.cloudstack.framework.config.dao.ConfigurationDao; |
@@ -1727,4 +1730,73 @@ public void checkUsagedSpaceReturnsFalseForZeroCapacityPool() { |
1727 | 1730 |
|
1728 | 1731 | Assert.assertFalse(result); |
1729 | 1732 | } |
| 1733 | + |
| 1734 | + @Test |
| 1735 | + public void recordStatusBeforeMaintenanceStoresDisabledStatus() { |
| 1736 | + Mockito.when(storagePoolVOMock.getId()).thenReturn(1L); |
| 1737 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.Disabled); |
| 1738 | + |
| 1739 | + storageManagerImpl.recordStatusBeforeMaintenance(storagePoolVOMock); |
| 1740 | + |
| 1741 | + Mockito.verify(storagePoolDetailsDao).addDetail(1L, PrimaryDataStoreLifeCycle.STATUS_BEFORE_MAINTENANCE, StoragePoolStatus.Disabled.name(), false); |
| 1742 | + } |
| 1743 | + |
| 1744 | + @Test |
| 1745 | + public void recordStatusBeforeMaintenanceClearsStaleStatusForUpPool() { |
| 1746 | + Mockito.when(storagePoolVOMock.getId()).thenReturn(1L); |
| 1747 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.Up); |
| 1748 | + |
| 1749 | + storageManagerImpl.recordStatusBeforeMaintenance(storagePoolVOMock); |
| 1750 | + |
| 1751 | + Mockito.verify(storagePoolDetailsDao).removeDetail(1L, PrimaryDataStoreLifeCycle.STATUS_BEFORE_MAINTENANCE); |
| 1752 | + Mockito.verify(storagePoolDetailsDao, Mockito.never()).addDetail(Mockito.anyLong(), Mockito.anyString(), Mockito.anyString(), Mockito.anyBoolean()); |
| 1753 | + } |
| 1754 | + |
| 1755 | + @Test |
| 1756 | + public void recordStatusBeforeMaintenanceKeepsRecordedStatusOnRetry() { |
| 1757 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.ErrorInMaintenance); |
| 1758 | + |
| 1759 | + storageManagerImpl.recordStatusBeforeMaintenance(storagePoolVOMock); |
| 1760 | + |
| 1761 | + Mockito.verifyNoInteractions(storagePoolDetailsDao); |
| 1762 | + } |
| 1763 | + |
| 1764 | + @Test |
| 1765 | + public void preparePrimaryStorageForMaintenanceAllowsDisabledPool() throws Exception { |
| 1766 | + DataStoreProvider provider = Mockito.mock(DataStoreProvider.class); |
| 1767 | + DataStoreLifeCycle lifeCycle = Mockito.mock(DataStoreLifeCycle.class); |
| 1768 | + PrimaryDataStore store = Mockito.mock(PrimaryDataStore.class); |
| 1769 | + Mockito.when(storagePoolDao.findById(1L)).thenReturn(storagePoolVOMock); |
| 1770 | + Mockito.when(storagePoolVOMock.getId()).thenReturn(1L); |
| 1771 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.Disabled); |
| 1772 | + Mockito.when(storagePoolVOMock.getStorageProviderName()).thenReturn("DefaultPrimary"); |
| 1773 | + Mockito.when(dataStoreProviderMgr.getDataStoreProvider("DefaultPrimary")).thenReturn(provider); |
| 1774 | + Mockito.when(provider.getDataStoreLifeCycle()).thenReturn(lifeCycle); |
| 1775 | + Mockito.when(dataStoreMgr.getDataStore(1L, DataStoreRole.Primary)).thenReturn(store); |
| 1776 | + |
| 1777 | + storageManagerImpl.preparePrimaryStorageForMaintenance(1L); |
| 1778 | + |
| 1779 | + Mockito.verify(storagePoolDetailsDao).addDetail(1L, PrimaryDataStoreLifeCycle.STATUS_BEFORE_MAINTENANCE, StoragePoolStatus.Disabled.name(), false); |
| 1780 | + Mockito.verify(lifeCycle).maintain(store); |
| 1781 | + } |
| 1782 | + |
| 1783 | + @Test |
| 1784 | + public void preparePrimaryStorageForMaintenanceRejectsPoolAlreadyInMaintenance() { |
| 1785 | + Mockito.when(storagePoolDao.findById(1L)).thenReturn(storagePoolVOMock); |
| 1786 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.Maintenance); |
| 1787 | + |
| 1788 | + assertThrows(InvalidParameterValueException.class, () -> storageManagerImpl.preparePrimaryStorageForMaintenance(1L)); |
| 1789 | + Mockito.verifyNoInteractions(storagePoolDetailsDao); |
| 1790 | + } |
| 1791 | + |
| 1792 | + @Test |
| 1793 | + public void cancelPrimaryStorageForMaintenanceRejectsDisabledPool() { |
| 1794 | + CancelPrimaryStorageMaintenanceCmd cmd = Mockito.mock(CancelPrimaryStorageMaintenanceCmd.class); |
| 1795 | + Mockito.when(cmd.getId()).thenReturn(1L); |
| 1796 | + Mockito.when(storagePoolDao.findById(1L)).thenReturn(storagePoolVOMock); |
| 1797 | + Mockito.when(storagePoolVOMock.getStatus()).thenReturn(StoragePoolStatus.Disabled); |
| 1798 | + |
| 1799 | + assertThrows(StorageUnavailableException.class, () -> storageManagerImpl.cancelPrimaryStorageForMaintenance(cmd)); |
| 1800 | + Mockito.verifyNoInteractions(dataStoreProviderMgr); |
| 1801 | + } |
1730 | 1802 | } |
0 commit comments