Repository: ambari Updated Branches: refs/heads/trunk c877445e4 -> 81280ea39
http://git-wip-us.apache.org/repos/asf/ambari/blob/81280ea3/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java index 15234db..f8f47c7 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog213Test.java @@ -27,10 +27,12 @@ import com.google.inject.Provider; import com.google.inject.persist.PersistService; import org.apache.ambari.server.AmbariException; 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.GuiceJpaInitializer; import org.apache.ambari.server.orm.InMemoryDefaultTestModule; +import org.apache.ambari.server.orm.dao.DaoUtils; import org.apache.ambari.server.orm.dao.StackDAO; import org.apache.ambari.server.orm.entities.StackEntity; import org.apache.ambari.server.state.Cluster; @@ -40,7 +42,10 @@ import org.apache.ambari.server.state.ConfigHelper; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.stack.OsFamily; +import org.easymock.Capture; +import org.easymock.EasyMock; import org.easymock.EasyMockSupport; +import org.easymock.IMocksControl; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -50,9 +55,11 @@ import javax.persistence.EntityManager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; -import java.util.HashSet; +import java.util.List; import java.util.Map; +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; @@ -72,6 +79,8 @@ public class UpgradeCatalog213Test { private UpgradeCatalogHelper upgradeCatalogHelper; private StackEntity desiredStackEntity; + private IMocksControl mocksControl = EasyMock.createControl(); + @Before public void init() { reset(entityManagerProvider); @@ -211,7 +220,7 @@ public class UpgradeCatalog213Test { expect(mockClusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{ put("normal", mockClusterExpected); }}).atLeastOnce(); - expect(mockClusterExpected.getCurrentStackVersion()).andReturn(new StackId("HDP","2.2")); + expect(mockClusterExpected.getCurrentStackVersion()).andReturn(new StackId("HDP", "2.2")); expect(mockClusterExpected.getDesiredConfigByType("hbase-env")).andReturn(mockHbaseEnv).atLeastOnce(); expect(mockHbaseEnv.getProperties()).andReturn(propertiesHbaseEnv).atLeastOnce(); @@ -225,7 +234,7 @@ public class UpgradeCatalog213Test { @Test public void testUpdateHDFSConfiguration() throws Exception { EasyMockSupport easyMockSupport = new EasyMockSupport(); - final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); + final AmbariManagementController mockAmbariManagementController = easyMockSupport.createNiceMock(AmbariManagementController.class); final ConfigHelper mockConfigHelper = easyMockSupport.createMock(ConfigHelper.class); final Clusters mockClusters = easyMockSupport.createStrictMock(Clusters.class); @@ -269,29 +278,29 @@ public class UpgradeCatalog213Test { Method updateAmsHbaseEnvContent = UpgradeCatalog213.class.getDeclaredMethod("updateAmsHbaseEnvContent", String.class); UpgradeCatalog213 upgradeCatalog213 = new UpgradeCatalog213(injector); String oldContent = "export HBASE_CLASSPATH=${HBASE_CLASSPATH}\n" + - "\n" + - "# The maximum amount of heap to use, in MB. Default is 1000.\n" + - "export HBASE_HEAPSIZE={{hbase_heapsize}}\n" + - "\n" + - "{% if java_version < 8 %}\n" + - "export HBASE_MASTER_OPTS=\" -XX:PermSize=64m -XX:MaxPermSize={{hbase_master_maxperm_size}} -Xms{{hbase_heapsize}} -Xmx{{hbase_heapsize}} -Xmn{{hbase_master_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + - "export HBASE_REGIONSERVER_OPTS=\"-XX:MaxPermSize=128m -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}}\"\n" + - "{% else %}\n" + - "export HBASE_MASTER_OPTS=\" -Xms{{hbase_heapsize}} -Xmx{{hbase_heapsize}} -Xmn{{hbase_master_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + - "export HBASE_REGIONSERVER_OPTS=\" -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}}\"\n" + - "{% endif %}\n"; + "\n" + + "# The maximum amount of heap to use, in MB. Default is 1000.\n" + + "export HBASE_HEAPSIZE={{hbase_heapsize}}\n" + + "\n" + + "{% if java_version < 8 %}\n" + + "export HBASE_MASTER_OPTS=\" -XX:PermSize=64m -XX:MaxPermSize={{hbase_master_maxperm_size}} -Xms{{hbase_heapsize}} -Xmx{{hbase_heapsize}} -Xmn{{hbase_master_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + + "export HBASE_REGIONSERVER_OPTS=\"-XX:MaxPermSize=128m -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}}\"\n" + + "{% else %}\n" + + "export HBASE_MASTER_OPTS=\" -Xms{{hbase_heapsize}} -Xmx{{hbase_heapsize}} -Xmn{{hbase_master_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + + "export HBASE_REGIONSERVER_OPTS=\" -Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}}\"\n" + + "{% endif %}\n"; String expectedContent = "export HBASE_CLASSPATH=${HBASE_CLASSPATH}\n" + - "\n" + - "# The maximum amount of heap to use, in MB. Default is 1000.\n" + - "export HBASE_HEAPSIZE={{hbase_heapsize}}m\n" + - "\n" + - "{% if java_version < 8 %}\n" + - "export HBASE_MASTER_OPTS=\" -XX:PermSize=64m -XX:MaxPermSize={{hbase_master_maxperm_size}}m -Xms{{hbase_heapsize}}m -Xmx{{hbase_heapsize}}m -Xmn{{hbase_master_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + - "export HBASE_REGIONSERVER_OPTS=\"-XX:MaxPermSize=128m -Xmn{{regionserver_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}}m -Xmx{{regionserver_heapsize}}m\"\n" + - "{% else %}\n" + - "export HBASE_MASTER_OPTS=\" -Xms{{hbase_heapsize}}m -Xmx{{hbase_heapsize}}m -Xmn{{hbase_master_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + - "export HBASE_REGIONSERVER_OPTS=\" -Xmn{{regionserver_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}}m -Xmx{{regionserver_heapsize}}m\"\n" + - "{% endif %}\n"; + "\n" + + "# The maximum amount of heap to use, in MB. Default is 1000.\n" + + "export HBASE_HEAPSIZE={{hbase_heapsize}}m\n" + + "\n" + + "{% if java_version < 8 %}\n" + + "export HBASE_MASTER_OPTS=\" -XX:PermSize=64m -XX:MaxPermSize={{hbase_master_maxperm_size}}m -Xms{{hbase_heapsize}}m -Xmx{{hbase_heapsize}}m -Xmn{{hbase_master_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + + "export HBASE_REGIONSERVER_OPTS=\"-XX:MaxPermSize=128m -Xmn{{regionserver_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}}m -Xmx{{regionserver_heapsize}}m\"\n" + + "{% else %}\n" + + "export HBASE_MASTER_OPTS=\" -Xms{{hbase_heapsize}}m -Xmx{{hbase_heapsize}}m -Xmn{{hbase_master_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly\"\n" + + "export HBASE_REGIONSERVER_OPTS=\" -Xmn{{regionserver_xmn_size}}m -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -Xms{{regionserver_heapsize}}m -Xmx{{regionserver_heapsize}}m\"\n" + + "{% endif %}\n"; String result = (String) updateAmsHbaseEnvContent.invoke(upgradeCatalog213, oldContent); Assert.assertEquals(expectedContent, result); } @@ -301,9 +310,9 @@ public class UpgradeCatalog213Test { Method updateAmsEnvContent = UpgradeCatalog213.class.getDeclaredMethod("updateAmsEnvContent", String.class); UpgradeCatalog213 upgradeCatalog213 = new UpgradeCatalog213(injector); String oldContent = "# AMS Collector heapsize\n" + - "export AMS_COLLECTOR_HEAPSIZE={{metrics_collector_heapsize}}\n"; + "export AMS_COLLECTOR_HEAPSIZE={{metrics_collector_heapsize}}\n"; String expectedContent = "# AMS Collector heapsize\n" + - "export AMS_COLLECTOR_HEAPSIZE={{metrics_collector_heapsize}}m\n"; + "export AMS_COLLECTOR_HEAPSIZE={{metrics_collector_heapsize}}m\n"; String result = (String) updateAmsEnvContent.invoke(upgradeCatalog213, oldContent); Assert.assertEquals(expectedContent, result); } @@ -365,18 +374,18 @@ public class UpgradeCatalog213Test { public void testModifyJournalnodeProcessAlertSource() throws Exception { UpgradeCatalog213 upgradeCatalog213 = new UpgradeCatalog213(injector); String alertSource = "{\"uri\":\"{{hdfs-site/dfs.journalnode.http-address}}\",\"default_port\":8480," + - "\"type\":\"PORT\",\"reporting\":{\"ok\":{\"text\":\"TCP OK - {0:.3f}s response on port {1}\"}," + - "\"warning\":{\"text\":\"TCP OK - {0:.3f}s response on port {1}\",\"value\":1.5}," + - "\"critical\":{\"text\":\"Connection failed: {0} to {1}:{2}\",\"value\":5.0}}}"; + "\"type\":\"PORT\",\"reporting\":{\"ok\":{\"text\":\"TCP OK - {0:.3f}s response on port {1}\"}," + + "\"warning\":{\"text\":\"TCP OK - {0:.3f}s response on port {1}\",\"value\":1.5}," + + "\"critical\":{\"text\":\"Connection failed: {0} to {1}:{2}\",\"value\":5.0}}}"; String expected = "{\"reporting\":{\"ok\":{\"text\":\"HTTP {0} response in {2:.3f}s\"}," + - "\"warning\":{\"text\":\"HTTP {0} response from {1} in {2:.3f}s ({3})\"}," + - "\"critical\":{\"text\":\"Connection failed to {1} ({3})\"}},\"type\":\"WEB\"," + - "\"uri\":{\"http\":\"{{hdfs-site/dfs.journalnode.http-address}}\"," + - "\"https\":\"{{hdfs-site/dfs.journalnode.https-address}}\"," + - "\"kerberos_keytab\":\"{{hdfs-site/dfs.web.authentication.kerberos.keytab}}\"," + - "\"kerberos_principal\":\"{{hdfs-site/dfs.web.authentication.kerberos.principal}}\"," + - "\"https_property\":\"{{hdfs-site/dfs.http.policy}}\"," + - "\"https_property_value\":\"HTTPS_ONLY\",\"connection_timeout\":5.0}}"; + "\"warning\":{\"text\":\"HTTP {0} response from {1} in {2:.3f}s ({3})\"}," + + "\"critical\":{\"text\":\"Connection failed to {1} ({3})\"}},\"type\":\"WEB\"," + + "\"uri\":{\"http\":\"{{hdfs-site/dfs.journalnode.http-address}}\"," + + "\"https\":\"{{hdfs-site/dfs.journalnode.https-address}}\"," + + "\"kerberos_keytab\":\"{{hdfs-site/dfs.web.authentication.kerberos.keytab}}\"," + + "\"kerberos_principal\":\"{{hdfs-site/dfs.web.authentication.kerberos.principal}}\"," + + "\"https_property\":\"{{hdfs-site/dfs.http.policy}}\"," + + "\"https_property_value\":\"HTTPS_ONLY\",\"connection_timeout\":5.0}}"; Assert.assertEquals(expected, upgradeCatalog213.modifyJournalnodeProcessAlertSource(alertSource)); } @@ -460,4 +469,48 @@ public class UpgradeCatalog213Test { Assert.assertEquals("2.1.3", upgradeCatalog.getTargetVersion()); } + + @Test + public void testShouldDDLsBeExecutedOnUpgrade() throws Exception { + // GIVEN + Injector mockedInjector = mocksControl.createMock(Injector.class); + DBAccessor mockedDbAccessor = mocksControl.createMock(DBAccessor.class); + DaoUtils mockedDaoUtils = mocksControl.createMock(DaoUtils.class); + Configuration mockedConfiguration = mocksControl.createMock(Configuration.class); + StackUpgradeUtil mockedStackUpgradeUtil = mocksControl.createMock(StackUpgradeUtil.class); + + Capture<String> capturedTableName = EasyMock.newCapture(); + Capture<String> capturedPKColumn = EasyMock.newCapture(); + Capture<List<DBAccessor.DBColumnInfo>> capturedColumns = EasyMock.newCapture(); + + EasyMock.expect(mockedInjector.getInstance(DaoUtils.class)).andReturn(mockedDaoUtils); + mockedInjector.injectMembers(anyObject(UpgradeCatalog.class)); + EasyMock.expect(mockedConfiguration.getDatabaseType()).andReturn(Configuration.DatabaseType.POSTGRES).times(2); + EasyMock.expect(mockedConfiguration.getDatabaseUser()).andReturn("ambari"); + EasyMock.expect(mockedConfiguration.getServerJDBCPostgresSchemaName()).andReturn("fo"); + + mockedDbAccessor.executeQuery("ALTER SCHEMA fo OWNER TO \"ambari\";"); + mockedDbAccessor.executeQuery("ALTER ROLE \"ambari\" SET search_path to 'fo';"); + mockedDbAccessor.createTable(capture(capturedTableName), capture(capturedColumns), capture(capturedPKColumn)); + + mocksControl.replay(); + + UpgradeCatalog213 testSubject = new UpgradeCatalog213(mockedInjector); + EasyMockSupport.injectMocks(testSubject); + + //todo refactor the DI approach, don't directly access these members!!! + testSubject.stackUpgradeUtil = mockedStackUpgradeUtil; + testSubject.dbAccessor = mockedDbAccessor; + testSubject.configuration = mockedConfiguration; + + // WHEN + testSubject.upgradeSchema(); + + // THEN + Assert.assertEquals("The table name is wrong!", "kerberos_descriptor", capturedTableName.getValue()); + Assert.assertEquals("The primary key is wrong!", "kerberos_descriptor_name", capturedPKColumn.getValue()); + Assert.assertTrue("Ther number of columns is wrong!", capturedColumns.getValue().size() == 2); + + } + }
