package com.sohu.cache.web.controller; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; 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.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 com.sohu.cache.entity.AppAudit; import com.sohu.cache.entity.AppUser; import com.sohu.cache.entity.InstanceInfo; import com.sohu.cache.redis.RedisCenter; import com.sohu.cache.redis.RedisDeployCenter; import com.sohu.cache.stats.instance.InstanceDeployCenter; import com.sohu.cache.stats.instance.InstanceStatsCenter; import com.sohu.cache.web.enums.SuccessEnum; /** * 应用后台管理 * * @author leifu * @Time 2014年7月3日 */ @Controller @RequestMapping("manage/instance") public class InstanceManageController extends BaseController { private Logger logger = LoggerFactory.getLogger(InstanceManageController.class); @Resource(name = "instanceDeployCenter") private InstanceDeployCenter instanceDeployCenter; @Resource(name = "redisCenter") private RedisCenter redisCenter; @Resource(name = "instanceStatsCenter") private InstanceStatsCenter instanceStatsCenter; /** * 上线(和下线分开) * * @param instanceId */ @RequestMapping(value = "/startInstance") public ModelAndView doStartInstance(HttpServletRequest request, HttpServletResponse response, Model model, long appId, int instanceId) { AppUser appUser = getUserInfo(request); logger.warn("user {} startInstance {} ", appUser.getName(), instanceId); boolean result = false; if (instanceId > 0) { try { result = instanceDeployCenter.startExistInstance(appId, instanceId); } catch (Exception e) { logger.error(e.getMessage(), e); model.addAttribute("message", e.getMessage()); } } else { logger.error("doStartInstance instanceId:{}", instanceId); model.addAttribute("message", "wrong param"); } logger.warn("user {} startInstance {} result is {}", appUser.getName(), instanceId, result); if (result) { model.addAttribute("success", SuccessEnum.SUCCESS.value()); } else { model.addAttribute("success", SuccessEnum.FAIL.value()); } return new ModelAndView(); } /** * 下线实例 * * @param instanceId * @param ip */ @RequestMapping(value = "/shutdownInstance") public ModelAndView doShutdownInstance(HttpServletRequest request, HttpServletResponse response, Model model, long appId, int instanceId) { AppUser appUser = getUserInfo(request); logger.warn("user {} shutdownInstance {} ", appUser.getName(), instanceId); boolean result = false; if (instanceId > 0) { try { result = instanceDeployCenter.shutdownExistInstance(appId, instanceId); } catch (Exception e) { logger.error(e.getMessage(), e); model.addAttribute("message", e.getMessage()); } } else { logger.error("doShutdownInstance instanceId:{}", instanceId); model.addAttribute("message", "wrong param"); } logger.warn("user {} shutdownInstance {}, result is {}", appUser.getName(), instanceId, result); if (result) { model.addAttribute("success", SuccessEnum.SUCCESS.value()); } else { model.addAttribute("success", SuccessEnum.FAIL.value()); } return new ModelAndView(); } /** * 查看redis节点日志 * @param appId * @param slaveInstanceId */ @RequestMapping("/log") public ModelAndView doShowLog(HttpServletRequest request, HttpServletResponse response, Model model, int instanceId) { int pageSize = NumberUtils.toInt(request.getParameter("pageSize"), 0); if (pageSize == 0) { pageSize = 100; } String instanceLogStr = instanceDeployCenter.showInstanceRecentLog(instanceId, pageSize); model.addAttribute("instanceLogList", StringUtils.isBlank(instanceLogStr) ? Collections.emptyList() : Arrays.asList(instanceLogStr.split("\n"))); return new ModelAndView("manage/instance/log"); } /** * 处理实例配置修改 * * @param appAuditId 审批id */ @RequestMapping(value = "/initInstanceConfigChange") public ModelAndView doInitInstanceConfigChange(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); // 实例 InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId); model.addAttribute("instanceInfo", instanceInfo); model.addAttribute("appId", appAudit.getAppId()); model.addAttribute("appAuditId", appAuditId); // 修改配置的键值对 model.addAttribute("instanceConfigKey", appAudit.getParam2()); model.addAttribute("instanceConfigValue", appAudit.getParam3()); return new ModelAndView("manage/appAudit/initInstanceConfigChange"); } /** * * @param appId 应用id * @param host 实例ip * @param port 实例端口 * @param instanceConfigKey 实例配置key * @param instanceConfigValue 实例配置value * @param appAuditId 审批id * @return */ @RequestMapping(value = "/addInstanceConfigChange") public ModelAndView doAddAppConfigChange(HttpServletRequest request, HttpServletResponse response, Model model, Long appId, String host, int port, String instanceConfigKey, String instanceConfigValue, Long appAuditId) { AppUser appUser = getUserInfo(request); logger.warn("user {} change instanceConfig:appId={},{}:{};key={};value={},appAuditId:{}", appUser.getName(), appId, host, port, instanceConfigKey, instanceConfigValue, appAuditId); boolean isModify = false; if (StringUtils.isNotBlank(host) && port > 0 && appAuditId != null && StringUtils.isNotBlank(instanceConfigKey) && StringUtils.isNotBlank(instanceConfigValue)) { try { isModify = instanceDeployCenter.modifyInstanceConfig(appId, appAuditId, host, port, instanceConfigKey, instanceConfigValue); } catch (Exception e) { logger.error(e.getMessage(), e); } } logger.warn("user {} change instanceConfig:appId={},{}:{};key={};value={},appAuditId:{},result is:{}", appUser.getName(), appId, host, port, instanceConfigKey, instanceConfigValue, appAuditId, isModify); return new ModelAndView("redirect:/manage/app/auditList"); } }