Repository: ambari Updated Branches: refs/heads/branch-2.5 49f58e840 -> 1b9073539
AMBARI-18631. Incorporate database consistency check into main Ambari process.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1b907353 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1b907353 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1b907353 Branch: refs/heads/branch-2.5 Commit: 1b907353991e8382ff47e30a5cb130412a6e3b08 Parents: 49f58e8 Author: Vitaly Brodetskyi <[email protected]> Authored: Fri Oct 21 11:12:42 2016 +0300 Committer: Vitaly Brodetskyi <[email protected]> Committed: Fri Oct 21 11:12:42 2016 +0300 ---------------------------------------------------------------------- .../checks/DatabaseConsistencyCheckHelper.java | 54 ++++---- .../checks/DatabaseConsistencyChecker.java | 16 +-- .../ambari/server/controller/AmbariServer.java | 51 ++++++-- .../src/main/python/ambari_server_main.py | 25 ++-- .../DatabaseConsistencyCheckHelperTest.java | 7 +- .../server/controller/AmbariServerTest.java | 129 ++++++++++++++++++- 6 files changed, 212 insertions(+), 70 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java index 2d91eca..c60bf20 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java @@ -60,31 +60,23 @@ public class DatabaseConsistencyCheckHelper { private static DBAccessor dbAccessor; - private static boolean errorAvailable = false; - private static boolean warningAvailable = false; + private static boolean errorsFound = false; + private static boolean warningsFound = false; - public static boolean isErrorAvailable() { - return errorAvailable; + public static boolean ifErrorsFound() { + return errorsFound; } - public static void setErrorAvailable(boolean errorAvailable) { - errorAvailable = errorAvailable; - } - - public static boolean isWarningAvailable() { - return warningAvailable; - } - - public static void setWarningAvailable(boolean warningAvailable) { - warningAvailable = warningAvailable; + public static boolean ifWarningsFound() { + return warningsFound; } public static void resetErrorWarningFlags() { - errorAvailable = false; - warningAvailable = false; + errorsFound = false; + warningsFound = false; } - protected static void setInjector(Injector injector) { + public static void setInjector(Injector injector) { DatabaseConsistencyCheckHelper.injector = injector; // Clean up: new injector means static fields should be reinitalized, though in real life it only occurs during testing closeConnection(); @@ -111,6 +103,16 @@ public class DatabaseConsistencyCheckHelper { } } + public static void runAllDBChecks() { + LOG.info("******************************* Check database started *******************************"); + checkForNotMappedConfigsToCluster(); + checkForConfigsSelectedMoreThanOnce(); + checkForHostsWithoutState(); + checkHostComponentStatesCountEqualsHostComponentsDesiredStates(); + checkServiceConfigs(); + LOG.info("******************************* Check database completed *******************************"); + } + public static void checkDBVersionCompatible() throws AmbariException { LOG.info("Checking DB store version"); @@ -175,7 +177,7 @@ public class DatabaseConsistencyCheckHelper { } if (!nonSelectedConfigs.isEmpty()) { LOG.warn("You have config(s): {} that is(are) not mapped (in clusterconfigmapping table) to any cluster!", StringUtils.join(nonSelectedConfigs, ",")); - warningAvailable = true; + warningsFound = true; } } catch (SQLException e) { LOG.error("Exception occurred during check for not mapped configs to cluster procedure: ", e); @@ -233,7 +235,7 @@ public class DatabaseConsistencyCheckHelper { for (String clusterName : clusterConfigTypeMap.keySet()) { LOG.error("You have config(s), in cluster {}, that is(are) selected more than once in clusterconfigmapping table: {}", clusterName ,StringUtils.join(clusterConfigTypeMap.get(clusterName), ",")); - errorAvailable = true; + errorsFound = true; } } @@ -288,7 +290,7 @@ public class DatabaseConsistencyCheckHelper { if (!hostsWithoutStatus.isEmpty()) { LOG.error("You have host(s) without state (in hoststate table): " + StringUtils.join(hostsWithoutStatus, ",")); - errorAvailable = true; + errorsFound = true; } } @@ -365,7 +367,7 @@ public class DatabaseConsistencyCheckHelper { if (hostComponentStateCount != hostComponentDesiredStateCount || hostComponentStateCount != mergedCount) { LOG.error("Your host component states (hostcomponentstate table) count not equals host component desired states (hostcomponentdesiredstate table) count!"); - errorAvailable = true; + errorsFound = true; } } catch (SQLException e) { @@ -455,7 +457,7 @@ public class DatabaseConsistencyCheckHelper { for (String clusterName : clusterServiceMap.keySet()) { LOG.warn("Service(s): {}, from cluster {} has no config(s) in serviceconfig table!", StringUtils.join(clusterServiceMap.get(clusterName), ","), clusterName); - warningAvailable = true; + warningsFound = true; } } @@ -482,7 +484,7 @@ public class DatabaseConsistencyCheckHelper { Multimap<String, String> serviceVersion = clusterServiceVersionMap.get(clName); for (String servName : serviceVersion.keySet()) { LOG.error("In cluster {}, service config mapping is unavailable (in table serviceconfigmapping) for service {} with version(s) {}! ", clName, servName, StringUtils.join(serviceVersion.get(servName), ",")); - errorAvailable = true; + errorsFound = true; } } @@ -555,7 +557,7 @@ public class DatabaseConsistencyCheckHelper { } else { LOG.warn("Service {} is not available for stack {} in cluster {}", serviceName, stackName + "-" + stackVersion, clusterName); - warningAvailable = true; + warningsFound = true; } } @@ -573,7 +575,7 @@ public class DatabaseConsistencyCheckHelper { if (!serviceConfigsFromStack.isEmpty()) { LOG.error("Required config(s): {} is(are) not available for service {} with service config version {} in cluster {}", StringUtils.join(serviceConfigsFromStack, ","), serviceName, Integer.toString(serviceVersion), clusterName); - errorAvailable = true; + errorsFound = true; } } } @@ -610,7 +612,7 @@ public class DatabaseConsistencyCheckHelper { Multimap<String, String> serviceConfig = clusterServiceConfigType.get(clusterName); for (String serviceName : serviceConfig.keySet()) { LOG.error("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName); - errorAvailable = true; + errorsFound = true; } } } catch (SQLException e) { http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java index 535d74f..f979b7e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java @@ -97,37 +97,27 @@ public class DatabaseConsistencyChecker { public static void main(String[] args) throws Exception { DatabaseConsistencyChecker databaseConsistencyChecker = null; try { - LOG.info("******************************* Check database started *******************************"); Injector injector = Guice.createInjector(new CheckHelperControllerModule(), new CheckHelperAuditModule()); databaseConsistencyChecker = injector.getInstance(DatabaseConsistencyChecker.class); databaseConsistencyChecker.startPersistenceService(); - DatabaseConsistencyCheckHelper.checkForNotMappedConfigsToCluster(); - - DatabaseConsistencyCheckHelper.checkForConfigsSelectedMoreThanOnce(); - - DatabaseConsistencyCheckHelper.checkForHostsWithoutState(); - - DatabaseConsistencyCheckHelper.checkHostComponentStatesCountEqualsHostComponentsDesiredStates(); - - DatabaseConsistencyCheckHelper.checkServiceConfigs(); + DatabaseConsistencyCheckHelper.runAllDBChecks(); databaseConsistencyChecker.stopPersistenceService(); - LOG.info("******************************* Check database completed *******************************"); } catch (Throwable e) { if (e instanceof AmbariException) { LOG.error("Exception occurred during database check:", e); throw (AmbariException)e; - }else{ + } else { LOG.error("Unexpected error, database check failed", e); throw new Exception("Unexpected error, database check failed", e); } } finally { DatabaseConsistencyCheckHelper.closeConnection(); - if (DatabaseConsistencyCheckHelper.isErrorAvailable()) { + if (DatabaseConsistencyCheckHelper.ifErrorsFound()) { String ambariDBConsistencyCheckLog = "ambari-server-check-database.log"; if (LOG instanceof Log4jLoggerAdapter) { org.apache.log4j.Logger dbConsistencyCheckHelperLogger = org.apache.log4j.Logger.getLogger(DatabaseConsistencyCheckHelper.class); http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java index a9c8fd0..c1ba7f5 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java @@ -19,6 +19,9 @@ package org.apache.ambari.server.controller; +import javax.crypto.BadPaddingException; +import javax.servlet.DispatcherType; + import java.io.File; import java.io.IOException; import java.net.Authenticator; @@ -28,13 +31,8 @@ import java.net.URL; import java.util.EnumSet; import java.util.Enumeration; import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.logging.LogManager; -import javax.crypto.BadPaddingException; -import javax.servlet.DispatcherType; - import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.StateRecoveryManager; import org.apache.ambari.server.StaticallyInject; @@ -147,7 +145,6 @@ import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.filter.DelegatingFilterProxy; -import com.google.common.base.Joiner; import com.google.common.util.concurrent.ServiceManager; import com.google.gson.Gson; import com.google.inject.Guice; @@ -159,6 +156,7 @@ import com.google.inject.name.Named; import com.google.inject.persist.Transactional; import com.sun.jersey.spi.container.servlet.ServletContainer; + @Singleton public class AmbariServer { public static final String VIEWS_URL_PATTERN = "/api/v1/views/*"; @@ -303,6 +301,8 @@ public class AmbariServer { setSystemProperties(configs); + runDatabaseConsistencyCheck(); + try { ClassPathXmlApplicationContext parentSpringAppContext = new ClassPathXmlApplicationContext(); @@ -639,6 +639,39 @@ public class AmbariServer { } /** + * this method executes database consistency check if skip option was not added + */ + protected void runDatabaseConsistencyCheck() throws Exception { + if (System.getProperty("skipDatabaseConsistencyCheck") == null) { + System.out.println("Database consistency check started"); + Logger DB_CHECK_LOG = LoggerFactory.getLogger(DatabaseConsistencyCheckHelper.class); + try{ + DatabaseConsistencyCheckHelper.runAllDBChecks(); + } catch(Throwable e) { + System.out.println("Database consistency check: failed"); + if (e instanceof AmbariException) { + DB_CHECK_LOG.error("Exception occurred during database check:", e); + System.out.println("Exception occurred during database check: " + e.getMessage()); + e.printStackTrace(); + throw (AmbariException)e; + } else { + DB_CHECK_LOG.error("Unexpected error, database check failed", e); + System.out.println("Unexpected error, database check failed: " + e.getMessage()); + e.printStackTrace(); + throw new Exception("Unexpected error, database check failed", e); + } + } finally { + if (DatabaseConsistencyCheckHelper.ifErrorsFound()) { + System.out.println("Database consistency check: failed"); + System.exit(1); + } else { + System.out.println("Database consistency check: successful"); + } + } + } + } + + /** * installs bridge handler which redirects log entries from JUL to Slf4J */ private void setupJulLogging() { @@ -753,9 +786,9 @@ public class AmbariServer { gzipFilter.setInitParameter("methods", "GET,POST,PUT,DELETE"); gzipFilter.setInitParameter("mimeTypes", - "text/html,text/plain,text/xml,text/css,application/x-javascript," + - "application/xml,application/x-www-form-urlencoded," + - "application/javascript,application/json"); + "text/html,text/plain,text/xml,text/css,application/x-javascript," + + "application/xml,application/x-www-form-urlencoded," + + "application/javascript,application/json"); gzipFilter.setInitParameter("minGzipSize", configs.getApiGzipMinSize()); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/main/python/ambari_server_main.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/python/ambari_server_main.py b/ambari-server/src/main/python/ambari_server_main.py index 57ec58d..313ff66 100644 --- a/ambari-server/src/main/python/ambari_server_main.py +++ b/ambari-server/src/main/python/ambari_server_main.py @@ -102,7 +102,7 @@ SERVER_START_CMD_DEBUG_WINDOWS = "{0} " \ "org.apache.ambari.server.controller.AmbariServer" SERVER_INIT_TIMEOUT = 5 -SERVER_START_TIMEOUT = 10 +SERVER_START_TIMEOUT = 30 SERVER_PING_TIMEOUT_WINDOWS = 5 SERVER_PING_ATTEMPTS_WINDOWS = 4 @@ -207,6 +207,15 @@ def wait_for_server_start(pidFile, scmStatus): sys.stdout.write('\n') sys.stdout.flush() + if 'Database consistency check: failed' in open(configDefaults.SERVER_OUT_FILE).read(): + print "DB configs consistency check failed. Run \"ambari-server start --skip-database-check\" to skip. " \ + "If you use this \"--skip-database-check\" option, do not make any changes to your cluster topology " \ + "or perform a cluster upgrade until you correct the database consistency issues. See " + \ + configDefaults.DB_CHECK_LOG + "for more details on the consistency issues." + else: + print "DB consistency check: no errors were found." + + if found_pids <= 0: exitcode = check_exitcode(os.path.join(configDefaults.PID_DIR, EXITCODE_NAME)) raise FatalException(-1, AMBARI_SERVER_DIE_MSG.format(exitcode, configDefaults.SERVER_OUT_FILE)) @@ -312,20 +321,6 @@ def server_process_main(options, scmStatus=None): else: print "Ambari database consistency check started..." properties.process_pair(CHECK_DATABASE_SKIPPED_PROPERTY, "false") - command = CHECK_DATABASE_HELPER_CMD.format(java_exe, class_path) - - (retcode, stdout, stderr) = run_os_command(command, env=environ) - - if retcode > 0: - print str(stdout) - raise FatalException(1, 'Database check failed to complete. Please check ' + configDefaults.SERVER_LOG_FILE + - ' and ' + configDefaults.DB_CHECK_LOG + ' for more information.') - else: - print str(stdout) - print "Ambari database consistency check finished" - - if not stdout.startswith("No errors"): - sys.exit(1) update_properties(properties) param_list = generate_child_process_param_list(ambari_user, java_exe, class_path, debug_start, suspend_mode) http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java index 4663310..f45d480 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java @@ -19,6 +19,7 @@ package org.apache.ambari.server.checks; import javax.persistence.EntityManager; +import junit.framework.Assert; import static org.easymock.EasyMock.expect; import java.sql.Connection; @@ -27,7 +28,6 @@ import java.sql.Statement; import java.util.HashMap; import java.util.Map; -import junit.framework.Assert; import org.apache.ambari.server.api.services.AmbariMetaInfo; import org.apache.ambari.server.orm.DBAccessor; import org.apache.ambari.server.stack.StackManagerFactory; @@ -35,7 +35,6 @@ import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.ServiceInfo; import org.apache.ambari.server.state.stack.OsFamily; import org.easymock.EasyMockSupport; -import org.junit.Ignore; import org.junit.Test; import com.google.inject.AbstractModule; @@ -380,8 +379,8 @@ public class DatabaseConsistencyCheckHelperTest { easyMockSupport.verifyAll(); Assert.assertTrue("Missing service config for OPENSOFT R should have triggered a warning.", - DatabaseConsistencyCheckHelper.isWarningAvailable()); - Assert.assertFalse("No errors should have been triggered.", DatabaseConsistencyCheckHelper.isErrorAvailable()); + DatabaseConsistencyCheckHelper.ifWarningsFound()); + Assert.assertFalse("No errors should have been triggered.", DatabaseConsistencyCheckHelper.ifErrorsFound()); } http://git-wip-us.apache.org/repos/asf/ambari/blob/1b907353/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java index 54f6147..45e319a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariServerTest.java @@ -18,7 +18,11 @@ package org.apache.ambari.server.controller; +import javax.persistence.EntityManager; +import javax.servlet.DispatcherType; +import javax.servlet.SessionCookieConfig; import static org.easymock.EasyMock.anyObject; +import static org.easymock.EasyMock.anyString; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; @@ -27,17 +31,24 @@ import static org.easymock.EasyMock.verify; import java.net.Authenticator; import java.net.InetAddress; import java.net.PasswordAuthentication; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.Statement; import java.util.EnumSet; -import javax.servlet.DispatcherType; -import javax.servlet.SessionCookieConfig; - import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.api.services.AmbariMetaInfo; +import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper; import org.apache.ambari.server.configuration.Configuration; +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.stack.StackManagerFactory; +import org.apache.ambari.server.state.Clusters; +import org.apache.ambari.server.state.stack.OsFamily; import org.apache.velocity.app.Velocity; import org.easymock.EasyMock; +import org.easymock.EasyMockSupport; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.SessionManager; import org.eclipse.jetty.servlet.FilterHolder; @@ -49,6 +60,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; @@ -191,4 +203,115 @@ public class AmbariServerTest { Assert.assertEquals(52, ((QueuedThreadPool) server.getThreadPool()).getMaxThreads()); } + + @Test + public void testRunDatabaseConsistencyCheck() throws Exception { + EasyMockSupport easyMockSupport = new EasyMockSupport(); + + final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class); + final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class); + final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class); + final Statement mockStatement = easyMockSupport.createNiceMock(Statement.class); + final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class); + final StackManagerFactory mockStackManagerFactory = easyMockSupport.createNiceMock(StackManagerFactory.class); + final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class); + final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class); + + AmbariServer ambariServer = new AmbariServer(); + + + final Injector mockInjector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + bind(StackManagerFactory.class).toInstance(mockStackManagerFactory); + bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo); + bind(DBAccessor.class).toInstance(mockDBDbAccessor); + bind(OsFamily.class).toInstance(mockOSFamily); + bind(EntityManager.class).toInstance(mockEntityManager); + bind(Clusters.class).toInstance(mockClusters); + } + }); + + expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection).atLeastOnce(); + expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement).atLeastOnce(); + expect(mockStatement.executeQuery(anyString())).andReturn(null).atLeastOnce(); + + DatabaseConsistencyCheckHelper.setInjector(mockInjector); + + easyMockSupport.replayAll(); + + mockAmbariMetainfo.init(); + + ambariServer.runDatabaseConsistencyCheck(); + + easyMockSupport.verifyAll(); + } + + @Test + public void testRunDatabaseConsistencyCheck_IgnoreDBCheck() throws Exception { + AmbariServer ambariServer = new AmbariServer(); + + System.setProperty("skipDatabaseConsistencyCheck", ""); + + final Injector mockInjector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + + } + }); + + DatabaseConsistencyCheckHelper.setInjector(mockInjector); + + ambariServer.runDatabaseConsistencyCheck(); + + System.clearProperty("skipDatabaseConsistencyCheck"); + } + + @Test + public void testRunDatabaseConsistencyCheck_ThrowException() throws Exception { + EasyMockSupport easyMockSupport = new EasyMockSupport(); + + final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class); + final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class); + final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class); + final StackManagerFactory mockStackManagerFactory = easyMockSupport.createNiceMock(StackManagerFactory.class); + final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class); + final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class); + + AmbariServer ambariServer = new AmbariServer(); + + + final Injector mockInjector = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + bind(StackManagerFactory.class).toInstance(mockStackManagerFactory); + bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo); + bind(DBAccessor.class).toInstance(mockDBDbAccessor); + bind(OsFamily.class).toInstance(mockOSFamily); + bind(EntityManager.class).toInstance(mockEntityManager); + bind(Clusters.class).toInstance(mockClusters); + } + }); + + expect(mockDBDbAccessor.getConnection()).andReturn(null); + + + DatabaseConsistencyCheckHelper.setInjector(mockInjector); + + easyMockSupport.replayAll(); + + mockAmbariMetainfo.init(); + + boolean errorOccurred = false; + try { + ambariServer.runDatabaseConsistencyCheck(); + } catch(Exception e) { + errorOccurred = true; + } + + junit.framework.Assert.assertTrue(errorOccurred); + + easyMockSupport.verifyAll(); + } + }
