#shell parameters and path	
SHELL:= /bin/bash
WORKPATH=$(CURDIR)
SRCPATH=$(WORKPATH)/src
CONTAINERPATH=$(WORKPATH)/make/build/containers
CHARTSPATH=$(WORKPATH)/make/deploy/charts
DOCKERFILESPATH=$(WORKPATH)/make/build/containers
DOCKERFILESTEMPLATEPATH=$(WORKPATH)/make/build/containers/template
YAMLSPATH=$(WORKPATH)/make/deploy/yamls
YAMLSTEMPLATEPATH=$(WORKPATH)/make/deploy/yamls/template
SCRIPTSPATH=$(WORKPATH)/make/scripts
CONFIGPATH=$(WORKPATH)/make
CONFIGFILE=$(CONFIGPATH)/wss.conf

#image name
ENV=dev
ifeq ("$(ENV)", "prd")
IMAGEPREFIX=172.17.0.7:8443/powerkeeper/powerkeeper
HOST_NAME="https://console.faladi.cn"
HOST_PORT="31009"
else ifeq ("$(ENV)", "prd-etl")
IMAGEPREFIX=172.17.0.7:8443/powerkeeper/powerkeeper
HOST_NAME="https://console.faladi.cn"
HOST_PORT="31009"
CYCLEJOBS=etl/cyclejobs
DATAX=etl/datax
else ifeq ("$(ENV)", "pre")
HOST_NAME="http://49.232.139.185"
HOST_PORT="31002"
IMAGEPREFIX=192.168.1.11:8800/afa/dianguanjia
else ifeq ("$(ENV)", "dev")
IMAGEPREFIX=192.168.1.11:8800/afa/dianguanjia
HOST_NAME="http://188.131.235.243"
HOST_PORT="31002"
MYSQL=mysql
endif
BASEIMAGEPREFIX=$(IMAGEPREFIX)-base
ENVIMAGEPREFIX=$(IMAGEPREFIX)-env

#pushimagestoharbor
IMAGEVERSION=
PRDRESOLVERIP="10.68.0.2"
REGISTRYPREFIX=192.168.1.11:8800/afa/dianguanjia
HARBORPREFIX=81.68.220.77:8443/powerkeeper/powerkeeper

#prepare 
IMAGESPREPARECMD=$(SCRIPTSPATH)/imagesPrepare
DELETEIMAGESPREPAREDFILESCMD=$(SCRIPTSPATH)/deleteImagesPrepare
DEPLOYPREPARECMD=$(SCRIPTSPATH)/servicesPrepare
DELETESERVICESPREPAREDFILESCMD=$(SCRIPTSPATH)/deleteServicesPrepare
RESOLVERIP=`$(KUBECTLCMD) get svc  kube-dns -nkube-system -ojsonpath='{.spec.clusterIP}'`

#build
DOCKERPATH=$(shell which docker)
DOCKERCMD=sudo $(DOCKERPATH)
DOCKERBUILD=$(DOCKERCMD) build --force-rm
DOCKERPULL=$(DOCKERCMD) pull
DOCKERPUSH=$(DOCKERCMD) push
DOCKERIMASES=$(DOCKERCMD) images
DOCKERTAG=$(DOCKERCMD) tag
DOCKERRMI=$(DOCKERCMD) rmi -f 
DOCKERRMINONEIMAGES=$(DOCKERCMD) images |grep none|awk '{print $$3}'| xargs $(DOCKERRMI) 

#package 
TARCMD=$(shell which tar)
ZIPCMD=$(shell which gzip)
PACKAGETEMPPATH=Release
PACKAGENAME=dianguanjia
VERSIONTAG:=$(shell git describe --tags || echo UNKNOWN)
VERSIONFILE=$(WORKPATH)/make/VERSION
BUILDIMAGETIME=$(shell date )
AUDITFILE=$(WORKPATH)/make/audit.log

#deploy
KUBECTLCMD=$(shell which kubectl) --kubeconfig=/data/kubeconfig/$(ENV)/config
DEPLOYSERVICESCMD=$(KUBECTLCMD) apply
DELETESERVICESCMD=$(KUBECTLCMD) delete
PAUSECMD=$(KUBECTLCMD) rollout pause 
RESUMECMD=$(KUBECTLCMD) rollout resume 
ROLLBACKCMD=$(KUBECTLCMD) rollout undo 
HISTORYCMD=$(KUBECTLCMD) rollout history

# Package lists
ifeq ("$(NAME)", "celery")
INT_LIST := celery
BUILD_LIST := celery
else
INT_LIST := backend fe  ironman redis $(MYSQL) $(CYCLEJOBS) $(DATAX)
BUILD_LIST := backend  fe/screen ironman $(CYCLEJOBS) $(DATAX)
endif
BASE_LIST :=  
ENV_LIST :=  

