Skip to content

Commit c8b6734

Browse files
committed
add unit tests
1 parent f293806 commit c8b6734

File tree

8 files changed

+446
-47
lines changed

8 files changed

+446
-47
lines changed

engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public interface ConfigurationManager {
6565
"allow.non.rfc1918.compliant.ips", "Advanced", "false",
6666
"Allows non-compliant RFC 1918 IPs for Shared, Isolated networks and VPCs", true, null);
6767

68-
ConfigKey<Float> HostCapacityTypeCpuMemoryWeight = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Float.class, "host.capacityType.to.order.clusters.cputomemoryweight",
68+
ConfigKey<Float> HostCapacityTypeCpuMemoryWeight = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Float.class,
69+
"host.capacityType.to.order.clusters.cputomemoryweight",
6970
"0.5",
7071
"CPU to Memory weight used for COMBINED capacityTye to order cluster and host",
7172
true, ConfigKey.Scope.Global);

engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,5 @@ List<SummedCapacity> listCapacitiesGroupedByLevelAndType(Integer capacityType, L
7070

7171
List<CapacityVO> listPodCapacityByCapacityTypes(Long zoneId, List<Short> capacityTypes);
7272

73-
List<CapacityVO> listClusterCapacityByCapacityTypes(Long zoneId, Long podId, long vmId, List<Short> capacityTypes);
73+
List<CapacityVO> listClusterCapacityByCapacityTypes(Long zoneId, Long podId, List<Short> capacityTypes);
7474
}

engine/schema/src/main/java/com/cloud/capacity/dao/CapacityDaoImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1105,7 +1105,7 @@ public List<CapacityVO> listPodCapacityByCapacityTypes(Long zoneId, List<Short>
11051105
}
11061106

