/** * 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.UUID; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.H2DatabaseCleaner; import org.apache.ambari.server.api.services.AmbariMetaInfo; 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.orm.entities.RepositoryVersionEntity; import org.apache.ambari.server.orm.entities.StackEntity; 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; /** * RepositoryVersionDAO unit tests. */ public class RepositoryVersionDAOTest { private static Injector injector; private static final StackId HDP_206 = new StackId("HDP", "2.0.6"); private static final StackId OTHER_10 = new StackId("OTHER", "1.0"); private static final StackId BAD_STACK = new StackId("BADSTACK", "1.0"); private RepositoryVersionDAO repositoryVersionDAO; private ClusterVersionDAO clusterVersionDAO; private ClusterDAO clusterDAO; private StackDAO stackDAO; private OrmTestHelper helper; @Before public void before() { injector = Guice.createInjector(new InMemoryDefaultTestModule()); repositoryVersionDAO = injector.getInstance(RepositoryVersionDAO.class); clusterVersionDAO = injector.getInstance(ClusterVersionDAO.class); clusterDAO = injector.getInstance(ClusterDAO.class); stackDAO = injector.getInstance(StackDAO.class); helper = injector.getInstance(OrmTestHelper.class); injector.getInstance(GuiceJpaInitializer.class); // required to populate stacks into the database injector.getInstance(AmbariMetaInfo.class); } private RepositoryVersionEntity createSingleRecord() { StackEntity stackEntity = stackDAO.find(HDP_206.getStackName(), HDP_206.getStackVersion()); Assert.assertNotNull(stackEntity); final RepositoryVersionEntity entity = new RepositoryVersionEntity(); entity.setDisplayName("display name"); entity.setOperatingSystems("repositories"); entity.setStack(stackEntity); entity.setVersion("version"); repositoryVersionDAO.create(entity); return entity; } @Test public void testCreate() { UUID uuid = UUID.randomUUID(); RepositoryVersionEntity first = createSingleRecord(); Assert.assertNotNull(first); StackEntity stackEntity = stackDAO.find(first.getStackName(), first.getStackVersion()); Assert.assertNotNull(stackEntity); // Assert the version must be unique RepositoryVersionEntity dupVersion = new RepositoryVersionEntity(); dupVersion.setDisplayName("display name " + uuid.toString()); dupVersion.setOperatingSystems("repositories"); dupVersion.setStack(stackEntity); dupVersion.setVersion(first.getVersion()); boolean exceptionThrown = false; try { repositoryVersionDAO.create(stackEntity, dupVersion.getVersion(), dupVersion.getDisplayName(), dupVersion.getOperatingSystemsJson()); } catch (AmbariException e) { exceptionThrown = true; Assert.assertTrue(e.getMessage().contains("already exists")); } // Expected the exception to be thrown since the build version was reused in the second record. Assert.assertTrue(exceptionThrown); exceptionThrown = false; // The version must belong to the stack dupVersion.setVersion("2.3-1234"); try { repositoryVersionDAO.create(stackEntity, dupVersion.getVersion(), dupVersion.getDisplayName(), dupVersion.getOperatingSystemsJson()); } catch (AmbariException e) { exceptionThrown = true; Assert.assertTrue(e.getMessage().contains("needs to belong to stack")); } // Expected the exception to be thrown since the version does not belong to the stack. Assert.assertTrue(exceptionThrown); // Success dupVersion.setVersion(stackEntity.getStackVersion() + "-1234"); try { repositoryVersionDAO.create(stackEntity, dupVersion.getVersion(), dupVersion.getDisplayName(), dupVersion.getOperatingSystemsJson()); } catch (AmbariException e) { Assert.fail("Did not expect a failure creating the Repository Version"); } } @Test public void testFindByDisplayName() { createSingleRecord(); Assert.assertNull(repositoryVersionDAO.findByDisplayName("non existing")); Assert.assertNotNull(repositoryVersionDAO.findByDisplayName("display name")); } @Test public void testFindByStackAndVersion() { createSingleRecord(); Assert.assertNull(repositoryVersionDAO.findByStackAndVersion(BAD_STACK, "non existing")); Assert.assertNotNull(repositoryVersionDAO.findByStackAndVersion(HDP_206, "version")); } @Test public void testFindByStack() { createSingleRecord(); Assert.assertEquals(0, repositoryVersionDAO.findByStack(BAD_STACK).size()); Assert.assertEquals(1, repositoryVersionDAO.findByStack(HDP_206).size()); } @Test public void testDelete() { createSingleRecord(); Assert.assertNotNull(repositoryVersionDAO.findByStackAndVersion(HDP_206, "version")); final RepositoryVersionEntity entity = repositoryVersionDAO.findByStackAndVersion( HDP_206, "version"); repositoryVersionDAO.remove(entity); Assert.assertNull(repositoryVersionDAO.findByStackAndVersion(HDP_206, "version")); } @Test public void testDeleteCascade() throws Exception { long clusterId = helper.createCluster(); ClusterEntity cluster = clusterDAO.findById(clusterId); createSingleRecord(); final RepositoryVersionEntity entity = repositoryVersionDAO.findByStackAndVersion( HDP_206, "version"); ClusterVersionEntity cvA = new ClusterVersionEntity(cluster, entity, RepositoryVersionState.INSTALLED, System.currentTimeMillis(), System.currentTimeMillis(), "admin"); clusterVersionDAO.create(cvA); long cvAId = cvA.getId(); cvA = clusterVersionDAO.findByPK(cvAId); Assert.assertNotNull(cvA.getRepositoryVersion()); final RepositoryVersionEntity newEntity = repositoryVersionDAO.findByStackAndVersion( HDP_206, "version"); try { repositoryVersionDAO.remove(newEntity); } catch (Exception e) { //Cascade deletion will fail because absent integrity in in-memory DB Assert.assertNotNull(clusterVersionDAO.findByPK(cvAId)); } // } @Test public void testRemovePrefixFromVersion() { StackEntity hdp206StackEntity = stackDAO.find(HDP_206.getStackName(), HDP_206.getStackVersion()); Assert.assertNotNull(hdp206StackEntity); final RepositoryVersionEntity hdp206RepoEntity = new RepositoryVersionEntity(); hdp206RepoEntity.setDisplayName("HDP-2.0.6.0-1234"); hdp206RepoEntity.setOperatingSystems("repositories"); hdp206RepoEntity.setStack(hdp206StackEntity); hdp206RepoEntity.setVersion("HDP-2.0.6.0-1234"); repositoryVersionDAO.create(hdp206RepoEntity); Assert.assertEquals("Failed to remove HDP stack prefix from version", "2.0.6.0-1234", hdp206RepoEntity.getVersion()); Assert.assertNotNull(repositoryVersionDAO.findByDisplayName("HDP-2.0.6.0-1234")); Assert.assertNotNull(repositoryVersionDAO.findByStackAndVersion(HDP_206, "2.0.6.0-1234")); StackEntity other10StackEntity = stackDAO.find(OTHER_10.getStackName(), OTHER_10.getStackVersion()); Assert.assertNotNull(other10StackEntity); final RepositoryVersionEntity other10RepoEntity = new RepositoryVersionEntity(); other10RepoEntity.setDisplayName("OTHER-1.0.1.0-1234"); other10RepoEntity.setOperatingSystems("repositories"); other10RepoEntity.setStack(other10StackEntity); other10RepoEntity.setVersion("OTHER-1.0.1.0-1234"); repositoryVersionDAO.create(other10RepoEntity); Assert.assertEquals("Failed to remove OTHER stack prefix from version", "1.0.1.0-1234", other10RepoEntity.getVersion()); Assert.assertNotNull(repositoryVersionDAO.findByDisplayName("OTHER-1.0.1.0-1234")); Assert.assertNotNull(repositoryVersionDAO.findByStackAndVersion(OTHER_10, "1.0.1.0-1234")); } @After public void after() throws AmbariException, SQLException { H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector); injector = null; } }