$(warning $(INT_LIST))

#make command
BUILD_IMAGES_PREPARE_LIST = $(foreach int, $(BUILD_LIST), $(int)_image_prepare)
DELETE_IMAGES_PREPARED_FILES_LIST = $(foreach int, $(BUILD_LIST), $(int)_image_prepared_files_delete)
BUILD_IMAGES_LIST = $(foreach int, $(BUILD_LIST), $(int)_image_build)
PUSH_IMAGES_TO_HARBOR_LIST = $(foreach int, $(BUILD_LIST), $(int)_image_push_to_harbor)
BUILD_BASE_IMAGES_LIST = $(foreach int, $(BASE_LIST), $(int)_base_image_build)
BUILD_ENV_IMAGES_LIST = $(foreach int, $(ENV_LIST), $(int)_env_image_build)
REMOVE_IMAGES_LIST = $(foreach int, $(BUILD_LIST), $(int)_image_rmi)
REMOVE_BASE_IMAGES_LIST = $(foreach int, $(BASE_LIST), $(int)_base_image_rmi)
REMOVE_ENV_IMAGES_LIST = $(foreach int, $(ENV_LIST), $(int)_env__image_rmi)
DEPLOY_SERVICES_PREPARE_LIST = $(foreach int, $(INT_LIST), $(int)_service_prepare)
PRD_DEPLOY_SERVICES_PREPARE_LIST = $(foreach int, $(INT_LIST), $(int)_prd_service_prepare)
DELETE_SERVICES_PREPARED_FILES_LIST = $(foreach int, $(INT_LIST), $(int)_service_prepared_files_delete)
DEPLOY_SERVICES_LIST = $(foreach int, $(INT_LIST), $(int)_service_deploy)
UPDATE_SERVICES_LIST = $(foreach int, $(INT_LIST), $(int)_service_update)
DELETE_SERVICES_LIST = $(foreach int, $(INT_LIST), $(int)_service_delete)
PAUSE_LIST = $(foreach int, $(INT_LIST), $(int)_pause)
RESUME_LIST = $(foreach int, $(INT_LIST), $(int)_resume)
ROLLBACK_LIST = $(foreach int, $(INT_LIST), $(int)_rollback)
HISTORY_LIST = $(foreach int, $(INT_LIST), $(int)_history)

#phony for the specific command
.PHONY: $(BUILD_CODE_LIST) $(BUILD_IMAGE_LIST) $(RM_IMAGE_LIST) $(DEPLOY_LIST) $(UNINTSTALL_LIST)

all: images_build_all  deploy_services
services: images_build deploy_services
pushimagestoharbor: $(PUSH_IMAGES_TO_HARBOR_LIST)
prddeployservice: $(PRD_DEPLOY_SERVICES_PREPARE_LIST) $(DEPLOY_SERVICES_LIST)

images_prepare: $(BUILD_IMAGES_PREPARE_LIST) 
env_images_build: $(BUILD_IMAGES_PREPARE_LIST) $(BUILD_ENV_IMAGES_LIST)
base_images_build: $(BUILD_IMAGES_PREPARE_LIST) $(BUILD_BASE_IMAGES_LIST)
images_build: $(BUILD_IMAGES_PREPARE_LIST) $(BUILD_IMAGES_LIST)
images_build_all: $(BUILD_IMAGES_PREPARE_LIST) $(BUILD_ENV_IMAGES_LIST) $(BUILD_BASE_IMAGES_LIST) $(BUILD_IMAGES_LIST)
images_prepare: $(BUILD_IMAGES_PREPARE_LIST) 
delete_images_prepared_files: $(DELETE_IMAGES_PREPARED_FILES_LIST)
delete_local_images: $(REMOVE_IMAGES_LIST) $(REMOVE_BASE_IMAGES_LIST) $(REMOVE_ENV_IMAGES_LIST)

services_prepare: $(DEPLOY_SERVICES_PREPARE_LIST)
deploy_services: $(DEPLOY_SERVICES_PREPARE_LIST) $(DEPLOY_SERVICES_LIST)
delete_services: $(DELETE_SERVICES_LIST)
delete_services_prepared_files: $(DELETE_SERVICES_PREPARED_FILES_LIST)

celery_service: celery_image_prepare celery_image_build celery_service_prepare celery_service_deploy
celery_service_update: celery_image_prepare celery_image_build celery_service_prepare celery_service_update
delete_celery_service: celery_service_delete

backend_service: backend_image_prepare backend_image_build backend_service_prepare backend_service_deploy
backend_service_update: backend_image_prepare backend_image_build backend_service_prepare backend_service_update
delete_backend_service: backend_service_delete

