# A Makefile for creating, running and testing Infindat's Ansible collection. ### Dependencies ### # - jq: https://stedolan.github.io/jq/ # - spruce: https://github.com/geofffranks/spruce ### environment ### # Include an env file with secrets. This exposes the secrets # as envvars only for the life of make. It does not # pollute the environment persistently. # Format: # API_KEY=someAnsibleGalaxyApiKey # The key only needs to be valid to use target galaxy-colletion-publish. _env = ~/.ssh/ansible-galaxy.sh include $(_env) export $(shell sed 's/=.*//' $(_env)) # Use color in Makefiles. # _use_color = true include Makefile-help ### Vars ### _version = $(shell spruce json galaxy.yml | jq '.version' | sed 's?"??g') _namespace = $(shell spruce json galaxy.yml | jq '.namespace' | sed 's?"??g') _name = $(shell spruce json galaxy.yml | jq '.name' | sed 's?"??g') _install_path = ~/.ansible/collections _install_path_local = $$HOME/.ansible/collections _venv = venv #_install_path_local = /opt/atest _requirements_file = requirements_2.10.txt _user = psus-gitlab-cicd _ibox_url = ibox1521 SHELL = /bin/bash ##@ General _check-vars: ifeq ($(strip $(API_KEY)),) @echo "API_KEY variable is unset" && false endif env-show: _check-vars @echo "API_KEY=[ set but redacted ]" version: _check-vars ## Show versions. ansible --version @echo ansible-Galaxy collection list _test-venv: @# Test that a venv is activated ifndef VIRTUAL_ENV @echo "Error: Virtual environment not set" @echo -e "\nRun:\n make pyvenv" @echo -e " source $(_venv)/bin/activate\n" exit 1 endif @echo "Virtual environment set" ##@ Galaxy galaxy-collection-build: ## Build the collection. @eval $(_begin) rm -rf collections/ ansible-galaxy collection build @eval $(_finish) galaxy-collection-build-force: ## Force build the collection. Overwrite an existing collection file. @eval $(_begin) ansible-galaxy collection build --force @eval $(_finish) galaxy-collection-publish: _check-vars ## Publish the collection to https://galaxy.ansible.com/ using the API key provided. @eval $(_begin) ansible-galaxy collection publish --api-key $(API_KEY) ./$(_namespace)-$(_name)-$(_version).tar.gz -vvv @eval $(_finish) galaxy-collection-install: ## Download and install from galaxy.ansible.com. This will wipe $(_install_path). @eval $(_begin) ansible-galaxy collection install $(_namespace).$(_name) --collections-path $(_install_path) --force @eval $(_finish) galaxy-collection-install-locally: ## Download and install from local tar file. @eval $(_begin) ansible-galaxy collection install --force $(_namespace)-$(_name)-$(_version).tar.gz --collections-path $(_install_path_local) @eval $(_finish) ##@ Playbooks Testing _test_playbook: @# Run a playbook specified by an envvar. @# See DEV_README.md cd playbooks && \ ansible-playbook \ --extra-vars "@../ibox_vars/iboxCICD.yaml" \ --ask-vault-pass \ "$$playbook_name" test-create-resources: ## Run full creation test suite as run by Gitlab CICD. @eval $(_begin) playbook_name=test_create_resources.yml $(_make) _test_playbook @eval $(_finish) test-remove-resources: ## Run full removal test suite as run by Gitlab CICD. @eval $(_begin) playbook_name=test_remove_resources.yml $(_make) _test_playbook @eval $(_finish) test-create-snapshots: ## Test creating immutable snapshots. @eval $(_begin) playbook_name=test_create_snapshots.yml $(_make) _test_playbook @eval $(_finish) test-remove-snapshots: ## Test removing immutable snapshots (teardown). @eval $(_begin) playbook_name=test_remove_snapshots.yml $(_make) _test_playbook @eval $(_finish) test-create-map-cluster: ## Run full creation test suite as run by Gitlab CICD. @eval $(_begin) playbook_name=test_create_map_cluster.yml $(_make) _test_playbook @eval $(_finish) test-remove-map-cluster: ## Run full removal test suite as run by Gitlab CICD. @eval $(_begin) playbook_name=test_remove_map_cluster.yml $(_make) _test_playbook @eval $(_finish) ### ansible-test ### test-sanity: @# Run ansible sanity tests in accordance with @# https://docs.ansible.com/ansible/devel/dev_guide/developing_collections.html#testing-collections @# This runs on an collection installed from galaxy. This makes it @# somewhat useless for dev and debugging. Use target test-sanity-locally. cd $(_install_path)/ansible_collections/infinidat/infinibox && \ ansible-test sanity --docker default -v _setup-sanity-locally: @# Setup a test env. cd $(_install_path_local)/ansible_collections/infinidat/infinibox && \ python3 -m venv $(_venv) && \ source $(_venv)/bin/activate && \ python -m pip install --upgrade pip && \ python -m pip install --upgrade --requirement $(_requirements_file) test-sanity-locally: _setup-sanity-locally @# Run ansible sanity tests in accordance with @# https://docs.ansible.com/ansible/devel/dev_guide/developing_collections.html#testing-collections @# This runs on an collection installed locally making it useful for dev and debugging. @# Not sure why, but ansible-test fails to discover py scripts to test. @# This specifies a "$test_file". cd $(_install_path_local)/ansible_collections/infinidat/infinibox && \ source $(_venv)/bin/activate && \ export test_file="plugins/modules/infini_map.py" && \ echo -e "\n$$(date) - Sanity testing $$test_file\n" && \ export ANSIBLE_LIBRARY="$(_install_path_local)/ansible_collections/infinidat/infinibox/plugins/modules:$$ANSIBLE_LIBRARY" && \ export ANSIBLE_LIBRARY="$(_install_path_local)/ansible_collections/infinidat/infinibox/plugins/module_utils:$$ANSIBLE_LIBRARY" && \ export ANSIBLE_LIBRARY="$(_install_path_local)/ansible_collections/infinidat/infinibox/plugins/filters:$$ANSIBLE_LIBRARY" && \ ansible-test sanity --docker default -v "$$test_file" test-sanity-locally-all: galaxy-collection-build-force galaxy-collection-install-locally test-sanity-locally @# Run local build, install and sanity test. @# Note that this will wipe $(_install_path_local). @echo "test-sanity-locally-all completed" ### IBox ### infinishell: @infinishell --user $(_user) $(_ibox_url) infinishell-events: @TERM=xterm echo "Command: event.watch username=$(_user) exclude=USER_LOGGED_OUT,USER_LOGIN_SUCCESS,USER_SESSION_EXPIRED,USER_LOGIN_FAILURE tail_length=35" @TERM=xterm infinishell --user $(_user) $(_ibox_url)