Skip to content

Commit b7646fb

Browse files
authored
Running saturn locally (#920)
1 parent 462d2d4 commit b7646fb

File tree

20 files changed

+1432
-62
lines changed

20 files changed

+1432
-62
lines changed

saturn/.gitignore

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,18 @@
1919

2020
# Go workspace file
2121
go.work
22+
23+
# Development environment
24+
development/secrets/
25+
development/runs/
26+
27+
# Generated config files in development (templates are tracked)
28+
development/configs/*.json
29+
!development/configs/*.template.json
30+
31+
# Keep test-data structure but ignore contents
32+
development/test-data/*
33+
!development/test-data/.gitkeep
34+
35+
# Secret files for local dev (TODO: eliminate local secret storage)
36+
*secret.*

saturn/Dockerfile

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@ RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o /saturn -ldflags="-s -w" .
1313
# Link intermediate container for python
1414
FROM python:3.12-slim-bookworm as python
1515

16-
FROM openjdk:21-jdk-slim-bookworm
17-
18-
# Setup
19-
RUN echo "deb http://deb.debian.org/debian unstable main" >> /etc/apt/sources.list && \
20-
apt-get update
21-
22-
# Install JDK8. The base image provides JDK21, but we still need JDK8 to
23-
# run matches with java8
24-
RUN apt-get install -y -t unstable openjdk-8-jdk
16+
FROM eclipse-temurin:21-jdk
17+
18+
# Setup - Install JDK8 (base image provides JDK21)
19+
# Add Ubuntu universe repository for openjdk-8
20+
RUN apt-get update && \
21+
apt-get install -y software-properties-common && \
22+
add-apt-repository ppa:openjdk-r/ppa -y && \
23+
apt-get update && \
24+
apt-get install -y openjdk-8-jdk && \
25+
apt-get clean && \
26+
rm -rf /var/lib/apt/lists/*
2527

2628
# Copy Python executable, libraries, standard library, site-packages, include files, binary files, and Python path
2729
COPY --from=python /usr/local/bin/python3.12 /usr/local/bin/python3.12

saturn/Makefile

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
.PHONY: dev-fetch-secret dev-build dev-compile dev-execute dev-shell dev-shell-saturn dev-clean help
2+
.PHONY: dev-docker-up dev-docker-down dev-docker-logs dev-docker-rebuild dev-pubsub-interactive
3+
.PHONY: dev-list-runs dev-clean-runs dev-view-run
4+
5+
help: ## Show this help message
6+
@echo 'Usage: make [target]'
7+
@echo ''
8+
@echo 'Quick Start:'
9+
@echo ' make dev-fetch-secret # Fetch secrets from GCP'
10+
@echo ' make dev-build # Build Docker images'
11+
@echo ' make dev-docker-up # Start all services (creates new run)'
12+
@echo ' make dev-compile # Test compilation'
13+
@echo ' make dev-execute # Test execution'
14+
@echo ' make dev-pubsub-interactive # Interactive Pub/Sub client'
15+
@echo ''
16+
@echo 'Run Management:'
17+
@echo ' make dev-list-runs # List all test runs'
18+
@echo ' make dev-docker-logs # View logs for current run'
19+
@echo ' make dev-view-run RUN_ID=X # View logs for specific run'
20+
@echo ' make dev-clean-runs # Clean old runs (keeps 5)'
21+
@echo ''
22+
@echo 'All available targets:'
23+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-27s\033[0m %s\n", $$1, $$2}'
24+
25+
dev-fetch-secret: ## Fetch secrets from Google Cloud Secret Manager
26+
@# TODO: Eliminate storing secret locally
27+
@echo "Fetching secret from GCP Secret Manager..."
28+
@# Check if gcloud is installed
29+
@if ! command -v gcloud >/dev/null 2>&1; then \
30+
echo "Error: gcloud CLI is not installed"; \
31+
echo "Install from: https://cloud.google.com/sdk/docs/install"; \
32+
exit 1; \
33+
fi
34+
@# Check if authenticated
35+
@if ! gcloud auth list --filter=status:ACTIVE --format="value(account)" >/dev/null 2>&1; then \
36+
echo "Error: Not authenticated with gcloud"; \
37+
echo "Run: gcloud auth login"; \
38+
exit 1; \
39+
fi
40+
@mkdir -p development/secrets
41+
@gcloud secrets versions access latest \
42+
--secret="production-saturn" \
43+
--project="mitbattlecode" \
44+
> development/secrets/secret.json
45+
@echo "✓ Secret saved to development/secrets/secret.json"
46+
47+
dev-build: ## Build all Docker images
48+
@echo "Building Docker images..."
49+
@cd development && docker-compose build
50+
@echo "✓ Docker images built"
51+
52+
dev-compile: ## Send a compile message
53+
@# Check if a run is active
54+
@if [ ! -f development/runs/latest ]; then \
55+
echo "Error: No active run found. Start services with 'make dev-docker-up' first."; \
56+
exit 1; \
57+
fi
58+
@# Generate request ID
59+
$(eval RUN_ID := $(shell cat development/runs/latest))
60+
$(eval REQUEST_ID := $(shell date +%Y%m%d_%H%M%S))
61+
@# Create request directory structure
62+
@mkdir -p development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)
63+
@echo "Creating compile request: compile_$(REQUEST_ID)"
64+
@# Generate config from template
65+
@sed \
66+
-e 's|{{REPORT_PATH}}|/development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/report.txt|g' \
67+
-e 's|{{BINARY_PATH}}|/development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/binary.zip|g' \
68+
development/configs/compile.template.json \
69+
> development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json
70+
@echo "✓ Config generated: development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json"
71+
@# Send compile message with generated config
72+
@docker exec saturn-pubsub-dev ./pubsubclient publish-json testing-saturn /development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json
73+
@echo "✓ Compile message sent"
74+
@echo "✓ Request ID: compile_$(REQUEST_ID)"
75+
@echo "✓ Output directory: development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/"
76+
77+
dev-execute: ## Send an execute message
78+
@# Check if a run is active
79+
@if [ ! -f development/runs/latest ]; then \
80+
echo "Error: No active run found. Start services with 'make dev-docker-up' first."; \
81+
exit 1; \
82+
fi
83+
@# Generate request ID
84+
$(eval RUN_ID := $(shell cat development/runs/latest))
85+
$(eval REQUEST_ID := $(shell date +%Y%m%d_%H%M%S))
86+
@# Create request directory structure
87+
@mkdir -p development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)
88+
@echo "Creating execute request: execute_$(REQUEST_ID)"
89+
@# Generate config from template
90+
@sed \
91+
-e 's|{{REPORT_PATH}}|/development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/report.txt|g' \
92+
-e 's|{{REPLAY_PATH}}|/development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/replay.bc25java|g' \
93+
development/configs/execute.template.json \
94+
> development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json
95+
@echo "✓ Config generated: development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json"
96+
@# Send execute message with generated config
97+
@docker exec saturn-pubsub-dev ./pubsubclient publish-json testing-saturn /development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json
98+
@echo "✓ Execute message sent"
99+
@echo "✓ Request ID: execute_$(REQUEST_ID)"
100+
@echo "✓ Output directory: development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/"
101+
102+
dev-shell-pubsub: ## Open shell in Pub/Sub container
103+
@docker exec -it saturn-pubsub-dev bash
104+
105+
dev-pubsub-interactive: ## Open interactive Pub/Sub client with rlwrap
106+
@echo "Starting interactive Pub/Sub client..."
107+
@echo "Available commands will be shown below."
108+
@echo "Use Ctrl+D or Ctrl+C to exit."
109+
@echo ""
110+
@docker exec -it saturn-pubsub-dev rlwrap bash -c '\
111+
./pubsubclient; \
112+
echo ""; \
113+
echo "Interactive mode - enter commands:"; \
114+
while true; do \
115+
read -e -p "$$ " cmd || break; \
116+
eval "$$cmd"; \
117+
done'
118+
119+
dev-shell-saturn: ## Open shell in Saturn container
120+
@docker exec -it saturn-dev bash
121+
122+
dev-clean: ## Clean up Docker containers and images
123+
@echo "Cleaning up development environment..."
124+
@cd development && docker-compose down -v
125+
@docker rmi development-pubsub-emulator development-saturn 2>/dev/null || true
126+
@echo "✓ Cleanup complete"
127+
128+
dev-docker-up: ## Start all Docker services and show logs
129+
@# TODO: Add support for setting logging level
130+
@# Generate run ID
131+
$(eval RUN_ID := $(shell date +%Y%m%d_%H%M%S))
132+
@echo "Starting run: $(RUN_ID)"
133+
@echo ""
134+
@# Create run directory structure
135+
@mkdir -p development/runs/$(RUN_ID)/scaffolds
136+
@mkdir -p development/runs/$(RUN_ID)/logs
137+
@echo "$(RUN_ID)" > development/runs/latest
138+
@# Start services with run-specific scaffold directory
139+
@echo "Starting Docker services..."
140+
@cd development && \
141+
RUN_ID=$(RUN_ID) \
142+
SCAFFOLD_DIR=./runs/$(RUN_ID)/scaffolds \
143+
docker-compose up -d
144+
@echo "✓ Services started"
145+
@echo "✓ Run ID: $(RUN_ID)"
146+
@echo "✓ Scaffolds: development/runs/$(RUN_ID)/scaffolds"
147+
@echo "✓ Logs: development/runs/$(RUN_ID)/logs"
148+
@echo ""
149+
@# Start background log capture
150+
@echo "Capturing logs to development/runs/$(RUN_ID)/logs/"
151+
@(cd development && docker-compose logs -f) > development/runs/$(RUN_ID)/logs/combined.log 2>&1 & echo $$! > development/runs/$(RUN_ID)/logs/.logger.pid
152+
@# Tail logs to terminal with colorized container names
153+
@echo "Showing logs (Ctrl+C to exit, services and logging will keep running)..."
154+
@echo ""
155+
@tail -f development/runs/$(RUN_ID)/logs/combined.log | sed \
156+
-e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \
157+
-e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g'
158+
159+
dev-docker-down: ## Stop all Docker services
160+
@echo "Stopping Docker services..."
161+
@# Stop background logger if running
162+
@if [ -f development/runs/$$(cat development/runs/latest 2>/dev/null)/logs/.logger.pid ]; then \
163+
kill $$(cat development/runs/$$(cat development/runs/latest)/logs/.logger.pid) 2>/dev/null || true; \
164+
rm development/runs/$$(cat development/runs/latest)/logs/.logger.pid; \
165+
fi
166+
@cd development && docker-compose down
167+
@echo "✓ Services stopped"
168+
169+
dev-docker-logs: ## View logs for current run
170+
@if [ ! -f development/runs/latest ]; then \
171+
echo "No active run found. Start services with 'make dev-docker-up' first."; \
172+
exit 1; \
173+
fi
174+
@RUN_ID=$$(cat development/runs/latest); \
175+
echo "Viewing logs for run: $$RUN_ID"; \
176+
echo ""; \
177+
tail -f development/runs/$$RUN_ID/logs/combined.log | sed \
178+
-e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \
179+
-e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g'
180+
181+
dev-docker-rebuild: ## Rebuild Docker images and restart services
182+
@echo "Rebuilding and restarting Docker services..."
183+
@cd development && docker-compose up -d --build
184+
@echo "✓ Rebuild complete"
185+
186+
dev-list-runs: ## List all test runs
187+
@echo "Available test runs:"
188+
@echo ""
189+
@if [ -d development/runs ]; then \
190+
for run in $$(ls -t development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$'); do \
191+
echo " $$run"; \
192+
if [ -d "development/runs/$$run/scaffolds" ]; then \
193+
scaffold_count=$$(find development/runs/$$run/scaffolds -type f 2>/dev/null | wc -l | tr -d ' '); \
194+
echo " Scaffolds: $$scaffold_count files"; \
195+
fi; \
196+
if [ -f "development/runs/$$run/logs/combined.log" ]; then \
197+
log_size=$$(du -h development/runs/$$run/logs/combined.log | cut -f1); \
198+
echo " Logs: $$log_size"; \
199+
fi; \
200+
echo ""; \
201+
done; \
202+
else \
203+
echo " No runs found"; \
204+
fi
205+
@if [ -f development/runs/latest ]; then \
206+
echo "Latest run: $$(cat development/runs/latest)"; \
207+
fi
208+
209+
dev-view-run: ## View logs for a specific run (usage: make dev-view-run RUN_ID=20260102_134523)
210+
@if [ -z "$(RUN_ID)" ]; then \
211+
echo "Error: Please specify RUN_ID"; \
212+
echo "Usage: make dev-view-run RUN_ID=20260102_134523"; \
213+
echo ""; \
214+
echo "Available runs:"; \
215+
ls -1 development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$' || echo " No runs found"; \
216+
exit 1; \
217+
fi
218+
@if [ ! -f "development/runs/$(RUN_ID)/logs/combined.log" ]; then \
219+
echo "Error: Run $(RUN_ID) not found or has no logs"; \
220+
exit 1; \
221+
fi
222+
@echo "Viewing logs for run: $(RUN_ID)"
223+
@echo ""
224+
@tail -f development/runs/$(RUN_ID)/logs/combined.log | sed \
225+
-e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \
226+
-e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g'
227+
228+
dev-clean-runs: ## Clean old test runs (keeps latest 5)
229+
@echo "Cleaning old test runs..."
230+
@if [ -d development/runs ]; then \
231+
runs_to_delete=$$(ls -t development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$' | tail -n +6); \
232+
if [ -n "$$runs_to_delete" ]; then \
233+
echo "Deleting old runs:"; \
234+
for run in $$runs_to_delete; do \
235+
echo " $$run"; \
236+
rm -rf development/runs/$$run; \
237+
done; \
238+
echo "✓ Cleanup complete"; \
239+
else \
240+
echo "No old runs to clean (keeping latest 5)"; \
241+
fi; \
242+
else \
243+
echo "No runs directory found"; \
244+
fi

0 commit comments

Comments
 (0)