diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-05-27 15:09:37 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2021-05-27 15:19:04 +0200 |
commit | 8378dd0703460bb87ec5ad7a966ef830b8714a9d (patch) | |
tree | 37c0e636b5729b405571420d84f30375cc6153d6 /vespa-feed-client-cli | |
parent | f0fc648c00d666da46055c2e34c909914f6fdeb0 (diff) |
Add option for reading feed input from stdin
Diffstat (limited to 'vespa-feed-client-cli')
3 files changed, 25 insertions, 7 deletions
diff --git a/vespa-feed-client-cli/src/main/java/ai/vespa/feed/client/CliArguments.java b/vespa-feed-client-cli/src/main/java/ai/vespa/feed/client/CliArguments.java index 9c8e156b824..125a27737ef 100644 --- a/vespa-feed-client-cli/src/main/java/ai/vespa/feed/client/CliArguments.java +++ b/vespa-feed-client-cli/src/main/java/ai/vespa/feed/client/CliArguments.java @@ -48,6 +48,7 @@ class CliArguments { private static final String TIMEOUT_OPTION = "timeout"; private static final String TRACE_OPTION = "trace"; private static final String VERSION_OPTION = "version"; + private static final String STDIN_OPTION = "stdin"; private final CommandLine arguments; @@ -70,8 +71,8 @@ class CliArguments { if (!args.hasOption(ENDPOINT_OPTION)) { throw new CliArgumentsException("Endpoint must be specified"); } - if (!args.hasOption(FILE_OPTION)) { - throw new CliArgumentsException("Feed file must be specified"); + if (args.hasOption(FILE_OPTION) == args.hasOption(STDIN_OPTION)) { + throw new CliArgumentsException(String.format("Either option '%s' or '%s' must be specified", FILE_OPTION, STDIN_OPTION)); } if (args.hasOption(CERTIFICATE_OPTION) != args.hasOption(PRIVATE_KEY_OPTION)) { throw new CliArgumentsException( @@ -107,7 +108,9 @@ class CliArguments { Optional<Path> caCertificates() throws CliArgumentsException { return fileValue(CA_CERTIFICATES_OPTION); } - Path inputFile() throws CliArgumentsException { return fileValue(FILE_OPTION).get(); } + Optional<Path> inputFile() throws CliArgumentsException { + return fileValue(FILE_OPTION); + } Map<String, String> headers() throws CliArgumentsException { String[] rawArguments = arguments.getOptionValues(HEADER_OPTION); @@ -142,6 +145,8 @@ class CliArguments { : Optional.empty(); } + boolean readFeedFromStandardInput() { return has(STDIN_OPTION); } + private OptionalInt intValue(String option) throws CliArgumentsException { try { Number number = (Number) arguments.getParsedOptionValue(option); @@ -245,6 +250,9 @@ class CliArguments { .longOpt(TRACE_OPTION) .hasArg() .type(Number.class) + .build()) + .addOption(Option.builder() + .longOpt(STDIN_OPTION) .build()); } diff --git a/vespa-feed-client-cli/src/test/java/ai/vespa/feed/client/CliArgumentsTest.java b/vespa-feed-client-cli/src/test/java/ai/vespa/feed/client/CliArgumentsTest.java index f1233e4e0c7..14b69f20ad0 100644 --- a/vespa-feed-client-cli/src/test/java/ai/vespa/feed/client/CliArgumentsTest.java +++ b/vespa-feed-client-cli/src/test/java/ai/vespa/feed/client/CliArgumentsTest.java @@ -25,7 +25,7 @@ class CliArgumentsTest { "--header=\"My-Header: my-value\"", "--header", "Another-Header: another-value", "--benchmark", "--route=myroute", "--timeout=0.125", "--trace=9"}); assertEquals(URI.create("https://vespa.ai:4443/"), args.endpoint()); - assertEquals(Paths.get("feed.json"), args.inputFile()); + assertEquals(Paths.get("feed.json"), args.inputFile().get()); assertEquals(10, args.connections().getAsInt()); assertEquals(128, args.maxStreamsPerConnection().getAsInt()); assertEquals(Paths.get("cert.pem"), args.certificateAndKey().get().certificateFile); @@ -47,12 +47,21 @@ class CliArgumentsTest { void fails_on_missing_parameters() { CliArguments.CliArgumentsException exception = assertThrows( CliArguments.CliArgumentsException.class, - () -> CliArguments.fromRawArgs(new String[] {"--file=/path/to/file"})); + () -> CliArguments.fromRawArgs(new String[] {"--file=/path/to/file", "--stdin"})); assertEquals("Endpoint must be specified", exception.getMessage()); - exception = assertThrows( + } + + @Test + void fails_on_conflicting_parameters() { + CliArguments.CliArgumentsException exception = assertThrows( + CliArguments.CliArgumentsException.class, + () -> CliArguments.fromRawArgs(new String[] {"--endpoint=https://endpoint", "--file=/path/to/file", "--stdin"})); + assertEquals("Either option 'file' or 'stdin' must be specified", exception.getMessage()); + + exception = assertThrows( CliArguments.CliArgumentsException.class, () -> CliArguments.fromRawArgs(new String[] {"--endpoint=https://endpoint"})); - assertEquals("Feed file must be specified", exception.getMessage()); + assertEquals("Either option 'file' or 'stdin' must be specified", exception.getMessage()); } @Test diff --git a/vespa-feed-client-cli/src/test/resources/help.txt b/vespa-feed-client-cli/src/test/resources/help.txt index a52842b32fd..56441ee0728 100644 --- a/vespa-feed-client-cli/src/test/resources/help.txt +++ b/vespa-feed-client-cli/src/test/resources/help.txt @@ -12,6 +12,7 @@ Vespa feed client --max-streams-per-connection <arg> --private-key <arg> --route <arg> + --stdin --timeout <arg> --trace <arg> --version |