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 }