Skip to content

Commit e09030d

Browse files
gustavobertoiclaude
andcommitted
feat(templates): ministack AWS-emulation engine (provides: aws)
Add the ministack (LocalStack-compatible AWS emulator) shared engine template, mirroring the localstack template shape. provides: aws, exports host/port/endpoint/region, defaultPort 4566. Uses the ministack readiness probe (/_ministack/ready) and PERSIST_STATE/STATE_DIR persistence into a named volume. Wired into the go:embed set with a rendered golden.yaml and resolver/lint tests. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent fd90f84 commit e09030d

4 files changed

Lines changed: 81 additions & 1 deletion

File tree

internal/generate/cloud_engines_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func TestCloudEngineTemplatesLint(t *testing.T) {
2222
wantIn string // a literal that must survive into the rendered compose
2323
}{
2424
{"localstack", "aws", 4566, "_localstack/health"},
25+
{"ministack", "aws", 4566, "_ministack/ready"},
2526
{"nats", "nats", 4222, "-js"},
2627
{"kafka", "kafka", 9092, "advertise-kafka-addr=internal://shared-kafka:9092"},
2728
{"rabbitmq", "amqp", 5672, "rabbitmq-diagnostics -q ping"},
@@ -75,6 +76,7 @@ func cloudResolver() *graphResolver {
7576
Shared: map[string]config.SharedSvc{
7677
"localstack": {Template: "localstack", Params: map[string]any{"region": "eu-west-1"}},
7778
"awsdefault": {Template: "localstack"},
79+
"ministack": {Template: "ministack", Params: map[string]any{"region": "ap-south-1"}},
7880
"nats": {Template: "nats"},
7981
"kafka": {Template: "kafka"},
8082
"rabbitmq": {Template: "rabbitmq"},
@@ -87,6 +89,7 @@ func cloudResolver() *graphResolver {
8789
sharedPort: map[string]int{
8890
"localstack": 4566,
8991
"awsdefault": 4566,
92+
"ministack": 4566,
9093
"nats": 4222,
9194
"kafka": 9092,
9295
"rabbitmq": 5672,
@@ -109,6 +112,13 @@ func TestSharedAttr_EndpointAndRegion(t *testing.T) {
109112
if got, err := r.sharedAttr("awsdefault", "region"); err != nil || got != "us-east-1" {
110113
t.Errorf("region default = %q err=%v, want us-east-1", got, err)
111114
}
115+
// ministack shares the generic AWS-emulation export path with localstack.
116+
if got, err := r.sharedAttr("ministack", "endpoint"); err != nil || got != "http://shared-ministack:4566" {
117+
t.Errorf("ministack endpoint = %q err=%v, want http://shared-ministack:4566", got, err)
118+
}
119+
if got, err := r.sharedAttr("ministack", "region"); err != nil || got != "ap-south-1" {
120+
t.Errorf("ministack region = %q err=%v, want ap-south-1 (the param)", got, err)
121+
}
112122
}
113123

114124
// TestSharedAttr_SecondaryPorts covers the per-template export-attr→secondary-port

templates/embed.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package templates
77

88
import "embed"
99

10-
//go:embed all:postgres all:redis all:minio all:php.nginx all:php.laravel.nginx all:node.vite all:localstack all:nats all:kafka all:rabbitmq
10+
//go:embed all:postgres all:redis all:minio all:php.nginx all:php.laravel.nginx all:node.vite all:localstack all:ministack all:nats all:kafka all:rabbitmq
1111
var builtinFS embed.FS
1212

1313
// FS is the embedded built-in templates root: template-name directories at the

templates/ministack/golden.yaml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: devstack-lint
2+
services:
3+
ministack:
4+
environment:
5+
AWS_DEFAULT_REGION: us-east-1
6+
PERSIST_STATE: "1"
7+
SERVICES: s3,sqs,sns
8+
STATE_DIR: /var/lib/ministack
9+
healthcheck:
10+
test:
11+
- CMD-SHELL
12+
- curl -sf http://localhost:4566/_ministack/ready
13+
timeout: 5s
14+
interval: 10s
15+
retries: 8
16+
start_period: 20s
17+
image: ministackorg/ministack:latest
18+
networks:
19+
default: null
20+
restart: unless-stopped
21+
volumes:
22+
- type: volume
23+
source: ministackdata
24+
target: /var/lib/ministack
25+
volume: {}
26+
networks:
27+
default:
28+
name: devstack-lint_default
29+
volumes:
30+
ministackdata:
31+
name: devstack-lint_ministackdata

templates/ministack/template.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
schemaVersion: 1
2+
description: "Shared ministack AWS-emulation engine (LocalStack-compatible), reached over the shared network at shared-ministack:4566."
3+
provides: aws
4+
exports: [host, port, endpoint, region]
5+
defaultPort: 4566
6+
params:
7+
image:
8+
type: string
9+
default: "ministackorg/ministack:latest"
10+
description: "ministack image; pin a tag (e.g. ministackorg/ministack:1) for stable (engine,major) ledger keying — latest floats across majors."
11+
services:
12+
type: string
13+
default: "s3,sqs,sns"
14+
description: "Comma list for the SERVICES env (selects which AWS services start — a light default for fast startup; empty/all enables everything)."
15+
region:
16+
type: string
17+
default: "us-east-1"
18+
description: "Default AWS region advertised to in-network consumers (the region export)."
19+
20+
service:
21+
image: "[[ .params.image ]]"
22+
restart: unless-stopped
23+
environment:
24+
SERVICES: "[[ .params.services ]]"
25+
AWS_DEFAULT_REGION: "[[ .params.region ]]"
26+
PERSIST_STATE: "1"
27+
STATE_DIR: "/var/lib/ministack"
28+
volumes:
29+
- "ministackdata:/var/lib/ministack"
30+
healthcheck:
31+
# /_ministack/ready returns 200 when the edge is serving (503 while starting).
32+
test: ["CMD-SHELL", "curl -sf http://localhost:4566/_ministack/ready"]
33+
interval: 10s
34+
timeout: 5s
35+
retries: 8
36+
start_period: 20s
37+
38+
volumes:
39+
ministackdata: {}

0 commit comments

Comments
 (0)