blob: ad37ef38830598efcc0e422652e193ca668e3748 [file] [log] [blame]
// 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.host.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import com.cloud.cpu.CPU;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.resource.ResourceState;
import com.cloud.utils.Pair;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
@RunWith(MockitoJUnitRunner.class)
public class HostDaoImplTest {
@Spy
HostDaoImpl hostDao = new HostDaoImpl();
@Mock
private SearchBuilder<HostVO> mockSearchBuilder;
@Mock
private SearchCriteria<HostVO> mockSearchCriteria;
@Test
public void testCountUpAndEnabledHostsInZone() {
long testZoneId = 100L;
hostDao.HostTypeCountSearch = mockSearchBuilder;
when(mockSearchBuilder.create()).thenReturn(mockSearchCriteria);
Mockito.doNothing().when(mockSearchCriteria).setParameters(Mockito.anyString(), any());
int expected = 5;
doReturn(expected).when(hostDao).getCount(mockSearchCriteria);
Integer count = hostDao.countUpAndEnabledHostsInZone(testZoneId);
Assert.assertSame(expected, count);
Mockito.verify(mockSearchCriteria).setParameters("type", Host.Type.Routing);
Mockito.verify(mockSearchCriteria).setParameters("resourceState", ResourceState.Enabled);
Mockito.verify(mockSearchCriteria).setParameters("zoneId", testZoneId);
Mockito.verify(hostDao).getCount(mockSearchCriteria);
}
@Test
public void testCountAllHostsAndCPUSocketsByType() {
Host.Type type = Host.Type.Routing;
GenericDaoBase.SumCount mockSumCount = new GenericDaoBase.SumCount();
mockSumCount.count = 10;
mockSumCount.sum = 20;
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, GenericDaoBase.SumCount> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
doReturn(sb).when(hostDao).createSearchBuilder(GenericDaoBase.SumCount.class);
SearchCriteria<GenericDaoBase.SumCount> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
doReturn(List.of(mockSumCount)).when(hostDao).customSearch(any(SearchCriteria.class), any());
Pair<Integer, Integer> result = hostDao.countAllHostsAndCPUSocketsByType(type);
assertEquals(10, result.first().intValue());
assertEquals(20, result.second().intValue());
Mockito.verify(sc).setParameters("type", type);
}
@Test
public void testIsHostUp() {
long testHostId = 101L;
List<Status> statuses = List.of(Status.Up);
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, Status> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
SearchCriteria<Status> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
doReturn(sb).when(hostDao).createSearchBuilder(Status.class);
doReturn(statuses).when(hostDao).customSearch(any(SearchCriteria.class), any());
boolean result = hostDao.isHostUp(testHostId);
Assert.assertTrue("Host should be up", result);
Mockito.verify(sc).setParameters("id", testHostId);
Mockito.verify(hostDao).customSearch(sc, null);
}
@Test
public void testFindHostIdsByZoneClusterResourceStateTypeAndHypervisorType() {
Long zoneId = 1L;
Long clusterId = 2L;
List<ResourceState> resourceStates = List.of(ResourceState.Enabled);
List<Host.Type> types = List.of(Host.Type.Routing);
List<Hypervisor.HypervisorType> hypervisorTypes = List.of(Hypervisor.HypervisorType.KVM);
List<Long> mockResults = List.of(1001L, 1002L); // Mocked result
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, Long> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
SearchCriteria<Long> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
when(sb.and()).thenReturn(sb);
doReturn(sb).when(hostDao).createSearchBuilder(Long.class);
doReturn(mockResults).when(hostDao).customSearch(any(SearchCriteria.class), any());
List<Long> hostIds = hostDao.findHostIdsByZoneClusterResourceStateTypeAndHypervisorType(
zoneId, clusterId, resourceStates, types, hypervisorTypes);
assertEquals(mockResults, hostIds);
Mockito.verify(sc).setParameters("zoneId", zoneId);
Mockito.verify(sc).setParameters("clusterId", clusterId);
Mockito.verify(sc).setParameters("resourceState", resourceStates.toArray());
Mockito.verify(sc).setParameters("type", types.toArray());
Mockito.verify(sc).setParameters("hypervisorTypes", hypervisorTypes.toArray());
}
@Test
public void testListDistinctHypervisorTypes() {
Long zoneId = 1L;
List<Hypervisor.HypervisorType> mockResults = List.of(Hypervisor.HypervisorType.KVM, Hypervisor.HypervisorType.XenServer);
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, String> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
SearchCriteria<String> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
doReturn(sb).when(hostDao).createSearchBuilder(String.class);
doReturn(mockResults.stream().map(h -> h.name()).collect(Collectors.toList())).when(hostDao)
.customSearch(any(SearchCriteria.class), any());
List<Hypervisor.HypervisorType> hypervisorTypes = hostDao.listDistinctHypervisorTypes(zoneId);
assertEquals(mockResults, hypervisorTypes);
Mockito.verify(sc).setParameters("zoneId", zoneId);
Mockito.verify(sc).setParameters("type", Host.Type.Routing);
}
@Test
public void testListByIds() {
List<Long> ids = List.of(101L, 102L);
List<HostVO> mockResults = List.of(mock(HostVO.class), mock(HostVO.class));
hostDao.IdsSearch = mockSearchBuilder;
when(mockSearchBuilder.create()).thenReturn(mockSearchCriteria);
doReturn(mockResults).when(hostDao).search(any(SearchCriteria.class), any());
List<HostVO> hosts = hostDao.listByIds(ids);
assertEquals(mockResults, hosts);
Mockito.verify(mockSearchCriteria).setParameters("id", ids.toArray());
Mockito.verify(hostDao).search(mockSearchCriteria, null);
}
@Test
public void testListIdsBy() {
Host.Type type = Host.Type.Routing;
Status status = Status.Up;
ResourceState resourceState = ResourceState.Enabled;
Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.KVM;
Long zoneId = 1L, podId = 2L, clusterId = 3L;
List<Long> mockResults = List.of(1001L, 1002L);
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, Long> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
SearchCriteria<Long> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
doReturn(sb).when(hostDao).createSearchBuilder(Long.class);
doReturn(mockResults).when(hostDao).customSearch(any(SearchCriteria.class), any());
List<Long> hostIds = hostDao.listIdsBy(type, status, resourceState, hypervisorType, zoneId, podId, clusterId);
assertEquals(mockResults, hostIds);
Mockito.verify(sc).setParameters("type", type);
Mockito.verify(sc).setParameters("status", status);
Mockito.verify(sc).setParameters("resourceState", resourceState);
Mockito.verify(sc).setParameters("hypervisorType", hypervisorType);
Mockito.verify(sc).setParameters("zoneId", zoneId);
Mockito.verify(sc).setParameters("podId", podId);
Mockito.verify(sc).setParameters("clusterId", clusterId);
}
@Test
public void testListDistinctHypervisorArchTypes_WithZone() {
Long zoneId = 123L;
HostVO host1 = mock(HostVO.class);
when(host1.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.XenServer);
when(host1.getArch()).thenReturn(CPU.CPUArch.amd64);
HostVO host2 = mock(HostVO.class);
when(host2.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM);
when(host2.getArch()).thenReturn(CPU.CPUArch.arm64);
List<HostVO> dummyHosts = Arrays.asList(host1, host2);
doReturn(dummyHosts).when(hostDao).search(any(SearchCriteria.class), isNull());
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = hostDao.listDistinctHypervisorArchTypes(zoneId);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(Hypervisor.HypervisorType.XenServer, result.get(0).first());
assertEquals(CPU.CPUArch.amd64, result.get(0).second());
assertEquals(Hypervisor.HypervisorType.KVM, result.get(1).first());
assertEquals(CPU.CPUArch.arm64, result.get(1).second());
}
@Test
public void testListDistinctHypervisorArchTypes_WithoutZone() {
Long zoneId = null;
HostVO host1 = mock(HostVO.class);
when(host1.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.VMware);
when(host1.getArch()).thenReturn(CPU.CPUArch.amd64);
List<HostVO> dummyHosts = Collections.singletonList(host1);
doReturn(dummyHosts).when(hostDao).search(any(SearchCriteria.class), isNull());
List<Pair<Hypervisor.HypervisorType, CPU.CPUArch>> result = hostDao.listDistinctHypervisorArchTypes(zoneId);
assertNotNull(result);
assertEquals(1, result.size());
assertEquals(Hypervisor.HypervisorType.VMware, result.get(0).first());
assertEquals(CPU.CPUArch.amd64, result.get(0).second());
}
@Test
public void testListDistinctArchTypes() {
Long clusterId = 1L;
List<CPU.CPUArch> mockResults = List.of(CPU.CPUArch.amd64, CPU.CPUArch.arm64);
HostVO host = mock(HostVO.class);
GenericSearchBuilder<HostVO, String> sb = mock(GenericSearchBuilder.class);
when(sb.entity()).thenReturn(host);
SearchCriteria<String> sc = mock(SearchCriteria.class);
when(sb.create()).thenReturn(sc);
doReturn(sb).when(hostDao).createSearchBuilder(String.class);
doReturn(mockResults.stream().map(h -> h.getType()).collect(Collectors.toList())).when(hostDao)
.customSearch(any(SearchCriteria.class), any());
List<CPU.CPUArch> hypervisorTypes = hostDao.listDistinctArchTypes(clusterId);
assertEquals(mockResults, hypervisorTypes);
Mockito.verify(sc).setParameters("clusterId", clusterId);
Mockito.verify(sc).setParameters("type", Host.Type.Routing);
}
}