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 2017/11/24 10:18:11 UTC

ambari git commit: AMBARI-22509 Fix DatabaseConsistencyCheckHelper (dsen)

Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-14714 1f176845e -> 99259e500


AMBARI-22509 Fix DatabaseConsistencyCheckHelper (dsen)


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

Branch: refs/heads/branch-feature-AMBARI-14714
Commit: 99259e5001fc8a055cc0285e5d5945661000c654
Parents: 1f17684
Author: Dmytro Sen <ds...@apache.org>
Authored: Fri Nov 24 12:17:12 2017 +0200
Committer: Dmytro Sen <ds...@apache.org>
Committed: Fri Nov 24 12:17:12 2017 +0200

----------------------------------------------------------------------
 .../checks/DatabaseConsistencyCheckHelper.java  | 132 ++++++++------
 .../DatabaseConsistencyCheckHelperTest.java     | 178 +++++++++++++++----
 2 files changed, 213 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/99259e50/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 80f88de..1f57996 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
@@ -901,28 +901,28 @@ public class DatabaseConsistencyCheckHelper {
   static void checkServiceConfigs()  {
     LOG.info("Checking services and their configs");
 
-    String GET_SERVICES_WITHOUT_CONFIGS_QUERY = "select c.cluster_name, service_name from clusterservices cs " +
+    String GET_SERVICES_WITHOUT_CONFIGS_QUERY = "select c.cluster_name, id from clusterservices cs " +
             "join clusters c on cs.cluster_id=c.cluster_id " +
-            "where service_name not in (select service_name from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_name=cs.service_name and sc.group_id is null)";
-    String GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY = "select c.cluster_name, sc.service_name, sc.version from serviceconfig sc " +
+            "where id not in (select service_id from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_id=cs.id and sc.group_id is null)";
+    String GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY = "select c.cluster_name, sc.service_group_id, sc.service_id, sc.version from serviceconfig sc " +
             "join clusters c on sc.cluster_id=c.cluster_id " +
             "where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null";
     String GET_STACK_NAME_VERSION_QUERY = "select c.cluster_name, s.stack_name, s.stack_version from clusters c " +
             "join stack s on c.desired_stack_id = s.stack_id";
-    String GET_SERVICES_WITH_CONFIGS_QUERY = "select c.cluster_name, cs.service_name, cc.type_name, sc.version from clusterservices cs " +
-            "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
+    String GET_SERVICES_WITH_CONFIGS_QUERY = "select c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version from clusterservices cs " +
+            "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
             "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
             "join clusterconfig cc on scm.config_id=cc.config_id and sc.cluster_id=cc.cluster_id " +
             "join clusters c on cc.cluster_id=c.cluster_id and sc.stack_id=c.desired_stack_id " +
-            "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-            "group by c.cluster_name, cs.service_name, cc.type_name, sc.version";
-    String GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY = "select c.cluster_name, cs.service_name, cc.type_name from clusterservices cs " +
-            "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
+            "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+            "group by c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version";
+    String GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY = "select c.cluster_name, cs.id, cc.type_name from clusterservices cs " +
+            "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
             "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
             "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " +
             "join clusters c on cc.cluster_id=c.cluster_id " +
-            "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-            "group by c.cluster_name, cs.service_name, cc.type_name " +
+            "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+            "group by c.cluster_name, cs.id, cc.type_name " +
             "having sum(cc.selected) < 1";
     Multimap<String, String> clusterServiceMap = HashMultimap.create();
     Map<String, Map<String, String>>  clusterStackInfo = new HashMap<>();
@@ -945,37 +945,37 @@ public class DatabaseConsistencyCheckHelper {
       rs = statement.executeQuery(GET_SERVICES_WITHOUT_CONFIGS_QUERY);
       if (rs != null) {
         while (rs.next()) {
-          clusterServiceMap.put(rs.getString("cluster_name"), rs.getString("service_name"));
+          clusterServiceMap.put(rs.getString("cluster_name"), rs.getString("id"));
         }
 
         for (String clusterName : clusterServiceMap.keySet()) {
-          warning("Service(s): {}, from cluster {} has no config(s) in serviceconfig table!", StringUtils.join(clusterServiceMap.get(clusterName), ","), clusterName);
+          warning("Service(s) with ID(s): {}, from cluster {} has no config(s) in serviceconfig table!", StringUtils.join(clusterServiceMap.get(clusterName), ","), clusterName);
         }
 
       }
       LOG.info("Executing query 'GET_SERVICE_CONFIG_WITHOUT_MAPPING'");
       rs = statement.executeQuery(GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY);
       if (rs != null) {
-        String serviceName = null, version = null, clusterName = null;
+        String serviceId = null, version = null, clusterName = null;
         while (rs.next()) {
-          serviceName = rs.getString("service_name");
+          serviceId = rs.getString("id");
           clusterName = rs.getString("cluster_name");
           version = rs.getString("version");
 
           if (clusterServiceVersionMap.get(clusterName) != null) {
             Multimap<String, String> serviceVersion = clusterServiceVersionMap.get(clusterName);
-            serviceVersion.put(serviceName, version);
+            serviceVersion.put(serviceId, version);
           } else {
             Multimap<String, String> serviceVersion = HashMultimap.create();;
-            serviceVersion.put(serviceName, version);
+            serviceVersion.put(serviceId, version);
             clusterServiceVersionMap.put(clusterName, serviceVersion);
           }
         }
 
         for (String clName : clusterServiceVersionMap.keySet()) {
           Multimap<String, String> serviceVersion = clusterServiceVersionMap.get(clName);
-          for (String servName : serviceVersion.keySet()) {
-            warning("In cluster {}, service config mapping is unavailable (in table serviceconfigmapping) for service {} with version(s) {}! ", clName, servName, StringUtils.join(serviceVersion.get(servName), ","));
+          for (String servId : serviceVersion.keySet()) {
+            warning("In cluster {}, service config mapping is unavailable (in table serviceconfigmapping) for service {} with version(s) {}! ", clName, servId, StringUtils.join(serviceVersion.get(servId), ","));
           }
         }
 
@@ -994,38 +994,49 @@ public class DatabaseConsistencyCheckHelper {
 
 
       Set<String> serviceNames = new HashSet<>();
-      Map<String, Map<Integer, Multimap<String, String>>> dbClusterServiceVersionConfigs = new HashMap<>();
+      Map<String, Map<Integer, Map<String, Multimap<String, String>>>> dbClusterServiceVersionConfigs = new HashMap<>();
       Multimap<String, String> stackServiceConfigs = HashMultimap.create();
 
       LOG.info("Executing query 'GET_SERVICES_WITH_CONFIGS'");
       rs = statement.executeQuery(GET_SERVICES_WITH_CONFIGS_QUERY);
       if (rs != null) {
-        String serviceName = null, configType = null, clusterName = null;
+        String serviceType = null, serviceId = null, configType = null, clusterName = null;
         Integer serviceVersion = null;
         while (rs.next()) {
           clusterName = rs.getString("cluster_name");
-          serviceName = rs.getString("service_name");
+          serviceId = rs.getString("id");
+          serviceType = rs.getString("service_type");
           configType = rs.getString("type_name");
           serviceVersion = rs.getInt("version");
 
-          serviceNames.add(serviceName);
+          serviceNames.add(serviceType);
 
           //collect data about mapped configs to services from db
           if (dbClusterServiceVersionConfigs.get(clusterName) != null) {
-            Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
+            Map<Integer, Map<String, Multimap<String, String>>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
 
             if (dbServiceVersionConfigs.get(serviceVersion) != null) {
-              dbServiceVersionConfigs.get(serviceVersion).put(serviceName, configType);
+              if (dbServiceVersionConfigs.get(serviceVersion).get(serviceType) != null) {
+                dbServiceVersionConfigs.get(serviceVersion).get(serviceType).put(serviceId, configType);
+              } else {
+                Multimap<String, String> dbServiceConfigs = HashMultimap.create();
+                dbServiceConfigs.put(serviceId, configType);
+                dbServiceVersionConfigs.get(serviceVersion).put(serviceType, dbServiceConfigs);
+              }
             } else {
               Multimap<String, String> dbServiceConfigs = HashMultimap.create();
-              dbServiceConfigs.put(serviceName, configType);
-              dbServiceVersionConfigs.put(serviceVersion, dbServiceConfigs);
+              dbServiceConfigs.put(serviceId, configType);
+              Map<String, Multimap<String, String>> serviceTypeServiceConfigsMap = new HashMap<>();
+              serviceTypeServiceConfigsMap.put(serviceType, dbServiceConfigs);
+              dbServiceVersionConfigs.put(serviceVersion, serviceTypeServiceConfigsMap);
             }
           } else {
-            Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = new HashMap<>();
+            Map<Integer, Map<String, Multimap<String, String>>> dbServiceVersionConfigs = new HashMap<>();
             Multimap<String, String> dbServiceConfigs = HashMultimap.create();
-            dbServiceConfigs.put(serviceName, configType);
-            dbServiceVersionConfigs.put(serviceVersion, dbServiceConfigs);
+            dbServiceConfigs.put(serviceId, configType);
+            Map<String, Multimap<String, String>> serviceTypeServiceConfigsMap = new HashMap<>();
+            serviceTypeServiceConfigsMap.put(serviceType, dbServiceConfigs);
+            dbServiceVersionConfigs.put(serviceVersion, serviceTypeServiceConfigsMap);
             dbClusterServiceVersionConfigs.put(clusterName, dbServiceVersionConfigs);
           }
         }
@@ -1057,37 +1068,42 @@ public class DatabaseConsistencyCheckHelper {
 
         //compare required service configs from stack with mapped service configs from db
         LOG.info("Comparing required service configs from stack with mapped service configs from db");
-        Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
+        Map<Integer, Map<String, Multimap<String, String>>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
         if (dbServiceVersionConfigs != null) {
           for (Integer serviceVersion : dbServiceVersionConfigs.keySet()) {
-            Multimap<String, String> dbServiceConfigs = dbServiceVersionConfigs.get(serviceVersion);
+            Map<String, Multimap<String, String>> dbServiceConfigs = dbServiceVersionConfigs.get(serviceVersion);
             if (dbServiceConfigs != null) {
-              for (String serviceName : dbServiceConfigs.keySet()) {
-                ServiceInfo serviceInfo = serviceInfoMap.get(serviceName);
-                Collection<String> serviceConfigsFromStack = stackServiceConfigs.get(serviceName);
-                Collection<String> serviceConfigsFromDB = dbServiceConfigs.get(serviceName);
-                if (serviceConfigsFromDB != null && serviceConfigsFromStack != null) {
-                  serviceConfigsFromStack.removeAll(serviceConfigsFromDB);
-                  if (serviceInfo != null && serviceInfo.getComponents() != null) {
-                    for (ComponentInfo componentInfo : serviceInfo.getComponents()) {
-                      if (componentInfo.getClientConfigFiles() != null) {
-                        for (ClientConfigFileDefinition clientConfigFileDefinition : componentInfo.getClientConfigFiles()) {
-                          if (clientConfigFileDefinition.isOptional()) {
-                            serviceConfigsFromStack.remove(clientConfigFileDefinition.getDictionaryName());
+              for (String serviceType : dbServiceConfigs.keySet()) {
+                ServiceInfo serviceInfo = serviceInfoMap.get(serviceType);
+                Collection<String> serviceConfigsFromStack = stackServiceConfigs.get(serviceType);
+                Multimap<String, String> serviceConfigsFromDBByIds = dbServiceConfigs.get(serviceType);
+                if (serviceConfigsFromDBByIds != null && serviceConfigsFromStack != null) {
+                  for (String serviceId : serviceConfigsFromDBByIds.keySet()) {
+                    //create separate copy for each iteration
+                    Collection<String> serviceConfigsFromStackCopy = new HashSet<>(serviceConfigsFromStack);
+                    Collection<String> configTypesForServiceId = serviceConfigsFromDBByIds.get(serviceId);
+                    serviceConfigsFromStackCopy.removeAll(configTypesForServiceId);
+                    if (serviceInfo != null && serviceInfo.getComponents() != null) {
+                      for (ComponentInfo componentInfo : serviceInfo.getComponents()) {
+                        if (componentInfo.getClientConfigFiles() != null) {
+                          for (ClientConfigFileDefinition clientConfigFileDefinition : componentInfo.getClientConfigFiles()) {
+                            if (clientConfigFileDefinition.isOptional()) {
+                              serviceConfigsFromStackCopy.remove(clientConfigFileDefinition.getDictionaryName());
+                            }
                           }
                         }
                       }
                     }
-                  }
 
-                  // skip ranger-{service_name}-* from being checked, unless ranger is installed
-                  if(!dbServiceConfigs.containsKey("RANGER")) {
-                    removeStringsByRegexp(serviceConfigsFromStack, "^ranger-"+ serviceName.toLowerCase() + "-" + "*");
-                  }
+                    // skip ranger-{service_type}-* from being checked, unless ranger is installed
+                    if (!dbServiceConfigs.containsKey("RANGER")) {
+                      removeStringsByRegexp(serviceConfigsFromStackCopy, "^ranger-" + serviceType.toLowerCase() + "-" + "*");
+                    }
 
-                  if (!serviceConfigsFromStack.isEmpty()) {
-                    warning("Required config(s): {} is(are) not available for service {} with service config version {} in cluster {}",
-                            StringUtils.join(serviceConfigsFromStack, ","), serviceName, Integer.toString(serviceVersion), clusterName);
+                    if (!serviceConfigsFromStackCopy.isEmpty()) {
+                      warning("Required config(s): {} is(are) not available for service ID {} of service type {} with service config version {} in cluster {}",
+                          StringUtils.join(serviceConfigsFromStackCopy, ","), serviceId, serviceType, Integer.toString(serviceVersion), clusterName);
+                    }
                   }
                 }
               }
@@ -1100,20 +1116,20 @@ public class DatabaseConsistencyCheckHelper {
       LOG.info("Getting services which has mapped configs which are not selected in clusterconfig");
       rs = statement.executeQuery(GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY);
       if (rs != null) {
-        String serviceName = null, configType = null, clusterName = null;
+        String serviceId = null, configType = null, clusterName = null;
         while (rs.next()) {
           clusterName = rs.getString("cluster_name");
-          serviceName = rs.getString("service_name");
+          serviceId = rs.getString("id");
           configType = rs.getString("type_name");
 
 
           if (clusterServiceConfigType.get(clusterName) != null) {
             Multimap<String, String> serviceConfigs = clusterServiceConfigType.get(clusterName);
-            serviceConfigs.put(serviceName, configType);
+            serviceConfigs.put(serviceId, configType);
           } else {
 
             Multimap<String, String> serviceConfigs = HashMultimap.create();
-            serviceConfigs.put(serviceName, configType);
+            serviceConfigs.put(serviceId, configType);
             clusterServiceConfigType.put(clusterName, serviceConfigs);
 
           }
@@ -1123,8 +1139,8 @@ public class DatabaseConsistencyCheckHelper {
 
       for (String clusterName : clusterServiceConfigType.keySet()) {
         Multimap<String, String> serviceConfig = clusterServiceConfigType.get(clusterName);
-        for (String serviceName : serviceConfig.keySet()) {
-          warning("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName);
+        for (String serviceId : serviceConfig.keySet()) {
+          warning("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceId), ","), serviceId, clusterName);
         }
       }
     } catch (SQLException | AmbariException e) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/99259e50/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 795fd1a..1ff83fb 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
@@ -50,6 +50,7 @@ import org.apache.ambari.server.mpack.MpackManagerFactory;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
+import org.apache.ambari.server.resources.RootLevelSettingsManagerFactory;
 import org.apache.ambari.server.stack.StackManagerFactory;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -221,9 +222,11 @@ public class DatabaseConsistencyCheckHelperTest {
     final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class);
     final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class);
     final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class);
+    final RootLevelSettingsManagerFactory rootLevelSettingsManagerFactoryMock = easyMockSupport.createNiceMock(RootLevelSettingsManagerFactory.class);
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
+        bind(RootLevelSettingsManagerFactory.class).toInstance(rootLevelSettingsManagerFactoryMock);
         bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
@@ -242,36 +245,37 @@ public class DatabaseConsistencyCheckHelperTest {
 
     expect(mockHDFSServiceInfo.getConfigTypeAttributes()).andReturn(configAttributes);
     expect(mockAmbariMetainfo.getServices("HDP", "2.2")).andReturn(services);
-    expect(serviceConfigResultSet.next()).andReturn(true).times(2);
-    expect(serviceConfigResultSet.getString("service_name")).andReturn("HDFS").andReturn("HBASE");
-    expect(serviceConfigResultSet.getString("type_name")).andReturn("core-site").andReturn("hbase-env");
+    expect(serviceConfigResultSet.next()).andReturn(true).times(3);
+    expect(serviceConfigResultSet.getString("id")).andReturn("1").andReturn("2").andReturn("3");
+    expect(serviceConfigResultSet.getString("service_type")).andReturn("HDFS").andReturn("HDFS").andReturn("HBASE");
+    expect(serviceConfigResultSet.getString("type_name")).andReturn("core-site").andReturn("core-site").andReturn("hbase-env");
     expect(stackResultSet.next()).andReturn(true);
     expect(stackResultSet.getString("stack_name")).andReturn("HDP");
     expect(stackResultSet.getString("stack_version")).andReturn("2.2");
     expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
-    expect(mockStatement.executeQuery("select c.cluster_name, service_name from clusterservices cs " +
-            "join clusters c on cs.cluster_id=c.cluster_id " +
-            "where service_name not in (select service_name from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_name=cs.service_name and sc.group_id is null)")).andReturn(mockResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, sc.service_name, sc.version from serviceconfig sc " +
-            "join clusters c on sc.cluster_id=c.cluster_id " +
-            "where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null")).andReturn(mockResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, id from clusterservices cs " +
+        "join clusters c on cs.cluster_id=c.cluster_id " +
+        "where id not in (select service_id from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_id=cs.id and sc.group_id is null)")).andReturn(mockResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, sc.service_group_id, sc.service_id, sc.version from serviceconfig sc " +
+        "join clusters c on sc.cluster_id=c.cluster_id " +
+        "where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null")).andReturn(mockResultSet);
     expect(mockStatement.executeQuery("select c.cluster_name, s.stack_name, s.stack_version from clusters c " +
-            "join stack s on c.desired_stack_id = s.stack_id")).andReturn(stackResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, cs.service_name, cc.type_name, sc.version from clusterservices cs " +
-            "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
-            "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
-            "join clusterconfig cc on scm.config_id=cc.config_id and sc.cluster_id=cc.cluster_id " +
-            "join clusters c on cc.cluster_id=c.cluster_id and sc.stack_id=c.desired_stack_id " +
-            "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-            "group by c.cluster_name, cs.service_name, cc.type_name, sc.version")).andReturn(serviceConfigResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, cs.service_name, cc.type_name from clusterservices cs " +
-            "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
-            "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
-            "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " +
-            "join clusters c on cc.cluster_id=c.cluster_id " +
-            "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-            "group by c.cluster_name, cs.service_name, cc.type_name " +
-            "having sum(cc.selected) < 1")).andReturn(mockResultSet);
+        "join stack s on c.desired_stack_id = s.stack_id")).andReturn(stackResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
+        "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
+        "join clusterconfig cc on scm.config_id=cc.config_id and sc.cluster_id=cc.cluster_id " +
+        "join clusters c on cc.cluster_id=c.cluster_id and sc.stack_id=c.desired_stack_id " +
+        "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version")).andReturn(serviceConfigResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cc.type_name from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
+        "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
+        "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " +
+        "join clusters c on cc.cluster_id=c.cluster_id " +
+        "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cc.type_name " +
+        "having sum(cc.selected) < 1")).andReturn(mockResultSet);
 
     DatabaseConsistencyCheckHelper.setInjector(mockInjector);
     DatabaseConsistencyCheckHelper.setConnection(mockConnection);
@@ -405,6 +409,7 @@ public class DatabaseConsistencyCheckHelperTest {
   @Test
   public void testCheckServiceConfigs_missingServiceConfigGeneratesWarning() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
+    final RootLevelSettingsManagerFactory rootLevelSettingsManagerFactoryMock = easyMockSupport.createNiceMock(RootLevelSettingsManagerFactory.class);
     final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
     final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
     final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
@@ -423,6 +428,7 @@ public class DatabaseConsistencyCheckHelperTest {
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
+        bind(RootLevelSettingsManagerFactory.class).toInstance(rootLevelSettingsManagerFactoryMock);
         bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
@@ -442,37 +448,38 @@ public class DatabaseConsistencyCheckHelperTest {
     expect(mockHDFSServiceInfo.getConfigTypeAttributes()).andReturn(configAttributes);
     expect(mockAmbariMetainfo.getServices("HDP", "2.2")).andReturn(services);
     expect(clusterServicesResultSet.next()).andReturn(true);
-    expect(clusterServicesResultSet.getString("service_name")).andReturn("OPENSOFT R");
+    expect(clusterServicesResultSet.getString("id")).andReturn("1");
     expect(clusterServicesResultSet.getString("cluster_name")).andReturn("My Cluster");
     expect(serviceConfigResultSet.next()).andReturn(true);
-    expect(serviceConfigResultSet.getString("service_name")).andReturn("HDFS");
+    expect(serviceConfigResultSet.getString("id")).andReturn("1");
+    expect(serviceConfigResultSet.getString("service_type")).andReturn("HDFS");
     expect(serviceConfigResultSet.getString("type_name")).andReturn("core-site");
     expect(stackResultSet.next()).andReturn(true);
     expect(stackResultSet.getString("stack_name")).andReturn("HDP");
     expect(stackResultSet.getString("stack_version")).andReturn("2.2");
     expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
-    expect(mockStatement.executeQuery("select c.cluster_name, service_name from clusterservices cs " +
+    expect(mockStatement.executeQuery("select c.cluster_name, id from clusterservices cs " +
         "join clusters c on cs.cluster_id=c.cluster_id " +
-        "where service_name not in (select service_name from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_name=cs.service_name and sc.group_id is null)")).andReturn(clusterServicesResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, sc.service_name, sc.version from serviceconfig sc " +
+        "where id not in (select service_id from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_id=cs.id and sc.group_id is null)")).andReturn(clusterServicesResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, sc.service_group_id, sc.service_id, sc.version from serviceconfig sc " +
         "join clusters c on sc.cluster_id=c.cluster_id " +
         "where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null")).andReturn(mockResultSet);
     expect(mockStatement.executeQuery("select c.cluster_name, s.stack_name, s.stack_version from clusters c " +
         "join stack s on c.desired_stack_id = s.stack_id")).andReturn(stackResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, cs.service_name, cc.type_name, sc.version from clusterservices cs " +
-        "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
         "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
         "join clusterconfig cc on scm.config_id=cc.config_id and sc.cluster_id=cc.cluster_id " +
         "join clusters c on cc.cluster_id=c.cluster_id and sc.stack_id=c.desired_stack_id " +
-        "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-        "group by c.cluster_name, cs.service_name, cc.type_name, sc.version")).andReturn(serviceConfigResultSet);
-    expect(mockStatement.executeQuery("select c.cluster_name, cs.service_name, cc.type_name from clusterservices cs " +
-        "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " +
+        "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version")).andReturn(serviceConfigResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cc.type_name from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
         "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
         "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " +
         "join clusters c on cc.cluster_id=c.cluster_id " +
-        "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " +
-        "group by c.cluster_name, cs.service_name, cc.type_name " +
+        "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cc.type_name " +
         "having sum(cc.selected) < 1")).andReturn(mockResultSet);
 
     DatabaseConsistencyCheckHelper.setInjector(mockInjector);
@@ -487,7 +494,7 @@ public class DatabaseConsistencyCheckHelperTest {
 
     easyMockSupport.verifyAll();
 
-    Assert.assertTrue("Missing service config for OPENSOFT R should have triggered a warning.",
+    Assert.assertTrue("Missing service config for service with ID 1 should have triggered a warning.",
         DatabaseConsistencyCheckHelper.getLastCheckResult() == DatabaseConsistencyCheckResult.DB_CHECK_WARNING);
     Assert.assertFalse("No errors should have been triggered.",
         DatabaseConsistencyCheckHelper.getLastCheckResult().isError());
@@ -495,6 +502,97 @@ public class DatabaseConsistencyCheckHelperTest {
 
 
   @Test
+  public void testCheckServiceConfigs_missingServiceConfigTypeForOneOfTwoServicesGeneratesWarning() throws Exception {
+    EasyMockSupport easyMockSupport = new EasyMockSupport();
+    final RootLevelSettingsManagerFactory rootLevelSettingsManagerFactoryMock = easyMockSupport.createNiceMock(RootLevelSettingsManagerFactory.class);
+    final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
+    final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
+    final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
+    final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class);
+    final ResultSet stackResultSet = easyMockSupport.createNiceMock(ResultSet.class);
+    final ResultSet serviceConfigResultSet = easyMockSupport.createNiceMock(ResultSet.class);
+    final Statement mockStatement = easyMockSupport.createNiceMock(Statement.class);
+    final ServiceInfo mockHDFSServiceInfo = easyMockSupport.createNiceMock(ServiceInfo.class);
+
+    final StackManagerFactory mockStackManagerFactory = easyMockSupport.createNiceMock(StackManagerFactory.class);
+    final MpackManagerFactory mockMpackManagerFacgtory = easyMockSupport.createNiceMock(MpackManagerFactory.class);
+    final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class);
+    final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class);
+    final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class);
+    final Injector mockInjector = Guice.createInjector(new AbstractModule() {
+      @Override
+      protected void configure() {
+        bind(RootLevelSettingsManagerFactory.class).toInstance(rootLevelSettingsManagerFactoryMock);
+        bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
+        bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
+        bind(EntityManager.class).toInstance(mockEntityManager);
+        bind(DBAccessor.class).toInstance(mockDBDbAccessor);
+        bind(Clusters.class).toInstance(mockClusters);
+        bind(OsFamily.class).toInstance(mockOSFamily);
+        bind(MpackManagerFactory.class).toInstance(mockMpackManagerFacgtory);
+      }
+    });
+
+    Map<String, ServiceInfo> services = new HashMap<>();
+    services.put("HDFS", mockHDFSServiceInfo);
+
+    Map<String, Map<String, Map<String, String>>> configAttributes = new HashMap<>();
+    configAttributes.put("core-site", new HashMap<>());
+
+    expect(mockHDFSServiceInfo.getConfigTypeAttributes()).andReturn(configAttributes);
+    expect(mockAmbariMetainfo.getServices("HDP", "2.2")).andReturn(services);
+    expect(serviceConfigResultSet.next()).andReturn(true).andReturn(true);
+    expect(serviceConfigResultSet.getString("id")).andReturn("1").andReturn("2");
+    expect(serviceConfigResultSet.getString("service_type")).andReturn("HDFS").andReturn("HDFS");
+    //return core-site only once so that HDFS with id 2 didn't have core-site
+    expect(serviceConfigResultSet.getString("type_name")).andReturn("core-site");
+    expect(stackResultSet.next()).andReturn(true);
+    expect(stackResultSet.getString("stack_name")).andReturn("HDP");
+    expect(stackResultSet.getString("stack_version")).andReturn("2.2");
+    expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
+    expect(mockStatement.executeQuery("select c.cluster_name, id from clusterservices cs " +
+        "join clusters c on cs.cluster_id=c.cluster_id " +
+        "where id not in (select service_id from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_id=cs.id and sc.group_id is null)")).andReturn(mockResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, sc.service_group_id, sc.service_id, sc.version from serviceconfig sc " +
+        "join clusters c on sc.cluster_id=c.cluster_id " +
+        "where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null")).andReturn(mockResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, s.stack_name, s.stack_version from clusters c " +
+        "join stack s on c.desired_stack_id = s.stack_id")).andReturn(stackResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
+        "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
+        "join clusterconfig cc on scm.config_id=cc.config_id and sc.cluster_id=cc.cluster_id " +
+        "join clusters c on cc.cluster_id=c.cluster_id and sc.stack_id=c.desired_stack_id " +
+        "where sc.group_id is null and sc.service_config_id=(select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cs.service_type, cc.type_name, sc.version")).andReturn(serviceConfigResultSet);
+    expect(mockStatement.executeQuery("select c.cluster_name, cs.id, cc.type_name from clusterservices cs " +
+        "join serviceconfig sc on cs.id=sc.service_id and cs.cluster_id=sc.cluster_id " +
+        "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " +
+        "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " +
+        "join clusters c on cc.cluster_id=c.cluster_id " +
+        "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_id=sc.service_id and sc2.cluster_id=sc.cluster_id) " +
+        "group by c.cluster_name, cs.id, cc.type_name " +
+        "having sum(cc.selected) < 1")).andReturn(mockResultSet);
+
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
+
+    easyMockSupport.replayAll();
+
+    mockAmbariMetainfo.init();
+
+    DatabaseConsistencyCheckHelper.resetCheckResult();
+    DatabaseConsistencyCheckHelper.checkServiceConfigs();
+
+    easyMockSupport.verifyAll();
+
+    Assert.assertTrue("Missing core-site config for service with ID 2 of service type HDFS should have triggered a warning.",
+        DatabaseConsistencyCheckHelper.getLastCheckResult() == DatabaseConsistencyCheckResult.DB_CHECK_WARNING);
+    Assert.assertFalse("No errors should have been triggered.",
+        DatabaseConsistencyCheckHelper.getLastCheckResult().isError());
+  }
+
+  @Test
   public void testCheckForLargeTables() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
     final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
@@ -512,10 +610,12 @@ public class DatabaseConsistencyCheckHelperTest {
     final ResultSet stageResultSet = easyMockSupport.createNiceMock(ResultSet.class);
     final ResultSet requestResultSet = easyMockSupport.createNiceMock(ResultSet.class);
     final ResultSet alertHistoryResultSet = easyMockSupport.createNiceMock(ResultSet.class);
+    final RootLevelSettingsManagerFactory rootLevelSettingsManagerFactoryMock = easyMockSupport.createNiceMock(RootLevelSettingsManagerFactory.class);
 
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
+        bind(RootLevelSettingsManagerFactory.class).toInstance(rootLevelSettingsManagerFactoryMock);
         bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);