Skip to content

Commit 77a01c6

Browse files
committed
fix: Allow remote state to be used with Terraform
The Terraform Provisioner depended on the statefile content being at a specific path, which disallowed the use of external state providers. This fixes it!
1 parent b948f2d commit 77a01c6

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

provisioner/terraform/provision.go

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,6 @@ func (t *terraform) Provision(stream proto.DRPCProvisioner_ProvisionStream) erro
5353
}
5454
}()
5555
start := request.GetStart()
56-
statefilePath := filepath.Join(start.Directory, "terraform.tfstate")
57-
if len(start.State) > 0 {
58-
err := os.WriteFile(statefilePath, start.State, 0600)
59-
if err != nil {
60-
return xerrors.Errorf("write statefile %q: %w", statefilePath, err)
61-
}
62-
}
6356

6457
terraform, err := tfexec.NewTerraform(start.Directory, t.binaryPath)
6558
if err != nil {
@@ -244,14 +237,18 @@ func (t *terraform) Provision(stream proto.DRPCProvisioner_ProvisionStream) erro
244237
errorMessage := err.Error()
245238
// Terraform can fail and apply and still need to store it's state.
246239
// In this case, we return Complete with an explicit error message.
247-
statefileContent, err := os.ReadFile(statefilePath)
240+
state, err := terraform.Show(stream.Context())
241+
if err != nil {
242+
return xerrors.Errorf("show state: %w", err)
243+
}
244+
stateData, err := json.Marshal(state)
248245
if err != nil {
249-
return xerrors.Errorf("read file %q: %w", statefilePath, err)
246+
return xerrors.Errorf("marshal state: %w", err)
250247
}
251248
return stream.Send(&proto.Provision_Response{
252249
Type: &proto.Provision_Response_Complete{
253250
Complete: &proto.Provision_Complete{
254-
State: statefileContent,
251+
State: stateData,
255252
Error: errorMessage,
256253
},
257254
},
@@ -264,7 +261,7 @@ func (t *terraform) Provision(stream proto.DRPCProvisioner_ProvisionStream) erro
264261
if start.DryRun {
265262
resp, err = parseTerraformPlan(stream.Context(), terraform, planfilePath)
266263
} else {
267-
resp, err = parseTerraformApply(stream.Context(), terraform, statefilePath)
264+
resp, err = parseTerraformApply(stream.Context(), terraform)
268265
}
269266
if err != nil {
270267
return err
@@ -358,14 +355,10 @@ func parseTerraformPlan(ctx context.Context, terraform *tfexec.Terraform, planfi
358355
}, nil
359356
}
360357

361-
func parseTerraformApply(ctx context.Context, terraform *tfexec.Terraform, statefilePath string) (*proto.Provision_Response, error) {
362-
statefileContent, err := os.ReadFile(statefilePath)
358+
func parseTerraformApply(ctx context.Context, terraform *tfexec.Terraform) (*proto.Provision_Response, error) {
359+
state, err := terraform.Show(ctx)
363360
if err != nil {
364-
return nil, xerrors.Errorf("read file %q: %w", statefilePath, err)
365-
}
366-
state, err := terraform.ShowStateFile(ctx, statefilePath)
367-
if err != nil {
368-
return nil, xerrors.Errorf("show state file %q: %w", statefilePath, err)
361+
return nil, xerrors.Errorf("show state file: %w", err)
369362
}
370363
resources := make([]*proto.Resource, 0)
371364
if state.Values != nil {
@@ -498,6 +491,11 @@ func parseTerraformApply(ctx context.Context, terraform *tfexec.Terraform, state
498491
}
499492
}
500493

494+
statefileContent, err := json.Marshal(state)
495+
if err != nil {
496+
return nil, xerrors.Errorf("marshal state: %w", err)
497+
}
498+
501499
return &proto.Provision_Response{
502500
Type: &proto.Provision_Response_Complete{
503501
Complete: &proto.Provision_Complete{

provisioner/terraform/provision_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,13 @@ provider "coder" {
9191
"main.tf": `variable "A" {
9292
}`,
9393
},
94-
Error: true,
94+
Response: &proto.Provision_Response{
95+
Type: &proto.Provision_Response_Complete{
96+
Complete: &proto.Provision_Complete{
97+
Error: "exit status 1",
98+
},
99+
},
100+
},
95101
}, {
96102
Name: "single-resource",
97103
Files: map[string]string{
@@ -497,6 +503,8 @@ provider "coder" {
497503
resourcesWant, err := json.Marshal(testCase.Response.GetComplete().Resources)
498504
require.NoError(t, err)
499505

506+
require.Equal(t, testCase.Response.GetComplete().Error, msg.GetComplete().Error)
507+
500508
require.Equal(t, string(resourcesWant), string(resourcesGot))
501509
break
502510
}

0 commit comments

Comments
 (0)