func()

in pkg/gateway/model_build_rule.go [210:279]


func (t *latticeServiceModelBuildTask) getTargetGroupsForRuleAction(ctx context.Context, rule core.RouteRule) ([]*model.RuleTargetGroup, error) {
	var tgList []*model.RuleTargetGroup

	for _, backendRef := range rule.BackendRefs() {
		ruleTG := model.RuleTargetGroup{
			Weight: 1, // default value according to spec
		}
		if backendRef.Weight() != nil {
			ruleTG.Weight = int64(*backendRef.Weight())
		}

		namespace := t.route.Namespace()
		if backendRef.Namespace() != nil {
			namespace = string(*backendRef.Namespace())
		}

		t.log.Debugf(ctx, "Processing %s backendRef %s-%s", string(*backendRef.Kind()), backendRef.Name(), namespace)

		if string(*backendRef.Kind()) == "ServiceImport" {
			// there needs to be a pre-existing target group, we fetch all the fields
			// needed to identify it
			svcImportTg := model.SvcImportTargetGroup{
				K8SServiceNamespace: namespace,
				K8SServiceName:      string(backendRef.Name()),
			}

			// if there's a matching top-level service import, we can get additional fields
			svcImportName := types.NamespacedName{
				Namespace: namespace,
				Name:      string(backendRef.Name()),
			}
			svcImport := &anv1alpha1.ServiceImport{}
			if err := t.client.Get(ctx, svcImportName, svcImport); err != nil {
				if !apierrors.IsNotFound(err) {
					return nil, err
				}
			}
			vpc, ok := svcImport.Annotations["application-networking.k8s.aws/aws-vpc"]
			if ok {
				svcImportTg.VpcId = vpc
			}

			eksCluster, ok := svcImport.Annotations["application-networking.k8s.aws/aws-eks-cluster-name"]
			if ok {
				svcImportTg.K8SClusterName = eksCluster
			}
			ruleTG.SvcImportTG = &svcImportTg
		}

		if string(*backendRef.Kind()) == "Service" {
			// generate the actual target group model for the backendRef
			_, tg, err := t.brTgBuilder.Build(ctx, t.route, backendRef, t.stack)
			if err != nil {
				ibre := &InvalidBackendRefError{}
				if !errors.As(err, &ibre) {
					return nil, err
				}

				t.log.Infof(ctx, "Invalid backendRef found on route %s", t.route.Name())
				ruleTG.StackTargetGroupId = model.InvalidBackendRefTgId
			} else {
				ruleTG.StackTargetGroupId = tg.ID()
			}
		}

		tgList = append(tgList, &ruleTG)
	}

	return tgList, nil
}