Merge pull request #15768 from hashicorp/jbardin/remote-import
Don't ForceLocal for the import backend
This commit is contained in:
commit
ea3e87b584
|
@ -124,14 +124,17 @@ func (c *ImportCommand) Run(args []string) int {
|
||||||
// Load the backend
|
// Load the backend
|
||||||
b, err := c.Backend(&BackendOpts{
|
b, err := c.Backend(&BackendOpts{
|
||||||
Config: mod.Config(),
|
Config: mod.Config(),
|
||||||
ForceLocal: true,
|
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
|
c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// We require a local backend
|
// We require a backend.Local to build a context.
|
||||||
|
// This isn't necessarily a "local.Local" backend, which provides local
|
||||||
|
// operations, however that is the only current implementation. A
|
||||||
|
// "local.Local" backend also doesn't necessarily provide local state, as
|
||||||
|
// that may be delegated to a "remotestate.Backend".
|
||||||
local, ok := b.(backend.Local)
|
local, ok := b.(backend.Local)
|
||||||
if !ok {
|
if !ok {
|
||||||
c.Ui.Error(ErrUnsupportedLocalOp)
|
c.Ui.Error(ErrUnsupportedLocalOp)
|
||||||
|
@ -232,11 +235,12 @@ Options:
|
||||||
specifying aliases, such as "aws.eu". Defaults to the
|
specifying aliases, such as "aws.eu". Defaults to the
|
||||||
normal provider prefix of the resource being imported.
|
normal provider prefix of the resource being imported.
|
||||||
|
|
||||||
-state=path Path to read and save state (unless state-out
|
-state=PATH Path to the source state file. Defaults to the configured
|
||||||
is specified). Defaults to "terraform.tfstate".
|
backend, or "terraform.tfstate"
|
||||||
|
|
||||||
-state-out=path Path to write updated state file. By default, the
|
-state-out=PATH Path to the destination state file to write to. If this
|
||||||
"-state" path will be used.
|
isn't specified, the source state file will be used. This
|
||||||
|
can be a new or existing path.
|
||||||
|
|
||||||
-var 'foo=bar' Set a variable in the Terraform configuration. This
|
-var 'foo=bar' Set a variable in the Terraform configuration. This
|
||||||
flag can be set multiple times. This is only useful
|
flag can be set multiple times. This is only useful
|
||||||
|
|
|
@ -110,6 +110,88 @@ func TestImport_providerConfig(t *testing.T) {
|
||||||
testStateOutput(t, statePath, testImportStr)
|
testStateOutput(t, statePath, testImportStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "remote" state provided by the "local" backend
|
||||||
|
func TestImport_remoteState(t *testing.T) {
|
||||||
|
td := tempDir(t)
|
||||||
|
copy.CopyDir(testFixturePath("import-provider-remote-state"), td)
|
||||||
|
defer os.RemoveAll(td)
|
||||||
|
defer testChdir(t, td)()
|
||||||
|
|
||||||
|
statePath := "imported.tfstate"
|
||||||
|
|
||||||
|
// init our backend
|
||||||
|
ui := new(cli.MockUi)
|
||||||
|
m := Meta{
|
||||||
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
||||||
|
Ui: ui,
|
||||||
|
}
|
||||||
|
|
||||||
|
ic := &InitCommand{
|
||||||
|
Meta: m,
|
||||||
|
providerInstaller: &mockProviderInstaller{
|
||||||
|
Providers: map[string][]string{
|
||||||
|
"test": []string{"1.2.3"},
|
||||||
|
},
|
||||||
|
|
||||||
|
Dir: m.pluginDir(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if code := ic.Run([]string{}); code != 0 {
|
||||||
|
t.Fatalf("bad: \n%s", ui.ErrorWriter)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := testProvider()
|
||||||
|
ui = new(cli.MockUi)
|
||||||
|
c := &ImportCommand{
|
||||||
|
Meta: Meta{
|
||||||
|
testingOverrides: metaOverridesForProvider(p),
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
p.ImportStateFn = nil
|
||||||
|
p.ImportStateReturn = []*terraform.InstanceState{
|
||||||
|
&terraform.InstanceState{
|
||||||
|
ID: "yay",
|
||||||
|
Ephemeral: terraform.EphemeralState{
|
||||||
|
Type: "test_instance",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
configured := false
|
||||||
|
p.ConfigureFn = func(c *terraform.ResourceConfig) error {
|
||||||
|
configured = true
|
||||||
|
|
||||||
|
if v, ok := c.Get("foo"); !ok || v.(string) != "bar" {
|
||||||
|
return fmt.Errorf("bad value: %#v", v)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{
|
||||||
|
"test_instance.foo",
|
||||||
|
"bar",
|
||||||
|
}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
fmt.Println(ui.OutputWriter)
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that we were called
|
||||||
|
if !configured {
|
||||||
|
t.Fatal("Configure should be called")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !p.ImportStateCalled {
|
||||||
|
t.Fatal("ImportState should be called")
|
||||||
|
}
|
||||||
|
|
||||||
|
testStateOutput(t, statePath, testImportStr)
|
||||||
|
}
|
||||||
|
|
||||||
func TestImport_providerConfigWithVar(t *testing.T) {
|
func TestImport_providerConfigWithVar(t *testing.T) {
|
||||||
defer testChdir(t, testFixturePath("import-provider-var"))()
|
defer testChdir(t, testFixturePath("import-provider-var"))()
|
||||||
|
|
||||||
|
|
|
@ -87,9 +87,8 @@ Options:
|
||||||
will write it to the same path as the statefile with
|
will write it to the same path as the statefile with
|
||||||
a backup extension.
|
a backup extension.
|
||||||
|
|
||||||
-state=statefile Path to a Terraform state file to use to look
|
-state=PATH Path to the source state file. Defaults to the configured
|
||||||
up Terraform-managed resources. By default it will
|
backend, or "terraform.tfstate"
|
||||||
use the state "terraform.tfstate" if it exists.
|
|
||||||
|
|
||||||
`
|
`
|
||||||
return strings.TrimSpace(helpText)
|
return strings.TrimSpace(helpText)
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
terraform {
|
||||||
|
backend "local" {
|
||||||
|
path = "imported.tfstate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "test" {
|
||||||
|
foo = "bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "test_instance" "foo" {
|
||||||
|
}
|
|
@ -53,12 +53,12 @@ The command-line flags are all optional. The list of available flags are:
|
||||||
provider based on the prefix of the resource being imported. You usually
|
provider based on the prefix of the resource being imported. You usually
|
||||||
don't need to specify this.
|
don't need to specify this.
|
||||||
|
|
||||||
* `-state=path` - The path to read and save state files (unless state-out is
|
* `-state=path` - Path to the source state file to read from. Defaults to the
|
||||||
specified). Ignored when [remote state](/docs/state/remote.html) is used.
|
configured backend, or "terraform.tfstate".
|
||||||
|
|
||||||
* `-state-out=path` - Path to write the final state file. By default, this is
|
* `-state-out=path` - Path to the destination state file to write to. If this
|
||||||
the state path. Ignored when [remote state](/docs/state/remote.html) is
|
isn't specified the source state file will be used. This can be a new or
|
||||||
used.
|
existing path.
|
||||||
|
|
||||||
* `-var 'foo=bar'` - Set a variable in the Terraform configuration. This flag
|
* `-var 'foo=bar'` - Set a variable in the Terraform configuration. This flag
|
||||||
can be set multiple times. Variable values are interpreted as
|
can be set multiple times. Variable values are interpreted as
|
||||||
|
|
Loading…
Reference in New Issue