fe_service: fe/screen_image_prepare fe/screen_image_build fe_service_prepare fe_service_deploy 
fe_service_update: fe/screen_image_prepare fe/screen_image_build fe_service_prepare fe_service_update
delete_fe_service: fe_service_delete

ironman_service: ironman_image_prepare ironman_image_build ironman_service_prepare ironman_service_deploy 
ironman_service_update: ironman_image_prepare ironman_image_build ironman_service_prepare ironman_service_update
delete_ironman_service: ironman_service_delete
		
#etl_images_build: etl/datax_image_build etl/initdb_image_build etl/incdb_image_build
#etl_services: etl_images_build etl/syncdb_service_prepare etl/syncdb_service_deploy  etl/maxwell_service_deploy

etl/datax_service: etl/datax_image_build etl/datax_service_prepare etl/datax_service_deploy
etl/cyclejobs_service: etl/cyclejobs_image_build etl/cyclejobs_service_prepare etl/cyclejobs_service_deploy


$(BUILD_IMAGES_PREPARE_LIST): %_image_prepare: 
	@echo "***Image peparing of $*"
	@$(IMAGESPREPARECMD) $(CONFIGFILE) $(DOCKERFILESTEMPLATEPATH)/$* $(DOCKERFILESPATH)/$*  $(IMAGEPREFIX)
	@echo "***Done."

$(DELETE_IMAGES_PREPARED_FILES_LIST):%_image_prepared_files_delete:
	@echo "***Delete images prepared dockefile of $*"
	-@$(DELETEIMAGESPREPAREDFILESCMD) $(DOCKERFILESTEMPLATEPATH)/$* $(DOCKERFILESPATH)/$*


$(BUILD_IMAGES_LIST): %_image_build:
	@echo "***Build image of $*"
	-$(DOCKERRMINONEIMAGES) 
	$(DOCKERBUILD) -t  $(IMAGEPREFIX)-$*:$(VERSIONTAG) -f $(CONTAINERPATH)/$*/buildsite/Dockerfile  .
	$(DOCKERPUSH) $(IMAGEPREFIX)-$*:$(VERSIONTAG)
	-$(DOCKERRMI) $(IMAGEPREFIX)-$*:$(VERSIONTAG)
	-$(DOCKERRMINONEIMAGES) 
	@echo "Date: $(BUILDIMAGETIME) Build image: $(IMAGEPREFIX)-$*:$(VERSIONTAG)" >> $(AUDITFILE)
	@echo "$(VERSIONTAG)">$(VERSIONFILE)

$(BUILD_BASE_IMAGES_LIST): %_base_image_build:
	@echo "***Build base image of $*"
	$(DOCKERBUILD) -t  $(BASEIMAGEPREFIX)-$*:$(VERSIONTAG) -f $(CONTAINERPATH)/$*/baseimage/Dockerfile  .
	$(DOCKERPUSH) $(BASEIMAGEPREFIX)-$*:$(VERSIONTAG)
	$(DOCKERTAG) $(BASEIMAGEPREFIX)-$*:$(VERSIONTAG) $(BASEIMAGEPREFIX)-$*:latest
	$(DOCKERPUSH) $(BASEIMAGEPREFIX)-$*:latest
	@echo "Date: $(BUILDIMAGETIME) Build base image: $(BASEIMAGEPREFIX)-$*:$(VERSIONTAG)" >> $(AUDITFILE)

$(BUILD_ENV_IMAGES_LIST): %_env_image_build:
	@echo "***Build env image of $*"
	$(DOCKERBUILD) -t  $(ENVIMAGEPREFIX)-$*:$(VERSIONTAG) -f $(CONTAINERPATH)/$*/envimage/Dockerfile  .
	$(DOCKERPUSH) $(ENVIMAGEPREFIX)-$*:$(VERSIONTAG)
	$(DOCKERTAG) $(ENVIMAGEPREFIX)-$*:$(VERSIONTAG) $(ENVIMAGEPREFIX)-$*:latest
	$(DOCKERPUSH) $(ENVIMAGEPREFIX)-$*:latest
	@echo "Date: $(BUILDIMAGETIME) Build env image: $(ENVIMAGEPREFIX)-$*:$(VERSIONTAG)" >> $(AUDITFILE)

$(PUSH_IMAGES_TO_HARBOR_LIST): %_image_push_to_harbor:
	@echo "***Push image of $* to harbor"
	$(DOCKERPULL) $(REGISTRYPREFIX)-$*:$(IMAGEVERSION)
	$(DOCKERTAG) $(REGISTRYPREFIX)-$*:$(IMAGEVERSION) $(HARBORPREFIX)-$*:$(IMAGEVERSION)
	$(DOCKERPUSH) $(HARBORPREFIX)-$*:$(IMAGEVERSION)
	-$(DOCKERRMI) $(REGISTRYPREFIX)-$*:$(IMAGEVERSION) $(HARBORPREFIX)-$*:$(IMAGEVERSION)
	@echo "Date: $(BUILDIMAGETIME) Push image: $(HARBORPREFIX)-$*:$(IMAGEVERSION)"

