You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/02/22 17:48:36 UTC
[16/21] ambari git commit: AMBARI-15095. Take into account "config
group" logic in check database queries.(vbrodetskyi)
AMBARI-15095. Take into account "config group" logic in check database queries.(vbrodetskyi)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/29d3f6cc
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/29d3f6cc
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/29d3f6cc
Branch: refs/heads/branch-dev-patch-upgrade
Commit: 29d3f6cc7fdb03619de8e6819832927315b303b7
Parents: a8e337c
Author: Vitaly Brodetskyi <vb...@hortonworks.com>
Authored: Mon Feb 22 15:07:17 2016 +0200
Committer: Vitaly Brodetskyi <vb...@hortonworks.com>
Committed: Mon Feb 22 15:07:17 2016 +0200
----------------------------------------------------------------------
.../server/checks/CheckDatabaseHelper.java | 137 ++++++++++++-------
.../server/checks/CheckDatabaseHelperTest.java | 20 +--
2 files changed, 97 insertions(+), 60 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/29d3f6cc/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java
index 0396767..766e2c0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java
@@ -59,6 +59,7 @@ public class CheckDatabaseHelper {
private AmbariMetaInfo ambariMetaInfo;
private Injector injector;
private boolean errorAvailable = false;
+ private boolean warningAvailable = false;
@Inject
public CheckDatabaseHelper(DBAccessor dbAccessor,
@@ -119,11 +120,19 @@ public class CheckDatabaseHelper {
this.errorAvailable = errorAvailable;
}
+ public boolean isWarningAvailable() {
+ return warningAvailable;
+ }
+
+ public void setWarningAvailable(boolean warningAvailable) {
+ this.warningAvailable = warningAvailable;
+ }
+
/*
- * This method checks if all configurations that we have in clusterconfig table
- * have at least one mapping in clusterconfigmapping table. If we found not mapped config
- * then we are showing warning message for user.
- * */
+ * This method checks if all configurations that we have in clusterconfig table
+ * have at least one mapping in clusterconfigmapping table. If we found not mapped config
+ * then we are showing warning message for user.
+ * */
protected void checkForNotMappedConfigsToCluster() {
String GET_NOT_MAPPED_CONFIGS_QUERY = "select type_name from clusterconfig where type_name not in (select type_name from clusterconfigmapping)";
Set<String> nonSelectedConfigs = new HashSet<>();
@@ -137,7 +146,8 @@ public class CheckDatabaseHelper {
}
}
if (!nonSelectedConfigs.isEmpty()) {
- LOG.warn("You have config(s) that is(are) not mapped to any cluster: " + StringUtils.join(nonSelectedConfigs, ","));
+ LOG.warn("You have config(s): {} that is(are) not mapped (in clusterconfigmapping table) to any cluster!", StringUtils.join(nonSelectedConfigs, ","));
+ warningAvailable = true;
}
} catch (SQLException e) {
LOG.error("Exception occurred during check for not mapped configs to cluster procedure: ", e);
@@ -159,25 +169,27 @@ public class CheckDatabaseHelper {
* than one selected version it's a bug and we are showing error message for user.
* */
protected void checkForConfigsSelectedMoreThanOnce() {
- String GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY = "select c.cluster_name,type_name from clusterconfigmapping ccm " +
+ String GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY = "select c.cluster_name, ccm.type_name from clusterconfigmapping ccm " +
"join clusters c on ccm.cluster_id=c.cluster_id " +
- "group by c.cluster_name,type_name " +
+ "group by c.cluster_name, ccm.type_name " +
"having sum(selected) > 1";
- Multimap<String, String> configsSelectedMoreThanOnce = HashMultimap.create();
+ Multimap<String, String> clusterConfigTypeMap = HashMultimap.create();
ResultSet rs = null;
try {
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = statement.executeQuery(GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY);
if (rs != null) {
while (rs.next()) {
- configsSelectedMoreThanOnce.put(rs.getString("cluster_name"), rs.getString("type_name"));
+ clusterConfigTypeMap.put(rs.getString("cluster_name"), rs.getString("type_name"));
+ }
+
+ 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;
}
}
- for (String clusterName : configsSelectedMoreThanOnce.keySet()) {
- LOG.error(String.format("You have config(s), in cluster %s, that is(are) selected more than once in clusterconfigmapping: %s",
- clusterName ,StringUtils.join(configsSelectedMoreThanOnce.get(clusterName), ",")));
- errorAvailable = true;
- }
+
} catch (SQLException e) {
LOG.error("Exception occurred during check for config selected more than ones procedure: ", e);
} finally {
@@ -207,12 +219,13 @@ public class CheckDatabaseHelper {
while (rs.next()) {
hostsWithoutStatus.add(rs.getString("host_name"));
}
- }
- if (!hostsWithoutStatus.isEmpty()) {
- LOG.error("You have host(s) without status: " + StringUtils.join(hostsWithoutStatus, ","));
- errorAvailable = true;
+ if (!hostsWithoutStatus.isEmpty()) {
+ LOG.error("You have host(s) without state (in hoststate table): " + StringUtils.join(hostsWithoutStatus, ","));
+ errorAvailable = true;
+ }
}
+
} catch (SQLException e) {
LOG.error("Exception occurred during check for host without state procedure: ", e);
} finally {
@@ -236,7 +249,7 @@ public class CheckDatabaseHelper {
String GET_HOST_COMPONENT_STATE_COUNT_QUERY = "select count(*) from hostcomponentstate";
String GET_HOST_COMPONENT_DESIRED_STATE_COUNT_QUERY = "select count(*) from hostcomponentdesiredstate";
String GET_MERGED_TABLE_ROW_COUNT_QUERY = "select count(*) FROM hostcomponentstate hcs " +
- "JOIN hostcomponentdesiredstate hcds ON hcs.service_name = hcds.service_name AND hcs.component_name = hcds.component_name AND hcs.host_id = hcds.host_id";
+ "JOIN hostcomponentdesiredstate hcds ON hcs.service_name=hcds.service_name AND hcs.component_name=hcds.component_name AND hcs.host_id=hcds.host_id";
int hostComponentStateCount = 0;
int hostComponentDesiredStateCount = 0;
int mergedCount = 0;
@@ -266,7 +279,7 @@ public class CheckDatabaseHelper {
}
if (hostComponentStateCount != hostComponentDesiredStateCount || hostComponentStateCount != mergedCount) {
- LOG.error("Your host component states(hostcomponentstate table) count not equals host component desired states(hostcomponentdesiredstate table) count!");
+ LOG.error("Your host component states (hostcomponentstate table) count not equals host component desired states (hostcomponentdesiredstate table) count!");
errorAvailable = true;
}
@@ -297,29 +310,31 @@ public class CheckDatabaseHelper {
String GET_SERVICES_WITHOUT_CONFIGS_QUERY = "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)";
- String GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY = "select service_name from serviceconfig where service_config_id not in (select service_config_id from serviceconfigmapping) and group_id is null";
+ String GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY = "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";
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, type_name, sc.version from clusterservices cs " +
+ 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 " +
"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 " +
"where sc.group_id is null " +
- "group by c.cluster_name, cs.service_name, type_name, sc.version";
- String GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY = "select c.cluster_name, cs.service_name,cc.type_name from clusterservices cs " +
+ "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 " +
"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 clusterconfigmapping ccm on cc.type_name=ccm.type_name and cc.version_tag=ccm.version_tag and cc.cluster_id=ccm.cluster_id " +
"join clusters c on ccm.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 " +
+ "group by c.cluster_name, cs.service_name, cc.type_name " +
"having sum(ccm.selected) < 1";
- Multimap<String, String> servicesWithoutConfigs = HashMultimap.create();
+ Multimap<String, String> clusterServiceMap = HashMultimap.create();
Map<String, Map<String, String>> clusterStackInfo = new HashMap<>();
- Set<String> servicesWithoutMappedConfigs = new HashSet<>();
- Map<String, Multimap<String, String>> notSelectedServiceConfigs = new HashMap<>();
+ Map<String, Multimap<String, String>> clusterServiceVersionMap = new HashMap<>();
+ Map<String, Multimap<String, String>> clusterServiceConfigType = new HashMap<>();
ResultSet rs = null;
try {
@@ -328,27 +343,45 @@ public class CheckDatabaseHelper {
rs = statement.executeQuery(GET_SERVICES_WITHOUT_CONFIGS_QUERY);
if (rs != null) {
while (rs.next()) {
- servicesWithoutConfigs.put(rs.getString("cluster_name"), rs.getString("service_name"));
+ clusterServiceMap.put(rs.getString("cluster_name"), rs.getString("service_name"));
+ }
+
+ for (String clusterName : clusterServiceMap.keySet()) {
+ LOG.error("Service(s): {}, from cluster {} has no config(s) in serviceconfig table!", StringUtils.join(clusterServiceMap.get(clusterName), ","), clusterName);
+ errorAvailable = true;
}
- }
- for (String clusterName : servicesWithoutConfigs.keySet()) {
- LOG.error(String.format("Service(s): %s, from cluster %s has no config(s) in serviceconfig table!", StringUtils.join(servicesWithoutConfigs.get(clusterName), ","), clusterName));
- errorAvailable = true;
}
rs = statement.executeQuery(GET_SERVICE_CONFIG_WITHOUT_MAPPING_QUERY);
if (rs != null) {
+ String serviceName = null, version = null, clusterName = null;
while (rs.next()) {
- servicesWithoutMappedConfigs.add(rs.getString("service_name"));
+ serviceName = rs.getString("service_name");
+ 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);
+ } else {
+ Multimap<String, String> serviceVersion = HashMultimap.create();;
+ serviceVersion.put(serviceName, version);
+ clusterServiceVersionMap.put(clusterName, serviceVersion);
+ }
+ }
+
+ for (String clName : clusterServiceVersionMap.keySet()) {
+ 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;
+ }
}
- }
- if (!servicesWithoutMappedConfigs.isEmpty()) {
- LOG.error("You have service(s) without mapped configs in serviceconfigmapping: " + StringUtils.join(servicesWithoutMappedConfigs, ","));
- errorAvailable = true;
}
+ //get stack info from db
rs = statement.executeQuery(GET_STACK_NAME_VERSION_QUERY);
if (rs != null) {
while (rs.next()) {
@@ -375,6 +408,7 @@ public class CheckDatabaseHelper {
serviceNames.add(serviceName);
+ //collect data about mapped configs to services from db
if (dbClusterServiceVersionConfigs.get(clusterName) != null) {
Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
@@ -386,18 +420,18 @@ public class CheckDatabaseHelper {
dbServiceVersionConfigs.put(serviceVersion, dbServiceConfigs);
}
} else {
-
Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = new HashMap<>();
Multimap<String, String> dbServiceConfigs = HashMultimap.create();
dbServiceConfigs.put(serviceName, configType);
dbServiceVersionConfigs.put(serviceVersion, dbServiceConfigs);
dbClusterServiceVersionConfigs.put(clusterName, dbServiceVersionConfigs);
-
}
}
}
+ //compare service configs from stack with configs that we got from db
for (Map.Entry<String, Map<String, String>> clusterStackInfoEntry : clusterStackInfo.entrySet()) {
+ //collect required configs for all services from stack
String clusterName = clusterStackInfoEntry.getKey();
Map<String, String> stackInfo = clusterStackInfoEntry.getValue();
String stackName = stackInfo.keySet().iterator().next();
@@ -411,6 +445,7 @@ public class CheckDatabaseHelper {
}
}
+ //compare required service configs from stack with mapped service configs from db
Map<Integer, Multimap<String, String>> dbServiceVersionConfigs = dbClusterServiceVersionConfigs.get(clusterName);
for (Integer serviceVersion : dbServiceVersionConfigs.keySet()) {
Multimap<String, String> dbServiceConfigs = dbServiceVersionConfigs.get(serviceVersion);
@@ -420,8 +455,8 @@ public class CheckDatabaseHelper {
if (serviceConfigsFromDB != null && serviceConfigsFromStack != null) {
serviceConfigsFromStack.removeAll(serviceConfigsFromDB);
if (!serviceConfigsFromStack.isEmpty()) {
- LOG.error(String.format("Required config(s): %s is(are) not available for service %s with service config version %s for cluster %s",
- StringUtils.join(serviceConfigsFromStack, ","), serviceName, Integer.toString(serviceVersion), clusterName));
+ 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;
}
}
@@ -429,7 +464,7 @@ public class CheckDatabaseHelper {
}
}
-
+ //getting services which has mapped configs which are not selected in clusterconfigmapping
rs = statement.executeQuery(GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY);
if (rs != null) {
String serviceName = null, configType = null, clusterName = null;
@@ -439,24 +474,24 @@ public class CheckDatabaseHelper {
configType = rs.getString("type_name");
- if (notSelectedServiceConfigs.get(clusterName) != null) {
- Multimap<String, String> serviceConfigs = notSelectedServiceConfigs.get(clusterName);
+ if (clusterServiceConfigType.get(clusterName) != null) {
+ Multimap<String, String> serviceConfigs = clusterServiceConfigType.get(clusterName);
serviceConfigs.put(serviceName, configType);
} else {
Multimap<String, String> serviceConfigs = HashMultimap.create();
serviceConfigs.put(serviceName, configType);
- notSelectedServiceConfigs.put(clusterName, serviceConfigs);
+ clusterServiceConfigType.put(clusterName, serviceConfigs);
}
}
}
- for (String clusterName : notSelectedServiceConfigs.keySet()) {
- Multimap<String, String> serviceConfig = notSelectedServiceConfigs.get(clusterName);
+ for (String clusterName : clusterServiceConfigType.keySet()) {
+ Multimap<String, String> serviceConfig = clusterServiceConfigType.get(clusterName);
for (String serviceName : serviceConfig.keySet()) {
- LOG.error(String.format("You have non selected configs: %s for service %s from cluster %s!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName));
+ LOG.error("You have non selected configs: {} for service {} from cluster {}!", StringUtils.join(serviceConfig.get(serviceName), ","), serviceName, clusterName);
errorAvailable = true;
}
}
@@ -515,8 +550,8 @@ public class CheckDatabaseHelper {
} finally {
if (checkDatabaseHelper != null) {
checkDatabaseHelper.closeConnection();
- if (checkDatabaseHelper.isErrorAvailable()) {
- System.out.print("Some error(s) was(were) found. Please check ambari-server-check-database.log for problem(s).");
+ if (checkDatabaseHelper.isErrorAvailable() || checkDatabaseHelper.isWarningAvailable()) {
+ System.out.print("Some error(s) or/and warning(s) was(were) found. Please check ambari-server-check-database.log for problem(s).");
} else {
System.out.print("No erros were found.");
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/29d3f6cc/ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java
index 67594b7..51ed42b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java
@@ -111,9 +111,9 @@ public class CheckDatabaseHelperTest {
expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
- expect(mockStatement.executeQuery("select c.cluster_name,type_name from clusterconfigmapping ccm " +
+ expect(mockStatement.executeQuery("select c.cluster_name, ccm.type_name from clusterconfigmapping ccm " +
"join clusters c on ccm.cluster_id=c.cluster_id " +
- "group by c.cluster_name,type_name " +
+ "group by c.cluster_name, ccm.type_name " +
"having sum(selected) > 1")).andReturn(mockResultSet);
CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
@@ -201,8 +201,8 @@ public class CheckDatabaseHelperTest {
expect(mockStatement.executeQuery("select count(*) from hostcomponentstate")).andReturn(mockResultSet);
expect(mockStatement.executeQuery("select count(*) from hostcomponentdesiredstate")).andReturn(mockResultSet);
expect(mockStatement.executeQuery("select count(*) FROM hostcomponentstate hcs " +
- "JOIN hostcomponentdesiredstate hcds ON hcs.service_name = hcds.service_name AND " +
- "hcs.component_name = hcds.component_name AND hcs.host_id = hcds.host_id")).andReturn(mockResultSet);
+ "JOIN hostcomponentdesiredstate hcds ON hcs.service_name=hcds.service_name AND " +
+ "hcs.component_name=hcds.component_name AND hcs.host_id=hcds.host_id")).andReturn(mockResultSet);
CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
@@ -263,24 +263,26 @@ public class CheckDatabaseHelperTest {
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 service_name from serviceconfig 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, 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, 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, type_name, sc.version from clusterservices cs " +
+ 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 " +
"where sc.group_id is null " +
- "group by c.cluster_name, cs.service_name, type_name, sc.version")).andReturn(serviceConfigResultSet);
- expect(mockStatement.executeQuery("select c.cluster_name, cs.service_name,cc.type_name from clusterservices cs " +
+ "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 clusterconfigmapping ccm on cc.type_name=ccm.type_name and cc.version_tag=ccm.version_tag and cc.cluster_id=ccm.cluster_id " +
"join clusters c on ccm.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 " +
+ "group by c.cluster_name, cs.service_name, cc.type_name " +
"having sum(ccm.selected) < 1")).andReturn(mockResultSet);
CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);