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
}