/**
* 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 org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.H2DatabaseCleaner;
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.ClusterVersionEntity;
import org.apache.ambari.server.state.RepositoryVersionState;
import org.apache.ambari.server.state.StackId;
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;
/**
* ClusterVersionDAO unit tests.
*/
public class ClusterVersionDAOTest {
private static Injector injector;
private ClusterVersionDAO clusterVersionDAO;
private ClusterDAO clusterDAO;
private OrmTestHelper helper;
private long clusterId;
ClusterEntity cluster;
private int lastStep = -1;
ClusterVersionEntity cvA;
long cvAId = 0L;
ClusterVersionEntity cvB;
long cvBId = 0L;
ClusterVersionEntity cvC;
long cvCId = 0L;
private final static StackId HDP_22_STACK = new StackId("HDP", "2.2.0");
private final static StackId BAD_STACK = new StackId("BADSTACK", "1.0");
@Before
public void before() {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
clusterVersionDAO = injector.getInstance(ClusterVersionDAO.class);
clusterDAO = injector.getInstance(ClusterDAO.class);
helper = injector.getInstance(OrmTestHelper.class);
}
/**
* Helper function to transition the cluster through several cluster versions.
* @param currStep Step to go to is a value from 1 - 7, inclusive.
*/
private void createRecordsUntilStep(int currStep) throws Exception {
// Fresh install on A
if (currStep >= 1 && lastStep <= 0) {
clusterId = helper.createCluster();
cluster = clusterDAO.findById(clusterId);
cvA = new ClusterVersionEntity(cluster, helper.getOrCreateRepositoryVersion(HDP_22_STACK, "2.2.0.0-995"), RepositoryVersionState.CURRENT, System.currentTimeMillis(), System.currentTimeMillis(), "admin");
clusterVersionDAO.create(cvA);
cvAId = cvA.getId();
} else {
cluster = clusterDAO.findById(clusterId);
cvA = clusterVersionDAO.findByPK(cvAId);
}
// Install B
if (currStep >= 2) {
if (lastStep <= 1) {
cvB = new ClusterVersionEntity(cluster, helper.getOrCreateRepositoryVersion(HDP_22_STACK, "2.2.0.1-998"), RepositoryVersionState.INSTALLED, System.currentTimeMillis(), System.currentTimeMillis(), "admin");
clusterVersionDAO.create(cvB);
cvBId = cvB.getId();
} else {
cvB = clusterVersionDAO.findByPK(cvBId);
}
}
// Switch from A to B
if (currStep >= 3 && lastStep <= 2) {
cvA.setState(RepositoryVersionState.INSTALLED);
cvB.setState(RepositoryVersionState.CURRENT);
clusterVersionDAO.merge(cvA);
clusterVersionDAO.merge(cvB);
}
// Start upgrading C
if (currStep >= 4) {
if (lastStep <= 3) {
cvC = new ClusterVersionEntity(cluster, helper.getOrCreateRepositoryVersion(HDP_22_STACK, "2.2.0.0-100"), RepositoryVersionState.INSTALLING, System.currentTimeMillis(), "admin");
clusterVersionDAO.create(cvC);
cvCId = cvC.getId();
} else {
cvC = clusterVersionDAO.findByPK(cvCId);
}
}
// Fail upgrade for C
if (currStep >= 5 && lastStep <= 4) {
cvC.setState(RepositoryVersionState.INSTALL_FAILED);
cvC.setEndTime(System.currentTimeMillis());
clusterVersionDAO.merge(cvC);
}
// Retry upgrade on C
if (currStep >= 6 && lastStep <= 5) {
cvC.setState(RepositoryVersionState.INSTALLING);
cvC.setEndTime(0L);
clusterVersionDAO.merge(cvC);
}
// Finalize upgrade on C to make it the current cluster version
if (currStep >= 7 && lastStep <= 6) {
cvC.setState(RepositoryVersionState.CURRENT);
cvC.setEndTime(System.currentTimeMillis());
clusterVersionDAO.merge(cvC);
cvA.setState(RepositoryVersionState.INSTALLED);
cvB.setState(RepositoryVersionState.INSTALLED);
clusterVersionDAO.merge(cvA);
clusterVersionDAO.merge(cvB);
}
lastStep = currStep;
}
@Test
public void testFindByStackAndVersion() throws Exception {
createRecordsUntilStep(1);
Assert.assertEquals(
0,
clusterVersionDAO.findByStackAndVersion("non existing", "non existing",
"non existing").size());
Assert.assertEquals(
1,
clusterVersionDAO.findByStackAndVersion(HDP_22_STACK.getStackName(),
HDP_22_STACK.getStackVersion(), "2.2.0.0-995").size());
}
@Test
public void testFindByCluster() throws Exception {
createRecordsUntilStep(1);
Assert.assertEquals(0, clusterVersionDAO.findByCluster("non existing").size());
Assert.assertEquals(1, clusterVersionDAO.findByCluster(cluster.getClusterName()).size());
}
@Test
public void testFindByClusterAndStackAndVersion() throws Exception {
createRecordsUntilStep(1);
Assert.assertNull(clusterVersionDAO.findByClusterAndStackAndVersion(
cluster.getClusterName(), BAD_STACK, "non existing"));
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStackAndVersion(
cluster.getClusterName(), HDP_22_STACK, "2.2.0.0-995"));
}
/**
* At all times the cluster should have a cluster version whose state is {@link org.apache.ambari.server.state.RepositoryVersionState#CURRENT}
*/
@Test
public void testFindByClusterAndStateCurrent() throws Exception {
createRecordsUntilStep(1);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(2);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(3);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(4);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(5);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(6);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
createRecordsUntilStep(7);
Assert.assertNotNull(clusterVersionDAO.findByClusterAndStateCurrent(cluster.getClusterName()));
}
/**
* Test the state of certain cluster versions.
*/
@Test
public void testFindByClusterAndState() throws Exception {
createRecordsUntilStep(1);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(2);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(3);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(4);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(5);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(6);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
createRecordsUntilStep(7);
Assert.assertEquals(1, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.CURRENT).size());
Assert.assertEquals(2, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLED).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALLING).size());
Assert.assertEquals(0, clusterVersionDAO.findByClusterAndState(cluster.getClusterName(), RepositoryVersionState.INSTALL_FAILED).size());
}
@After
public void after() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
injector = null;
}
}