/**
* 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 org.apache.ambari.server.orm.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
import org.apache.ambari.server.Role;
import org.apache.ambari.server.RoleCommand;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.controller.internal.CalculatedStatus;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.OrmTestHelper;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.HostEntity;
import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
import org.apache.ambari.server.orm.entities.RequestEntity;
import org.apache.ambari.server.orm.entities.ResourceEntity;
import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
import org.apache.ambari.server.orm.entities.StageEntity;
import org.apache.ambari.server.orm.entities.StageEntityPK;
import org.apache.ambari.server.security.authorization.ResourceType;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
/**
* RequestDAO unit tests
*/
public class RequestDAOTest {
private Injector injector;
private ClusterDAO clusterDAO;
private StageDAO stageDAO;
private HostRoleCommandDAO hostRoleCommandDAO;
private HostDAO hostDAO;
private RequestDAO requestDAO;
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
injector.getInstance(AmbariMetaInfo.class);
clusterDAO = injector.getInstance(ClusterDAO.class);
stageDAO = injector.getInstance(StageDAO.class);
hostRoleCommandDAO = injector.getInstance(HostRoleCommandDAO.class);
hostDAO = injector.getInstance(HostDAO.class);
requestDAO = injector.getInstance(RequestDAO.class);
}
@After
public void teardown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
}
@Test
public void testFindAll() throws Exception {
RequestDAO dao = injector.getInstance(RequestDAO.class);
Set<Long> set = Collections.emptySet();
List<RequestEntity> list = dao.findByPks(set);
Assert.assertEquals(0, list.size());
}
@Test
public void testFindAllRequestIds() throws Exception {
RequestDAO dao = injector.getInstance(RequestDAO.class);
List<Long> list = dao.findAllRequestIds(0, true);
Assert.assertEquals(0, list.size());
}
@Test
public void testCalculatedStatus() throws Exception {
createGraph();
RequestEntity requestEntity = requestDAO.findByPK(100L);
// !!! accepted value
CalculatedStatus calc1 = CalculatedStatus.statusFromStageEntities(
requestEntity.getStages());
// !!! aggregated value
Map<Long, HostRoleCommandStatusSummaryDTO> map = hostRoleCommandDAO.findAggregateCounts(100L);
CalculatedStatus calc2 = CalculatedStatus.statusFromStageSummary(map,
map.keySet());
Assert.assertEquals(HostRoleStatus.IN_PROGRESS, calc1.getStatus());
Assert.assertEquals(calc1.getStatus(), calc2.getStatus());
Assert.assertEquals(calc1.getPercent(), calc2.getPercent(), 0.01d);
// !!! simulate an upgrade group
Set<Long> group = new HashSet<>();
group.add(2L);
group.add(3L);
group.add(4L);
// !!! accepted
List<StageEntity> stages = new ArrayList<>();
StageEntityPK primaryKey = new StageEntityPK();
primaryKey.setRequestId(requestEntity.getRequestId());
primaryKey.setStageId(2L);
StageEntity stage = stageDAO.findByPK(primaryKey);
Assert.assertNotNull(stage);
stages.add(stage);
primaryKey.setStageId(3L);
stage = stageDAO.findByPK(primaryKey);
Assert.assertNotNull(stage);
stages.add(stage);
primaryKey.setStageId(4L);
stage = stageDAO.findByPK(primaryKey);
Assert.assertNotNull(stage);
stages.add(stage);
CalculatedStatus calc3 = CalculatedStatus.statusFromStageEntities(stages);
// !!! aggregated
CalculatedStatus calc4 = CalculatedStatus.statusFromStageSummary(map, group);
Assert.assertEquals(100d, calc3.getPercent(), 0.01d);
Assert.assertEquals(HostRoleStatus.COMPLETED, calc3.getStatus());
Assert.assertEquals(calc3.getPercent(), calc4.getPercent(), 0.01d);
Assert.assertEquals(calc3.getStatus(), calc4.getStatus());
}
private void createGraph() {
OrmTestHelper helper = injector.getInstance(OrmTestHelper.class);
helper.createDefaultData();
Long requestId = Long.valueOf(100L);
String hostName = "test_host1";
ResourceTypeEntity resourceTypeEntity = new ResourceTypeEntity();
resourceTypeEntity.setId(ResourceType.CLUSTER.getId());
resourceTypeEntity.setName(ResourceType.CLUSTER.name());
ResourceEntity resourceEntity = new ResourceEntity();
resourceEntity.setResourceType(resourceTypeEntity);
ClusterEntity clusterEntity = clusterDAO.findByName("test_cluster1");
RequestEntity requestEntity = new RequestEntity();
requestEntity.setRequestId(requestId);
requestEntity.setClusterId(clusterEntity.getClusterId());
requestEntity.setStages(new ArrayList<StageEntity>());
requestDAO.create(requestEntity);
HostEntity host = hostDAO.findByName(hostName);
host.setHostRoleCommandEntities(new ArrayList<HostRoleCommandEntity>());
long stageId = 1L;
stageId = createStages(stageId, 3, host, requestEntity, HostRoleStatus.COMPLETED, false);
stageId = createStages(stageId, 1, host, requestEntity, HostRoleStatus.FAILED, true);
stageId = createStages(stageId, 1, host, requestEntity, HostRoleStatus.IN_PROGRESS, false);
stageId = createStages(stageId, 3, host, requestEntity, HostRoleStatus.PENDING, false);
requestDAO.merge(requestEntity);
}
private long createStages(long startStageId, int count,
HostEntity he, RequestEntity re, HostRoleStatus status, boolean skipStage) {
long stageId = startStageId;
ClusterEntity clusterEntity = clusterDAO.findByName("test_cluster1");
for (int i = 0; i < count; i++) {
StageEntity stageEntity = new StageEntity();
stageEntity.setClusterId(clusterEntity.getClusterId());
stageEntity.setRequest(re);
stageEntity.setStageId(stageId);
stageEntity.setHostRoleCommands(new ArrayList<HostRoleCommandEntity>());
stageEntity.setSkippable(skipStage);
stageDAO.create(stageEntity);
re.getStages().add(stageEntity);
HostRoleCommandEntity commandEntity = new HostRoleCommandEntity();
commandEntity.setRequestId(re.getRequestId());
commandEntity.setStageId(stageId);
commandEntity.setRoleCommand(RoleCommand.INSTALL);
commandEntity.setStatus(status);
commandEntity.setRole(Role.DATANODE);
commandEntity.setHostEntity(he);
commandEntity.setStage(stageEntity);
hostRoleCommandDAO.create(commandEntity);
he.getHostRoleCommandEntities().add(commandEntity);
he = hostDAO.merge(he);
stageEntity.getHostRoleCommands().add(commandEntity);
stageDAO.merge(stageEntity);
stageId++;
}
return stageId;
}
}