$(REMOVE_IMAGES_LIST): %_image_rmi:
	@echo "***Remove image of $*"
	-$(DOCKERRMI) $(IMAGEPREFIX)-$*:$(VERSIONTAG)

$(REMOVE_BASE_IMAGES_LIST): %_base_image_rmi:
	@echo "***Remove base image of $*"
	-$(DOCKERRMI) $(BASEIMAGEPREFIX)-$*:$(VERSIONTAG)

$(REMOVE_ENV_IMAGES_LIST): %_env_image_rmi:
	@echo "***Remove env image of $*"
	-$(DOCKERRMI) $(ENVIMAGEPREFIX)-$*:$(VERSIONTAG)

$(DEPLOY_SERVICES_PREPARE_LIST):%_service_prepare:
	@echo "***Prepare deploy yaml of $*"
	@$(DEPLOYPREPARECMD) $(CONFIGFILE) $(YAMLSTEMPLATEPATH)/$* $(YAMLSPATH)/$* $(VERSIONTAG) $(RESOLVERIP) $(IMAGEPREFIX) $(HOST_NAME) $(HOST_PORT)

$(DELETE_SERVICES_PREPARED_FILES_LIST):%_service_prepared_files_delete:
	@echo "***Delete prepared deploy yaml of $*"
	-@$(DELETESERVICESPREPAREDFILESCMD) $(YAMLSTEMPLATEPATH)/$* $(YAMLSPATH)/$* 
	
$(PRD_DEPLOY_SERVICES_PREPARE_LIST): %_prd_service_prepare:
	@echo "***Package service yaml of $*"
	@$(DEPLOYPREPARECMD) $(CONFIGFILE) $(YAMLSTEMPLATEPATH)/$* $(YAMLSPATH)/$* $(IMAGEVERSION) $(PRDRESOLVERIP) $(IMAGEPREFIX)  $(HOST_NAME) $(HOST_PORT)

$(DEPLOY_SERVICES_LIST): %_service_deploy:
	@echo "***Deploy service of $*"
	$(DEPLOYSERVICESCMD) -f $(YAMLSPATH)/$* 

$(UPDATE_SERVICES_LIST): %_service_update:
	@echo "***Update service image of $*"
	$(DEPLOYSERVICESCMD) -f $(YAMLSPATH)/$*/deployment.yaml 

$(DELETE_SERVICES_LIST): %_service_delete:
	@echo "***Delete service of $*"
	-@$(DELETESERVICESCMD) -f $(YAMLSPATH)/$* 

$(PAUSE_LIST): %_pause:
	@echo "***pause pod of $*"
	-@$(PAUSECMD) -f $(YAMLSPATH)/$*/deployment.yaml 

$(RESUME_LIST): %_resume:
	@echo "***resume pod of $*"
	-@$(RESUMECMD) -f $(YAMLSPATH)/$*/deployment.yaml

$(ROLLBACK_LIST): %_rollback:
	@echo "***resume pod of $*"
	-@$(ROLLBACKCMD) -f $(YAMLSPATH)/$*/deployment.yaml

$(HISTORY_LIST): %_history:
	@echo "***pod history of $*"
	-@$(HISTORYCMD) -f $(YAMLSPATH)/$*/deployment.yaml

.PHONY: help
help:
	@echo "Please add the value of ENV, such as dev, pre, prd, the default is dev"
	@echo "'make': build all base images & services images and deploy in kubernetes"
	@echo "'make services': build all services images and deploy in kubernetes"
	@echo "'make delete_services': delete all services in kubernetes"
	@echo "'make images_prepare':  prepare all dockerfiles of services"
	@echo "'make services_prepare':  prepare all yamls of services"
	@echo "'make delete_images_prepared_files': delete all prepared dockerfiles"
	@echo "'make delete_services_prepared_files': delete the prepare yaml files of all services"
	@echo "'make backend_service': build backend service images and deploy in kubernetes"
	@echo "'make delete_backend_service': delete backend service in kubernetes"
	@echo "'make delete_local_images': remove images in host"
	@echo "'make fe_service': build fe service images and deploy in kubernetes"
	@echo "'make delete_fe_service': delete fe service in kubernetes"
	@echo "'make ironman_service': build outsourcing fe service images and deploy in kubernetes"
	@echo "'make delete_ironman_service': delete outsourcing fe service in kubernetes"

