diff --git a/cli/src/main/java/dev/enola/cli/CommandWithModel.java b/cli/src/main/java/dev/enola/cli/CommandWithModel.java index 6c1abfaf1..c6a5b243f 100644 --- a/cli/src/main/java/dev/enola/cli/CommandWithModel.java +++ b/cli/src/main/java/dev/enola/cli/CommandWithModel.java @@ -19,10 +19,12 @@ import dev.enola.common.io.resource.ResourceProviders; import dev.enola.core.EnolaServiceProvider; +import dev.enola.core.grpc.EnolaGrpcClientProvider; import dev.enola.core.grpc.EnolaGrpcInProcess; import dev.enola.core.meta.EntityKindRepository; import dev.enola.core.proto.EnolaServiceGrpc.EnolaServiceBlockingStub; +import picocli.CommandLine.ArgGroup; import picocli.CommandLine.Model.CommandSpec; import picocli.CommandLine.Option; import picocli.CommandLine.Spec; @@ -36,11 +38,8 @@ public abstract class CommandWithModel implements CheckedRunnable { protected EnolaServiceProvider esp; @Spec CommandSpec spec; - @Option( - names = {"--model"}, - required = true, - description = "URI to EntityKinds (e.g. file:model.yaml)") - private URI model; + @ArgGroup(multiplicity = "1") + ModelOrServer group; private EnolaServiceBlockingStub service; @@ -48,12 +47,19 @@ public abstract class CommandWithModel implements CheckedRunnable { public final void run() throws Exception { out = spec.commandLine().getOut(); + // TODO Fix design; as-is, this may stay null if --server instead of --model is used + EntityKindRepository ekr = null; + // TODO Move elsewhere for continuous ("shell") mode, as this is "expensive". - var modelResource = new ResourceProviders().getReadableResource(model); - var ekr = new EntityKindRepository(); - ekr.load(modelResource); - esp = new EnolaServiceProvider(); - service = new EnolaGrpcInProcess(esp.get(ekr)).get(); + if (group.model != null) { + var modelResource = new ResourceProviders().getReadableResource(group.model); + ekr = new EntityKindRepository(); + ekr.load(modelResource); + esp = new EnolaServiceProvider(); + service = new EnolaGrpcInProcess(esp.get(ekr)).get(); + } else if (group.server != null) { + service = new EnolaGrpcClientProvider(group.server).get(); + } run(ekr, service); } @@ -62,4 +68,19 @@ public final void run() throws Exception { // here protected abstract void run(EntityKindRepository ekr, EnolaServiceBlockingStub service) throws Exception; + + static class ModelOrServer { + + @Option( + names = {"--model"}, + required = true, + description = "URI to EntityKinds (e.g. file:model.yaml)") + private URI model; + + @Option( + names = {"--server"}, + required = true, + description = "Target of an Enola gRPC Server (e.g. localhost:7070)") + private String server; + } } diff --git a/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcInProcess.java b/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcInProcess.java index 9fd3e238e..9b8eab7d7 100644 --- a/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcInProcess.java +++ b/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcInProcess.java @@ -17,8 +17,6 @@ */ package dev.enola.core.grpc; -import static java.util.concurrent.TimeUnit.SECONDS; - import dev.enola.core.EnolaService; import dev.enola.core.proto.EnolaServiceGrpc; @@ -49,7 +47,8 @@ public EnolaGrpcInProcess(EnolaService service) throws IOException { channelBuilder.directExecutor(); // as above channel = channelBuilder.build(); - client = EnolaServiceGrpc.newBlockingStub(channel).withDeadlineAfter(3, SECONDS); + // .withDeadlineAfter(13, SECONDS) doesn't seem to work will with InProcessChannelBuilder?! + client = EnolaServiceGrpc.newBlockingStub(channel); } public EnolaServiceGrpc.EnolaServiceBlockingStub get() { diff --git a/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcServer.java b/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcServer.java index b61305a12..bf704ca26 100644 --- a/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcServer.java +++ b/core/impl/src/main/java/dev/enola/core/grpc/EnolaGrpcServer.java @@ -22,6 +22,7 @@ import io.grpc.ServerBuilder; import java.io.IOException; +import java.util.concurrent.TimeUnit; public class EnolaGrpcServer implements AutoCloseable { @@ -46,7 +47,7 @@ public int getPort() { } @Override - public void close() throws Exception { - server.shutdown().awaitTermination(); + public void close() throws InterruptedException { + server.shutdown().awaitTermination(7, TimeUnit.SECONDS); } }