/**
* 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.CapacityBaseInfo;
import beans.dbaccess.SecondLevelService;
import beans.request.CapacityRequest;
import beans.request.IPPortPair;
import beans.response.QueryCapacityListResponse;
import ngse.org.AccessZooKeeper;
import ngse.org.DBUtil;
import ngse.org.JsonRPCHandler;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
/**
* Created by Administrator on 2016/2/9.
* 查询业务的容量信息
*/
public class QueryCapacityList extends JsonRPCHandler {
public QueryCapacityListResponse exec(CapacityRequest request)
{
Logger logger = Logger.getLogger("QueryCapacityList");
QueryCapacityListResponse resp = new QueryCapacityListResponse();
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;
}
List<CapacityBaseInfo> capacities = new ArrayList<CapacityBaseInfo>() ;
AccessZooKeeper azk = new AccessZooKeeper();
try {
if (request.getFirst_level_service_name() == null || request.getFirst_level_service_name().length() < 1 ||
request.getSecond_level_service_name() == null || request.getSecond_level_service_name().length() < 1)
{
//所有服务
ArrayList<SecondLevelService> svcList = LoadBalance.getAllService(util);
if (svcList == null)
{
resp.setMessage("failed to get all service list");
resp.setStatus(100);
return resp;
}
for (int i = 0; i < svcList.size(); i++) { //每一个服务
SecondLevelService svc = svcList.get(i);
if (!svc.getType().equals("standard"))
{
continue;
}
//用户可能指定了一级服务名进行过滤,即只查看该一级服务下所有二级服务的情况
if (request.getFirst_level_service_name() != null &&
request.getFirst_level_service_name().length() > 0)
{
if (!svc.getFirst_level_service_name().equals(request.getFirst_level_service_name()))
{
continue;
}
}
CapacityBaseInfo c = new CapacityBaseInfo();
//该服务的所有ip
ArrayList<IPPortPair> iplist = LoadBalance.getIPPortInfoByServiceName(svc.getFirst_level_service_name(),
svc.getSecond_level_service_name(), util);
if (iplist == null)
{
resp.setMessage("failed to get ip list for " + svc.getFirst_level_service_name()+"."+svc.getSecond_level_service_name());
resp.setStatus(100);
return resp;
}
c.setIp_count(iplist.size());
c.setFirst_level_service_name(svc.getFirst_level_service_name());
c.setSecond_level_service_name(svc.getSecond_level_service_name());
//获取每一个ip的负载信息
int sum = 0;
int count = 0;
int j;
for (j = 0; j < iplist.size() ; j++) {
IPPortPair ip = iplist.get(j);
String svcname = svc.getFirst_level_service_name()+"/"+svc.getSecond_level_service_name();
try {
int load = LoadBalance.readOneServiceLoadInfo(azk, svcname, ip.getIp());
if (load >= 0) {
sum += load;
count++;
}
}
catch (Exception e)
{
e.printStackTrace();
resp.setMessage(e.getMessage());
resp.setStatus(100);
return resp;
}
}
c.setIp_report_num(count);
if (count > 0) {
c.setLoad_level(sum / count);
}
else
{
c.setLoad_level(0);
}
capacities.add(c);
}
}
else
{
CapacityBaseInfo c = new CapacityBaseInfo();
//该服务的所有ip
ArrayList<IPPortPair> iplist = LoadBalance.getIPPortInfoByServiceName(request.getFirst_level_service_name(),
request.getSecond_level_service_name(), util);
if (iplist == null)
{
resp.setMessage("failed to get ip list for " + request.getFirst_level_service_name()+"."+request.getSecond_level_service_name());
resp.setStatus(100);
return resp;
}
c.setIp_count(iplist.size());
c.setFirst_level_service_name(request.getFirst_level_service_name());
c.setSecond_level_service_name(request.getSecond_level_service_name());
//获取每一个ip的负载信息
int sum = 0;
int count = 0;
int j;
for (j = 0; j < iplist.size() ; j++) {
IPPortPair ip = iplist.get(j);
String svcname = request.getFirst_level_service_name()+"/"+request.getSecond_level_service_name();
try
{
int load = LoadBalance.readOneServiceLoadInfo(azk, svcname, ip.getIp());
if (load > 0) {
sum += load;
count++;
}
}
catch (Exception e)
{
e.printStackTrace();
resp.setMessage(e.getMessage());
resp.setStatus(100);
return resp;
}
}
c.setIp_report_num(count);
if (count > 0) {
c.setLoad_level(sum / count);
}
else
{
c.setLoad_level(0);
}
capacities.add(c);
}
}
finally {
util.releaseConn();
azk.disconnect();
}
resp.setCapacity_list((ArrayList<CapacityBaseInfo>) capacities);
resp.setMessage("success");
resp.setStatus(0);
return resp;
}
}