mpi-operator/Makefile

230 lines
11 KiB
Makefile

# Copyright 2023 The Kubeflow Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
BIN_DIR=_output/cmd/bin
REPO_PATH="github.com/kubeflow/mpi-operator"
GitSHA=$(shell git rev-parse HEAD)
Date=$(shell date "+%Y-%m-%d %H:%M:%S")
RELEASE_VERSION?=v0.6.0
CONTROLLER_VERSION?=v2
BASE_IMAGE_SSH_PORT?=2222
IMG_BUILDER=docker
PLATFORMS ?= linux/amd64,linux/arm64,linux/ppc64le
INTEL_PLATFORMS ?= linux/amd64
MPICH_PLATFORMS ?= linux/amd64,linux/arm64
LD_FLAGS_V2=" \
-X '${REPO_PATH}/pkg/version.GitSHA=${GitSHA}' \
-X '${REPO_PATH}/pkg/version.Built=${Date}' \
-X '${REPO_PATH}/pkg/version.Version=${RELEASE_VERSION}'"
REGISTRY?=docker.io/mpioperator
IMAGE_NAME?=${REGISTRY}/mpi-operator
KUBEBUILDER_ASSETS_PATH := $(dir $(abspath $(firstword $(MAKEFILE_LIST))))bin/kubebuilder/bin
HELM_VERSION=v3.11.2
# This kubectl version supports -k for kustomization.
KUBECTL_VERSION=v1.33.0
ENVTEST_K8S_VERSION=1.33.0
PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))
GOARCH=$(shell go env GOARCH)
GOOS=$(shell go env GOOS)
# Use go.mod go version as a single source of truth of scheduler-plugins version.
SCHEDULER_PLUGINS_VERSION?=$(shell go list -m -f "{{.Version}}" sigs.k8s.io/scheduler-plugins)
VOLCANO_SCHEDULER_VERSION?=$(shell go list -m -f "{{.Version}}" volcano.sh/apis)
GOTOOLS_VERSION?=$(shell go list -m -f "{{.Version}}" golang.org/x/tools)
KIND_VERSION?=$(shell go list -m -f "{{.Version}}" sigs.k8s.io/kind)
GOLANGCI_LINT_VERSION?=$(shell go list -m -f "{{.Version}}" github.com/golangci/golangci-lint/v2)
CRD_OPTIONS ?= "crd:generateEmbeddedObjectMeta=true"
build: all
all: ${BIN_DIR} fmt vet tidy lint test mpi-operator.v2
.PHONY: mpi-operator.v2
mpi-operator.v2:
go build -ldflags ${LD_FLAGS_V2} -o ${BIN_DIR}/mpi-operator.v2 ./cmd/mpi-operator/
${BIN_DIR}:
mkdir -p ${BIN_DIR}
.PHONY: fmt
fmt:
go fmt ./...
.PHONY: vet
vet:
go vet ./...
.PHONY: test
test:
test: bin/envtest scheduler-plugins-crd volcano-scheduler-crd
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path)" go test -v -covermode atomic -coverprofile=profile.cov $(shell go list ./... | grep -v '/test/e2e')
# Only works with CONTROLLER_VERSION=v2
.PHONY: test_e2e
test_e2e: export TEST_MPI_OPERATOR_IMAGE=${IMAGE_NAME}:${RELEASE_VERSION}
test_e2e: export TEST_OPENMPI_IMAGE=${REGISTRY}/mpi-pi:${RELEASE_VERSION}-openmpi
test_e2e: export TEST_INTELMPI_IMAGE=${REGISTRY}/mpi-pi:${RELEASE_VERSION}-intel
test_e2e: export TEST_MPICH_IMAGE=${REGISTRY}/mpi-pi:${RELEASE_VERSION}-mpich
test_e2e: bin/kubectl kind helm images test_images dev_manifest scheduler-plugins-chart volcano-scheduler-deploy
go test -timeout 20m -v ./test/e2e/...
.PHONY: dev_manifest
dev_manifest:
# Use `~` instead of `/` because image name might contain `/`.
sed -e "s~%IMAGE_NAME%~${IMAGE_NAME}~g" -e "s~%IMAGE_TAG%~${RELEASE_VERSION}~g" manifests/overlays/dev/kustomization.yaml.template > manifests/overlays/dev/kustomization.yaml
.PHONY: generate
generate: goimports
go generate ./pkg/... ./cmd/...
hack/update-codegen.sh
# Workaround for https://github.com/kubernetes/kubernetes/issues/129774
$(GOIMPORTS) -w pkg/apis/kubeflow/v2beta1/zz_generated.defaults.go
$(MAKE) manifest
hack/python-sdk/gen-sdk.sh
.PHONY: verify-generate
verify-generate: generate
git --no-pager diff --exit-code manifests/base deploy sdk pkg/apis pkg/client
.PHONY: clean
clean:
rm -fr ${BIN_DIR}
.PHONY: images
images:
@echo "VERSION: ${RELEASE_VERSION}"
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(PLATFORMS) --build-arg VERSION=${CONTROLLER_VERSION} --build-arg RELEASE_VERSION=${RELEASE_VERSION} -t ${IMAGE_NAME}:${RELEASE_VERSION} .
.PHONY: test_images
test_images:
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(PLATFORMS) --build-arg port=${BASE_IMAGE_SSH_PORT} -t ${REGISTRY}/base:${RELEASE_VERSION} build/base
$(MAKE) -j3 test_images_openmpi test_images_intel test_images_mpich
.PHONY: test_images_openmpi
test_images_openmpi:
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/openmpi:${RELEASE_VERSION} build/base -f build/base/openmpi.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(PLATFORMS) -t ${REGISTRY}/openmpi-builder:${RELEASE_VERSION} build/base -f build/base/openmpi-builder.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/mpi-pi:${RELEASE_VERSION}-openmpi examples/v2beta1/pi
.PTHONY: test_images_intel
test_images_intel:
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(INTEL_PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/intel:${RELEASE_VERSION} build/base -f build/base/intel.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(INTEL_PLATFORMS) -t ${REGISTRY}/intel-builder:${RELEASE_VERSION} build/base -f build/base/intel-builder.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(INTEL_PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/mpi-pi:${RELEASE_VERSION}-intel examples/v2beta1/pi -f examples/v2beta1/pi/intel.Dockerfile
.PHOTNY: test_images_mpich
test_images_mpich:
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(MPICH_PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/mpich:${RELEASE_VERSION} build/base -f build/base/mpich.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(MPICH_PLATFORMS) -t ${REGISTRY}/mpich-builder:${RELEASE_VERSION} build/base -f build/base/mpich-builder.Dockerfile
${IMG_BUILDER} build $(BUILD_ARGS) --platform $(MPICH_PLATFORMS) --build-arg BASE_LABEL=${RELEASE_VERSION} -t ${REGISTRY}/mpi-pi:${RELEASE_VERSION}-mpich examples/v2beta1/pi -f examples/v2beta1/pi/mpich.Dockerfile
.PHONY: tidy
tidy:
go mod tidy
.PHONY: lint
lint: bin/golangci-lint ## Run golangci-lint linter
$(GOLANGCI_LINT) run --timeout=5m
# Generate deploy/v2beta1/mpi-operator.yaml
manifest: kustomize crd
hack/generate-manifest.sh $(KUSTOMIZE)
# Generate CRD
crd: controller-gen
$(CONTROLLER_GEN) $(CRD_OPTIONS) paths="./..." output:crd:artifacts:config=manifests/base
.PHONY: bin
bin:
mkdir -p $(PROJECT_DIR)/bin
GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
.PHONY: bin/golangci-lint
bin/golangci-lint: bin
@GOBIN=$(PROJECT_DIR)/bin go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
ENVTEST = $(shell pwd)/bin/setup-envtest
.PHONY: envtest
bin/envtest: bin ## Download envtest-setup locally if necessary.
@GOBIN=$(PROJECT_DIR)/bin go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
bin/kubectl: bin
curl -L -o $(PROJECT_DIR)/bin/kubectl https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/$(GOOS)/$(GOARCH)/kubectl
chmod +x $(PROJECT_DIR)/bin/kubectl
.PHONY: kind
kind: bin
@GOBIN=$(PROJECT_DIR)/bin go install sigs.k8s.io/kind@${KIND_VERSION}
.PHONY: helm
helm: bin
@GOBIN=$(PROJECT_DIR)/bin go install helm.sh/helm/v3/cmd/helm@${HELM_VERSION}
GOIMPORTS = $(PROJECT_DIR)/bin/goimports
.PHONY: goimports
goimports:
@GOBIN=$(PROJECT_DIR)/bin go install golang.org/x/tools/cmd/goimports@$(GOTOOLS_VERSION)
# Download controller-gen locally if necessary
CONTROLLER_GEN = $(PROJECT_DIR)/bin/controller-gen
.PHONY: controller-gen
controller-gen: bin
@GOBIN=$(PROJECT_DIR)/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.18.0
KUSTOMIZE = $(PROJECT_DIR)/bin/kustomize
.PHONY: kustomize
kustomize:
@GOBIN=$(PROJECT_DIR)/bin go install sigs.k8s.io/kustomize/kustomize/v4@v4.5.7
# The build via `go install` will fail with the following err:
# > The go.mod file for the module providing named packages contains one or
# more replace directives. It must not contain directives that would cause
# it to be interpreted differently than if it were the main module.
# However, we can ignore the above error since it is only necessary to download the manifests.
.PHONY: scheduler-plugins
scheduler-plugins:
-@GOPATH=/tmp go install sigs.k8s.io/scheduler-plugins/cmd/controller@$(SCHEDULER_PLUGINS_VERSION)
.PHONY: scheduler-plugins-crd
scheduler-plugins-crd: scheduler-plugins
mkdir -p $(PROJECT_DIR)/dep-crds/scheduler-plugins/
cp -f /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/coscheduling/* $(PROJECT_DIR)/dep-crds/scheduler-plugins
.PHONY: scheduler-plugins-chart
scheduler-plugins-chart: scheduler-plugins-crd
mkdir -p $(PROJECT_DIR)/dep-manifests/scheduler-plugins/
cp -rf /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/install/charts/as-a-second-scheduler/* $(PROJECT_DIR)/dep-manifests/scheduler-plugins
mkdir -p $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds
cp -f /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/appgroup/crd.yaml $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds/appgroup.diktyo.x-k8s.io_appgroups.yaml
cp -f /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/networktopology/crd.yaml $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds/networktopology.diktyo.x-k8s.io_networktopologies.yaml
cp -f /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/capacityscheduling/crd.yaml $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds/scheduling.x-k8s.io_elasticquotas.yaml
cp -f $(PROJECT_DIR)/dep-crds/scheduler-plugins/crd.yaml $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds/scheduling.x-k8s.io_podgroups.yaml
cp -f /tmp/pkg/mod/sigs.k8s.io/scheduler-plugins@$(SCHEDULER_PLUGINS_VERSION)/manifests/noderesourcetopology/crd.yaml $(PROJECT_DIR)/dep-manifests/scheduler-plugins/crds/topology.node.k8s.io_noderesourcetopologies.yaml
chmod -R 760 $(PROJECT_DIR)/dep-manifests/scheduler-plugins
.PHONY: volcano-scheduler
volcano-scheduler:
rm -rf /tmp/volcano.sh/volcano
git clone -b $(VOLCANO_SCHEDULER_VERSION) --depth 1 https://github.com/volcano-sh/volcano /tmp/volcano.sh/volcano
.PHONY: volcano-scheduler-crd
volcano-scheduler-crd: volcano-scheduler
mkdir -p $(PROJECT_DIR)/dep-crds/volcano-scheduler/
cp -f /tmp/volcano.sh/volcano/config/crd/volcano/bases/* $(PROJECT_DIR)/dep-crds/volcano-scheduler
.PHONY: volcano-scheduler-deploy
volcano-scheduler-deploy: volcano-scheduler-crd
mkdir -p $(PROJECT_DIR)/dep-manifests/volcano-scheduler/
cp -f /tmp/volcano.sh/volcano/installer/volcano-development.yaml $(PROJECT_DIR)/dep-manifests/volcano-scheduler/