github.com/nbering/terraform@v0.8.5-0.20170113232247-453f670684b5/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  	actual := strings.TrimSpace(state.String())
    36  	expected := strings.TrimSpace(testImportStr)
    37  	if actual != expected {
    38  		t.Fatalf("bad: \n%s", actual)
    39  	}
    40  }
    41  
    42  func TestContextImport_countIndex(t *testing.T) {
    43  	p := testProvider("aws")
    44  	ctx := testContext2(t, &ContextOpts{
    45  		Providers: map[string]ResourceProviderFactory{
    46  			"aws": testProviderFuncFixed(p),
    47  		},
    48  	})
    49  
    50  	p.ImportStateReturn = []*InstanceState{
    51  		&InstanceState{
    52  			ID:        "foo",
    53  			Ephemeral: EphemeralState{Type: "aws_instance"},
    54  		},
    55  	}
    56  
    57  	state, err := ctx.Import(&ImportOpts{
    58  		Targets: []*ImportTarget{
    59  			&ImportTarget{
    60  				Addr: "aws_instance.foo[0]",
    61  				ID:   "bar",
    62  			},
    63  		},
    64  	})
    65  	if err != nil {
    66  		t.Fatalf("err: %s", err)
    67  	}
    68  
    69  	actual := strings.TrimSpace(state.String())
    70  	expected := strings.TrimSpace(testImportCountIndexStr)
    71  	if actual != expected {
    72  		t.Fatalf("bad: \n%s", actual)
    73  	}
    74  }
    75  
    76  func TestContextImport_collision(t *testing.T) {
    77  	p := testProvider("aws")
    78  	ctx := testContext2(t, &ContextOpts{
    79  		Providers: map[string]ResourceProviderFactory{
    80  			"aws": testProviderFuncFixed(p),
    81  		},
    82  
    83  		State: &State{
    84  			Modules: []*ModuleState{
    85  				&ModuleState{
    86  					Path: []string{"root"},
    87  					Resources: map[string]*ResourceState{
    88  						"aws_instance.foo": &ResourceState{
    89  							Type: "aws_instance",
    90  							Primary: &InstanceState{
    91  								ID: "bar",
    92  							},
    93  						},
    94  					},
    95  				},
    96  			},
    97  		},
    98  	})
    99  
   100  	p.ImportStateReturn = []*InstanceState{
   101  		&InstanceState{
   102  			ID:        "foo",
   103  			Ephemeral: EphemeralState{Type: "aws_instance"},
   104  		},
   105  	}
   106  
   107  	state, err := ctx.Import(&ImportOpts{
   108  		Targets: []*ImportTarget{
   109  			&ImportTarget{
   110  				Addr: "aws_instance.foo",
   111  				ID:   "bar",
   112  			},
   113  		},
   114  	})
   115  	if err == nil {
   116  		t.Fatalf("err: %s", err)
   117  	}
   118  
   119  	actual := strings.TrimSpace(state.String())
   120  	expected := strings.TrimSpace(testImportCollisionStr)
   121  	if actual != expected {
   122  		t.Fatalf("bad: \n%s", actual)
   123  	}
   124  }
   125  
   126  func TestContextImport_missingType(t *testing.T) {
   127  	p := testProvider("aws")
   128  	ctx := testContext2(t, &ContextOpts{
   129  		Providers: map[string]ResourceProviderFactory{
   130  			"aws": testProviderFuncFixed(p),
   131  		},
   132  	})
   133  
   134  	p.ImportStateReturn = []*InstanceState{
   135  		&InstanceState{
   136  			ID: "foo",
   137  		},
   138  	}
   139  
   140  	state, err := ctx.Import(&ImportOpts{
   141  		Targets: []*ImportTarget{
   142  			&ImportTarget{
   143  				Addr: "aws_instance.foo",
   144  				ID:   "bar",
   145  			},
   146  		},
   147  	})
   148  	if err == nil {
   149  		t.Fatal("should error")
   150  	}
   151  
   152  	actual := strings.TrimSpace(state.String())
   153  	expected := "<no state>"
   154  	if actual != expected {
   155  		t.Fatalf("bad: \n%s", actual)
   156  	}
   157  }
   158  
   159  func TestContextImport_moduleProvider(t *testing.T) {
   160  	p := testProvider("aws")
   161  	ctx := testContext2(t, &ContextOpts{
   162  		Providers: map[string]ResourceProviderFactory{
   163  			"aws": testProviderFuncFixed(p),
   164  		},
   165  	})
   166  
   167  	p.ImportStateReturn = []*InstanceState{
   168  		&InstanceState{
   169  			ID:        "foo",
   170  			Ephemeral: EphemeralState{Type: "aws_instance"},
   171  		},
   172  	}
   173  
   174  	configured := false
   175  	p.ConfigureFn = func(c *ResourceConfig) error {
   176  		configured = true
   177  
   178  		if v, ok := c.Get("foo"); !ok || v.(string) != "bar" {
   179  			return fmt.Errorf("bad")
   180  		}
   181  
   182  		return nil
   183  	}
   184  
   185  	m := testModule(t, "import-provider")
   186  
   187  	state, err := ctx.Import(&ImportOpts{
   188  		Module: m,
   189  		Targets: []*ImportTarget{
   190  			&ImportTarget{
   191  				Addr: "aws_instance.foo",
   192  				ID:   "bar",
   193  			},
   194  		},
   195  	})
   196  	if err != nil {
   197  		t.Fatalf("err: %s", err)
   198  	}
   199  
   200  	if !configured {
   201  		t.Fatal("didn't configure provider")
   202  	}
   203  
   204  	actual := strings.TrimSpace(state.String())
   205  	expected := strings.TrimSpace(testImportStr)
   206  	if actual != expected {
   207  		t.Fatalf("bad: \n%s", actual)
   208  	}
   209  }
   210  
   211  // Test that import will interpolate provider configuration and use
   212  // that configuration for import.
   213  func TestContextImport_providerVarConfig(t *testing.T) {
   214  	p := testProvider("aws")
   215  	ctx := testContext2(t, &ContextOpts{
   216  		Module: testModule(t, "import-provider-vars"),
   217  		Providers: map[string]ResourceProviderFactory{
   218  			"aws": testProviderFuncFixed(p),
   219  		},
   220  		Variables: map[string]interface{}{
   221  			"foo": "bar",
   222  		},
   223  	})
   224  
   225  	configured := false
   226  	p.ConfigureFn = func(c *ResourceConfig) error {
   227  		configured = true
   228  
   229  		if v, ok := c.Get("foo"); !ok || v.(string) != "bar" {
   230  			return fmt.Errorf("bad value: %#v", v)
   231  		}
   232  
   233  		return nil
   234  	}
   235  
   236  	p.ImportStateReturn = []*InstanceState{
   237  		&InstanceState{
   238  			ID:        "foo",
   239  			Ephemeral: EphemeralState{Type: "aws_instance"},
   240  		},
   241  	}
   242  
   243  	state, err := ctx.Import(&ImportOpts{
   244  		Targets: []*ImportTarget{
   245  			&ImportTarget{
   246  				Addr: "aws_instance.foo",
   247  				ID:   "bar",
   248  			},
   249  		},
   250  	})
   251  	if err != nil {
   252  		t.Fatalf("err: %s", err)
   253  	}
   254  
   255  	if !configured {
   256  		t.Fatal("didn't configure provider")
   257  	}
   258  
   259  	actual := strings.TrimSpace(state.String())
   260  	expected := strings.TrimSpace(testImportStr)
   261  	if actual != expected {
   262  		t.Fatalf("bad: \n%s", actual)
   263  	}
   264  }
   265  
   266  // Test that provider configs can't reference resources.
   267  func TestContextImport_providerNonVarConfig(t *testing.T) {
   268  	p := testProvider("aws")
   269  	ctx := testContext2(t, &ContextOpts{
   270  		Module: testModule(t, "import-provider-non-vars"),
   271  		Providers: map[string]ResourceProviderFactory{
   272  			"aws": testProviderFuncFixed(p),
   273  		},
   274  	})
   275  
   276  	p.ImportStateReturn = []*InstanceState{
   277  		&InstanceState{
   278  			ID:        "foo",
   279  			Ephemeral: EphemeralState{Type: "aws_instance"},
   280  		},
   281  	}
   282  
   283  	_, err := ctx.Import(&ImportOpts{
   284  		Targets: []*ImportTarget{
   285  			&ImportTarget{
   286  				Addr: "aws_instance.foo",
   287  				ID:   "bar",
   288  			},
   289  		},
   290  	})
   291  	if err == nil {
   292  		t.Fatal("should error")
   293  	}
   294  }
   295  
   296  func TestContextImport_refresh(t *testing.T) {
   297  	p := testProvider("aws")
   298  	ctx := testContext2(t, &ContextOpts{
   299  		Providers: map[string]ResourceProviderFactory{
   300  			"aws": testProviderFuncFixed(p),
   301  		},
   302  	})
   303  
   304  	p.ImportStateReturn = []*InstanceState{
   305  		&InstanceState{
   306  			ID:        "foo",
   307  			Ephemeral: EphemeralState{Type: "aws_instance"},
   308  		},
   309  	}
   310  
   311  	p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
   312  		return &InstanceState{
   313  			ID:         "foo",
   314  			Attributes: map[string]string{"foo": "bar"},
   315  		}, nil
   316  	}
   317  
   318  	state, err := ctx.Import(&ImportOpts{
   319  		Targets: []*ImportTarget{
   320  			&ImportTarget{
   321  				Addr: "aws_instance.foo",
   322  				ID:   "bar",
   323  			},
   324  		},
   325  	})
   326  	if err != nil {
   327  		t.Fatalf("err: %s", err)
   328  	}
   329  
   330  	actual := strings.TrimSpace(state.String())
   331  	expected := strings.TrimSpace(testImportRefreshStr)
   332  	if actual != expected {
   333  		t.Fatalf("bad: \n%s", actual)
   334  	}
   335  }
   336  
   337  func TestContextImport_refreshNil(t *testing.T) {
   338  	p := testProvider("aws")
   339  	ctx := testContext2(t, &ContextOpts{
   340  		Providers: map[string]ResourceProviderFactory{
   341  			"aws": testProviderFuncFixed(p),
   342  		},
   343  	})
   344  
   345  	p.ImportStateReturn = []*InstanceState{
   346  		&InstanceState{
   347  			ID:        "foo",
   348  			Ephemeral: EphemeralState{Type: "aws_instance"},
   349  		},
   350  	}
   351  
   352  	p.RefreshFn = func(info *InstanceInfo, s *InstanceState) (*InstanceState, error) {
   353  		return nil, nil
   354  	}
   355  
   356  	state, err := ctx.Import(&ImportOpts{
   357  		Targets: []*ImportTarget{
   358  			&ImportTarget{
   359  				Addr: "aws_instance.foo",
   360  				ID:   "bar",
   361  			},
   362  		},
   363  	})
   364  	if err == nil {
   365  		t.Fatal("should error")
   366  	}
   367  
   368  	actual := strings.TrimSpace(state.String())
   369  	expected := "<no state>"
   370  	if actual != expected {
   371  		t.Fatalf("bad: \n%s", actual)
   372  	}
   373  }
   374  
   375  func TestContextImport_module(t *testing.T) {
   376  	p := testProvider("aws")
   377  	ctx := testContext2(t, &ContextOpts{
   378  		Providers: map[string]ResourceProviderFactory{
   379  			"aws": testProviderFuncFixed(p),
   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(testImportModuleStr)
   404  	if actual != expected {
   405  		t.Fatalf("bad: \n%s", actual)
   406  	}
   407  }
   408  
   409  func TestContextImport_moduleDepth2(t *testing.T) {
   410  	p := testProvider("aws")
   411  	ctx := testContext2(t, &ContextOpts{
   412  		Providers: map[string]ResourceProviderFactory{
   413  			"aws": testProviderFuncFixed(p),
   414  		},
   415  	})
   416  
   417  	p.ImportStateReturn = []*InstanceState{
   418  		&InstanceState{
   419  			ID:        "foo",
   420  			Ephemeral: EphemeralState{Type: "aws_instance"},
   421  		},
   422  	}
   423  
   424  	state, err := ctx.Import(&ImportOpts{
   425  		Targets: []*ImportTarget{
   426  			&ImportTarget{
   427  				Addr: "module.a.module.b.aws_instance.foo",
   428  				ID:   "bar",
   429  			},
   430  		},
   431  	})
   432  	if err != nil {
   433  		t.Fatalf("err: %s", err)
   434  	}
   435  
   436  	actual := strings.TrimSpace(state.String())
   437  	expected := strings.TrimSpace(testImportModuleDepth2Str)
   438  	if actual != expected {
   439  		t.Fatalf("bad: \n%s", actual)
   440  	}
   441  }
   442  
   443  func TestContextImport_moduleDiff(t *testing.T) {
   444  	p := testProvider("aws")
   445  	ctx := testContext2(t, &ContextOpts{
   446  		Providers: map[string]ResourceProviderFactory{
   447  			"aws": testProviderFuncFixed(p),
   448  		},
   449  
   450  		State: &State{
   451  			Modules: []*ModuleState{
   452  				&ModuleState{
   453  					Path: []string{"root", "bar"},
   454  					Resources: map[string]*ResourceState{
   455  						"aws_instance.bar": &ResourceState{
   456  							Type: "aws_instance",
   457  							Primary: &InstanceState{
   458  								ID: "bar",
   459  							},
   460  						},
   461  					},
   462  				},
   463  			},
   464  		},
   465  	})
   466  
   467  	p.ImportStateReturn = []*InstanceState{
   468  		&InstanceState{
   469  			ID:        "foo",
   470  			Ephemeral: EphemeralState{Type: "aws_instance"},
   471  		},
   472  	}
   473  
   474  	state, err := ctx.Import(&ImportOpts{
   475  		Targets: []*ImportTarget{
   476  			&ImportTarget{
   477  				Addr: "module.foo.aws_instance.foo",
   478  				ID:   "bar",
   479  			},
   480  		},
   481  	})
   482  	if err != nil {
   483  		t.Fatalf("err: %s", err)
   484  	}
   485  
   486  	actual := strings.TrimSpace(state.String())
   487  	expected := strings.TrimSpace(testImportModuleDiffStr)
   488  	if actual != expected {
   489  		t.Fatalf("bad: \n%s", actual)
   490  	}
   491  }
   492  
   493  func TestContextImport_moduleExisting(t *testing.T) {
   494  	p := testProvider("aws")
   495  	ctx := testContext2(t, &ContextOpts{
   496  		Providers: map[string]ResourceProviderFactory{
   497  			"aws": testProviderFuncFixed(p),
   498  		},
   499  
   500  		State: &State{
   501  			Modules: []*ModuleState{
   502  				&ModuleState{
   503  					Path: []string{"root", "foo"},
   504  					Resources: map[string]*ResourceState{
   505  						"aws_instance.bar": &ResourceState{
   506  							Type: "aws_instance",
   507  							Primary: &InstanceState{
   508  								ID: "bar",
   509  							},
   510  						},
   511  					},
   512  				},
   513  			},
   514  		},
   515  	})
   516  
   517  	p.ImportStateReturn = []*InstanceState{
   518  		&InstanceState{
   519  			ID:        "foo",
   520  			Ephemeral: EphemeralState{Type: "aws_instance"},
   521  		},
   522  	}
   523  
   524  	state, err := ctx.Import(&ImportOpts{
   525  		Targets: []*ImportTarget{
   526  			&ImportTarget{
   527  				Addr: "module.foo.aws_instance.foo",
   528  				ID:   "bar",
   529  			},
   530  		},
   531  	})
   532  	if err != nil {
   533  		t.Fatalf("err: %s", err)
   534  	}
   535  
   536  	actual := strings.TrimSpace(state.String())
   537  	expected := strings.TrimSpace(testImportModuleExistingStr)
   538  	if actual != expected {
   539  		t.Fatalf("bad: \n%s", actual)
   540  	}
   541  }
   542  
   543  func TestContextImport_multiState(t *testing.T) {
   544  	p := testProvider("aws")
   545  	ctx := testContext2(t, &ContextOpts{
   546  		Providers: map[string]ResourceProviderFactory{
   547  			"aws": testProviderFuncFixed(p),
   548  		},
   549  	})
   550  
   551  	p.ImportStateReturn = []*InstanceState{
   552  		&InstanceState{
   553  			ID:        "foo",
   554  			Ephemeral: EphemeralState{Type: "aws_instance"},
   555  		},
   556  		&InstanceState{
   557  			ID:        "bar",
   558  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   559  		},
   560  	}
   561  
   562  	state, err := ctx.Import(&ImportOpts{
   563  		Targets: []*ImportTarget{
   564  			&ImportTarget{
   565  				Addr: "aws_instance.foo",
   566  				ID:   "bar",
   567  			},
   568  		},
   569  	})
   570  	if err != nil {
   571  		t.Fatalf("err: %s", err)
   572  	}
   573  
   574  	actual := strings.TrimSpace(state.String())
   575  	expected := strings.TrimSpace(testImportMultiStr)
   576  	if actual != expected {
   577  		t.Fatalf("bad: \n%s", actual)
   578  	}
   579  }
   580  
   581  func TestContextImport_multiStateSame(t *testing.T) {
   582  	p := testProvider("aws")
   583  	ctx := testContext2(t, &ContextOpts{
   584  		Providers: map[string]ResourceProviderFactory{
   585  			"aws": testProviderFuncFixed(p),
   586  		},
   587  	})
   588  
   589  	p.ImportStateReturn = []*InstanceState{
   590  		&InstanceState{
   591  			ID:        "foo",
   592  			Ephemeral: EphemeralState{Type: "aws_instance"},
   593  		},
   594  		&InstanceState{
   595  			ID:        "bar",
   596  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   597  		},
   598  		&InstanceState{
   599  			ID:        "qux",
   600  			Ephemeral: EphemeralState{Type: "aws_instance_thing"},
   601  		},
   602  	}
   603  
   604  	state, err := ctx.Import(&ImportOpts{
   605  		Targets: []*ImportTarget{
   606  			&ImportTarget{
   607  				Addr: "aws_instance.foo",
   608  				ID:   "bar",
   609  			},
   610  		},
   611  	})
   612  	if err != nil {
   613  		t.Fatalf("err: %s", err)
   614  	}
   615  
   616  	actual := strings.TrimSpace(state.String())
   617  	expected := strings.TrimSpace(testImportMultiSameStr)
   618  	if actual != expected {
   619  		t.Fatalf("bad: \n%s", actual)
   620  	}
   621  }
   622  
   623  func TestContextImport_customProvider(t *testing.T) {
   624  	p := testProvider("aws")
   625  	ctx := testContext2(t, &ContextOpts{
   626  		Providers: map[string]ResourceProviderFactory{
   627  			"aws": testProviderFuncFixed(p),
   628  		},
   629  	})
   630  
   631  	p.ImportStateReturn = []*InstanceState{
   632  		&InstanceState{
   633  			ID:        "foo",
   634  			Ephemeral: EphemeralState{Type: "aws_instance"},
   635  		},
   636  	}
   637  
   638  	state, err := ctx.Import(&ImportOpts{
   639  		Targets: []*ImportTarget{
   640  			&ImportTarget{
   641  				Addr:     "aws_instance.foo",
   642  				ID:       "bar",
   643  				Provider: "aws.alias",
   644  			},
   645  		},
   646  	})
   647  	if err != nil {
   648  		t.Fatalf("err: %s", err)
   649  	}
   650  
   651  	actual := strings.TrimSpace(state.String())
   652  	expected := strings.TrimSpace(testImportCustomProviderStr)
   653  	if actual != expected {
   654  		t.Fatalf("bad: \n%s", actual)
   655  	}
   656  }
   657  
   658  const testImportStr = `
   659  aws_instance.foo:
   660    ID = foo
   661    provider = aws
   662  `
   663  
   664  const testImportCountIndexStr = `
   665  aws_instance.foo.0:
   666    ID = foo
   667    provider = aws
   668  `
   669  
   670  const testImportCollisionStr = `
   671  aws_instance.foo:
   672    ID = bar
   673  `
   674  
   675  const testImportModuleStr = `
   676  <no state>
   677  module.foo:
   678    aws_instance.foo:
   679      ID = foo
   680      provider = aws
   681  `
   682  
   683  const testImportModuleDepth2Str = `
   684  <no state>
   685  module.a.b:
   686    aws_instance.foo:
   687      ID = foo
   688      provider = aws
   689  `
   690  
   691  const testImportModuleDiffStr = `
   692  module.bar:
   693    aws_instance.bar:
   694      ID = bar
   695  module.foo:
   696    aws_instance.foo:
   697      ID = foo
   698      provider = aws
   699  `
   700  
   701  const testImportModuleExistingStr = `
   702  module.foo:
   703    aws_instance.bar:
   704      ID = bar
   705    aws_instance.foo:
   706      ID = foo
   707      provider = aws
   708  `
   709  
   710  const testImportMultiStr = `
   711  aws_instance.foo:
   712    ID = foo
   713    provider = aws
   714  aws_instance_thing.foo:
   715    ID = bar
   716    provider = aws
   717  `
   718  
   719  const testImportMultiSameStr = `
   720  aws_instance.foo:
   721    ID = foo
   722    provider = aws
   723  aws_instance_thing.foo:
   724    ID = bar
   725    provider = aws
   726  aws_instance_thing.foo-1:
   727    ID = qux
   728    provider = aws
   729  `
   730  
   731  const testImportRefreshStr = `
   732  aws_instance.foo:
   733    ID = foo
   734    provider = aws
   735    foo = bar
   736  `
   737  
   738  const testImportCustomProviderStr = `
   739  aws_instance.foo:
   740    ID = foo
   741    provider = aws.alias
   742  `