Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
f7ea076
New feature: Change storage pool scope
abh1sar Apr 1, 2024
d6aa362
Added checks for Ceph/RBD
abh1sar Apr 2, 2024
5a1e7bd
Update op_host_capacity table on primary storage scope change
abh1sar Apr 2, 2024
5bd6995
Storage pool scope change integration test
abh1sar Apr 3, 2024
c5cbd5d
pull 8875 : Addressed review comments
abh1sar Apr 4, 2024
0fab7a3
Pull 8875: remove storage checks, AbstractPrimayStorageLifeCycleImpl …
abh1sar Apr 6, 2024
283db1f
Pull 8875: Fixed integration test failure
abh1sar Apr 8, 2024
fb976d9
Pull 8875: Review comments
abh1sar Apr 9, 2024
042aef7
Pull 8875: review comments + broke changeStoragePoolScope into smalle…
abh1sar Apr 12, 2024
72160ea
Added UT for changeStoragePoolScope
abh1sar Apr 22, 2024
abf7082
Rename AbstractPrimaryDataStoreLifeCycleImpl to BasePrimaryDataStoreL…
abh1sar Apr 22, 2024
5ba040d
Pull 8875: Dao review comments
abh1sar Apr 22, 2024
ca36119
Pull 8875: Rename changeStoragePoolScope.vue to ChangeStoragePoolScop…
abh1sar Apr 22, 2024
962d0f3
Pull 8875: Created a new smokes test file + A single warning msg in ui
abh1sar Apr 22, 2024
f98b754
Merge with latest 4.19
abh1sar Apr 23, 2024
3753be3
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar Apr 24, 2024
30d628d
Merge branch '4.19' into 419-changescope
abh1sar Apr 24, 2024
aa83ec0
Pull 8875: Added cleanup in test_primary_storage_scope.py
abh1sar Apr 24, 2024
dcb9449
Pull 8875: Type in en.json
abh1sar Apr 24, 2024
8ce579a
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar Apr 24, 2024
bc4e700
Merge branch '4.19' into 419-changescope
abh1sar Apr 24, 2024
d714b8c
Merge remote-tracking branch 'upstream/4.19' into 419
abh1sar Apr 24, 2024
8de7aa6
Pull 8875: cleanup array in test_primary_storage_scope.py
abh1sar Apr 24, 2024
4b07a6c
Merge branch '4.19' into 419-changescope
abh1sar Apr 25, 2024
b3245cd
Pull:8875 Removing extra whitespace at eof of StorageManagerImplTest
abh1sar Apr 25, 2024
f3bdae8
Merge branch '419-changescope' of http://github.com/abh1sar/cloudstac…
abh1sar Apr 25, 2024
9657a10
Pull 8875: Added UT for PrimaryDataStoreHelper and BasePrimaryDataSto…
abh1sar Apr 29, 2024
8d36db0
Pull 8875: Added license header
abh1sar Apr 29, 2024
5ef41e1
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar Apr 29, 2024
aad87f2
Pull 8875: Fixed sql query for vmstates
abh1sar Apr 30, 2024
85a6340
Pull 8875: Changed icon plus info on disabled mode in apidoc
abh1sar May 1, 2024
49341db
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar May 6, 2024
419e5a4
Pull 8875: Change scope should not work for local storage
abh1sar May 6, 2024
d611198
Pull 8875: Change scope completion event
abh1sar May 6, 2024
9da8382
Pull 8875: Added api findAffectedVmsForStorageScopeChange
abh1sar May 19, 2024
8646c80
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar May 19, 2024
35c8b00
Pull 8875: Added UT for findAffectedVmsForStorageScopeChange and remo…
abh1sar May 21, 2024
ba397d7
Pull 8875: Review comments + Vm name in response
abh1sar May 22, 2024
81a2c67
Pull 8875: listByVmsNotInClusterUsingPool was returning duplicate VM …
abh1sar May 22, 2024
c502838
Pull 8875: fixed listAffectedVmsForStorageScopeChange UT
abh1sar May 22, 2024
edea352
Merge remote-tracking branch 'upstream/4.19' into changescope419
abh1sar May 23, 2024
3af24b4
Merge remote-tracking branch 'upstream/4.19' into scope
abh1sar Jun 18, 2024
cc08595
listAffectedVmsForStorageScopeChange should work if the pool is not d…
abh1sar Jun 18, 2024
0b75de1
Fix listAffectedVmsForStorageScopeChangeTest UT
abh1sar Jun 18, 2024
eedb361
Merge branch '4.19' into 419-changescope
abh1sar Jun 18, 2024
e62551b
Merge remote-tracking branch 'upstream/4.19' into cs
abh1sar Jun 19, 2024
57c4a2f
Pull 8875: add volume.removed not null check in VmsNotInClusterUsingP…
abh1sar Jun 19, 2024
271d526
Pull 8875: minor refactoring in changeStoragePoolScopeToCluster
abh1sar Jun 19, 2024
0821cc7
Update server/src/main/java/com/cloud/storage/StorageManagerImpl.java
sureshanaparti Jun 25, 2024
0507508
Merge remote-tracking branch 'upstream/4.19' into cs
abh1sar Jun 26, 2024
afd107b
fix eof
abh1sar Jun 26, 2024
2bdd974
Merge branch '4.19' into 419-changescope
abh1sar Jun 26, 2024
e40c14a
Merge branch '4.19' into 419-changescope
abh1sar Jun 27, 2024
e0cec9e
changeStoragePoolScopeToZone should connect pool to all Up hosts
abh1sar Jun 28, 2024
11b43b2
Merge branch '4.19' into 419-changescope
abh1sar Jun 28, 2024
25c4a01
Merge branch '4.19' into 419-changescope
abh1sar Jun 28, 2024
1b698c1
Merge branch '4.19' into 419-changescope
abh1sar Jun 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Pull 8875: Added UT for findAffectedVmsForStorageScopeChange and remo…
…ved listByPoolIdVMStatesNotInCluster
  • Loading branch information
