.PHONY: build lint image

OS    := $(if $(OS),$(OS),$(shell go env GOOS))
ARCH  := $(if $(ARCH),$(ARCH),$(shell go env GOARCH))
GOENV   := GO111MODULE=on CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH)
GO      := $(GOENV) go
DOCKER := DOCKER_BUILDKIT=1 docker

COMMIT    := $(shell git describe --no-match --always --dirty)
BRANCH    := $(shell git rev-parse --abbrev-ref HEAD)
BUILD_DATE := $(shell date -Iseconds)

REPO := github.com/pingcap/test-infra/services/webhook

LDFLAGS := -w -s
LDFLAGS += -X "$(REPO)/pkg/version.gitHash=$(COMMIT)"
LDFLAGS += -X "$(REPO)/pkg/version.gitBranch=$(BRANCH)"
LDFLAGS += -X "$(REPO)/pkg/version.buildDate=$(BUILD_DATE)"

IMAGE_TAG ?= latest
IMAGE_REGISTRY ?= hub.pingcap.net

default: lint image

build: webhook scheduler

webhook:
	$(GO) build -trimpath -ldflags '$(LDFLAGS)' -o bin/$(OS)-$(ARCH)-webhook ./cmd/webhook

scheduler:
	$(GO) build -trimpath -ldflags '$(LDFLAGS)' -o bin/$(OS)-$(ARCH)-scheduler ./cmd/scheduler

image:
	OS=linux ARCH=amd64 make webhook-image
	OS=linux ARCH=arm64 make webhook-image
	OS=linux ARCH=amd64 make scheduler-image
	OS=linux ARCH=arm64 make scheduler-image

webhook-image: webhook
	$(DOCKER) build --build-arg arch=$(ARCH) --build-arg os=$(OS) --platform $(OS)/$(ARCH) -t $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)-$(ARCH) -f dockerfiles/webhook.Dockerfile .

scheduler-image: scheduler
	$(DOCKER) build --build-arg arch=$(ARCH) --build-arg os=$(OS) --platform $(OS)/$(ARCH) -t $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)-$(ARCH) -f dockerfiles/scheduler.Dockerfile .

image-push: webhook-image-push scheduler-image-push

webhook-image-push:
	$(DOCKER) push $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)-amd64
	$(DOCKER) push $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)-arm64
	$(DOCKER) manifest create $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG) \
		--amend $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)-amd64 \
		--amend $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)-arm64
	$(DOCKER) manifest push --purge $(IMAGE_REGISTRY)/qa/test-infra-webhook:$(IMAGE_TAG)

scheduler-image-push:
	$(DOCKER) push $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)-amd64
	$(DOCKER) push $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)-arm64
	$(DOCKER) manifest create $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG) \
		--amend $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)-amd64 \
		--amend $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)-arm64
	$(DOCKER) manifest push --purge $(IMAGE_REGISTRY)/qa/test-infra-scheduler:$(IMAGE_TAG)

test: unit-test e2e-test

unit-test:
	CGO_ENABLED=1 go test -v -race -cover ./...

e2e-test: install-kind
	cd tests; ./run-test.sh

clean: e2e-test-cleanup

e2e-test-cleanup:
	cd tests; CLEANUP=1 ./run-test.sh

lint: install-linter
	golangci-lint run

install-linter:
ifeq (, $(shell which golangci-lint))
	go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
endif

install-kind:
ifeq (, $(shell which kind))
	go install sigs.k8s.io/kind@v0.11.1
endif
