summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-04-05 16:44:17 +0200
committerMartin Polden <mpolden@mpolden.no>2023-04-11 10:27:09 +0200
commit2e716d564ef8b8aff1a443f11759acb23a52641b (patch)
tree7a7e19a6e8b2d062a97a82aa9770bc11b0e278fa
parenta51e87a9b5c9931fdb1895d996661687166bb863 (diff)
Support reading documents from stdin
-rw-r--r--client/go/internal/cli/cmd/feed.go19
-rw-r--r--client/go/internal/cli/cmd/feed_test.go15
2 files changed, 27 insertions, 7 deletions
diff --git a/client/go/internal/cli/cmd/feed.go b/client/go/internal/cli/cmd/feed.go
index ff8b0bc0c0f..895a22d2be5 100644
--- a/client/go/internal/cli/cmd/feed.go
+++ b/client/go/internal/cli/cmd/feed.go
@@ -34,20 +34,29 @@ documents to a Vespa cluster efficiently.
The contents of FILE must be either a JSON array or JSON objects separated by
newline (JSONL).
+
+If FILE is a single dash ('-'), documents will be read from standard input.
`,
Example: `$ vespa feed documents.jsonl
+$ cat documents.jsonl | vespa feed -
`,
Args: cobra.ExactArgs(1),
DisableAutoGenTag: true,
SilenceUsage: true,
Hidden: true, // TODO(mpolden): Remove when ready for public use
RunE: func(cmd *cobra.Command, args []string) error {
- f, err := os.Open(args[0])
- if err != nil {
- return err
+ var r io.Reader
+ if args[0] == "-" {
+ r = cli.Stdin
+ } else {
+ f, err := os.Open(args[0])
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ r = f
}
- defer f.Close()
- return feed(f, cli, verbose, connections)
+ return feed(r, cli, verbose, connections)
},
}
addFeedFlags(cmd, &verbose, &connections)
diff --git a/client/go/internal/cli/cmd/feed_test.go b/client/go/internal/cli/cmd/feed_test.go
index 1bf1ef6ab9b..521d2b2abd0 100644
--- a/client/go/internal/cli/cmd/feed_test.go
+++ b/client/go/internal/cli/cmd/feed_test.go
@@ -1,6 +1,7 @@
package cmd
import (
+ "bytes"
"os"
"path/filepath"
"testing"
@@ -42,7 +43,7 @@ func TestFeed(t *testing.T) {
require.Nil(t, cli.Run("feed", jsonFile))
assert.Equal(t, "", stderr.String())
- assert.Equal(t, `{
+ want := `{
"feeder.seconds": 1.000,
"feeder.ok.count": 1,
"feeder.ok.rate": 1.000,
@@ -63,5 +64,15 @@ func TestFeed(t *testing.T) {
"200": 1
}
}
-`, stdout.String())
+`
+ assert.Equal(t, want, stdout.String())
+
+ stdout.Reset()
+ cli.Stdin = bytes.NewBuffer([]byte(`{
+ "put": "id:ns:type::doc1",
+ "fields": {"foo": "123"}
+}`))
+ httpClient.NextResponseString(200, `{"message":"OK"}`)
+ require.Nil(t, cli.Run("feed", "-"))
+ assert.Equal(t, want, stdout.String())
}