From 1d44a2ff3207b1f096a25b0028633d9697f7683e Mon Sep 17 00:00:00 2001 From: Yann Autissier Date: Thu, 3 Sep 2026 14:35:58 +0200 Subject: [PATCH] add shellspec golden harness for the legacy make engine - spec/golden/cases.txt: 69 black-box cases (CLI wrapper mode and make include mode) run in a hermetic sandbox with a mocked docker - spec/golden/expected/*.txt recorded from this engine (baseline) - make test / test-golden / golden-record / lint dev targets --- .shellspec | 4 ++ Makefile | 22 ++++++ spec/fixtures/app-git/.env.dist | 2 + spec/fixtures/app-git/Makefile | 2 + .../fixtures/app-git/docker-compose.local.yml | 4 ++ spec/fixtures/app-git/docker-compose.yml | 13 ++++ .../app-git/docker/docker-compose.yml | 5 ++ spec/fixtures/app-nogit/docker-compose.yml | 3 + .../.local/share/myos/stack/User/User.yml | 6 ++ .../home/.local/share/myos/stack/default.mk | 1 + .../share/myos/stack/drone/drone.1.6.yml | 3 + .../.local/share/myos/stack/drone/drone.mk | 2 + .../.local/share/myos/stack/drone/drone.yml | 7 ++ .../share/myos/stack/host/nginx.dns.yml | 4 ++ .../share/myos/stack/host/nginx.www.yml | 4 ++ .../.local/share/myos/stack/host/nginx.yml | 6 ++ .../myos/stack/postgres/postgres.9.6.yml | 3 + .../myos/stack/postgres/postgres.local.yml | 4 ++ .../share/myos/stack/postgres/postgres.yml | 13 ++++ .../.local/share/myos/stack/redis/redis.yml | 5 ++ .../home/.local/share/myos/stack/testing.mk | 1 + .../host-project/stack/host/consul.yml | 12 ++++ .../host-project/stack/host/fabio.yml | 13 ++++ spec/fixtures/host-project/stack/host/host.mk | 10 +++ .../host-project/stack/host/registrator.yml | 9 +++ spec/golden/DELTAS.md | 8 +++ spec/golden/cases.txt | 70 +++++++++++++++++++ spec/golden/expected/app-config.txt | 3 + spec/golden/expected/app-down.txt | 3 + spec/golden/expected/app-print-app.txt | 2 + .../expected/app-print-compose-file.txt | 2 + spec/golden/expected/app-print-project.txt | 2 + spec/golden/expected/app-print-repository.txt | 2 + .../expected/app-print-service-name.txt | 2 + spec/golden/expected/app-print-stack.txt | 2 + spec/golden/expected/app-run.txt | 2 + spec/golden/expected/app-scale.txt | 3 + spec/golden/expected/app-up-env-master.txt | 5 ++ spec/golden/expected/app-up.txt | 5 ++ spec/golden/expected/cat-drone-env-vars.txt | 2 + spec/golden/expected/cat-drone-version.txt | 2 + spec/golden/expected/cat-group-default-up.txt | 5 ++ spec/golden/expected/cat-group-testing-up.txt | 5 ++ spec/golden/expected/cat-group-testing.txt | 2 + spec/golden/expected/cat-nginx-project.txt | 2 + spec/golden/expected/cat-nginx-www-dns.txt | 2 + spec/golden/expected/cat-nginx-www.txt | 2 + .../expected/cat-postgres-compose-file.txt | 2 + .../expected/cat-postgres-env-master.txt | 2 + spec/golden/expected/cat-postgres-project.txt | 2 + spec/golden/expected/cat-postgres-up.txt | 5 ++ spec/golden/expected/cat-postgres-version.txt | 2 + spec/golden/expected/cat-unknown-stack.txt | 2 + spec/golden/expected/cat-unknown-target.txt | 2 + .../golden/expected/cat-user-compose-file.txt | 2 + spec/golden/expected/cat-user-network.txt | 2 + spec/golden/expected/cat-user-project.txt | 2 + spec/golden/expected/host-config.txt | 3 + spec/golden/expected/host-down-group.txt | 3 + spec/golden/expected/host-env-master.txt | 2 + spec/golden/expected/host-exec.txt | 5 ++ spec/golden/expected/host-logs.txt | 3 + spec/golden/expected/host-print-app.txt | 2 + .../expected/host-print-compose-file.txt | 2 + spec/golden/expected/host-print-env-vars.txt | 2 + .../golden/expected/host-print-host-stack.txt | 2 + .../expected/host-print-network-default.txt | 2 + .../expected/host-print-network-private.txt | 2 + .../expected/host-print-network-public.txt | 2 + .../host-print-project-env-master.txt | 2 + spec/golden/expected/host-print-project.txt | 2 + spec/golden/expected/host-print-stack-dir.txt | 2 + spec/golden/expected/host-print-suffix.txt | 2 + spec/golden/expected/host-ps.txt | 3 + .../expected/host-stack-host-config.txt | 4 ++ spec/golden/expected/host-target.txt | 14 ++++ spec/golden/expected/host-up-consul.txt | 5 ++ spec/golden/expected/host-up-group.txt | 5 ++ spec/golden/expected/host-up-two.txt | 9 +++ spec/golden/expected/inc-app-config.txt | 3 + spec/golden/expected/inc-app-down.txt | 3 + spec/golden/expected/inc-app-print-app.txt | 2 + .../expected/inc-app-print-compose-file.txt | 2 + .../expected/inc-app-print-env-vars.txt | 2 + .../inc-app-print-network-default.txt | 2 + .../golden/expected/inc-app-print-project.txt | 2 + .../expected/inc-app-print-service-name.txt | 2 + spec/golden/expected/inc-app-ps.txt | 3 + .../expected/inc-app-stack-postgres-up.txt | 5 ++ .../expected/inc-app-unknown-target.txt | 2 + .../golden/expected/inc-app-up-env-master.txt | 3 + spec/golden/expected/inc-app-up.txt | 3 + spec/golden/expected/misc-help.txt | 52 ++++++++++++++ spec/golden/expected/nogit-print-app.txt | 2 + spec/golden/expected/nogit-print-project.txt | 2 + spec/golden/expected/nogit-up.txt | 5 ++ spec/golden/golden_spec.sh | 32 +++++++++ spec/golden/record.sh | 18 +++++ spec/spec_helper.sh | 6 ++ spec/support/bin/docker | 18 +++++ spec/support/bin/docker-compose | 4 ++ spec/support/run.sh | 67 ++++++++++++++++++ 102 files changed, 632 insertions(+) create mode 100644 .shellspec create mode 100644 spec/fixtures/app-git/.env.dist create mode 100644 spec/fixtures/app-git/Makefile create mode 100644 spec/fixtures/app-git/docker-compose.local.yml create mode 100644 spec/fixtures/app-git/docker-compose.yml create mode 100644 spec/fixtures/app-git/docker/docker-compose.yml create mode 100644 spec/fixtures/app-nogit/docker-compose.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/User/User.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/default.mk create mode 100644 spec/fixtures/home/.local/share/myos/stack/drone/drone.1.6.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/drone/drone.mk create mode 100644 spec/fixtures/home/.local/share/myos/stack/drone/drone.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/host/nginx.dns.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/host/nginx.www.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/host/nginx.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/postgres/postgres.9.6.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/postgres/postgres.local.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/postgres/postgres.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/redis/redis.yml create mode 100644 spec/fixtures/home/.local/share/myos/stack/testing.mk create mode 100644 spec/fixtures/host-project/stack/host/consul.yml create mode 100644 spec/fixtures/host-project/stack/host/fabio.yml create mode 100644 spec/fixtures/host-project/stack/host/host.mk create mode 100644 spec/fixtures/host-project/stack/host/registrator.yml create mode 100644 spec/golden/DELTAS.md create mode 100644 spec/golden/cases.txt create mode 100644 spec/golden/expected/app-config.txt create mode 100644 spec/golden/expected/app-down.txt create mode 100644 spec/golden/expected/app-print-app.txt create mode 100644 spec/golden/expected/app-print-compose-file.txt create mode 100644 spec/golden/expected/app-print-project.txt create mode 100644 spec/golden/expected/app-print-repository.txt create mode 100644 spec/golden/expected/app-print-service-name.txt create mode 100644 spec/golden/expected/app-print-stack.txt create mode 100644 spec/golden/expected/app-run.txt create mode 100644 spec/golden/expected/app-scale.txt create mode 100644 spec/golden/expected/app-up-env-master.txt create mode 100644 spec/golden/expected/app-up.txt create mode 100644 spec/golden/expected/cat-drone-env-vars.txt create mode 100644 spec/golden/expected/cat-drone-version.txt create mode 100644 spec/golden/expected/cat-group-default-up.txt create mode 100644 spec/golden/expected/cat-group-testing-up.txt create mode 100644 spec/golden/expected/cat-group-testing.txt create mode 100644 spec/golden/expected/cat-nginx-project.txt create mode 100644 spec/golden/expected/cat-nginx-www-dns.txt create mode 100644 spec/golden/expected/cat-nginx-www.txt create mode 100644 spec/golden/expected/cat-postgres-compose-file.txt create mode 100644 spec/golden/expected/cat-postgres-env-master.txt create mode 100644 spec/golden/expected/cat-postgres-project.txt create mode 100644 spec/golden/expected/cat-postgres-up.txt create mode 100644 spec/golden/expected/cat-postgres-version.txt create mode 100644 spec/golden/expected/cat-unknown-stack.txt create mode 100644 spec/golden/expected/cat-unknown-target.txt create mode 100644 spec/golden/expected/cat-user-compose-file.txt create mode 100644 spec/golden/expected/cat-user-network.txt create mode 100644 spec/golden/expected/cat-user-project.txt create mode 100644 spec/golden/expected/host-config.txt create mode 100644 spec/golden/expected/host-down-group.txt create mode 100644 spec/golden/expected/host-env-master.txt create mode 100644 spec/golden/expected/host-exec.txt create mode 100644 spec/golden/expected/host-logs.txt create mode 100644 spec/golden/expected/host-print-app.txt create mode 100644 spec/golden/expected/host-print-compose-file.txt create mode 100644 spec/golden/expected/host-print-env-vars.txt create mode 100644 spec/golden/expected/host-print-host-stack.txt create mode 100644 spec/golden/expected/host-print-network-default.txt create mode 100644 spec/golden/expected/host-print-network-private.txt create mode 100644 spec/golden/expected/host-print-network-public.txt create mode 100644 spec/golden/expected/host-print-project-env-master.txt create mode 100644 spec/golden/expected/host-print-project.txt create mode 100644 spec/golden/expected/host-print-stack-dir.txt create mode 100644 spec/golden/expected/host-print-suffix.txt create mode 100644 spec/golden/expected/host-ps.txt create mode 100644 spec/golden/expected/host-stack-host-config.txt create mode 100644 spec/golden/expected/host-target.txt create mode 100644 spec/golden/expected/host-up-consul.txt create mode 100644 spec/golden/expected/host-up-group.txt create mode 100644 spec/golden/expected/host-up-two.txt create mode 100644 spec/golden/expected/inc-app-config.txt create mode 100644 spec/golden/expected/inc-app-down.txt create mode 100644 spec/golden/expected/inc-app-print-app.txt create mode 100644 spec/golden/expected/inc-app-print-compose-file.txt create mode 100644 spec/golden/expected/inc-app-print-env-vars.txt create mode 100644 spec/golden/expected/inc-app-print-network-default.txt create mode 100644 spec/golden/expected/inc-app-print-project.txt create mode 100644 spec/golden/expected/inc-app-print-service-name.txt create mode 100644 spec/golden/expected/inc-app-ps.txt create mode 100644 spec/golden/expected/inc-app-stack-postgres-up.txt create mode 100644 spec/golden/expected/inc-app-unknown-target.txt create mode 100644 spec/golden/expected/inc-app-up-env-master.txt create mode 100644 spec/golden/expected/inc-app-up.txt create mode 100644 spec/golden/expected/misc-help.txt create mode 100644 spec/golden/expected/nogit-print-app.txt create mode 100644 spec/golden/expected/nogit-print-project.txt create mode 100644 spec/golden/expected/nogit-up.txt create mode 100644 spec/golden/golden_spec.sh create mode 100755 spec/golden/record.sh create mode 100644 spec/spec_helper.sh create mode 100755 spec/support/bin/docker create mode 100755 spec/support/bin/docker-compose create mode 100644 spec/support/run.sh diff --git a/.shellspec b/.shellspec new file mode 100644 index 0000000..005c6fd --- /dev/null +++ b/.shellspec @@ -0,0 +1,4 @@ +--require spec_helper +--shell bash +--default-path spec/unit:spec/golden +--pattern "*_spec.sh" diff --git a/Makefile b/Makefile index f7f3e20..c551c58 100644 --- a/Makefile +++ b/Makefile @@ -1 +1,23 @@ +DEV_TARGETS := test test-unit test-golden test-integration lint golden-record +ifneq ($(filter $(DEV_TARGETS),$(MAKECMDGOALS)),) + +SHELLSPEC ?= shellspec +SHELLCHECK ?= shellcheck + +.PHONY: $(DEV_TARGETS) +test: ## Run unit + golden tests + $(SHELLSPEC) +test-unit: ## Run unit tests only + $(SHELLSPEC) spec/unit +test-golden: ## Run golden tests only (MYOS_ENGINE=legacy|cli) + $(SHELLSPEC) spec/golden +test-integration: ## Run tests needing a real docker daemon + $(SHELLSPEC) --tag integration +golden-record: ## Re-record golden expectations from the legacy engine + spec/golden/record.sh $(CASES) +lint: ## shellcheck all shell sources + $(SHELLCHECK) -s bash myos spec/golden/record.sh spec/support/run.sh spec/support/bin/* $(wildcard bin/* lib/*.sh lib/cmd/*.sh install.sh) + +else include make/include.mk +endif diff --git a/spec/fixtures/app-git/.env.dist b/spec/fixtures/app-git/.env.dist new file mode 100644 index 0000000..a27d2cf --- /dev/null +++ b/spec/fixtures/app-git/.env.dist @@ -0,0 +1,2 @@ +APP_SERVICE_8080_TAGS=urlprefix-app.${DOMAIN}/* +POSTGRES_PASSWORD=changeme diff --git a/spec/fixtures/app-git/Makefile b/spec/fixtures/app-git/Makefile new file mode 100644 index 0000000..46f4d5d --- /dev/null +++ b/spec/fixtures/app-git/Makefile @@ -0,0 +1,2 @@ +MYOS ?= /usr/local/lib/myos +-include $(MYOS)/make/include.mk diff --git a/spec/fixtures/app-git/docker-compose.local.yml b/spec/fixtures/app-git/docker-compose.local.yml new file mode 100644 index 0000000..5ecd1e8 --- /dev/null +++ b/spec/fixtures/app-git/docker-compose.local.yml @@ -0,0 +1,4 @@ +services: + app: + environment: + DEBUG: "true" diff --git a/spec/fixtures/app-git/docker-compose.yml b/spec/fixtures/app-git/docker-compose.yml new file mode 100644 index 0000000..d3f20ab --- /dev/null +++ b/spec/fixtures/app-git/docker-compose.yml @@ -0,0 +1,13 @@ +services: + app: + image: alpine:3.20 + command: sleep infinity + environment: + APP_DOMAIN: ${APP_DOMAIN} + DOMAIN: ${DOMAIN} + labels: + - SERVICE_8080_NAME=${COMPOSE_SERVICE_NAME}-app-8080 + - SERVICE_8080_TAGS=${APP_SERVICE_8080_TAGS:-urlprefix-app.localhost/*} + networks: + - default + - private diff --git a/spec/fixtures/app-git/docker/docker-compose.yml b/spec/fixtures/app-git/docker/docker-compose.yml new file mode 100644 index 0000000..4547cee --- /dev/null +++ b/spec/fixtures/app-git/docker/docker-compose.yml @@ -0,0 +1,5 @@ +services: + db: + image: postgres:16-alpine + environment: + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} diff --git a/spec/fixtures/app-nogit/docker-compose.yml b/spec/fixtures/app-nogit/docker-compose.yml new file mode 100644 index 0000000..818c21c --- /dev/null +++ b/spec/fixtures/app-nogit/docker-compose.yml @@ -0,0 +1,3 @@ +services: + web: + image: nginx:alpine diff --git a/spec/fixtures/home/.local/share/myos/stack/User/User.yml b/spec/fixtures/home/.local/share/myos/stack/User/User.yml new file mode 100644 index 0000000..1b0ca78 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/User/User.yml @@ -0,0 +1,6 @@ +services: + myos: + image: ${USER_DOCKER_IMAGE:-myos:latest} + container_name: ${USER_COMPOSE_PROJECT_NAME:-user} + volumes: + - ${USER_DOCKER_VOLUME:-user}:/tmp/ssh-agent diff --git a/spec/fixtures/home/.local/share/myos/stack/default.mk b/spec/fixtures/home/.local/share/myos/stack/default.mk new file mode 100644 index 0000000..241fcd8 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/default.mk @@ -0,0 +1 @@ +default ?= postgres redis diff --git a/spec/fixtures/home/.local/share/myos/stack/drone/drone.1.6.yml b/spec/fixtures/home/.local/share/myos/stack/drone/drone.1.6.yml new file mode 100644 index 0000000..c210f50 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/drone/drone.1.6.yml @@ -0,0 +1,3 @@ +services: + drone: + image: drone/drone:1.6 diff --git a/spec/fixtures/home/.local/share/myos/stack/drone/drone.mk b/spec/fixtures/home/.local/share/myos/stack/drone/drone.mk new file mode 100644 index 0000000..a80f442 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/drone/drone.mk @@ -0,0 +1,2 @@ +DRONE_SERVER_HOST ?= drone.$(DOMAIN) +ENV_VARS += DRONE_SERVER_HOST diff --git a/spec/fixtures/home/.local/share/myos/stack/drone/drone.yml b/spec/fixtures/home/.local/share/myos/stack/drone/drone.yml new file mode 100644 index 0000000..ca8daa9 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/drone/drone.yml @@ -0,0 +1,7 @@ +services: + drone: + image: drone/drone:${DRONE_VERSION:-latest} + environment: + DRONE_SERVER_HOST: ${DRONE_SERVER_HOST:-drone.localhost} + networks: + - private diff --git a/spec/fixtures/home/.local/share/myos/stack/host/nginx.dns.yml b/spec/fixtures/home/.local/share/myos/stack/host/nginx.dns.yml new file mode 100644 index 0000000..38b6342 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/host/nginx.dns.yml @@ -0,0 +1,4 @@ +services: + nginx: + volumes: + - dns:/dns diff --git a/spec/fixtures/home/.local/share/myos/stack/host/nginx.www.yml b/spec/fixtures/home/.local/share/myos/stack/host/nginx.www.yml new file mode 100644 index 0000000..c59e15c --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/host/nginx.www.yml @@ -0,0 +1,4 @@ +services: + nginx: + volumes: + - www:/var/www diff --git a/spec/fixtures/home/.local/share/myos/stack/host/nginx.yml b/spec/fixtures/home/.local/share/myos/stack/host/nginx.yml new file mode 100644 index 0000000..35c4dee --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/host/nginx.yml @@ -0,0 +1,6 @@ +services: + nginx: + image: nginx:alpine + container_name: ${HOST_COMPOSE_PROJECT_NAME:-localhost}-nginx + ports: + - "8080:80" diff --git a/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.9.6.yml b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.9.6.yml new file mode 100644 index 0000000..40c3bce --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.9.6.yml @@ -0,0 +1,3 @@ +services: + postgres: + image: postgres:9.6 diff --git a/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.local.yml b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.local.yml new file mode 100644 index 0000000..e5307f4 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.local.yml @@ -0,0 +1,4 @@ +services: + postgres: + ports: + - "5432:5432" diff --git a/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.yml b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.yml new file mode 100644 index 0000000..f9333cd --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/postgres/postgres.yml @@ -0,0 +1,13 @@ +services: + postgres: + image: postgres:${POSTGRES_VERSION:-latest} + environment: + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + labels: + - SERVICE_5432_NAME=${COMPOSE_SERVICE_NAME}-postgres-5432 + networks: + - private + volumes: + - postgres:/var/lib/postgresql/data +volumes: + postgres: diff --git a/spec/fixtures/home/.local/share/myos/stack/redis/redis.yml b/spec/fixtures/home/.local/share/myos/stack/redis/redis.yml new file mode 100644 index 0000000..484eee1 --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/redis/redis.yml @@ -0,0 +1,5 @@ +services: + redis: + image: redis:alpine + networks: + - private diff --git a/spec/fixtures/home/.local/share/myos/stack/testing.mk b/spec/fixtures/home/.local/share/myos/stack/testing.mk new file mode 100644 index 0000000..30e7cbb --- /dev/null +++ b/spec/fixtures/home/.local/share/myos/stack/testing.mk @@ -0,0 +1 @@ +testing ?= drone/drone redis diff --git a/spec/fixtures/host-project/stack/host/consul.yml b/spec/fixtures/host-project/stack/host/consul.yml new file mode 100644 index 0000000..31a5028 --- /dev/null +++ b/spec/fixtures/host-project/stack/host/consul.yml @@ -0,0 +1,12 @@ +services: + consul: + image: hashicorp/consul:1.15 + container_name: ${HOST_COMPOSE_PROJECT_NAME:-localhost}-consul + network_mode: host + restart: always + environment: + CONSUL_HTTP_TOKEN: ${HOST_CONSUL_HTTP_TOKEN} + volumes: + - consul:/consul/data +volumes: + consul: diff --git a/spec/fixtures/host-project/stack/host/fabio.yml b/spec/fixtures/host-project/stack/host/fabio.yml new file mode 100644 index 0000000..eb82e46 --- /dev/null +++ b/spec/fixtures/host-project/stack/host/fabio.yml @@ -0,0 +1,13 @@ +services: + fabio: + image: fabiolb/fabio:1.6.3 + container_name: ${HOST_COMPOSE_PROJECT_NAME:-localhost}-fabio + depends_on: [consul] + ports: + - "80:80" + - "443:443" + environment: + FABIO_REGISTRY_CONSUL_ADDR: ${DOCKER_HOST_INET4:-127.0.0.1}:8500 + FABIO_LOG_ACCESS_TARGET: ${HOST_FABIO_LOG_ACCESS:-} + networks: + - public diff --git a/spec/fixtures/host-project/stack/host/host.mk b/spec/fixtures/host-project/stack/host/host.mk new file mode 100644 index 0000000..8ae5474 --- /dev/null +++ b/spec/fixtures/host-project/stack/host/host.mk @@ -0,0 +1,10 @@ +# Stack host: consul + fabio (80/443) + registrator, one instance per host. +host ?= host/consul host/fabio host/registrator + +.PHONY: host +host: + $(call make,up STACK="$(host)") + +.PHONY: host-down +host-down: + $(call make,down STACK="$(host)") diff --git a/spec/fixtures/host-project/stack/host/registrator.yml b/spec/fixtures/host-project/stack/host/registrator.yml new file mode 100644 index 0000000..0af2821 --- /dev/null +++ b/spec/fixtures/host-project/stack/host/registrator.yml @@ -0,0 +1,9 @@ +services: + registrator: + image: gliderlabs/registrator:master + container_name: ${HOST_COMPOSE_PROJECT_NAME:-localhost}-registrator + network_mode: host + depends_on: [consul] + command: -internal=false -useIpFromLabel SERVICE_ADDRESS consul://127.0.0.1:8500 + volumes: + - ${DOCKER_SOCKET_LOCATION:-/var/run/docker.sock}:/tmp/docker.sock diff --git a/spec/golden/DELTAS.md b/spec/golden/DELTAS.md new file mode 100644 index 0000000..cb5ee72 --- /dev/null +++ b/spec/golden/DELTAS.md @@ -0,0 +1,8 @@ +# Intentional differences between the legacy make engine and the bash CLI + +Golden expectations in `expected/` are recorded from the legacy engine +(`git tag legacy-1.0-beta`). When the CLI intentionally behaves differently, +the case gets an override in `expected.cli/.txt` and a line here. + +| case | delta | why | +|---|---|---| diff --git a/spec/golden/cases.txt b/spec/golden/cases.txt new file mode 100644 index 0000000..97b5e99 --- /dev/null +++ b/spec/golden/cases.txt @@ -0,0 +1,70 @@ +# name | fixture | args +host-print-project | host-project | print-COMPOSE_PROJECT_NAME STACK=host/consul +host-print-compose-file | host-project | print-COMPOSE_FILE STACK=host/consul +host-print-stack-dir | host-project | print-STACK_DIR STACK=host/consul +host-print-env-vars | host-project | print-ENV_VARS STACK=host/consul +host-print-suffix | host-project | print-COMPOSE_FILE_SUFFIX STACK=host/consul +host-print-network-default | host-project | print-DOCKER_NETWORK_DEFAULT STACK=host/consul +host-print-network-private | host-project | print-DOCKER_NETWORK_PRIVATE STACK=host/consul +host-print-network-public | host-project | print-DOCKER_NETWORK_PUBLIC STACK=host/consul +host-print-host-stack | host-project | print-HOST_STACK STACK=host/consul +host-print-app | host-project | print-APP STACK=host/consul +host-up-consul | host-project | up STACK=host/consul +host-up-two | host-project | up STACK="host/consul host/fabio" +host-up-group | host-project | up STACK=host +host-target | host-project | host +host-down-group | host-project | down STACK=host +host-config | host-project | config STACK=host/fabio +host-ps | host-project | ps STACK=host/consul +host-logs | host-project | logs STACK=host/consul +host-stack-host-config | host-project | stack-host-config +host-exec | host-project | exec STACK=host/consul SERVICE=consul ARGS='consul members' +host-env-master | host-project | print-COMPOSE_FILE STACK=host/consul ENV=master +host-print-project-env-master | host-project | print-COMPOSE_PROJECT_NAME STACK=host/consul ENV=master +app-print-project | app-git | print-COMPOSE_PROJECT_NAME +app-print-compose-file | app-git | print-COMPOSE_FILE +app-print-app | app-git | print-APP +app-print-stack | app-git | print-STACK +app-up | app-git | up +app-up-env-master | app-git | up ENV=master +app-config | app-git | config +app-down | app-git | down +app-run | app-git | run SERVICE=app ARGS='id' +app-scale | app-git | scale SERVICE=app NUM=2 +app-print-service-name | app-git | print-COMPOSE_SERVICE_NAME +app-print-repository | app-git | print-DOCKER_REPOSITORY +nogit-print-project | app-nogit | print-COMPOSE_PROJECT_NAME +nogit-print-app | app-nogit | print-APP +nogit-up | app-nogit | up +cat-postgres-compose-file | app-nogit | print-COMPOSE_FILE STACK=postgres +cat-postgres-project | app-nogit | print-COMPOSE_PROJECT_NAME STACK=postgres +cat-postgres-up | app-nogit | up STACK=postgres +cat-postgres-version | app-nogit | print-COMPOSE_FILE STACK=postgres:9.6 +cat-postgres-env-master | app-nogit | print-COMPOSE_FILE STACK=postgres ENV=master +cat-user-project | app-nogit | print-COMPOSE_PROJECT_NAME STACK=User/User +cat-user-compose-file | app-nogit | print-COMPOSE_FILE STACK=User/User +cat-user-network | app-nogit | print-DOCKER_NETWORK STACK=User/User +cat-group-testing | app-nogit | print-COMPOSE_FILE STACK=testing +cat-group-testing-up | app-nogit | up STACK=testing +cat-group-default-up | app-nogit | up STACK=default +cat-drone-version | app-nogit | print-COMPOSE_FILE STACK=drone/drone:1.6 +cat-drone-env-vars | app-nogit | print-ENV_VARS STACK=drone/drone +cat-nginx-www | app-nogit | print-COMPOSE_FILE STACK=host/nginx COMPOSE_FILE_WWW=true +cat-nginx-www-dns | app-nogit | print-COMPOSE_FILE STACK=host/nginx COMPOSE_FILE_WWW=true COMPOSE_FILE_DNS=true +cat-nginx-project | app-nogit | print-COMPOSE_PROJECT_NAME STACK=host/nginx +cat-unknown-stack | app-nogit | print-COMPOSE_FILE STACK=doesnotexist +cat-unknown-target | app-nogit | doesnotexist +misc-help | app-nogit | help +inc-app-print-project | app-git | @make print-COMPOSE_PROJECT_NAME +inc-app-print-compose-file | app-git | @make print-COMPOSE_FILE +inc-app-print-app | app-git | @make print-APP +inc-app-up | app-git | @make up +inc-app-up-env-master | app-git | @make up ENV=master +inc-app-config | app-git | @make config +inc-app-down | app-git | @make down +inc-app-ps | app-git | @make ps +inc-app-print-service-name | app-git | @make print-COMPOSE_SERVICE_NAME +inc-app-print-env-vars | app-git | @make print-ENV_VARS +inc-app-print-network-default | app-git | @make print-DOCKER_NETWORK_DEFAULT +inc-app-stack-postgres-up | app-git | @make up STACK=postgres +inc-app-unknown-target | app-git | @make doesnotexist diff --git a/spec/golden/expected/app-config.txt b/spec/golden/expected/app-config.txt new file mode 100644 index 0000000..e14e8cd --- /dev/null +++ b/spec/golden/expected/app-config.txt @@ -0,0 +1,3 @@ +make -o docker-stack-config MAKE_OLDFILE=docker-stack-config ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-config STACK=myos APP_NAME=myos +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local config +[exit 0] diff --git a/spec/golden/expected/app-down.txt b/spec/golden/expected/app-down.txt new file mode 100644 index 0000000..e1c21a4 --- /dev/null +++ b/spec/golden/expected/app-down.txt @@ -0,0 +1,3 @@ +make -o docker-stack-down MAKE_OLDFILE=docker-stack-down ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-down STACK=myos APP_NAME=myos +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local down +[exit 0] diff --git a/spec/golden/expected/app-print-app.txt b/spec/golden/expected/app-print-app.txt new file mode 100644 index 0000000..8429dd7 --- /dev/null +++ b/spec/golden/expected/app-print-app.txt @@ -0,0 +1,2 @@ +APP myos +[exit 0] diff --git a/spec/golden/expected/app-print-compose-file.txt b/spec/golden/expected/app-print-compose-file.txt new file mode 100644 index 0000000..9f280dc --- /dev/null +++ b/spec/golden/expected/app-print-compose-file.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/app-print-project.txt b/spec/golden/expected/app-print-project.txt new file mode 100644 index 0000000..9fc5daf --- /dev/null +++ b/spec/golden/expected/app-print-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME tester-myos-local +[exit 0] diff --git a/spec/golden/expected/app-print-repository.txt b/spec/golden/expected/app-print-repository.txt new file mode 100644 index 0000000..34b7b4e --- /dev/null +++ b/spec/golden/expected/app-print-repository.txt @@ -0,0 +1,2 @@ +DOCKER_REPOSITORY tester/myos/local +[exit 0] diff --git a/spec/golden/expected/app-print-service-name.txt b/spec/golden/expected/app-print-service-name.txt new file mode 100644 index 0000000..772e669 --- /dev/null +++ b/spec/golden/expected/app-print-service-name.txt @@ -0,0 +1,2 @@ +COMPOSE_SERVICE_NAME tester-myos-local +[exit 0] diff --git a/spec/golden/expected/app-print-stack.txt b/spec/golden/expected/app-print-stack.txt new file mode 100644 index 0000000..2373a4a --- /dev/null +++ b/spec/golden/expected/app-print-stack.txt @@ -0,0 +1,2 @@ +STACK myos +[exit 0] diff --git a/spec/golden/expected/app-run.txt b/spec/golden/expected/app-run.txt new file mode 100644 index 0000000..62245ca --- /dev/null +++ b/spec/golden/expected/app-run.txt @@ -0,0 +1,2 @@ +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local run --rm app id +[exit 0] diff --git a/spec/golden/expected/app-scale.txt b/spec/golden/expected/app-scale.txt new file mode 100644 index 0000000..b2dc83d --- /dev/null +++ b/spec/golden/expected/app-scale.txt @@ -0,0 +1,3 @@ +make -o docker-stack-scale MAKE_OLDFILE=docker-stack-scale ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-scale STACK=myos APP_NAME=myos +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local up -d --scale app=2 +[exit 0] diff --git a/spec/golden/expected/app-up-env-master.txt b/spec/golden/expected/app-up-env-master.txt new file mode 100644 index 0000000..b48877a --- /dev/null +++ b/spec/golden/expected/app-up-env-master.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=master DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=myos APP_NAME=myos +sh -c docker network create tester-master >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-master up -d +[exit 0] diff --git a/spec/golden/expected/app-up.txt b/spec/golden/expected/app-up.txt new file mode 100644 index 0000000..048ad84 --- /dev/null +++ b/spec/golden/expected/app-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=myos APP_NAME=myos +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local up -d +[exit 0] diff --git a/spec/golden/expected/cat-drone-env-vars.txt b/spec/golden/expected/cat-drone-env-vars.txt new file mode 100644 index 0000000..bcc4e48 --- /dev/null +++ b/spec/golden/expected/cat-drone-env-vars.txt @@ -0,0 +1,2 @@ +ENV_VARS DOCKER_NETWORK_DEFAULT DOCKER_NETWORK_PRIVATE DOCKER_NETWORK_PUBLIC DRONE_SERVER_HOST DRONE_VERSION +[exit 0] diff --git a/spec/golden/expected/cat-drone-version.txt b/spec/golden/expected/cat-drone-version.txt new file mode 100644 index 0000000..0bbf053 --- /dev/null +++ b/spec/golden/expected/cat-drone-version.txt @@ -0,0 +1,2 @@ +make/apps/common.mk:54: *** multiple target patterns. Stop. +[exit 2] diff --git a/spec/golden/expected/cat-group-default-up.txt b/spec/golden/expected/cat-group-default-up.txt new file mode 100644 index 0000000..208969d --- /dev/null +++ b/spec/golden/expected/cat-group-default-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=default APP_NAME=default +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @HOME@/.local/share/myos/stack/postgres/postgres.yml -f @HOME@/.local/share/myos/stack/postgres/postgres.local.yml -f @HOME@/.local/share/myos/stack/redis/redis.yml -f @MYOS@/stack/myos/networks.yml -p tester-default-local up -d +[exit 0] diff --git a/spec/golden/expected/cat-group-testing-up.txt b/spec/golden/expected/cat-group-testing-up.txt new file mode 100644 index 0000000..20becdd --- /dev/null +++ b/spec/golden/expected/cat-group-testing-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=testing APP_NAME=testing +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @HOME@/.local/share/myos/stack/drone/drone.yml -f @HOME@/.local/share/myos/stack/redis/redis.yml -f @MYOS@/stack/myos/networks.yml -p tester-testing-local up -d +[exit 0] diff --git a/spec/golden/expected/cat-group-testing.txt b/spec/golden/expected/cat-group-testing.txt new file mode 100644 index 0000000..f41f87f --- /dev/null +++ b/spec/golden/expected/cat-group-testing.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/drone/drone.yml @HOME@/.local/share/myos/stack/redis/redis.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/cat-nginx-project.txt b/spec/golden/expected/cat-nginx-project.txt new file mode 100644 index 0000000..53723d0 --- /dev/null +++ b/spec/golden/expected/cat-nginx-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME testhost +[exit 0] diff --git a/spec/golden/expected/cat-nginx-www-dns.txt b/spec/golden/expected/cat-nginx-www-dns.txt new file mode 100644 index 0000000..7d777ed --- /dev/null +++ b/spec/golden/expected/cat-nginx-www-dns.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/host/nginx.yml @HOME@/.local/share/myos/stack/host/nginx.www.yml @HOME@/.local/share/myos/stack/host/nginx.dns.yml @MYOS@/stack/myos/networks.yml @MYOS@/stack/myos/volumes.www.local.yml @MYOS@/stack/myos/volumes.dns.local.yml +[exit 0] diff --git a/spec/golden/expected/cat-nginx-www.txt b/spec/golden/expected/cat-nginx-www.txt new file mode 100644 index 0000000..d4eb594 --- /dev/null +++ b/spec/golden/expected/cat-nginx-www.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/host/nginx.yml @HOME@/.local/share/myos/stack/host/nginx.www.yml @MYOS@/stack/myos/networks.yml @MYOS@/stack/myos/volumes.www.local.yml +[exit 0] diff --git a/spec/golden/expected/cat-postgres-compose-file.txt b/spec/golden/expected/cat-postgres-compose-file.txt new file mode 100644 index 0000000..00a5430 --- /dev/null +++ b/spec/golden/expected/cat-postgres-compose-file.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/postgres/postgres.yml @HOME@/.local/share/myos/stack/postgres/postgres.local.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/cat-postgres-env-master.txt b/spec/golden/expected/cat-postgres-env-master.txt new file mode 100644 index 0000000..dbd6dfb --- /dev/null +++ b/spec/golden/expected/cat-postgres-env-master.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/postgres/postgres.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/cat-postgres-project.txt b/spec/golden/expected/cat-postgres-project.txt new file mode 100644 index 0000000..9fc5daf --- /dev/null +++ b/spec/golden/expected/cat-postgres-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME tester-myos-local +[exit 0] diff --git a/spec/golden/expected/cat-postgres-up.txt b/spec/golden/expected/cat-postgres-up.txt new file mode 100644 index 0000000..8a5e6ca --- /dev/null +++ b/spec/golden/expected/cat-postgres-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=postgres APP_NAME=postgres +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @HOME@/.local/share/myos/stack/postgres/postgres.yml -f @HOME@/.local/share/myos/stack/postgres/postgres.local.yml -f @MYOS@/stack/myos/networks.yml -p tester-postgres-local up -d +[exit 0] diff --git a/spec/golden/expected/cat-postgres-version.txt b/spec/golden/expected/cat-postgres-version.txt new file mode 100644 index 0000000..0bbf053 --- /dev/null +++ b/spec/golden/expected/cat-postgres-version.txt @@ -0,0 +1,2 @@ +make/apps/common.mk:54: *** multiple target patterns. Stop. +[exit 2] diff --git a/spec/golden/expected/cat-unknown-stack.txt b/spec/golden/expected/cat-unknown-stack.txt new file mode 100644 index 0000000..9f280dc --- /dev/null +++ b/spec/golden/expected/cat-unknown-stack.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/cat-unknown-target.txt b/spec/golden/expected/cat-unknown-target.txt new file mode 100644 index 0000000..f029d0d --- /dev/null +++ b/spec/golden/expected/cat-unknown-target.txt @@ -0,0 +1,2 @@ +WARNING: myos[0] doesnotexist-rule-exists: target doesnotexist unavailable in app myos +[exit 0] diff --git a/spec/golden/expected/cat-user-compose-file.txt b/spec/golden/expected/cat-user-compose-file.txt new file mode 100644 index 0000000..2f0670f --- /dev/null +++ b/spec/golden/expected/cat-user-compose-file.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @HOME@/.local/share/myos/stack/User/User.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/cat-user-network.txt b/spec/golden/expected/cat-user-network.txt new file mode 100644 index 0000000..76f9071 --- /dev/null +++ b/spec/golden/expected/cat-user-network.txt @@ -0,0 +1,2 @@ +DOCKER_NETWORK tester +[exit 0] diff --git a/spec/golden/expected/cat-user-project.txt b/spec/golden/expected/cat-user-project.txt new file mode 100644 index 0000000..a46436b --- /dev/null +++ b/spec/golden/expected/cat-user-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME tester-example-test +[exit 0] diff --git a/spec/golden/expected/host-config.txt b/spec/golden/expected/host-config.txt new file mode 100644 index 0000000..ddf934e --- /dev/null +++ b/spec/golden/expected/host-config.txt @@ -0,0 +1,3 @@ +make -o docker-stack-config MAKE_OLDFILE=docker-stack-config ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-config STACK=host/fabio APP_NAME=host +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/fabio.yml -f @MYOS@/stack/myos/networks.yml -p testhost config +[exit 0] diff --git a/spec/golden/expected/host-down-group.txt b/spec/golden/expected/host-down-group.txt new file mode 100644 index 0000000..3089de3 --- /dev/null +++ b/spec/golden/expected/host-down-group.txt @@ -0,0 +1,3 @@ +make -o docker-stack-down MAKE_OLDFILE=docker-stack-down ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-down STACK=host APP_NAME=host +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @WD@/stack/host/fabio.yml -f @WD@/stack/host/registrator.yml -f @MYOS@/stack/myos/networks.yml -p testhost down +[exit 0] diff --git a/spec/golden/expected/host-env-master.txt b/spec/golden/expected/host-env-master.txt new file mode 100644 index 0000000..2d674e2 --- /dev/null +++ b/spec/golden/expected/host-env-master.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @WD@/stack/host/consul.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/host-exec.txt b/spec/golden/expected/host-exec.txt new file mode 100644 index 0000000..4be2293 --- /dev/null +++ b/spec/golden/expected/host-exec.txt @@ -0,0 +1,5 @@ +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @MYOS@/stack/myos/networks.yml -p testhost exec -T consul sh -c consul members +/bin/bash: -c: line 0: syntax error near unexpected token `||' +/bin/bash: -c: line 0: `|| true' +make: *** [exec] Error 2 +[exit 2] diff --git a/spec/golden/expected/host-logs.txt b/spec/golden/expected/host-logs.txt new file mode 100644 index 0000000..2cb3963 --- /dev/null +++ b/spec/golden/expected/host-logs.txt @@ -0,0 +1,3 @@ +make -o docker-stack-logs MAKE_OLDFILE=docker-stack-logs ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-logs STACK=host/consul APP_NAME=host +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @MYOS@/stack/myos/networks.yml -p testhost logs --follow --tail=100 +[exit 0] diff --git a/spec/golden/expected/host-print-app.txt b/spec/golden/expected/host-print-app.txt new file mode 100644 index 0000000..8429dd7 --- /dev/null +++ b/spec/golden/expected/host-print-app.txt @@ -0,0 +1,2 @@ +APP myos +[exit 0] diff --git a/spec/golden/expected/host-print-compose-file.txt b/spec/golden/expected/host-print-compose-file.txt new file mode 100644 index 0000000..2d674e2 --- /dev/null +++ b/spec/golden/expected/host-print-compose-file.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE @WD@/stack/host/consul.yml @MYOS@/stack/myos/networks.yml +[exit 0] diff --git a/spec/golden/expected/host-print-env-vars.txt b/spec/golden/expected/host-print-env-vars.txt new file mode 100644 index 0000000..9e393b0 --- /dev/null +++ b/spec/golden/expected/host-print-env-vars.txt @@ -0,0 +1,2 @@ +ENV_VARS DOCKER_NETWORK_DEFAULT DOCKER_NETWORK_PRIVATE DOCKER_NETWORK_PUBLIC DRONE_SERVER_HOST HOST_COMPOSE_PROJECT_NAME HOST_CONSUL_HTTP_TOKEN +[exit 0] diff --git a/spec/golden/expected/host-print-host-stack.txt b/spec/golden/expected/host-print-host-stack.txt new file mode 100644 index 0000000..7d0a6b2 --- /dev/null +++ b/spec/golden/expected/host-print-host-stack.txt @@ -0,0 +1,2 @@ +HOST_STACK host +[exit 0] diff --git a/spec/golden/expected/host-print-network-default.txt b/spec/golden/expected/host-print-network-default.txt new file mode 100644 index 0000000..40e31c8 --- /dev/null +++ b/spec/golden/expected/host-print-network-default.txt @@ -0,0 +1,2 @@ +DOCKER_NETWORK_DEFAULT _testhost +[exit 0] diff --git a/spec/golden/expected/host-print-network-private.txt b/spec/golden/expected/host-print-network-private.txt new file mode 100644 index 0000000..b57bd42 --- /dev/null +++ b/spec/golden/expected/host-print-network-private.txt @@ -0,0 +1,2 @@ +DOCKER_NETWORK_PRIVATE tester-local +[exit 0] diff --git a/spec/golden/expected/host-print-network-public.txt b/spec/golden/expected/host-print-network-public.txt new file mode 100644 index 0000000..ca812a3 --- /dev/null +++ b/spec/golden/expected/host-print-network-public.txt @@ -0,0 +1,2 @@ +DOCKER_NETWORK_PUBLIC testhost +[exit 0] diff --git a/spec/golden/expected/host-print-project-env-master.txt b/spec/golden/expected/host-print-project-env-master.txt new file mode 100644 index 0000000..53723d0 --- /dev/null +++ b/spec/golden/expected/host-print-project-env-master.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME testhost +[exit 0] diff --git a/spec/golden/expected/host-print-project.txt b/spec/golden/expected/host-print-project.txt new file mode 100644 index 0000000..53723d0 --- /dev/null +++ b/spec/golden/expected/host-print-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME testhost +[exit 0] diff --git a/spec/golden/expected/host-print-stack-dir.txt b/spec/golden/expected/host-print-stack-dir.txt new file mode 100644 index 0000000..d3d29f2 --- /dev/null +++ b/spec/golden/expected/host-print-stack-dir.txt @@ -0,0 +1,2 @@ +STACK_DIR @MYOS@/stack @HOME@/.local/share/myos/stack @WD@/stack +[exit 0] diff --git a/spec/golden/expected/host-print-suffix.txt b/spec/golden/expected/host-print-suffix.txt new file mode 100644 index 0000000..c2cd8a8 --- /dev/null +++ b/spec/golden/expected/host-print-suffix.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE_SUFFIX app labels networks ssh volumes +[exit 0] diff --git a/spec/golden/expected/host-ps.txt b/spec/golden/expected/host-ps.txt new file mode 100644 index 0000000..3821af8 --- /dev/null +++ b/spec/golden/expected/host-ps.txt @@ -0,0 +1,3 @@ +make -o docker-stack-ps MAKE_OLDFILE=docker-stack-ps ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-ps STACK=host/consul APP_NAME=host +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @MYOS@/stack/myos/networks.yml -p testhost ps +[exit 0] diff --git a/spec/golden/expected/host-stack-host-config.txt b/spec/golden/expected/host-stack-host-config.txt new file mode 100644 index 0000000..e67b366 --- /dev/null +++ b/spec/golden/expected/host-stack-host-config.txt @@ -0,0 +1,4 @@ +make -o stack-host-config MAKE_OLDFILE=stack-host-config ENV=local DOCKER_COMPOSE=docker --log-level=error compose COMPOSE_IGNORE_ORPHANS=true host=host/consul host/fabio host/registrator config STACK=host +make -o stack-host-config MAKE_OLDFILE=stack-host-config ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-config STACK=host APP_NAME=host +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @WD@/stack/host/fabio.yml -f @WD@/stack/host/registrator.yml -f @MYOS@/stack/myos/networks.yml -p testhost config +[exit 0] diff --git a/spec/golden/expected/host-target.txt b/spec/golden/expected/host-target.txt new file mode 100644 index 0000000..02f1047 --- /dev/null +++ b/spec/golden/expected/host-target.txt @@ -0,0 +1,14 @@ +make -o host MAKE_OLDFILE=host ENV=local DOCKER_COMPOSE=docker --log-level=error compose up STACK=host/consul host/fabio host/registrator +make -o host MAKE_OLDFILE=host ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/consul APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +make -o host MAKE_OLDFILE=host ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/fabio APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/fabio.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +make -o host MAKE_OLDFILE=host ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/registrator APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/registrator.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +[exit 0] diff --git a/spec/golden/expected/host-up-consul.txt b/spec/golden/expected/host-up-consul.txt new file mode 100644 index 0000000..e3597f9 --- /dev/null +++ b/spec/golden/expected/host-up-consul.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/consul APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +[exit 0] diff --git a/spec/golden/expected/host-up-group.txt b/spec/golden/expected/host-up-group.txt new file mode 100644 index 0000000..f4e07cc --- /dev/null +++ b/spec/golden/expected/host-up-group.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @WD@/stack/host/fabio.yml -f @WD@/stack/host/registrator.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +[exit 0] diff --git a/spec/golden/expected/host-up-two.txt b/spec/golden/expected/host-up-two.txt new file mode 100644 index 0000000..649cf1f --- /dev/null +++ b/spec/golden/expected/host-up-two.txt @@ -0,0 +1,9 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/consul APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @WD@/stack/host/fabio.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=host/fabio APP_NAME=host +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @WD@/stack/host/consul.yml -f @WD@/stack/host/fabio.yml -f @MYOS@/stack/myos/networks.yml -p testhost up -d +[exit 0] diff --git a/spec/golden/expected/inc-app-config.txt b/spec/golden/expected/inc-app-config.txt new file mode 100644 index 0000000..c476df7 --- /dev/null +++ b/spec/golden/expected/inc-app-config.txt @@ -0,0 +1,3 @@ +make -o docker-stack-config MAKE_OLDFILE=docker-stack-config ENV=local DOCKER_COMPOSE=docker --log-level=error compose app-wd-config +docker --log-level=error compose --ansi=auto -f ././docker-compose.yml -f ././docker-compose.local.yml -f ./docker/docker-compose.yml -p tester-wd-local config +[exit 0] diff --git a/spec/golden/expected/inc-app-down.txt b/spec/golden/expected/inc-app-down.txt new file mode 100644 index 0000000..e235406 --- /dev/null +++ b/spec/golden/expected/inc-app-down.txt @@ -0,0 +1,3 @@ +make -o docker-stack-down MAKE_OLDFILE=docker-stack-down ENV=local DOCKER_COMPOSE=docker --log-level=error compose app-wd-down +docker --log-level=error compose --ansi=auto -f ././docker-compose.yml -f ././docker-compose.local.yml -f ./docker/docker-compose.yml -p tester-wd-local down +[exit 0] diff --git a/spec/golden/expected/inc-app-print-app.txt b/spec/golden/expected/inc-app-print-app.txt new file mode 100644 index 0000000..44a64c2 --- /dev/null +++ b/spec/golden/expected/inc-app-print-app.txt @@ -0,0 +1,2 @@ +APP wd +[exit 0] diff --git a/spec/golden/expected/inc-app-print-compose-file.txt b/spec/golden/expected/inc-app-print-compose-file.txt new file mode 100644 index 0000000..aa72dc9 --- /dev/null +++ b/spec/golden/expected/inc-app-print-compose-file.txt @@ -0,0 +1,2 @@ +COMPOSE_FILE ./docker-compose.yml ./docker-compose.local.yml docker/docker-compose.yml +[exit 0] diff --git a/spec/golden/expected/inc-app-print-env-vars.txt b/spec/golden/expected/inc-app-print-env-vars.txt new file mode 100644 index 0000000..1d2bd6f --- /dev/null +++ b/spec/golden/expected/inc-app-print-env-vars.txt @@ -0,0 +1,2 @@ +ENV_VARS DOCKER_NETWORK_DEFAULT DOCKER_NETWORK_PRIVATE DOCKER_NETWORK_PUBLIC DRONE_SERVER_HOST +[exit 0] diff --git a/spec/golden/expected/inc-app-print-network-default.txt b/spec/golden/expected/inc-app-print-network-default.txt new file mode 100644 index 0000000..ace2539 --- /dev/null +++ b/spec/golden/expected/inc-app-print-network-default.txt @@ -0,0 +1,2 @@ +DOCKER_NETWORK_DEFAULT _tester-wd-local +[exit 0] diff --git a/spec/golden/expected/inc-app-print-project.txt b/spec/golden/expected/inc-app-print-project.txt new file mode 100644 index 0000000..80d492a --- /dev/null +++ b/spec/golden/expected/inc-app-print-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME tester-wd-local +[exit 0] diff --git a/spec/golden/expected/inc-app-print-service-name.txt b/spec/golden/expected/inc-app-print-service-name.txt new file mode 100644 index 0000000..5811287 --- /dev/null +++ b/spec/golden/expected/inc-app-print-service-name.txt @@ -0,0 +1,2 @@ +COMPOSE_SERVICE_NAME tester-wd-local +[exit 0] diff --git a/spec/golden/expected/inc-app-ps.txt b/spec/golden/expected/inc-app-ps.txt new file mode 100644 index 0000000..dbfa0b0 --- /dev/null +++ b/spec/golden/expected/inc-app-ps.txt @@ -0,0 +1,3 @@ +make -o docker-stack-ps MAKE_OLDFILE=docker-stack-ps ENV=local DOCKER_COMPOSE=docker --log-level=error compose app-wd-ps +docker --log-level=error compose --ansi=auto -f ././docker-compose.yml -f ././docker-compose.local.yml -f ./docker/docker-compose.yml -p tester-wd-local ps +[exit 0] diff --git a/spec/golden/expected/inc-app-stack-postgres-up.txt b/spec/golden/expected/inc-app-stack-postgres-up.txt new file mode 100644 index 0000000..fc73650 --- /dev/null +++ b/spec/golden/expected/inc-app-stack-postgres-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=postgres APP_NAME=postgres +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f ./docker-compose.yml -f ./docker-compose.local.yml -f docker/docker-compose.yml -p tester-postgres-local up -d +[exit 0] diff --git a/spec/golden/expected/inc-app-unknown-target.txt b/spec/golden/expected/inc-app-unknown-target.txt new file mode 100644 index 0000000..761637e --- /dev/null +++ b/spec/golden/expected/inc-app-unknown-target.txt @@ -0,0 +1,2 @@ +WARNING: wd[0] doesnotexist-rule-exists: target doesnotexist unavailable in app wd +[exit 0] diff --git a/spec/golden/expected/inc-app-up-env-master.txt b/spec/golden/expected/inc-app-up-env-master.txt new file mode 100644 index 0000000..c7df152 --- /dev/null +++ b/spec/golden/expected/inc-app-up-env-master.txt @@ -0,0 +1,3 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=master DOCKER_COMPOSE=docker --log-level=error compose app-wd-up +docker --log-level=error compose --ansi=auto -f ././docker-compose.yml -f ./docker/docker-compose.yml -p tester-wd-master up -d +[exit 0] diff --git a/spec/golden/expected/inc-app-up.txt b/spec/golden/expected/inc-app-up.txt new file mode 100644 index 0000000..7de9cab --- /dev/null +++ b/spec/golden/expected/inc-app-up.txt @@ -0,0 +1,3 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose app-wd-up +docker --log-level=error compose --ansi=auto -f ././docker-compose.yml -f ././docker-compose.local.yml -f ./docker/docker-compose.yml -p tester-wd-local up -d +[exit 0] diff --git a/spec/golden/expected/misc-help.txt b/spec/golden/expected/misc-help.txt new file mode 100644 index 0000000..902aea0 --- /dev/null +++ b/spec/golden/expected/misc-help.txt @@ -0,0 +1,52 @@ +Usage: +make [target] + +Targets: +test Run unit + golden tests +test-unit Run unit tests only +test-golden Run golden tests only (MYOS_ENGINE=legacy|cli) +test-integration Run tests needing a real docker daemon +golden-record Re-record golden expectations from the legacy engine +lint shellcheck all shell sources +help This help +attach Attach to docker SERVICE +bootstrap Configure system +build Build application docker images +clean Clean application and docker stuffs +config View application docker compose file +connect Connect to docker SERVICE +deploy Deploy application dockers +down Remove application dockers +exec Exec command in docker SERVICE +install Install application +logs Display application dockers logs +rebuild Rebuild application dockers images +reinstall Reinstall application +release Create release VERSION +restart Restart application +run Run a command in a new docker +scale Scale SERVICE application to NUM dockers +shutdown Shutdown all dockers +start Start application dockers +stop Stop application dockers +tests Test application +up Create application dockers +update Update application files +upgrade Upgrade application +ssh Connect to first remote host + +Context: +ENV local +ENV_PATH @WD@ +DOCKER_MACHINE x86_64 +DOCKER_SOCKET_LOCATION /var/run/docker.sock +DOCKER_SYSTEM Linux +DOMAIN example.test +APP myos +APPS c411 dsh myos wbr wbr.old +BRANCH lightning +VERSION legacy-1.0-beta +RELEASE +COMPOSE_FILE @MYOS@/stack/myos/networks.yml +DOCKER_REPOSITORY tester/myos/local +[exit 0] diff --git a/spec/golden/expected/nogit-print-app.txt b/spec/golden/expected/nogit-print-app.txt new file mode 100644 index 0000000..8429dd7 --- /dev/null +++ b/spec/golden/expected/nogit-print-app.txt @@ -0,0 +1,2 @@ +APP myos +[exit 0] diff --git a/spec/golden/expected/nogit-print-project.txt b/spec/golden/expected/nogit-print-project.txt new file mode 100644 index 0000000..9fc5daf --- /dev/null +++ b/spec/golden/expected/nogit-print-project.txt @@ -0,0 +1,2 @@ +COMPOSE_PROJECT_NAME tester-myos-local +[exit 0] diff --git a/spec/golden/expected/nogit-up.txt b/spec/golden/expected/nogit-up.txt new file mode 100644 index 0000000..048ad84 --- /dev/null +++ b/spec/golden/expected/nogit-up.txt @@ -0,0 +1,5 @@ +make -o docker-stack-up MAKE_OLDFILE=docker-stack-up ENV=local DOCKER_COMPOSE=docker --log-level=error compose docker-compose-up STACK=myos APP_NAME=myos +sh -c docker network create tester-local >/dev/null 2>&1 +sh -c docker network create testhost >/dev/null 2>&1 +docker --log-level=error compose --ansi=auto -f @MYOS@/stack/myos/networks.yml -p tester-myos-local up -d +[exit 0] diff --git a/spec/golden/golden_spec.sh b/spec/golden/golden_spec.sh new file mode 100644 index 0000000..2820805 --- /dev/null +++ b/spec/golden/golden_spec.sh @@ -0,0 +1,32 @@ +#shellcheck shell=sh +# Golden tests: every case of cases.txt must produce the recorded output. +# MYOS_ENGINE=legacy (default) runs the make engine, MYOS_ENGINE=cli runs bin/myos. +# For the cli engine, spec/golden/expected.cli/.txt overrides the legacy +# expectation when a delta is intentional (documented in DELTAS.md). +Describe 'golden' + engine=${MYOS_ENGINE:-legacy} + expected_file() { + if [ "$engine" = cli ] && [ -f "$SHELLSPEC_PROJECT_ROOT/spec/golden/expected.cli/$1.txt" ]; then + printf '%s\n' "$SHELLSPEC_PROJECT_ROOT/spec/golden/expected.cli/$1.txt" + else + printf '%s\n' "$SHELLSPEC_PROJECT_ROOT/spec/golden/expected/$1.txt" + fi + } + run_case() { + sb=$(myos_sandbox "$2") + eval "set -- $3" + myos_run_engine "$engine" "$sb" "$@" + rm -rf "$sb" + } + Parameters:dynamic + while IFS='|' read -r name fixture args; do + name=$(echo "$name" | tr -d ' '); fixture=$(echo "$fixture" | tr -d ' ') + [ -z "$name" ] || [ "${name#\#}" != "$name" ] && continue + %data "$name" "$fixture" "$args" + done < "$SHELLSPEC_PROJECT_ROOT/spec/golden/cases.txt" + End + It "matches recorded output: $1 ($engine)" + When call run_case "$1" "$2" "$3" + The output should equal "$(cat "$(expected_file "$1")")" + End +End diff --git a/spec/golden/record.sh b/spec/golden/record.sh new file mode 100755 index 0000000..c1d2d25 --- /dev/null +++ b/spec/golden/record.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Record golden outputs of the LEGACY make engine into spec/golden/expected/. +# Usage: spec/golden/record.sh [case-name ...] +set -u +here=$(cd "$(dirname "$0")" && pwd) +. "$here/../support/run.sh" +MYOS_ROOT=${MYOS_ROOT:-$(cd "$here/../.." && pwd)} +only="$*" +grep -v '^#' "$here/cases.txt" | while IFS='|' read -r name fixture args; do + name=$(echo "$name" | tr -d ' '); fixture=$(echo "$fixture" | tr -d ' ') + [ -z "$name" ] && continue + if [ -n "$only" ]; then case " $only " in *" $name "*) ;; *) continue ;; esac; fi + sb=$(myos_sandbox "$fixture") + eval "set -- $args" + myos_run_engine legacy "$sb" "$@" > "$here/expected/$name.txt" + rm -rf "$sb" + printf 'recorded %s (%s lines)\n' "$name" "$(wc -l < "$here/expected/$name.txt" | tr -d ' ')" +done diff --git a/spec/spec_helper.sh b/spec/spec_helper.sh new file mode 100644 index 0000000..80aaf2d --- /dev/null +++ b/spec/spec_helper.sh @@ -0,0 +1,6 @@ +#shellcheck shell=sh +# shellspec helper: loaded before every spec file. +MYOS_ROOT=${MYOS_ROOT:-$SHELLSPEC_PROJECT_ROOT} +SPEC_DIR=$MYOS_ROOT/spec +export MYOS_ROOT SPEC_DIR +. "$SPEC_DIR/support/run.sh" diff --git a/spec/support/bin/docker b/spec/support/bin/docker new file mode 100755 index 0000000..357d026 --- /dev/null +++ b/spec/support/bin/docker @@ -0,0 +1,18 @@ +#!/bin/sh +# Mock docker for myos tests: logs every call, answers a few read-only queries deterministically. +[ -n "${MYOS_DOCKER_LOG:-}" ] && printf 'docker %s\n' "$*" >> "$MYOS_DOCKER_LOG" +case "$1 $2" in + "compose version") echo "${MOCK_COMPOSE_VERSION:-2.29.0}" ;; + "compose config") echo "# mock compose config" ;; + "compose ps") : ;; + "compose "*) : ;; + "info --format") echo "${MOCK_SWARM_STATE:-inactive}" ;; + "run --rm") case "$*" in *"uname -m"*) echo x86_64 ;; *"uname -s"*) echo Linux ;; *) : ;; esac ;; + "images -q") : ;; + "ps -q") : ;; + "network ls") : ;; + "volume ls") : ;; + "version --format") echo 29.0.0 ;; + *) : ;; +esac +exit 0 diff --git a/spec/support/bin/docker-compose b/spec/support/bin/docker-compose new file mode 100755 index 0000000..1e87a70 --- /dev/null +++ b/spec/support/bin/docker-compose @@ -0,0 +1,4 @@ +#!/bin/sh +[ -n "${MYOS_DOCKER_LOG:-}" ] && printf 'docker-compose %s\n' "$*" >> "$MYOS_DOCKER_LOG" +case "$1" in version) echo "${MOCK_COMPOSE_VERSION:-2.29.0}" ;; config) echo "# mock compose config" ;; *) : ;; esac +exit 0 diff --git a/spec/support/run.sh b/spec/support/run.sh new file mode 100644 index 0000000..ea16e66 --- /dev/null +++ b/spec/support/run.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# Helpers shared by the golden recorder and the shellspec suites. +# myos_run_engine ENGINE WORKDIR ARGS... runs myos (legacy make engine or bin/myos CLI) +# in a hermetic environment and prints normalized stdout+stderr followed by "[exit N]". + +MYOS_ROOT="${MYOS_ROOT:-$(cd "$(dirname "$0")/../.." 2>/dev/null && pwd)}" +SPEC_DIR="${SPEC_DIR:-$MYOS_ROOT/spec}" + +# myos_sandbox FIXTURE -> prints a temp dir containing a copy of the fixture (wd/) and of the home fixture (home/) +myos_sandbox() { + _fixture=$1 + _tmp=$(mktemp -d "${TMPDIR:-/tmp}/myos-spec.XXXXXX"); _tmp=$(cd "$_tmp" && pwd -P) + cp -R "$SPEC_DIR/fixtures/$_fixture" "$_tmp/wd" + cp -R "$SPEC_DIR/fixtures/home" "$_tmp/home" + printf '%s\n' "$_tmp" +} + +# myos_hermetic_env SANDBOX -> prints the env(1) arguments for a hermetic run +myos_hermetic_env() { + printf '%s\n' \ + "PATH=$SPEC_DIR/support/bin:/usr/bin:/bin:/usr/sbin:/sbin" \ + "HOME=$1/home" \ + "USER=tester" "HOSTNAME=testhost" "DOMAIN=example.test" \ + "DOCKER_MACHINE=x86_64" "DOCKER_SYSTEM=Linux" "DOCKER_SOCKET_LOCATION=/var/run/docker.sock" \ + "DRYRUN=true" "TERM=dumb" "LANG=C" "LC_ALL=C" \ + "MYOS_DOCKER_LOG=$1/docker.log" +} + +# myos_normalize SANDBOX (stdin -> stdout) +myos_normalize() { + sed -e 's/\x1b\[[0-9;]*m//g' \ + -e "s#$MYOS_ROOT#@MYOS@#g" \ + -e "s#$1/wd#@WD@#g" \ + -e "s#$1/home#@HOME@#g" \ + -e "s#$1#@TMP@#g" \ + -e 's#/[^ ]*/bin/make#make#g' \ + -e 's/[[:space:]][[:space:]]*/ /g' \ + -e 's/[[:space:]]*$//' +} + +# myos_run_engine ENGINE SANDBOX ARGS... +# shellcheck disable=SC2046 # myos_hermetic_env output is meant to be word-split +myos_run_engine() { + _engine=$1; _sb=$2; shift 2 + # "@make" as first arg = include mode: the project Makefile includes make/include.mk + # and make runs from the project dir (CURDIR = project). Same for both engines. + if [ "${1:-}" = "@make" ]; then + shift + _out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") MYOS_CONF=/dev/null \ + make -es MYOS="$MYOS_ROOT" "$@" 2>&1); _rc=$? + printf '%s\n[exit %s]\n' "$_out" "$_rc" | myos_normalize "$_sb" + return 0 + fi + case $_engine in + legacy) + # what /usr/local/bin/myos does: env from system conf + MYOS=. WORKDIR=$PWD make -esC $MYOS + _out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") \ + make -esC "$MYOS_ROOT" MYOS=. WORKDIR="$_sb/wd" "$@" 2>&1); _rc=$? + ;; + cli) + _out=$(cd "$_sb/wd" && env -i $(myos_hermetic_env "$_sb") MYOS_CONF=/dev/null \ + "$MYOS_ROOT/bin/myos" -C "$_sb/wd" "$@" 2>&1); _rc=$? + ;; + *) echo "unknown engine $_engine" >&2; return 2 ;; + esac + printf '%s\n[exit %s]\n' "$_out" "$_rc" | myos_normalize "$_sb" +}