public void deleteAgentsOperation()

in manager/dm-server/src/main/java/org/apache/doris/stack/control/manager/ResourceClusterManager.java [215:281]


    public void deleteAgentsOperation(long resourceClusterId) throws  Exception {
        log.info("delete resource cluster {} all nodes agent", resourceClusterId);

        Optional<ResourceClusterEntity> resourceClusterOpt = resourceClusterRepository.findById(resourceClusterId);
        if (!resourceClusterOpt.isPresent()) {
            throw new Exception("resource cluster " + resourceClusterId + " does not exist");
        }

        ResourceClusterEntity clusterEntity =  resourceClusterOpt.get();
        PMResourceClusterAccessInfo accessInfo = JSON.parseObject(clusterEntity.getAccessInfo(),
                PMResourceClusterAccessInfo.class);

        List<ResourceNodeEntity> nodeEntities = nodeRepository.getByResourceClusterId(resourceClusterId);

        List<ResourceNodeEntity> agentInstalledNodes = new ArrayList<>();
        for (ResourceNodeEntity nodeEntity : nodeEntities) {
            if (!nodeAndAgentManager.isAgentInstalled(nodeEntity)) {
                log.warn("the agent has not been installed on {} node {}", nodeEntity.getId(), nodeEntity.getHost());
            } else {
                agentInstalledNodes.add(nodeEntity);
            }
        }

        // we check something before uninstall agent
        // to guarantee uninstall operation must be executed
        List<Pair<ResourceNodeEntity, CompletableFuture<Void>>> nodeFutures = new ArrayList<>();
        for (ResourceNodeEntity nodeEntity : agentInstalledNodes) {
            CompletableFuture<Void> portCheckFuture = CompletableFuture.runAsync(() -> {
                AgentInstallEventConfigInfo installConfig = new AgentInstallEventConfigInfo();
                installConfig.setSshUser(accessInfo.getSshUser());
                installConfig.setSshPort(accessInfo.getSshPort());
                installConfig.setSshKey(accessInfo.getSshKey());

                try {
                    log.info("check ssh connect and stop script before uninstall agent on node {}", nodeEntity.getId());
                    nodeAndAgentManager.checkSshConnect(nodeEntity, installConfig);
                    nodeAndAgentManager.checkStopScriptExist(nodeEntity, installConfig);
                } catch (Exception e) {
                    log.error("check node {} exception: {}", nodeEntity.getHost(), e.getMessage());
                    throw new CompletionException(e);
                }
            });
            nodeFutures.add(Pair.of(nodeEntity, portCheckFuture));
        }

        for (Pair<ResourceNodeEntity, CompletableFuture<Void>> nodeFuture: nodeFutures) {
            ResourceNodeEntity nodeEntity = nodeFuture.getLeft();
            CompletableFuture<Void> future = nodeFuture.getRight();
            try {
                future.get();
            } catch (Exception e) {
                log.error("check {} node {} stop script exception {}", nodeEntity.getId(), nodeEntity.getHost(), e);
                throw new Exception("check node stop script failed" + e);
            }
        }

        // async delete agent
        for (ResourceNodeEntity nodeEntity : agentInstalledNodes) {
            AgentUnInstallEventConfigInfo uninstallConfig = new AgentUnInstallEventConfigInfo(
                    accessInfo.getSshUser(), accessInfo.getSshPort(), accessInfo.getSshKey(),
                    nodeEntity.getHost(), nodeEntity.getAgentInstallDir(),
                    nodeEntity.getId(), nodeEntity.getAgentPort());

            log.info("to stop agent of {} node {}", nodeEntity.getId(), nodeEntity.getHost());
            nodeAndAgentManager.deleteAgentOperation(nodeEntity, uninstallConfig);
        }
    }