github.com/ns1/terraform@v0.7.10-0.20161109153551-8949419bef40/terraform/transform_provider_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/dag"
     8  )
     9  
    10  func TestProviderTransformer(t *testing.T) {
    11  	mod := testModule(t, "transform-provider-basic")
    12  
    13  	g := Graph{Path: RootModulePath}
    14  	{
    15  		tf := &ConfigTransformer{Module: mod}
    16  		if err := tf.Transform(&g); err != nil {
    17  			t.Fatalf("err: %s", err)
    18  		}
    19  	}
    20  
    21  	transform := &ProviderTransformer{}
    22  	if err := transform.Transform(&g); err != nil {
    23  		t.Fatalf("err: %s", err)
    24  	}
    25  
    26  	actual := strings.TrimSpace(g.String())
    27  	expected := strings.TrimSpace(testTransformProviderBasicStr)
    28  	if actual != expected {
    29  		t.Fatalf("bad:\n\n%s", actual)
    30  	}
    31  }
    32  
    33  func TestProviderTransformer_moduleChild(t *testing.T) {
    34  	g := Graph{Path: RootModulePath}
    35  
    36  	{
    37  		tf := &ImportStateTransformer{
    38  			Targets: []*ImportTarget{
    39  				&ImportTarget{
    40  					Addr: "module.moo.foo_instance.qux",
    41  					ID:   "bar",
    42  				},
    43  			},
    44  		}
    45  		if err := tf.Transform(&g); err != nil {
    46  			t.Fatalf("err: %s", err)
    47  		}
    48  	}
    49  
    50  	{
    51  		tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
    52  		if err := tf.Transform(&g); err != nil {
    53  			t.Fatalf("err: %s", err)
    54  		}
    55  	}
    56  
    57  	{
    58  		tf := &ProviderTransformer{}
    59  		if err := tf.Transform(&g); err != nil {
    60  			t.Fatalf("err: %s", err)
    61  		}
    62  	}
    63  
    64  	actual := strings.TrimSpace(g.String())
    65  	expected := strings.TrimSpace(testTransformProviderModuleChildStr)
    66  	if actual != expected {
    67  		t.Fatalf("bad:\n\n%s", actual)
    68  	}
    69  }
    70  
    71  func TestCloseProviderTransformer(t *testing.T) {
    72  	mod := testModule(t, "transform-provider-basic")
    73  
    74  	g := Graph{Path: RootModulePath}
    75  	{
    76  		tf := &ConfigTransformer{Module: mod}
    77  		if err := tf.Transform(&g); err != nil {
    78  			t.Fatalf("err: %s", err)
    79  		}
    80  	}
    81  
    82  	{
    83  		transform := &ProviderTransformer{}
    84  		if err := transform.Transform(&g); err != nil {
    85  			t.Fatalf("err: %s", err)
    86  		}
    87  	}
    88  
    89  	{
    90  		transform := &CloseProviderTransformer{}
    91  		if err := transform.Transform(&g); err != nil {
    92  			t.Fatalf("err: %s", err)
    93  		}
    94  	}
    95  
    96  	actual := strings.TrimSpace(g.String())
    97  	expected := strings.TrimSpace(testTransformCloseProviderBasicStr)
    98  	if actual != expected {
    99  		t.Fatalf("bad:\n\n%s", actual)
   100  	}
   101  }
   102  
   103  func TestCloseProviderTransformer_withTargets(t *testing.T) {
   104  	mod := testModule(t, "transform-provider-basic")
   105  
   106  	g := Graph{Path: RootModulePath}
   107  	transforms := []GraphTransformer{
   108  		&ConfigTransformer{Module: mod},
   109  		&ProviderTransformer{},
   110  		&CloseProviderTransformer{},
   111  		&TargetsTransformer{
   112  			Targets: []string{"something.else"},
   113  		},
   114  	}
   115  
   116  	for _, tr := range transforms {
   117  		if err := tr.Transform(&g); err != nil {
   118  			t.Fatalf("err: %s", err)
   119  		}
   120  	}
   121  
   122  	actual := strings.TrimSpace(g.String())
   123  	expected := strings.TrimSpace(`
   124  provider.aws
   125  provider.aws (close)
   126    provider.aws
   127  	`)
   128  	if actual != expected {
   129  		t.Fatalf("expected:%s\n\ngot:\n\n%s", expected, actual)
   130  	}
   131  }
   132  
   133  func TestMissingProviderTransformer(t *testing.T) {
   134  	mod := testModule(t, "transform-provider-missing")
   135  
   136  	g := Graph{Path: RootModulePath}
   137  	{
   138  		tf := &ConfigTransformer{Module: mod}
   139  		if err := tf.Transform(&g); err != nil {
   140  			t.Fatalf("err: %s", err)
   141  		}
   142  	}
   143  
   144  	{
   145  		transform := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
   146  		if err := transform.Transform(&g); err != nil {
   147  			t.Fatalf("err: %s", err)
   148  		}
   149  	}
   150  
   151  	{
   152  		transform := &CloseProviderTransformer{}
   153  		if err := transform.Transform(&g); err != nil {
   154  			t.Fatalf("err: %s", err)
   155  		}
   156  	}
   157  
   158  	actual := strings.TrimSpace(g.String())
   159  	expected := strings.TrimSpace(testTransformMissingProviderBasicStr)
   160  	if actual != expected {
   161  		t.Fatalf("bad:\n\n%s", actual)
   162  	}
   163  }
   164  
   165  func TestMissingProviderTransformer_moduleChild(t *testing.T) {
   166  	g := Graph{Path: RootModulePath}
   167  
   168  	// We use the import state transformer since at the time of writing
   169  	// this test it is the first and only transformer that will introduce
   170  	// multiple module-path nodes at a single go.
   171  	{
   172  		tf := &ImportStateTransformer{
   173  			Targets: []*ImportTarget{
   174  				&ImportTarget{
   175  					Addr: "module.moo.foo_instance.qux",
   176  					ID:   "bar",
   177  				},
   178  			},
   179  		}
   180  		if err := tf.Transform(&g); err != nil {
   181  			t.Fatalf("err: %s", err)
   182  		}
   183  	}
   184  
   185  	{
   186  		tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
   187  		if err := tf.Transform(&g); err != nil {
   188  			t.Fatalf("err: %s", err)
   189  		}
   190  	}
   191  
   192  	actual := strings.TrimSpace(g.String())
   193  	expected := strings.TrimSpace(testTransformMissingProviderModuleChildStr)
   194  	if actual != expected {
   195  		t.Fatalf("bad:\n\n%s", actual)
   196  	}
   197  }
   198  
   199  func TestMissingProviderTransformer_moduleGrandchild(t *testing.T) {
   200  	g := Graph{Path: RootModulePath}
   201  
   202  	// We use the import state transformer since at the time of writing
   203  	// this test it is the first and only transformer that will introduce
   204  	// multiple module-path nodes at a single go.
   205  	{
   206  		tf := &ImportStateTransformer{
   207  			Targets: []*ImportTarget{
   208  				&ImportTarget{
   209  					Addr: "module.a.module.b.foo_instance.qux",
   210  					ID:   "bar",
   211  				},
   212  			},
   213  		}
   214  		if err := tf.Transform(&g); err != nil {
   215  			t.Fatalf("err: %s", err)
   216  		}
   217  	}
   218  
   219  	{
   220  		tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
   221  		if err := tf.Transform(&g); err != nil {
   222  			t.Fatalf("err: %s", err)
   223  		}
   224  	}
   225  
   226  	actual := strings.TrimSpace(g.String())
   227  	expected := strings.TrimSpace(testTransformMissingProviderModuleGrandchildStr)
   228  	if actual != expected {
   229  		t.Fatalf("bad:\n\n%s", actual)
   230  	}
   231  }
   232  
   233  func TestParentProviderTransformer(t *testing.T) {
   234  	g := Graph{Path: RootModulePath}
   235  
   236  	// Introduce a cihld module
   237  	{
   238  		tf := &ImportStateTransformer{
   239  			Targets: []*ImportTarget{
   240  				&ImportTarget{
   241  					Addr: "module.moo.foo_instance.qux",
   242  					ID:   "bar",
   243  				},
   244  			},
   245  		}
   246  		if err := tf.Transform(&g); err != nil {
   247  			t.Fatalf("err: %s", err)
   248  		}
   249  	}
   250  
   251  	// Add the missing modules
   252  	{
   253  		tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
   254  		if err := tf.Transform(&g); err != nil {
   255  			t.Fatalf("err: %s", err)
   256  		}
   257  	}
   258  
   259  	// Connect parents
   260  	{
   261  		tf := &ParentProviderTransformer{}
   262  		if err := tf.Transform(&g); err != nil {
   263  			t.Fatalf("err: %s", err)
   264  		}
   265  	}
   266  
   267  	actual := strings.TrimSpace(g.String())
   268  	expected := strings.TrimSpace(testTransformParentProviderStr)
   269  	if actual != expected {
   270  		t.Fatalf("bad:\n\n%s", actual)
   271  	}
   272  }
   273  
   274  func TestParentProviderTransformer_moduleGrandchild(t *testing.T) {
   275  	g := Graph{Path: RootModulePath}
   276  
   277  	// We use the import state transformer since at the time of writing
   278  	// this test it is the first and only transformer that will introduce
   279  	// multiple module-path nodes at a single go.
   280  	{
   281  		tf := &ImportStateTransformer{
   282  			Targets: []*ImportTarget{
   283  				&ImportTarget{
   284  					Addr: "module.a.module.b.foo_instance.qux",
   285  					ID:   "bar",
   286  				},
   287  			},
   288  		}
   289  		if err := tf.Transform(&g); err != nil {
   290  			t.Fatalf("err: %s", err)
   291  		}
   292  	}
   293  
   294  	{
   295  		tf := &MissingProviderTransformer{Providers: []string{"foo", "bar"}}
   296  		if err := tf.Transform(&g); err != nil {
   297  			t.Fatalf("err: %s", err)
   298  		}
   299  	}
   300  
   301  	// Connect parents
   302  	{
   303  		tf := &ParentProviderTransformer{}
   304  		if err := tf.Transform(&g); err != nil {
   305  			t.Fatalf("err: %s", err)
   306  		}
   307  	}
   308  
   309  	actual := strings.TrimSpace(g.String())
   310  	expected := strings.TrimSpace(testTransformParentProviderModuleGrandchildStr)
   311  	if actual != expected {
   312  		t.Fatalf("bad:\n\n%s", actual)
   313  	}
   314  }
   315  
   316  func TestPruneProviderTransformer(t *testing.T) {
   317  	mod := testModule(t, "transform-provider-prune")
   318  
   319  	g := Graph{Path: RootModulePath}
   320  	{
   321  		tf := &ConfigTransformer{Module: mod}
   322  		if err := tf.Transform(&g); err != nil {
   323  			t.Fatalf("err: %s", err)
   324  		}
   325  	}
   326  
   327  	{
   328  		transform := &MissingProviderTransformer{Providers: []string{"foo"}}
   329  		if err := transform.Transform(&g); err != nil {
   330  			t.Fatalf("err: %s", err)
   331  		}
   332  	}
   333  
   334  	{
   335  		transform := &ProviderTransformer{}
   336  		if err := transform.Transform(&g); err != nil {
   337  			t.Fatalf("err: %s", err)
   338  		}
   339  	}
   340  
   341  	{
   342  		transform := &CloseProviderTransformer{}
   343  		if err := transform.Transform(&g); err != nil {
   344  			t.Fatalf("err: %s", err)
   345  		}
   346  	}
   347  
   348  	{
   349  		transform := &PruneProviderTransformer{}
   350  		if err := transform.Transform(&g); err != nil {
   351  			t.Fatalf("err: %s", err)
   352  		}
   353  	}
   354  
   355  	actual := strings.TrimSpace(g.String())
   356  	expected := strings.TrimSpace(testTransformPruneProviderBasicStr)
   357  	if actual != expected {
   358  		t.Fatalf("bad:\n\n%s", actual)
   359  	}
   360  }
   361  
   362  func TestDisableProviderTransformer(t *testing.T) {
   363  	mod := testModule(t, "transform-provider-disable")
   364  
   365  	g := Graph{Path: RootModulePath}
   366  	transforms := []GraphTransformer{
   367  		&ConfigTransformer{Module: mod},
   368  		&MissingProviderTransformer{Providers: []string{"aws"}},
   369  		&ProviderTransformer{},
   370  		&DisableProviderTransformerOld{},
   371  		&CloseProviderTransformer{},
   372  		&PruneProviderTransformer{},
   373  	}
   374  
   375  	for _, tr := range transforms {
   376  		if err := tr.Transform(&g); err != nil {
   377  			t.Fatalf("err: %s", err)
   378  		}
   379  	}
   380  
   381  	actual := strings.TrimSpace(g.String())
   382  	expected := strings.TrimSpace(testTransformDisableProviderBasicStr)
   383  	if actual != expected {
   384  		t.Fatalf("expected:\n%s\n\ngot:\n%s\n", expected, actual)
   385  	}
   386  }
   387  
   388  func TestDisableProviderTransformer_keep(t *testing.T) {
   389  	mod := testModule(t, "transform-provider-disable-keep")
   390  
   391  	g := Graph{Path: RootModulePath}
   392  	transforms := []GraphTransformer{
   393  		&ConfigTransformer{Module: mod},
   394  		&MissingProviderTransformer{Providers: []string{"aws"}},
   395  		&ProviderTransformer{},
   396  		&DisableProviderTransformerOld{},
   397  		&CloseProviderTransformer{},
   398  		&PruneProviderTransformer{},
   399  	}
   400  
   401  	for _, tr := range transforms {
   402  		if err := tr.Transform(&g); err != nil {
   403  			t.Fatalf("err: %s", err)
   404  		}
   405  	}
   406  
   407  	actual := strings.TrimSpace(g.String())
   408  	expected := strings.TrimSpace(testTransformDisableProviderKeepStr)
   409  	if actual != expected {
   410  		t.Fatalf("expected:\n%s\n\ngot:\n%s\n", expected, actual)
   411  	}
   412  }
   413  
   414  func TestGraphNodeProvider_impl(t *testing.T) {
   415  	var _ dag.Vertex = new(graphNodeProvider)
   416  	var _ dag.NamedVertex = new(graphNodeProvider)
   417  	var _ GraphNodeProvider = new(graphNodeProvider)
   418  }
   419  
   420  func TestGraphNodeProvider_ProviderName(t *testing.T) {
   421  	n := &graphNodeProvider{ProviderNameValue: "foo"}
   422  	if v := n.ProviderName(); v != "foo" {
   423  		t.Fatalf("bad: %#v", v)
   424  	}
   425  }
   426  
   427  const testTransformProviderBasicStr = `
   428  aws_instance.web
   429    provider.aws
   430  provider.aws
   431  `
   432  
   433  const testTransformCloseProviderBasicStr = `
   434  aws_instance.web
   435    provider.aws
   436  provider.aws
   437  provider.aws (close)
   438    aws_instance.web
   439    provider.aws
   440  `
   441  
   442  const testTransformMissingProviderBasicStr = `
   443  aws_instance.web
   444  foo_instance.web
   445  provider.aws
   446  provider.aws (close)
   447    aws_instance.web
   448    provider.aws
   449  provider.foo
   450  provider.foo (close)
   451    foo_instance.web
   452    provider.foo
   453  `
   454  
   455  const testTransformMissingProviderModuleChildStr = `
   456  module.moo.foo_instance.qux (import id: bar)
   457  module.moo.provider.foo
   458  provider.foo
   459  `
   460  
   461  const testTransformMissingProviderModuleGrandchildStr = `
   462  module.a.module.b.foo_instance.qux (import id: bar)
   463  module.a.module.b.provider.foo
   464  module.a.provider.foo
   465  provider.foo
   466  `
   467  
   468  const testTransformParentProviderStr = `
   469  module.moo.foo_instance.qux (import id: bar)
   470  module.moo.provider.foo
   471    provider.foo
   472  provider.foo
   473  `
   474  
   475  const testTransformParentProviderModuleGrandchildStr = `
   476  module.a.module.b.foo_instance.qux (import id: bar)
   477  module.a.module.b.provider.foo
   478    module.a.provider.foo
   479  module.a.provider.foo
   480    provider.foo
   481  provider.foo
   482  `
   483  
   484  const testTransformProviderModuleChildStr = `
   485  module.moo.foo_instance.qux (import id: bar)
   486    module.moo.provider.foo
   487  module.moo.provider.foo
   488  provider.foo
   489  `
   490  
   491  const testTransformPruneProviderBasicStr = `
   492  foo_instance.web
   493    provider.foo
   494  provider.foo
   495  provider.foo (close)
   496    foo_instance.web
   497    provider.foo
   498  `
   499  
   500  const testTransformDisableProviderBasicStr = `
   501  module.child
   502    provider.aws (disabled)
   503    var.foo
   504  provider.aws (close)
   505    module.child
   506    provider.aws (disabled)
   507  provider.aws (disabled)
   508  var.foo
   509  `
   510  
   511  const testTransformDisableProviderKeepStr = `
   512  aws_instance.foo
   513    provider.aws
   514  module.child
   515    provider.aws
   516    var.foo
   517  provider.aws
   518  provider.aws (close)
   519    aws_instance.foo
   520    module.child
   521    provider.aws
   522  var.foo
   523  `