package com.sohu.cache.web.controller;
import com.sohu.cache.constant.MachineInfoEnum;
import com.sohu.cache.entity.AppDesc;
import com.sohu.cache.entity.InstanceInfo;
import com.sohu.cache.entity.InstanceStats;
import com.sohu.cache.entity.MachineInfo;
import com.sohu.cache.entity.MachineStats;
import com.sohu.cache.machine.MachineDeployCenter;
import com.sohu.cache.util.ConstUtils;
import com.sohu.cache.util.TypeUtil;
import com.sohu.cache.web.enums.SuccessEnum;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 机器管理
*
* @author leifu
* @Time 2014年10月14日
*/
@Controller
@RequestMapping("manage/machine")
public class MachineManageController extends BaseController{
@Resource
private MachineDeployCenter machineDeployCenter;
@RequestMapping(value = "/list")
public ModelAndView doMachineList(HttpServletRequest request,
HttpServletResponse response, Model model, String ipLike) {
List<MachineStats> machineList = machineCenter.getMachineStats(ipLike);
Map<String, Integer> machineInstanceCountMap = machineCenter.getMachineInstanceCountMap();
model.addAttribute("list", machineList);
model.addAttribute("ipLike", ipLike);
model.addAttribute("machineActive", SuccessEnum.SUCCESS.value());
model.addAttribute("collectAlert", "(请等待" + ConstUtils.MACHINE_STATS_CRON_MINUTE + "分钟)");
model.addAttribute("machineInstanceCountMap", machineInstanceCountMap);
return new ModelAndView("manage/machine/list");
}
/**
* 机器实例展示
* @param ip
* @return
*/
@RequestMapping(value = "/machineInstances")
public ModelAndView doMachineInstances(HttpServletRequest request,
HttpServletResponse response, Model model, String ip) {
//机器以及机器下面的实例信息
MachineInfo machineInfo = machineCenter.getMachineInfoByIp(ip);
List<InstanceInfo> instanceList = machineCenter.getMachineInstanceInfo(ip);
List<InstanceStats> instanceStatList = machineCenter.getMachineInstanceStatsByIp(ip);
//统计信息
fillInstanceModel(instanceList, instanceStatList, model);
model.addAttribute("machineInfo", machineInfo);
model.addAttribute("machineActive", SuccessEnum.SUCCESS.value());
return new ModelAndView("manage/machine/machineInstances");
}
/**
* 检查机器下是否有存活的实例
* @param ip
* @return
*/
@RequestMapping(value = "/checkMachineInstances")
public ModelAndView doCheckMachineInstances(HttpServletRequest request,
HttpServletResponse response, Model model, String ip) {
List<InstanceInfo> instanceList = machineCenter.getMachineInstanceInfo(ip);
model.addAttribute("machineHasInstance", CollectionUtils.isNotEmpty(instanceList));
return new ModelAndView("");
}
@RequestMapping(value = "/add", method = {RequestMethod.POST})
public ModelAndView doAdd(HttpServletRequest request,
HttpServletResponse response, Model model) {
MachineInfo machineInfo = new MachineInfo();
machineInfo.setIp(request.getParameter("ip"));
machineInfo.setRoom(request.getParameter("room"));
machineInfo.setMem(NumberUtils.toInt(request.getParameter("mem"), 0));
machineInfo.setCpu(NumberUtils.toInt(request.getParameter("cpu"), 0));
machineInfo.setVirtual(NumberUtils.toInt(request.getParameter("virtual"), 0));
machineInfo.setRealIp(request.getParameter("realIp"));
machineInfo.setType(NumberUtils.toInt(request.getParameter("machineType"), 0));
machineInfo.setExtraDesc(request.getParameter("extraDesc"));
machineInfo.setCollect(NumberUtils.toInt(request.getParameter("collect"), 1));
Date date = new Date();
machineInfo.setSshUser(ConstUtils.USERNAME);
machineInfo.setSshPasswd(ConstUtils.PASSWORD);
machineInfo.setServiceTime(date);
machineInfo.setModifyTime(date);
machineInfo.setAvailable(MachineInfoEnum.AvailableEnum.YES.getValue());
boolean isSuccess = machineDeployCenter.addMachine(machineInfo);
model.addAttribute("result", isSuccess);
return new ModelAndView("");
}
@RequestMapping(value = "/delete")
public ModelAndView doDelete(HttpServletRequest request, HttpServletResponse response, Model model) {
String machineIp = request.getParameter("machineIp");
if (StringUtils.isNotBlank(machineIp)) {
MachineInfo machineInfo = machineCenter.getMachineInfoByIp(machineIp);
boolean success = machineDeployCenter.removeMachine(machineInfo);
logger.warn("delete machine {}, result is {}", machineIp, success);
} else {
logger.warn("machineIp is empty!");
}
return new ModelAndView("redirect:/manage/machine/list");
}
/**
* 实例统计信息
* @param appAudit
* @param model
*/
protected void fillInstanceModel(List<InstanceInfo> instanceList, List<InstanceStats> appInstanceStats, Model model) {
Map<String, MachineStats> machineStatsMap = new HashMap<String, MachineStats>();
Map<String, Long> machineCanUseMem = new HashMap<String, Long>();
Map<String, InstanceStats> instanceStatsMap = new HashMap<String, InstanceStats>();
Map<Long, AppDesc> appInfoMap = new HashMap<Long, AppDesc>();
for (InstanceStats instanceStats : appInstanceStats) {
instanceStatsMap.put(instanceStats.getIp() + ":" + instanceStats.getPort(), instanceStats);
appInfoMap.put(instanceStats.getAppId(), appService.getByAppId(instanceStats.getAppId()));
}
for (InstanceInfo instanceInfo : instanceList) {
if (TypeUtil.isRedisSentinel(instanceInfo.getType())) {
continue;
}
String ip = instanceInfo.getIp();
if (machineStatsMap.containsKey(ip)) {
continue;
}
List<MachineStats> machineStatsList = machineCenter.getMachineStats(ip);
MachineStats machineStats = null;
for (MachineStats stats : machineStatsList) {
if (stats.getIp().equals(ip)) {
machineStats = stats;
machineStatsMap.put(ip, machineStats);
break;
}
}
MachineStats ms = machineCenter.getMachineMemoryDetail(ip);
machineCanUseMem.put(ip, ms.getMachineMemInfo().getLockedMem());
}
model.addAttribute("appInfoMap", appInfoMap);
model.addAttribute("machineCanUseMem", machineCanUseMem);
model.addAttribute("machineStatsMap", machineStatsMap);
model.addAttribute("instanceList", instanceList);
model.addAttribute("instanceStatsMap", instanceStatsMap);
}
}