Skip to content

Commit 70332c8

Browse files
authored
remove namespace validation for update-addon (#8479)
* remove namespace validation for update-addon
1 parent 35f4f47 commit 70332c8

File tree

7 files changed

+23
-299
lines changed

7 files changed

+23
-299
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ require (
1818
github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.51.3
1919
github.com/aws/aws-sdk-go-v2/service/ec2 v1.210.1
2020
github.com/aws/aws-sdk-go-v2/service/eks v1.71.1
21-
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.32.2
21+
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.0
2222
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.50.0
2323
github.com/aws/aws-sdk-go-v2/service/iam v1.47.1
2424
github.com/aws/aws-sdk-go-v2/service/kms v1.38.3

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ github.com/aws/aws-sdk-go-v2/service/ec2 v1.210.1 h1:+4A9SDduLZFlDeXWRmfQ6r8kyEJ
138138
github.com/aws/aws-sdk-go-v2/service/ec2 v1.210.1/go.mod h1:ouvGEfHbLaIlWwpDpOVWPWR+YwO0HDv3vm5tYLq8ImY=
139139
github.com/aws/aws-sdk-go-v2/service/eks v1.71.1 h1:94CuP2LDRD8zwfJIm+oOEx0vRuwodfon0BPImHs8aww=
140140
github.com/aws/aws-sdk-go-v2/service/eks v1.71.1/go.mod h1:ROhcontVJDIaR0dUrg2+EdGzJtdSzq+PnM06gNV5zK8=
141-
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.32.2 h1:5gfKj9+gRRVTzsrDp1z8AoEuSV3iLZpDJTiKsSqet6I=
142-
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.32.2/go.mod h1:Tdj16jxblwZwdRKwqRvTEgrPM8yG5aLBkT6VNUwAZ3U=
141+
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.0 h1:1Ene7r6v8NQdgc2KzqBO7ip/uBb2awfTf6K4XS6yVlg=
142+
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.0/go.mod h1:Tdj16jxblwZwdRKwqRvTEgrPM8yG5aLBkT6VNUwAZ3U=
143143
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.50.0 h1:Izk3Yw7XXSl3YsXcsfzY3tbaeh5sxiV/Rxc9YlLcmYs=
144144
github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.50.0/go.mod h1:g8wrIE3I6tNQ9j/w+8aCkd/1kJGsvBuT7oh74prjdaI=
145145
github.com/aws/aws-sdk-go-v2/service/eventbridge v1.36.12 h1:uH6GOnGSvVN9MCk6o3+HvZFpdqL7AzJKNOTM/6l+3/s=

integration/tests/addons/addons_test.go

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -824,61 +824,6 @@ var _ = Describe("(Integration) [EKS Addons test]", func() {
824824
Expect(cmd).NotTo(RunSuccessfully())
825825
})
826826

827-
It("should enforce namespace config immutability during updates", func() {
828-
By("creating an addon with namespace config")
829-
clusterConfig.Addons = []*api.Addon{
830-
{
831-
Name: api.CoreDNSAddon,
832-
NamespaceConfig: &api.AddonNamespaceConfig{
833-
Namespace: "original-namespace",
834-
},
835-
ResolveConflicts: ekstypes.ResolveConflictsOverwrite,
836-
},
837-
}
838-
839-
data, err := json.Marshal(clusterConfig)
840-
Expect(err).NotTo(HaveOccurred())
841-
842-
cmd := params.EksctlCreateCmd.
843-
WithArgs(
844-
"cluster",
845-
"--config-file", "-",
846-
"--verbose", "4",
847-
).
848-
WithoutArg("--region", params.Region).
849-
WithStdin(bytes.NewReader(data))
850-
Expect(cmd).To(RunSuccessfully())
851-
852-
Eventually(func() runner.Cmd {
853-
cmd := params.EksctlGetCmd.
854-
WithArgs(
855-
"addon",
856-
"--name", api.CoreDNSAddon,
857-
"--cluster", clusterConfig.Metadata.Name,
858-
"--verbose", "2",
859-
)
860-
return cmd
861-
}, "5m", "30s").Should(RunSuccessfullyWithOutputStringLines(
862-
ContainElement(ContainSubstring("ACTIVE")),
863-
))
864-
865-
By("attempting to update addon with modified namespace config")
866-
clusterConfig.Addons[0].NamespaceConfig.Namespace = "modified-namespace"
867-
data, err = json.Marshal(clusterConfig)
868-
Expect(err).NotTo(HaveOccurred())
869-
870-
cmd = params.EksctlUpdateCmd.
871-
WithArgs(
872-
"addon",
873-
"--config-file", "-",
874-
).
875-
WithoutArg("--region", params.Region).
876-
WithStdin(bytes.NewReader(data))
877-
session := cmd.Run()
878-
Expect(session.ExitCode()).NotTo(Equal(0))
879-
Expect(string(session.Err.Contents())).To(ContainSubstring("namespace configuration cannot be modified after addon creation"))
880-
})
881-
882827
It("should work with addons that have no namespace config", func() {
883828
By("creating an addon without namespace config")
884829
clusterConfig.Addons = []*api.Addon{

pkg/actions/addon/update.go

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,6 @@ func (a *Manager) Update(ctx context.Context, addon *api.Addon, podIdentityIAMUp
5050
return err
5151
}
5252

53-
// Validate namespace config immutability
54-
if err := a.validateNamespaceConfigImmutability(addon, &summary); err != nil {
55-
return err
56-
}
57-
5853
var requiresIAMPermissions bool
5954
if addon.Version == "" {
6055
// preserve existing version
@@ -225,34 +220,3 @@ func (a *Manager) createNewTemplate(addon *api.Addon, namespace, serviceAccount
225220
}
226221
return resourceSet.RenderJSON()
227222
}
228-
229-
// validateNamespaceConfigImmutability validates that namespace configuration is not being modified during update
230-
func (a *Manager) validateNamespaceConfigImmutability(addon *api.Addon, summary *Summary) error {
231-
existingNamespace := ""
232-
if summary.NamespaceConfig != nil {
233-
existingNamespace = summary.NamespaceConfig.Namespace
234-
}
235-
236-
requestedNamespace := ""
237-
if addon.NamespaceConfig != nil {
238-
requestedNamespace = addon.NamespaceConfig.Namespace
239-
}
240-
241-
// Compare existing and requested namespace configurations
242-
if existingNamespace != requestedNamespace {
243-
existingDisplay := "<none>"
244-
if existingNamespace != "" {
245-
existingDisplay = fmt.Sprintf("%q", existingNamespace)
246-
}
247-
248-
requestedDisplay := "<none>"
249-
if requestedNamespace != "" {
250-
requestedDisplay = fmt.Sprintf("%q", requestedNamespace)
251-
}
252-
253-
return fmt.Errorf("invalid configuration for %q addon: namespace configuration cannot be modified after addon creation (existing: %s, requested: %s)",
254-
addon.Name, existingDisplay, requestedDisplay)
255-
}
256-
257-
return nil
258-
}

pkg/actions/addon/update_test.go

Lines changed: 9 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ var _ = Describe("Update", func() {
687687

688688
})
689689

690-
var _ = Describe("Update - Namespace Config Immutability", func() {
690+
var _ = Describe("Update - Namespace Config Updates", func() {
691691
var (
692692
addonManager *addon.Manager
693693
mockProvider *mockprovider.MockProvider
@@ -707,21 +707,9 @@ var _ = Describe("Update - Namespace Config Immutability", func() {
707707
mockProvider = mockprovider.NewMockProvider()
708708
fakeStackManager = new(fakes.FakeStackManager)
709709

710-
fakeStackManager.CreateStackStub = func(_ context.Context, _ string, rs builder.ResourceSetReader, _ map[string]string, _ map[string]string, errs chan error) error {
711-
go func() {
712-
errs <- nil
713-
}()
714-
Expect(rs).To(BeAssignableToTypeOf(&builder.IAMRoleResourceSet{}))
715-
rs.(*builder.IAMRoleResourceSet).OutputRole = "new-service-account-role-arn"
716-
return nil
717-
}
718-
719710
oidc := makeOIDCManager()
720711

721-
mockProvider.MockEKS().On("DescribeAddonVersions", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
722-
Expect(args).To(HaveLen(2))
723-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonVersionsInput{}))
724-
}).Return(&awseks.DescribeAddonVersionsOutput{
712+
mockProvider.MockEKS().On("DescribeAddonVersions", mock.Anything, mock.Anything).Return(&awseks.DescribeAddonVersionsOutput{
725713
Addons: []ekstypes.AddonInfo{
726714
{
727715
AddonName: aws.String("my-addon"),
@@ -742,178 +730,20 @@ var _ = Describe("Update - Namespace Config Immutability", func() {
742730
Expect(err).NotTo(HaveOccurred())
743731
})
744732

745-
Context("namespace config immutability", func() {
733+
Context("namespace config updates", func() {
746734
var podIdentityIAMUpdater mocks.PodIdentityIAMUpdater
747735

748-
When("attempting to modify namespace config", func() {
749-
It("returns an error when trying to change namespace config", func() {
750-
// Mock DescribeAddon to return an addon with existing namespace config
751-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
752-
Expect(args).To(HaveLen(2))
753-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
754-
}).Return(&awseks.DescribeAddonOutput{
755-
Addon: &ekstypes.Addon{
756-
AddonName: aws.String("my-addon"),
757-
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
758-
Status: "created",
759-
NamespaceConfig: &ekstypes.AddonNamespaceConfigResponse{
760-
Namespace: aws.String("existing-namespace"),
761-
},
762-
},
763-
}, nil).Once()
764-
765-
err := addonManager.Update(context.Background(), &api.Addon{
766-
Name: "my-addon",
767-
Version: "v1.0.0-eksbuild.2",
768-
NamespaceConfig: &api.AddonNamespaceConfig{
769-
Namespace: "new-namespace",
770-
},
771-
}, &podIdentityIAMUpdater, 0)
772-
773-
Expect(err).To(HaveOccurred())
774-
Expect(err).To(MatchError(ContainSubstring("namespace configuration cannot be modified after addon creation")))
775-
Expect(err).To(MatchError(ContainSubstring("existing: \"existing-namespace\", requested: \"new-namespace\"")))
776-
})
777-
778-
It("returns an error when trying to add namespace config to addon without one", func() {
779-
// Mock DescribeAddon to return an addon without namespace config
780-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
781-
Expect(args).To(HaveLen(2))
782-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
783-
}).Return(&awseks.DescribeAddonOutput{
784-
Addon: &ekstypes.Addon{
785-
AddonName: aws.String("my-addon"),
786-
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
787-
Status: "created",
788-
NamespaceConfig: nil, // No existing namespace config
789-
},
790-
}, nil).Once()
791-
792-
err := addonManager.Update(context.Background(), &api.Addon{
793-
Name: "my-addon",
794-
Version: "v1.0.0-eksbuild.2",
795-
NamespaceConfig: &api.AddonNamespaceConfig{
796-
Namespace: "new-namespace",
797-
},
798-
}, &podIdentityIAMUpdater, 0)
799-
800-
Expect(err).To(HaveOccurred())
801-
Expect(err).To(MatchError(ContainSubstring("namespace configuration cannot be modified after addon creation")))
802-
Expect(err).To(MatchError(ContainSubstring("existing: <none>, requested: \"new-namespace\"")))
803-
})
804-
805-
It("returns an error when trying to remove namespace config from addon with one", func() {
736+
When("updating addon with different namespace config", func() {
737+
It("succeeds without validation error", func() {
806738
// Mock DescribeAddon to return an addon with existing namespace config
807-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
808-
Expect(args).To(HaveLen(2))
809-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
810-
}).Return(&awseks.DescribeAddonOutput{
811-
Addon: &ekstypes.Addon{
812-
AddonName: aws.String("my-addon"),
813-
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
814-
Status: "created",
815-
NamespaceConfig: &ekstypes.AddonNamespaceConfigResponse{
816-
Namespace: aws.String("existing-namespace"),
817-
},
818-
},
819-
}, nil).Once()
820-
821-
err := addonManager.Update(context.Background(), &api.Addon{
822-
Name: "my-addon",
823-
Version: "v1.0.0-eksbuild.2",
824-
NamespaceConfig: nil, // Trying to remove namespace config
825-
}, &podIdentityIAMUpdater, 0)
826-
827-
Expect(err).To(HaveOccurred())
828-
Expect(err).To(MatchError(ContainSubstring("namespace configuration cannot be modified after addon creation")))
829-
Expect(err).To(MatchError(ContainSubstring("existing: \"existing-namespace\", requested: <none>")))
830-
})
831-
})
832-
833-
When("namespace config is unchanged", func() {
834-
It("succeeds when namespace config is identical", func() {
835-
// Mock DescribeAddon to return an addon with existing namespace config
836-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
837-
Expect(args).To(HaveLen(2))
838-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
839-
}).Return(&awseks.DescribeAddonOutput{
739+
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Return(&awseks.DescribeAddonOutput{
840740
Addon: &ekstypes.Addon{
841741
AddonName: aws.String("my-addon"),
842742
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
843743
ServiceAccountRoleArn: aws.String("original-arn"),
844744
Status: "created",
845745
NamespaceConfig: &ekstypes.AddonNamespaceConfigResponse{
846-
Namespace: aws.String("same-namespace"),
847-
},
848-
},
849-
}, nil).Once()
850-
851-
mockProvider.MockEKS().On("UpdateAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
852-
Expect(args).To(HaveLen(2))
853-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.UpdateAddonInput{}))
854-
updateAddonInput = args[1].(*awseks.UpdateAddonInput)
855-
}).Return(&awseks.UpdateAddonOutput{}, nil).Once()
856-
857-
err := addonManager.Update(context.Background(), &api.Addon{
858-
Name: "my-addon",
859-
Version: "v1.0.0-eksbuild.2",
860-
NamespaceConfig: &api.AddonNamespaceConfig{
861-
Namespace: "same-namespace",
862-
},
863-
}, &podIdentityIAMUpdater, 0)
864-
865-
Expect(err).NotTo(HaveOccurred())
866-
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
867-
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))
868-
Expect(*updateAddonInput.AddonVersion).To(Equal("v1.0.0-eksbuild.2"))
869-
})
870-
871-
It("succeeds when both namespace configs are nil", func() {
872-
// Mock DescribeAddon to return an addon without namespace config
873-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
874-
Expect(args).To(HaveLen(2))
875-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
876-
}).Return(&awseks.DescribeAddonOutput{
877-
Addon: &ekstypes.Addon{
878-
AddonName: aws.String("my-addon"),
879-
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
880-
ServiceAccountRoleArn: aws.String("original-arn"),
881-
Status: "created",
882-
NamespaceConfig: nil, // No existing namespace config
883-
},
884-
}, nil).Once()
885-
886-
mockProvider.MockEKS().On("UpdateAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
887-
Expect(args).To(HaveLen(2))
888-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.UpdateAddonInput{}))
889-
updateAddonInput = args[1].(*awseks.UpdateAddonInput)
890-
}).Return(&awseks.UpdateAddonOutput{}, nil).Once()
891-
892-
err := addonManager.Update(context.Background(), &api.Addon{
893-
Name: "my-addon",
894-
Version: "v1.0.0-eksbuild.2",
895-
NamespaceConfig: nil, // No new namespace config either
896-
}, &podIdentityIAMUpdater, 0)
897-
898-
Expect(err).NotTo(HaveOccurred())
899-
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
900-
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))
901-
Expect(*updateAddonInput.AddonVersion).To(Equal("v1.0.0-eksbuild.2"))
902-
})
903-
904-
It("succeeds when both namespace configs have empty namespace", func() {
905-
// Mock DescribeAddon to return an addon with empty namespace config
906-
mockProvider.MockEKS().On("DescribeAddon", mock.Anything, mock.Anything).Run(func(args mock.Arguments) {
907-
Expect(args).To(HaveLen(2))
908-
Expect(args[1]).To(BeAssignableToTypeOf(&awseks.DescribeAddonInput{}))
909-
}).Return(&awseks.DescribeAddonOutput{
910-
Addon: &ekstypes.Addon{
911-
AddonName: aws.String("my-addon"),
912-
AddonVersion: aws.String("v1.0.0-eksbuild.2"),
913-
ServiceAccountRoleArn: aws.String("original-arn"),
914-
Status: "created",
915-
NamespaceConfig: &ekstypes.AddonNamespaceConfigResponse{
916-
Namespace: aws.String(""), // Empty namespace
746+
Namespace: aws.String("existing-namespace"),
917747
},
918748
},
919749
}, nil).Once()
@@ -928,10 +758,11 @@ var _ = Describe("Update - Namespace Config Immutability", func() {
928758
Name: "my-addon",
929759
Version: "v1.0.0-eksbuild.2",
930760
NamespaceConfig: &api.AddonNamespaceConfig{
931-
Namespace: "", // Empty namespace
761+
Namespace: "new-namespace",
932762
},
933763
}, &podIdentityIAMUpdater, 0)
934764

765+
// Should succeed without namespace config immutability error
935766
Expect(err).NotTo(HaveOccurred())
936767
Expect(*updateAddonInput.ClusterName).To(Equal("my-cluster"))
937768
Expect(*updateAddonInput.AddonName).To(Equal("my-addon"))

pkg/apis/eksctl.io/v1alpha5/zz_generated.deepcopy.go

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)