WORKDIR = /go/src/code.justin.tv/websocket-edge/server

local_docker_repo := websocket-edge/server
dev_docker_repo := 644522881688.dkr.ecr.us-west-2.amazonaws.com/websocket-edge
prod_docker_repo := 636874578776.dkr.ecr.us-west-2.amazonaws.com/websocket-edge

local_load_test_docker_repo := websocket-edge/load-test
dev_load_test_docker_repo := 644522881688.dkr.ecr.us-west-2.amazonaws.com/load-test
prod_load_test_docker_repo := 636874578776.dkr.ecr.us-west-2.amazonaws.com/load-test

local_mock_service_docker_repo := websocket-edge/mock-service
dev_mock_service_docker_repo := 644522881688.dkr.ecr.us-west-2.amazonaws.com/mock-service
prod_mock_service_docker_repo := 636874578776.dkr.ecr.us-west-2.amazonaws.com/mock-service

server_prod_cluster := "websocket-edge-prod"
server_prod_service := "websocket-edge-prod"
server_dev_cluster := "websocket-edge-dev"
server_dev_service := "websocket-edge-dev"

loadtest_dev_cluster := "load-test-dev"
loadtest_dev_service := "load-test-dev"

mock_service_dev_cluster := "websocket-edge-dev-mock-service"
mock_service_dev_service := "websocket-edge-dev-mock-service"

git_sha := $(shell git rev-parse --short HEAD)

go_version := 1.13.4

git_sha = $(shell git rev-parse --short HEAD)
now := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')

# These flags are used by 'go build' to set build data into the binary.
ldflags = \
-X 'main.buildDate=$(now)' \
-X 'main.gitCommit=$(git_sha)'

########################
### General Commands ###
########################

default: build

test:
	docker run --rm -v $(PWD):$(WORKDIR):delegated -w $(WORKDIR) golang go test -v -race ./...
.PHONY: test

# TODO: install mockery in tools dir so it isn't required to be on machine already.
mocks:
	mockery -dir=internal/wsconnection/ -name=Conn
	mockery -dir=internal/wsconnection/ -name=Connection
	mockery -dir=internal/db/ -name=DB
.PHONY: mocks

lint:
	docker run --rm -v $(PWD):$(WORKDIR):delegated -w $(WORKDIR) golangci/golangci-lint:v1.15 golangci-lint run
.PHONY: lint

run: compose_build
	docker-compose up --scale loadtest=3
.PHONY: run

compose_build:
	docker-compose build
.PHONY: compose_build

ecr_login:
	@ $(shell aws ecr get-login --region us-west-2 --no-include-email)
.PHONY: ecr_login

#######################
### Server Commands ###
#######################

build:
	@ CGO_ENABLED=0 go build -ldflags "$(ldflags)" -o build/server cmd/server/*.go
.PHONY: build

docker_build:
	docker build \
	-t $(local_docker_repo):$(git_sha) \
	--build-arg go_version=$(go_version) \
	-f docker/server/Dockerfile \
	.
.PHONY: docker_build

docker_publish_prod: ecr_login
	docker tag $(local_docker_repo):$(git_sha) $(prod_docker_repo):$(git_sha)
	docker push $(prod_docker_repo)
.PHONY: docker_publish_prod

docker_publish_dev: ecr_login
	docker tag $(local_docker_repo):$(git_sha) $(dev_docker_repo):$(git_sha)
	docker push $(dev_docker_repo)
.PHONY: docker_publish_dev

# Deploy a specific tagged & pushed docker image to the Production environment
# REQUIRES AN AWS SESSION, and an environment variable PRODUCTION_DOCKER_TAG set to the tag to deploy.
deploy_tag_to_production:
	./scripts/ecs-deploy.sh \
		--verbose \
		--timeout 600 \
		--cluster $(server_prod_cluster) \
		--service-name $(server_prod_service) \
		--image $(prod_docker_repo):${PRODUCTION_DOCKER_TAG}
.PHONY: deploy_tag_to_production

build_and_deploy_prod: ecr_login docker_build docker_publish_prod
	./scripts/ecs-deploy.sh \
		--verbose \
		--timeout 900 \
		--cluster $(server_prod_cluster) \
		--service-name $(server_prod_service) \
		--image $(prod_docker_repo):$(git_sha)
.PHONY: build_and_deploy_prod

build_and_deploy_dev: ecr_login docker_build docker_publish_dev
	./scripts/ecs-deploy.sh \
		--verbose \
		--timeout 900 \
		--cluster $(server_dev_cluster) \
		--service-name $(server_dev_service) \
		--image $(dev_docker_repo):$(git_sha)
.PHONY: build_and_deploy_dev

#########################
### Loadtest Commands ###
#########################

build_loadtest:
	@ CGO_ENABLED=0 go build -ldflags "$(ldflags)" -o build/loadtest cmd/loadtest/*.go
.PHONY: build_loadtest

docker_build_loadtest:
	docker build \
	-t $(local_load_test_docker_repo):$(git_sha) \
	-f docker/loadtest/Dockerfile \
	.
.PHONY: docker_build_loadtest

docker_publish_loadtest_dev: ecr_login
	docker tag $(local_load_test_docker_repo):$(git_sha) $(dev_load_test_docker_repo):$(git_sha)
	docker push $(dev_load_test_docker_repo)
.PHONY: docker_publish_loadtest_dev

# Update task definition for load test
# REQUIRES AN AWS SESSION, and an environment variable LOADTEST_TAG set to the tag to deploy.
update_loadtest_task_definition_dev:
	./scripts/ecs-deploy.sh \
		--verbose \
		--cluster $(loadtest_dev_cluster) \
		--task-definition $(loadtest_dev_service) \
		--image $(dev_load_test_docker_repo):$(LOADTEST_TAG)
.PHONY: update_loadtest_task_definition_dev

build_and_update_loadtest_dev: ecr_login docker_build_loadtest docker_publish_loadtest_dev
	./scripts/ecs-deploy.sh \
	--verbose \
	--cluster $(loadtest_dev_cluster) \
	--task-definition $(loadtest_dev_service) \
	--image $(dev_load_test_docker_repo):$(git_sha)
.PHONY: build_and_update_loadtest_dev

#############################
### Mock Service Commands ###
#############################

build_mock_service:
	@ CGO_ENABLED=0 go build -ldflags "$(ldflags)" -o build/mock_service cmd/mock_service/*.go
.PHONY: build_mock_service

docker_build_mock_service:
	docker build \
	-t $(local_mock_service_docker_repo):$(git_sha) \
	-f docker/mock_service/Dockerfile \
	.
.PHONY: docker_build_mock_service

docker_publish_mock_service_dev: ecr_login
	docker tag $(local_mock_service_docker_repo):$(git_sha) $(dev_mock_service_docker_repo):$(git_sha)
	docker push $(dev_mock_service_docker_repo)
.PHONY: docker_publish_mock_service_dev

build_and_deploy_mock_service_dev: ecr_login docker_build_mock_service docker_publish_mock_service_dev
	./scripts/ecs-deploy.sh \
	--verbose \
	--timeout 900 \
	--cluster $(mock_service_dev_cluster) \
	--service-name $(mock_service_dev_service) \
	--image $(dev_mock_service_docker_repo):$(git_sha)
.PHONY: build_and_deploy_mock_service_dev
