/**
* Tencent is pleased to support the open source community by making MSEC available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the GNU General Public 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
*
* https://opensource.org/licenses/GPL-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 beans.service;
import beans.dbaccess.ClusterInfo;
import beans.request.QueryESClusterDetailRequest;
import beans.response.QueryESClusterDetailResponse;
import msec.org.DBUtil;
import msec.org.JsonRPCHandler;
import org.apache.log4j.Logger;
import java.lang.reflect.Array;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class QueryESClusterDetail extends JsonRPCHandler {
DBUtil util;
ArrayList<String> cluster_ips;
private void getStatus(String first_level_service_name, String second_level_service_name) throws SQLException {
Logger logger = Logger.getLogger(QueryESClusterDetail.class);
String sql = "select ip, port from t_service_info where first_level_service_name=? and second_level_service_name=?";
List<Object> params = new ArrayList<Object>();
params.add(first_level_service_name);
params.add(second_level_service_name);
ArrayList<Map<String, Object>> result_list = util.findModeResult(sql, params);
for(int i = 0; i < result_list.size(); i++){
cluster_ips.add(result_list.get(i).get("ip").toString());
}
logger.info(cluster_ips);
}
private void updateStatus(String first_level_service_name, String second_level_service_name, String ip, boolean isOK) throws SQLException
{
Logger logger = Logger.getLogger(QueryESClusterDetail.class);
String sql = "";
List<Object> params = new ArrayList<Object>();
if(isOK) {
sql = "update t_service_info set status=? where first_level_service_name=? and second_level_service_name=? and ip=?";
params.add("OK");
}
else
{
sql = "update t_service_info set status=? where first_level_service_name=? and second_level_service_name=? and ip=?";
params.add("ERROR");
}
params.add(first_level_service_name);
params.add(second_level_service_name);
params.add(ip);
int updNum = util.updateByPreparedStatement(sql, params);
if (updNum != 1) {
logger.error(String.format("updateStatus|%d", updNum));
}
}
private void addServer(String first_level_service_name, String second_level_service_name, String ip, int port) throws SQLException
{
Logger logger = Logger.getLogger(QueryESClusterDetail.class);
String sql = "";
List<Object> params = new ArrayList<Object>();
sql = "insert into t_service_info(first_level_service_name, second_level_service_name, ip, port) values(?,?,?,?)";
params.clear();
params.add(first_level_service_name);
params.add(second_level_service_name);
params.add(ip);
params.add(port);
try {
util.updateByPreparedStatement(sql, params);
} catch (SQLException e) {
logger.error(e);
}
}
private boolean updatePlan(String first_level_service_name, String second_level_service_name) throws SQLException {
Logger logger = Logger.getLogger(QueryESClusterDetailResponse.class);
String sql = "select distinct status from t_install_plan where plan_id=(select plan_id from t_second_level_service where first_level_service_name=? and second_level_service_name=?)";
List<Object> params = new ArrayList<Object>();
params.add(first_level_service_name);
params.add(second_level_service_name);
ArrayList<Map<String, Object>> status_infos = util.findModeResult(sql, params);
if(status_infos.size() == 0)
return false;
boolean need_refresh = true;
for(int i = 0; i < status_infos.size(); i++) {
if (!status_infos.get(i).get("status").toString().startsWith("[ERROR]") && !status_infos.get(i).get("status").toString().startsWith("Done")) {
need_refresh = false;
break;
}
}
return need_refresh;
}
private void updateMaster(String first_level_service_name, String second_level_service_name, String ip, int port, int group_id) throws SQLException
{
Logger logger = Logger.getLogger(QueryESClusterDetailResponse.class);
String sql = "update t_service_info set master= case when ip=? and port=? then 1 else 0 end where first_level_service_name=? and second_level_service_name=? and group_id=?";
List<Object> params = new ArrayList<Object>();
params.add(ip);
params.add(port);
params.add(first_level_service_name);
params.add(second_level_service_name);
params.add(group_id);
int updNum = util.updateByPreparedStatement(sql, params);
if(updNum == 0)
logger.error(String.format("updateMaster|%d", updNum));
}
public QueryESClusterDetailResponse exec(QueryESClusterDetailRequest request)
{
Logger logger = Logger.getLogger(QueryESClusterDetail.class);
QueryESClusterDetailResponse resp = new QueryESClusterDetailResponse();
String result = checkIdentity();
if (!result.equals("success"))
{
resp.setStatus(99);
resp.setMessage(result);
return resp;
}
boolean all_ok = true;
int master_num = 0;
util = new DBUtil();
if (util.getConnection() == null)
{
resp.setStatus(100);
resp.setMessage("db connect failed!");
return resp;
}
cluster_ips = new ArrayList<>();
HashMap<String, QueryESClusterDetailResponse.RTInfo> info_map = new HashMap<>();
try {
if(updatePlan(request.getFirst_level_service_name(), request.getSecond_level_service_name())) {
resp.setMessage("refresh");
resp.setStatus(101);
return resp;
}
getStatus(request.getFirst_level_service_name(), request.getSecond_level_service_name());
ESHelper helper = new ESHelper();
helper.ClusterStatus(cluster_ips, request.getFirst_level_service_name()+"."+request.getSecond_level_service_name(), resp);
if(resp.getHealth_status() != "INIT") {
for(Map.Entry<String, QueryESClusterDetailResponse.RTInfo> entry: resp.getInfo_map().entrySet()) {
if(!cluster_ips.contains(entry.getKey())) {
//add ip to service
addServer(request.getSecond_level_service_name(), request.getSecond_level_service_name(), entry.getKey(), resp.getServer_port());
resp.setMessage("refresh");
resp.setStatus(101);
return resp;
}
}
for (String ip : cluster_ips) {
QueryESClusterDetailResponse.RTInfo rt_info = resp.getInfo_map().get(ip);
if (rt_info != null) {
if (!rt_info.isOK()) {
logger.error(String.format("ip failed|%s", ip));
}
updateStatus(request.getFirst_level_service_name(), request.getSecond_level_service_name(), ip, rt_info.isOK());
} else {
resp.getInfo_map().put(ip, new QueryESClusterDetailResponse().new RTInfo());
updateStatus(request.getFirst_level_service_name(), request.getSecond_level_service_name(), ip, false);
}
}
}
}
catch (Exception e) {
logger.error(e);
e.printStackTrace();
} finally {
util.releaseConn();
}
return resp;
}
}