package com.sohu.cache.web.controller;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.servlet.ModelAndView;
import com.sohu.cache.constant.ErrorMessageEnum;
import com.sohu.cache.constant.RedisConfigTemplateChangeEnum;
import com.sohu.cache.entity.AppUser;
import com.sohu.cache.entity.InstanceConfig;
import com.sohu.cache.redis.RedisConfigTemplateService;
import com.sohu.cache.util.ConstUtils;
import com.sohu.cache.web.enums.SuccessEnum;
import com.sohu.cache.web.util.AppEmailUtil;
/**
* Redis配置模板管理
*
* @author leifu
* @Date 2016-6-25
* @Time 下午2:48:25
*/
@Controller
@RequestMapping("manage/redisConfig")
public class RedisConfigTemplateController extends BaseController {
@Resource(name = "redisConfigTemplateService")
private RedisConfigTemplateService redisConfigTemplateService;
@Resource(name = "appEmailUtil")
private AppEmailUtil appEmailUtil;
/**
* 初始化配置
*/
@RequestMapping(value = "/init")
public ModelAndView init(HttpServletRequest request, HttpServletResponse response, Model model) {
// 默认是Redis普通节点配置
int type = NumberUtils.toInt(request.getParameter("type"), ConstUtils.CACHE_REDIS_STANDALONE);
model.addAttribute("redisConfigList", redisConfigTemplateService.getByType(type));
model.addAttribute("success", request.getParameter("success"));
model.addAttribute("redisConfigActive", SuccessEnum.SUCCESS.value());
model.addAttribute("type", type);
return new ModelAndView("manage/redisConfig/init");
}
/**
* 修改配置
*/
@RequestMapping(value = "/update")
public ModelAndView update(HttpServletRequest request, HttpServletResponse response, Model model) {
AppUser appUser = getUserInfo(request);
String id = request.getParameter("id");
String configKey = request.getParameter("configKey");
String configValue = request.getParameter("configValue");
String info = request.getParameter("info");
int status = NumberUtils.toInt(request.getParameter("status"), -1);
if (StringUtils.isBlank(id) || !NumberUtils.isDigits(id) || StringUtils.isBlank(configKey) || status > 1
|| status < 0) {
model.addAttribute("status", SuccessEnum.FAIL.value());
model.addAttribute("message", ErrorMessageEnum.PARAM_ERROR_MSG.getMessage() + "id=" + id + ",configKey="
+ configKey + ",configValue=" + configValue + ",status=" + status);
return new ModelAndView("");
}
//开始修改
logger.warn("user {} want to change id={}'s configKey={}, configValue={}, info={}, status={}", appUser.getName(),
id, configKey, configValue, info, status);
SuccessEnum successEnum;
InstanceConfig instanceConfig = redisConfigTemplateService.getById(NumberUtils.toLong(id));
try {
instanceConfig.setConfigValue(configValue);
instanceConfig.setInfo(info);
instanceConfig.setStatus(status);
redisConfigTemplateService.saveOrUpdate(instanceConfig);
successEnum = SuccessEnum.SUCCESS;
} catch (Exception e) {
successEnum = SuccessEnum.FAIL;
model.addAttribute("message", ErrorMessageEnum.INNER_ERROR_MSG.getMessage());
logger.error(e.getMessage(), e);
}
logger.warn("user {} want to change id={}'s configKey={}, configValue={}, info={}, status={}, result is {}", appUser.getName(),
id, configKey, configValue, info, status, successEnum.value());
//发送邮件通知
appEmailUtil.sendRedisConfigTemplateChangeEmail(appUser, instanceConfig, successEnum, RedisConfigTemplateChangeEnum.UPDATE);
model.addAttribute("status", successEnum.value());
return new ModelAndView("");
}
/**
* 删除配置
*/
@RequestMapping(value = "/remove")
public ModelAndView remove(HttpServletRequest request, HttpServletResponse response, Model model) {
AppUser appUser = getUserInfo(request);
String idParam = request.getParameter("id");
long id = NumberUtils.toLong(idParam);
if (id <= 0) {
model.addAttribute("status", SuccessEnum.FAIL.value());
model.addAttribute("message", ErrorMessageEnum.PARAM_ERROR_MSG.getMessage() + "id=" + idParam);
return new ModelAndView("");
}
logger.warn("user {} want to delete id={}'s config", appUser.getName(), id);
SuccessEnum successEnum;
InstanceConfig instanceConfig = redisConfigTemplateService.getById(id);
try {
redisConfigTemplateService.remove(id);
successEnum = SuccessEnum.SUCCESS;
} catch (Exception e) {
successEnum = SuccessEnum.FAIL;
model.addAttribute("message", ErrorMessageEnum.INNER_ERROR_MSG.getMessage());
logger.error(e.getMessage(), e);
}
logger.warn("user {} want to delete id={}'s config, result is {}", appUser.getName(), id, successEnum.value());
//发送邮件通知
appEmailUtil.sendRedisConfigTemplateChangeEmail(appUser, instanceConfig, successEnum, RedisConfigTemplateChangeEnum.DELETE);
model.addAttribute("status", successEnum.value());
return new ModelAndView("");
}
/**
* 添加配置
*/
@RequestMapping(value = "/add")
public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Model model) {
AppUser appUser = getUserInfo(request);
InstanceConfig instanceConfig = getInstanceConfig(request);
if (StringUtils.isBlank(instanceConfig.getConfigKey())) {
model.addAttribute("status", SuccessEnum.FAIL.value());
model.addAttribute("message", ErrorMessageEnum.PARAM_ERROR_MSG.getMessage() + "configKey=" + instanceConfig.getConfigKey());
return new ModelAndView("");
}
logger.warn("user {} want to add config, configKey is {}, configValue is {}, type is {}", appUser.getName(),
instanceConfig.getConfigKey(), instanceConfig.getType());
SuccessEnum successEnum;
try {
redisConfigTemplateService.saveOrUpdate(instanceConfig);
successEnum = SuccessEnum.SUCCESS;
} catch (Exception e) {
successEnum = SuccessEnum.FAIL;
model.addAttribute("message", ErrorMessageEnum.INNER_ERROR_MSG.getMessage());
logger.error(e.getMessage(), e);
}
logger.warn("user {} want to add config, configKey is {}, configValue is {}, type is {}, result is {}",
appUser.getName(),
instanceConfig.getConfigKey(), instanceConfig.getConfigValue(), instanceConfig.getType(), successEnum.value());
model.addAttribute("status", successEnum.value());
//发送邮件通知
appEmailUtil.sendRedisConfigTemplateChangeEmail(appUser, instanceConfig, successEnum, RedisConfigTemplateChangeEnum.ADD);
return new ModelAndView("");
}
/**
* 预览配置
*/
@RequestMapping(value = "/preview")
public ModelAndView preview(HttpServletRequest request, HttpServletResponse response, Model model) {
//默认配置
int type = NumberUtils.toInt(request.getParameter("type"), -1);
String host = StringUtils.isBlank(request.getParameter("host")) ? "127.0.0.1" : request.getParameter("host");
int port = NumberUtils.toInt(request.getParameter("port"), 6379);
int maxMemory = NumberUtils.toInt(request.getParameter("maxMemory"), 2048);
int sentinelPort = NumberUtils.toInt(request.getParameter("sentinelPort"), 26379);
String masterName = StringUtils.isBlank(request.getParameter("masterName")) ? "myMaster" : request
.getParameter("masterName");
int quorum = NumberUtils.toInt(request.getParameter("quorum"), 2);
// 根据类型生成配置模板
List<String> configList = new ArrayList<String>();
if (ConstUtils.CACHE_REDIS_STANDALONE == type) {
configList = redisConfigTemplateService.handleCommonConfig(port, maxMemory);
} else if (ConstUtils.CACHE_REDIS_SENTINEL == type) {
configList = redisConfigTemplateService.handleSentinelConfig(masterName, host, port, sentinelPort);
} else if (ConstUtils.CACHE_TYPE_REDIS_CLUSTER == type) {
configList = redisConfigTemplateService.handleClusterConfig(port);
}
model.addAttribute("type", type);
model.addAttribute("host", host);
model.addAttribute("port", port);
model.addAttribute("maxMemory", maxMemory);
model.addAttribute("sentinelPort", sentinelPort);
model.addAttribute("masterName", masterName);
model.addAttribute("configList", configList);
return new ModelAndView("manage/redisConfig/preview");
}
/**
* 使用最简单的request生成InstanceConfig对象
*
* @return
*/
private InstanceConfig getInstanceConfig(HttpServletRequest request) {
String configKey = request.getParameter("configKey");
String configValue = request.getParameter("configValue");
String info = request.getParameter("info");
String type = request.getParameter("type");
InstanceConfig instanceConfig = new InstanceConfig();
instanceConfig.setConfigKey(configKey);
instanceConfig.setConfigValue(configValue);
instanceConfig.setInfo(info);
instanceConfig.setType(NumberUtils.toInt(type));
instanceConfig.setStatus(1);
return instanceConfig;
}
}