11071107
@Override
1108-
public List<CapacityVO> listClusterCapacityByCapacityTypes(Long zoneId, Long podId, long vmId, List<Short> capacityTypes) {
1108+
public List<CapacityVO> listClusterCapacityByCapacityTypes(Long zoneId, Long podId, List<Short> capacityTypes) {
11091109
SearchBuilder<CapacityVO> sb = createSearchBuilder();
11101110
sb.and("zoneId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
11111111
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);

engine/schema/src/test/java/com/cloud/capacity/dao/CapacityDaoImplTest.java

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import static org.mockito.Mockito.doReturn;
5252
import static org.mockito.Mockito.eq;
5353
import static org.mockito.Mockito.mock;
54+
import static org.mockito.Mockito.never;
5455
import static org.mockito.Mockito.times;
5556
import static org.mockito.Mockito.verify;
5657
import static org.mockito.Mockito.when;
@@ -61,6 +62,9 @@ public class CapacityDaoImplTest {
6162
@InjectMocks
6263
CapacityDaoImpl capacityDao = new CapacityDaoImpl();
6364

65+
@Mock
66+
private CapacityVO mockEntity;
67+
6468
@Mock
6569
private TransactionLegacy txn;
6670
@Mock
@@ -71,6 +75,8 @@ public class CapacityDaoImplTest {
7175

7276
private SearchBuilder<CapacityVO> searchBuilder;
7377
private SearchCriteria<CapacityVO> searchCriteria;
78+
private List<Short> capacityTypes;
79+
private List<CapacityVO> expectedCapacities;
7480

7581
@Before
7682
public void setUp() {
@@ -83,6 +89,17 @@ public void setUp() {
8389

8490
mockedTransactionLegacy = Mockito.mockStatic(TransactionLegacy.class);
8591
mockedTransactionLegacy.when(TransactionLegacy::currentTxn).thenReturn(txn);
92+
93+
// Setup common test data
94+
capacityTypes = Arrays.asList((short) 1, (short) 2, (short) 3);
95+
expectedCapacities = Arrays.asList(mock(CapacityVO.class), mock(CapacityVO.class));
96+
doReturn(expectedCapacities).when(capacityDao).listBy(searchCriteria);
97+
}
98+
99+
private CapacityVO createMockCapacityVO(Long id) {
100+
CapacityVO capacity = mock(CapacityVO.class);
101+
when(capacity.getId()).thenReturn(id);
102+
return capacity;
86103
}
87104

88105
@After
@@ -330,4 +347,207 @@ public void testFindCapacityByEmptyResult() throws Exception {
330347
assertNotNull(result);
331348
assertTrue(result.isEmpty());
332349
}
350+
351+
@Test
352+
public void testListHostCapacityByCapacityTypes_WithAllParameters() {
353+
// Given
354+
Long zoneId = 100L;
355+
Long clusterId = 200L;
356+
357+
// When
358+
List<CapacityVO> result = capacityDao.listHostCapacityByCapacityTypes(zoneId, clusterId, capacityTypes);
359+
360+
// Then
361+
verify(searchBuilder).and("zoneId", mockEntity.getDataCenterId(), SearchCriteria.Op.EQ);
362+
verify(searchBuilder).and("clusterId", mockEntity.getClusterId(), SearchCriteria.Op.EQ);
363+
verify(searchBuilder).and("capacityTypes", mockEntity.getCapacityType(), SearchCriteria.Op.IN);
364+
verify(searchBuilder).and("capacityState", mockEntity.getCapacityState(), SearchCriteria.Op.EQ);
365+
366+
verify(searchCriteria).setParameters("capacityState", "Enabled");
367+
verify(searchCriteria).setParameters("zoneId", zoneId);
368+
verify(searchCriteria).setParameters("clusterId", clusterId);
369+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
370+
371+
verify(capacityDao).listBy(searchCriteria);
372+
assertEquals("Should return expected capacities", expectedCapacities, result);
373+
}
374+
375+
@Test
376+
public void testListHostCapacityByCapacityTypes_WithNullZoneId() {
377+
// Given
378+
Long clusterId = 200L;
379+
380+
// When
381+
List<CapacityVO> result = capacityDao.listHostCapacityByCapacityTypes(null, clusterId, capacityTypes);
382+
383+
// Then
384+
verify(searchCriteria).setParameters("capacityState", "Enabled");
385+
verify(searchCriteria, Mockito.times(0)).setParameters(eq("zoneId"), any());
386+
verify(searchCriteria).setParameters("clusterId", clusterId);
387+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
388+
389+
assertEquals("Should return expected capacities", expectedCapacities, result);
390+
}
391+
392+
@Test
393+
public void testListHostCapacityByCapacityTypes_WithNullClusterId() {
394+
// Given
395+
Long zoneId = 100L;
396+
397+
// When
398+
List<CapacityVO> result = capacityDao.listHostCapacityByCapacityTypes(zoneId, null, capacityTypes);
399+
400+
// Then
401+
verify(searchCriteria).setParameters("capacityState", "Enabled");
402+
verify(searchCriteria).setParameters("zoneId", zoneId);
403+
verify(searchCriteria, never()).setParameters(eq("clusterId"), any());
404+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
405+
406+
assertEquals("Should return expected capacities", expectedCapacities, result);
407+
}
408+
409+
@Test
410+
public void testListHostCapacityByCapacityTypes_WithEmptyCapacityTypes() {
411+
// Given
412+
Long zoneId = 100L;
413+
Long clusterId = 200L;
414+
List<Short> emptyCapacityTypes = Collections.emptyList();
415+
416+
// When
417+
List<CapacityVO> result = capacityDao.listHostCapacityByCapacityTypes(zoneId, clusterId, emptyCapacityTypes);
418+
419+
// Then
420+
verify(searchCriteria).setParameters("capacityTypes", emptyCapacityTypes.toArray());
421+
assertEquals("Should return expected capacities", expectedCapacities, result);
422+
}
423+
424+
@Test
425+
public void testListPodCapacityByCapacityTypes_WithAllParameters() {
426+
// Given
427+
Long zoneId = 100L;
428+
429+
// When
430+
List<CapacityVO> result = capacityDao.listPodCapacityByCapacityTypes(zoneId, capacityTypes);
431+
432+
// Then
433+
verify(searchBuilder).and("zoneId", mockEntity.getDataCenterId(), SearchCriteria.Op.EQ);
434+
verify(searchBuilder).and("capacityTypes", mockEntity.getCapacityType(), SearchCriteria.Op.IN);
435+
verify(searchBuilder).and("capacityState", mockEntity.getCapacityState(), SearchCriteria.Op.EQ);
436+
437+
verify(searchCriteria).setParameters("capacityState", "Enabled");
438+
verify(searchCriteria).setParameters("zoneId", zoneId);
439+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
440+
441+
assertEquals("Should return expected capacities", expectedCapacities, result);
442+
}
443+
444+
@Test
445+
public void testListPodCapacityByCapacityTypes_WithNullZoneId() {
446+
// When
447+
List<CapacityVO> result = capacityDao.listPodCapacityByCapacityTypes(null, capacityTypes);
448+
449+
// Then
450+
verify(searchCriteria).setParameters("capacityState", "Enabled");
451+
verify(searchCriteria, never()).setParameters(eq("zoneId"), any());
452+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
453+
454+
assertEquals("Should return expected capacities", expectedCapacities, result);
455+
}
456+
457+
@Test
458+
public void testListClusterCapacityByCapacityTypes_WithAllParameters() {
459+
// Given
460+
Long zoneId = 100L;
461+
Long podId = 300L;
462+
463+
// When
464+
List<CapacityVO> result = capacityDao.listClusterCapacityByCapacityTypes(zoneId, podId, capacityTypes);
465+
466+
// Then
467+
verify(searchBuilder).and("zoneId", mockEntity.getDataCenterId(), SearchCriteria.Op.EQ);
468+
verify(searchBuilder).and("podId", mockEntity.getPodId(), SearchCriteria.Op.EQ);
469+
verify(searchBuilder).and("capacityTypes", mockEntity.getCapacityType(), SearchCriteria.Op.IN);
470+
verify(searchBuilder).and("capacityState", mockEntity.getCapacityState(), SearchCriteria.Op.EQ);
471+
472+
verify(searchCriteria).setParameters("capacityState", "Enabled");
473+
verify(searchCriteria).setParameters("zoneId", zoneId);
474+
verify(searchCriteria).setParameters("podId", podId);
475+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
476+
477+
assertEquals("Should return expected capacities", expectedCapacities, result);
478+
}
479+
480+
@Test
481+
public void testListClusterCapacityByCapacityTypes_WithNullZoneId() {
482+
// Given
483+
Long podId = 300L;
484+
485+
// When
486+
List<CapacityVO> result = capacityDao.listClusterCapacityByCapacityTypes(null, podId, capacityTypes);
487+
488+
// Then
489+
verify(searchCriteria).setParameters("capacityState", "Enabled");
490+
verify(searchCriteria, never()).setParameters(eq("zoneId"), any());
491+
verify(searchCriteria).setParameters("podId", podId);
492+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
493+
494+
assertEquals("Should return expected capacities", expectedCapacities, result);
495+
}
496+
497+
@Test
498+
public void testListClusterCapacityByCapacityTypes_WithNullPodId() {
499+
// Given
500+
Long zoneId = 100L;
501+
502+
// When
503+
List<CapacityVO> result = capacityDao.listClusterCapacityByCapacityTypes(zoneId, null, capacityTypes);
504+
505+
// Then
506+
verify(searchCriteria).setParameters("capacityState", "Enabled");
507+
verify(searchCriteria).setParameters("zoneId", zoneId);
508+
verify(searchCriteria, never()).setParameters(eq("podId"), any());
509+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
510+
511+
assertEquals("Should return expected capacities", expectedCapacities, result);
512+
}
513+
514+
@Test
515+
public void testListClusterCapacityByCapacityTypes_WithBothIdsNull() {
516+
// When
517+
List<CapacityVO> result = capacityDao.listClusterCapacityByCapacityTypes(null, null, capacityTypes);
518+
519+
// Then
520+
verify(searchCriteria).setParameters("capacityState", "Enabled");
521+
verify(searchCriteria, never()).setParameters(eq("zoneId"), any());
522+
verify(searchCriteria, never()).setParameters(eq("podId"), any());
523+
verify(searchCriteria).setParameters("capacityTypes", capacityTypes.toArray());
524+
525+
assertEquals("Should return expected capacities", expectedCapacities, result);
526+
}
527+
528+
@Test
529+
public void testAllMethods_VerifySearchBuilderSetup() {
530+
// Test that all methods properly set up the search builder
531+
Long zoneId = 100L;
532+
Long clusterId = 200L;
533+
Long podId = 300L;
534+
535+
// Test host capacity method
536+
capacityDao.listHostCapacityByCapacityTypes(zoneId, clusterId, capacityTypes);
537+
538+
// Test pod capacity method
539+
capacityDao.listPodCapacityByCapacityTypes(zoneId, capacityTypes);
540+
541+
// Test cluster capacity method
542+
capacityDao.listClusterCapacityByCapacityTypes(zoneId, podId, capacityTypes);
543+
544+
// Verify createSearchBuilder was called 3 times
545+
verify(capacityDao, times(3)).createSearchBuilder();
546+
547+
// Verify done() was called 3 times
548+
verify(searchBuilder, times(3)).done();
549+
550+
// Verify listBy was called 3 times
551+
verify(capacityDao, times(3)).listBy(searchCriteria);
552+
}
333553
}

server/src/main/java/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.cloud.deploy.DeploymentPlan;
4242
import com.cloud.deploy.DeploymentClusterPlanner;
4343
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
44+
import com.cloud.deploy.FirstFitPlanner;
4445
import com.cloud.gpu.GPU;
4546
import com.cloud.host.DetailVO;
4647
import com.cloud.host.Host;
@@ -66,7 +67,6 @@
6667
import com.cloud.vm.dao.UserVmDetailsDao;
6768
import com.cloud.vm.dao.VMInstanceDao;
6869

69-
import org.apache.cloudstack.api.ApiConstants;
7070
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
7171
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
7272

@@ -408,7 +408,8 @@ private List<? extends Host> reorderHostsByCapacity(DeploymentPlan plan, List<?
408408
private Pair<List<Long>, Map<Long, Double>> getOrderedHostsByCapacity(Long zoneId, Long clusterId) {
409409
double cpuToMemoryWeight = ConfigurationManager.HostCapacityTypeCpuMemoryWeight.value();
410410
// Get capacity by which we should reorder
411-
short capacityType = getCapacityType(cpuToMemoryWeight);
411+
short capacityType = FirstFitPlanner.getHostCapacityTypeToOrderCluster(
412+
_configDao.getValue(Config.HostCapacityTypeToOrderClusters.key()), cpuToMemoryWeight);
412413
if (capacityType >= 0) { // for CPU or RAM
413414
return _capacityDao.orderHostsByFreeCapacity(zoneId, clusterId, capacityType);
414415
}
@@ -418,27 +419,8 @@ private Pair<List<Long>, Map<Long, Double>> getOrderedHostsByCapacity(Long zoneI
418419
return new Pair<>(new ArrayList<>(hostByComputedCapacity.keySet()), hostByComputedCapacity);
419420
}
420421

421-
short getCapacityType(double cpuToMemoryWeight) {
422-
String capacityTypeToOrder = _configDao.getValue(Config.HostCapacityTypeToOrderClusters.key());
423-
short capacityType = CapacityVO.CAPACITY_TYPE_CPU;
424-
if (ApiConstants.RAM.equalsIgnoreCase(capacityTypeToOrder)){
425-
capacityType = CapacityVO.CAPACITY_TYPE_MEMORY;
426-
} else if (ApiConstants.COMBINED_CAPACITY_ORDERING.equalsIgnoreCase(capacityTypeToOrder)) {
427-
capacityType = -1;
428-
}
429-
430-
if (cpuToMemoryWeight == 1) {
431-
capacityType = CapacityVO.CAPACITY_TYPE_CPU;
432-
}
433-
if (cpuToMemoryWeight == 0) {
434-
capacityType = CapacityVO.CAPACITY_TYPE_MEMORY;
435-
}
436-
return capacityType;
437-
}
438-
439-
440422
@NotNull
441-
private static Map<Long, Double> getHostByCombinedCapacities(List<CapacityVO> capacities, double cpuToMemoryWeight) {
423+
public static Map<Long, Double> getHostByCombinedCapacities(List<CapacityVO> capacities, double cpuToMemoryWeight) {
442424
Map<Long, Double> hostByComputedCapacity = new HashMap<>();
443425
for (CapacityVO capacityVO : capacities) {
444426
long hostId = capacityVO.getHostOrPoolId();

0 commit comments

Comments
 (0)