diff --git a/internal/generate/cloud_engines_test.go b/internal/generate/cloud_engines_test.go index 1322ae4..84ec003 100644 --- a/internal/generate/cloud_engines_test.go +++ b/internal/generate/cloud_engines_test.go @@ -22,6 +22,7 @@ func TestCloudEngineTemplatesLint(t *testing.T) { wantIn string // a literal that must survive into the rendered compose }{ {"localstack", "aws", 4566, "_localstack/health"}, + {"ministack", "aws", 4566, "_ministack/ready"}, {"nats", "nats", 4222, "-js"}, {"kafka", "kafka", 9092, "advertise-kafka-addr=internal://shared-kafka:9092"}, {"rabbitmq", "amqp", 5672, "rabbitmq-diagnostics -q ping"}, @@ -75,6 +76,7 @@ func cloudResolver() *graphResolver { Shared: map[string]config.SharedSvc{ "localstack": {Template: "localstack", Params: map[string]any{"region": "eu-west-1"}}, "awsdefault": {Template: "localstack"}, + "ministack": {Template: "ministack", Params: map[string]any{"region": "ap-south-1"}}, "nats": {Template: "nats"}, "kafka": {Template: "kafka"}, "rabbitmq": {Template: "rabbitmq"}, @@ -87,6 +89,7 @@ func cloudResolver() *graphResolver { sharedPort: map[string]int{ "localstack": 4566, "awsdefault": 4566, + "ministack": 4566, "nats": 4222, "kafka": 9092, "rabbitmq": 5672, @@ -109,6 +112,13 @@ func TestSharedAttr_EndpointAndRegion(t *testing.T) { if got, err := r.sharedAttr("awsdefault", "region"); err != nil || got != "us-east-1" { t.Errorf("region default = %q err=%v, want us-east-1", got, err) } + // ministack shares the generic AWS-emulation export path with localstack. + if got, err := r.sharedAttr("ministack", "endpoint"); err != nil || got != "http://shared-ministack:4566" { + t.Errorf("ministack endpoint = %q err=%v, want http://shared-ministack:4566", got, err) + } + if got, err := r.sharedAttr("ministack", "region"); err != nil || got != "ap-south-1" { + t.Errorf("ministack region = %q err=%v, want ap-south-1 (the param)", got, err) + } } // TestSharedAttr_SecondaryPorts covers the per-template export-attr→secondary-port diff --git a/templates/embed.go b/templates/embed.go index d95264e..4cdade7 100644 --- a/templates/embed.go +++ b/templates/embed.go @@ -7,7 +7,7 @@ package templates import "embed" -//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 +//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 var builtinFS embed.FS // FS is the embedded built-in templates root: template-name directories at the diff --git a/templates/ministack/golden.yaml b/templates/ministack/golden.yaml new file mode 100644 index 0000000..39e321b --- /dev/null +++ b/templates/ministack/golden.yaml @@ -0,0 +1,31 @@ +name: devstack-lint +services: + ministack: + environment: + AWS_DEFAULT_REGION: us-east-1 + PERSIST_STATE: "1" + SERVICES: s3,sqs,sns + STATE_DIR: /var/lib/ministack + healthcheck: + test: + - CMD-SHELL + - curl -sf http://localhost:4566/_ministack/ready + timeout: 5s + interval: 10s + retries: 8 + start_period: 20s + image: ministackorg/ministack:latest + networks: + default: null + restart: unless-stopped + volumes: + - type: volume + source: ministackdata + target: /var/lib/ministack + volume: {} +networks: + default: + name: devstack-lint_default +volumes: + ministackdata: + name: devstack-lint_ministackdata diff --git a/templates/ministack/template.yaml b/templates/ministack/template.yaml new file mode 100644 index 0000000..425674d --- /dev/null +++ b/templates/ministack/template.yaml @@ -0,0 +1,39 @@ +schemaVersion: 1 +description: "Shared ministack AWS-emulation engine (LocalStack-compatible), reached over the shared network at shared-ministack:4566." +provides: aws +exports: [host, port, endpoint, region] +defaultPort: 4566 +params: + image: + type: string + default: "ministackorg/ministack:latest" + description: "ministack image; pin a tag (e.g. ministackorg/ministack:1) for stable (engine,major) ledger keying — latest floats across majors." + services: + type: string + default: "s3,sqs,sns" + description: "Comma list for the SERVICES env (selects which AWS services start — a light default for fast startup; empty/all enables everything)." + region: + type: string + default: "us-east-1" + description: "Default AWS region advertised to in-network consumers (the region export)." + +service: + image: "[[ .params.image ]]" + restart: unless-stopped + environment: + SERVICES: "[[ .params.services ]]" + AWS_DEFAULT_REGION: "[[ .params.region ]]" + PERSIST_STATE: "1" + STATE_DIR: "/var/lib/ministack" + volumes: + - "ministackdata:/var/lib/ministack" + healthcheck: + # /_ministack/ready returns 200 when the edge is serving (503 while starting). + test: ["CMD-SHELL", "curl -sf http://localhost:4566/_ministack/ready"] + interval: 10s + timeout: 5s + retries: 8 + start_period: 20s + +volumes: + ministackdata: {}