Skip to content

Commit

Permalink
[terraform] 0.12 support (#7)
Browse files Browse the repository at this point in the history
* Terraform 0.12 support

* Terraform 0.12 support

* drop empty scrit

* Update module pinning test

* fix tests

* fix tests

* reduce noise

* support no modules at all

* Update test/terraform/validate.bats
  • Loading branch information
osterman authored Jun 5, 2019
1 parent 523010a commit ffda33b
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 10 deletions.
11 changes: 10 additions & 1 deletion test/terraform/input-descriptions.bats
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
load 'lib'

function setup() {
TMPFILE="$(mktemp /tmp/terraform-docs-XXXXXXXXXXX.json)"
}

function teardown() {
rm -f $TMPFILE
}

@test "check if terraform inputs have descriptions" {
skip_unless_terraform
run bash -c "terraform-docs json . | jq -rS '.Inputs[] | select (.Description == \"\") | .Name'"
terraform_docs json . > $TMPFILE
run bash -c "jq -rS '.Inputs[] | select (.Description == \"\") | .Name + \" is missing a description\"' < $TMPFILE"
log "$output"
[ -z "$output" ]
}
16 changes: 16 additions & 0 deletions test/terraform/lib.bash
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,19 @@ function clean() {
function skip_unless_terraform() {
[[ -n $(echo *.tf) ]] || skip "no *.tf files"
}

function terraform_docs() {
local TMP_FILE
which awk 2>&1 >/dev/null || ( echo "awk not available"; exit 1)
which terraform 2>&1 >/dev/null || ( echo "terraform not available"; exit 1)
which terraform-docs 2>&1 >/dev/null || ( echo "terraform-docs not available"; exit 1)

if [[ "`terraform version | head -1`" =~ 0\.12 ]]; then
TMP_FILE="$(mktemp /tmp/terraform-docs-XXXXXXXXXX.tf)"
awk -f ${BATS_TEST_DIRNAME}/terraform-docs.awk $2/*.tf > ${TMP_FILE}
terraform-docs $1 ${TMP_FILE}
rm -f ${TMP_FILE}
else
terraform-docs $1 $2
fi
}
14 changes: 10 additions & 4 deletions test/terraform/module-pinning.bats
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
load 'lib'

function setup() {
:
TMPFILE="$(mktemp /tmp/terraform-modules-XXXXXXXXXXX.txt)"
}

function teardown() {
#rm -f $TMPFILE
:
}

@test "check if terraform modules are properly pinned" {
skip_unless_terraform
run bash -c "cat *.tf | json2hcl -reverse | jq -r '..|select(.source?)|.source' | sort -u | sed 's/^.*?ref=//' | grep -Ev '^(tags/[0-9]+\\.[0-9]+.*|)$$'"
log "$output"
[ $status -ne 0 ]
grep -Eo '^\s*source\s*=\s*"(.*?)"' *.tf | cut -d'"' -f2 | sort -u > $TMPFILE
if [ -s $TMPFILE ]; then
# Verify the modules are pinned to `tags/x.y` or nothing at all (maybe using `version` parameter instead)
sed 's/^.*?ref=//' < $TMPFILE | grep -E '^(tags/[0-9]+\.[0-9]+.*|)$'
else
# If the file is empty, then no modules are being used
true
fi
}
11 changes: 10 additions & 1 deletion test/terraform/output-descriptions.bats
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
load 'lib'

function setup() {
TMPFILE="$(mktemp /tmp/terraform-docs-XXXXXXXXXXX.json)"
}

function teardown() {
rm -f $TMPFILE
}

@test "check if terraform outputs have descriptions" {
skip_unless_terraform
run bash -c "terraform-docs json . | jq -rS '.Outputs[] | select (.Description == \"\") | .Name'"
terraform_docs json . > $TMPFILE
run bash -c "jq -rS '.Outputs[] | select (.Description == \"\") | .Name + \" is missing a description\"' < $TMPFILE"
log "$output"
[ -z "$output" ]
}
46 changes: 46 additions & 0 deletions test/terraform/terraform-docs.awk
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# This script converts Terraform 0.12 variables/outputs to something suitable for `terraform-docs`
# As of terraform-docs v0.6.0, HCL2 is not supported. This script is a *dirty hack* to get around it.
# https://github.com/segmentio/terraform-docs/
# https://github.com/segmentio/terraform-docs/issues/62

{
if ( /\{/ ) {
braceCnt++
}

if ( /\}/ ) {
braceCnt--
}

if ($0 ~ /(variable|output) "(.*?)"/) {
blockCnt++
print $0
}

if ($1 == "description") {
print $0
}

if ($1 == "default") {
if (braceCnt > 1) {
print " default = {}"
} else {
print $0
}
}

if ($1 == "type" ) {
type=$3
if (type ~ "object") {
print " type = \"object\""
} else {
gsub(/"/, "", $3)
print " type = \"" $3 "\""
}
}

if (braceCnt == 0 && blockCnt > 0) {
blockCnt--
print $0
}
}
24 changes: 20 additions & 4 deletions test/terraform/validate.bats
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
load 'lib'

function setup() {
skip_unless_terraform
clean
export TF_CLI_ARGS_init="-input=false -backend=false"
terraform init
}

function teardown() {
clean
unset TF_CLI_ARGS_plan
}

@test "check if terraform code is valid" {
skip_unless_terraform
run terraform validate -check-variables=false
log "$output"
[ $status -eq 0 ]
[ -z "$output" ]
if [[ "`terraform version | head -1`" =~ 0\.12 ]]; then
run terraform validate .
[ $status -eq 0 ]
else
run terraform validate -check-variables=false
[ $status -eq 0 ]
[ -z "$output" ]
fi
}

0 comments on commit ffda33b

Please sign in to comment.