Allow deleting workspace after running terraform destroy

Also fixes a bug where the workspace was created from the wrong directory.

Change-Id: I28b54b9aa57a3f449254574956701ee663618e8b
This commit is contained in:
Albin Vass 2020-07-01 11:33:49 +02:00
parent 8501cc23fc
commit 7ef4d9f3f5
7 changed files with 325 additions and 126 deletions

View File

@ -28,6 +28,12 @@ Run terraform command. Assumes the appropriate version of terraform has been ins
Set to true if the workspace should automatically be created if
doesn't already exist.
.. zuul:rolevar:: terraform_purge_workspace
:default: false
Set to true if the workspace should be deleted
after running 'terraform destroy'.
.. zuul:rolevar:: terraform_comment
:default: true

View File

@ -1,5 +1,6 @@
terraform_executable: "{{ ansible_user_dir }}/.local/bin/terraform"
terraform_extra_args: ""
terraform_create_workspace: false
terraform_purge_workspace: false
terraform_comment: true
zuul_work_dir: "{{ zuul.project.src_dir }}"

View File

@ -23,10 +23,11 @@
when: terraform_workspace is defined
shell: |
set -o pipefail
{{ terraform_executable }} workspace list -no-color | sed 's/* //'
{{ terraform_executable }} workspace list -no-color | sed 's/^..//'
register: _terraform_workspace_list
args:
executable: /bin/bash
chdir: "{{ zuul_work_dir }}"
environment:
TF_IN_AUTOMATION: 1
@ -36,6 +37,8 @@
- terraform_workspace not in _terraform_workspace_list.stdout_lines
- terraform_create_workspace
command: "{{ terraform_executable }} workspace new -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul_work_dir }}"
environment:
TF_IN_AUTOMATION: 1
@ -43,6 +46,8 @@
when:
- terraform_workspace is defined
command: "{{ terraform_executable }} workspace select -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul_work_dir }}"
environment:
TF_IN_AUTOMATION: 1
@ -59,6 +64,26 @@
environment:
TF_IN_AUTOMATION: 1
- name: Remove workspace
when:
- terraform_purge_workspace
- terraform_command == "destroy"
- terraform_workspace is defined
- terraform_workspace != "default"
block:
- name: Leave workspace
command: "{{ terraform_executable }} workspace select -no-color default"
args:
chdir: "{{ zuul_work_dir }}"
environment:
TF_IN_AUTOMATION: 1
- name: Delete workspace
command: "{{ terraform_executable }} workspace delete -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul_work_dir }}"
environment:
TF_IN_AUTOMATION: 1
- name: Get path to main.tf relative to the repo root
when: terraform_command == "plan"
register: main_file_location

View File

@ -0,0 +1,40 @@
- hosts: all
tasks:
- name: Create workspace
include_role:
name: terraform
vars:
zuul_work_dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
terraform_command: plan
terraform_create_workspace: true
- name: Make sure workspace was created
command: "{{ terraform_executable }} workspace select -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul.project.src_dir }}/test-playbooks/terraform"
- name: Select default workspace
command: "{{ terraform_executable }} workspace select default"
args:
chdir: "{{ zuul.project.src_dir }}/test-playbooks/terraform"
- name: Use created workspace
include_role:
name: terraform
vars:
terraform_command: apply
- name: Delete workspace
include_role:
name: terraform
vars:
zuul_work_dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
terraform_command: destroy
terraform_purge_workspace: true
- name: Make sure workspace was removed
register: terraform_workspace_stat
failed_when: terraform_workspace_stat.rc == 0
command: "{{ terraform_executable }} workspace select -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul.project.src_dir }}/test-playbooks/terraform"

View File

