-
Notifications
You must be signed in to change notification settings - Fork 180
feat: add IAMRoleSelector CRD/feature
#204
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: a-hilaly The full list of commands accepted by this bot can be found here. The pull request process is described here
Needs approval from an approver in each of these files:
Approvers can indicate their approval by writing |
Implements aws-controllers-k8s/community#2628 (mostly) Introduces a new IAMRoleSelector CRD that enables dynamic IAM role assignment based on namespace and resource type selectors. This feature provides an alternative to CARM for role selection and cannot be used simultaneously with CARM (enforced by validation). Key components: - New IAMRoleSelector CRD with namespace and resource type selectors - Selector matching logic with AND between selector types, OR within arrays - Dynamic informer-based cache for IAMRoleSelector resources - Integration into the reconciler to override CARM role selection - Alpha feature gate (IAMRoleSelector) defaulting to disabled Note: ResourceTypeSelector uses schema.GroupVersionKind in the API, which differs from the separate fields approach in the original types. This may need adjustment based on CRD generation requirements.
|
/retest |
1 similar comment
|
/retest |
|
/retest |
2 similar comments
|
/retest |
|
/retest |
|
@a-hilaly: The following tests failed, say
Full PR test history. Your PR dashboard. Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here. |
michaelhtm
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
great work @a-hilaly 🚀
left a few comments
| } | ||
|
|
||
| type IAMRoleSelectorSpec struct { | ||
| ARN string `json:"arn"` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: calling this ARN seems a bit weird/misleading..makes it feel like it's a new AWS resource.
should we call it RoleARN instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also, should we mark this as required in the CRD?
| Group: "services.k8s.aws", | ||
| Version: "v1alpha1", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: maybe we can import these values?
| // Validate before storing | ||
| if err := validateSelector(selector); err != nil { | ||
| c.log.Error(err, "invalid IAMRoleSelector, not caching", "name", selector.Name) | ||
| return | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should we patch the IAMSelector status with this information?
| if err := validateSelector(selector); err != nil { | ||
| c.log.Error(err, "invalid IAMRoleSelector, removing from cache", "name", selector.Name) | ||
| // Remove from cache if it becomes invalid |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
| // validateSelector checks if an IAMRoleSelector is valid | ||
| func validateSelector(selector *ackv1alpha1.IAMRoleSelector) error { | ||
| if selector == nil { | ||
| return fmt.Errorf("selector cannot be nil") | ||
| } | ||
|
|
||
| if selector.Spec.ARN == "" { | ||
| return fmt.Errorf("ARN cannot be empty") | ||
| } | ||
|
|
||
| // parse ARN to ensure it's valid | ||
| if _, err := arn.Parse(selector.Spec.ARN); err != nil { | ||
| return fmt.Errorf("invalid ARN: %w", err) | ||
| } | ||
|
|
||
| // Validate namespace selector | ||
| if err := validateNamespaceSelector(selector.Spec.NamespaceSelector); err != nil { | ||
| return fmt.Errorf("invalid namespace selector: %w", err) | ||
| } | ||
|
|
||
| // Validate resource type selectors | ||
| if err := validateResourceTypeSelectors(selector.Spec.ResourceTypeSelector); err != nil { | ||
| return fmt.Errorf("invalid resource type selector: %w", err) | ||
| } | ||
|
|
||
| return nil | ||
| } | ||
|
|
||
| func validateNamespaceSelector(nsSelector ackv1alpha1.NamespaceSelector) error { | ||
| // Check for duplicate namespace names | ||
| seen := make(map[string]bool) | ||
| for _, name := range nsSelector.Names { | ||
| if name == "" { | ||
| return fmt.Errorf("namespace name cannot be empty") | ||
| } | ||
| if seen[name] { | ||
| return fmt.Errorf("duplicate namespace name: %s", name) | ||
| } | ||
| seen[name] = true | ||
| } | ||
|
|
||
| // Validate label selector | ||
| if len(nsSelector.LabelSelector.MatchLabels) > 0 { | ||
| for key := range nsSelector.LabelSelector.MatchLabels { | ||
| if key == "" { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: should we move all validations to a new file? called validator...they don't seem to be related to matcher
Implements aws-controllers-k8s/community#2628 (mostly)
Introduces a new IAMRoleSelector CRD that enables dynamic IAM role
assignment based on namespace and resource type selectors. This feature
provides an alternative to CARM for role selection and cannot be used
simultaneously with CARM (enforced by validation).
Key components:
Note: ResourceTypeSelector uses schema.GroupVersionKind in the API,
which differs from the separate fields approach in the original types.
This may need adjustment based on CRD generation requirements.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.