aboutsummaryrefslogtreecommitdiff
path: root/test/foundationdb/Makefile
blob: ff106d7dc97ea6a69a42e7f9598b5bc5c450e9cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# SeaweedFS FoundationDB Integration Testing Makefile

# Configuration
FDB_CLUSTER_FILE ?= /tmp/fdb.cluster
SEAWEEDFS_S3_ENDPOINT ?= http://127.0.0.1:8333
TEST_TIMEOUT ?= 5m
DOCKER_COMPOSE ?= docker-compose
DOCKER_COMPOSE_ARM64 ?= docker-compose -f docker-compose.arm64.yml

# Colors for output
BLUE := \033[36m
GREEN := \033[32m
YELLOW := \033[33m
RED := \033[31m
NC := \033[0m # No Color

.PHONY: help setup test test-unit test-integration test-e2e clean logs status \
         setup-arm64 test-arm64 setup-emulated test-emulated clean-arm64

help: ## Show this help message
	@echo "$(BLUE)SeaweedFS FoundationDB Integration Testing$(NC)"
	@echo ""
	@echo "Available targets:"
	@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_][a-zA-Z0-9_-]*:.*?## / {printf "  $(GREEN)%-15s$(NC) %s\n", $$1, $$2}' $(MAKEFILE_LIST)

setup: ## Set up test environment (FoundationDB + SeaweedFS)
	@echo "$(YELLOW)Setting up FoundationDB cluster and SeaweedFS...$(NC)"
	@$(DOCKER_COMPOSE) up -d fdb1 fdb2 fdb3
	@echo "$(BLUE)Waiting for FoundationDB cluster to initialize...$(NC)"
	@sleep 15
	@$(DOCKER_COMPOSE) up -d fdb-init
	@sleep 10
	@echo "$(BLUE)Starting SeaweedFS with FoundationDB filer...$(NC)"
	@$(DOCKER_COMPOSE) up -d seaweedfs
	@echo "$(GREEN)✅ Test environment ready!$(NC)"
	@echo "$(BLUE)Checking cluster status...$(NC)"
	@make status

test: setup test-unit test-integration ## Run all tests

test-unit: ## Run unit tests for FoundationDB filer store
	@echo "$(YELLOW)Running FoundationDB filer store unit tests...$(NC)"
	@cd ../../ && go test -v -timeout=$(TEST_TIMEOUT) -tags foundationdb ./weed/filer/foundationdb/...

test-integration: ## Run integration tests with FoundationDB
	@echo "$(YELLOW)Running FoundationDB integration tests...$(NC)"
	@cd ../../ && go test -v -timeout=$(TEST_TIMEOUT) -tags foundationdb ./test/foundationdb/...

test-benchmark: ## Run performance benchmarks
	@echo "$(YELLOW)Running FoundationDB performance benchmarks...$(NC)"
	@cd ../../ && go test -v -timeout=$(TEST_TIMEOUT) -tags foundationdb -bench=. ./test/foundationdb/...

# ARM64 specific targets (Apple Silicon / M1/M2/M3 Macs)
setup-arm64: ## Set up ARM64-native FoundationDB cluster (builds from source)
	@echo "$(YELLOW)Setting up ARM64-native FoundationDB cluster...$(NC)"
	@echo "$(BLUE)Note: This will build FoundationDB from source - may take 10-15 minutes$(NC)"
	@$(DOCKER_COMPOSE_ARM64) build
	@$(DOCKER_COMPOSE_ARM64) up -d fdb1 fdb2 fdb3
	@echo "$(BLUE)Waiting for FoundationDB cluster to initialize...$(NC)"
	@sleep 20
	@$(DOCKER_COMPOSE_ARM64) up -d fdb-init
	@sleep 15
	@echo "$(BLUE)Starting SeaweedFS with FoundationDB filer...$(NC)"
	@$(DOCKER_COMPOSE_ARM64) up -d seaweedfs
	@echo "$(GREEN)✅ ARM64 test environment ready!$(NC)"

test-arm64: setup-arm64 test-unit test-integration ## Run all tests with ARM64-native FoundationDB

setup-emulated: ## Set up FoundationDB cluster with x86 emulation on ARM64
	@echo "$(YELLOW)Setting up FoundationDB cluster with x86 emulation...$(NC)"
	@echo "$(BLUE)Note: Using Docker platform emulation - may be slower$(NC)"
	@DOCKER_DEFAULT_PLATFORM=linux/amd64 $(DOCKER_COMPOSE) up -d fdb1 fdb2 fdb3
	@echo "$(BLUE)Waiting for FoundationDB cluster to initialize...$(NC)"
	@sleep 15
	@DOCKER_DEFAULT_PLATFORM=linux/amd64 $(DOCKER_COMPOSE) up -d fdb-init
	@sleep 10
	@echo "$(BLUE)Starting SeaweedFS with FoundationDB filer...$(NC)"
	@$(DOCKER_COMPOSE) up -d seaweedfs
	@echo "$(GREEN)✅ Emulated test environment ready!$(NC)"

test-emulated: setup-emulated test-unit test-integration ## Run all tests with x86 emulation

clean-arm64: ## Clean up ARM64-specific containers and volumes
	@echo "$(YELLOW)Cleaning up ARM64 test environment...$(NC)"
	@$(DOCKER_COMPOSE_ARM64) down -v --remove-orphans 2>/dev/null || true
	@echo "$(GREEN)✅ ARM64 environment cleaned up!$(NC)"

test-e2e: setup-complete ## Run end-to-end tests with SeaweedFS + FoundationDB
	@echo "$(YELLOW)Running end-to-end FoundationDB tests...$(NC)"
	@sleep 10  # Wait for SeaweedFS to be ready
	@./test_fdb_s3.sh

setup-complete: ## Start complete environment and wait for readiness
	@echo "$(YELLOW)Starting complete environment...$(NC)"
	@$(DOCKER_COMPOSE) up -d
	@echo "$(BLUE)Waiting for all services to be ready...$(NC)"
	@./wait_for_services.sh

test-crud: ## Test basic CRUD operations
	@echo "$(YELLOW)Testing CRUD operations...$(NC)"
	@cd ../../ && go test -v -timeout=$(TEST_TIMEOUT) -tags foundationdb -run TestFoundationDBCRUD ./test/foundationdb/

test-concurrent: ## Test concurrent operations
	@echo "$(YELLOW)Testing concurrent operations...$(NC)"
	@cd ../../ && go test -v -timeout=$(TEST_TIMEOUT) -tags foundationdb -run TestFoundationDBConcurrent ./test/foundationdb/

clean: ## Clean up test environment (standard + ARM64)
	@echo "$(YELLOW)Cleaning up test environment...$(NC)"
	@$(DOCKER_COMPOSE) down -v --remove-orphans 2>/dev/null || true
	@$(DOCKER_COMPOSE_ARM64) down -v --remove-orphans 2>/dev/null || true
	@echo "$(GREEN)✅ Environment cleaned up!$(NC)"

logs: ## Show logs from all services
	@$(DOCKER_COMPOSE) logs --tail=50 -f

logs-fdb: ## Show FoundationDB logs
	@$(DOCKER_COMPOSE) logs --tail=100 -f fdb1 fdb2 fdb3 fdb-init

logs-seaweedfs: ## Show SeaweedFS logs
	@$(DOCKER_COMPOSE) logs --tail=100 -f seaweedfs

status: ## Show status of all services
	@echo "$(BLUE)Service Status:$(NC)"
	@$(DOCKER_COMPOSE) ps
	@echo ""
	@echo "$(BLUE)FoundationDB Cluster Status:$(NC)"
	@$(DOCKER_COMPOSE) exec fdb-init fdbcli --exec 'status' || echo "FoundationDB not accessible"
	@echo ""
	@echo "$(BLUE)SeaweedFS S3 Status:$(NC)"
	@curl -s $(SEAWEEDFS_S3_ENDPOINT) || echo "SeaweedFS S3 not accessible"

debug: ## Debug test environment
	@echo "$(BLUE)Debug Information:$(NC)"
	@echo "FoundationDB Cluster File: $(FDB_CLUSTER_FILE)"
	@echo "SeaweedFS S3 Endpoint: $(SEAWEEDFS_S3_ENDPOINT)"
	@echo "Docker Compose Status:"
	@$(DOCKER_COMPOSE) ps
	@echo ""
	@echo "Network connectivity:"
	@docker network ls | grep foundationdb || echo "No FoundationDB network found"
	@echo ""
	@echo "FoundationDB cluster file:"
	@$(DOCKER_COMPOSE) exec fdb1 cat /var/fdb/config/fdb.cluster || echo "Cannot read cluster file"

# Development targets
dev-fdb: ## Start only FoundationDB cluster for development
	@$(DOCKER_COMPOSE) up -d fdb1 fdb2 fdb3 fdb-init
	@sleep 15

dev-test: dev-fdb ## Quick test with just FoundationDB
	@cd ../../ && go test -v -timeout=30s -tags foundationdb -run TestFoundationDBStore_Initialize ./weed/filer/foundationdb/

# Utility targets
install-deps: ## Install required dependencies
	@echo "$(YELLOW)Installing test dependencies...$(NC)"
	@which docker > /dev/null || (echo "$(RED)Docker not found$(NC)" && exit 1)
	@which docker-compose > /dev/null || (echo "$(RED)Docker Compose not found$(NC)" && exit 1)
	@which curl > /dev/null || (echo "$(RED)curl not found$(NC)" && exit 1)
	@echo "$(GREEN)✅ All dependencies available$(NC)"

check-env: ## Check test environment setup
	@echo "$(BLUE)Environment Check:$(NC)"
	@echo "FDB_CLUSTER_FILE: $(FDB_CLUSTER_FILE)"
	@echo "SEAWEEDFS_S3_ENDPOINT: $(SEAWEEDFS_S3_ENDPOINT)"
	@echo "TEST_TIMEOUT: $(TEST_TIMEOUT)"
	@make install-deps

# CI targets
ci-test: ## Run tests in CI environment
	@echo "$(YELLOW)Running CI tests...$(NC)"
	@make setup
	@make test-unit
	@make test-integration
	@make clean

ci-e2e: ## Run end-to-end tests in CI
	@echo "$(YELLOW)Running CI end-to-end tests...$(NC)"
	@make setup-complete
	@make test-e2e
	@make clean

# Container build targets
build-container: ## Build SeaweedFS with FoundationDB in container
	@echo "$(YELLOW)Building SeaweedFS with FoundationDB in container...$(NC)"
	@docker-compose -f docker-compose.build.yml build seaweedfs-fdb-builder
	@echo "$(GREEN)✅ Container build complete!$(NC)"

test-container: build-container ## Run containerized FoundationDB integration test
	@echo "$(YELLOW)Running containerized FoundationDB integration test...$(NC)"
	@docker-compose -f docker-compose.build.yml up --build --abort-on-container-exit
	@echo "$(GREEN)🎉 Containerized integration test complete!$(NC)"

extract-binary: build-container ## Extract built SeaweedFS binary from container
	@echo "$(YELLOW)Extracting SeaweedFS binary from container...$(NC)"
	@docker run --rm -v $(PWD)/bin:/output seaweedfs:foundationdb sh -c "cp /usr/local/bin/weed /output/weed-foundationdb && echo '✅ Binary extracted to ./bin/weed-foundationdb'"
	@mkdir -p bin
	@echo "$(GREEN)✅ Binary available at ./bin/weed-foundationdb$(NC)"

clean-container: ## Clean up container builds
	@echo "$(YELLOW)Cleaning up container builds...$(NC)"
	@docker-compose -f docker-compose.build.yml down -v --remove-orphans || true
	@docker rmi seaweedfs:foundationdb 2>/dev/null || true
	@echo "$(GREEN)✅ Container cleanup complete!$(NC)"

# Simple test environment targets
test-simple: ## Run tests with simplified Docker environment  
	@echo "$(YELLOW)Running simplified FoundationDB integration tests...$(NC)"
	@docker-compose -f docker-compose.simple.yml up --build --abort-on-container-exit
	@echo "$(GREEN)🎉 Simple integration tests complete!$(NC)"

test-mock: ## Run mock tests (no FoundationDB required)
	@echo "$(YELLOW)Running mock integration tests...$(NC)"
	@go test -v ./validation_test.go ./mock_integration_test.go
	@echo "$(GREEN)✅ Mock tests completed!$(NC)"

clean-simple: ## Clean up simple test environment
	@echo "$(YELLOW)Cleaning up simple test environment...$(NC)"
	@docker-compose -f docker-compose.simple.yml down -v --remove-orphans || true
	@echo "$(GREEN)✅ Simple environment cleaned up!$(NC)"

# Combined test target - guaranteed to work
test-reliable: test-mock ## Run all tests that are guaranteed to work
	@echo "$(GREEN)🎉 All reliable tests completed successfully!$(NC)"