@ -0,0 +1,246 @@
- job:
name: zuul-jobs-test-terraform
parent: terraform-plan
description: Test terraform job
tags: all-platforms
files:
- roles/ensure-terraform/.*
- roles/terraform/.*
- test-playbooks/terraform/.*
- zuul.d/terraform-jobs.yaml
- playbooks/terraform/.*
vars:
zuul_work_dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
terraform_workspace: testing
terraform_create_workspace: true
terraform_overrides:
- dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
content: |
module "test_module" {
source = "./other-module"
}
- job:
name: zuul-jobs-test-terraform-centos-7
description: Test terraform job on centos-7
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: centos-7
label: centos-7
- job:
name: zuul-jobs-test-terraform-centos-8
description: Test terraform job on centos-8
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: centos-8
label: centos-8
- job:
name: zuul-jobs-test-terraform-debian-stretch
description: Test terraform job on debian-stretch
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: debian-stretch
label: debian-stretch
- job:
name: zuul-jobs-test-terraform-fedora-31
description: Test terraform job on fedora-31
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: fedora-31
label: fedora-31
- job:
name: zuul-jobs-test-terraform-gentoo-17-0-systemd
description: Test terraform job on gentoo-17-0-systemd
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: gentoo-17-0-systemd
label: gentoo-17-0-systemd
- job:
name: zuul-jobs-test-terraform-opensuse-15
description: Test terraform job on opensuse-15
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: opensuse-15
label: opensuse-15
- job:
name: zuul-jobs-test-terraform-opensuse-tumbleweed-nv
voting: false
description: Test terraform job on opensuse-tumbleweed
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: opensuse-tumbleweed
label: opensuse-tumbleweed
- job:
name: zuul-jobs-test-terraform-ubuntu-bionic
description: Test terraform job on ubuntu-bionic
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-bionic
label: ubuntu-bionic
- job:
name: zuul-jobs-test-terraform-ubuntu-xenial
description: Test terraform job on ubuntu-xenial
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-xenial
label: ubuntu-xenial
- job:
name: zuul-jobs-test-terraform-role
parent: terraform-base
run: test-playbooks/terraform/test-terraform-role.yaml
description: Test terraform roles
tags: all-platforms
files:
- roles/ensure-terraform/.*
- roles/terraform/.*
- test-playbooks/terraform/.*
- zuul.d/terraform-jobs.yaml
- playbooks/terraform/.*
vars:
zuul_work_dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
terraform_workspace: testing
terraform_overrides:
- dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
content: |
module "test_module" {
source = "./other-module"
}
- job:
name: zuul-jobs-test-terraform-role-centos-7
description: Test terraform roles on centos-7
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: centos-7
label: centos-7
- job:
name: zuul-jobs-test-terraform-role-centos-8
description: Test terraform roles on centos-8
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: centos-8
label: centos-8
- job:
name: zuul-jobs-test-terraform-role-debian-stretch
description: Test terraform roles on debian-stretch
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: debian-stretch
label: debian-stretch
- job:
name: zuul-jobs-test-terraform-role-fedora-31
description: Test terraform roles on fedora-31
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: fedora-31
label: fedora-31
- job:
name: zuul-jobs-test-terraform-role-gentoo-17-0-systemd
description: Test terraform roles on gentoo-17-0-systemd
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: gentoo-17-0-systemd
label: gentoo-17-0-systemd
- job:
name: zuul-jobs-test-terraform-role-opensuse-15
description: Test terraform roles on opensuse-15
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: opensuse-15
label: opensuse-15
- job:
name: zuul-jobs-test-terraform-role-opensuse-tumbleweed-nv
voting: false
description: Test terraform roles on opensuse-tumbleweed
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: opensuse-tumbleweed
label: opensuse-tumbleweed
- job:
name: zuul-jobs-test-terraform-role-ubuntu-bionic
description: Test terraform roles on ubuntu-bionic
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-bionic
label: ubuntu-bionic
- job:
name: zuul-jobs-test-terraform-role-ubuntu-xenial
description: Test terraform roles on ubuntu-xenial
parent: zuul-jobs-test-terraform-role
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-xenial
label: ubuntu-xenial
- project:
check: &id001
jobs:
- zuul-jobs-test-terraform-centos-7
- zuul-jobs-test-terraform-centos-8
- zuul-jobs-test-terraform-debian-stretch
- zuul-jobs-test-terraform-fedora-31
- zuul-jobs-test-terraform-gentoo-17-0-systemd
- zuul-jobs-test-terraform-opensuse-15
- zuul-jobs-test-terraform-ubuntu-bionic
- zuul-jobs-test-terraform-ubuntu-xenial
- zuul-jobs-test-terraform-role-centos-7
- zuul-jobs-test-terraform-role-centos-8
- zuul-jobs-test-terraform-role-debian-stretch
- zuul-jobs-test-terraform-role-fedora-31
- zuul-jobs-test-terraform-role-gentoo-17-0-systemd
- zuul-jobs-test-terraform-role-opensuse-15
- zuul-jobs-test-terraform-role-ubuntu-bionic
- zuul-jobs-test-terraform-role-ubuntu-xenial
gate: *id001

