|
5 | 5 | import java.util.List; |
6 | 6 | import java.util.Map; |
7 | 7 | import java.util.Objects; |
| 8 | +import java.util.concurrent.TimeUnit; |
8 | 9 | import javax.annotation.PostConstruct; |
9 | 10 |
|
10 | 11 | import org.hzero.websocket.constant.ClientWebSocketConstant; |
|
40 | 41 | public class HostAgentSocketHandler extends AbstractSocketHandler { |
41 | 42 |
|
42 | 43 | private static final Logger LOGGER = LoggerFactory.getLogger(HostAgentSocketHandler.class); |
| 44 | + private static final String C7N_AGENT_UPGRADE_COUNT_REDIS_KEY = "host:%s"; |
| 45 | + private static final Integer C7N_AGENT_MAX_UPGRADE_ATTEMPT_COUNT = 3; |
43 | 46 |
|
44 | 47 | private final Map<String, HostMsgHandler> hostMsgHandlerMap = new HashMap<>(); |
45 | 48 |
|
@@ -83,15 +86,29 @@ public void afterConnectionEstablished(WebSocketSession session) { |
83 | 86 | MsgVO msgVO; |
84 | 87 | // 版本不一致,需要升级 |
85 | 88 | if (!agentVersion.equals(WebSocketTool.getVersion(session))) { |
86 | | - DevopsHostDTO devopsHostDTO = devopsHostService.baseQuery(Long.parseLong(hostId)); |
87 | | - HostMsgVO hostMsgVO = new HostMsgVO(); |
88 | | - hostMsgVO.setType(HostCommandEnum.UPGRADE_AGENT.value()); |
89 | | - Map<String, String> upgradeInfo = new HashMap<>(); |
90 | | - upgradeInfo.put("upgradeCommand", devopsHostService.getUpgradeString(devopsHostDTO.getProjectId(), devopsHostDTO)); |
91 | | - upgradeInfo.put("version", agentVersion); |
92 | | - hostMsgVO.setPayload(JsonHelper.marshalByJackson(upgradeInfo)); |
93 | | - |
94 | | - msgVO = (new MsgVO()).setGroup(DevopsHostConstants.GROUP + hostId).setKey(HostCommandEnum.UPGRADE_AGENT.value()).setMessage(JsonHelper.marshalByJackson(hostMsgVO)).setType(ClientWebSocketConstant.SendType.S_GROUP); |
| 89 | + String redisKey = String.format(C7N_AGENT_UPGRADE_COUNT_REDIS_KEY, hostId); |
| 90 | + Integer count = (Integer) redisTemplate.opsForValue().get(redisKey); |
| 91 | + if (C7N_AGENT_MAX_UPGRADE_ATTEMPT_COUNT.equals(count)) { |
| 92 | + // 表示agent进行了3次尝试升级,都失败了,那么agent应该退出。手动处理升级失败问题 |
| 93 | + HostMsgVO hostMsgVO = new HostMsgVO(); |
| 94 | + hostMsgVO.setType(HostCommandEnum.EXIT_AGENT.value()); |
| 95 | + hostMsgVO.setPayload("{}"); |
| 96 | + msgVO = (new MsgVO()).setGroup(DevopsHostConstants.GROUP + hostId).setKey(HostCommandEnum.EXIT_AGENT.value()).setMessage(JsonHelper.marshalByJackson(hostMsgVO)).setType(ClientWebSocketConstant.SendType.S_GROUP); |
| 97 | + } else { |
| 98 | + if (count == null) { |
| 99 | + count = 0; |
| 100 | + } |
| 101 | + count++; |
| 102 | + redisTemplate.opsForValue().set(redisKey, count, 1800, TimeUnit.SECONDS); |
| 103 | + DevopsHostDTO devopsHostDTO = devopsHostService.baseQuery(Long.parseLong(hostId)); |
| 104 | + HostMsgVO hostMsgVO = new HostMsgVO(); |
| 105 | + hostMsgVO.setType(HostCommandEnum.UPGRADE_AGENT.value()); |
| 106 | + Map<String, String> upgradeInfo = new HashMap<>(); |
| 107 | + upgradeInfo.put("upgradeCommand", devopsHostService.getUpgradeString(devopsHostDTO.getProjectId(), devopsHostDTO)); |
| 108 | + upgradeInfo.put("version", agentVersion); |
| 109 | + hostMsgVO.setPayload(JsonHelper.marshalByJackson(upgradeInfo)); |
| 110 | + msgVO = (new MsgVO()).setGroup(DevopsHostConstants.GROUP + hostId).setKey(HostCommandEnum.UPGRADE_AGENT.value()).setMessage(JsonHelper.marshalByJackson(hostMsgVO)).setType(ClientWebSocketConstant.SendType.S_GROUP); |
| 111 | + } |
95 | 112 | } else { |
96 | 113 | HostMsgVO hostMsgVO = new HostMsgVO(); |
97 | 114 | hostMsgVO.setType(HostCommandEnum.INIT_AGENT.value()); |
|
0 commit comments