Skip to content

Commit ca4fa35

Browse files
committed
WIP
1 parent 5063605 commit ca4fa35

File tree

4 files changed

+68
-38
lines changed

4 files changed

+68
-38
lines changed

tfexec/cmd.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"strings"
1919

2020
"github.com/hashicorp/terraform-exec/internal/version"
21+
tfjson "github.com/hashicorp/terraform-json"
2122
)
2223

2324
const (
@@ -216,6 +217,41 @@ func (tf *Terraform) runTerraformCmdJSON(ctx context.Context, cmd *exec.Cmd, v i
216217
return dec.Decode(v)
217218
}
218219

220+
func (tf *Terraform) runTerraformCmdJSONLog(ctx context.Context, cmd *exec.Cmd) *LogMsgEmitter {
221+
pr, pw := io.Pipe()
222+
tf.SetStdout(pw)
223+
224+
go func() {
225+
_ = tf.runTerraformCmd(ctx, cmd)
226+
// TODO: handle error
227+
_ = pw.Close()
228+
// TODO: handle error
229+
}()
230+
231+
return newLogMsgEmitter(pr)
232+
}
233+
234+
func newLogMsgEmitter(stdout io.ReadCloser) *LogMsgEmitter {
235+
return &LogMsgEmitter{
236+
scanner: bufio.NewScanner(stdout),
237+
stdoutReaderCloser: stdout,
238+
}
239+
}
240+
241+
type LogMsgEmitter struct {
242+
scanner *bufio.Scanner
243+
stdoutReaderCloser io.Closer
244+
}
245+
246+
func (e *LogMsgEmitter) NextMessage() (tfjson.LogMsg, bool, error) {
247+
scanned := e.scanner.Scan()
248+
if !scanned {
249+
return nil, scanned, e.stdoutReaderCloser.Close()
250+
}
251+
msg, err := tfjson.UnmarshalLogMessage(e.scanner.Bytes())
252+
return msg, true, err
253+
}
254+
219255
// mergeUserAgent does some minor deduplication to ensure we aren't
220256
// just using the same append string over and over.
221257
func mergeUserAgent(uas ...string) string {

tfexec/internal/e2etest/query_test.go

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import (
88
"regexp"
99
"testing"
1010

11+
"github.com/google/go-cmp/cmp"
1112
"github.com/hashicorp/go-version"
1213
"github.com/hashicorp/terraform-exec/tfexec"
1314
"github.com/hashicorp/terraform-exec/tfexec/internal/testutil"
15+
tfjson "github.com/hashicorp/terraform-json"
1416
)
1517

1618
func TestQueryJSON_TF112(t *testing.T) {
@@ -45,14 +47,34 @@ func TestQueryJSON_TF114(t *testing.T) {
4547
t.Fatalf("error running Query: %s", err)
4648
}
4749

48-
_, err = le.NextMessage()
49-
if err != nil {
50-
t.Fatalf("error getting next message: %s", err)
50+
results := 0
51+
var completeData tfjson.ListCompleteData
52+
for {
53+
msg, ok, err := le.NextMessage()
54+
if !ok {
55+
break
56+
}
57+
if err != nil {
58+
t.Fatalf("error getting next message: %s", err)
59+
}
60+
switch m := msg.(type) {
61+
case tfjson.ListResourceFoundMessage:
62+
results++
63+
case tfjson.ListCompleteMessage:
64+
completeData = m.ListComplete
65+
}
5166
}
5267

53-
// results := strings.Count(output.String(), "list.concept_pet.pets: Result found")
54-
// if results != 5 {
55-
// t.Fatalf("expected 5 query results, but got %d", results)
56-
// }
68+
if results != 5 {
69+
t.Fatalf("expected 5 query results, but got %d", results)
70+
}
71+
expectedData := tfjson.ListCompleteData{
72+
Address: "list.concept_pet.pets",
73+
ResourceType: "concept_pet",
74+
Total: 5,
75+
}
76+
if diff := cmp.Diff(expectedData, completeData); diff != "" {
77+
t.Fatalf("unexpected complete message data: %s", diff)
78+
}
5779
})
5880
}

tfexec/internal/testutil/tfcache.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const (
3636
Latest_Alpha_v1_10 = "1.10.0-alpha20240926"
3737
Latest_v1_11 = "1.11.4"
3838
Latest_v1_12 = "1.12.2"
39-
Latest_Alpha_v1_14 = "1.14.0-alpha20250716"
39+
Latest_Alpha_v1_14 = "1.14.0-alpha20250827"
4040
)
4141

4242
const appendUserAgent = "tfexec-testutil"

tfexec/query.go

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
package tfexec
55

66
import (
7-
"bufio"
87
"context"
98
"fmt"
10-
"io"
119
"os/exec"
12-
13-
tfjson "github.com/hashicorp/terraform-json"
1410
)
1511

1612
type queryConfig struct {
@@ -66,36 +62,12 @@ func (tf *Terraform) QueryJSON(ctx context.Context, opts ...QueryOption) (*LogMs
6662
return nil, fmt.Errorf("terraform query -json was added in 1.14.0: %w", err)
6763
}
6864

69-
pr, pw := io.Pipe()
70-
defer pw.Close()
71-
defer pr.Close()
72-
tf.SetStdout(pw)
73-
74-
cmd, err := tf.queryJSONCmd(ctx, opts...)
65+
queryCmd, err := tf.queryJSONCmd(ctx, opts...)
7566
if err != nil {
7667
return nil, err
7768
}
7869

79-
err = tf.runTerraformCmd(ctx, cmd)
80-
if err != nil {
81-
return nil, err
82-
}
83-
84-
return &LogMsgEmitter{
85-
r: bufio.NewReader(pr),
86-
}, nil
87-
}
88-
89-
type LogMsgEmitter struct {
90-
r *bufio.Reader
91-
}
92-
93-
func (e *LogMsgEmitter) NextMessage() (tfjson.LogMsg, error) {
94-
rawMessage, err := e.r.ReadBytes('\n')
95-
if err != nil {
96-
return nil, err
97-
}
98-
return tfjson.UnmarshalLogMessage(rawMessage)
70+
return tf.runTerraformCmdJSONLog(ctx, queryCmd), nil
9971
}
10072

10173
func (tf *Terraform) queryJSONCmd(ctx context.Context, opts ...QueryOption) (*exec.Cmd, error) {

0 commit comments

Comments
 (0)