func()

in pkg/provider/alibaba/alb/server.go [230:316]


func (m *ALBProvider) ReplaceALBServers(ctx context.Context, serverGroupID string, resServers []alb.BackendItem, sdkServers []albsdk.BackendServer) error {
	if len(serverGroupID) == 0 {
		return fmt.Errorf("empty server group id when replace servers error")
	}

	traceID := ctx.Value(util.TraceID)

	if len(resServers) == 0 && len(sdkServers) == 0 {
		return nil
	}

	addedServers, err := transModelBackendsToSDKReplaceServersInServerGroupAddedServers(resServers)
	if err != nil {
		return err
	}

	removedServers := make([]albsdk.ReplaceServersInServerGroupRemovedServers, 0)
	for _, sdkServer := range sdkServers {
		if isServerStatusRemoving(sdkServer.Status) {
			continue
		}
		serverToRemove, err := transSDKBackendServerToReplaceServersInServerGroupRemovedServer(sdkServer)
		if err != nil {
			return err
		}
		removedServers = append(removedServers, *serverToRemove)
	}

	replaceServerFromSgpReq := albsdk.CreateReplaceServersInServerGroupRequest()
	replaceServerFromSgpReq.ServerGroupId = serverGroupID
	replaceServerFromSgpReq.AddedServers = &addedServers
	replaceServerFromSgpReq.RemovedServers = &removedServers

	startTime := time.Now()
	m.logger.V(util.MgrLogLevel).Info("replacing server in server group",
		"serverGroupID", serverGroupID,
		"traceID", traceID,
		"addedServers", addedServers,
		"removedServers", removedServers,
		"startTime", startTime,
		util.Action, util.ReplaceALBServersInServerGroup)
	replaceServerFromSgpResp, err := m.auth.ALB.ReplaceServersInServerGroup(replaceServerFromSgpReq)
	if err != nil {
		return err
	}
	m.logger.V(util.MgrLogLevel).Info("replaced server in server group",
		"serverGroupID", serverGroupID,
		"traceID", traceID,
		"requestID", replaceServerFromSgpResp.RequestId,
		"elapsedTime", time.Since(startTime).Milliseconds(),
		util.Action, util.ReplaceALBServersInServerGroup)

	if util.IsWaitServersAsynchronousComplete {
		asynchronousStartTime := time.Now()
		m.logger.V(util.MgrLogLevel).Info("replacing server in server group asynchronous",
			"serverGroupID", serverGroupID,
			"traceID", traceID,
			"addedServers", addedServers,
			"removedServers", removedServers,
			"startTime", startTime,
			util.Action, util.ReplaceALBServersInServerGroupAsynchronous)
		for i := 0; i < util.ReplaceALBServersInServerGroupMaxRetryTimes; i++ {
			time.Sleep(util.ReplaceALBServersInServerGroupRetryInterval)

			isCompleted, err := isReplaceServersCompleted(ctx, m, serverGroupID, addedServers, removedServers)
			if err != nil {
				m.logger.V(util.MgrLogLevel).Error(err, "failed to replace server in server group asynchronous",
					"serverGroupID", serverGroupID,
					"traceID", traceID,
					"requestID", replaceServerFromSgpResp.RequestId,
					util.Action, util.ReplaceALBServersInServerGroupAsynchronous)
				return err
			}
			if isCompleted {
				break
			}
		}
		m.logger.V(util.MgrLogLevel).Info("replaced server in server group asynchronous",
			"serverGroupID", serverGroupID,
			"traceID", traceID,
			"requestID", replaceServerFromSgpResp.RequestId,
			"elapsedTime", time.Since(asynchronousStartTime).Milliseconds(),
			util.Action, util.ReplaceALBServersInServerGroupAsynchronous)
	}

	return nil
}