Skip to content

Commit

Permalink
clear resource version to avoid optimistic locking
Browse files Browse the repository at this point in the history
  • Loading branch information
cxbrowne1207 committed Mar 5, 2024
1 parent 4fde5aa commit 82d5d26
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 67 deletions.
8 changes: 5 additions & 3 deletions pkg/workflows/management/core_components.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package management

import (
"context"
"time"

anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1"
"github.com/aws/eks-anywhere/pkg/clients/kubernetes"
Expand Down Expand Up @@ -104,19 +105,20 @@ func runUpgradeCoreComponents(ctx context.Context, commandContext *task.CommandC
return err
}

logger.V(5).Info("Applying cluster management components version update")
eksaCluster := &anywherev1.Cluster{}
err = client.Get(ctx, commandContext.CurrentClusterSpec.Cluster.Name, commandContext.CurrentClusterSpec.Cluster.Namespace, eksaCluster)
err := client.Get(ctx, commandContext.CurrentClusterSpec.Cluster.Name, commandContext.CurrentClusterSpec.Cluster.Namespace, eksaCluster)
if err != nil {
commandContext.SetError(err)
return err
}

eksaCluster.SetManagementComponentsVersion(commandContext.ClusterSpec.EKSARelease.Spec.Version)
eksaCluster.ResourceVersion = ""
if err := client.ApplyServerSide(ctx,
constants.EKSACLIFieldManager,
eksaCluster,
kubernetes.ApplyServerSideOptions{ForceOwnership: true},
); err != nil {
if err != nil {
commandContext.SetError(err)
return err
}
Expand Down
121 changes: 57 additions & 64 deletions pkg/workflows/management/upgrade_management_components_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,16 @@ func NewTestMocks(t *testing.T) *TestMocks {
}
}

func TestRunnerHappyPath(t *testing.T) {
type upgradeManagementComponentsTest struct {
ctx context.Context
runner *UpgradeManagementComponentsWorkflow
mocks *TestMocks
managementCluster *types.Cluster
currentSpec *cluster.Spec
newSpec *cluster.Spec
}

func newUpgradeManagementComponentsTest(t *testing.T) *upgradeManagementComponentsTest {
mocks := NewTestMocks(t)
runner := NewUpgradeManagementComponentsRunner(
mocks.clientFactory,
Expand All @@ -83,86 +92,70 @@ func TestRunnerHappyPath(t *testing.T) {
mocks.eksdInstaller,
)

clusterSpec := test.NewClusterSpec()
currentSpec := test.NewClusterSpec(func(s *cluster.Spec) {
s.Bundles = test.Bundle()
s.EKSARelease = test.EKSARelease()
})
newSpec := currentSpec.DeepCopy()

managementCluster := &types.Cluster{
Name: clusterSpec.Cluster.Name,
KubeconfigFile: kubeconfig.FromClusterName(clusterSpec.Cluster.Name),
Name: currentSpec.Cluster.Name,
KubeconfigFile: kubeconfig.FromClusterName(currentSpec.Cluster.Name),
}

ctx := context.Background()
bundles := test.Bundle()
eksaRelease := test.EKSARelease()

curSpec := test.NewClusterSpec()
currentManagementComponents := cluster.ManagementComponentsFromBundles(bundles)

newSpec := test.NewClusterSpec(func(s *cluster.Spec) {
s.EKSARelease = eksaRelease
})

newManagementComponents := cluster.ManagementComponentsFromBundles(newSpec.Bundles)
return &upgradeManagementComponentsTest{
mocks: mocks,
runner: runner,
managementCluster: managementCluster,
currentSpec: currentSpec,
newSpec: newSpec,
}
}

client := test.NewFakeKubeClient(curSpec.Cluster, eksaRelease, bundles)
func TestRunnerHappyPath(t *testing.T) {
tt := newUpgradeManagementComponentsTest(t)
currentManagementComponents := cluster.ManagementComponentsFromBundles(tt.currentSpec.Bundles)
newManagementComponents := cluster.ManagementComponentsFromBundles(tt.newSpec.Bundles)

mocks.clusterManager.EXPECT().GetCurrentClusterSpec(ctx, gomock.Any(), managementCluster.Name).Return(curSpec, nil)
client := test.NewFakeKubeClient(tt.currentSpec.Cluster, tt.currentSpec.EKSARelease, tt.currentSpec.Bundles)
tt.mocks.clusterManager.EXPECT().GetCurrentClusterSpec(tt.ctx, gomock.Any(), tt.managementCluster.Name).Return(tt.currentSpec, nil)
gomock.InOrder(
mocks.validator.EXPECT().PreflightValidations(ctx).Return(nil),
mocks.provider.EXPECT().Name(),
mocks.provider.EXPECT().SetupAndValidateUpgradeManagementComponents(ctx, newSpec),
mocks.provider.EXPECT().PreCoreComponentsUpgrade(gomock.Any(), gomock.Any(), newManagementComponents, gomock.Any()),
mocks.clientFactory.EXPECT().BuildClientFromKubeconfig(managementCluster.KubeconfigFile).Return(client, nil),
mocks.capiManager.EXPECT().Upgrade(ctx, managementCluster, mocks.provider, currentManagementComponents, newManagementComponents, newSpec).Return(capiChangeDiff, nil),
mocks.gitOpsManager.EXPECT().Install(ctx, managementCluster, newManagementComponents, curSpec, newSpec).Return(nil),
mocks.gitOpsManager.EXPECT().Upgrade(ctx, managementCluster, currentManagementComponents, newManagementComponents, curSpec, newSpec).Return(fluxChangeDiff, nil),
mocks.clusterManager.EXPECT().Upgrade(ctx, managementCluster, currentManagementComponents, newManagementComponents, newSpec).Return(eksaChangeDiff, nil),
mocks.eksdUpgrader.EXPECT().Upgrade(ctx, managementCluster, curSpec, newSpec).Return(nil),
mocks.clusterManager.EXPECT().ApplyBundles(
ctx, newSpec, managementCluster,
tt.mocks.validator.EXPECT().PreflightValidations(tt.ctx).Return(nil),
tt.mocks.provider.EXPECT().Name(),
tt.mocks.provider.EXPECT().SetupAndValidateUpgradeManagementComponents(tt.ctx, tt.newSpec),
tt.mocks.provider.EXPECT().PreCoreComponentsUpgrade(gomock.Any(), gomock.Any(), newManagementComponents, gomock.Any()),
tt.mocks.clientFactory.EXPECT().BuildClientFromKubeconfig(tt.managementCluster.KubeconfigFile).Return(client, nil),
tt.mocks.capiManager.EXPECT().Upgrade(tt.ctx, tt.managementCluster, tt.mocks.provider, currentManagementComponents, newManagementComponents, tt.newSpec).Return(capiChangeDiff, nil),
tt.mocks.gitOpsManager.EXPECT().Install(tt.ctx, tt.managementCluster, newManagementComponents, tt.currentSpec, tt.newSpec).Return(nil),
tt.mocks.gitOpsManager.EXPECT().Upgrade(tt.ctx, tt.managementCluster, currentManagementComponents, newManagementComponents, tt.currentSpec, tt.newSpec).Return(fluxChangeDiff, nil),
tt.mocks.clusterManager.EXPECT().Upgrade(tt.ctx, tt.managementCluster, currentManagementComponents, newManagementComponents, tt.newSpec).Return(eksaChangeDiff, nil),
tt.mocks.eksdUpgrader.EXPECT().Upgrade(tt.ctx, tt.managementCluster, tt.currentSpec, tt.newSpec).Return(nil),
tt.mocks.clusterManager.EXPECT().ApplyBundles(
tt.ctx, tt.newSpec, tt.managementCluster,
).Return(nil),
mocks.clusterManager.EXPECT().ApplyReleases(
ctx, newSpec, managementCluster,
tt.mocks.clusterManager.EXPECT().ApplyReleases(
tt.ctx, tt.newSpec, tt.managementCluster,
).Return(nil),
mocks.eksdInstaller.EXPECT().InstallEksdManifest(
ctx, newSpec, managementCluster,
tt.mocks.eksdInstaller.EXPECT().InstallEksdManifest(
tt.ctx, tt.newSpec, tt.managementCluster,
).Return(nil),
)

err := runner.Run(ctx, newSpec, managementCluster, mocks.validator)
err := tt.runner.Run(tt.ctx, tt.newSpec, tt.managementCluster, tt.mocks.validator)
if err != nil {
t.Fatalf("UpgradeManagementComponents.Run() err = %v, want err = nil", err)
}

g := NewWithT(t)
g.Expect(newSpec.Cluster.Annotations).To(Equal(managementComponentsVersionAnnotation))
g.Expect(tt.newSpec.Cluster.Annotations).To(Equal(managementComponentsVersionAnnotation))
}

func TestRunnerStopsWhenValidationFailed(t *testing.T) {
mocks := NewTestMocks(t)
runner := NewUpgradeManagementComponentsRunner(
mocks.clientFactory,
mocks.provider,
mocks.capiManager,
mocks.clusterManager,
mocks.gitOpsManager,
mocks.writer,
mocks.eksdUpgrader,
mocks.eksdInstaller,
)

clusterSpec := test.NewClusterSpec()
managementCluster := &types.Cluster{
Name: clusterSpec.Cluster.Name,
KubeconfigFile: kubeconfig.FromClusterName(clusterSpec.Cluster.Name),
}

ctx := context.Background()
curSpec := test.NewClusterSpec()
newSpec := test.NewClusterSpec()

mocks.provider.EXPECT().Name()
mocks.provider.EXPECT().SetupAndValidateUpgradeManagementComponents(ctx, newSpec)
mocks.clusterManager.EXPECT().GetCurrentClusterSpec(ctx, gomock.Any(), managementCluster.Name).Return(curSpec, nil)
mocks.validator.EXPECT().PreflightValidations(ctx).Return(
tt := newUpgradeManagementComponentsTest(t)
tt.mocks.provider.EXPECT().Name()
tt.mocks.provider.EXPECT().SetupAndValidateUpgradeManagementComponents(tt.ctx, tt.newSpec)
tt.mocks.clusterManager.EXPECT().GetCurrentClusterSpec(tt.ctx, gomock.Any(), tt.managementCluster.Name).Return(tt.currentSpec, nil)
tt.mocks.validator.EXPECT().PreflightValidations(tt.ctx).Return(
[]validations.Validation{
func() *validations.ValidationResult {
return &validations.ValidationResult{
Expand All @@ -171,8 +164,8 @@ func TestRunnerStopsWhenValidationFailed(t *testing.T) {
},
})

mocks.writer.EXPECT().Write(fmt.Sprintf("%s-checkpoint.yaml", newSpec.Cluster.Name), gomock.Any())
err := runner.Run(ctx, newSpec, managementCluster, mocks.validator)
tt.mocks.writer.EXPECT().Write(fmt.Sprintf("%s-checkpoint.yaml", tt.newSpec.Cluster.Name), gomock.Any())
err := tt.runner.Run(tt.ctx, tt.newSpec, tt.managementCluster, tt.mocks.validator)
if err == nil {
t.Fatalf("UpgradeManagementComponents.Run() err == nil, want err != nil")
}
Expand Down

0 comments on commit 82d5d26

Please sign in to comment.