/**
* 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.dbaccess.ServerInfo;
import beans.request.InstallPlanRequest;
import beans.response.InstallPlanResponse;
import msec.org.DBUtil;
import msec.org.JsonRPCHandler;
import org.apache.log4j.Logger;
import java.sql.SQLException;
import java.util.*;
/**
*
* 扩容流程
*/
public class InstallPlan extends JsonRPCHandler {
public InstallPlanResponse exec(InstallPlanRequest request) {
Logger logger = Logger.getLogger(InstallPlan.class);
InstallPlanResponse resp = new InstallPlanResponse();
String result = checkIdentity();
if (!result.equals("success"))
{
resp.setStatus(99);
resp.setMessage(result);
return resp;
}
DBUtil util = new DBUtil();
if (util.getConnection() == null) {
resp.setStatus(100);
resp.setMessage("db connect failed!");
return resp;
}
ServerInfo helper_server = null;
try {
if(request.getAdded_ips() == null || request.getAdded_ips().size() == 0) {
resp.setStatus(101);
resp.setMessage("Request field error.");
return resp;
}
//get cluster info;
ClusterInfo cluster_info = null;
String sql = "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(request.getFirst_level_service_name());
params.add(request.getSecond_level_service_name());
try {
cluster_info = util.findSimpleRefResult(sql, params, ClusterInfo.class);
if (cluster_info == null || !cluster_info.getPlan_id().isEmpty()) {
resp.setStatus(101);
resp.setMessage("Please wait until the ongoing plan finishes.");
return resp;
}
}catch (Exception e) {
resp.setStatus(100);
resp.setMessage("db query exception!");
logger.error(e);
return resp;
}
ArrayList<ServerInfo> serviceList;
ArrayList<String> ip_list = new ArrayList<>();
int port = 0;
//get current cluster ips
sql = "select ip, port, status from t_service_info where first_level_service_name=? and second_level_service_name=?";
params.clear();
params.add(request.getFirst_level_service_name());
params.add(request.getSecond_level_service_name());
try {
serviceList = util.findMoreRefResult(sql, params, ServerInfo.class);
} catch (Exception e) {
resp.setStatus(100);
resp.setMessage("db query exception!");
logger.error(e);
return resp;
}
/*TODO
if(serviceList.size() > 0) {
for(ServerInfo info : serviceList) {
if( info.getStatus().equals("OK") ) {
helper_server = info;
break;
}
}
}
*/
String plan_id = AddSecondLevelServiceIPInfo.newPlanID();
for (String ip : request.getAdded_ips()) {
sql = "insert into t_install_plan(plan_id, first_level_service_name, second_level_service_name, ip, port, status, operation) values(?,?,?,?,?,?,?)";
params.clear();
params.add(plan_id);
params.add(request.getFirst_level_service_name());
params.add(request.getSecond_level_service_name());
params.add(ip);
params.add(ESHelper.default_port);
params.add("(1/5) Planning");
params.add("add");
try {
int addNum = util.updateByPreparedStatement(sql, params);
if (addNum < 0) {
resp.setMessage("Failed to insert plan.");
resp.setStatus(100);
return resp;
}
} catch (SQLException e) {
resp.setMessage("add record failed:" + e.toString());
resp.setStatus(100);
logger.error(e);
return resp;
}
ip_list.add(ip);
port = ESHelper.default_port;
}
sql = "update t_second_level_service set plan_id=? where first_level_service_name=? and second_level_service_name=?";
params.clear();
params.add(plan_id);
params.add(request.getFirst_level_service_name());
params.add(request.getSecond_level_service_name());
try {
int addNum = util.updateByPreparedStatement(sql, params);
if (addNum < 0) {
resp.setMessage("Failed to insert plan.");
resp.setStatus(100);
return resp;
}
}
catch (SQLException e)
{
resp.setStatus(100);
resp.setMessage("db query exception!");
logger.error(e);
return resp;
}
cluster_info.setFirst_level_service_name(request.getFirst_level_service_name());
cluster_info.setSecond_level_service_name(request.getSecond_level_service_name());
cluster_info.setPlan_id(plan_id);
cluster_info.setServer_list(serviceList);
cluster_info.setReq_ips(ip_list);
cluster_info.setReq_port(port);
logger.info(serviceList);
new Thread(new InstallServerProc( cluster_info, request.getData_dir(), getServlet().getServletContext())).start();
resp.setPlan_id(plan_id);
resp.setMessage("success");
resp.setStatus(0);
return resp;
} finally {
util.releaseConn();
}
}
}