View File

@ -1,125 +0,0 @@
- job:
name: zuul-jobs-test-terraform
parent: terraform-plan
description: Test terraform job
tags: all-platforms
files:
- roles/ensure-terraform/.*
- roles/terraform/.*
- test-playbooks/terraform/.*
- zuul.d/terraform-jobs.yaml
- playbooks/terraform/.*
vars:
zuul_work_dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
terraform_workspace: testing
terraform_create_workspace: true
terraform_overrides:
- dir: '{{ zuul.project.src_dir }}/test-playbooks/terraform'
content: |
module "test_module" {
source = "./other-module"
}
- job:
name: zuul-jobs-test-terraform-centos-7
description: Test terraform job on centos-7
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: centos-7
label: centos-7
- job:
name: zuul-jobs-test-terraform-centos-8
description: Test terraform job on centos-8
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: centos-8
label: centos-8
- job:
name: zuul-jobs-test-terraform-debian-stretch
description: Test terraform job on debian-stretch
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: debian-stretch
label: debian-stretch
- job:
name: zuul-jobs-test-terraform-fedora-31
description: Test terraform job on fedora-31
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: fedora-31
label: fedora-31
- job:
name: zuul-jobs-test-terraform-gentoo-17-0-systemd
description: Test terraform job on gentoo-17-0-systemd
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: gentoo-17-0-systemd
label: gentoo-17-0-systemd
- job:
name: zuul-jobs-test-terraform-opensuse-15
description: Test terraform job on opensuse-15
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: opensuse-15
label: opensuse-15
- job:
name: zuul-jobs-test-terraform-opensuse-tumbleweed-nv
voting: false
description: Test terraform job on opensuse-tumbleweed
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: opensuse-tumbleweed
label: opensuse-tumbleweed
- job:
name: zuul-jobs-test-terraform-ubuntu-bionic
description: Test terraform job on ubuntu-bionic
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-bionic
label: ubuntu-bionic
- job:
name: zuul-jobs-test-terraform-ubuntu-xenial
description: Test terraform job on ubuntu-xenial
parent: zuul-jobs-test-terraform
tags: auto-generated
nodeset:
nodes:
- name: ubuntu-xenial
label: ubuntu-xenial
- project:
check: &id001
jobs:
- zuul-jobs-test-terraform-centos-7
- zuul-jobs-test-terraform-centos-8
- zuul-jobs-test-terraform-debian-stretch
- zuul-jobs-test-terraform-fedora-31
- zuul-jobs-test-terraform-gentoo-17-0-systemd
- zuul-jobs-test-terraform-opensuse-15
- zuul-jobs-test-terraform-ubuntu-bionic
- zuul-jobs-test-terraform-ubuntu-xenial
gate: *id001

View File

@ -20,6 +20,12 @@
Set to true if the workspace should automatically be created if
doesn't already exist.
.. zuul:rolevar:: terraform_purge_workspace
:default: false
Set to true if the workspace should be deleted
after running 'terraform destroy'.
.. zuul:rolevar:: terraform_comment
:default: true