-
Notifications
You must be signed in to change notification settings - Fork 267
Expand file tree
/
Copy pathMakefile
More file actions
291 lines (221 loc) · 9.53 KB
/
Copy pathMakefile
File metadata and controls
291 lines (221 loc) · 9.53 KB
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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
SHELL := /usr/bin/env bash
.SHELLFLAGS := -eu -o pipefail -c
.DELETE_ON_ERROR:
# Tools
CARGO ?= cargo
DOCKER ?= docker
DOCKER_COMPOSE ?= docker compose
DEPLOY_COMPOSE_FILE ?= deploy/docker-compose.yml
APT_MIRROR_BASE ?=
KUBECTL ?= kubectl
K8S_NAMESPACE ?= agentenv-system
K8S_RUNTIME_IMAGE ?= agentenv-runtime:latest
K8S_GATEWAY_IMAGE ?= agentenv-gateway:latest
K8S_SCHEDULER_IMAGE ?= agentenv-scheduler:latest
K3S_CTR ?= sudo k3s ctr
# aenv home path.
AENV_HOME_PATH ?= /var/lib/aenv
export AENV_HOME_PATH
# aenv CLI install location. Override with AENV_INSTALL_PREFIX=~/.local for a
# user-local install; AENV_INSTALL_PREFIX=/usr/local requires sudo.
AENV_INSTALL_PREFIX ?= /usr/local
AENV_INSTALL_DIR := $(AENV_INSTALL_PREFIX)/bin
# Runner used to execute the `install` / `rm` commands that write to
# $(AENV_INSTALL_DIR). Defaults to sudo because the default prefix is
# /usr/local; override to empty (AENV_INSTALL_SUDO=) for a user-local prefix.
AENV_INSTALL_SUDO ?= sudo
# Script entrypoints
TEST_SCRIPTS_DIR := ./scripts/tests
# Runner for tests that require AENV's network and namespace capabilities.
CARGO_HOST_TARGET_ENV = $(shell $(CARGO) -vV | sed -n 's/^host: //p' | tr '[:lower:]-' '[:upper:]_')
CAPABILITY_RUNNER = CARGO_TARGET_$(CARGO_HOST_TARGET_ENV)_RUNNER="$(CURDIR)/scripts/run-with-capabilities.sh"
AENV_TEST_STATE_ID ?= $(if $(GITHUB_RUN_ID),$(GITHUB_RUN_ID)-$(GITHUB_RUN_ATTEMPT),local-$$(id -u))
AENV_TEST_STATE_DIR ?= /tmp/aenv-test-$(AENV_TEST_STATE_ID)
AENV_TEST_DEPS_PATH ?= $(if $(AENV_DEPS_PATH),$(AENV_DEPS_PATH),/var/lib/aenv/deps)
CAPABILITY_TEST_ENV := AENV_HOME_PATH="$(AENV_TEST_STATE_DIR)/home" AENV_RUNTIME_PATH="$(AENV_TEST_STATE_DIR)/run" AENV_DEPS_PATH="$(AENV_TEST_DEPS_PATH)"
UVM_UBLK_DAEMON_INSTALL_PATH := $(AENV_HOME_PATH)/ublk/uvm-ublk-daemon
DEBUG_PROFILE_DIR := $${CARGO_TARGET_DIR:-$$(pwd)/target}/debug
# Build profile: debug for dev/test targets, release for explicit release and
# benchmark targets.
PROFILE ?= debug
CARGO_PROFILE_FLAG = $(if $(filter release,$(PROFILE)),--release,)
TARGET_PROFILE_DIR = $${CARGO_TARGET_DIR:-$$(pwd)/target}/$(PROFILE)
.PHONY: all build release \
build-server build-server-release \
build-snapshot-image \
build-aenv build-aenv-release install-aenv uninstall-aenv \
build-ublk install-ublk \
fmt clippy \
mutants coverage \
test test-unit test-integration prepare-agent-test-state test-agent test-agent-integration test-envd test-ublk \
test-e2e test-e2e-compose test-e2e-k8s test-e2e-all \
bench bench-snapshot bench-ublk bench-orchestrator-store \
ci-deps ci-deps-protoc \
firecracker-client envd-http-client agentenv-server custom-extension-client start-server start-server-release \
services gateway scheduler \
deploy-build deploy-up deploy-up-no-build deploy-down deploy-logs deploy-ps \
k8s-build k8s-redeploy k8s-load-dev k8s-refresh-dev \
k8s-render k8s-apply k8s-delete \
k8s-render-dev k8s-apply-dev k8s-delete-dev \
docs docs-serve
all: build
build:
$(CARGO) build
release:
$(CARGO) build --release
build-server:
$(CARGO) build -p agentenv --bin server
build-server-release:
$(CARGO) build --release -p agentenv --bin server
build-snapshot-image:
$(CARGO) build -p agentenv --bin aenv-snapshot-image
build-aenv:
$(CARGO) build -p aenv
build-aenv-release:
$(CARGO) build --release -p aenv
install-aenv: build-aenv-release
$(AENV_INSTALL_SUDO) install -d "$(AENV_INSTALL_DIR)"
$(AENV_INSTALL_SUDO) install -m 0755 "$${CARGO_TARGET_DIR:-$$(pwd)/target}/release/aenv" "$(AENV_INSTALL_DIR)/aenv"
@echo "Installed aenv to $(AENV_INSTALL_DIR)/aenv"
uninstall-aenv:
$(AENV_INSTALL_SUDO) rm -f "$(AENV_INSTALL_DIR)/aenv"
@echo "Removed $(AENV_INSTALL_DIR)/aenv"
fmt:
$(CARGO) fmt --all -- --check
clippy:
$(CARGO) clippy --workspace --all-targets --all-features -- -D warnings
mutants:
$(CARGO) adev mutants
coverage:
$(MAKE) install-ublk PROFILE=debug
PATH="$${CARGO_TARGET_DIR:-$$(pwd)/target}/debug:$$PATH" \
$(CARGO) adev coverage
test: test-agent test-envd test-ublk
test-unit:
$(CARGO) test -p agentenv -p envd -p linux-cap --lib
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p agentenv --lib -- --ignored
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p uvm-ublk -p uvm-ublk-daemon --lib
bash scripts/tests/verify-capability-runner.sh
bash scripts/tests/verify-install-service.sh
test-integration: test-agent-integration test-envd test-ublk
prepare-agent-test-state:
$(CAPABILITY_TEST_ENV) $(CARGO) run --bin server -- --setup-only
test-agent: prepare-agent-test-state
$(MAKE) build-ublk PROFILE=debug
export PATH="$(DEBUG_PROFILE_DIR):$$PATH"; \
export AENV_UBLK_DAEMON_BINARY_PATH="$(DEBUG_PROFILE_DIR)/uvm-ublk-daemon"; \
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p agentenv; \
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p agentenv --lib -- --ignored
test-agent-integration: prepare-agent-test-state
$(MAKE) build-ublk PROFILE=debug
PATH="$(DEBUG_PROFILE_DIR):$$PATH" \
AENV_UBLK_DAEMON_BINARY_PATH="$(DEBUG_PROFILE_DIR)/uvm-ublk-daemon" \
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p agentenv \
--test integration \
--test orchestrator_integration
PATH="$(DEBUG_PROFILE_DIR):$$PATH" \
AENV_UBLK_DAEMON_BINARY_PATH="$(DEBUG_PROFILE_DIR)/uvm-ublk-daemon" \
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p agentenv-e2e-tests --test snapshot_oss_e2e_test -- --ignored
build-ublk:
$(CARGO) build $(CARGO_PROFILE_FLAG) -p uvm-ublk -p uvm-ublk-daemon
install-ublk: build-ublk
$(AENV_INSTALL_SUDO) mkdir -p "$$(dirname "$(UVM_UBLK_DAEMON_INSTALL_PATH)")"
$(AENV_INSTALL_SUDO) cp "$(TARGET_PROFILE_DIR)/uvm-ublk-daemon" "$(UVM_UBLK_DAEMON_INSTALL_PATH)"
$(AENV_INSTALL_SUDO) chmod 0755 "$(UVM_UBLK_DAEMON_INSTALL_PATH)"
test-envd:
bash $(TEST_SCRIPTS_DIR)/test_envd.sh
test-ublk:
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p uvm-ublk -p overlaybd -p uvm-ublk-daemon
$(CAPABILITY_TEST_ENV) $(CAPABILITY_RUNNER) $(CARGO) test -p overlaybd --test oss_backend_minio -- --ignored
bench:
$(MAKE) install-ublk PROFILE=release
$(CAPABILITY_RUNNER) $(CARGO) bench -p agentenv-benchmarks
bench-snapshot:
$(MAKE) install-ublk PROFILE=release
$(CAPABILITY_RUNNER) $(CARGO) bench -p agentenv-benchmarks --bench snapshot
bench-ublk:
$(MAKE) install-ublk PROFILE=release
$(CAPABILITY_RUNNER) $(CARGO) bench -p agentenv-benchmarks --bench ublk_overlaybd
bench-orchestrator-store:
$(CARGO) bench -p agentenv-benchmarks --bench orchestrator_store
OCI_IMAGE ?=
bench-oci-conversion:
$(if $(OCI_IMAGE),AGENTENV_BENCH_OCI_IMAGE="$(OCI_IMAGE)") $(CARGO) bench -p agentenv-benchmarks --bench oci_conversion_pipeline
ci-deps:
$(MAKE) ci-deps-protoc
ci-deps-protoc:
$(CARGO) adev codegen --ensure-deps-only
firecracker-client:
$(CARGO) adev codegen firecracker
envd-http-client:
$(CARGO) adev codegen envd
agentenv-server:
$(CARGO) adev codegen server
custom-extension-client:
$(CARGO) adev codegen custom-extension
test-e2e:
$(MAKE) install-ublk PROFILE=debug
bash $(TEST_SCRIPTS_DIR)/e2e/run_e2e.sh
test-e2e-compose:
APT_MIRROR_BASE="$(APT_MIRROR_BASE)" E2E_MODE=compose bash $(TEST_SCRIPTS_DIR)/e2e/run_e2e.sh
test-e2e-k8s:
APT_MIRROR_BASE="$(APT_MIRROR_BASE)" E2E_MODE=k8s bash $(TEST_SCRIPTS_DIR)/e2e/run_e2e.sh
test-e2e-all: test-e2e test-e2e-compose test-e2e-k8s
start-server:
$(MAKE) install-ublk PROFILE=debug
$(CAPABILITY_RUNNER) $(CARGO) run --bin server
start-server-release:
$(MAKE) install-ublk PROFILE=release
$(CAPABILITY_RUNNER) $(CARGO) run --release --bin server
deploy-up:
APT_MIRROR_BASE="$(APT_MIRROR_BASE)" $(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) up --build -d
deploy-build:
APT_MIRROR_BASE="$(APT_MIRROR_BASE)" $(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) build
deploy-up-no-build:
$(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) up -d
deploy-down:
$(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) down --remove-orphans
deploy-logs:
$(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) logs -f
deploy-ps:
$(DOCKER_COMPOSE) -f $(DEPLOY_COMPOSE_FILE) ps
k8s-build:
$(DOCKER) build $(if $(APT_MIRROR_BASE),--build-arg APT_MIRROR_BASE="$(APT_MIRROR_BASE)",) -f deploy/docker/Dockerfile.agentenv -t $(K8S_RUNTIME_IMAGE) .
$(DOCKER) build -f deploy/docker/Dockerfile.gateway -t $(K8S_GATEWAY_IMAGE) .
$(DOCKER) build -f deploy/docker/Dockerfile.scheduler -t $(K8S_SCHEDULER_IMAGE) .
k8s-redeploy:
$(KUBECTL) rollout restart deploy/agentenv-gateway -n $(K8S_NAMESPACE)
$(KUBECTL) rollout restart deploy/agentenv-scheduler -n $(K8S_NAMESPACE)
$(KUBECTL) rollout restart ds/agentenv-node -n $(K8S_NAMESPACE)
$(KUBECTL) rollout status deploy/agentenv-gateway -n $(K8S_NAMESPACE)
$(KUBECTL) rollout status deploy/agentenv-scheduler -n $(K8S_NAMESPACE)
$(KUBECTL) rollout status ds/agentenv-node -n $(K8S_NAMESPACE)
k8s-load-dev:
$(DOCKER) save $(K8S_RUNTIME_IMAGE) | $(K3S_CTR) images import -
$(DOCKER) save $(K8S_GATEWAY_IMAGE) | $(K3S_CTR) images import -
$(DOCKER) save $(K8S_SCHEDULER_IMAGE) | $(K3S_CTR) images import -
k8s-refresh-dev: k8s-build k8s-load-dev k8s-redeploy
k8s-render:
bash deploy/k8s/run.sh render
k8s-apply:
bash deploy/k8s/run.sh apply
k8s-delete:
bash deploy/k8s/run.sh delete
k8s-render-dev:
K8S_OVERLAY=local-dev bash deploy/k8s/run.sh render
k8s-apply-dev:
K8S_OVERLAY=local-dev bash deploy/k8s/run.sh apply
k8s-delete-dev:
K8S_OVERLAY=local-dev bash deploy/k8s/run.sh delete
services-%:
$(MAKE) -C services $*
gateway-%:
$(MAKE) -C services/gateway $*
scheduler-%:
$(MAKE) -C services/scheduler $*
docs/src/openapi.yml:
ln -sf ../../src/api/openapi.yml docs/src/openapi.yml
docs: docs/src/openapi.yml
mdbook build docs
docs-serve: docs/src/openapi.yml
mdbook serve docs --open