github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/terraform/transform_orphan_count_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/internal/addrs"
     8  	"github.com/hashicorp/terraform/internal/states"
     9  )
    10  
    11  func TestOrphanResourceCountTransformer(t *testing.T) {
    12  	state := states.NewState()
    13  	root := state.RootModule()
    14  	root.SetResourceInstanceCurrent(
    15  		mustResourceInstanceAddr("aws_instance.web").Resource,
    16  		&states.ResourceInstanceObjectSrc{
    17  			Status:    states.ObjectReady,
    18  			AttrsJSON: []byte(`{"id":"foo"}`),
    19  		},
    20  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    21  	)
    22  	root.SetResourceInstanceCurrent(
    23  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
    24  		&states.ResourceInstanceObjectSrc{
    25  			Status:    states.ObjectReady,
    26  			AttrsJSON: []byte(`{"id":"foo"}`),
    27  		},
    28  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    29  	)
    30  	root.SetResourceInstanceCurrent(
    31  		mustResourceInstanceAddr("aws_instance.foo[2]").Resource,
    32  		&states.ResourceInstanceObjectSrc{
    33  			Status:    states.ObjectReady,
    34  			AttrsJSON: []byte(`{"id":"foo"}`),
    35  		},
    36  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    37  	)
    38  
    39  	g := Graph{Path: addrs.RootModuleInstance}
    40  
    41  	{
    42  		tf := &OrphanResourceInstanceCountTransformer{
    43  			Concrete: testOrphanResourceConcreteFunc,
    44  			Addr: addrs.RootModuleInstance.Resource(
    45  				addrs.ManagedResourceMode, "aws_instance", "foo",
    46  			),
    47  			InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")},
    48  			State:         state,
    49  		}
    50  		if err := tf.Transform(&g); err != nil {
    51  			t.Fatalf("err: %s", err)
    52  		}
    53  	}
    54  
    55  	actual := strings.TrimSpace(g.String())
    56  	expected := strings.TrimSpace(testTransformOrphanResourceCountBasicStr)
    57  	if actual != expected {
    58  		t.Fatalf("bad:\n\n%s", actual)
    59  	}
    60  }
    61  
    62  func TestOrphanResourceCountTransformer_zero(t *testing.T) {
    63  	state := states.NewState()
    64  	root := state.RootModule()
    65  	root.SetResourceInstanceCurrent(
    66  		mustResourceInstanceAddr("aws_instance.web").Resource,
    67  		&states.ResourceInstanceObjectSrc{
    68  			Status:    states.ObjectReady,
    69  			AttrsJSON: []byte(`{"id":"foo"}`),
    70  		},
    71  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    72  	)
    73  	root.SetResourceInstanceCurrent(
    74  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
    75  		&states.ResourceInstanceObjectSrc{
    76  			Status:    states.ObjectReady,
    77  			AttrsJSON: []byte(`{"id":"foo"}`),
    78  		},
    79  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    80  	)
    81  	root.SetResourceInstanceCurrent(
    82  		mustResourceInstanceAddr("aws_instance.foo[2]").Resource,
    83  		&states.ResourceInstanceObjectSrc{
    84  			Status:    states.ObjectReady,
    85  			AttrsJSON: []byte(`{"id":"foo"}`),
    86  		},
    87  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    88  	)
    89  
    90  	g := Graph{Path: addrs.RootModuleInstance}
    91  
    92  	{
    93  		tf := &OrphanResourceInstanceCountTransformer{
    94  			Concrete: testOrphanResourceConcreteFunc,
    95  			Addr: addrs.RootModuleInstance.Resource(
    96  				addrs.ManagedResourceMode, "aws_instance", "foo",
    97  			),
    98  			InstanceAddrs: []addrs.AbsResourceInstance{},
    99  			State:         state,
   100  		}
   101  		if err := tf.Transform(&g); err != nil {
   102  			t.Fatalf("err: %s", err)
   103  		}
   104  	}
   105  
   106  	actual := strings.TrimSpace(g.String())
   107  	expected := strings.TrimSpace(testTransformOrphanResourceCountZeroStr)
   108  	if actual != expected {
   109  		t.Fatalf("bad:\n\n%s", actual)
   110  	}
   111  }
   112  
   113  func TestOrphanResourceCountTransformer_oneIndex(t *testing.T) {
   114  	state := states.NewState()
   115  	root := state.RootModule()
   116  	root.SetResourceInstanceCurrent(
   117  		mustResourceInstanceAddr("aws_instance.web").Resource,
   118  		&states.ResourceInstanceObjectSrc{
   119  			Status:    states.ObjectReady,
   120  			AttrsJSON: []byte(`{"id":"foo"}`),
   121  		},
   122  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   123  	)
   124  	root.SetResourceInstanceCurrent(
   125  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
   126  		&states.ResourceInstanceObjectSrc{
   127  			Status:    states.ObjectReady,
   128  			AttrsJSON: []byte(`{"id":"foo"}`),
   129  		},
   130  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   131  	)
   132  	root.SetResourceInstanceCurrent(
   133  		mustResourceInstanceAddr("aws_instance.foo[1]").Resource,
   134  		&states.ResourceInstanceObjectSrc{
   135  			Status:    states.ObjectReady,
   136  			AttrsJSON: []byte(`{"id":"foo"}`),
   137  		},
   138  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   139  	)
   140  
   141  	g := Graph{Path: addrs.RootModuleInstance}
   142  
   143  	{
   144  		tf := &OrphanResourceInstanceCountTransformer{
   145  			Concrete: testOrphanResourceConcreteFunc,
   146  			Addr: addrs.RootModuleInstance.Resource(
   147  				addrs.ManagedResourceMode, "aws_instance", "foo",
   148  			),
   149  			InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")},
   150  			State:         state,
   151  		}
   152  		if err := tf.Transform(&g); err != nil {
   153  			t.Fatalf("err: %s", err)
   154  		}
   155  	}
   156  
   157  	actual := strings.TrimSpace(g.String())
   158  	expected := strings.TrimSpace(testTransformOrphanResourceCountOneIndexStr)
   159  	if actual != expected {
   160  		t.Fatalf("bad:\n\n%s", actual)
   161  	}
   162  }
   163  
   164  func TestOrphanResourceCountTransformer_deposed(t *testing.T) {
   165  	state := states.NewState()
   166  	root := state.RootModule()
   167  	root.SetResourceInstanceCurrent(
   168  		mustResourceInstanceAddr("aws_instance.web").Resource,
   169  		&states.ResourceInstanceObjectSrc{
   170  			Status:    states.ObjectReady,
   171  			AttrsJSON: []byte(`{"id":"foo"}`),
   172  		},
   173  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   174  	)
   175  	root.SetResourceInstanceCurrent(
   176  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
   177  		&states.ResourceInstanceObjectSrc{
   178  			Status:    states.ObjectReady,
   179  			AttrsJSON: []byte(`{"id":"foo"}`),
   180  		},
   181  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   182  	)
   183  	root.SetResourceInstanceCurrent(
   184  		mustResourceInstanceAddr("aws_instance.foo[1]").Resource,
   185  		&states.ResourceInstanceObjectSrc{
   186  			Status:    states.ObjectReady,
   187  			AttrsJSON: []byte(`{"id":"foo"}`),
   188  		},
   189  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   190  	)
   191  	root.SetResourceInstanceDeposed(
   192  		mustResourceInstanceAddr("aws_instance.foo[2]").Resource,
   193  		states.NewDeposedKey(),
   194  		&states.ResourceInstanceObjectSrc{
   195  			Status:    states.ObjectReady,
   196  			AttrsJSON: []byte(`{"id":"foo"}`),
   197  		},
   198  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   199  	)
   200  
   201  	g := Graph{Path: addrs.RootModuleInstance}
   202  
   203  	{
   204  		tf := &OrphanResourceInstanceCountTransformer{
   205  			Concrete: testOrphanResourceConcreteFunc,
   206  			Addr: addrs.RootModuleInstance.Resource(
   207  				addrs.ManagedResourceMode, "aws_instance", "foo",
   208  			),
   209  			InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")},
   210  			State:         state,
   211  		}
   212  		if err := tf.Transform(&g); err != nil {
   213  			t.Fatalf("err: %s", err)
   214  		}
   215  	}
   216  
   217  	actual := strings.TrimSpace(g.String())
   218  	expected := strings.TrimSpace(testTransformOrphanResourceCountDeposedStr)
   219  	if actual != expected {
   220  		t.Fatalf("bad:\n\n%s", actual)
   221  	}
   222  }
   223  
   224  // When converting from a NoEach mode to an EachMap via a switch to for_each,
   225  // an edge is necessary to ensure that the map-key'd instances
   226  // are evaluated after the NoKey resource, because the final instance evaluated
   227  // sets the whole resource's EachMode.
   228  func TestOrphanResourceCountTransformer_ForEachEdgesAdded(t *testing.T) {
   229  	state := states.BuildState(func(s *states.SyncState) {
   230  		// "bar" key'd resource
   231  		s.SetResourceInstanceCurrent(
   232  			addrs.Resource{
   233  				Mode: addrs.ManagedResourceMode,
   234  				Type: "aws_instance",
   235  				Name: "foo",
   236  			}.Instance(addrs.StringKey("bar")).Absolute(addrs.RootModuleInstance),
   237  			&states.ResourceInstanceObjectSrc{
   238  				AttrsFlat: map[string]string{
   239  					"id": "foo",
   240  				},
   241  				Status: states.ObjectReady,
   242  			},
   243  			mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   244  		)
   245  
   246  		// NoKey'd resource
   247  		s.SetResourceInstanceCurrent(
   248  			addrs.Resource{
   249  				Mode: addrs.ManagedResourceMode,
   250  				Type: "aws_instance",
   251  				Name: "foo",
   252  			}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
   253  			&states.ResourceInstanceObjectSrc{
   254  				AttrsFlat: map[string]string{
   255  					"id": "foo",
   256  				},
   257  				Status: states.ObjectReady,
   258  			},
   259  			mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   260  		)
   261  	})
   262  
   263  	g := Graph{Path: addrs.RootModuleInstance}
   264  
   265  	{
   266  		tf := &OrphanResourceInstanceCountTransformer{
   267  			Concrete: testOrphanResourceConcreteFunc,
   268  			Addr: addrs.RootModuleInstance.Resource(
   269  				addrs.ManagedResourceMode, "aws_instance", "foo",
   270  			),
   271  			InstanceAddrs: []addrs.AbsResourceInstance{},
   272  			State:         state,
   273  		}
   274  		if err := tf.Transform(&g); err != nil {
   275  			t.Fatalf("err: %s", err)
   276  		}
   277  	}
   278  
   279  	actual := strings.TrimSpace(g.String())
   280  	expected := strings.TrimSpace(testTransformOrphanResourceForEachStr)
   281  	if actual != expected {
   282  		t.Fatalf("bad:\n\n%s", actual)
   283  	}
   284  }
   285  
   286  const testTransformOrphanResourceCountBasicStr = `
   287  aws_instance.foo[2] (orphan)
   288  `
   289  
   290  const testTransformOrphanResourceCountZeroStr = `
   291  aws_instance.foo[0] (orphan)
   292  aws_instance.foo[2] (orphan)
   293  `
   294  
   295  const testTransformOrphanResourceCountOneIndexStr = `
   296  aws_instance.foo[1] (orphan)
   297  `
   298  
   299  const testTransformOrphanResourceCountDeposedStr = `
   300  aws_instance.foo[1] (orphan)
   301  `
   302  
   303  const testTransformOrphanResourceForEachStr = `
   304  aws_instance.foo (orphan)
   305  aws_instance.foo["bar"] (orphan)
   306  `