From ef40f668492528f14f5f176df6f68238156e35da Mon Sep 17 00:00:00 2001 From: Edmond Ceausu Date: Tue, 4 Feb 2025 13:00:21 -0500 Subject: [PATCH] Add functionality for resolveConflicts: PRESERVE --- ...ster.x-k8s.io_awsmanagedcontrolplanes.yaml | 1 + controlplane/eks/api/v1beta1/types.go | 4 ++++ controlplane/eks/api/v1beta2/types.go | 4 ++++ docs/book/src/topics/eks/addons.md | 13 ++++++++-- pkg/cloud/services/eks/addons.go | 24 +++++++++++++++---- 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/config/crd/bases/controlplane.cluster.x-k8s.io_awsmanagedcontrolplanes.yaml b/config/crd/bases/controlplane.cluster.x-k8s.io_awsmanagedcontrolplanes.yaml index 980e4bcd94..a164280514 100644 --- a/config/crd/bases/controlplane.cluster.x-k8s.io_awsmanagedcontrolplanes.yaml +++ b/config/crd/bases/controlplane.cluster.x-k8s.io_awsmanagedcontrolplanes.yaml @@ -91,6 +91,7 @@ spec: enum: - overwrite - none + - preserve type: string name: description: Name is the name of the addon diff --git a/controlplane/eks/api/v1beta1/types.go b/controlplane/eks/api/v1beta1/types.go index 0ca9a64ebe..ffca2747f5 100644 --- a/controlplane/eks/api/v1beta1/types.go +++ b/controlplane/eks/api/v1beta1/types.go @@ -154,6 +154,10 @@ var ( // AddonResolutionNone indicates that if there are parameter conflicts then // resolution will not be done and an error will be reported. AddonResolutionNone = AddonResolution("none") + + // AddonResolutionPreserve indicates that if there are parameter conflicts then + // resolution will result in preserving the existing value + AddonResolutionPreserve = AddonResolution("preserve") ) // AddonStatus defines the status for an addon. diff --git a/controlplane/eks/api/v1beta2/types.go b/controlplane/eks/api/v1beta2/types.go index 1ef47215ce..ebabcfedfe 100644 --- a/controlplane/eks/api/v1beta2/types.go +++ b/controlplane/eks/api/v1beta2/types.go @@ -154,6 +154,10 @@ var ( // AddonResolutionNone indicates that if there are parameter conflicts then // resolution will not be done and an error will be reported. AddonResolutionNone = AddonResolution("none") + + // AddonResolutionPreserve indicates that if there are parameter conflicts then + // resolution will result in preserving the existing value + AddonResolutionPreserve = AddonResolution("preserve") ) // AddonStatus defines the status for an addon. diff --git a/docs/book/src/topics/eks/addons.md b/docs/book/src/topics/eks/addons.md index 063a6c83fe..c90c5123e5 100644 --- a/docs/book/src/topics/eks/addons.md +++ b/docs/book/src/topics/eks/addons.md @@ -23,8 +23,15 @@ spec: conflictResolution: "overwrite" ``` -_Note_: For `conflictResolution` `overwrite` is the **default** behaviour. That means, if not otherwise specified, it's -set to `overwrite`. +Valid values are: +``` +none +overwrite +preserve +``` + +_Note_: For `conflictResolution` `none` is the **default** behaviour. That means, if not otherwise specified, it's +set to `none`. Review [API Documentation](https://docs.aws.amazon.com/eks/latest/APIReference/API_CreateAddon.html#AmazonEKS-CreateAddon-request-resolveConflicts) for detailed behavior. Additionally, there is a cluster [flavor](https://cluster-api.sigs.k8s.io/clusterctl/commands/generate-cluster.html#flavors) called [eks-managedmachinepool-vpccni](https://github.com/kubernetes-sigs/cluster-api-provider-aws/blob/main/templates/cluster-template-eks-managedmachinepool-vpccni.yaml) that you can use with **clusterctl**: @@ -46,6 +53,8 @@ To update the version of an addon you need to edit the `AWSManagedControlPlane` ... ``` +_Note_: For `conflictResolution` `none`, updating may fail if a change was made to the addon that is unexpected by EKS. Review [API Documentation](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateAddon.html#AmazonEKS-UpdateAddon-request-resolveConflicts) for detailed behavior on conflict resolution. + ## Deleting Addons To delete an addon from a cluster you need to edit the `AWSManagedControlPlane` instance and remove the entry for the addon you want to delete. diff --git a/pkg/cloud/services/eks/addons.go b/pkg/cloud/services/eks/addons.go index 45c9a8cd82..3a8ee4c496 100644 --- a/pkg/cloud/services/eks/addons.go +++ b/pkg/cloud/services/eks/addons.go @@ -194,12 +194,16 @@ func (s *Service) translateAPIToAddon(addons []ekscontrolplanev1.Addon) []*eksad for i := range addons { addon := addons[i] + conflict, err := convertConflictResolution(*addon.ConflictResolution) + if err != nil { + s.scope.Error(err, err.Error()) + } convertedAddon := &eksaddons.EKSAddon{ Name: &addon.Name, Version: &addon.Version, Configuration: &addon.Configuration, Tags: ngTags(s.scope.Cluster.Name, s.scope.AdditionalTags()), - ResolveConflict: convertConflictResolution(*addon.ConflictResolution), + ResolveConflict: conflict, ServiceAccountRoleARN: addon.ServiceAccountRoleArn, } @@ -209,9 +213,19 @@ func (s *Service) translateAPIToAddon(addons []ekscontrolplanev1.Addon) []*eksad return converted } -func convertConflictResolution(conflict ekscontrolplanev1.AddonResolution) *string { - if conflict == ekscontrolplanev1.AddonResolutionNone { - return aws.String(eks.ResolveConflictsNone) +func convertConflictResolution(conflict ekscontrolplanev1.AddonResolution) (*string, error) { + switch conflict { + case ekscontrolplanev1.AddonResolutionNone: + return aws.String(eks.ResolveConflictsNone), nil + + case ekscontrolplanev1.AddonResolutionOverwrite: + return aws.String(eks.ResolveConflictsOverwrite), nil + + case ekscontrolplanev1.AddonResolutionPreserve: + return aws.String(eks.ResolveConflictsPreserve), nil + + default: + return aws.String(eks.ResolveConflictsNone), fmt.Errorf("failed to determine adddonResolution; defaulting to None") + } - return aws.String(eks.ResolveConflictsOverwrite) }