package com.sohu.cache.web.controller;
import com.sohu.cache.web.enums.RedisOperateEnum;
import com.sohu.cache.constant.AppCheckEnum;
import com.sohu.cache.constant.DataFormatCheckResult;
import com.sohu.cache.constant.ErrorMessageEnum;
import com.sohu.cache.constant.HorizontalResult;
import com.sohu.cache.entity.*;
import com.sohu.cache.machine.MachineCenter;
import com.sohu.cache.redis.RedisCenter;
import com.sohu.cache.redis.RedisDeployCenter;
import com.sohu.cache.redis.ReshardProcess;
import com.sohu.cache.stats.app.AppDailyDataCenter;
import com.sohu.cache.stats.app.AppDeployCenter;
import com.sohu.cache.stats.instance.InstanceDeployCenter;
import com.sohu.cache.util.ConstUtils;
import com.sohu.cache.util.TypeUtil;
import com.sohu.cache.web.enums.SuccessEnum;
import com.sohu.cache.web.util.AppEmailUtil;
import com.sohu.cache.web.util.DateUtil;
import net.sf.json.JSONArray;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentMap;
/**
* 应用后台管理
*
* @author leifu
* @Time 2014年7月3日
*/
@Controller
@RequestMapping("manage/app")
public class AppManageController extends BaseController {
private Logger logger = LoggerFactory.getLogger(AppManageController.class);
@Resource(name = "machineCenter")
private MachineCenter machineCenter;
@Resource(name = "appEmailUtil")
private AppEmailUtil appEmailUtil;
@Resource(name = "appDeployCenter")
private AppDeployCenter appDeployCenter;
@Resource(name = "redisCenter")
private RedisCenter redisCenter;
@Resource(name = "redisDeployCenter")
private RedisDeployCenter redisDeployCenter;
@Resource(name = "instanceDeployCenter")
private InstanceDeployCenter instanceDeployCenter;
@Resource(name = "appDailyDataCenter")
private AppDailyDataCenter appDailyDataCenter;
@RequestMapping("/appDaily")
public ModelAndView appDaily(HttpServletRequest request, HttpServletResponse response, Model model) throws ParseException {
AppUser userInfo = getUserInfo(request);
logger.warn("user {} want to send appdaily", userInfo.getName());
if (ConstUtils.SUPER_MANAGER.contains(userInfo.getName())) {
Date startDate;
Date endDate;
String startDateParam = request.getParameter("startDate");
String endDateParam = request.getParameter("endDate");
if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) {
endDate = new Date();
startDate = DateUtils.addDays(endDate, -1);
} else {
startDate = DateUtil.parseYYYY_MM_dd(startDateParam);
endDate = DateUtil.parseYYYY_MM_dd(endDateParam);
}
long appId = NumberUtils.toLong(request.getParameter("appId"));
if (appId > 0) {
appDailyDataCenter.sendAppDailyEmail(appId, startDate, endDate);
} else {
appDailyDataCenter.sendAppDailyEmail();
}
model.addAttribute("msg", "success!");
} else {
model.addAttribute("msg", "no power!");
}
return new ModelAndView("");
}
/**
* 审核列表
*
* @param status 审核状态
* @param type 申请类型
*/
@RequestMapping(value = "/auditList")
public ModelAndView doAppAuditList(HttpServletRequest request,HttpServletResponse response, Model model,
Integer status, Integer type) {
//获取审核列表
List<AppAudit> list = appService.getAppAudits(status, type);
model.addAttribute("list", list);
model.addAttribute("status", status);
model.addAttribute("type", type);
model.addAttribute("checkActive", SuccessEnum.SUCCESS.value());
return new ModelAndView("manage/appAudit/list");
}
/**
* 处理应用配置修改
*
* @param appAuditId 审批id
*/
@RequestMapping(value = "/initAppConfigChange")
public ModelAndView doInitAppConfigChange(HttpServletRequest request,
HttpServletResponse response, Model model, Long appAuditId) {
// 申请原因
AppAudit appAudit = appService.getAppAuditById(appAuditId);
model.addAttribute("appAudit", appAudit);
// 用第一个参数存实例id
Long instanceId = NumberUtils.toLong(appAudit.getParam1());
Map<String, String> redisConfigList = redisCenter.getRedisConfigList(instanceId.intValue());
model.addAttribute("redisConfigList", redisConfigList);
model.addAttribute("instanceId", instanceId);
// 实例列表
List<InstanceInfo> instanceList = appService.getAppInstanceInfo(appAudit.getAppId());
model.addAttribute("instanceList", instanceList);
model.addAttribute("appId", appAudit.getAppId());
model.addAttribute("appAuditId", appAuditId);
// 修改配置的键值对
model.addAttribute("appConfigKey", appAudit.getParam2());
model.addAttribute("appConfigValue", appAudit.getParam3());
return new ModelAndView("manage/appAudit/initAppConfigChange");
}
/**
* 添加应用配置修改
*
* @param appId 应用id
* @param appConfigKey 配置项
* @param appConfigValue 配置值
* @param appAuditId 审批id
*/
@RequestMapping(value = "/addAppConfigChange")
public ModelAndView doAddAppConfigChange(HttpServletRequest request,
HttpServletResponse response, Model model, Long appId,
String appConfigKey, String appConfigValue, Long appAuditId) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} change appConfig:appId={};key={};value={},appAuditId:{}", appUser.getName(), appId, appConfigKey, appConfigValue, appAuditId);
boolean isModify = false;
if (appId != null && appAuditId != null && StringUtils.isNotBlank(appConfigKey) && StringUtils.isNotBlank(appConfigValue)) {
try {
isModify = appDeployCenter.modifyAppConfig(appId, appAuditId, appConfigKey, appConfigValue);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.warn("user {} change appConfig:appId={};key={};value={},appAuditId:{},result is:{}", appUser.getName(), appId, appConfigKey, appConfigValue, appAuditId, isModify);
return new ModelAndView("redirect:/manage/app/auditList");
}
/**
* 初始化水平扩容申请
*/
@RequestMapping(value = "/initHorizontalScaleApply")
public ModelAndView doInitHorizontalScaleApply(HttpServletRequest request, HttpServletResponse response, Model model, Long appAuditId) {
AppAudit appAudit = appService.getAppAuditById(appAuditId);
model.addAttribute("appAudit", appAudit);
model.addAttribute("appId", appAudit.getAppId());
return new ModelAndView("manage/appAudit/initHorizontalScaleApply");
}
/**
* 添加水平扩容节点
*
* @return
*/
@RequestMapping(value = "/addHorizontalNodes")
public ModelAndView doAddHorizontalNodes(HttpServletRequest request,
HttpServletResponse response, Model model, String masterSizeSlave,
Long appAuditId) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} addHorizontalNodes:{}", appUser.getName(), masterSizeSlave);
boolean isAdd = false;
AppAudit appAudit = appService.getAppAuditById(appAuditId);
// 解析配置
String[] configArr = masterSizeSlave.split(ConstUtils.COLON);
String masterHost = configArr[0];
String memSize = configArr[1];
int memSizeInt = NumberUtils.toInt(memSize);
String slaveHost = null;
if (configArr.length >= 3) {
slaveHost = configArr[2];
}
try {
isAdd = appDeployCenter.addHorizontalNodes(appAudit.getAppId(), masterHost, slaveHost, memSizeInt);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
logger.warn("addAppClusterSharding:{}, result is {}", masterSizeSlave, isAdd);
model.addAttribute("status", isAdd ? 1 : 0);
return new ModelAndView("");
}
/**
* 检测水平扩容节点
* @param masterSizeSlave
* @param appAuditId
* @return
*/
@RequestMapping(value = "/checkHorizontalNodes")
public ModelAndView doCheckHorizontalNodes(HttpServletRequest request,
HttpServletResponse response, Model model, String masterSizeSlave,
Long appAuditId) {
DataFormatCheckResult dataFormatCheckResult = null;
try {
dataFormatCheckResult = appDeployCenter.checkHorizontalNodes(appAuditId, masterSizeSlave);
} catch (Exception e) {
logger.error(e.getMessage(), e);
dataFormatCheckResult = DataFormatCheckResult.fail(ErrorMessageEnum.INNER_ERROR_MSG.getMessage());
}
model.addAttribute("status", dataFormatCheckResult.getStatus());
model.addAttribute("message", dataFormatCheckResult.getMessage());
return new ModelAndView("");
}
/**
* 水平扩容初始化
*
* @param appAuditId
*/
@RequestMapping(value = "/handleHorizontalScale")
public ModelAndView doHandleHorizontalScale(HttpServletRequest request,
HttpServletResponse response, Model model, Long appAuditId) {
// 1. 审批
AppAudit appAudit = appService.getAppAuditById(appAuditId);
model.addAttribute("appAudit", appAudit);
model.addAttribute("appId", appAudit.getAppId());
// 2. 进度
ConcurrentMap<Long, ReshardProcess> appScaleProcessMap = appDeployCenter.getHorizontalProcess();
model.addAttribute("appScaleProcessMap", appScaleProcessMap);
// 3. 实例列表和统计
fillAppInstanceStats(appAudit.getAppId(), model);
// 4. 实例所在机器信息
fillAppMachineStat(appAudit.getAppId(), model);
return new ModelAndView("manage/appAudit/handleHorizontalScale");
}
/**
* 显示reshard进度
*/
@RequestMapping(value = "/showReshardProcess")
public ModelAndView doShowReshardProcess(HttpServletRequest request, HttpServletResponse response, Model model) {
ConcurrentMap<Long, ReshardProcess> appScaleProcessMap = appDeployCenter.getHorizontalProcess();
write(response, filterMapToJsonArray(appScaleProcessMap));
return null;
}
/**
* 把Map组装成JsonArray
*
* @param appScaleProcessMap
* @return
*/
private String filterMapToJsonArray(ConcurrentMap<Long, ReshardProcess> appScaleProcessMap) {
if (MapUtils.isEmpty(appScaleProcessMap)) {
return "[]";
}
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (Entry<Long, ReshardProcess> entry : appScaleProcessMap.entrySet()) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("appId", entry.getKey());
map.put("reshardSlot", entry.getValue().getReshardSlot());
map.put("totalSlot", entry.getValue().getTotalSlot());
map.put("status", entry.getValue().getStatus());
list.add(map);
}
return JSONArray.fromObject(list).toString();
}
/**
* 水平扩容配置检查
* @param sourceId 源实例ID
* @param targetId 目标实例ID
* @param startSlot 开始slot
* @param endSlot 结束slot
* @param appId 应用id
* @param appAuditId 审批id
* @return
*/
@RequestMapping(value = "/checkHorizontalScale")
public ModelAndView doCheckHorizontalScale(HttpServletRequest request, HttpServletResponse response, Model model,
long sourceId, long targetId, int startSlot, int endSlot, long appId, long appAuditId, int migrateType) {
HorizontalResult horizontalResult = appDeployCenter.checkHorizontal(appId, appAuditId, sourceId, targetId,
startSlot, endSlot, migrateType);
model.addAttribute("status", horizontalResult.getStatus());
model.addAttribute("message", horizontalResult.getMessage());
return new ModelAndView("");
}
/**
* 开始水平扩容
* @param sourceId 源实例ID
* @param targetId 目标实例ID
* @param startSlot 开始slot
* @param endSlot 结束slot
* @param appId 应用id
* @param appAuditId 审批id
* @return
*/
@RequestMapping(value = "/startHorizontalScale")
public ModelAndView doStartHorizontalScale(HttpServletRequest request, HttpServletResponse response, Model model,
long sourceId, long targetId, int startSlot, int endSlot, long appId, long appAuditId, int migrateType) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} horizontalScaleApply appId {} appAuditId {} sourceId {} targetId {} startSlot {} endSlot {}",
appUser.getName(), appId, appAuditId, sourceId, targetId, startSlot, endSlot);
HorizontalResult horizontalResult = appDeployCenter.startHorizontal(appId, appAuditId, sourceId, targetId,
startSlot, endSlot, migrateType);
model.addAttribute("status", horizontalResult.getStatus());
model.addAttribute("message", horizontalResult.getMessage());
return new ModelAndView("");
}
/**
* 处理应用扩容
*
* @param appAuditId 审批id
*/
@RequestMapping(value = "/initAppScaleApply")
public ModelAndView doInitAppScaleApply(HttpServletRequest request, HttpServletResponse response, Model model, Long appAuditId) {
// 申请原因
AppAudit appAudit = appService.getAppAuditById(appAuditId);
model.addAttribute("appAudit", appAudit);
// 实例列表和统计
fillAppInstanceStats(appAudit.getAppId(), model);
// 实例所在机器信息
fillAppMachineStat(appAudit.getAppId(), model);
long appId = appAudit.getAppId();
AppDesc appDesc = appService.getByAppId(appId);
model.addAttribute("appAuditId", appAuditId);
model.addAttribute("appId", appAudit.getAppId());
model.addAttribute("appDesc", appDesc);
return new ModelAndView("manage/appAudit/initAppScaleApply");
}
/**
* 添加扩容配置
*
* @param appScaleText 扩容配置
* @param appAuditId 审批id
*/
@RequestMapping(value = "/addAppScaleApply")
public ModelAndView doAddAppScaleApply(HttpServletRequest request,
HttpServletResponse response, Model model, String appScaleText,
Long appAuditId, Long appId) {
AppUser appUser = getUserInfo(request);
logger.error("user {} appScaleApplay : appScaleText={},appAuditId:{}", appUser.getName(), appScaleText, appAuditId);
boolean isSuccess = false;
if (appAuditId != null && StringUtils.isNotBlank(appScaleText)) {
int mem = NumberUtils.toInt(appScaleText, 0);
try {
isSuccess = appDeployCenter.verticalExpansion(appId, appAuditId, mem);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
} else {
logger.error("appScaleApplay error param: appScaleText={},appAuditId:{}", appScaleText, appAuditId);
}
logger.error("user {} appScaleApplay: appScaleText={},appAuditId:{}, result is {}", appUser.getName(), appScaleText, appAuditId, isSuccess);
return new ModelAndView("redirect:/manage/app/auditList");
}
/**
* 初始化部署应用
*
* @param appAuditId 审批id
* @return
*/
@RequestMapping(value = "/initAppDeploy")
public ModelAndView doInitAppDeploy(HttpServletRequest request, HttpServletResponse response, Model model, Long appAuditId) {
// 申请原因
AppAudit appAudit = appService.getAppAuditById(appAuditId);
model.addAttribute("appAudit", appAudit);
// 机器列表
List<MachineStats> machineList = machineCenter.getAllMachineStats();
model.addAttribute("machineList", machineList);
model.addAttribute("appAuditId", appAuditId);
model.addAttribute("appId", appAudit.getAppId());
model.addAttribute("appDesc", appService.getByAppId(appAudit.getAppId()));
return new ModelAndView("manage/appAudit/initAppDeploy");
}
/**
* 应用部署配置检查
* @return
*/
@RequestMapping(value = "/appDeployCheck")
public ModelAndView doAppDeployCheck(HttpServletRequest request, HttpServletResponse response, Model model, String appDeployText,
Long appAuditId) {
DataFormatCheckResult dataFormatCheckResult = null;
try {
dataFormatCheckResult = appDeployCenter.checkAppDeployDetail(appAuditId, appDeployText);
} catch (Exception e) {
logger.error(e.getMessage(), e);
dataFormatCheckResult = DataFormatCheckResult.fail(ErrorMessageEnum.INNER_ERROR_MSG.getMessage());
}
model.addAttribute("status", dataFormatCheckResult.getStatus());
model.addAttribute("message", dataFormatCheckResult.getMessage());
return new ModelAndView("");
}
/**
* 添加应用部署
*
* @param appDeployText 部署配置
* @param appAuditId 审批id
* @return
*/
@RequestMapping(value = "/addAppDeploy")
public ModelAndView doAddAppDeploy(HttpServletRequest request,
HttpServletResponse response, Model model, String appDeployText,
Long appAuditId) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} appDeploy: appDeployText={},appAuditId:{}", appUser.getName(), appDeployText, appAuditId);
boolean isSuccess = false;
if (appAuditId != null && StringUtils.isNotBlank(appDeployText)) {
String[] appDetails = appDeployText.split("\n");
// 部署service
isSuccess = appDeployCenter.allocateResourceApp(appAuditId, Arrays.asList(appDetails), getUserInfo(request));
} else {
logger.error("appDeploy error param: appDeployText={},appAuditId:{}", appDeployText, appAuditId);
}
logger.warn("user {} appDeploy: appDeployText={},appAuditId:{}, result is {}", appUser.getName(), appDeployText, appAuditId, isSuccess);
model.addAttribute("status", isSuccess ? 1 : 0);
return new ModelAndView("");
}
/**
* 通过,获取驳回申请
*
* @param status 审批状态
* @param appAuditId 审批id
* @param refuseReason 应用id
* @return
*/
@RequestMapping(value = "/addAuditStatus")
public ModelAndView doAddAuditStatus(HttpServletRequest request, HttpServletResponse response, Model model, Integer status, Long appAuditId, String refuseReason) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} addAuditStatus: status={},appAuditId:{},refuseReason:{}", appUser.getName(), status, appAuditId, refuseReason);
AppAudit appAudit = appService.getAppAuditById(appAuditId);
Long appId = appAudit.getAppId();
// 通过或者驳回并记录日志
appService.updateAppAuditStatus(appAuditId, appId, status, getUserInfo(request));
// 记录驳回原因
if (AppCheckEnum.APP_REJECT.value().equals(status)) {
appAudit.setRefuseReason(refuseReason);
appService.updateRefuseReason(appAudit, getUserInfo(request));
}
// 发邮件统计
if (AppCheckEnum.APP_PASS.value().equals(status) || AppCheckEnum.APP_REJECT.value().equals(status)) {
AppDesc appDesc = appService.getByAppId(appId);
appEmailUtil.noticeAppResult(appDesc, appService.getAppAuditById(appAuditId));
}
// 批准成功直接跳转
if (AppCheckEnum.APP_PASS.value().equals(status)) {
return new ModelAndView("redirect:/manage/app/auditList");
}
write(response, String.valueOf(SuccessEnum.SUCCESS.value()));
return null;
}
/**
* 下线应用
*
* @param appId
* @return
*/
@RequestMapping(value = "/offLine")
public ModelAndView offLineApp(HttpServletRequest request,
HttpServletResponse response, Model model, Long appId) {
AppUser userInfo = getUserInfo(request);
logger.warn("user {} hope to offline appId: {}", userInfo.getName(), appId);
if (ConstUtils.SUPER_MANAGER.contains(userInfo.getName())) {
boolean result = appDeployCenter.offLineApp(appId);
model.addAttribute("appId", appId);
model.addAttribute("result", result);
if (result) {
model.addAttribute("msg", "操作成功");
} else {
model.addAttribute("msg", "操作失败");
}
logger.warn("user {} offline appId: {}, result is {}", userInfo.getName(), appId, result);
appEmailUtil.noticeOfflineApp(userInfo, appId, result);
} else {
logger.warn("user {} hope to offline appId: {}, hasn't provilege", userInfo.getName(), appId);
model.addAttribute("result", false);
model.addAttribute("msg", "权限不足");
appEmailUtil.noticeOfflineApp(userInfo, appId, false);
}
return new ModelAndView();
}
/**
* 实例机器信息
* @param appId
* @param model
*/
private void fillAppMachineStat(Long appId, Model model){
List<InstanceInfo> instanceList = appService.getAppInstanceInfo(appId);
Map<String, MachineStats> machineStatsMap = new HashMap<String, MachineStats>();
Map<String, Long> machineCanUseMem = new HashMap<String, Long>();
for (InstanceInfo instanceInfo : instanceList) {
if (TypeUtil.isRedisSentinel(instanceInfo.getType())) {
continue;
}
String ip = instanceInfo.getIp();
if (machineStatsMap.containsKey(ip)) {
continue;
}
MachineStats machineStats = machineCenter.getMachineMemoryDetail(ip);
machineStatsMap.put(ip, machineStats);
machineCanUseMem.put(ip, machineStats.getMachineMemInfo().getLockedMem());
}
model.addAttribute("machineCanUseMem", machineCanUseMem);
model.addAttribute("machineStatsMap", machineStatsMap);
}
/**
* 应用运维
* @param appId
*/
@RequestMapping("/index")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response, Model model, Long appId) {
model.addAttribute("appId", appId);
return new ModelAndView("manage/appOps/appOpsIndex");
}
/**
* 应用机器运维
* @param appId
*/
@RequestMapping("/machine")
public ModelAndView appMachine(HttpServletRequest request, HttpServletResponse response, Model model, Long appId) {
if (appId != null && appId > 0) {
List<MachineStats> appMachineList = appService.getAppMachineDetail(appId);
model.addAttribute("appMachineList", appMachineList);
AppDesc appDesc = appService.getByAppId(appId);
model.addAttribute("appDesc", appDesc);
}
return new ModelAndView("manage/appOps/appMachine");
}
/**
* 应用实例运维
* @param appId
*/
@RequestMapping("/instance")
public ModelAndView appInstance(HttpServletRequest request, HttpServletResponse response, Model model, Long appId) {
if (appId != null && appId > 0) {
AppDesc appDesc = appService.getByAppId(appId);
model.addAttribute("appDesc", appDesc);
//实例信息和统计
fillAppInstanceStats(appId, model);
//只有cluster类型才需要计算slot相关
if (TypeUtil.isRedisCluster(appDesc.getType())) {
// 计算丢失的slot区间
Map<String,String> lossSlotsSegmentMap = redisCenter.getClusterLossSlots(appId);
model.addAttribute("lossSlotsSegmentMap", lossSlotsSegmentMap);
}
}
return new ModelAndView("manage/appOps/appInstance");
}
/**
* 应用详细信息和各种申请记录
* @param appId
*/
@RequestMapping("/detail")
public ModelAndView appInfoAndAudit(HttpServletRequest request, HttpServletResponse response, Model model, Long appId) {
if (appId != null && appId > 0) {
List<AppAudit> appAuditList = appService.getAppAuditListByAppId(appId);
AppDesc appDesc = appService.getByAppId(appId);
model.addAttribute("appAuditList", appAuditList);
model.addAttribute("appDesc", appDesc);
}
return new ModelAndView("manage/appOps/appInfoAndAudit");
}
/**
* redisCluster从节点failover
*
* @param appId 应用id
* @param slaveInstanceId 从节点instanceId
* @return
*/
@RequestMapping("/clusterSlaveFailOver")
public void clusterSlaveFailOver(HttpServletRequest request, HttpServletResponse response, Model model, Long appId,
int slaveInstanceId) {
boolean success = false;
logger.warn("clusterSlaveFailOver: appId:{}, slaveInstanceId:{}", appId, slaveInstanceId);
if (appId != null && appId > 0 && slaveInstanceId > 0) {
try {
success = redisDeployCenter.clusterFailover(appId,slaveInstanceId);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
} else {
logger.error("error param clusterSlaveFailOver: appId:{}, slaveInstanceId:{}", appId, slaveInstanceId);
}
logger.warn("clusterSlaveFailOver: appId:{}, slaveInstanceId:{}, result is {}", appId, slaveInstanceId, success);
write(response, String.valueOf(success == true ? SuccessEnum.SUCCESS.value() : SuccessEnum.FAIL.value()));
}
/**
* 添加slave节点
*
* @param appId
* @param masterInstanceId
* @param slaveHost
* @return
*/
@RequestMapping(value = "/addSlave")
public void addSlave(HttpServletRequest request, HttpServletResponse response, Model model, long appId,
int masterInstanceId, String slaveHost) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} addSlave: appId:{},masterInstanceId:{},slaveHost:{}", appUser.getName(), appId, masterInstanceId, slaveHost);
boolean success = false;
if (appId > 0 && StringUtils.isNotBlank(slaveHost) && masterInstanceId > 0) {
try {
success = redisDeployCenter.addSlave(appId, masterInstanceId, slaveHost);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.warn("user {} addSlave: appId:{},masterInstanceId:{},slaveHost:{} result is {}", appUser.getName(), appId, masterInstanceId, slaveHost, success);
write(response, String.valueOf(success == true ? SuccessEnum.SUCCESS.value() : SuccessEnum.FAIL.value()));
}
/**
* 添加sentinel节点
* @param appId
* @param sentinelHost
* @return
*/
@RequestMapping(value = "/addSentinel")
public void addSentinel(HttpServletRequest request, HttpServletResponse response, Model model, long appId, String sentinelHost) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} addSentinel: appId:{}, sentinelHost:{}", appUser.getName(), appId, sentinelHost);
boolean success = false;
if (appId > 0 && StringUtils.isNotBlank(sentinelHost)) {
try {
success = redisDeployCenter.addSentinel(appId, sentinelHost);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.warn("user {} addSentinel: appId:{}, sentinelHost:{} result is {}", appUser.getName(), appId, sentinelHost, success);
write(response, String.valueOf(success == true ? SuccessEnum.SUCCESS.value() : SuccessEnum.FAIL.value()));
}
/**
* 为失联的slot添加master节点
* @param appId
* @param sentinelHost
*/
@RequestMapping(value = "/addFailSlotsMaster")
public void addFailSlotsMaster(HttpServletRequest request, HttpServletResponse response, Model model, long appId, String failSlotsMasterHost, int instanceId) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} addFailSlotsMaster: appId:{}, instanceId {}, newMasterHost:{}", appUser.getName(), appId, instanceId, failSlotsMasterHost);
RedisOperateEnum redisOperateEnum = RedisOperateEnum.FAIL;
if (appId > 0 && StringUtils.isNotBlank(failSlotsMasterHost)) {
try {
redisOperateEnum = redisDeployCenter.addSlotsFailMaster(appId, instanceId, failSlotsMasterHost);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.warn("user {} addFailSlotsMaster: appId:{}, instanceId {}, newMasterHost:{} result is {}", appUser.getName(), appId, instanceId, failSlotsMasterHost, redisOperateEnum.getValue());
write(response, String.valueOf(redisOperateEnum.getValue()));
}
/**
* sentinelFailOver操作
*
* @param appId
* @return
*/
@RequestMapping("/sentinelFailOver")
public void sentinelFailOver(HttpServletRequest request, HttpServletResponse response, Model model, long appId) {
AppUser appUser = getUserInfo(request);
logger.warn("user {} sentinelFailOver, appId:{}", appUser.getName(), appId);
boolean success = false;
if (appId > 0) {
try {
success = redisDeployCenter.sentinelFailover(appId);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
} else {
logger.error("error param, sentinelFailOver: appId:{}", appId);
}
logger.warn("user {} sentinelFailOver, appId:{}, result is {}", appUser.getName(), appId, success);
write(response, String.valueOf(success == true ? SuccessEnum.SUCCESS.value() : SuccessEnum.FAIL.value()));
}
/**
* 应用重要性级别
*/
@RequestMapping(value = "/updateAppImportantLevel")
public ModelAndView doUpdateAppImportantLevel(HttpServletRequest request, HttpServletResponse response, Model model) {
long appId = NumberUtils.toLong(request.getParameter("appId"));
int importantLevel = NumberUtils.toInt(request.getParameter("importantLevel"));
SuccessEnum successEnum = SuccessEnum.FAIL;
if (appId > 0 && importantLevel >= 0) {
try {
AppDesc appDesc = appService.getByAppId(appId);
appDesc.setImportantLevel(importantLevel);
appService.update(appDesc);
successEnum = SuccessEnum.SUCCESS;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
model.addAttribute("status", successEnum.value());
return new ModelAndView("");
}
/**
* 更新应用密码
*/
@RequestMapping(value = "/updateAppPassword")
public ModelAndView doUpdateAppPassword(HttpServletRequest request, HttpServletResponse response, Model model) {
long appId = NumberUtils.toLong(request.getParameter("appId"));
String password = request.getParameter("password");
SuccessEnum successEnum = SuccessEnum.FAIL;
if (appId > 0) {
try {
AppDesc appDesc = appService.getByAppId(appId);
appDesc.setPassword(password);
appService.update(appDesc);
successEnum = SuccessEnum.SUCCESS;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
model.addAttribute("status", successEnum.value());
return new ModelAndView("");
}
}