abh1sar committed May 21, 2024
commit 35c8b00db6d593bf58eb7a0cf2761499ca615d66
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import com.cloud.utils.Pair;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.fsm.StateDao;
import com.cloud.vm.VirtualMachine;

public interface VolumeDao extends GenericDao<VolumeVO, Long>, StateDao<Volume.State, Volume.Event, Volume> {

Expand Down Expand Up @@ -156,6 +155,4 @@ public interface VolumeDao extends GenericDao<VolumeVO, Long>, StateDao<Volume.S
VolumeVO findByPoolIdAndPath(long id, String path);

List<VolumeVO> listByIds(List<Long> ids);

public List<VolumeVO> listByPoolIdVMStatesNotInCluster(long clusterId, List<VirtualMachine.State> states, long poolId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,13 @@
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.cloud.exception.InvalidParameterValueException;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.server.ResourceTag.ResourceObjectType;
import com.cloud.storage.ScopeType;
Expand All @@ -48,17 +45,13 @@
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;

@Component
public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements VolumeDao {
Expand All @@ -79,14 +72,9 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
protected GenericSearchBuilder<VolumeVO, SumCount> primaryStorageSearch2;
protected GenericSearchBuilder<VolumeVO, SumCount> secondaryStorageSearch;
private final SearchBuilder<VolumeVO> poolAndPathSearch;
protected SearchBuilder<VolumeVO> volumePoolNotInClusterSearch;

@Inject
ResourceTagDao tagsDao;
@Inject
HostDao hostDao;
@Inject
VMInstanceDao vmDao;

protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?";
// need to account for zone-wide primary storage where storage_pool has
Expand Down Expand Up @@ -508,19 +496,6 @@ public VolumeDaoImpl() {
poolAndPathSearch.done();
}

@PostConstruct
public void init() {
volumePoolNotInClusterSearch = createSearchBuilder();
volumePoolNotInClusterSearch.and("poolId", volumePoolNotInClusterSearch.entity().getPoolId(), Op.EQ);
SearchBuilder<VMInstanceVO> vmSearch = vmDao.createSearchBuilder();
vmSearch.and("vmStates", vmSearch.entity().getState(), Op.IN);
SearchBuilder<HostVO> hostSearch = hostDao.createSearchBuilder();
hostSearch.and("clusterId", hostSearch.entity().getClusterId(), SearchCriteria.Op.NEQ);
vmSearch.join("hostSearch", hostSearch, hostSearch.entity().getId(), vmSearch.entity().getHostId(), JoinType.INNER);
volumePoolNotInClusterSearch.join("vmSearch", vmSearch, vmSearch.entity().getId(), volumePoolNotInClusterSearch.entity().getInstanceId(), JoinType.INNER);
volumePoolNotInClusterSearch.done();
}

@Override
@DB()
public Pair<Long, Long> getCountAndTotalByPool(long poolId) {
Expand Down Expand Up @@ -866,13 +841,4 @@ public List<VolumeVO> listByIds(List<Long> ids) {
sc.setParameters("idIN", ids.toArray());
return listBy(sc, null);
}

@Override
public List<VolumeVO> listByPoolIdVMStatesNotInCluster(long clusterId, List<VirtualMachine.State> states, long poolId) {
SearchCriteria<VolumeVO> sc = volumePoolNotInClusterSearch.create();
sc.setParameters("poolId", poolId);
sc.setParameters("vmSearch", "vmStates", states);
sc.setJoinParameters("hostSearch", "clusterId", clusterId);
return listBy(sc, null);
}
}
65 changes: 65 additions & 0 deletions server/src/test/java/com/cloud/api/query/QueryManagerImplTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,22 @@
import com.cloud.api.query.dao.TemplateJoinDao;
import com.cloud.api.query.vo.EventJoinVO;
import com.cloud.api.query.vo.TemplateJoinVO;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.event.EventVO;
import com.cloud.event.dao.EventDao;
import com.cloud.event.dao.EventJoinDao;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.VNF;
import com.cloud.network.dao.NetworkVO;
import com.cloud.server.ResourceTag;
import com.cloud.storage.BucketVO;
import com.cloud.storage.ScopeType;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.storage.dao.BucketDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
Expand All @@ -41,20 +47,27 @@
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;

import org.apache.cloudstack.acl.SecurityChecker;
import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.command.admin.storage.ListObjectStoragePoolsCmd;
import org.apache.cloudstack.api.command.admin.vm.FindAffectedVmsForStorageScopeChangeCmd;
import org.apache.cloudstack.api.command.user.bucket.ListBucketsCmd;
import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
import org.apache.cloudstack.api.command.user.resource.ListDetailOptionsCmd;
import org.apache.cloudstack.api.response.DetailOptionsResponse;
import org.apache.cloudstack.api.response.EventResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.cloudstack.api.response.VirtualMachineResponse;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.storage.datastore.db.ObjectStoreDao;
import org.apache.cloudstack.storage.datastore.db.ObjectStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -65,6 +78,7 @@
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.test.util.ReflectionTestUtils;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -112,6 +126,18 @@ public class QueryManagerImplTest {
@Mock
ObjectStoreDao objectStoreDao;

@Mock
VMInstanceDao vmInstanceDao;

@Mock
PrimaryDataStoreDao storagePoolDao;

@Mock
HostDao hostDao;

@Mock
ClusterDao clusterDao;

@Mock
BucketDao bucketDao;

Expand Down Expand Up @@ -352,4 +378,43 @@ public void testSearchForBuckets() {
when(bucketDao.searchAndCount(any(), any())).thenReturn(new Pair<>(buckets, 2));
queryManagerImplSpy.searchForBuckets(listBucketsCmd);
}

@Test
public void testFindAffectedVmsForScopeChange() {
Long clusterId = 1L;
Long poolId = 2L;
Long hostId = 3L;
FindAffectedVmsForStorageScopeChangeCmd cmd = new FindAffectedVmsForStorageScopeChangeCmd();
ReflectionTestUtils.setField(cmd, "clusterIdForScopeChange", clusterId);
ReflectionTestUtils.setField(cmd, "storageId", poolId);

StoragePoolVO pool = Mockito.mock(StoragePoolVO.class);
Mockito.when(pool.getStatus()).thenReturn(StoragePoolStatus.Up);
Mockito.when(pool.getScope()).thenReturn(ScopeType.ZONE);
Mockito.when(storagePoolDao.findById(poolId)).thenReturn(pool);
try {
queryManager.findAffectedVmsForStorageScopeChange(cmd);
Assert.fail();
} catch (InvalidParameterValueException ex) {
Assert.assertEquals(ex.getMessage(), "Scope change of Storage pool is only allowed in Disabled state");
}

VMInstanceVO instance = Mockito.mock(VMInstanceVO.class);
String instanceUuid = String.valueOf(UUID.randomUUID());
Pair<List<VMInstanceVO>, Integer> vms = new Pair<>(List.of(instance), 1);
HostVO host = Mockito.mock(HostVO.class);
ClusterVO cluster = Mockito.mock(ClusterVO.class);

Mockito.when(pool.getStatus()).thenReturn(StoragePoolStatus.Disabled);
Mockito.when(instance.getUuid()).thenReturn(instanceUuid);
Mockito.when(instance.getType()).thenReturn(VirtualMachine.Type.Instance);
Mockito.when(instance.getHostId()).thenReturn(hostId);
Mockito.when(vmInstanceDao.listByVmsNotInClusterUsingPool(clusterId, poolId)).thenReturn(vms);
Mockito.when(hostDao.findById(hostId)).thenReturn(host);
Mockito.when(host.getClusterId()).thenReturn(clusterId);
Mockito.when(clusterDao.findById(clusterId)).thenReturn(cluster);

ListResponse<VirtualMachineResponse> response = queryManager.findAffectedVmsForStorageScopeChange(cmd);
Assert.assertEquals(response.getResponses().get(0).getId(), instanceUuid);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.user.AccountManagerImpl;
import com.cloud.utils.Pair;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.VMInstanceDao;

import org.apache.cloudstack.framework.config.ConfigDepot;
Expand All @@ -50,7 +50,6 @@
import org.springframework.test.util.ReflectionTestUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -323,10 +322,9 @@ public void testChangeStoragePoolScopeToClusterVolumesPresentException() {
final ClusterVO cluster = new ClusterVO();
Mockito.when(clusterDao.findById(1L)).thenReturn(cluster);

List<VolumeVO> volumes = new ArrayList<>();
volumes.add(new VolumeVO());
List<VirtualMachine.State> states = Arrays.asList(VirtualMachine.State.Starting, VirtualMachine.State.Running, VirtualMachine.State.Stopping, VirtualMachine.State.Migrating, VirtualMachine.State.Restoring);
Mockito.when(_volumeDao.listByPoolIdVMStatesNotInCluster(1L, states, 1L)).thenReturn(volumes);
VMInstanceVO instance = Mockito.mock(VMInstanceVO.class);
Pair<List<VMInstanceVO>, Integer> vms = new Pair<>(List.of(instance), 1);
Mockito.when(vmInstanceDao.listByVmsNotInClusterUsingPool(1L, 1L)).thenReturn(vms);

ChangeStoragePoolScopeCmd cmd = mockChangeStoragePooolScopeCmd("CLUSTER");
storageManagerImpl.changeStoragePoolScope(cmd);
Expand Down