diff --git a/apis/v1alpha1/ack-generate-metadata.yaml b/apis/v1alpha1/ack-generate-metadata.yaml index 7418074..7b320f6 100755 --- a/apis/v1alpha1/ack-generate-metadata.yaml +++ b/apis/v1alpha1/ack-generate-metadata.yaml @@ -1,5 +1,5 @@ ack_generate_info: - build_date: "2025-09-25T18:46:28Z" + build_date: "2025-09-26T17:23:37Z" build_hash: 5bf1e456e1dfc638d47ab492376335f528c0f455 go_version: go1.24.5 version: v0.52.0-1-g5bf1e45 @@ -7,7 +7,7 @@ api_directory_checksum: c0850c127b1c1c46a7abf233f454e1c7c561a71c api_version: v1alpha1 aws_sdk_go_version: v1.32.6 generator_config_info: - file_checksum: e59ecda70fd052399089af65a682c10fe45d58a5 + file_checksum: d04b5f7d437623f4ddc566ea1f2e6b068125115e original_file_name: generator.yaml last_modification: reason: API generation diff --git a/apis/v1alpha1/generator.yaml b/apis/v1alpha1/generator.yaml index 9cff6a2..c78a035 100644 --- a/apis/v1alpha1/generator.yaml +++ b/apis/v1alpha1/generator.yaml @@ -213,6 +213,10 @@ resources: references: resource: TargetGroup path: Status.ACKResourceMetadata.ARN + Actions.ForwardConfig.TargetGroups.TargetGroupARN: + references: + resource: TargetGroup + path: Status.ACKResourceMetadata.ARN Priority: set: - ignore: true diff --git a/generator.yaml b/generator.yaml index 9cff6a2..c78a035 100644 --- a/generator.yaml +++ b/generator.yaml @@ -213,6 +213,10 @@ resources: references: resource: TargetGroup path: Status.ACKResourceMetadata.ARN + Actions.ForwardConfig.TargetGroups.TargetGroupARN: + references: + resource: TargetGroup + path: Status.ACKResourceMetadata.ARN Priority: set: - ignore: true diff --git a/pkg/resource/rule/references.go b/pkg/resource/rule/references.go index a96bf56..86869f0 100644 --- a/pkg/resource/rule/references.go +++ b/pkg/resource/rule/references.go @@ -33,6 +33,9 @@ import ( // +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=targetgroups,verbs=get;list // +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=targetgroups/status,verbs=get;list +// +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=targetgroups,verbs=get;list +// +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=targetgroups/status,verbs=get;list + // +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=listeners,verbs=get;list // +kubebuilder:rbac:groups=elbv2.services.k8s.aws,resources=listeners/status,verbs=get;list @@ -43,6 +46,16 @@ import ( func (rm *resourceManager) ClearResolvedReferences(res acktypes.AWSResource) acktypes.AWSResource { ko := rm.concreteResource(res).ko.DeepCopy() + for f0idx, f0iter := range ko.Spec.Actions { + if f0iter.ForwardConfig != nil { + for f1idx, f1iter := range f0iter.ForwardConfig.TargetGroups { + if f1iter.TargetGroupRef != nil { + ko.Spec.Actions[f0idx].ForwardConfig.TargetGroups[f1idx].TargetGroupARN = nil + } + } + } + } + for f0idx, f0iter := range ko.Spec.Actions { if f0iter.TargetGroupRef != nil { ko.Spec.Actions[f0idx].TargetGroupARN = nil @@ -72,6 +85,12 @@ func (rm *resourceManager) ResolveReferences( resourceHasReferences := false err := validateReferenceFields(ko) + if fieldHasReferences, err := rm.resolveReferenceForActions_ForwardConfig_TargetGroups_TargetGroupARN(ctx, apiReader, ko); err != nil { + return &resource{ko}, (resourceHasReferences || fieldHasReferences), err + } else { + resourceHasReferences = resourceHasReferences || fieldHasReferences + } + if fieldHasReferences, err := rm.resolveReferenceForActions_TargetGroupARN(ctx, apiReader, ko); err != nil { return &resource{ko}, (resourceHasReferences || fieldHasReferences), err } else { @@ -91,6 +110,16 @@ func (rm *resourceManager) ResolveReferences( // identifier field. func validateReferenceFields(ko *svcapitypes.Rule) error { + for _, f0iter := range ko.Spec.Actions { + if f0iter.ForwardConfig != nil { + for _, f1iter := range f0iter.ForwardConfig.TargetGroups { + if f1iter.TargetGroupRef != nil && f1iter.TargetGroupARN != nil { + return ackerr.ResourceReferenceAndIDNotSupportedFor("Actions.ForwardConfig.TargetGroups.TargetGroupARN", "Actions.ForwardConfig.TargetGroups.TargetGroupRef") + } + } + } + } + for _, f0iter := range ko.Spec.Actions { if f0iter.TargetGroupRef != nil && f0iter.TargetGroupARN != nil { return ackerr.ResourceReferenceAndIDNotSupportedFor("Actions.TargetGroupARN", "Actions.TargetGroupRef") @@ -106,31 +135,35 @@ func validateReferenceFields(ko *svcapitypes.Rule) error { return nil } -// resolveReferenceForActions_TargetGroupARN reads the resource referenced -// from Actions.TargetGroupRef field and sets the Actions.TargetGroupARN +// resolveReferenceForActions_ForwardConfig_TargetGroups_TargetGroupARN reads the resource referenced +// from Actions.ForwardConfig.TargetGroups.TargetGroupRef field and sets the Actions.ForwardConfig.TargetGroups.TargetGroupARN // from referenced resource. Returns a boolean indicating whether a reference // contains references, or an error -func (rm *resourceManager) resolveReferenceForActions_TargetGroupARN( +func (rm *resourceManager) resolveReferenceForActions_ForwardConfig_TargetGroups_TargetGroupARN( ctx context.Context, apiReader client.Reader, ko *svcapitypes.Rule, ) (hasReferences bool, err error) { for f0idx, f0iter := range ko.Spec.Actions { - if f0iter.TargetGroupRef != nil && f0iter.TargetGroupRef.From != nil { - hasReferences = true - arr := f0iter.TargetGroupRef.From - if arr.Name == nil || *arr.Name == "" { - return hasReferences, fmt.Errorf("provided resource reference is nil or empty: Actions.TargetGroupRef") - } - namespace := ko.ObjectMeta.GetNamespace() - if arr.Namespace != nil && *arr.Namespace != "" { - namespace = *arr.Namespace - } - obj := &svcapitypes.TargetGroup{} - if err := getReferencedResourceState_TargetGroup(ctx, apiReader, obj, *arr.Name, namespace); err != nil { - return hasReferences, err + if f0iter.ForwardConfig != nil { + for f1idx, f1iter := range f0iter.ForwardConfig.TargetGroups { + if f1iter.TargetGroupRef != nil && f1iter.TargetGroupRef.From != nil { + hasReferences = true + arr := f1iter.TargetGroupRef.From + if arr.Name == nil || *arr.Name == "" { + return hasReferences, fmt.Errorf("provided resource reference is nil or empty: Actions.ForwardConfig.TargetGroups.TargetGroupRef") + } + namespace := ko.ObjectMeta.GetNamespace() + if arr.Namespace != nil && *arr.Namespace != "" { + namespace = *arr.Namespace + } + obj := &svcapitypes.TargetGroup{} + if err := getReferencedResourceState_TargetGroup(ctx, apiReader, obj, *arr.Name, namespace); err != nil { + return hasReferences, err + } + ko.Spec.Actions[f0idx].ForwardConfig.TargetGroups[f1idx].TargetGroupARN = (*string)(obj.Status.ACKResourceMetadata.ARN) + } } - ko.Spec.Actions[f0idx].TargetGroupARN = (*string)(obj.Status.ACKResourceMetadata.ARN) } } @@ -191,6 +224,37 @@ func getReferencedResourceState_TargetGroup( return nil } +// resolveReferenceForActions_TargetGroupARN reads the resource referenced +// from Actions.TargetGroupRef field and sets the Actions.TargetGroupARN +// from referenced resource. Returns a boolean indicating whether a reference +// contains references, or an error +func (rm *resourceManager) resolveReferenceForActions_TargetGroupARN( + ctx context.Context, + apiReader client.Reader, + ko *svcapitypes.Rule, +) (hasReferences bool, err error) { + for f0idx, f0iter := range ko.Spec.Actions { + if f0iter.TargetGroupRef != nil && f0iter.TargetGroupRef.From != nil { + hasReferences = true + arr := f0iter.TargetGroupRef.From + if arr.Name == nil || *arr.Name == "" { + return hasReferences, fmt.Errorf("provided resource reference is nil or empty: Actions.TargetGroupRef") + } + namespace := ko.ObjectMeta.GetNamespace() + if arr.Namespace != nil && *arr.Namespace != "" { + namespace = *arr.Namespace + } + obj := &svcapitypes.TargetGroup{} + if err := getReferencedResourceState_TargetGroup(ctx, apiReader, obj, *arr.Name, namespace); err != nil { + return hasReferences, err + } + ko.Spec.Actions[f0idx].TargetGroupARN = (*string)(obj.Status.ACKResourceMetadata.ARN) + } + } + + return hasReferences, nil +} + // resolveReferenceForListenerARN reads the resource referenced // from ListenerRef field and sets the ListenerARN // from referenced resource. Returns a boolean indicating whether a reference diff --git a/test/e2e/resources/rule.yaml b/test/e2e/resources/rule.yaml index 833ba9c..a01b822 100644 --- a/test/e2e/resources/rule.yaml +++ b/test/e2e/resources/rule.yaml @@ -6,8 +6,13 @@ spec: priority: 300 listenerARN: $LISTENER_ARN actions: - - type: "forward" - targetGroupARN: $TARGET_GROUP_ARN + - forwardConfig: + targetGroups: + - targetGroupRef: + from: + name: $TARGET_GROUP_NAME + weight: 1 + type: forward conditions: - field: http-request-method httpRequestMethodConfig: diff --git a/test/e2e/tests/test_rule.py b/test/e2e/tests/test_rule.py index 34992f6..54029c1 100644 --- a/test/e2e/tests/test_rule.py +++ b/test/e2e/tests/test_rule.py @@ -45,7 +45,7 @@ def simple_rule(elbv2_client, simple_listener, simple_target_group, simple_load_ replacements = REPLACEMENT_VALUES.copy() replacements["RULE_NAME"] = resource_name replacements["LISTENER_ARN"] = listener_cr["status"]["ackResourceMetadata"]["arn"] - replacements["TARGET_GROUP_ARN"] = target_group_cr["status"]["ackResourceMetadata"]["arn"] + replacements["TARGET_GROUP_NAME"] = target_group_cr["spec"]["name"] resource_data = load_elbv2_resource( "rule",