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

     1  package terraform
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/terraform/internal/addrs"
     7  	"github.com/hashicorp/terraform/internal/configs/configschema"
     8  	"github.com/hashicorp/terraform/internal/plans"
     9  	"github.com/hashicorp/terraform/internal/providers"
    10  	"github.com/hashicorp/terraform/internal/states"
    11  	"github.com/zclconf/go-cty/cty"
    12  )
    13  
    14  func TestNodePlanDeposedResourceInstanceObject_Execute(t *testing.T) {
    15  	deposedKey := states.NewDeposedKey()
    16  	state := states.NewState()
    17  	absResource := mustResourceInstanceAddr("test_instance.foo")
    18  	state.Module(addrs.RootModuleInstance).SetResourceInstanceDeposed(
    19  		absResource.Resource,
    20  		deposedKey,
    21  		&states.ResourceInstanceObjectSrc{
    22  			Status:    states.ObjectTainted,
    23  			AttrsJSON: []byte(`{"id":"bar"}`),
    24  		},
    25  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
    26  	)
    27  
    28  	p := testProvider("test")
    29  	p.ConfigureProvider(providers.ConfigureProviderRequest{})
    30  	p.UpgradeResourceStateResponse = &providers.UpgradeResourceStateResponse{
    31  		UpgradedState: cty.ObjectVal(map[string]cty.Value{
    32  			"id": cty.StringVal("bar"),
    33  		}),
    34  	}
    35  	ctx := &MockEvalContext{
    36  		StateState:        state.SyncWrapper(),
    37  		PrevRunStateState: state.DeepCopy().SyncWrapper(),
    38  		RefreshStateState: state.DeepCopy().SyncWrapper(),
    39  		ProviderProvider:  p,
    40  		ProviderSchemaSchema: &ProviderSchema{
    41  			ResourceTypes: map[string]*configschema.Block{
    42  				"test_instance": {
    43  					Attributes: map[string]*configschema.Attribute{
    44  						"id": {
    45  							Type:     cty.String,
    46  							Computed: true,
    47  						},
    48  					},
    49  				},
    50  			},
    51  		},
    52  		ChangesChanges: plans.NewChanges().SyncWrapper(),
    53  	}
    54  
    55  	node := NodePlanDeposedResourceInstanceObject{
    56  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
    57  			Addr: absResource,
    58  			NodeAbstractResource: NodeAbstractResource{
    59  				ResolvedProvider: mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
    60  			},
    61  		},
    62  		DeposedKey: deposedKey,
    63  	}
    64  	err := node.Execute(ctx, walkPlan)
    65  	if err != nil {
    66  		t.Fatalf("unexpected error: %s", err)
    67  	}
    68  
    69  	if !p.UpgradeResourceStateCalled {
    70  		t.Errorf("UpgradeResourceState wasn't called; should've been called to upgrade the previous run's object")
    71  	}
    72  	if !p.ReadResourceCalled {
    73  		t.Errorf("ReadResource wasn't called; should've been called to refresh the deposed object")
    74  	}
    75  
    76  	change := ctx.Changes().GetResourceInstanceChange(absResource, deposedKey)
    77  	if got, want := change.ChangeSrc.Action, plans.Delete; got != want {
    78  		t.Fatalf("wrong planned action\ngot:  %s\nwant: %s", got, want)
    79  	}
    80  }
    81  
    82  func TestNodeDestroyDeposedResourceInstanceObject_Execute(t *testing.T) {
    83  	deposedKey := states.NewDeposedKey()
    84  	state := states.NewState()
    85  	absResource := mustResourceInstanceAddr("test_instance.foo")
    86  	state.Module(addrs.RootModuleInstance).SetResourceInstanceDeposed(
    87  		absResource.Resource,
    88  		deposedKey,
    89  		&states.ResourceInstanceObjectSrc{
    90  			Status:    states.ObjectTainted,
    91  			AttrsJSON: []byte(`{"id":"bar"}`),
    92  		},
    93  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
    94  	)
    95  
    96  	schema := &ProviderSchema{
    97  		ResourceTypes: map[string]*configschema.Block{
    98  			"test_instance": {
    99  				Attributes: map[string]*configschema.Attribute{
   100  					"id": {
   101  						Type:     cty.String,
   102  						Computed: true,
   103  					},
   104  				},
   105  			},
   106  		},
   107  	}
   108  
   109  	p := testProvider("test")
   110  	p.ConfigureProvider(providers.ConfigureProviderRequest{})
   111  	p.GetProviderSchemaResponse = getProviderSchemaResponseFromProviderSchema(schema)
   112  
   113  	p.UpgradeResourceStateResponse = &providers.UpgradeResourceStateResponse{
   114  		UpgradedState: cty.ObjectVal(map[string]cty.Value{
   115  			"id": cty.StringVal("bar"),
   116  		}),
   117  	}
   118  	ctx := &MockEvalContext{
   119  		StateState:           state.SyncWrapper(),
   120  		ProviderProvider:     p,
   121  		ProviderSchemaSchema: schema,
   122  		ChangesChanges:       plans.NewChanges().SyncWrapper(),
   123  	}
   124  
   125  	node := NodeDestroyDeposedResourceInstanceObject{
   126  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
   127  			Addr: absResource,
   128  			NodeAbstractResource: NodeAbstractResource{
   129  				ResolvedProvider: mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
   130  			},
   131  		},
   132  		DeposedKey: deposedKey,
   133  	}
   134  	err := node.Execute(ctx, walkApply)
   135  
   136  	if err != nil {
   137  		t.Fatalf("unexpected error: %s", err)
   138  	}
   139  
   140  	if !state.Empty() {
   141  		t.Fatalf("resources left in state after destroy")
   142  	}
   143  }
   144  
   145  func TestNodeDestroyDeposedResourceInstanceObject_WriteResourceInstanceState(t *testing.T) {
   146  	state := states.NewState()
   147  	ctx := new(MockEvalContext)
   148  	ctx.StateState = state.SyncWrapper()
   149  	ctx.PathPath = addrs.RootModuleInstance
   150  	mockProvider := mockProviderWithResourceTypeSchema("aws_instance", &configschema.Block{
   151  		Attributes: map[string]*configschema.Attribute{
   152  			"id": {
   153  				Type:     cty.String,
   154  				Optional: true,
   155  			},
   156  		},
   157  	})
   158  	ctx.ProviderProvider = mockProvider
   159  	ctx.ProviderSchemaSchema = mockProvider.ProviderSchema()
   160  
   161  	obj := &states.ResourceInstanceObject{
   162  		Value: cty.ObjectVal(map[string]cty.Value{
   163  			"id": cty.StringVal("i-abc123"),
   164  		}),
   165  		Status: states.ObjectReady,
   166  	}
   167  	node := &NodeDestroyDeposedResourceInstanceObject{
   168  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
   169  			NodeAbstractResource: NodeAbstractResource{
   170  				ResolvedProvider: mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   171  			},
   172  			Addr: mustResourceInstanceAddr("aws_instance.foo"),
   173  		},
   174  		DeposedKey: states.NewDeposedKey(),
   175  	}
   176  	err := node.writeResourceInstanceState(ctx, obj)
   177  	if err != nil {
   178  		t.Fatalf("unexpected error: %s", err.Error())
   179  	}
   180  
   181  	checkStateString(t, state, `
   182  aws_instance.foo: (1 deposed)
   183    ID = <not created>
   184    provider = provider["registry.terraform.io/hashicorp/aws"]
   185    Deposed ID 1 = i-abc123
   186  	`)
   187  }
   188  
   189  func TestNodeDestroyDeposedResourceInstanceObject_ExecuteMissingState(t *testing.T) {
   190  	p := simpleMockProvider()
   191  	ctx := &MockEvalContext{
   192  		StateState:           states.NewState().SyncWrapper(),
   193  		ProviderProvider:     simpleMockProvider(),
   194  		ProviderSchemaSchema: p.ProviderSchema(),
   195  		ChangesChanges:       plans.NewChanges().SyncWrapper(),
   196  	}
   197  
   198  	node := NodeDestroyDeposedResourceInstanceObject{
   199  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
   200  			Addr: mustResourceInstanceAddr("test_object.foo"),
   201  			NodeAbstractResource: NodeAbstractResource{
   202  				ResolvedProvider: mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
   203  			},
   204  		},
   205  		DeposedKey: states.NewDeposedKey(),
   206  	}
   207  	err := node.Execute(ctx, walkApply)
   208  
   209  	if err == nil {
   210  		t.Fatal("expected error")
   211  	}
   212  }