SHELL := /bin/bash tag := latest workerTag := latest workerPlatform := linux/$(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/') runnerTag := latest runnerPlatform := linux/$(shell uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/') runnerVersions ?= 3.12 3.11 3.10 3.9 3.8 BENCH_SDK_PYTHON ?= uv run --project ./sdk --no-sync python CACHE_BENCHMARK_FILE_PLAN ?= CACHE_BENCH_PROFILE ?= CACHE_BENCH_CONFIG ?= TOKEN ?= .PHONY: start stop start-stage stop-stage startup-benchmark startup-benchmark-build sandbox-parallel-benchmark sandbox-stage-cold-benchmark sandbox-stage-warm-benchmark cache-benchmark bench-cache-smoke worker-e2e-tag worker-e2e-check worker-e2e-push setup: bash bin/setup.sh make k3d-up runner worker gateway # helm install beta9 deploy/charts/beta9 --create-namespace --values deploy/charts/beta9/values.local.yaml kustomize build --enable-helm manifests/kustomize/overlays/cluster-dev | kubectl apply -f- startup-benchmark: PYTHONPATH="$(CURDIR)/sdk/src:$(PYTHONPATH)" \ BENCH_SDK_PYTHON="$(BENCH_SDK_PYTHON)" \ "$(CURDIR)/bin/bench" startup $(ARGS) startup-benchmark-build: docker build . --target build -f ./docker/Dockerfile.gateway -t localhost:5001/beta9-gateway:$(tag) docker push localhost:5001/beta9-gateway:$(tag) docker build . --target final --platform=$(workerPlatform) --build-arg BASE_STAGE=dev -f ./docker/Dockerfile.worker -t localhost:5001/beta9-worker:$(workerTag) docker push localhost:5001/beta9-worker:$(workerTag) $(MAKE) startup-benchmark BENCH_INSTALL=1 sandbox-parallel-benchmark: PYTHONPATH="$(CURDIR)/sdk/src:$(PYTHONPATH)" \ BENCH_SDK_PYTHON="$(BENCH_SDK_PYTHON)" \ "$(CURDIR)/bin/bench" sandbox $(ARGS) sandbox-stage-cold-benchmark: $(MAKE) sandbox-parallel-benchmark ARGS="--profile staging --suite sandbox-stage-cold $(ARGS)" sandbox-stage-warm-benchmark: $(MAKE) sandbox-parallel-benchmark ARGS="--profile staging --suite sandbox-stage-warm $(ARGS)" cache-benchmark: PYTHONPATH="$(CURDIR)/sdk/src:$(PYTHONPATH)" \ BENCH_SDK_PYTHON="$(BENCH_SDK_PYTHON)" \ CACHE_BENCHMARK_FILE_PLAN="$(CACHE_BENCHMARK_FILE_PLAN)" \ CACHE_BENCH_PROFILE="$(CACHE_BENCH_PROFILE)" \ CACHE_BENCH_CONFIG="$(CACHE_BENCH_CONFIG)" \ TOKEN="$(TOKEN)" \ "$(CURDIR)/bin/bench" cache $(ARGS) bench-cache-smoke: PYTHONPATH="$(CURDIR)/sdk/src:$(PYTHONPATH)" \ BENCH_SDK_PYTHON="$(BENCH_SDK_PYTHON)" \ "$(CURDIR)/bin/bench" cache --suite cache-smoke $(ARGS) setup-sdk: @if ! command -v uv &> /dev/null; then \ echo "uv is not installed, installing..."; \ pip install uv; \ fi @uv sync --directory ./sdk @exec $${SHELL} -c "source ./sdk/.venv/bin/activate && exec $${SHELL}" k3d-up: bash bin/k3d.sh up k3d-down: bash bin/k3d.sh down k3d-rebuild: make k3d-down make k3d-up kustomize build --enable-helm manifests/kustomize/overlays/cluster-dev | kubectl apply -f- gateway: docker build . --target build -f ./docker/Dockerfile.gateway -t localhost:5001/beta9-gateway:$(tag) docker push localhost:5001/beta9-gateway:$(tag) worker: docker build . --target final --platform=$(workerPlatform) --build-arg BASE_STAGE=dev -f ./docker/Dockerfile.worker -t localhost:5001/beta9-worker:$(workerTag) docker push localhost:5001/beta9-worker:$(workerTag) BENCH_NAMESPACE="$(BENCH_NAMESPACE)" bin/delete_workers.sh worker-e2e-tag: @./hack/worker-e2e-image.sh tag worker-e2e-check: @./hack/worker-e2e-image.sh check worker-e2e-push: @./hack/worker-e2e-image.sh push runner: runner-python runner-micromamba # Build just one native runner with: make runner-python runnerVersions=3.12 .PHONY: runner runner-python runner-micromamba define build-runner set -e; for version in $(runnerVersions); do \ target=$(1); \ docker build . --target $(2) --platform=$(runnerPlatform) -f ./docker/Dockerfile.runner $(3) -t localhost:5001/beta9-runner:$$target-$(runnerTag) --progress=plain; \ docker push localhost:5001/beta9-runner:$$target-$(runnerTag); \ done endef runner-python: $(call build-runner,py$${version//./},$$target) runner-micromamba: $(call build-runner,micromamba$$version,micromamba,--build-arg PYTHON_VERSION=$$version) # Local (k3d) and staging (EKS) okteto sessions can run side by side. Okteto # stores session state under $OKTETO_FOLDER//, keyed by name # rather than cluster, so both sessions (beta9/beta9-gateway) would otherwise # share one okteto.pid and take turns killing each other. Staging gets its own # folder, and both pass --context/--namespace explicitly so neither depends on # (or clobbers) the global current context. LOCAL_OKTETO_CONTEXT ?= k3d-beta9 LOCAL_OKTETO_NAMESPACE ?= beta9 STAGE_OKTETO_CONTEXT ?= arn:aws:eks:us-east-1:683656326989:cluster/eks-stage-01 STAGE_OKTETO_NAMESPACE ?= beta9 STAGE_OKTETO_FOLDER ?= $(HOME)/.okteto-stage STAGE_CONFIG_PATH ?= /etc/beta9/config.yaml OKTETO_LOCAL_FLAGS := --context $(LOCAL_OKTETO_CONTEXT) --namespace $(LOCAL_OKTETO_NAMESPACE) OKTETO_STAGE_FLAGS := --context $(STAGE_OKTETO_CONTEXT) --namespace $(STAGE_OKTETO_NAMESPACE) OKTETO_STAGE := mkdir -p $(STAGE_OKTETO_FOLDER) && OKTETO_FOLDER=$(STAGE_OKTETO_FOLDER) okteto start: @if [ -f config.yaml ]; then \ cd hack && okteto up $(OKTETO_LOCAL_FLAGS) --file okteto.yaml --env CONFIG_PATH=/workspace/config.yaml; \ else \ cd hack && okteto up $(OKTETO_LOCAL_FLAGS) --file okteto.yaml; \ fi clear-ports: @echo "Killing processes on ports 1993, 1994, and 8008..." @lsof -t -i :1993,1994,8008 | xargs -r sudo kill -9 2>/dev/null || true stop: cd hack && okteto down $(OKTETO_LOCAL_FLAGS) --file okteto.yaml # Staging gateway on eks-stage-01 (see hack/okteto.stage.yaml). Forwards to # localhost:11993/11994 so it never collides with the local session. start-stage: @umask 077; if [ -d hack/stage/gomodcache/cache/download/github.com/beam-cloud ]; then \ tar -cf hack/stage/gomodcache.tar -C hack/stage/gomodcache cache/download/github.com/beam-cloud; \ else \ tar -cf hack/stage/gomodcache.tar -T /dev/null; \ fi cd hack && export STAGE_GATEWAY_IMAGE="$${STAGE_GATEWAY_IMAGE:-$$(kubectl --context '$(STAGE_OKTETO_CONTEXT)' -n '$(STAGE_OKTETO_NAMESPACE)' get deploy beta9-gateway -o jsonpath='{.spec.template.spec.containers[0].image}')}" && $(OKTETO_STAGE) up $(OKTETO_STAGE_FLAGS) --file okteto.stage.yaml --env CONFIG_PATH='$(STAGE_CONFIG_PATH)' stop-stage: cd hack && $(OKTETO_STAGE) down $(OKTETO_STAGE_FLAGS) --file okteto.stage.yaml protocol: ./bin/gen_proto.sh openapi: @echo "Generating OpenAPI schemas..." @mkdir -p docs/openapi protoc -I ./googleapis -I ./pkg/types -I ./pkg/abstractions/pod/ --openapiv2_out=./docs/openapi --openapiv2_opt logtostderr=true ./pkg/abstractions/pod/pod.proto protoc -I ./googleapis -I ./pkg/abstractions/image/ --openapiv2_out=./docs/openapi --openapiv2_opt logtostderr=true ./pkg/abstractions/image/image.proto protoc -I ./googleapis -I ./pkg/types -I ./pkg/gateway/ --openapiv2_out=./docs/openapi --openapiv2_opt logtostderr=true ./pkg/gateway/gateway.proto @echo "OpenAPI schemas generated in docs/openapi/" verify-protocol: ./bin/verify_proto.sh test-pkg: go test -v ./pkg/... go test github.com/beam-cloud/clip/pkg/clip -run '^TestBatchedCodecGolden$$' bench-pkg: go test -run '^$$' -bench=. ./pkg/... # build-test runs CPU-only image build e2e checks. Set MODE=functions or # MODE=pods to run a subset; MODE=local is kept as an alias for all. build-test: PYTHONPATH=$(CURDIR)/sdk/src uv run --project sdk python e2e/build_tests/app.py $(MODE) load-test: cd e2e/load_tests && k6 run --env URL=$(URL) --env TOKEN=$(TOKEN) throughput.js sdk-init: make -C sdk init sdk-docs: make -C sdk docs sdk-tests: make -C sdk tests sdk-format: make -C sdk format sdk-build: make -C sdk build sdk-clean: make -C sdk clean sdk-publish: make -C sdk publish