/**
* 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.Arrays;
import java.util.List;
import java.util.Set;
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.cache.ConfigGroupHostMapping;
import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.ConfigGroupConfigMappingEntity;
import org.apache.ambari.server.orm.entities.ConfigGroupEntity;
import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity;
import org.apache.ambari.server.orm.entities.HostEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.host.HostFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
import junit.framework.Assert;
public class ConfigGroupDAOTest {
private Injector injector;
private ConfigGroupDAO configGroupDAO;
private ClusterDAO clusterDAO;
private ConfigGroupConfigMappingDAO configGroupConfigMappingDAO;
private ConfigGroupHostMappingDAO configGroupHostMappingDAO;
private HostDAO hostDAO;
private ResourceTypeDAO resourceTypeDAO;
private StackDAO stackDAO;
private HostFactory hostFactory;
@Before
public void setup() throws Exception {
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
// required to populate the database with stacks
injector.getInstance(AmbariMetaInfo.class);
stackDAO = injector.getInstance(StackDAO.class);
clusterDAO = injector.getInstance(ClusterDAO.class);
configGroupDAO = injector.getInstance(ConfigGroupDAO.class);
configGroupConfigMappingDAO = injector.getInstance
(ConfigGroupConfigMappingDAO.class);
configGroupHostMappingDAO = injector.getInstance
(ConfigGroupHostMappingDAO.class);
hostDAO = injector.getInstance(HostDAO.class);
resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
hostFactory = injector.getInstance(HostFactory.class);
}
@After
public void teardown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
}
private ConfigGroupEntity createConfigGroup(String clusterName,
String groupName, String tag, String desc, List<HostEntity> hosts,
List<ClusterConfigEntity> configs) throws Exception {
Clusters clusters = injector.getInstance(Clusters.class);
StackEntity stackEntity = stackDAO.find("HDP", "0.1");
clusters.addCluster(clusterName, new StackId(stackEntity));
ClusterEntity clusterEntity = clusterDAO.findByName(clusterName);
ConfigGroupEntity configGroupEntity = new ConfigGroupEntity();
configGroupEntity.setClusterEntity(clusterEntity);
configGroupEntity.setClusterId(clusterEntity.getClusterId());
configGroupEntity.setGroupName(groupName);
configGroupEntity.setDescription(desc);
configGroupEntity.setTag(tag);
configGroupDAO.create(configGroupEntity);
if (hosts != null && !hosts.isEmpty()) {
List<ConfigGroupHostMappingEntity> hostMappingEntities = new ArrayList<>();
for (HostEntity host : hosts) {
host.setClusterEntities(Arrays.asList(clusterEntity));
hostDAO.create(host);
ConfigGroupHostMappingEntity hostMappingEntity = new ConfigGroupHostMappingEntity();
hostMappingEntity.setHostId(host.getHostId());
hostMappingEntity.setHostEntity(host);
hostMappingEntity.setConfigGroupEntity(configGroupEntity);
hostMappingEntity.setConfigGroupId(configGroupEntity.getGroupId());
hostMappingEntities.add(hostMappingEntity);
configGroupHostMappingDAO.create(hostMappingEntity);
}
configGroupEntity.setConfigGroupHostMappingEntities(hostMappingEntities);
configGroupDAO.merge(configGroupEntity);
}
if (configs != null && !configs.isEmpty()) {
List<ConfigGroupConfigMappingEntity> configMappingEntities = new
ArrayList<>();
for (ClusterConfigEntity config : configs) {
config.setClusterEntity(clusterEntity);
config.setClusterId(clusterEntity.getClusterId());
clusterDAO.createConfig(config);
ConfigGroupConfigMappingEntity configMappingEntity = new
ConfigGroupConfigMappingEntity();
configMappingEntity.setClusterId(clusterEntity.getClusterId());
configMappingEntity.setClusterConfigEntity(config);
configMappingEntity.setConfigGroupEntity(configGroupEntity);
configMappingEntity.setConfigGroupId(configGroupEntity.getGroupId());
configMappingEntity.setVersionTag(config.getTag());
configMappingEntity.setConfigType(config.getType());
configMappingEntity.setTimestamp(System.currentTimeMillis());
configMappingEntities.add(configMappingEntity);
configGroupConfigMappingDAO.create(configMappingEntity);
}
configGroupEntity.setConfigGroupConfigMappingEntities(configMappingEntities);
configGroupDAO.merge(configGroupEntity);
}
return configGroupEntity;
}
@Test
public void testCreatePlaneJaneCG() throws Exception {
ConfigGroupEntity configGroupEntity = createConfigGroup("c1", "hdfs-1",
"HDFS", "some description", null, null);
Long clusterId = clusterDAO.findByName("c1").getClusterId();
Assert.assertNotNull(configGroupEntity);
Assert.assertEquals("c1", configGroupEntity.getClusterEntity().getClusterName());
Assert.assertEquals(clusterId, configGroupEntity.getClusterEntity()
.getClusterId());
Assert.assertEquals("hdfs-1", configGroupEntity.getGroupName());
Assert.assertEquals("HDFS", configGroupEntity.getTag());
Assert.assertEquals("some description", configGroupEntity.getDescription());
}
@Test
public void testFindByTag() throws Exception {
createConfigGroup("c1", "hdfs-1", "HDFS", "some description", null, null);
List<ConfigGroupEntity> configGroupEntities = configGroupDAO.findAllByTag
("HDFS");
Long clusterId = clusterDAO.findByName("c1").getClusterId();
Assert.assertNotNull(configGroupEntities);
ConfigGroupEntity configGroupEntity = configGroupEntities.get(0);
Assert.assertNotNull(configGroupEntity);
Assert.assertEquals("c1", configGroupEntity.getClusterEntity().getClusterName());
Assert.assertEquals(clusterId, configGroupEntity.getClusterEntity()
.getClusterId());
Assert.assertEquals("hdfs-1", configGroupEntity.getGroupName());
Assert.assertEquals("HDFS", configGroupEntity.getTag());
Assert.assertEquals("some description", configGroupEntity.getDescription());
}
@Test
public void testFindByName() throws Exception {
createConfigGroup("c1", "hdfs-1", "HDFS", "some description", null, null);
ConfigGroupEntity configGroupEntity = configGroupDAO.findByName("hdfs-1");
Long clusterId = clusterDAO.findByName("c1").getClusterId();
Assert.assertNotNull(configGroupEntity);
Assert.assertEquals("c1", configGroupEntity.getClusterEntity().getClusterName());
Assert.assertEquals(clusterId, configGroupEntity.getClusterEntity()
.getClusterId());
Assert.assertEquals("hdfs-1", configGroupEntity.getGroupName());
Assert.assertEquals("HDFS", configGroupEntity.getTag());
Assert.assertEquals("some description", configGroupEntity.getDescription());
}
@Test
public void testFindByHost() throws Exception {
List<HostEntity> hosts = new ArrayList<>();
// Partially constructed HostEntity that will persisted in {@link createConfigGroup}
HostEntity hostEntity = new HostEntity();
hostEntity.setHostName("h1");
hostEntity.setOsType("centOS");
hosts.add(hostEntity);
ConfigGroupEntity configGroupEntity =
createConfigGroup("c1", "hdfs-1", "HDFS", "some description", hosts, null);
Assert.assertNotNull(hostEntity.getHostId());
Assert.assertNotNull(configGroupEntity);
Assert.assertTrue(configGroupEntity.getConfigGroupHostMappingEntities()
.size() > 0);
Assert.assertNotNull(configGroupEntity
.getConfigGroupHostMappingEntities().iterator().next());
Set<ConfigGroupHostMapping> hostMappingEntities = configGroupHostMappingDAO.findByHostId(hostEntity.getHostId());
Assert.assertNotNull(hostMappingEntities);
for (ConfigGroupHostMapping hostMappingEntity : hostMappingEntities) {
Assert.assertEquals(hostEntity.getHostId(), hostMappingEntity.getHostId());
Assert.assertEquals("centOS", hostMappingEntity.getHost().getOsType());
}
}
@Test
public void testFindConfigsByGroup() throws Exception {
StackEntity stackEntity = stackDAO.find("HDP", "0.1");
ClusterConfigEntity configEntity = new ClusterConfigEntity();
configEntity.setType("core-site");
configEntity.setTag("version1");
configEntity.setData("someData");
configEntity.setAttributes("someAttributes");
configEntity.setStack(stackEntity);
List<ClusterConfigEntity> configEntities = new
ArrayList<>();
configEntities.add(configEntity);
ConfigGroupEntity configGroupEntity =
createConfigGroup("c1", "hdfs-1", "HDFS", "some description", null,
configEntities);
Assert.assertNotNull(configGroupEntity);
Assert.assertTrue(configGroupEntity.getConfigGroupConfigMappingEntities()
.size() > 0);
List<ConfigGroupConfigMappingEntity> configMappingEntities =
configGroupConfigMappingDAO.findByGroup(configGroupEntity.getGroupId());
Assert.assertNotNull(configEntities);
Assert.assertEquals("core-site", configEntities.get(0).getType());
Assert.assertEquals("version1", configEntities.get(0).getTag());
Assert.assertEquals("someData", configEntities.get(0).getData());
Assert.assertEquals("someAttributes", configEntities.get(0).getAttributes());
}
}