/*
* 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.upgrade;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMockBuilder;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.easymock.EasyMock.verify;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
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.configuration.Configuration;
import org.apache.ambari.server.controller.AmbariManagementController;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
import org.apache.ambari.server.orm.GuiceJpaInitializer;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
import org.apache.ambari.server.orm.dao.StackDAO;
import org.apache.ambari.server.orm.entities.ClusterEntity;
import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
import org.apache.ambari.server.orm.entities.HostEntity;
import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
import org.apache.ambari.server.orm.entities.StackEntity;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Config;
import org.apache.ambari.server.state.ConfigHelper;
import org.apache.ambari.server.state.OperatingSystemInfo;
import org.apache.ambari.server.state.PropertyInfo;
import org.apache.ambari.server.state.RepositoryInfo;
import org.apache.ambari.server.state.SecurityState;
import org.apache.ambari.server.state.SecurityType;
import org.apache.ambari.server.state.StackId;
import org.apache.ambari.server.state.StackInfo;
import org.apache.ambari.server.state.stack.OsFamily;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Provider;
/**
* {@link UpgradeCatalog200} unit tests.
*/
public class UpgradeCatalog200Test {
private final String CLUSTER_NAME = "c1";
private final String HOST_NAME = "h1";
private final StackId DESIRED_STACK = new StackId("HDP", "2.0.6");
private Injector injector;
private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class);
private EntityManager entityManager = createNiceMock(EntityManager.class);
private UpgradeCatalogHelper upgradeCatalogHelper;
@Before
public void init() {
reset(entityManagerProvider);
expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes();
replay(entityManagerProvider);
injector = Guice.createInjector(new InMemoryDefaultTestModule());
injector.getInstance(GuiceJpaInitializer.class);
upgradeCatalogHelper = injector.getInstance(UpgradeCatalogHelper.class);
}
@After
public void tearDown() throws AmbariException, SQLException {
H2DatabaseCleaner.clearDatabaseAndStopPersistenceService(injector);
}
@Test
public void testExecuteDDLUpdates() throws Exception {
final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);
Configuration configuration = createNiceMock(Configuration.class);
Connection connection = createNiceMock(Connection.class);
Statement statement = createNiceMock(Statement.class);
ResultSet resultSet = createNiceMock(ResultSet.class);
expect(configuration.getDatabaseUrl()).andReturn(Configuration.JDBC_IN_MEMORY_URL).anyTimes();
Capture<DBAccessor.DBColumnInfo> alertDefinitionIgnoreColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> alertDefinitionDescriptionColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> alertTargetGlobalColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> hostComponentStateColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> hostComponentVersionColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> clustersSecurityTypeColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> hostComponentStateSecurityStateColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> hostComponentDesiredStateSecurityStateColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> hostRoleCommandRetryColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> stageSkippableColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> viewparameterLabelColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> viewparameterPlaceholderColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> viewparameterDefaultValueColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> serviceDesiredStateSecurityStateColumnCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> clusterVersionCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> hostVersionCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> valueColumnCapture = EasyMock.newCapture();
Capture<DBAccessor.DBColumnInfo> dataValueColumnCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> alertTargetStatesCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> artifactCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> kerberosPrincipalCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> kerberosPrincipalHostCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> upgradeCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> upgradeGroupCapture = EasyMock.newCapture();
Capture<List<DBAccessor.DBColumnInfo>> upgradeItemCapture = EasyMock.newCapture();
// Alert Definition
dbAccessor.addColumn(eq("alert_definition"),
capture(alertDefinitionIgnoreColumnCapture));
dbAccessor.addColumn(eq("alert_definition"),
capture(alertDefinitionDescriptionColumnCapture));
dbAccessor.createTable(eq("alert_target_states"),
capture(alertTargetStatesCapture));
// alert target
dbAccessor.addColumn(eq("alert_target"),
capture(alertTargetGlobalColumnCapture));
// Host Component State
dbAccessor.addColumn(eq("hostcomponentstate"),
capture(hostComponentStateColumnCapture));
// Host Component Version
dbAccessor.addColumn(eq("hostcomponentstate"),
capture(hostComponentVersionColumnCapture));
// Host Role Command retry allowed
dbAccessor.addColumn(eq("host_role_command"),
capture(hostRoleCommandRetryColumnCapture));
// Stage skippable
dbAccessor.addColumn(eq("stage"),
capture(stageSkippableColumnCapture));
// Clusters: security type
dbAccessor.addColumn(eq("clusters"),
capture(clustersSecurityTypeColumnCapture));
// Host Component State: security State
dbAccessor.addColumn(eq("hostcomponentstate"),
capture(hostComponentStateSecurityStateColumnCapture));
// Host Component Desired State: security State
dbAccessor.addColumn(eq("hostcomponentdesiredstate"),
capture(hostComponentDesiredStateSecurityStateColumnCapture));
dbAccessor.addColumn(eq("viewparameter"), capture(viewparameterLabelColumnCapture));
dbAccessor.addColumn(eq("viewparameter"), capture(viewparameterPlaceholderColumnCapture));
dbAccessor.addColumn(eq("viewparameter"), capture(viewparameterDefaultValueColumnCapture));
// Service Desired State: security State
dbAccessor.addColumn(eq("servicedesiredstate"),
capture(serviceDesiredStateSecurityStateColumnCapture));
// Cluster Version
dbAccessor.createTable(eq("cluster_version"),
capture(clusterVersionCapture), eq("id"));
// Host Version
dbAccessor.createTable(eq("host_version"),
capture(hostVersionCapture), eq("id"));
// Upgrade
dbAccessor.createTable(eq("upgrade"), capture(upgradeCapture), eq("upgrade_id"));
// Upgrade Group item
dbAccessor.createTable(eq("upgrade_group"), capture(upgradeGroupCapture), eq("upgrade_group_id"));
// Upgrade item
dbAccessor.createTable(eq("upgrade_item"), capture(upgradeItemCapture), eq("upgrade_item_id"));
// artifact
dbAccessor.createTable(eq("artifact"), capture(artifactCapture),
eq("artifact_name"), eq("foreign_keys"));
// kerberos_principal
dbAccessor.createTable(eq("kerberos_principal"), capture(kerberosPrincipalCapture),
eq("principal_name"));
// kerberos_principal_host
dbAccessor.createTable(eq("kerberos_principal_host"), capture(kerberosPrincipalHostCapture),
eq("principal_name"), eq("host_name"));
expect(dbAccessor.tableHasColumn("kerberos_principal_host", "host_name")).andReturn(true).atLeastOnce();
dbAccessor.addFKConstraint(eq("kerberos_principal_host"), eq("FK_krb_pr_host_hostname"),
eq("host_name"), eq("hosts"), eq("host_name"), eq(true), eq(false));
dbAccessor.addFKConstraint(eq("kerberos_principal_host"), eq("FK_krb_pr_host_principalname"),
eq("principal_name"), eq("kerberos_principal"), eq("principal_name"), eq(true), eq(false));
setViewInstancePropertyExpectations(dbAccessor, valueColumnCapture);
setViewInstanceDataExpectations(dbAccessor, dataValueColumnCapture);
// AbstractUpgradeCatalog.addSequence()
dbAccessor.getConnection();
expectLastCall().andReturn(connection).anyTimes();
connection.createStatement();
expectLastCall().andReturn(statement).anyTimes();
statement.executeQuery(anyObject(String.class));
expectLastCall().andReturn(resultSet).anyTimes();
replay(dbAccessor, configuration, resultSet, statement, connection);
AbstractUpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
Class<?> c = AbstractUpgradeCatalog.class;
Field f = c.getDeclaredField("configuration");
f.setAccessible(true);
f.set(upgradeCatalog, configuration);
upgradeCatalog.executeDDLUpdates();
verify(dbAccessor, configuration, resultSet, statement, connection);
// verify columns for alert_definition
verifyAlertDefinitionIgnoreColumn(alertDefinitionIgnoreColumnCapture);
verifyAlertDefinitionDescriptionColumn(alertDefinitionDescriptionColumnCapture);
// verify alert target column for is_global
verifyAlertTargetGlobal(alertTargetGlobalColumnCapture);
// verify new table for alert target states
verifyAlertTargetStatesTable(alertTargetStatesCapture);
// Verify added column in hostcomponentstate table
DBAccessor.DBColumnInfo upgradeStateColumn = hostComponentStateColumnCapture.getValue();
assertEquals("upgrade_state", upgradeStateColumn.getName());
assertEquals(32, (int) upgradeStateColumn.getLength());
assertEquals(String.class, upgradeStateColumn.getType());
assertEquals("NONE", upgradeStateColumn.getDefaultValue());
assertFalse(upgradeStateColumn.isNullable());
// Verify added column in hostcomponentstate table
DBAccessor.DBColumnInfo upgradeVersionColumn = hostComponentVersionColumnCapture.getValue();
assertEquals("version", upgradeVersionColumn.getName());
assertEquals(32, (int) upgradeVersionColumn.getLength());
assertEquals(String.class, upgradeVersionColumn.getType());
assertEquals("UNKNOWN", upgradeVersionColumn.getDefaultValue());
assertFalse(upgradeVersionColumn.isNullable());
// Verify added column in host_role_command table
DBAccessor.DBColumnInfo upgradeRetryColumn = hostRoleCommandRetryColumnCapture.getValue();
assertEquals("retry_allowed", upgradeRetryColumn.getName());
assertEquals(1, (int) upgradeRetryColumn.getLength());
assertEquals(Integer.class, upgradeRetryColumn.getType());
assertEquals(0, upgradeRetryColumn.getDefaultValue());
assertFalse(upgradeRetryColumn.isNullable());
// Verify added column in host_role_command table
DBAccessor.DBColumnInfo upgradeSkippableColumn = stageSkippableColumnCapture.getValue();
assertEquals("skippable", upgradeSkippableColumn.getName());
assertEquals(1, (int) upgradeSkippableColumn.getLength());
assertEquals(Integer.class, upgradeSkippableColumn.getType());
assertEquals(0, upgradeSkippableColumn.getDefaultValue());
assertFalse(upgradeSkippableColumn.isNullable());
// verify security_type column
verifyClustersSecurityType(clustersSecurityTypeColumnCapture);
// verify security_state columns
verifyComponentSecurityStateColumn(hostComponentStateSecurityStateColumnCapture);
verifyComponentSecurityStateColumn(hostComponentDesiredStateSecurityStateColumnCapture);
verifyServiceSecurityStateColumn(serviceDesiredStateSecurityStateColumnCapture);
verifyViewParameterColumns(viewparameterLabelColumnCapture, viewparameterPlaceholderColumnCapture,
viewparameterDefaultValueColumnCapture);
// verify artifact columns
List<DBAccessor.DBColumnInfo> artifactColumns = artifactCapture.getValue();
testCreateArtifactTable(artifactColumns);
// verify kerberos_principal columns
testCreateKerberosPrincipalTable(kerberosPrincipalCapture.getValue());
// verify kerberos_principal_host columns
testCreateKerberosPrincipalHostTable(kerberosPrincipalHostCapture.getValue());
// Verify capture group sizes
assertEquals(7, clusterVersionCapture.getValue().size());
assertEquals(4, hostVersionCapture.getValue().size());
assertViewInstancePropertyColumns(valueColumnCapture);
assertViewInstanceDataColumns(dataValueColumnCapture);
assertEquals(6, upgradeCapture.getValue().size());
assertEquals(4, upgradeGroupCapture.getValue().size());
assertEquals(7, upgradeItemCapture.getValue().size());
}
/**
* Tests that each DML method is invoked.
*
* @throws Exception
*/
@Test
public void testExecuteDMLUpdates() throws Exception {
Method removeNagiosService = UpgradeCatalog200.class.getDeclaredMethod("removeNagiosService");
Method updateHiveDatabaseType = UpgradeCatalog200.class.getDeclaredMethod("updateHiveDatabaseType");
Method addNewConfigurationsFromXml = AbstractUpgradeCatalog.class.getDeclaredMethod
("addNewConfigurationsFromXml");
Method updateTezConfiguration = UpgradeCatalog200.class.getDeclaredMethod("updateTezConfiguration");
Method updateFlumeEnvConfig = UpgradeCatalog200.class.getDeclaredMethod("updateFlumeEnvConfig");
Method updateClusterEnvConfiguration = UpgradeCatalog200.class.getDeclaredMethod("updateClusterEnvConfiguration");
Method updateConfigurationProperties = AbstractUpgradeCatalog.class.getDeclaredMethod
("updateConfigurationProperties", String.class, Map.class, boolean.class, boolean.class);
Method persistHDPRepo = UpgradeCatalog200.class.getDeclaredMethod("persistHDPRepo");
UpgradeCatalog200 upgradeCatalog = createMockBuilder(UpgradeCatalog200.class)
.addMockedMethod(removeNagiosService)
.addMockedMethod(updateHiveDatabaseType)
.addMockedMethod(addNewConfigurationsFromXml)
.addMockedMethod(updateTezConfiguration)
.addMockedMethod(updateFlumeEnvConfig)
.addMockedMethod(updateConfigurationProperties)
.addMockedMethod(updateClusterEnvConfiguration)
.addMockedMethod(persistHDPRepo)
.createMock();
upgradeCatalog.removeNagiosService();
expectLastCall().once();
upgradeCatalog.addNewConfigurationsFromXml();
expectLastCall();
upgradeCatalog.updateHiveDatabaseType();
expectLastCall().once();
upgradeCatalog.updateTezConfiguration();
expectLastCall().once();
upgradeCatalog.updateFlumeEnvConfig();
expectLastCall().once();
upgradeCatalog.updateConfigurationProperties("hive-site",
Collections.singletonMap("hive.server2.transport.mode", "binary"), false, false);
expectLastCall();
upgradeCatalog.persistHDPRepo();
expectLastCall().once();
upgradeCatalog.updateClusterEnvConfiguration();
expectLastCall();
replay(upgradeCatalog);
upgradeCatalog.executeDMLUpdates();
verify(upgradeCatalog);
}
@Test
public void testUpdateFlumeEnvConfig() throws AmbariException {
EasyMockSupport easyMockSupport = new EasyMockSupport();
final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class);
final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
final Cluster mockClusterExpected = easyMockSupport.createNiceMock(Cluster.class);
final Map<String, String> propertiesFlumeEnv = new HashMap<String, String>() {
{
put("content", "test");
}
};
final Config mockFlumeEnv = easyMockSupport.createNiceMock(Config.class);
expect(mockFlumeEnv.getProperties()).andReturn(propertiesFlumeEnv).once();
final Injector mockInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(AmbariManagementController.class).toInstance(mockAmbariManagementController);
bind(Clusters.class).toInstance(mockClusters);
bind(EntityManager.class).toInstance(entityManager);
bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
}
});
expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once();
expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
put("normal", mockClusterExpected);
}}).atLeastOnce();
expect(mockClusterExpected.getDesiredConfigByType("flume-env")).andReturn(mockFlumeEnv).atLeastOnce();
expect(mockFlumeEnv.getProperties()).andReturn(propertiesFlumeEnv).atLeastOnce();
easyMockSupport.replayAll();
mockInjector.getInstance(UpgradeCatalog200.class).updateFlumeEnvConfig();
easyMockSupport.verifyAll();
}
@Test
public void testPersistHDPRepo() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();
final AmbariManagementController mockAmbariManagementController = easyMockSupport.createStrictMock(AmbariManagementController.class);
final AmbariMetaInfo mockAmbariMetaInfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
final StackInfo mockStackInfo = easyMockSupport.createNiceMock(StackInfo.class);
final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
final Cluster mockCluster = easyMockSupport.createStrictMock(Cluster.class);
final Map<String, Cluster> clusterMap = new HashMap<>();
clusterMap.put("c1",mockCluster);
OperatingSystemInfo osi = new OperatingSystemInfo("redhat6");
HashSet<OperatingSystemInfo> osiSet = new HashSet<>();
osiSet.add(osi);
StackId stackId = new StackId("HDP","2.2");
final RepositoryInfo mockRepositoryInfo = easyMockSupport.createNiceMock(RepositoryInfo.class);
final Injector mockInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(AmbariManagementController.class).toInstance(mockAmbariManagementController);
bind(Clusters.class).toInstance(mockClusters);
bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
}
});
expect(mockAmbariManagementController.getAmbariMetaInfo()).andReturn(mockAmbariMetaInfo);
expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once();
expect(mockClusters.getClusters()).andReturn(clusterMap).once();
expect(mockCluster.getCurrentStackVersion()).andReturn(stackId).once();
expect(mockCluster.getClusterName()).andReturn("cc").anyTimes();
expect(mockAmbariMetaInfo.getOperatingSystems("HDP", "2.2")).andReturn(osiSet).once();
expect(mockAmbariMetaInfo.getRepository("HDP", "2.2", "redhat6", "HDP-2.2")).andReturn(mockRepositoryInfo).once();
expect(mockAmbariMetaInfo.getStack("HDP", "2.2")).andReturn(mockStackInfo);
expect(mockStackInfo.getRepositories()).andReturn(new ArrayList<RepositoryInfo>() {{
add(mockRepositoryInfo);
}});
expect(mockRepositoryInfo.getDefaultBaseUrl()).andReturn("http://baseurl").once();
mockAmbariMetaInfo.updateRepo("HDP", "2.2", "redhat6", "HDP-2.2", "http://baseurl", null);
expectLastCall().once();
easyMockSupport.replayAll();
mockInjector.getInstance(UpgradeCatalog200.class).persistHDPRepo();
easyMockSupport.verifyAll();
}
@Test
public void testRepositoryTable() {
final RepositoryInfo repositoryInfo1 = new RepositoryInfo();
repositoryInfo1.setOsType("redhat6");
repositoryInfo1.setRepoId("HDP-2.2");
repositoryInfo1.setBaseUrl("http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.2.6.0");
final RepositoryInfo repositoryInfo2 = new RepositoryInfo();
repositoryInfo2.setOsType("suse11");
repositoryInfo2.setRepoId("HDP-UTILS-1.1.0.20");
repositoryInfo2.setBaseUrl("http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/suse11sp3");
List<RepositoryInfo> repos = new ArrayList<RepositoryInfo>() {{
add(repositoryInfo1);
add(repositoryInfo2);
}};
String output = UpgradeCatalog200.repositoryTable(repos);
assertEquals(" redhat6 | HDP-2.2 | http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.2.6.0 \n" +
" suse11 | HDP-UTILS-1.1.0.20 | http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.20/repos/suse11sp3 \n",
output);
}
@Test
public void testUpdateClusterEnvConfiguration() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();
final AmbariManagementController mockAmbariManagementController = easyMockSupport.createStrictMock(AmbariManagementController.class);
final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class);
final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class);
final Cluster mockClusterExpected = easyMockSupport.createStrictMock(Cluster.class);
final Cluster mockClusterMissingSmokeUser = easyMockSupport.createStrictMock(Cluster.class);
final Cluster mockClusterMissingConfig = easyMockSupport.createStrictMock(Cluster.class);
final Config mockClusterEnvExpected = easyMockSupport.createStrictMock(Config.class);
final Config mockClusterEnvMissingSmokeUser = easyMockSupport.createStrictMock(Config.class);
final Map<String, String> propertiesExpectedT0 = new HashMap<>();
propertiesExpectedT0.put("kerberos_domain", "EXAMPLE.COM");
propertiesExpectedT0.put("user_group", "hadoop");
propertiesExpectedT0.put("kinit_path_local", "/usr/bin");
propertiesExpectedT0.put("security_enabled", "true");
propertiesExpectedT0.put("smokeuser", "ambari-qa");
propertiesExpectedT0.put("smokeuser_keytab", "/etc/security/keytabs/smokeuser.headless.keytab");
propertiesExpectedT0.put("ignore_groupsusers_create", "false");
final Map<String, String> propertiesExpectedT1 = new HashMap<>(propertiesExpectedT0);
propertiesExpectedT1.put("smokeuser_principal_name", "ambari-qa");
final Map<String, String> propertiesMissingSmokeUserT0 = new HashMap<>(propertiesExpectedT0);
propertiesMissingSmokeUserT0.remove("smokeuser");
final Map<String, String> propertiesMissingSmokeUserT1 = new HashMap<>(propertiesMissingSmokeUserT0);
propertiesMissingSmokeUserT1.put("smokeuser_principal_name", "ambari-qa");
final PropertyInfo mockSmokeUserPropertyInfo = easyMockSupport.createStrictMock(PropertyInfo.class);
final Injector mockInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(AmbariManagementController.class).toInstance(mockAmbariManagementController);
bind(ConfigHelper.class).toInstance(mockConfigHelper);
bind(Clusters.class).toInstance(mockClusters);
bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
}
});
expect(mockAmbariManagementController.getClusters()).andReturn(mockClusters).once();
expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
put("normal", mockClusterExpected);
put("missing_smokeuser", mockClusterMissingSmokeUser);
put("missing_cluster-env", mockClusterMissingConfig);
}}).once();
// Expected operation
expect(mockClusterExpected.getDesiredConfigByType("cluster-env")).andReturn(mockClusterEnvExpected).once();
expect(mockClusterEnvExpected.getProperties()).andReturn(propertiesExpectedT0).once();
mockConfigHelper.createConfigType(mockClusterExpected, mockAmbariManagementController,
"cluster-env", propertiesExpectedT1, UpgradeCatalog200.AUTHENTICATED_USER_NAME, "Upgrading to Ambari 2.0");
expectLastCall().once();
// Missing smokeuser
expect(mockClusterMissingSmokeUser.getDesiredConfigByType("cluster-env")).andReturn(mockClusterEnvMissingSmokeUser).once();
expect(mockClusterEnvMissingSmokeUser.getProperties()).andReturn(propertiesMissingSmokeUserT0).once();
expect(mockConfigHelper.getStackProperties(mockClusterMissingSmokeUser)).andReturn(Collections.singleton(mockSmokeUserPropertyInfo)).once();
expect(mockSmokeUserPropertyInfo.getFilename()).andReturn("cluster-env.xml").once();
expect(mockSmokeUserPropertyInfo.getValue()).andReturn("ambari-qa").once();
mockConfigHelper.createConfigType(mockClusterMissingSmokeUser, mockAmbariManagementController,
"cluster-env", propertiesMissingSmokeUserT1, UpgradeCatalog200.AUTHENTICATED_USER_NAME, "Upgrading to Ambari 2.0");
expectLastCall().once();
// Missing cluster-env config
expect(mockClusterMissingConfig.getDesiredConfigByType("cluster-env")).andReturn(null).once();
easyMockSupport.replayAll();
mockInjector.getInstance(UpgradeCatalog200.class).updateClusterEnvConfiguration();
easyMockSupport.verifyAll();
}
/**
* Tests that Nagios is correctly removed.
*
* @throws Exception
*/
@Test
public void testDeleteNagiosService() throws Exception {
UpgradeCatalog200 upgradeCatalog200 = injector.getInstance(UpgradeCatalog200.class);
ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO = injector.getInstance(ServiceComponentDesiredStateDAO.class);
HostComponentDesiredStateDAO hostComponentDesiredStateDAO = injector.getInstance(HostComponentDesiredStateDAO.class);
HostComponentStateDAO hostComponentStateDAO = injector.getInstance(HostComponentStateDAO.class);
ClusterServiceDAO clusterServiceDao = injector.getInstance(ClusterServiceDAO.class);
StackDAO stackDAO = injector.getInstance(StackDAO.class);
// inject AmbariMetaInfo to ensure that stacks get populated in the DB
injector.getInstance(AmbariMetaInfo.class);
StackEntity stackEntity = stackDAO.find(DESIRED_STACK.getStackName(),
DESIRED_STACK.getStackVersion());
assertNotNull(stackEntity);
final ClusterEntity clusterEntity = upgradeCatalogHelper.createCluster(
injector, CLUSTER_NAME, stackEntity);
final ClusterServiceEntity clusterServiceEntityNagios = upgradeCatalogHelper.addService(
injector, clusterEntity, "NAGIOS", stackEntity);
final HostEntity hostEntity = upgradeCatalogHelper.createHost(injector,
clusterEntity, HOST_NAME);
upgradeCatalogHelper.addComponent(injector, clusterEntity,
clusterServiceEntityNagios, hostEntity, "NAGIOS_SERVER", stackEntity);
ServiceComponentDesiredStateEntity serviceComponentDesiredStateEntity = serviceComponentDesiredStateDAO.findByName(
clusterEntity.getClusterId(), "NAGIOS", "NAGIOS_SERVER");
assertNotNull(serviceComponentDesiredStateEntity);
HostComponentDesiredStateEntity hcDesiredStateEntity = hostComponentDesiredStateDAO.findByIndex(
clusterEntity.getClusterId(),
"NAGIOS",
"NAGIOS_SERVER",
hostEntity.getHostId()
);
assertNotNull(hcDesiredStateEntity);
HostComponentStateEntity hcStateEntity = hostComponentStateDAO.findByIndex(
clusterEntity.getClusterId(), "NAGIOS", "NAGIOS_SERVER", hostEntity.getHostId());
assertNotNull(hcStateEntity);
ClusterServiceEntity clusterService = clusterServiceDao.findByClusterAndServiceNames(
CLUSTER_NAME, "NAGIOS");
upgradeCatalog200.removeNagiosService();
clusterService = clusterServiceDao.findByClusterAndServiceNames(
CLUSTER_NAME, "NAGIOS");
assertNull(clusterService);
}
/**
* @param dbAccessor
* @return
*/
private AbstractUpgradeCatalog getUpgradeCatalog(final DBAccessor dbAccessor) {
Module module = new Module() {
@Override
public void configure(Binder binder) {
binder.bind(DBAccessor.class).toInstance(dbAccessor);
binder.bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
}
};
Injector injector = Guice.createInjector(module);
return injector.getInstance(UpgradeCatalog200.class);
}
/**
* Verifies new ignore column for alert definition.
*
* @param alertDefinitionIgnoreColumnCapture
*/
private void verifyAlertDefinitionIgnoreColumn(
Capture<DBAccessor.DBColumnInfo> alertDefinitionIgnoreColumnCapture) {
DBColumnInfo column = alertDefinitionIgnoreColumnCapture.getValue();
Assert.assertEquals(Integer.valueOf(0), column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(1), column.getLength());
Assert.assertEquals(Short.class, column.getType());
Assert.assertEquals("ignore_host", column.getName());
}
/**
* Verifies new description column for alert definition.
*
* @param alertDefinitionDescriptionColumnCapture
*/
private void verifyAlertDefinitionDescriptionColumn(
Capture<DBAccessor.DBColumnInfo> alertDefinitionDescriptionColumnCapture) {
DBColumnInfo column = alertDefinitionDescriptionColumnCapture.getValue();
Assert.assertEquals(null, column.getDefaultValue());
Assert.assertEquals(char[].class, column.getType());
Assert.assertEquals("description", column.getName());
}
/**
* Verifies alert_target_states table.
*
* @param alertTargetStatesCapture
*/
private void verifyAlertTargetStatesTable(
Capture<List<DBAccessor.DBColumnInfo>> alertTargetStatesCapture) {
Assert.assertEquals(2, alertTargetStatesCapture.getValue().size());
}
/**
* Verifies is_global added to alert target table.
*
* @param alertTargetGlobalCapture
*/
private void verifyAlertTargetGlobal(
Capture<DBAccessor.DBColumnInfo> alertTargetGlobalCapture) {
DBColumnInfo column = alertTargetGlobalCapture.getValue();
Assert.assertEquals(0, column.getDefaultValue());
Assert.assertEquals(Short.class, column.getType());
Assert.assertEquals("is_global", column.getName());
}
/**
* Verifies new security_state column in servicedesiredsstate table.
*
* @param securityStateColumnCapture
*/
private void verifyServiceSecurityStateColumn(
Capture<DBAccessor.DBColumnInfo> securityStateColumnCapture) {
DBColumnInfo column = securityStateColumnCapture.getValue();
Assert.assertEquals(SecurityState.UNSECURED.toString(), column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(32), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("security_state", column.getName());
}
/**
* Verifies new security_type column in clusters table
*
* @param securityTypeColumnCapture
*/
private void verifyClustersSecurityType(
Capture<DBAccessor.DBColumnInfo> securityTypeColumnCapture) {
DBColumnInfo column = securityTypeColumnCapture.getValue();
Assert.assertEquals(SecurityType.NONE.toString(), column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(32), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("security_type", column.getName());
}
/**
* Verifies new security_state column in hostcomponentdesiredstate and hostcomponentstate tables
*
* @param securityStateColumnCapture
*/
private void verifyComponentSecurityStateColumn(
Capture<DBAccessor.DBColumnInfo> securityStateColumnCapture) {
DBColumnInfo column = securityStateColumnCapture.getValue();
Assert.assertEquals(SecurityState.UNSECURED.toString(), column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(32), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("security_state", column.getName());
}
private void verifyViewParameterColumns(
Capture<DBAccessor.DBColumnInfo> labelColumnCapture,
Capture<DBAccessor.DBColumnInfo> placeholderColumnCapture,
Capture<DBAccessor.DBColumnInfo> defaultValueColumnCapture) {
DBColumnInfo column = labelColumnCapture.getValue();
assertNull(column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(255), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("label", column.getName());
column = placeholderColumnCapture.getValue();
assertNull(column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(255), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("placeholder", column.getName());
column = defaultValueColumnCapture.getValue();
assertNull(column.getDefaultValue());
Assert.assertEquals(Integer.valueOf(2000), column.getLength());
Assert.assertEquals(String.class, column.getType());
Assert.assertEquals("default_value", column.getName());
}
@Test
public void testGetSourceVersion() {
final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);
UpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
Assert.assertEquals(null, upgradeCatalog.getSourceVersion());
}
@Test
public void testGetTargetVersion() throws Exception {
final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);
UpgradeCatalog upgradeCatalog = getUpgradeCatalog(dbAccessor);
Assert.assertEquals("2.0.0", upgradeCatalog.getTargetVersion());
}
private void setViewInstancePropertyExpectations(DBAccessor dbAccessor,
Capture<DBAccessor.DBColumnInfo> valueColumnCapture)
throws SQLException {
dbAccessor.alterColumn(eq("viewinstanceproperty"), capture(valueColumnCapture));
}
private void setViewInstanceDataExpectations(DBAccessor dbAccessor,
Capture<DBAccessor.DBColumnInfo> dataValueColumnCapture)
throws SQLException {
dbAccessor.alterColumn(eq("viewinstancedata"), capture(dataValueColumnCapture));
}
private void assertViewInstancePropertyColumns(
Capture<DBAccessor.DBColumnInfo> valueColumnCapture) {
DBAccessor.DBColumnInfo column = valueColumnCapture.getValue();
assertEquals("value", column.getName());
assertEquals(2000, (int) column.getLength());
assertEquals(String.class, column.getType());
assertNull(column.getDefaultValue());
assertTrue(column.isNullable());
}
private void assertViewInstanceDataColumns(
Capture<DBAccessor.DBColumnInfo> dataValueColumnCapture) {
DBAccessor.DBColumnInfo column = dataValueColumnCapture.getValue();
assertEquals("value", column.getName());
assertEquals(2000, (int) column.getLength());
assertEquals(String.class, column.getType());
assertNull(column.getDefaultValue());
assertTrue(column.isNullable());
}
/**
* assert artifact table creation
*
* @param artifactColumns artifact table columns
*/
private void testCreateArtifactTable(List<DBColumnInfo> artifactColumns) {
assertEquals(3, artifactColumns.size());
for (DBColumnInfo column : artifactColumns) {
if (column.getName().equals("artifact_name")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(false, column.isNullable());
} else if (column.getName().equals("foreign_keys")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(false, column.isNullable());
} else if (column.getName().equals("artifact_data")) {
assertNull(column.getDefaultValue());
assertEquals(char[].class, column.getType());
assertEquals(false, column.isNullable());
} else {
fail("unexpected column name");
}
}
}
private void testCreateKerberosPrincipalTable(List<DBColumnInfo> columns) {
assertEquals(3, columns.size());
for (DBColumnInfo column : columns) {
if (column.getName().equals("principal_name")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(false, column.isNullable());
} else if (column.getName().equals("is_service")) {
assertEquals(1, column.getDefaultValue());
assertEquals(Short.class, column.getType());
assertEquals(1, (int) column.getLength());
assertEquals(false, column.isNullable());
} else if (column.getName().equals("cached_keytab_path")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(true, column.isNullable());
} else {
fail("unexpected column name");
}
}
}
private void testCreateKerberosPrincipalHostTable(List<DBColumnInfo> columns) {
assertEquals(2, columns.size());
for (DBColumnInfo column : columns) {
if (column.getName().equals("principal_name")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(false, column.isNullable());
} else if (column.getName().equals("host_name")) {
assertNull(column.getDefaultValue());
assertEquals(String.class, column.getType());
assertEquals(255, (int) column.getLength());
assertEquals(false, column.isNullable());
} else {
fail("unexpected column name");
}
}
}
}