github.com/renier/terraform@v0.7.8-0.20161024133817-eb8a9ef5471a/terraform/context_import_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"testing"
     7  )
     8  
     9  func TestContextImport_basic(t *testing.T) {
    10  	p := testProvider("aws")
    11  	ctx := testContext2(t, &ContextOpts{
    12  		Providers: map[string]ResourceProviderFactory{
    13  			"aws": testProviderFuncFixed(p),
    14  		},
    15  	})
    16  
    17  	p.ImportStateReturn = []*InstanceState{
    18  		&InstanceState{
    19  			ID:        "foo",
    20  			Ephemeral: EphemeralState{Type: "aws_instance"},
    21  		},
    22  	}
    23  
    24  	state, err := ctx.Import(&ImportOpts{
    25  		Targets: []*ImportTarget{
    26  			&ImportTarget{
    27  				Addr: "aws_instance.foo",
    28  				ID:   "bar",
    29  			},
    30  		},
    31  	})
    32  	if err != nil {
    33  		t.Fatalf("err: %s", err)
    34  	}
    35  
    36  	actual := strings.TrimSpace(state.String())
    37  	expected := strings.TrimSpace(testImportStr)
    38  	if actual != expected {
    39  		t.Fatalf("bad: \n%s", actual)
    40  	}
    41  }
    42  
    43  func TestContextImport_countIndex(t *testing.T) {
    44  	p := testProvider("aws")
    45  	ctx := testContext2(t, &ContextOpts{
    46  		Providers: map[string]ResourceProviderFactory{
    47  			"aws": testProviderFuncFixed(p),
    48  		},
    49  	})
    50  
    51  	p.ImportStateReturn = []*InstanceState{
    52  		&InstanceState{
    53  			ID:        "foo",
    54  			Ephemeral: EphemeralState{Type: "aws_instance"},
    55  		},
    56  	}
    57  
    58  	state, err := ctx.Import(&ImportOpts{
    59  		Targets: []*ImportTarget{
    60  			&ImportTarget{
    61  				Addr: "aws_instance.foo[0]",
    62  				ID:   "bar",
    63  			},
    64  		},
    65  	})
    66  	if err != nil {
    67  		t.Fatalf("err: %s", err)
    68  	}
    69  
    70  	actual := strings.TrimSpace(state.String())
    71  	expected := strings.TrimSpace(testImportCountIndexStr)
    72  	if actual != expected {
    73  		t.Fatalf("bad: \n%s", actual)
    74  	}
    75  }
    76  
    77  func TestContextImport_collision(t *testing.T) {
    78  	p := testProvider("aws")
    79  	ctx := testContext2(t, &ContextOpts{
    80  		Providers: map[string]ResourceProviderFactory{
    81  			"aws": testProviderFuncFixed(p),
    82  		},
    83  
    84  		State: &State{
    85  			Modules: []*ModuleState{
    86  				&ModuleState{
    87  					Path: []string{"root"},
    88  					Resources: map[string]*ResourceState{
    89  						"aws_instance.foo": &ResourceState{
    90  							Type: "aws_instance",
    91  							Primary: &InstanceState{
    92  								ID: "bar",
    93  							},
    94  						},
    95  					},
    96  				},
    97  			},
    98  		},
    99  	})
   100  
   101  	p.ImportStateReturn = []*InstanceState{
   102  		&InstanceState{
   103  			ID:        "foo",
   104  			Ephemeral: EphemeralState{Type: "aws_instance"},
   105  		},
   106  	}
   107  
   108  	state, err := ctx.Import(&ImportOpts{
   109  		Targets: []*ImportTarget{
   110  			&ImportTarget{
   111  				Addr: "aws_instance.foo",
   112  				ID:   "bar",
   113  			},
   114  		},
   115  	})
   116  	if err == nil {
   117  		t.Fatalf("err: %s", err)
   118  	}
   119  
   120  	actual := strings.TrimSpace(state.String())
   121  	expected := strings.TrimSpace(testImportCollisionStr)
   122  	if actual != expected {
   123  		t.Fatalf("bad: \n%s", actual)
   124  	}
   125  }
   126  
   127  func TestContextImport_missingType(t *testing.T) {
   128  	p := testProvider("aws")
   129  	ctx := testContext2(t, &ContextOpts{
   130  		Providers: map[string]ResourceProviderFactory{
   131  			"aws": testProviderFuncFixed(p),
   132  		},
   133  	})
   134  
   135  	p.ImportStateReturn = []*InstanceState{
   136  		&InstanceState{
   137  			ID: "foo",
   138  		},
   139  	}
   140  
   141  	state, err := ctx.Import(&ImportOpts{
   142  		Targets: []*ImportTarget{
   143  			&ImportTarget{
   144  				Addr: "aws_instance.foo",
   145  				ID:   "bar",
   146  			},
   147  		},
   148  	})
   149  	if err == nil {
   150  		t.Fatal("should error")
   151  	}
   152  
   153  	actual := strings.TrimSpace(state.String())
   154  	expected := "<no state>"
   155  	if actual != expected {
   156  		t.Fatalf("bad: \n%s", actual)
   157  	}
   158  }
   159  
   160  func TestContextImport_moduleProvider(t *testing.T) {
   161  	p := testProvider("aws")
   162  	ctx := testContext2(t, &ContextOpts{
   163  		Providers: map[string]ResourceProviderFactory{
   164  			"aws": testProviderFuncFixed(p),
   165  		},
   166  	})
   167  
   168  	p.ImportStateReturn = []*InstanceState{
   169  		&InstanceState{
   170  			ID:        "foo",
   171  			Ephemeral: EphemeralState{Type: "aws_instance"},
   172  		},
   173  	}
   174  
   175  	configured := false
   176  	p.ConfigureFn = func(c *ResourceConfig) error {
   177  		configured = true
   178  
   179  		if v, ok := c.Get("foo"); !ok || v.(string) != "bar" {
   180  			return fmt.Errorf("bad")
   181  		}
   182  
   183  		return nil
   184  	}
   185  
   186  	m := testModule(t, "import-provider")
   187  
   188  	state, err := ctx.Import(&ImportOpts{
   189  		Module: m,
   190  		Targets: []*ImportTarget{
   191  			&ImportTarget{
   192  				Addr: "aws_instance.foo",
   193  				ID:   "bar",
   194  			},
   195  		},
   196  	})
   197  	if err != nil {
   198  		t.Fatalf("err: %s", err)
   199  	}
   200  
   201  	if !configured {
   202  		t.Fatal("didn't configure provider")
   203  	}
   204  
   205  	actual := strings.TrimSpace(state.String())
   206  	expected := strings.TrimSpace(testImportStr)
   207  	if actual != expected {
   208  		t.Fatalf("bad: \n%s", actual)
   209  	}
   210  }
   211  
   212  func TestContextImport_refresh(t *testing.T) {
   213  	p := testProvider("aws")
   214  	ctx := testContext2(t, &ContextOpts{
   215  		Providers: map[string]ResourceProviderFactory{
   216  			"aws": testProviderFuncFixed(p),
   217  		},
   218  	})
   219  
   220  	p.ImportStateReturn = []*InstanceState{
   221  		&InstanceState{
   222  			ID:        "foo",
   223  			Ephemeral: EphemeralState{Type: "aws_instance"},
   224  		},
   225  	}
   226  
   227  	p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
   228  		return &InstanceState{
   229  			ID:         "foo",
   230  			Attributes: map[string]string{"foo": "bar"},
   231  		}, nil
   232  	}
   233  
   234  	state, err := ctx.Import(&ImportOpts{
   235  		Targets: []*ImportTarget{
   236  			&ImportTarget{
   237  				Addr: "aws_instance.foo",
   238  				ID:   "bar",
   239  			},
   240  		},
   241  	})
   242  	if err != nil {
   243  		t.Fatalf("err: %s", err)
   244  	}
   245  
   246  	actual := strings.TrimSpace(state.String())
   247  	expected := strings.TrimSpace(testImportRefreshStr)
   248  	if actual != expected {
   249  		t.Fatalf("bad: \n%s", actual)
   250  	}
   251  }
   252  
   253  func TestContextImport_refreshNil(t *testing.T) {
   254  	p := testProvider("aws")
   255  	ctx := testContext2(t, &ContextOpts{
   256  		Providers: map[string]ResourceProviderFactory{
   257  			"aws": testProviderFuncFixed(p),
   258  		},
   259  	})
   260  
   261  	p.ImportStateReturn = []*InstanceState{
   262  		&InstanceState{
   263  			ID:        "foo",
   264  			Ephemeral: EphemeralState{Type: "aws_instance"},
   265  		},
   266  	}
   267  
   268  	p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
   269  		return nil, nil
   270  	}
   271  
   272  	state, err := ctx.Import(&ImportOpts{
   273  		Targets: []*ImportTarget{
   274  			&ImportTarget{
   275  				Addr: "aws_instance.foo",
   276  				ID:   "bar",
   277  			},
   278  		},
   279  	})
   280  	if err == nil {
   281  		t.Fatal("should error")
   282  	}
   283  
   284  	actual := strings.TrimSpace(state.String())
   285  	expected := "<no state>"
   286  	if actual != expected {
   287  		t.Fatalf("bad: \n%s", actual)
   288  	}
   289  }
   290  
   291  func TestContextImport_module(t *testing.T) {
   292  	p := testProvider("aws")
   293  	ctx := testContext2(t, &ContextOpts{
   294  		Providers: map[string]ResourceProviderFactory{
   295  			"aws": testProviderFuncFixed(p),
   296  		},
   297  	})
   298  
   299  	p.ImportStateReturn = []*InstanceState{
   300  		&InstanceState{
   301  			ID:        "foo",
   302  			Ephemeral: EphemeralState{Type: "aws_instance"},
   303  		},
   304  	}
   305  
   306  	state, err := ctx.Import(&ImportOpts{
   307  		Targets: []*ImportTarget{
   308  			&ImportTarget{
   309  				Addr: "module.foo.aws_instance.foo",
   310  				ID:   "bar",
   311  			},
   312  		},
   313  	})
   314  	if err != nil {
   315  		t.Fatalf("err: %s", err)
   316  	}
   317  
   318  	actual := strings.TrimSpace(state.String())
   319  	expected := strings.TrimSpace(testImportModuleStr)
   320  	if actual != expected {
   321  		t.Fatalf("bad: \n%s", actual)
   322  	}
   323  }
   324  
   325  func TestContextImport_moduleDepth2(t *testing.T) {
   326  	p := testProvider("aws")
   327  	ctx := testContext2(t, &ContextOpts{
   328  		Providers: map[string]ResourceProviderFactory{
   329  			"aws": testProviderFuncFixed(p),
   330  		},
   331  	})
   332  
   333  	p.ImportStateReturn = []*InstanceState{
   334  		&InstanceState{
   335  			ID:        "foo",
   336  			Ephemeral: EphemeralState{Type: "aws_instance"},
   337  		},
   338  	}
   339  
   340  	state, err := ctx.Import(&ImportOpts{
   341  		Targets: []*ImportTarget{
   342  			&ImportTarget{
   343  				Addr: "module.a.module.b.aws_instance.foo",
   344  				ID:   "bar",
   345  			},
   346  		},
   347  	})
   348  	if err != nil {
   349  		t.Fatalf("err: %s", err)
   350  	}
   351  
   352  	actual := strings.TrimSpace(state.String())
   353  	expected := strings.TrimSpace(testImportModuleDepth2Str)
   354  	if actual != expected {
   355  		t.Fatalf("bad: \n%s", actual)
   356  	}
   357  }
   358  
   359  func TestContextImport_moduleDiff(t *testing.T) {
   360  	p := testProvider("aws")
   361  	ctx := testContext2(t, &ContextOpts{
   362  		Providers: map[string]ResourceProviderFactory{
   363  			"aws": testProviderFuncFixed(p),
   364  		},
   365  
   366  		State: &State{
   367  			Modules: []*ModuleState{
   368  				&ModuleState{
   369  					Path: []string{"root", "bar"},
   370  					Resources: map[string]*ResourceState{
   371  						"aws_instance.bar": &ResourceState{
   372  							Type: "aws_instance",
   373  							Primary: &InstanceState{
   374  								ID: "bar",
   375  							},
   376  						},
   377  					},
   378  				},
   379  			},
   380  		},
   381  	})
   382  
   383  	p.ImportStateReturn = []*InstanceState{
   384  		&InstanceState{
   385  			ID:        "foo",
   386  			Ephemeral: EphemeralState{Type: "aws_instance"},
   387  		},
   388  	}
   389  
   390  	state, err := ctx.Import(&ImportOpts{
   391  		Targets: []*ImportTarget{
   392  			&ImportTarget{
   393  				Addr: "module.foo.aws_instance.foo",
   394  				ID:   "bar",
   395  			},
   396  		},
   397  	})
   398  	if err != nil {
   399  		t.Fatalf("err: %s", err)
   400  	}
   401  
   402  	actual := strings.TrimSpace(state.String())
   403  	expected := strings.TrimSpace(testImportModuleDiffStr)
   404  	if actual != expected {
   405  		t.Fatalf("bad: \n%s", actual)
   406  	}
   407  }
   408  
   409  func TestContextImport_moduleExisting(t *testing.T) {
   410  	p := testProvider("aws")
   411  	ctx := testContext2(t, &ContextOpts{
   412  		Providers: map[string]ResourceProviderFactory{
   413  			"aws": testProviderFuncFixed(p),
   414  		},
   415  
   416  		State: &State{
   417  			Modules: []*ModuleState{
   418  				&ModuleState{
   419  					Path: []string{"root", "foo"},
   420  					Resources: map[string]*ResourceState{
   421  						"aws_instance.bar": &ResourceState{
   422  							Type: "aws_instance",
   423  							Primary: &InstanceState{
   424  								ID: "bar",
   425  							},
   426  						},
   427  					},
   428  				},
   429  			},
   430  		},
   431  	})
   432  
   433  	p.ImportStateReturn = []*InstanceState{
   434  		&InstanceState{
   435  			ID:        "foo",
   436  			Ephemeral: EphemeralState{Type: "aws_instance"},
   437  		},
   438  	}
   439  
   440  	state, err := ctx.Import(&ImportOpts{
   441  		Targets: []*ImportTarget{
   442  			&ImportTarget{
   443  				Addr: "module.foo.aws_instance.foo",
   444  				ID:   "bar",
   445  			},
   446  		},
   447  	})
   448  	if err != nil {
   449  		t.Fatalf("err: %s", err)
   450  	}
   451  
   452  	actual := strings.TrimSpace(state.String())
   453  	expected := strings.TrimSpace(testImportModuleExistingStr)
   454  	if actual != expected {
   455  		t.Fatalf("bad: \n%s", actual)
   456  	}
   457  }
   458  
   459  func TestContextImport_multiState(t *testing.T) {
   460  	p := testProvider("aws")
   461  	ctx := testContext2(t, &ContextOpts{
   462  		Providers: map[string]ResourceProviderFactory{
   463  			"aws": testProviderFuncFixed(p),
   464  		},
   465  	})
   466  
   467  	p.ImportStateReturn = []*InstanceState{
   468  		&InstanceState{
   469  			ID:        "foo",
   470  			Ephemeral: EphemeralState{Type: "aws_instance"},
   471  		},
   472  		&InstanceState{
   473  			ID:        "bar",
   474  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   475  		},
   476  	}
   477  
   478  	state, err := ctx.Import(&ImportOpts{
   479  		Targets: []*ImportTarget{
   480  			&ImportTarget{
   481  				Addr: "aws_instance.foo",
   482  				ID:   "bar",
   483  			},
   484  		},
   485  	})
   486  	if err != nil {
   487  		t.Fatalf("err: %s", err)
   488  	}
   489  
   490  	actual := strings.TrimSpace(state.String())
   491  	expected := strings.TrimSpace(testImportMultiStr)
   492  	if actual != expected {
   493  		t.Fatalf("bad: \n%s", actual)
   494  	}
   495  }
   496  
   497  func TestContextImport_multiStateSame(t *testing.T) {
   498  	p := testProvider("aws")
   499  	ctx := testContext2(t, &ContextOpts{
   500  		Providers: map[string]ResourceProviderFactory{
   501  			"aws": testProviderFuncFixed(p),
   502  		},
   503  	})
   504  
   505  	p.ImportStateReturn = []*InstanceState{
   506  		&InstanceState{
   507  			ID:        "foo",
   508  			Ephemeral: EphemeralState{Type: "aws_instance"},
   509  		},
   510  		&InstanceState{
   511  			ID:        "bar",
   512  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   513  		},
   514  		&InstanceState{
   515  			ID:        "qux",
   516  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   517  		},
   518  	}
   519  
   520  	state, err := ctx.Import(&ImportOpts{
   521  		Targets: []*ImportTarget{
   522  			&ImportTarget{
   523  				Addr: "aws_instance.foo",
   524  				ID:   "bar",
   525  			},
   526  		},
   527  	})
   528  	if err != nil {
   529  		t.Fatalf("err: %s", err)
   530  	}
   531  
   532  	actual := strings.TrimSpace(state.String())
   533  	expected := strings.TrimSpace(testImportMultiSameStr)
   534  	if actual != expected {
   535  		t.Fatalf("bad: \n%s", actual)
   536  	}
   537  }
   538  
   539  const testImportStr = `
   540  aws_instance.foo:
   541    ID = foo
   542    provider = aws
   543  `
   544  
   545  const testImportCountIndexStr = `
   546  aws_instance.foo.0:
   547    ID = foo
   548    provider = aws
   549  `
   550  
   551  const testImportCollisionStr = `
   552  aws_instance.foo:
   553    ID = bar
   554  `
   555  
   556  const testImportModuleStr = `
   557  <no state>
   558  module.foo:
   559    aws_instance.foo:
   560      ID = foo
   561      provider = aws
   562  `
   563  
   564  const testImportModuleDepth2Str = `
   565  <no state>
   566  module.a.b:
   567    aws_instance.foo:
   568      ID = foo
   569      provider = aws
   570  `
   571  
   572  const testImportModuleDiffStr = `
   573  module.bar:
   574    aws_instance.bar:
   575      ID = bar
   576  module.foo:
   577    aws_instance.foo:
   578      ID = foo
   579      provider = aws
   580  `
   581  
   582  const testImportModuleExistingStr = `
   583  module.foo:
   584    aws_instance.bar:
   585      ID = bar
   586    aws_instance.foo:
   587      ID = foo
   588      provider = aws
   589  `
   590  
   591  const testImportMultiStr = `
   592  aws_instance.foo:
   593    ID = foo
   594    provider = aws
   595  aws_instance_thing.foo:
   596    ID = bar
   597    provider = aws
   598  `
   599  
   600  const testImportMultiSameStr = `
   601  aws_instance.foo:
   602    ID = foo
   603    provider = aws
   604  aws_instance_thing.foo:
   605    ID = bar
   606    provider = aws
   607  aws_instance_thing.foo-1:
   608    ID = qux
   609    provider = aws
   610  `
   611  
   612  const testImportRefreshStr = `
   613  aws_instance.foo:
   614    ID = foo
   615    provider = aws
   616    foo = bar
   617  `