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 Set to true if the workspace should automatically be created if
doesn't already exist. 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 .. zuul:rolevar:: terraform_comment
:default: true :default: true

View File

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

View File

@ -23,10 +23,11 @@
when: terraform_workspace is defined when: terraform_workspace is defined
shell: | shell: |
set -o pipefail set -o pipefail
{{ terraform_executable }} workspace list -no-color | sed 's/* //' {{ terraform_executable }} workspace list -no-color | sed 's/^..//'
register: _terraform_workspace_list register: _terraform_workspace_list
args: args:
executable: /bin/bash executable: /bin/bash
chdir: "{{ zuul_work_dir }}"
environment: environment:
TF_IN_AUTOMATION: 1 TF_IN_AUTOMATION: 1
@ -36,6 +37,8 @@
- terraform_workspace not in _terraform_workspace_list.stdout_lines - terraform_workspace not in _terraform_workspace_list.stdout_lines
- terraform_create_workspace - terraform_create_workspace
command: "{{ terraform_executable }} workspace new -no-color {{ terraform_workspace }}" command: "{{ terraform_executable }} workspace new -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul_work_dir }}"
environment: environment:
TF_IN_AUTOMATION: 1 TF_IN_AUTOMATION: 1
@ -43,6 +46,8 @@
when: when:
- terraform_workspace is defined - terraform_workspace is defined
command: "{{ terraform_executable }} workspace select -no-color {{ terraform_workspace }}" command: "{{ terraform_executable }} workspace select -no-color {{ terraform_workspace }}"
args:
chdir: "{{ zuul_work_dir }}"
environment: environment:
TF_IN_AUTOMATION: 1 TF_IN_AUTOMATION: 1
@ -59,6 +64,26 @@
environment: environment:
TF_IN_AUTOMATION: 1 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 - name: Get path to main.tf relative to the repo root
when: terraform_command == "plan" when: terraform_command == "plan"
register: main_file_location 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 Set to true if the workspace should automatically be created if
doesn't already exist. 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 .. zuul:rolevar:: terraform_comment
:default: true :default: true