From a91c8bc30f0fcdbdef3076fa543a23f7f6024355 Mon Sep 17 00:00:00 2001 From: Radek Simko Date: Thu, 28 May 2026 11:15:13 +0100 Subject: [PATCH] WIP --- internal/command/state_migrate.go | 61 +++++++++++++++++++ internal/command/state_migrate_test.go | 14 ++++- .../backend2backend.tfmigrate.hcl | 8 +++ .../.terraform.lock.hcl | 0 .../.terraform/terraform.tfstate | 0 .../main.tf | 0 .../pss2backend.tfmigrate.hcl | 12 ++++ 7 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 internal/command/testdata/state-migrate-backend-to-backend/backend2backend.tfmigrate.hcl rename internal/command/testdata/{state-store-to-backend => state-migrate-state-store-to-backend}/.terraform.lock.hcl (100%) rename internal/command/testdata/{state-store-to-backend => state-migrate-state-store-to-backend}/.terraform/terraform.tfstate (100%) rename internal/command/testdata/{state-store-to-backend => state-migrate-state-store-to-backend}/main.tf (100%) create mode 100644 internal/command/testdata/state-migrate-state-store-to-backend/pss2backend.tfmigrate.hcl diff --git a/internal/command/state_migrate.go b/internal/command/state_migrate.go index adacbd2f24..701ec5dc62 100644 --- a/internal/command/state_migrate.go +++ b/internal/command/state_migrate.go @@ -112,6 +112,67 @@ func (c *StateMigrateCommand) Run(rawArgs []string) int { return 1 } +// func (c *StateMigrateCommand) srcBackendFromStateMigrationInstructions(root *configs.Module, locks *depsfile.Locks, viewType arguments.ViewType) (backendrun.OperationsBackend, tfdiags.Diagnostics) { +// var diags tfdiags.Diagnostics + +// sm := root.StateMigrationInstructions + +// var opts *BackendOpts +// switch { +// case sm.Backend != nil: +// opts = &BackendOpts{ +// BackendConfig: sm.Backend, +// Locks: locks, +// ViewType: viewType, +// } +// case sm.StateStore != nil: +// // Annotate state_store config representation with info about how the provider +// // is supplied to Terraform. +// isReattached, err := reattach.IsProviderReattached(sm.StateStore.ProviderAddr, os.Getenv("TF_REATTACH_PROVIDERS")) +// if err != nil { +// panic(fmt.Sprintf("Unable to determine if provider %s is reattached while initializing the state store. This is a bug in Terraform and should be reported: %v", sm.StateStore.ProviderAddr.ForDisplay(), err)) +// } +// sm.StateStore.ProviderSupplyMode = getproviders.DetermineProviderSupplyMode(c.Meta.isProviderDevOverride(sm.StateStore.ProviderAddr), isReattached, sm.StateStore.ProviderAddr.IsBuiltIn()) + +// // Check the provider for state storage is present, either via the dependency lock file or +// // supplied via developer overrides, reattach config, or being built-in. +// // +// // Remember, the (Meta).backend method is used for non-init commands, so we expect dependency locks +// // to be present or for the provider to be otherwise available, e.g. via reattach config. +// depsDiags := sm.StateStore.VerifyDependencySelection(locks, root.ProviderRequirements, sm.StateStore.ProviderSupplyMode) +// diags = diags.Append(depsDiags) +// if depsDiags.HasErrors() { +// return nil, diags +// } + +// opts = &BackendOpts{ +// StateStoreConfig: sm.StateStore, +// Locks: locks, +// ViewType: viewType, +// } +// default: +// diags = diags.Append(tfdiags.Sourceless( +// tfdiags.Error, +// "Missing state migration configuration", +// "One of 'backend' or 'state_store' blocks must be present in the state migration instructions.", +// )) +// return nil, diags +// } + +// // This method should not be used for init commands, +// // so we always set this value as false. +// opts.Init = false + +// // Load the backend +// be, beDiags := c.Meta.Backend(opts) +// diags = diags.Append(beDiags) +// if beDiags.HasErrors() { +// return nil, diags +// } + +// return be, diags +// } + func (c *StateMigrateCommand) Help() string { helpText := ` Usage: terraform [global options] state migrate [options] diff --git a/internal/command/state_migrate_test.go b/internal/command/state_migrate_test.go index 38ef6c9e18..bf87684737 100644 --- a/internal/command/state_migrate_test.go +++ b/internal/command/state_migrate_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/cli" ) -func TestStateMigrate_basic(t *testing.T) { +func TestStateMigrate_fromBackendToBackend(t *testing.T) { ui := cli.NewMockUi() view, done := testView(t) c := &StateMigrateCommand{ @@ -48,6 +48,18 @@ func TestStateMigrate_basic(t *testing.T) { } } +func TestStateMigrate_fromBackendToStateStore(t *testing.T) { + t.Fatal("TODO") +} + +func TestStateMigrate_fromStateStoreToStateStore(t *testing.T) { + t.Fatal("TODO") +} + +func TestStateMigrate_fromStateStoreToBackend(t *testing.T) { + t.Fatal("TODO") +} + func TestStateMigrate_nonExistentLockFiles(t *testing.T) { ui := cli.NewMockUi() view, done := testView(t) diff --git a/internal/command/testdata/state-migrate-backend-to-backend/backend2backend.tfmigrate.hcl b/internal/command/testdata/state-migrate-backend-to-backend/backend2backend.tfmigrate.hcl new file mode 100644 index 0000000000..7970feb65e --- /dev/null +++ b/internal/command/testdata/state-migrate-backend-to-backend/backend2backend.tfmigrate.hcl @@ -0,0 +1,8 @@ +from { + backend { + type = "local" + config { + path = "terraform.tfstate" + } + } +} diff --git a/internal/command/testdata/state-store-to-backend/.terraform.lock.hcl b/internal/command/testdata/state-migrate-state-store-to-backend/.terraform.lock.hcl similarity index 100% rename from internal/command/testdata/state-store-to-backend/.terraform.lock.hcl rename to internal/command/testdata/state-migrate-state-store-to-backend/.terraform.lock.hcl diff --git a/internal/command/testdata/state-store-to-backend/.terraform/terraform.tfstate b/internal/command/testdata/state-migrate-state-store-to-backend/.terraform/terraform.tfstate similarity index 100% rename from internal/command/testdata/state-store-to-backend/.terraform/terraform.tfstate rename to internal/command/testdata/state-migrate-state-store-to-backend/.terraform/terraform.tfstate diff --git a/internal/command/testdata/state-store-to-backend/main.tf b/internal/command/testdata/state-migrate-state-store-to-backend/main.tf similarity index 100% rename from internal/command/testdata/state-store-to-backend/main.tf rename to internal/command/testdata/state-migrate-state-store-to-backend/main.tf diff --git a/internal/command/testdata/state-migrate-state-store-to-backend/pss2backend.tfmigrate.hcl b/internal/command/testdata/state-migrate-state-store-to-backend/pss2backend.tfmigrate.hcl new file mode 100644 index 0000000000..1e73917b57 --- /dev/null +++ b/internal/command/testdata/state-migrate-state-store-to-backend/pss2backend.tfmigrate.hcl @@ -0,0 +1,12 @@ +state_store_required_provider { + test = { + source = "hashicorp/test" + version = "1.2.3" + } +} + +from { + state_store "test_store" { + path = "terraform.tfstate" + } +}