func()

in pkg/controller/ingress/reconcile/applier/alb.go [36:123]


func (s *albLoadBalancerApplier) Apply(ctx context.Context) error {
	traceID := ctx.Value(util.TraceID)

	var resLBs []*albmodel.AlbLoadBalancer
	s.stack.ListResources(&resLBs)

	if len(resLBs) > 1 {
		return fmt.Errorf("invalid res loadBalancers, at most one loadBalancer for stack: %s", s.stack.StackID())
	}

	sdkLBs, err := s.findSDKAlbLoadBalancers(ctx)
	if err != nil {
		return err
	}
	if len(sdkLBs) > 1 {
		stackID := s.stack.StackID()
		return fmt.Errorf("invalid sdk loadBalancers: %v, at most one loadBalancer can find by stack tag: %s, must delete manually", sdkLBs, stackID)
	}

	matchedResAndSDKLBs, unmatchedResLBs, unmatchedSDKLBs, err := matchResAndSDKAlbLoadBalancers(resLBs, sdkLBs, s.trackingProvider.ResourceIDTagKey())
	if err != nil {
		return err
	}

	if len(matchedResAndSDKLBs) != 0 {
		s.logger.V(util.SynLogLevel).Info("synthesize loadBalancers",
			"matchedResAndSDKLBs", matchedResAndSDKLBs,
			"traceID", traceID)
	}
	if len(unmatchedResLBs) != 0 {
		s.logger.V(util.SynLogLevel).Info("synthesize loadBalancers",
			"unmatchedResLBs", unmatchedResLBs,
			"traceID", traceID)
	}
	if len(unmatchedSDKLBs) != 0 {
		s.logger.V(util.SynLogLevel).Info("synthesize loadBalancers",
			"unmatchedSDKLBs", unmatchedSDKLBs,
			"traceID", traceID)
	}

	for _, sdkLB := range unmatchedSDKLBs {
		if err := s.albProvider.DeleteALB(ctx, sdkLB.LoadBalancerId); err != nil {
			return err
		}
	}
	for _, resLB := range unmatchedResLBs {
		var isReuseLb bool
		if len(resLB.Spec.LoadBalancerId) != 0 {
			isReuseLb = true
		}
		if isReuseLb {
			lbStatus, err := s.albProvider.ReuseALB(ctx, resLB, resLB.Spec.LoadBalancerId, s.trackingProvider)
			if err != nil {
				return err
			}
			resLB.SetStatus(lbStatus)
			continue
		}

		lbStatus, err := s.albProvider.CreateALB(ctx, resLB, s.trackingProvider)
		if err != nil {
			return err
		}
		resLB.SetStatus(lbStatus)
	}
	for _, resAndSDKLB := range matchedResAndSDKLBs {
		var isReuseLb bool
		if len(resAndSDKLB.resLB.Spec.LoadBalancerId) != 0 {
			isReuseLb = true
		}
		if isReuseLb {
			if resAndSDKLB.resLB.Spec.ForceOverride != nil && !*resAndSDKLB.resLB.Spec.ForceOverride {
				resAndSDKLB.resLB.SetStatus(albmodel.LoadBalancerStatus{
					LoadBalancerID: resAndSDKLB.sdkLB.LoadBalancerId,
					DNSName:        resAndSDKLB.sdkLB.DNSName,
				})
				continue
			}
		}

		lbStatus, err := s.albProvider.UpdateALB(ctx, resAndSDKLB.resLB, resAndSDKLB.sdkLB.LoadBalancer)
		if err != nil {
			return err
		}
		resAndSDKLB.resLB.SetStatus(lbStatus)
	}
	return nil
}