Skip to content
This repository was archived by the owner on Oct 10, 2025. It is now read-only.

Commit 48c8b70

Browse files
committed
fix: [#28] resolve e2e test API token authentication and SSH execution issues
- Fix API token inconsistency between deploy-app.sh and health-check.sh - Remove invalid 'local' keyword from SSH remote command context - Implement proper token passing from local to remote SSH sessions - Add e2e.defaults template with consistent TRACKER_ADMIN_TOKEN=MyAccessToken - Update health-check.sh parameter handling for explicit configuration - Enhance deploy-app.sh vm_exec calls for better environment variable handling - Improve shell-utils.sh with better error handling and logging Resolves API endpoint authentication failures and bash syntax errors that were preventing successful e2e test completion. All endpoints now pass validation with 100% success rate (13/13 health checks).
1 parent cc0c4d6 commit 48c8b70

File tree

11 files changed

+1076
-269
lines changed

11 files changed

+1076
-269
lines changed

Makefile

Lines changed: 116 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Makefile for Torrust Tracker Demo - Twelve-Factor App Deployment
22
.PHONY: help install-deps test-e2e lint test-unit clean
33
.PHONY: infra-init infra-plan infra-apply infra-destroy infra-status infra-refresh-state
4-
.PHONY: infra-config-development infra-config-production infra-validate-config
4+
.PHONY: infra-config-development infra-config-production infra-config-e2e infra-config-testing infra-config-staging infra-validate-config
55
.PHONY: infra-test-prereq infra-test-ci infra-test-local
66
.PHONY: infra-providers infra-environments provider-info
77
.PHONY: app-deploy app-redeploy app-health-check
@@ -12,7 +12,8 @@
1212
# Default variables
1313
VM_NAME ?= torrust-tracker-demo
1414
# Defaults for quick development workflows only
15-
DEV_ENVIRONMENT ?= development
15+
DEV_ENVIRONMENT_TYPE ?= development
16+
DEV_ENVIRONMENT_FILE ?= development-libvirt
1617
DEV_PROVIDER ?= libvirt
1718
TERRAFORM_DIR = infrastructure/terraform
1819
INFRA_TESTS_DIR = infrastructure/tests
@@ -21,16 +22,16 @@ SCRIPTS_DIR = infrastructure/scripts
2122

2223
# Parameter validation for infrastructure commands
2324
check-infra-params:
24-
@if [ -z "$(ENVIRONMENT)" ]; then \
25-
echo "❌ Error: ENVIRONMENT not specified"; \
26-
echo "Usage: make <target> ENVIRONMENT=<env> PROVIDER=<provider>"; \
27-
echo "Available environments: development, staging, production"; \
25+
@if [ -z "$(ENVIRONMENT_TYPE)" ]; then \
26+
echo "❌ Error: ENVIRONMENT_TYPE not specified"; \
27+
echo "Usage: make <target> ENVIRONMENT_TYPE=<type> ENVIRONMENT_FILE=<file>"; \
28+
echo "Available environment types: development, testing, e2e, staging, production"; \
2829
exit 1; \
2930
fi
30-
@if [ -z "$(PROVIDER)" ]; then \
31-
echo "❌ Error: PROVIDER not specified"; \
32-
echo "Usage: make <target> ENVIRONMENT=<env> PROVIDER=<provider>"; \
33-
echo "Available providers: libvirt, hetzner"; \
31+
@if [ -z "$(ENVIRONMENT_FILE)" ]; then \
32+
echo "❌ Error: ENVIRONMENT_FILE not specified"; \
33+
echo "Usage: make <target> ENVIRONMENT_TYPE=<type> ENVIRONMENT_FILE=<file>"; \
34+
echo "Example: make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"; \
3435
exit 1; \
3536
fi
3637

@@ -61,11 +62,16 @@ help: ## Show this help message
6162
@echo "⚙️ SYSTEM SETUP:"
6263
@awk 'BEGIN {FS = ":.*?## "} /^(install-deps|clean).*:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
6364
@echo ""
64-
@echo "Development examples:"
65+
@echo "Development examples:"
6566
@echo " make dev-deploy # Uses defaults: development + libvirt"
66-
@echo " make infra-apply ENVIRONMENT=development PROVIDER=libvirt"
67-
@echo " make infra-apply ENVIRONMENT=production PROVIDER=hetzner"
68-
@echo " make app-deploy ENVIRONMENT=development"
67+
@echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
68+
@echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
69+
@echo " make app-deploy ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
70+
@echo ""
71+
@echo "Configuration examples:"
72+
@echo " make infra-config-development PROVIDER=libvirt # Create development-libvirt.env"
73+
@echo " make infra-config-production PROVIDER=hetzner # Create production-hetzner.env"
74+
@echo " make infra-config-e2e PROVIDER=libvirt # Create e2e-libvirt.env"
6975

7076
install-deps: ## Install required dependencies (Ubuntu/Debian)
7177
@echo "Installing dependencies..."
@@ -80,26 +86,26 @@ install-deps: ## Install required dependencies (Ubuntu/Debian)
8086
# =============================================================================
8187

8288
infra-init: check-infra-params ## Initialize infrastructure (Terraform init)
83-
@echo "Initializing infrastructure for $(ENVIRONMENT) on $(PROVIDER)..."
84-
$(SCRIPTS_DIR)/provision-infrastructure.sh $(ENVIRONMENT) $(PROVIDER) init
89+
@echo "Initializing infrastructure with environment file: $(ENVIRONMENT_FILE)"
90+
ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/provision-infrastructure.sh init
8591

8692
infra-plan: check-infra-params ## Plan infrastructure changes
87-
@echo "Planning infrastructure for $(ENVIRONMENT) on $(PROVIDER)..."
88-
$(SCRIPTS_DIR)/provision-infrastructure.sh $(ENVIRONMENT) $(PROVIDER) plan
93+
@echo "Planning infrastructure with environment file: $(ENVIRONMENT_FILE)"
94+
ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/provision-infrastructure.sh plan
8995

9096
infra-apply: check-infra-params ## Provision infrastructure (platform setup)
91-
@echo "Provisioning infrastructure for $(ENVIRONMENT) on $(PROVIDER)..."
97+
@echo "Provisioning infrastructure with environment file: $(ENVIRONMENT_FILE)"
9298
@echo "⚠️ This command may prompt for your password for sudo operations"
9399
@if [ "$(SKIP_WAIT)" = "true" ]; then \
94100
echo "⚠️ SKIP_WAIT=true - Infrastructure will not wait for full readiness"; \
95101
else \
96102
echo "ℹ️ Infrastructure will wait for full readiness (use SKIP_WAIT=true to skip)"; \
97103
fi
98-
SKIP_WAIT=$(SKIP_WAIT) $(SCRIPTS_DIR)/provision-infrastructure.sh $(ENVIRONMENT) $(PROVIDER) apply
104+
SKIP_WAIT=$(SKIP_WAIT) ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/provision-infrastructure.sh apply
99105

100106
infra-destroy: check-infra-params ## Destroy infrastructure
101-
@echo "Destroying infrastructure for $(ENVIRONMENT) on $(PROVIDER)..."
102-
$(SCRIPTS_DIR)/provision-infrastructure.sh $(ENVIRONMENT) $(PROVIDER) destroy
107+
@echo "Destroying infrastructure with environment file: $(ENVIRONMENT_FILE)"
108+
ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/provision-infrastructure.sh destroy
103109

104110
infra-status: check-infra-params ## Show infrastructure status
105111
@echo "Infrastructure status for $(ENVIRONMENT) on $(PROVIDER):"
@@ -127,26 +133,44 @@ infra-providers: ## List available infrastructure providers
127133
@echo " hetzner - Hetzner Cloud for production deployments"
128134
@echo ""
129135
@echo "Usage examples:"
130-
@echo " make infra-apply ENVIRONMENT=development PROVIDER=libvirt"
131-
@echo " make infra-apply ENVIRONMENT=staging PROVIDER=digitalocean"
132-
@echo " make infra-apply ENVIRONMENT=production PROVIDER=hetzner"
136+
@echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
137+
@echo " make infra-apply ENVIRONMENT_TYPE=staging ENVIRONMENT_FILE=staging-digitalocean"
138+
@echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
133139

134-
infra-environments: ## List available environments
135-
@echo "Available Environments:"
140+
infra-environments: ## List available environments and their providers
141+
@echo "Available Environment Configurations:"
142+
@echo ""
136143
@echo "Templates (infrastructure/config/templates/environments/):"
137-
@ls infrastructure/config/templates/environments/*.env.tpl 2>/dev/null | \
138-
xargs -I {} basename {} | sed 's/\.env.*//g' | sort | uniq || \
139-
echo " No templates found"
144+
@ls infrastructure/config/templates/environments/*.defaults 2>/dev/null | \
145+
xargs -I {} basename {} .defaults | sort | sed 's/^/ /' || \
146+
echo " No template defaults found"
140147
@echo ""
141148
@echo "User configurations (infrastructure/config/environments/):"
142-
@ls infrastructure/config/environments/*.env 2>/dev/null | \
143-
xargs -I {} basename {} | sed 's/\.env.*//g' | sort | uniq || \
144-
echo " No user configs found"
149+
@if ls infrastructure/config/environments/*.env >/dev/null 2>&1; then \
150+
for file in infrastructure/config/environments/*.env; do \
151+
if [ -f "$$file" ]; then \
152+
env=$$(grep "^ENVIRONMENT_TYPE=" "$$file" 2>/dev/null | cut -d'=' -f2 | tr -d '"' | tr -d "'"); \
153+
provider=$$(grep "^PROVIDER=" "$$file" 2>/dev/null | cut -d'=' -f2 | tr -d '"' | tr -d "'"); \
154+
filename=$$(basename "$$file" .env); \
155+
echo " $$filename -> Environment: $$env, Provider: $$provider"; \
156+
fi \
157+
done; \
158+
else \
159+
echo " No user configs found"; \
160+
fi
145161
@echo ""
146162
@echo "Environment types:"
147163
@echo " development - Local development and testing"
164+
@echo " testing - General testing (reserved for future use)"
165+
@echo " e2e - End-to-end testing"
148166
@echo " staging - Pre-production testing"
149167
@echo " production - Production deployment"
168+
@echo ""
169+
@echo "Usage examples:"
170+
@echo " make infra-config-development PROVIDER=libvirt # Create development-libvirt.env"
171+
@echo " make infra-config-production PROVIDER=hetzner # Create production-hetzner.env"
172+
@echo " make infra-apply ENVIRONMENT_TYPE=development ENVIRONMENT_FILE=development-libvirt"
173+
@echo " make infra-apply ENVIRONMENT_TYPE=production ENVIRONMENT_FILE=production-hetzner"
150174

151175
provider-info: ## Show provider information (requires PROVIDER=<name>)
152176
@if [ -z "$(PROVIDER)" ]; then \
@@ -157,13 +181,60 @@ provider-info: ## Show provider information (requires PROVIDER=<name>)
157181
@echo "Getting information for provider: $(PROVIDER)"
158182
@$(SCRIPTS_DIR)/providers/provider-interface.sh info $(PROVIDER)
159183

160-
infra-config-development: ## Generate development environment configuration
161-
@echo "Configuring development environment..."
162-
$(SCRIPTS_DIR)/configure-env.sh development
184+
infra-config-development: ## Generate development environment configuration (requires PROVIDER=<name>)
185+
@if [ -z "$(PROVIDER)" ]; then \
186+
echo "Error: PROVIDER not specified"; \
187+
echo "Usage: make infra-config-development PROVIDER=<provider>"; \
188+
echo "Available providers: libvirt, hetzner"; \
189+
echo "Example: make infra-config-development PROVIDER=libvirt"; \
190+
exit 1; \
191+
fi
192+
@echo "Configuring development environment for $(PROVIDER)..."
193+
$(SCRIPTS_DIR)/configure-env.sh development $(PROVIDER)
194+
195+
infra-config-production: ## Generate production environment configuration (requires PROVIDER=<name>)
196+
@if [ -z "$(PROVIDER)" ]; then \
197+
echo "Error: PROVIDER not specified"; \
198+
echo "Usage: make infra-config-production PROVIDER=<provider>"; \
199+
echo "Available providers: libvirt, hetzner"; \
200+
echo "Example: make infra-config-production PROVIDER=hetzner"; \
201+
exit 1; \
202+
fi
203+
@echo "Configuring production environment for $(PROVIDER)..."
204+
$(SCRIPTS_DIR)/configure-env.sh production $(PROVIDER)
205+
206+
infra-config-e2e: ## Generate e2e environment configuration (requires PROVIDER=<name>)
207+
@if [ -z "$(PROVIDER)" ]; then \
208+
echo "Error: PROVIDER not specified"; \
209+
echo "Usage: make infra-config-e2e PROVIDER=<provider>"; \
210+
echo "Available providers: libvirt, hetzner"; \
211+
echo "Example: make infra-config-e2e PROVIDER=libvirt"; \
212+
exit 1; \
213+
fi
214+
@echo "Configuring e2e environment for $(PROVIDER)..."
215+
$(SCRIPTS_DIR)/configure-env.sh e2e $(PROVIDER)
216+
217+
infra-config-testing: ## Generate testing environment configuration (requires PROVIDER=<name>)
218+
@if [ -z "$(PROVIDER)" ]; then \
219+
echo "Error: PROVIDER not specified"; \
220+
echo "Usage: make infra-config-testing PROVIDER=<provider>"; \
221+
echo "Available providers: libvirt, hetzner"; \
222+
echo "Example: make infra-config-testing PROVIDER=libvirt"; \
223+
exit 1; \
224+
fi
225+
@echo "Configuring testing environment for $(PROVIDER)..."
226+
$(SCRIPTS_DIR)/configure-env.sh testing $(PROVIDER)
163227

164-
infra-config-production: ## Generate production environment configuration
165-
@echo "Configuring production environment..."
166-
$(SCRIPTS_DIR)/configure-env.sh production
228+
infra-config-staging: ## Generate staging environment configuration (requires PROVIDER=<name>)
229+
@if [ -z "$(PROVIDER)" ]; then \
230+
echo "Error: PROVIDER not specified"; \
231+
echo "Usage: make infra-config-staging PROVIDER=<provider>"; \
232+
echo "Available providers: libvirt, hetzner"; \
233+
echo "Example: make infra-config-staging PROVIDER=hetzner"; \
234+
exit 1; \
235+
fi
236+
@echo "Configuring staging environment for $(PROVIDER)..."
237+
$(SCRIPTS_DIR)/configure-env.sh staging $(PROVIDER)
167238

168239
infra-validate-config: ## Validate configuration for all environments
169240
@echo "Validating configuration..."
@@ -187,21 +258,21 @@ infra-test-local: ## Run local-only infrastructure tests (requires virtualizatio
187258
# =============================================================================
188259

189260
app-deploy: ## Deploy application (Twelve-Factor Build + Release + Run stages)
190-
@echo "Deploying application for $(ENVIRONMENT)..."
261+
@echo "Deploying application for $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)..."
191262
@if [ "$(SKIP_WAIT)" = "true" ]; then \
192263
echo "⚠️ SKIP_WAIT=true - Application will not wait for service readiness"; \
193264
else \
194265
echo "ℹ️ Application will wait for service readiness (use SKIP_WAIT=true to skip)"; \
195266
fi
196-
SKIP_WAIT=$(SKIP_WAIT) $(SCRIPTS_DIR)/deploy-app.sh $(ENVIRONMENT)
267+
SKIP_WAIT=$(SKIP_WAIT) ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/deploy-app.sh $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)
197268

198269
app-redeploy: ## Redeploy application without infrastructure changes
199-
@echo "Redeploying application for $(ENVIRONMENT)..."
200-
$(SCRIPTS_DIR)/deploy-app.sh $(ENVIRONMENT)
270+
@echo "Redeploying application for $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)..."
271+
ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/deploy-app.sh $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)
201272

202273
app-health-check: ## Validate deployment health
203-
@echo "Running health check for $(ENVIRONMENT)..."
204-
$(SCRIPTS_DIR)/health-check.sh $(ENVIRONMENT)
274+
@echo "Running health check for $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)..."
275+
ENVIRONMENT_TYPE=$(ENVIRONMENT_TYPE) ENVIRONMENT_FILE=$(ENVIRONMENT_FILE) $(SCRIPTS_DIR)/health-check.sh $(ENVIRONMENT_TYPE)-$(ENVIRONMENT_FILE)
205276

206277
app-test-config: ## Test application configuration
207278
@echo "Testing application configuration..."

infrastructure/config/templates/environments/base.env.tpl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
# ${ENVIRONMENT_DESCRIPTION}
22
# ${ENVIRONMENT_INSTRUCTIONS}
33

4+
# === ENVIRONMENT IDENTIFICATION ===
45
ENVIRONMENT=${ENVIRONMENT}
6+
7+
# === PROVIDER IDENTIFICATION ===
8+
PROVIDER=${PROVIDER}
9+
510
GENERATION_DATE=$(date '+%Y-%m-%d %H:%M:%S')
611

712
${TEMPLATE_PROCESSING_VARS}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# E2E Test Environment Configuration Defaults
2+
# These values are used for end-to-end testing environments
3+
4+
# Environment description
5+
ENVIRONMENT_DESCRIPTION="E2E Test Environment Configuration"
6+
ENVIRONMENT_INSTRUCTIONS="Generated from base template for end-to-end testing"
7+
8+
# Template variables
9+
TEMPLATE_PROCESSING_VARS="# Template processing variables\nDOLLAR=$"
10+
11+
# VM Configuration for E2E testing
12+
VM_NAME=torrust-tracker-e2e
13+
VM_MEMORY=2048 # 2GB RAM for testing
14+
VM_VCPUS=2 # 2 CPU cores
15+
VM_DISK_SIZE=20 # 20GB disk
16+
PERSISTENT_DATA_SIZE=20 # 20GB for data
17+
SSH_PUBLIC_KEY="" # To be replaced with actual key
18+
USE_MINIMAL_CONFIG=false # Use full configuration for testing
19+
20+
# Secrets description
21+
SECRETS_DESCRIPTION="" # No special description for secrets
22+
23+
# Database Secrets (testing values)
24+
MYSQL_ROOT_PASSWORD=root_secret_e2e
25+
MYSQL_DATABASE=torrust_tracker_e2e
26+
MYSQL_USER=torrust
27+
MYSQL_PASSWORD=tracker_secret_e2e
28+
29+
# Tracker API Token (testing value)
30+
TRACKER_ADMIN_TOKEN=MyAccessToken
31+
32+
# Grafana Admin (testing values)
33+
GF_SECURITY_ADMIN_USER=admin
34+
GF_SECURITY_ADMIN_PASSWORD=admin_password_e2e
35+
36+
# SSL Configuration (testing)
37+
DOMAIN_NAME=e2e.test.local
38+
39+
ENABLE_SSL=false # Disable SSL for faster E2E tests
40+
41+
# Runtime Configuration
42+
USER_ID=1000
43+
44+
# E2E-specific optimizations
45+
ENABLE_DB_BACKUPS=false # Disable backups for faster tests
46+
BACKUP_RETENTION_DAYS=1 # Minimal retention
47+
48+
# Performance settings optimized for testing
49+
MYSQL_INNODB_BUFFER_POOL_SIZE=128M
50+
MYSQL_MAX_CONNECTIONS=50
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Testing Environment Configuration Defaults
2+
# These values are used for general testing environments (not E2E)
3+
4+
# Environment description
5+
ENVIRONMENT_DESCRIPTION="Testing Environment Configuration"
6+
ENVIRONMENT_INSTRUCTIONS="Generated from base template for general testing"
7+
8+
# Template variables
9+
TEMPLATE_PROCESSING_VARS="# Template processing variables\nDOLLAR=$"
10+
11+
# VM Configuration for testing
12+
VM_NAME=torrust-tracker-test
13+
VM_MEMORY=2048 # 2GB RAM for testing
14+
VM_VCPUS=2 # 2 CPU cores
15+
VM_DISK_SIZE=20 # 20GB disk
16+
PERSISTENT_DATA_SIZE=20 # 20GB for data
17+
SSH_PUBLIC_KEY="" # To be replaced with actual key
18+
USE_MINIMAL_CONFIG=false # Use full configuration for testing
19+
20+
# Secrets description
21+
SECRETS_DESCRIPTION="" # No special description for secrets
22+
23+
# Database Secrets (testing values)
24+
MYSQL_ROOT_PASSWORD=root_secret_test
25+
MYSQL_DATABASE=torrust_tracker_test
26+
MYSQL_USER=torrust
27+
MYSQL_PASSWORD=tracker_secret_test
28+
29+
# Tracker API Token (testing value)
30+
TRACKER_ADMIN_TOKEN=MyAccessToken
31+
32+
# Grafana Admin (testing values)
33+
GF_SECURITY_ADMIN_USER=admin
34+
GF_SECURITY_ADMIN_PASSWORD=admin_password_test
35+
36+
# SSL Configuration (testing)
37+
DOMAIN_NAME=testing.test.local
38+
39+
ENABLE_SSL=false # Disable SSL for faster tests
40+
41+
# Runtime Configuration
42+
USER_ID=1000
43+
44+
# Testing-specific settings
45+
ENABLE_DB_BACKUPS=false # Disable backups for testing
46+
BACKUP_RETENTION_DAYS=1 # Minimal retention
47+
48+
# Performance settings optimized for testing
49+
MYSQL_INNODB_BUFFER_POOL_SIZE=128M
50+
MYSQL_MAX_CONNECTIONS=50

0 commit comments

Comments
 (0)