func()

in pkg/provider/alibaba/alb/listener.go [24:109]


func (m *ALBProvider) CreateALBListener(ctx context.Context, resLS *albmodel.Listener) (albmodel.ListenerStatus, error) {
	traceID := ctx.Value(util.TraceID)

	createLsReq, err := buildSDKCreateListenerRequest(resLS.Spec)
	if err != nil {
		return albmodel.ListenerStatus{}, err
	}

	var createLsResp *albsdk.CreateListenerResponse
	if err := util.RetryImmediateOnError(m.waitLSExistencePollInterval, m.waitLSExistenceTimeout, isIncorrectStatusLoadBalancerError, func() error {
		startTime := time.Now()
		m.logger.V(util.MgrLogLevel).Info("creating listener",
			"stackID", resLS.Stack().StackID(),
			"resourceID", resLS.ID(),
			"traceID", traceID,
			"listenerPort", resLS.Spec.ListenerPort,
			"listenerProtocol", resLS.Spec.ListenerProtocol,
			"startTime", startTime,
			util.Action, util.CreateALBListener)
		createLsResp, err = m.auth.ALB.CreateListener(createLsReq)
		if err != nil {
			m.logger.V(util.MgrLogLevel).Info("creating listener",
				"stackID", resLS.Stack().StackID(),
				"resourceID", resLS.ID(),
				"traceID", traceID,
				"listenerID", createLsResp.ListenerId,
				"requestID", createLsResp.RequestId,
				"error", err.Error(),
				util.Action, util.CreateALBListener)
			return err
		}
		m.logger.V(util.MgrLogLevel).Info("created listener",
			"stackID", resLS.Stack().StackID(),
			"resourceID", resLS.ID(),
			"traceID", traceID,
			"listenerID", createLsResp.ListenerId,
			"requestID", createLsResp.RequestId,
			"elapsedTime", time.Since(startTime).Milliseconds(),
			util.Action, util.CreateALBListener)
		return nil
	}); err != nil {
		return albmodel.ListenerStatus{}, errors.Wrap(err, "failed to create listener")
	}

	asynchronousStartTime := time.Now()
	m.logger.V(util.MgrLogLevel).Info("creating listener asynchronous",
		"stackID", resLS.Stack().StackID(),
		"resourceID", resLS.ID(),
		"traceID", traceID,
		"listenerID", createLsResp.ListenerId,
		"startTime", asynchronousStartTime,
		util.Action, util.CreateALBListenerAsynchronous)
	var getLsResp *albsdk.GetListenerAttributeResponse
	for i := 0; i < util.CreateListenerWaitRunningMaxRetryTimes; i++ {
		time.Sleep(util.CreateListenerWaitRunningRetryInterval)

		getLsResp, err = getALBListenerAttributeFunc(ctx, createLsResp.ListenerId, m.auth, m.logger)
		if err != nil {
			return albmodel.ListenerStatus{}, err
		}
		if isListenerListenerStatusRunning(getLsResp.ListenerStatus) {
			break
		}
	}
	m.logger.V(util.MgrLogLevel).Info("created listener asynchronous",
		"stackID", resLS.Stack().StackID(),
		"resourceID", resLS.ID(),
		"traceID", traceID,
		"listenerID", createLsResp.ListenerId,
		"listenerStatus", getLsResp.ListenerStatus,
		"requestID", getLsResp.RequestId,
		"elapsedTime", time.Since(asynchronousStartTime).Milliseconds(),
		util.Action, util.CreateALBListenerAsynchronous)

	if isHTTPSListenerProtocol(resLS.Spec.ListenerProtocol) {
		if err := util.RetryImmediateOnError(m.waitLSExistencePollInterval, m.waitLSExistenceTimeout, isIncorrectStatusListenerError, func() error {
			if err := m.updateListenerExtraCertificates(ctx, createLsResp.ListenerId, resLS); err != nil {
				return err
			}
			return nil
		}); err != nil {
			return albmodel.ListenerStatus{}, errors.Wrap(err, "failed to update listener extra certificates")
		}
	}
	return buildResListenerStatus(createLsResp.ListenerId), nil
}