2023-09-13 11:10:41 -05:00
|
|
|
export PATH := $(abspath bin/):${PATH}
|
|
|
|
|
|
|
|
# Dependency versions
|
|
|
|
LICENSEI_VERSION = 0.9.0
|
|
|
|
|
2015-01-26 20:19:22 -06:00
|
|
|
# generate runs `go generate` to build the dynamically generated
|
2018-10-18 11:27:48 -05:00
|
|
|
# source files, except the protobuf stubs which are built instead with
|
|
|
|
# "make protobuf".
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: generate
|
2019-10-17 15:17:23 -05:00
|
|
|
generate:
|
2020-09-23 15:57:36 -05:00
|
|
|
go generate ./...
|
2015-01-10 17:51:53 -06:00
|
|
|
|
2018-10-18 11:27:48 -05:00
|
|
|
# We separate the protobuf generation because most development tasks on
|
2023-09-21 04:53:02 -05:00
|
|
|
# OpenTofu do not involve changing protobuf files and protoc is not a
|
2018-10-18 11:27:48 -05:00
|
|
|
# go-gettable dependency and so getting it installed can be inconvenient.
|
|
|
|
#
|
2021-08-20 18:07:18 -05:00
|
|
|
# If you are working on changes to protobuf interfaces, run this Makefile
|
|
|
|
# target to be sure to regenerate all of the protobuf stubs using the expected
|
|
|
|
# versions of protoc and the protoc Go plugins.
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: protobuf
|
2018-10-18 11:27:48 -05:00
|
|
|
protobuf:
|
2021-08-20 18:07:18 -05:00
|
|
|
go run ./tools/protobuf-compile .
|
2018-10-18 11:27:48 -05:00
|
|
|
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: fmtcheck
|
2015-12-17 11:21:43 -06:00
|
|
|
fmtcheck:
|
2022-08-25 17:49:39 -05:00
|
|
|
"$(CURDIR)/scripts/gofmtcheck.sh"
|
2015-12-17 11:21:43 -06:00
|
|
|
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: importscheck
|
2022-07-19 04:14:28 -05:00
|
|
|
importscheck:
|
2022-08-25 17:49:39 -05:00
|
|
|
"$(CURDIR)/scripts/goimportscheck.sh"
|
2022-07-19 04:14:28 -05:00
|
|
|
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: staticcheck
|
2020-12-02 11:02:33 -06:00
|
|
|
staticcheck:
|
2022-08-25 17:49:39 -05:00
|
|
|
"$(CURDIR)/scripts/staticcheck.sh"
|
2020-12-02 11:02:33 -06:00
|
|
|
|
2023-09-13 11:10:41 -05:00
|
|
|
.PHONY: exhaustive
|
2021-09-24 14:02:30 -05:00
|
|
|
exhaustive:
|
2022-08-25 17:49:39 -05:00
|
|
|
"$(CURDIR)/scripts/exhaustive.sh"
|
2021-09-24 14:02:30 -05:00
|
|
|
|
2023-09-13 11:10:41 -05:00
|
|
|
# Run license check
|
|
|
|
.PHONY: license-check
|
|
|
|
license-check:
|
|
|
|
go mod vendor
|
2023-09-18 07:25:42 -05:00
|
|
|
licensei cache --debug
|
|
|
|
licensei check --debug
|
|
|
|
licensei header --debug
|
|
|
|
rm -rf vendor/
|
|
|
|
git diff --exit-code
|
2023-09-13 11:10:41 -05:00
|
|
|
|
|
|
|
# Install dependencies
|
|
|
|
deps: bin/licensei
|
|
|
|
deps:
|
|
|
|
|
|
|
|
bin/licensei: bin/licensei-${LICENSEI_VERSION}
|
|
|
|
@ln -sf licensei-${LICENSEI_VERSION} bin/licensei
|
|
|
|
bin/licensei-${LICENSEI_VERSION}:
|
|
|
|
@mkdir -p bin
|
|
|
|
curl -sfL https://git.io/licensei | bash -s v${LICENSEI_VERSION}
|
|
|
|
@mv bin/licensei $@
|
|
|
|
|
2017-02-17 17:31:20 -06:00
|
|
|
# disallow any parallelism (-j) for Make. This is necessary since some
|
|
|
|
# commands during the build process create temporary files that collide
|
|
|
|
# under parallel conditions.
|
|
|
|
.NOTPARALLEL:
|
2023-11-24 07:48:03 -06:00
|
|
|
|
|
|
|
# Integration tests
|
|
|
|
#
|
|
|
|
|
|
|
|
.PHONY: list-integration-tests
|
|
|
|
list-integration-tests: ## Lists tests.
|
|
|
|
@ grep -h -E '^(test|integration)-.+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[1m%-30s\033[0m %s\n", $$1, $$2}'
|
|
|
|
|
|
|
|
# integration test with s3 as backend
|
|
|
|
.PHONY: test-s3
|
|
|
|
|
|
|
|
define infoTestS3
|
|
|
|
Test requires:
|
|
|
|
* AWS Credentials to be configured
|
|
|
|
- https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html
|
|
|
|
- https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
|
|
|
|
* IAM Permissions in us-west-2
|
|
|
|
- S3 CRUD operations on buckets which will follow the pattern tofu-test-*
|
|
|
|
- DynamoDB CRUD operations on a Table named dynamoTable
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
test-s3: ## Runs tests with s3 bucket as the backend.
|
|
|
|
@ $(info $(infoTestS3))
|
|
|
|
@ TF_S3_TEST=1 go test ./internal/backend/remote-state/s3/...
|
|
|
|
|
2023-12-01 08:14:10 -06:00
|
|
|
# integration test with gcp as backend
|
|
|
|
.PHONY: test-gcp
|
|
|
|
|
|
|
|
define infoTestGCP
|
|
|
|
This test requires a working set of default credentials on the host.
|
|
|
|
You can configure those by running `gcloud auth application-default login`.
|
|
|
|
Additionally, you'll need to set the following environment variables:
|
|
|
|
- GOOGLE_REGION to a valid GCP region, e.g. us-west1
|
|
|
|
- GOOGLE_PROJECT to a valid GCP project ID
|
|
|
|
|
|
|
|
Note: The GCP tests leave behind a keyring, because those can't easily be deleted. It will be reused across test runs.
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
test-gcp: ## Runs tests with gcp as the backend.
|
|
|
|
@ $(info $(infoTestGCP))
|
|
|
|
@ TF_ACC=1 go test ./internal/backend/remote-state/gcs/...
|
|
|
|
@ echo "Note: this test has left behind a keyring, because those can't easily be deleted. It will be reused across test runs."
|
|
|
|
|
2023-11-24 07:48:03 -06:00
|
|
|
# integration test with postgres as backend
|
|
|
|
.PHONY: test-pg test-pg-clean
|
|
|
|
|
|
|
|
PG_PORT := 5432
|
|
|
|
|
|
|
|
define infoTestPg
|
|
|
|
Test requires:
|
|
|
|
* Docker: https://docs.docker.com/engine/install/
|
|
|
|
* Port: $(PG_PORT)
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
test-pg: ## Runs tests with local Postgres instance as the backend.
|
|
|
|
@ $(info $(infoTestPg))
|
|
|
|
@ echo "Starting database"
|
|
|
|
@ make test-pg-clean
|
|
|
|
@ docker run --rm -d --name tofu-pg \
|
|
|
|
-p $(PG_PORT):5432 \
|
|
|
|
-e POSTGRES_PASSWORD=tofu \
|
|
|
|
-e POSTGRES_USER=tofu \
|
|
|
|
postgres:16-alpine3.17 1> /dev/null
|
|
|
|
@ docker exec tofu-pg /bin/bash -c 'until psql -U tofu -c "\q" 2> /dev/null; do echo "Database is getting ready, waiting"; sleep 1; done'
|
|
|
|
@ DATABASE_URL="postgres://tofu:tofu@localhost:$(PG_PORT)/tofu?sslmode=disable" \
|
|
|
|
TF_PG_TEST=1 go test ./internal/backend/remote-state/pg/...
|
|
|
|
|
|
|
|
test-pg-clean: ## Cleans environment after `test-pg`.
|
|
|
|
@ docker rm -f tofu-pg 2> /dev/null
|
|
|
|
|
2023-11-24 10:20:26 -06:00
|
|
|
# integration test with Azure as backend
|
|
|
|
.PHONY: test-azure
|
|
|
|
|
|
|
|
test-azure: ## Directs the developer to follow a runbook describing how to run Azure integration tests.
|
|
|
|
@ echo "To run Azure integration tests, please follow the runbook in internal/backend/remote-state/azure/README.md".
|
|
|
|
@ exit 1 # don't want the user to miss this
|
|
|
|
|
2023-11-28 05:37:23 -06:00
|
|
|
# integration test with Consul as backend
|
|
|
|
.PHONY: test-consul test-consul-clean
|
|
|
|
|
|
|
|
define infoTestConsul
|
|
|
|
Test requires:
|
|
|
|
* Docker: https://docs.docker.com/engine/install/
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
GO_VER := `cat $(PWD)/.go-version`
|
|
|
|
|
|
|
|
test-consul: ## Runs tests using in docker container using Consul as the backend.
|
|
|
|
@ $(info $(infoTestConsul))
|
|
|
|
@ echo "Build docker image with Consul and Go v$(GO_VER)"
|
|
|
|
@ cd ./internal/backend/remote-state/consul &&\
|
|
|
|
docker build --build-arg="GO_VERSION=${GO_VER}" -t tofu-consul --progress=plain . &> /dev/null
|
|
|
|
@ echo "Run tests"
|
|
|
|
@ docker run --rm --name tofu-consul -v $(PWD):/app -e TF_CONSUL_TEST=1 -t tofu-consul \
|
|
|
|
test ./internal/backend/remote-state/consul/...
|
|
|
|
|
|
|
|
test-consul-clean: ## Cleans environment after `test-consul`.
|
|
|
|
@ docker rmi -f tofu-consul:latest
|
|
|
|
|
2023-11-28 08:48:50 -06:00
|
|
|
# integration test with kubernetes as backend
|
|
|
|
.PHONY: test-kubernetes test-kubernetes-clean
|
|
|
|
|
|
|
|
define infoTestK8s
|
|
|
|
Test requires:
|
|
|
|
* Git client
|
|
|
|
* Docker: https://docs.docker.com/engine/install/
|
|
|
|
Note! Please make sure that the docker configurations satisfy requirements: https://kind.sigs.k8s.io/docs/user/quick-start#settings-for-docker-desktop
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
|
|
|
KIND_VERSION := v0.20.0
|
|
|
|
|
|
|
|
test-kubernetes: test-kubernetes-clean ## Runs tests with a local kubernetes cluster as the backend.
|
|
|
|
@ $(info $(infoTestK8s))
|
|
|
|
@ echo "Installing KinD $(KIND_VERSION): https://kind.sigs.k8s.io/docs/user/quick-start/#installing-with-make"
|
|
|
|
@ git clone -c advice.detachedHead=false -q https://github.com/kubernetes-sigs/kind -b $(KIND_VERSION) /tmp/kind-repo 1> /dev/null && \
|
|
|
|
cd /tmp/kind-repo &&\
|
|
|
|
make build 1> /dev/null &&\
|
|
|
|
mv ./bin/kind /tmp/tofuk8s &&\
|
|
|
|
cd .. && rm -rf kind-repo
|
|
|
|
@ echo "Provisioning a cluster"
|
|
|
|
@ /tmp/tofuk8s -q create cluster --name tofu-kubernetes
|
|
|
|
@ /tmp/tofuk8s -q export kubeconfig --name tofu-kubernetes --kubeconfig /tmp/tofu-k8s-config
|
|
|
|
@ echo "Running tests"
|
|
|
|
@ KUBE_CONFIG_PATHS=/tmp/tofu-k8s-config TF_K8S_TEST=1 go test ./internal/backend/remote-state/kubernetes/...
|
|
|
|
@ echo "Deleting provisioned cluster"
|
|
|
|
@ make test-kubernetes-clean
|
|
|
|
|
|
|
|
test-kubernetes-clean: ## Cleans environment after `test-kubernetes`.
|
|
|
|
@ test -s /tmp/tofu-k8s-config && rm /tmp/tofu-k8s-config || echo "" > /dev/null
|
|
|
|
@ test -s /tmp/tofuk8s && (/tmp/tofuk8s -q delete cluster --name tofu-kubernetes && rm /tmp/tofuk8s) || echo "" > /dev/null
|
|
|
|
|
2023-12-06 06:22:08 -06:00
|
|
|
.PHONY:
|
|
|
|
test-linux-install-instructions:
|
|
|
|
@cd "$(CURDIR)/website/docs/intro/install" && ./test-install-instructions.sh
|
|
|
|
|
2023-11-24 07:48:03 -06:00
|
|
|
.PHONY:
|
2023-11-28 08:48:50 -06:00
|
|
|
integration-tests: test-s3 test-pg test-consul test-kubernetes integration-tests-clean ## Runs all integration tests test.
|
2023-11-24 07:48:03 -06:00
|
|
|
|
|
|
|
.PHONY:
|
2023-11-28 08:48:50 -06:00
|
|
|
integration-tests-clean: test-pg-clean test-consul-clean test-kubernetes-clean ## Cleans environment after all integration tests.
|