package com.sohu.cache.stats.instance.impl; import com.sohu.cache.constant.AppCheckEnum; import com.sohu.cache.constant.InstanceStatusEnum; import com.sohu.cache.dao.AppAuditDao; import com.sohu.cache.dao.InstanceDao; import com.sohu.cache.entity.InstanceInfo; import com.sohu.cache.machine.MachineCenter; import com.sohu.cache.protocol.RedisProtocol; import com.sohu.cache.redis.RedisCenter; import com.sohu.cache.redis.RedisDeployCenter; import com.sohu.cache.stats.instance.InstanceDeployCenter; import com.sohu.cache.util.TypeUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; /** * Created by yijunzhang on 14-11-26. */ public class InstanceDeployCenterImpl implements InstanceDeployCenter { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private InstanceDao instanceDao; private RedisCenter redisCenter; private RedisDeployCenter redisDeployCenter; private MachineCenter machineCenter; private AppAuditDao appAuditDao; @Override public boolean startExistInstance(long appId, int instanceId) { Assert.isTrue(instanceId > 0L); InstanceInfo instanceInfo = instanceDao.getInstanceInfoById(instanceId); Assert.isTrue(instanceInfo != null); int type = instanceInfo.getType(); String host = instanceInfo.getIp(); int port = instanceInfo.getPort(); boolean isRun; if (TypeUtil.isRedisType(type)) { if (TypeUtil.isRedisSentinel(type)) { isRun = redisCenter.isRun(host, port); } else { isRun = redisCenter.isRun(appId, host, port); } if (isRun) { logger.warn("{}:{} instance is Running", host, port); } else { String runShell; if (TypeUtil.isRedisCluster(type)) { runShell = RedisProtocol.getRunShell(port, true); } else if (TypeUtil.isRedisSentinel(type)) { runShell = RedisProtocol.getSentinelShell(port); } else { runShell = RedisProtocol.getRunShell(port, false); } boolean isRunShell = machineCenter.startProcessAtPort(host, port, runShell); if (!isRunShell) { logger.error("startProcessAtPort-> {}:{} shell= {} failed", host, port, runShell); return false; } else { logger.warn("{}:{} instance has Run", host, port); } if (TypeUtil.isRedisSentinel(type)) { isRun = redisCenter.isRun(host, port); } else { isRun = redisCenter.isRun(appId, host, port); } } } else { logger.error("type={} not match!", type); isRun = false; } if (isRun) { instanceInfo.setStatus(InstanceStatusEnum.GOOD_STATUS.getStatus()); instanceDao.update(instanceInfo); if (TypeUtil.isRedisType(type)) { redisCenter.deployRedisCollection(instanceInfo.getAppId(), instanceInfo.getIp(), instanceInfo.getPort()); } } return isRun; } @Override public boolean shutdownExistInstance(long appId, int instanceId) { Assert.isTrue(instanceId > 0L); InstanceInfo instanceInfo = instanceDao.getInstanceInfoById(instanceId); Assert.isTrue(instanceInfo != null); int type = instanceInfo.getType(); String host = instanceInfo.getIp(); int port = instanceInfo.getPort(); boolean isShutdown; if (TypeUtil.isRedisType(type)) { if (TypeUtil.isRedisSentinel(type)) { isShutdown = redisCenter.shutdown(host, port); } else { isShutdown = redisCenter.shutdown(appId, host, port); } if (isShutdown) { logger.warn("{}:{} redis is shutdown", host, port); } else { logger.error("{}:{} redis shutdown error", host, port); } } else { logger.error("type={} not match!", type); isShutdown = false; } if (isShutdown) { instanceInfo.setStatus(InstanceStatusEnum.OFFLINE_STATUS.getStatus()); instanceDao.update(instanceInfo); if (TypeUtil.isRedisType(type)) { redisCenter.unDeployRedisCollection(instanceInfo.getAppId(), instanceInfo.getIp(), instanceInfo.getPort()); redisCenter.unDeployRedisSlowLogCollection(instanceInfo.getAppId(), host, port); } } return isShutdown; } @Override public String showInstanceRecentLog(int instanceId, int maxLineNum){ Assert.isTrue(instanceId > 0L); InstanceInfo instanceInfo = instanceDao.getInstanceInfoById(instanceId); Assert.isTrue(instanceInfo != null); try { return machineCenter.showInstanceRecentLog(instanceInfo, maxLineNum); } catch (Exception e) { logger.error(e.getMessage(), e); return ""; } } @Override public boolean modifyInstanceConfig(long appId, Long appAuditId, String host, int port, String instanceConfigKey, String instanceConfigValue) { Assert.isTrue(appAuditId != null && appAuditId > 0L); Assert.isTrue(StringUtils.isNotBlank(host)); Assert.isTrue(port > 0); Assert.isTrue(StringUtils.isNotBlank(instanceConfigKey)); Assert.isTrue(StringUtils.isNotBlank(instanceConfigValue)); boolean isModify = redisDeployCenter.modifyInstanceConfig(appId, host, port, instanceConfigKey, instanceConfigValue); if (isModify) { // 改变审核状态 appAuditDao.updateAppAudit(appAuditId, AppCheckEnum.APP_ALLOCATE_RESOURCE.value()); } return isModify; } public void setInstanceDao(InstanceDao instanceDao) { this.instanceDao = instanceDao; } public void setRedisCenter(RedisCenter redisCenter) { this.redisCenter = redisCenter; } public void setMachineCenter(MachineCenter machineCenter) { this.machineCenter = machineCenter; } public void setRedisDeployCenter(RedisDeployCenter redisDeployCenter) { this.redisDeployCenter = redisDeployCenter; } public void setAppAuditDao(AppAuditDao appAuditDao) { this.appAuditDao = appAuditDao; } }