You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2015/04/14 11:32:51 UTC

ambari git commit: AMBARI-10405 Some service components are missing from API response and causes problems (dsen)

Repository: ambari
Updated Branches:
  refs/heads/trunk 31b1700e4 -> 0d5883ff6


AMBARI-10405 Some service components are missing from API response and causes problems (dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/0d5883ff
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/0d5883ff
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/0d5883ff

Branch: refs/heads/trunk
Commit: 0d5883ff6fb7c2b6aa7e7a52cfc0a907669953bc
Parents: 31b1700
Author: Dmytro Sen <ds...@apache.org>
Authored: Tue Apr 14 12:32:33 2015 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Tue Apr 14 12:32:33 2015 +0300

----------------------------------------------------------------------
 .../ambari/server/controller/AmbariServer.java  |  28 +--
 .../server/controller/ControllerModule.java     |   4 +-
 .../controller/utilities/DatabaseChecker.java   | 182 +++++++++++++++++++
 .../server/state/ServiceComponentImpl.java      |  16 +-
 .../server/controller/AmbariServerTest.java     |  47 -----
 .../utilities/DatabaseCheckerTest.java          |  91 ++++++++++
 6 files changed, 291 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/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 7ea96be..a24eb60 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
@@ -57,6 +57,7 @@ import org.apache.ambari.server.controller.internal.StackDefinedPropertyProvider
 import org.apache.ambari.server.controller.internal.StackDependencyResourceProvider;
 import org.apache.ambari.server.controller.internal.UserPrivilegeResourceProvider;
 import org.apache.ambari.server.controller.internal.ViewPermissionResourceProvider;
+import org.apache.ambari.server.controller.utilities.DatabaseChecker;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.PersistenceType;
 import org.apache.ambari.server.orm.dao.BlueprintDAO;
@@ -87,7 +88,6 @@ import org.apache.ambari.server.security.unsecured.rest.ConnectionInfo;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.utils.StageUtils;
-import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.ambari.server.view.ViewRegistry;
 import org.apache.velocity.app.Velocity;
 import org.eclipse.jetty.server.Connector;
@@ -209,7 +209,8 @@ public class AmbariServer {
     server.setSessionIdManager(sessionIdManager);
     Server serverForAgent = new Server();
 
-    checkDBVersion();
+    DatabaseChecker.checkDBVersion();
+    DatabaseChecker.checkDBConsistency();
 
     try {
       ClassPathXmlApplicationContext parentSpringAppContext =
@@ -569,29 +570,6 @@ public class AmbariServer {
     }
   }
 
-  protected void checkDBVersion() throws AmbariException {
-    LOG.info("Checking DB store version");
-    MetainfoEntity schemaVersionEntity = metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY);
-    String schemaVersion = null;
-    String serverVersion = null;
-
-    if (schemaVersionEntity != null) {
-      schemaVersion = schemaVersionEntity.getMetainfoValue();
-      serverVersion = ambariMetaInfo.getServerVersion();
-    }
-
-    if (schemaVersionEntity==null || VersionUtils.compareVersions(schemaVersion, serverVersion, 3) != 0) {
-      String error = "Current database store version is not compatible with " +
-          "current server version"
-          + ", serverVersion=" + serverVersion
-          + ", schemaVersion=" + schemaVersion;
-      LOG.warn(error);
-      throw new AmbariException(error);
-    }
-
-    LOG.info("DB store version is compatible");
-  }
-
   public void stop() throws Exception {
     try {
       server.stop();

http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index 58b94d8..0c5e04a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -65,6 +65,7 @@ import org.apache.ambari.server.controller.internal.MemberResourceProvider;
 import org.apache.ambari.server.controller.internal.RepositoryVersionResourceProvider;
 import org.apache.ambari.server.controller.internal.ServiceResourceProvider;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
+import org.apache.ambari.server.controller.utilities.DatabaseChecker;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessorImpl;
 import org.apache.ambari.server.orm.PersistenceType;
@@ -315,6 +316,7 @@ public class ControllerModule extends AbstractModule {
     bind(ViewInstanceHandlerList.class).to(AmbariHandlerList.class);
 
     requestStaticInjection(ExecutionCommandWrapper.class);
+    requestStaticInjection(DatabaseChecker.class);
 
     bindByAnnotation(null);
   }
@@ -489,4 +491,4 @@ public class ControllerModule extends AbstractModule {
 
     return beanDefinitions;
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/DatabaseChecker.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/DatabaseChecker.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/DatabaseChecker.java
new file mode 100644
index 0000000..3bc4fa0
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/DatabaseChecker.java
@@ -0,0 +1,182 @@
+/**
+ * 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.controller.utilities;
+
+import com.google.gson.Gson;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+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.orm.dao.ClusterDAO;
+import org.apache.ambari.server.orm.dao.MetainfoDAO;
+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.MetainfoEntity;
+import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
+import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
+import org.apache.ambari.server.state.ComponentInfo;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.utils.VersionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+
+public class DatabaseChecker {
+
+  static Logger LOG = LoggerFactory.getLogger(DatabaseChecker.class);
+
+  @Inject
+  static Injector injector;
+  static AmbariMetaInfo ambariMetaInfo;
+  static MetainfoDAO metainfoDAO;
+
+  public static void checkDBConsistency() throws AmbariException {
+    LOG.info("Checking DB consistency");
+
+    boolean checkPassed = true;
+    if (ambariMetaInfo == null) {
+      ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    }
+
+    ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
+    List<ClusterEntity> clusters = clusterDAO.findAll();
+    for (ClusterEntity clusterEntity: clusters) {
+      String desiredStackVersion = clusterEntity.getDesiredStackVersion();
+      StackId stackId = new Gson().fromJson(desiredStackVersion, StackId.class);
+
+      Collection<ClusterServiceEntity> serviceEntities =
+        clusterEntity.getClusterServiceEntities();
+      for (ClusterServiceEntity clusterServiceEntity : serviceEntities) {
+
+        ServiceDesiredStateEntity serviceDesiredStateEntity =
+          clusterServiceEntity.getServiceDesiredStateEntity();
+        if (serviceDesiredStateEntity == null) {
+          checkPassed = false;
+          LOG.error(String.format("ServiceDesiredStateEntity is null for " +
+              "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s ",
+            clusterEntity.getClusterName(), clusterServiceEntity.getServiceName()));
+        }
+        Collection<ServiceComponentDesiredStateEntity> scDesiredStateEntities =
+          clusterServiceEntity.getServiceComponentDesiredStateEntities();
+        if (scDesiredStateEntities == null ||
+          scDesiredStateEntities.isEmpty()) {
+          checkPassed = false;
+          LOG.error(String.format("serviceComponentDesiredStateEntities is null or empty for " +
+              "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s ",
+            clusterEntity.getClusterName(), clusterServiceEntity.getServiceName()));
+        } else {
+          for (ServiceComponentDesiredStateEntity scDesiredStateEnity : scDesiredStateEntities) {
+
+            Collection<HostComponentDesiredStateEntity> schDesiredStateEntities =
+              scDesiredStateEnity.getHostComponentDesiredStateEntities();
+            Collection<HostComponentStateEntity> schStateEntities =
+              scDesiredStateEnity.getHostComponentStateEntities();
+
+            ComponentInfo componentInfo = ambariMetaInfo.getComponent(
+              stackId.getStackName(), stackId.getStackVersion(),
+              scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName());
+
+            boolean zeroCardinality = componentInfo.getCardinality() == null
+              || componentInfo.getCardinality().startsWith("0")
+              || scDesiredStateEnity.getComponentName().equals("SECONDARY_NAMENODE"); // cardinality 0 for NameNode HA
+
+            boolean componentCheckFailed = false;
+
+            if (schDesiredStateEntities == null) {
+              componentCheckFailed = true;
+              LOG.error(String.format("hostComponentDesiredStateEntities is null for " +
+                  "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s, componentName=%s ",
+                clusterEntity.getClusterName(), scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName()));
+            } else if (!zeroCardinality && schDesiredStateEntities.isEmpty()) {
+              componentCheckFailed = true;
+              LOG.error(String.format("hostComponentDesiredStateEntities is empty for " +
+                  "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s, componentName=%s ",
+                clusterEntity.getClusterName(), scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName()));
+            }
+
+            if (schStateEntities == null) {
+              componentCheckFailed = true;
+              LOG.error(String.format("hostComponentStateEntities is null for " +
+                  "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s, componentName=%s ",
+                clusterEntity.getClusterName(), scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName()));
+            } else if (!zeroCardinality && schStateEntities.isEmpty()) {
+              componentCheckFailed = true;
+              LOG.error(String.format("hostComponentStateEntities is empty for " +
+                  "ServiceComponentDesiredStateEntity, clusterName=%s, serviceName=%s, componentName=%s ",
+                clusterEntity.getClusterName(), scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName()));
+            }
+
+            if (!componentCheckFailed &&
+              schDesiredStateEntities.size() != schStateEntities.size()) {
+              checkPassed = false;
+              LOG.error(String.format("HostComponentStateEntities and HostComponentDesiredStateEntities " +
+                  "tables must contain equal number of rows mapped to ServiceComponentDesiredStateEntity, " +
+                  "(clusterName=%s, serviceName=%s, componentName=%s) ", clusterEntity.getClusterName(),
+                scDesiredStateEnity.getServiceName(), scDesiredStateEnity.getComponentName()));
+            }
+            checkPassed = checkPassed && !componentCheckFailed;
+          }
+        }
+      }
+    }
+    if (checkPassed) {
+      LOG.info("DB consistency check passed.");
+    } else {
+      LOG.error("DB consistency check failed.");
+    }
+  }
+
+  public static void checkDBVersion() throws AmbariException {
+
+    LOG.info("Checking DB store version");
+    if (ambariMetaInfo == null) {
+      ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    }
+    if (metainfoDAO == null) {
+      metainfoDAO = injector.getInstance(MetainfoDAO.class);
+    }
+
+    MetainfoEntity schemaVersionEntity = metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY);
+    String schemaVersion = null;
+    String serverVersion = null;
+
+    if (schemaVersionEntity != null) {
+      schemaVersion = schemaVersionEntity.getMetainfoValue();
+      serverVersion = ambariMetaInfo.getServerVersion();
+    }
+
+    if (schemaVersionEntity==null || VersionUtils.compareVersions(schemaVersion, serverVersion, 3) != 0) {
+      String error = "Current database store version is not compatible with " +
+        "current server version"
+        + ", serverVersion=" + serverVersion
+        + ", schemaVersion=" + schemaVersion;
+      LOG.warn(error);
+      throw new AmbariException(error);
+    }
+
+    LOG.info("DB store version is compatible");
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index 23246b4..73ed25e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -24,6 +24,7 @@ import java.util.Map.Entry;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
+import com.google.inject.ProvisionException;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.ObjectNotFoundException;
 import org.apache.ambari.server.ServiceComponentHostNotFoundException;
@@ -123,10 +124,17 @@ public class ServiceComponentImpl implements ServiceComponent {
       pk.setHostId(hostComponentStateEntity.getHostId());
 
       HostComponentDesiredStateEntity hostComponentDesiredStateEntity = hostComponentDesiredStateDAO.findByPK(pk);
-
-      hostComponents.put(hostComponentStateEntity.getHostName(),
+      try {
+        hostComponents.put(hostComponentStateEntity.getHostName(),
           serviceComponentHostFactory.createExisting(this,
-              hostComponentStateEntity, hostComponentDesiredStateEntity));
+            hostComponentStateEntity, hostComponentDesiredStateEntity));
+      } catch(ProvisionException ex) {
+        StackId stackId = service.getCluster().getCurrentStackVersion();
+        LOG.error(String.format("Can not get host component info: stackName=%s, stackVersion=%s, serviceName=%s, componentName=%s, hostname=%s",
+          stackId.getStackName(), stackId.getStackVersion(),
+          service.getName(),serviceComponentDesiredStateEntity.getComponentName(), hostComponentStateEntity.getHostName()));
+        ex.printStackTrace();
+      }
     }
 
     StackId stackId = service.getDesiredStackVersion();
@@ -665,4 +673,4 @@ public class ServiceComponentImpl implements ServiceComponent {
     return hostComponents.size();
   }
 
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/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 3a0d3fd..484f398 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,22 +18,15 @@
 
 package org.apache.ambari.server.controller;
 
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.fail;
 
 import java.net.Authenticator;
 import java.net.InetAddress;
 import java.net.PasswordAuthentication;
 
 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.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
-import org.apache.ambari.server.orm.dao.MetainfoDAO;
-import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.velocity.app.Velocity;
 import org.easymock.EasyMock;
 import org.eclipse.jetty.servlet.ServletContextHandler;
@@ -45,7 +38,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.Guice;
-import com.google.inject.Inject;
 import com.google.inject.Injector;
 
 public class AmbariServerTest {
@@ -53,8 +45,6 @@ public class AmbariServerTest {
   private static final Logger log = LoggerFactory.getLogger(AmbariServerTest.class);
   private Injector injector;
 
-  @Inject
-  private AmbariMetaInfo ambariMetaInfo;
 
   @Before
   public void setup() throws Exception {
@@ -68,43 +58,6 @@ public class AmbariServerTest {
   }
 
   @Test
-  public void testCheckDBVersion_Valid() throws Exception {
-    MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);
-    MetainfoEntity metainfoEntity = new MetainfoEntity();
-    String serverVersion = ambariMetaInfo.getServerVersion();
-    metainfoEntity.setMetainfoName(Configuration.SERVER_VERSION_KEY);
-    metainfoEntity.setMetainfoValue(serverVersion);
-    expect(metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY)).
-            andReturn(metainfoEntity);
-    replay(metainfoDAO);
-    AmbariServer ambariServer = new AmbariServer();
-    ambariServer.metainfoDAO = metainfoDAO;
-    ambariServer.ambariMetaInfo = ambariMetaInfo;
-    ambariServer.checkDBVersion();
-  }
-
-  @Test
-  public void testCheckDBVersion_Invalid() throws Exception {
-    MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);
-    MetainfoEntity metainfoEntity = new MetainfoEntity();
-    metainfoEntity.setMetainfoName(Configuration.SERVER_VERSION_KEY);
-    metainfoEntity.setMetainfoValue("0.0.0"); // Incompatible version
-    expect(metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY)).
-            andReturn(metainfoEntity);
-    replay(metainfoDAO);
-    AmbariServer ambariServer = new AmbariServer();
-    ambariServer.metainfoDAO = metainfoDAO;
-    ambariServer.ambariMetaInfo = ambariMetaInfo;
-
-    try {
-      ambariServer.checkDBVersion();
-      fail();
-    } catch(AmbariException e) {
-      // Expected
-    }
-  }
-
-  @Test
   public void testVelocityLogger() throws Exception {
     new AmbariServer();
     Assert.assertEquals(AmbariServer.VELOCITY_LOG_CATEGORY, Velocity.getProperty("runtime.log.logsystem.log4j.logger"));

http://git-wip-us.apache.org/repos/asf/ambari/blob/0d5883ff/ambari-server/src/test/java/org/apache/ambari/server/controller/utilities/DatabaseCheckerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/utilities/DatabaseCheckerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/utilities/DatabaseCheckerTest.java
new file mode 100644
index 0000000..03d3661
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/utilities/DatabaseCheckerTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.controller.utilities;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+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.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.dao.MetainfoDAO;
+import org.apache.ambari.server.orm.entities.MetainfoEntity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.fail;
+
+public class DatabaseCheckerTest {
+  private Injector injector;
+
+  @Inject
+  private AmbariMetaInfo ambariMetaInfo;
+
+  @Before
+  public void setup() throws Exception {
+    injector = Guice.createInjector(new InMemoryDefaultTestModule());
+    injector.getInstance(GuiceJpaInitializer.class);
+    injector.injectMembers(this);
+  }
+
+  @After
+  public void teardown() throws AmbariException {
+  }
+
+  @Test
+  public void testCheckDBVersion_Valid() throws Exception {
+    MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);
+    MetainfoEntity metainfoEntity = new MetainfoEntity();
+    String serverVersion = ambariMetaInfo.getServerVersion();
+    metainfoEntity.setMetainfoName(Configuration.SERVER_VERSION_KEY);
+    metainfoEntity.setMetainfoValue(serverVersion);
+    expect(metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY)).
+      andReturn(metainfoEntity);
+    replay(metainfoDAO);
+    DatabaseChecker.metainfoDAO = metainfoDAO;
+    DatabaseChecker.ambariMetaInfo = ambariMetaInfo;
+    DatabaseChecker.checkDBVersion();
+  }
+
+  @Test
+  public void testCheckDBVersion_Invalid() throws Exception {
+    MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);
+    MetainfoEntity metainfoEntity = new MetainfoEntity();
+    metainfoEntity.setMetainfoName(Configuration.SERVER_VERSION_KEY);
+    metainfoEntity.setMetainfoValue("0.0.0"); // Incompatible version
+    expect(metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY)).
+      andReturn(metainfoEntity);
+    replay(metainfoDAO);
+    DatabaseChecker.metainfoDAO = metainfoDAO;
+    DatabaseChecker.ambariMetaInfo = ambariMetaInfo;
+
+    try {
+      DatabaseChecker.checkDBVersion();
+      fail();
+    } catch(AmbariException e) {
+      // Expected
+    }
+  }
+}