package com.sohu.cache.web.service.impl; import com.sohu.cache.constant.*; import com.sohu.cache.dao.*; import com.sohu.cache.entity.*; import com.sohu.cache.machine.MachineCenter; import com.sohu.cache.redis.RedisCenter; import com.sohu.cache.util.AppKeyUtil; import com.sohu.cache.util.TypeUtil; import com.sohu.cache.web.enums.SuccessEnum; import com.sohu.cache.web.service.AppService; import org.springframework.util.Assert; import java.util.*; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.HostAndPort; /** * 应用操作实现类 * * @author leifu * @Time 2014年10月21日 */ public class AppServiceImpl implements AppService { private Logger logger = LoggerFactory.getLogger(AppServiceImpl.class); /** * 应用相关dao */ private AppDao appDao; /** * 应用日志相关dao */ private AppAuditLogDao appAuditLogDao; /** * 实例相关dao */ private InstanceDao instanceDao; /** * 应用用户关系相关dao */ private AppToUserDao appToUserDao; /** * 应用申请相关dao */ private AppAuditDao appAuditDao; /** * 用户信息dao */ private AppUserDao appUserDao; private InstanceStatsDao instanceStatsDao; private RedisCenter redisCenter; private MachineCenter machineCenter; private MachineStatsDao machineStatsDao; @Override public int getAppDescCount(AppUser appUser, AppSearch appSearch) { int count = 0; // 管理员获取全部应用 if (AppUserTypeEnum.ADMIN_USER.value().equals(appUser.getType())) { count = appDao.getAllAppCount(appSearch); } else { count = appDao.getUserAppCount(appUser.getId()); } return count; } @Override public List<AppDesc> getAppDescList(AppUser appUser, AppSearch appSearch) { List<AppDesc> list = new ArrayList<AppDesc>(); // 管理员获取全部应用 if (AppUserTypeEnum.ADMIN_USER.value().equals(appUser.getType())) { list = appDao.getAllAppDescList(appSearch); } else { list = appDao.getAppDescList(appUser.getId()); } return list; } @Override public AppDesc getByAppId(Long appId) { Assert.isTrue(appId > 0); AppDesc appDesc = null; try { appDesc = appDao.getAppDescById(appId); } catch (Exception e) { logger.error(e.getMessage(), e); } return appDesc; } @Override public int save(AppDesc appDesc) { return appDao.save(appDesc); } @Override public int update(AppDesc appDesc) { return appDao.update(appDesc); } @Override public boolean saveAppToUser(Long appId, Long userId) { try { // 用户id下应用 List<AppToUser> list = appToUserDao.getByUserId(userId); if (CollectionUtils.isNotEmpty(list)) { for (AppToUser appToUser : list) { if (appToUser.getAppId().equals(appId)) { return true; } } } appToUserDao.save(new AppToUser(userId, appId)); return true; } catch (Exception e) { logger.error(e.getMessage(), e); return false; } } @Override public void updateAppAuditStatus(Long id, Long appId, Integer status, AppUser appUser) { appAuditDao.updateAppAudit(id, status); AppDesc appDesc = appDao.getAppDescById(appId); AppAudit appAudit = appAuditDao.getAppAudit(id); // 只有应用创建才会设置状态 if (AppAuditType.APP_AUDIT.getValue() == appAudit.getType()) { if (AppCheckEnum.APP_PASS.value().equals(status)) { appDesc.setStatus(AppStatusEnum.STATUS_PUBLISHED.getStatus()); appDesc.setPassedTime(new Date()); appDao.update(appDesc); } else if (AppCheckEnum.APP_REJECT.value().equals(status)) { appDesc.setStatus(AppStatusEnum.STATUS_DENY.getStatus()); appDao.update(appDesc); } } // 保存审批日志 AppAuditLog appAuditLog = AppAuditLog.generate(appDesc, appUser, appAudit.getId(), AppAuditLogTypeEnum.APP_CHECK); if (appAuditLog != null) { appAuditLogDao.save(appAuditLog); } } @Override public void updateUserAuditStatus(Long id, Integer status) { appAuditDao.updateAppAudit(id, status); } @Override public List<AppToUser> getAppToUserList(Long appId) { return appToUserDao.getByAppId(appId); } @Override public AppDesc getAppByName(String appName) { return appDao.getByAppName(appName); } @Override public List<InstanceInfo> getAppInstanceInfo(Long appId) { AppDesc appDesc = appDao.getAppDescById(appId); String password = appDesc.getPassword(); List<InstanceInfo> resultList = instanceDao.getInstListByAppId(appId); if (resultList != null && resultList.size() > 0) { for (InstanceInfo instanceInfo : resultList) { int type = instanceInfo.getType(); if(instanceInfo.getStatus() != InstanceStatusEnum.GOOD_STATUS.getStatus()){ continue; } if (TypeUtil.isRedisType(type)) { if (TypeUtil.isRedisSentinel(type)) { continue; } String host = instanceInfo.getIp(); int port = instanceInfo.getPort(); Boolean isMaster = redisCenter.isMaster(appId, host, port); instanceInfo.setRoleDesc(isMaster); if(isMaster != null && !isMaster){ HostAndPort hap = redisCenter.getMaster(host, port, password); if (hap != null) { instanceInfo.setMasterHost(hap.getHost()); instanceInfo.setMasterPort(hap.getPort()); for (InstanceInfo innerInfo : resultList) { if (innerInfo.getIp().equals(hap.getHost()) && innerInfo.getPort() == hap.getPort()) { instanceInfo.setMasterInstanceId(innerInfo.getId()); break; } } } } } } } return resultList; } @Override public List<InstanceStats> getAppInstanceStats(Long appId) { List<InstanceStats> instanceStats = instanceStatsDao.getInstanceStatsByAppId(appId); return instanceStats; } @Override public SuccessEnum deleteAppToUser(Long appId, Long userId) { try { appToUserDao.deleteAppToUser(appId, userId); return SuccessEnum.SUCCESS; } catch (Exception e) { logger.error(e.getMessage(), e); return SuccessEnum.FAIL; } } @Override public List<AppAudit> getAppAudits(Integer status, Integer type) { List<AppAudit> list = appAuditDao.selectWaitAppAudits(status, type); for (Iterator<AppAudit> i = list.iterator(); i.hasNext(); ) { AppAudit appAudit = i.next(); AppDesc appDesc = appDao.getAppDescById(appAudit.getAppId()); // if (appDesc == null) { // i.remove(); // } appAudit.setAppDesc(appDesc); } return list; } @Override public AppAudit saveAppScaleApply(AppDesc appDesc, AppUser appUser, String applyMemSize, String appScaleReason, AppAuditType appScale) { AppAudit appAudit = new AppAudit(); appAudit.setAppId(appDesc.getAppId()); appAudit.setUserId(appUser.getId()); appAudit.setUserName(appUser.getName()); appAudit.setModifyTime(new Date()); appAudit.setParam1(applyMemSize); appAudit.setParam2(appScaleReason); appAudit.setInfo("扩容申请---申请容量:" + applyMemSize + ", 申请原因: " + appScaleReason); appAudit.setStatus(AppCheckEnum.APP_WATING_CHECK.value()); appAudit.setType(appScale.getValue()); appAuditDao.insertAppAudit(appAudit); //保存扩容申请 AppAuditLog appAuditLog = AppAuditLog.generate(appDesc, appUser, appAudit.getId(), AppAuditLogTypeEnum.APP_SCALE_APPLY); if (appAuditLog != null) { appAuditLogDao.save(appAuditLog); } return appAudit; } @Override public AppAudit saveAppChangeConfig(AppDesc appDesc, AppUser appUser, Long instanceId, String appConfigKey, String appConfigValue, String appConfigReason, AppAuditType modifyConfig) { AppAudit appAudit = new AppAudit(); appAudit.setAppId(appDesc.getAppId()); appAudit.setUserId(appUser.getId()); appAudit.setUserName(appUser.getName()); appAudit.setModifyTime(new Date()); appAudit.setParam1(String.valueOf(instanceId)); appAudit.setParam2(appConfigKey); appAudit.setParam3(appConfigValue); appAudit.setInfo("修改配置项:" + appConfigKey + ", 配置值: " + appConfigValue + ", 修改原因: " + appConfigReason); appAudit.setStatus(AppCheckEnum.APP_WATING_CHECK.value()); appAudit.setType(modifyConfig.getValue()); appAuditDao.insertAppAudit(appAudit); //保存日志 AppAuditLog appAuditLog = AppAuditLog.generate(appDesc, appUser, appAudit.getId(), AppAuditLogTypeEnum.APP_CONFIG_APPLY); if (appAuditLog != null) { appAuditLogDao.save(appAuditLog); } return appAudit; } @Override public AppAudit saveInstanceChangeConfig(AppDesc appDesc, AppUser appUser, Long instanceId, String instanceConfigKey, String instanceConfigValue, String instanceConfigReason, AppAuditType instanceModifyConfig) { AppAudit appAudit = new AppAudit(); long appId = appDesc.getAppId(); appAudit.setAppId(appId); appAudit.setUserId(appUser.getId()); appAudit.setUserName(appUser.getName()); appAudit.setModifyTime(new Date()); appAudit.setParam1(String.valueOf(instanceId)); appAudit.setParam2(instanceConfigKey); appAudit.setParam3(instanceConfigValue); InstanceInfo instanceInfo = instanceDao.getInstanceInfoById(instanceId); String hostPort = instanceInfo == null ? "" : (instanceInfo.getIp() + ":" + instanceInfo.getPort()); appAudit.setInfo("appId=" + appId + "下的" + hostPort + "实例申请修改配置项:" + instanceConfigKey + ", 配置值: " + instanceConfigValue + ", 修改原因: " + instanceConfigReason); appAudit.setStatus(AppCheckEnum.APP_WATING_CHECK.value()); appAudit.setType(instanceModifyConfig.getValue()); appAuditDao.insertAppAudit(appAudit); //保存日志 AppAuditLog appAuditLog = AppAuditLog.generate(appDesc, appUser, appAudit.getId(), AppAuditLogTypeEnum.INSTANCE_CONFIG_APPLY); if (appAuditLog != null) { appAuditLogDao.save(appAuditLog); } return appAudit; } @Override public SuccessEnum updateRefuseReason(AppAudit appAudit, AppUser userInfo) { try { appAuditDao.updateRefuseReason(appAudit.getId(), appAudit.getRefuseReason()); return SuccessEnum.SUCCESS; } catch (Exception e) { logger.error(e.getMessage(), e); return SuccessEnum.FAIL; } } @Override public int getUserAppCount(Long userId) { int count = 0; try { // 表比较小 List<AppToUser> list = appToUserDao.getByUserId(userId); if (CollectionUtils.isNotEmpty(list)) { count = list.size(); } } catch (Exception e) { logger.error(e.getMessage(), e); } return count; } @Override public List<MachineStats> getAppMachineDetail(Long appId) { //应用信息 Assert.isTrue(appId != null && appId > 0L); AppDesc appDesc = appDao.getAppDescById(appId); if (appDesc == null) { logger.error("appDesc:id={} is not exist"); return Collections.emptyList(); } //应用实例列表 List<InstanceInfo> appInstanceList = getAppInstanceInfo(appId); if (CollectionUtils.isEmpty(appInstanceList)) { return Collections.emptyList(); } //防止重复 Set<String> instanceMachineHosts = new HashSet<String>(); //结果列表 List<MachineStats> machineDetailVOList = new ArrayList<MachineStats>(); //应用的机器信息 for (InstanceInfo instanceInfo : appInstanceList) { String ip = instanceInfo.getIp(); if (instanceMachineHosts.contains(ip)) { continue; } else { instanceMachineHosts.add(ip); } MachineStats machineStats = machineStatsDao.getMachineStatsByIp(ip); if (machineStats == null) { continue; } //已经分配的内存 int memoryHost = instanceDao.getMemoryByHost(ip); machineStats.setMemoryAllocated(memoryHost); //机器信息 MachineInfo machineInfo = machineCenter.getMachineInfoByIp(ip); if (machineInfo == null) { continue; } //下线机器不展示 if (machineInfo.isOffline()) { continue; } machineStats.setInfo(machineInfo); machineDetailVOList.add(machineStats); } return machineDetailVOList; } @Override public AppAudit getAppAuditById(Long appAuditId) { return appAuditDao.getAppAudit(appAuditId); } @Override public List<AppAudit> getAppAuditListByAppId(Long appId) { Assert.isTrue(appId != null && appId > 0L); List<AppAudit> appAudits = appAuditDao.getAppAuditByAppId(appId); if (CollectionUtils.isNotEmpty(appAudits)) { for (AppAudit appAudit : appAudits) { Long appAuditId = appAudit.getId(); AppAuditLog log = appAuditLogDao.getAuditByType(appAuditId, AppAuditLogTypeEnum.APP_CHECK.value()); if(log != null){ log.setAppUser(appUserDao.get(log.getUserId())); } appAudit.setAppAuditLog(log); } } return appAudits; } @Override public AppAudit saveRegisterUserApply(AppUser appUser, AppAuditType registerUserApply) { AppAudit appAudit = new AppAudit(); appAudit.setAppId(0); appAudit.setUserId(appUser.getId()); appAudit.setUserName(appUser.getName()); appAudit.setModifyTime(new Date()); appAudit.setInfo(appUser.getChName() + "申请成为Cachecloud用户, 手机:" + appUser.getMobile() + ",邮箱:" + appUser.getEmail()); appAudit.setStatus(AppCheckEnum.APP_WATING_CHECK.value()); appAudit.setType(registerUserApply.getValue()); appAuditDao.insertAppAudit(appAudit); return appAudit; } @Override public List<AppDesc> getAllAppDesc() { return appDao.getAllAppDescList(null); } @Override public SuccessEnum changeAppAlertConfig(long appId, int memAlertValue, int clientConnAlertValue, AppUser appUser) { if (appId <= 0 || memAlertValue <= 0 || clientConnAlertValue <= 0) { return SuccessEnum.FAIL; } AppDesc appDesc = appDao.getAppDescById(appId); if (appDesc == null) { return SuccessEnum.FAIL; } try { // 修改报警阀值 appDesc.setMemAlertValue(memAlertValue); appDesc.setClientConnAlertValue(clientConnAlertValue); appDao.update(appDesc); // 添加日志 AppAuditLog appAuditLog = AppAuditLog.generate(appDesc, appUser, 0L, AppAuditLogTypeEnum.APP_CHANGE_ALERT); if (appAuditLog != null) { appAuditLogDao.save(appAuditLog); } return SuccessEnum.SUCCESS; } catch (Exception e) { logger.error(e.getMessage(), e); return SuccessEnum.FAIL; } } @Override public void updateAppKey(long appId) { appDao.updateAppKey(appId, AppKeyUtil.genSecretKey(appId)); } public void setAppDao(AppDao appDao) { this.appDao = appDao; } public void setAppAuditLogDao(AppAuditLogDao appAuditLogDao) { this.appAuditLogDao = appAuditLogDao; } public void setAppToUserDao(AppToUserDao appToUserDao) { this.appToUserDao = appToUserDao; } public void setInstanceDao(InstanceDao instanceDao) { this.instanceDao = instanceDao; } public void setAppAuditDao(AppAuditDao appAuditDao) { this.appAuditDao = appAuditDao; } public void setInstanceStatsDao(InstanceStatsDao instanceStatsDao) { this.instanceStatsDao = instanceStatsDao; } public void setRedisCenter(RedisCenter redisCenter) { this.redisCenter = redisCenter; } public void setMachineCenter(MachineCenter machineCenter) { this.machineCenter = machineCenter; } public void setMachineStatsDao(MachineStatsDao machineStatsDao) { this.machineStatsDao = machineStatsDao; } public void setAppUserDao(AppUserDao appUserDao) { this.appUserDao = appUserDao; } }