feat(stovepipe): add new Ping-only service scaffold#154
Merged
Conversation
Adds a third service alongside gateway and orchestrator with proto, controller, server binary, example client, docker-compose, and an integration test. Only the Ping RPC is implemented; the wiring is in place so future RPCs can be added without rebuilding the skeleton. Stovepipe is stateless (no MySQL, no queue) and listens on :8083 by default. Makefile targets (build, proto, integration-test, local-start, local-stop, run-client) mirror the gateway/orchestrator pairs.
mnoah1
approved these changes
May 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a new
stovepipeservice alongsidegatewayandorchestrator, scaffolded end-to-end:stovepipe/proto/stovepipe.proto—SubmitQueueStovepipe.PingRPC + protopb BUILDstovepipe/controller/ping.go(+ 5 unit tests) — logger + tally metrics +service_name: "stovepipe"example/server/stovepipe/— gRPC server binary on:8083(:8080in container), graceful shutdown on SIGINT/SIGTERM, gRPC reflectionexample/server/stovepipe/{Dockerfile,docker-compose.yml}— single-container compose stack (no MySQL)example/client/stovepipe/—arh-style ping client mirroring the gateway/orchestrator clientstest/integration/stovepipe/— Docker-based gRPC integration testMakefile—build-stovepipe-linux,integration-test-stovepipe,local-stovepipe-{start,stop},run-client-stovepipe, plus stovepipe entries inproto,clean-proto, andbuild-all-linuxBUILD.bazel—gazelle:resolvedirective to disambiguate thestovepipe/protopbimport pathWhy
Lands the wiring now so future RPCs can be added without re-doing the proto/build/docker/test plumbing. Diverges from the gateway/orchestrator boilerplate in one place: stovepipe is stateless — no MySQL or queue — because Ping doesn't need them and carrying the boilerplate would be dead weight. The shape of
main.gostill matches gateway closely, so growing in DB/queue dependencies later is a small delta.Test Plan
Local verification on this branch:
make proto && make gazelle— clean, no further changes after directivemake lint— passes (fmt + license headers)make check-tidy—go.mod/MODULE.bazelcleanmake check-gazelle— BUILD files in syncbazel test //stovepipe/controller:controller_test— 5/5 ping unit tests passbazel build //stovepipe/... //example/server/stovepipe //example/client/stovepipe //test/integration/stovepipe:stovepipe_test— all targets buildmake integration-test-stovepipe— Docker build + gRPC Ping round-trip passes (~40s); server log confirmsservice_name: "stovepipe"responseManual smoke (optional):
Out of scope
test/e2e/— that suite tests the gateway→orchestrator SubmitQueue flow, which stovepipe isn't part of.PingControlleris the only controller.