diff --git a/helper/schema/provider.go b/helper/schema/provider.go index a3a2d7101..54ce391f2 100644 --- a/helper/schema/provider.go +++ b/helper/schema/provider.go @@ -214,6 +214,34 @@ func (p *Provider) Resources() []terraform.ResourceType { return result } -func (p *Provider) ImportState(info *terraform.InstanceInfo) ([]*terraform.InstanceState, error) { - return nil, nil +func (p *Provider) ImportState( + info *terraform.InstanceInfo) ([]*terraform.InstanceState, error) { + // Find the resource + r, ok := p.ResourcesMap[info.Type] + if !ok { + return nil, fmt.Errorf("unknown resource type: %s", info.Type) + } + + // If it doesn't support import, error + if r.Importer == nil { + return nil, fmt.Errorf("resource %s doesn't support import", info.Type) + } + + // Create the data + data := r.Data(nil) + data.SetType(info.Type) + + // Call the import function + results, err := r.Importer.State(data, p.meta) + if err != nil { + return nil, err + } + + // Convert the results to InstanceState values and return it + states := make([]*terraform.InstanceState, len(results)) + for i, r := range results { + states[i] = r.State() + } + + return states, nil } diff --git a/helper/schema/provider_test.go b/helper/schema/provider_test.go index a8122007a..74b96cf34 100644 --- a/helper/schema/provider_test.go +++ b/helper/schema/provider_test.go @@ -201,6 +201,36 @@ func TestProviderValidateResource(t *testing.T) { } } +func TestProviderImportState_setsType(t *testing.T) { + var tVal string + stateFunc := func(d *ResourceData, meta interface{}) ([]*ResourceData, error) { + d.SetId("foo") + tVal = d.State().Ephemeral.Type + return []*ResourceData{d}, nil + } + + p := &Provider{ + ResourcesMap: map[string]*Resource{ + "foo": &Resource{ + Importer: &ResourceImporter{ + State: stateFunc, + }, + }, + }, + } + + _, err := p.ImportState(&terraform.InstanceInfo{ + Type: "foo", + }) + if err != nil { + t.Fatalf("err: %s", err) + } + + if tVal != "foo" { + t.Fatal("should set type") + } +} + func TestProviderMeta(t *testing.T) { p := new(Provider) if v := p.Meta(); v != nil {