diff --git a/cli/internal/kubernetes/upgrade.go b/cli/internal/kubernetes/upgrade.go index 98e41b8fa..527229fe6 100644 --- a/cli/internal/kubernetes/upgrade.go +++ b/cli/internal/kubernetes/upgrade.go @@ -183,12 +183,7 @@ func (u *Upgrader) CleanUpTerraformMigrations(fileHandler file.Handler) error { // If a diff exists, it's being written to the upgrader's output writer. It also returns // a bool indicating whether a diff exists. func (u *Upgrader) PlanTerraformMigrations(ctx context.Context, opts upgrade.TerraformUpgradeOptions) (bool, error) { - hasDiff, err := u.tfUpgrader.PlanIAMMigration(ctx, opts.CSP, opts.LogLevel, u.upgradeID) - if err != nil { - return false, fmt.Errorf("planning terraform migrations: %w", err) - } - return hasDiff, nil - // return u.tfUpgrader.PlanTerraformMigrations(ctx, opts, u.upgradeID) + return u.tfUpgrader.PlanTerraformMigrations(ctx, opts, u.upgradeID) } // ApplyTerraformMigrations applies the migrations planned by PlanTerraformMigrations. diff --git a/cli/internal/terraform/iammigrate_test.go b/cli/internal/terraform/iammigrate_test.go new file mode 100644 index 000000000..76b1ca76d --- /dev/null +++ b/cli/internal/terraform/iammigrate_test.go @@ -0,0 +1,111 @@ +/* +Copyright (c) Edgeless Systems GmbH + +SPDX-License-Identifier: AGPL-3.0-only +*/ + +package terraform + +import ( + "bytes" + "context" + "io" + "path/filepath" + "testing" + + "github.com/edgelesssys/constellation/v2/internal/cloud/cloudprovider" + "github.com/edgelesssys/constellation/v2/internal/constants" + "github.com/edgelesssys/constellation/v2/internal/file" + "github.com/spf13/afero" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestIAMMigrate(t *testing.T) { + // plan should copy the terraform files to the upgrade directory + // create upgrade dir + // show plan changes in outWriter + upgradeID := "test-upgrade" + tfClient, err := New(context.Background(), filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformUpgradeWorkingDir)) + require.NoError(t, err) + // prep fs + fs := afero.NewMemMapFs() + file := file.NewHandler(fs) + err = file.MkdirAll(constants.TerraformIAMWorkingDir) + require.NoError(t, err) + err = file.Write(filepath.Join(constants.TerraformIAMWorkingDir, "terraform.tfvars"), []byte("OLD")) + require.NoError(t, err) + err = file.Write(filepath.Join(constants.TerraformIAMWorkingDir, "terraform.tfstate"), []byte("OLD")) + require.NoError(t, err) + tfClient.file = file + + writer := bytes.NewBuffer(nil) + fakeTfClient := &tfClientStub{tfClient, upgradeID} + sut := NewIAMMigrateCmd(fakeTfClient, upgradeID, cloudprovider.AWS, LogLevelDebug, writer) + + hasDiff, err := sut.Plan(context.Background()) + assert.NoError(t, err) + assert.False(t, hasDiff) + // check that files are copied + res, err := fs.Stat(filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformIAMUpgradeWorkingDir, "terraform.tfvars")) + + assert.NoError(t, err) + assert.NotNil(t, res) + res, err = fs.Stat(filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformIAMUpgradeWorkingDir, "terraform.tfstate")) + assert.NoError(t, err) + assert.NotNil(t, res) + + // apply + err = sut.Apply(context.Background(), file) + assert.NoError(t, err) + // check that files are copied + bt, err := file.Read(filepath.Join(constants.TerraformIAMWorkingDir, "terraform.tfvars")) + assert.NoError(t, err) + assert.Equal(t, "NEW", string(bt)) + bt, err = file.Read(filepath.Join(constants.TerraformIAMWorkingDir, "terraform.tfstate")) + assert.NoError(t, err) + assert.Equal(t, "NEW", string(bt)) + + // upgrade dir should be removed + res, err = fs.Stat(filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformIAMUpgradeWorkingDir)) + assert.Error(t, err) + assert.Nil(t, res) +} + +type tfClientStub struct { + realClient *Client + upgradeID string +} + +func (t *tfClientStub) PrepareIAMUpgradeWorkspace(rootDir, workingDir, newWorkingDir, backupDir string) error { + return t.realClient.PrepareIAMUpgradeWorkspace(rootDir, workingDir, newWorkingDir, backupDir) +} + +func (t *tfClientStub) Plan(ctx context.Context, logLevel LogLevel, planFile string) (bool, error) { + return false, nil +} + +func (t *tfClientStub) ShowPlan(ctx context.Context, logLevel LogLevel, planFile string, outWriter io.Writer) error { + return nil +} + +func (t *tfClientStub) CreateIAMConfig(ctx context.Context, csp cloudprovider.Provider, logLevel LogLevel) (IAMOutput, error) { + upgradeDir := filepath.Join(constants.UpgradeDir, t.upgradeID, constants.TerraformIAMUpgradeWorkingDir) + err := t.realClient.file.Remove(filepath.Join(upgradeDir, "terraform.tfvars")) + if err != nil { + return IAMOutput{}, err + } + err = t.realClient.file.Write(filepath.Join(upgradeDir, "terraform.tfvars"), []byte("NEW")) + if err != nil { + return IAMOutput{}, err + } + err = t.realClient.file.Remove(filepath.Join(upgradeDir, "terraform.tfstate")) + if err != nil { + return IAMOutput{}, err + } + err = t.realClient.file.Write(filepath.Join(upgradeDir, "terraform.tfstate"), []byte("NEW")) + if err != nil { + return IAMOutput{}, err + } + return IAMOutput{}, nil +} diff --git a/cli/internal/upgrade/main/main.go b/cli/internal/upgrade/main/main.go index ab16ebfdd..51a87f31f 100644 --- a/cli/internal/upgrade/main/main.go +++ b/cli/internal/upgrade/main/main.go @@ -8,7 +8,6 @@ import ( "github.com/edgelesssys/constellation/v2/cli/internal/terraform" "github.com/edgelesssys/constellation/v2/cli/internal/upgrade" - "github.com/edgelesssys/constellation/v2/internal/cloud/cloudprovider" "github.com/edgelesssys/constellation/v2/internal/constants" ) @@ -24,12 +23,12 @@ func main() { if err != nil { panic(fmt.Errorf("setting up terraform upgrader: %w", err)) } - diff, err := tfUpgrader.PlanIAMMigration(ctx, upgrade.TerraformUpgradeOptions{ - CSP: cloudprovider.AWS, - LogLevel: terraform.LogLevelDebug, - }, "test") - if err != nil { - panic(fmt.Errorf("planning terraform migrations: %w", err)) - } - fmt.Println(diff) + //diff, err := tfUpgrader.PlanIAMMigration(ctx, upgrade.TerraformUpgradeOptions{ + // CSP: cloudprovider.AWS, + // LogLevel: terraform.LogLevelDebug, + //}, "test") + //if err != nil { + // panic(fmt.Errorf("planning terraform migrations: %w", err)) + //} + //fmt.Println(diff) } diff --git a/cli/internal/upgrade/terraform.go b/cli/internal/upgrade/terraform.go index fe1614cc7..26a89d0f4 100644 --- a/cli/internal/upgrade/terraform.go +++ b/cli/internal/upgrade/terraform.go @@ -85,31 +85,6 @@ func checkFileExists(fileHandler file.Handler, existingFiles *[]string, filename return nil } -func (u *TerraformUpgrader) PlanIAMMigration(ctx context.Context, csp cloudprovider.Provider, logLevel terraform.LogLevel, upgradeID string) (bool, error) { - err := u.tf.PrepareIAMUpgradeWorkspace( - filepath.Join("terraform", "iam", strings.ToLower(csp.String())), - constants.TerraformIAMWorkingDir, - filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformUpgradeWorkingDir), - filepath.Join(constants.UpgradeDir, upgradeID, constants.TerraformUpgradeBackupDir), - ) - if err != nil { - return false, fmt.Errorf("preparing terraform workspace: %w", err) - } - - hasDiff, err := u.tf.Plan(ctx, logLevel, constants.TerraformUpgradePlanFile) - if err != nil { - return false, fmt.Errorf("terraform plan: %w", err) - } - - if hasDiff { - if err := u.tf.ShowPlan(ctx, logLevel, constants.TerraformUpgradePlanFile, u.outWriter); err != nil { - return false, fmt.Errorf("terraform show plan: %w", err) - } - } - - return hasDiff, nil -} - // PlanTerraformMigrations prepares the upgrade workspace and plans the Terraform migrations for the Constellation upgrade. // If a diff exists, it's being written to the upgrader's output writer. It also returns // a bool indicating whether a diff exists.