From 7dd20e23d1a407017923b999a04afeb75848ea37 Mon Sep 17 00:00:00 2001 From: Nitin Mishra Date: Thu, 3 Mar 2022 01:31:50 +0530 Subject: [PATCH] Adding Terratest code to test IaC --- .../Automated-test-with-Terratest/README.md | 24 +++++++++++++ .../examples/instance.tf | 12 +++++++ .../examples/output.tf | 4 +++ .../examples/provider.tf | 6 ++++ .../examples/securitygroup.tf | 9 +++++ .../examples/terraform.tfvars | 3 ++ .../examples/vars.tf | 17 ++++++++++ .../examples/versions.tf | 3 ++ .../test/terraform_test.go | 34 +++++++++++++++++++ 9 files changed, 112 insertions(+) create mode 100644 Days/IaC/Automated-test-with-Terratest/README.md create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/instance.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/output.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/provider.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/securitygroup.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/terraform.tfvars create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/vars.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/examples/versions.tf create mode 100644 Days/IaC/Automated-test-with-Terratest/test/terraform_test.go diff --git a/Days/IaC/Automated-test-with-Terratest/README.md b/Days/IaC/Automated-test-with-Terratest/README.md new file mode 100644 index 0000000..773322b --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/README.md @@ -0,0 +1,24 @@ +# terra-form-test-techhub + +Terratest is a Go library developed at Gruntwork, that makes it easier to write automated tests for our infrastructure code. It provides a variety of helper functions and patterns for common infrastructure testing tasks but here we will be discussing about Testing Terraform code. + +# To Run this application +* git clone https://github.com/imnitin28/terra-form-test-techhub.git
+* cd test
+* go mod init ""
+ **MODULE_NAME would be github.com//**
+* go mod init github.com/
+* go run + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +go mod init "" would create go.mod file into test folder.
+* The go.mod file is the root of dependency management in GoLang. +* All the modules which are needed or to be used in the project are maintained here in go.mod file. +* It creates entry for all the packages we are going to use/import in our project. +* It reduces effort for getting each dependencies manually. + +On running **go test** for the first time you would get go.sum file created. +* go.sum file is created when **go test** or **go build** is executed for the first time. +* It installs all the packages with specific version(latest) +* we do not need to edit or modify this file. diff --git a/Days/IaC/Automated-test-with-Terratest/examples/instance.tf b/Days/IaC/Automated-test-with-Terratest/examples/instance.tf new file mode 100644 index 0000000..5a9db2d --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/instance.tf @@ -0,0 +1,12 @@ +resource "aws_instance" "example" { + ami = var.AMIS[var.AWS_REGION] + instance_type = "t2.micro" + vpc_security_group_ids = [aws_security_group.instance.id] + + # When the instance boots, start a web server on port 8080 that responds with "Hello, World!". + user_data = < index.html +nohup busybox httpd -f -p 8080 & +EOF +} \ No newline at end of file diff --git a/Days/IaC/Automated-test-with-Terratest/examples/output.tf b/Days/IaC/Automated-test-with-Terratest/examples/output.tf new file mode 100644 index 0000000..752bb05 --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/output.tf @@ -0,0 +1,4 @@ +# Output the instance's public IP address. +output "public_ip" { + value = aws_instance.example.public_ip +} \ No newline at end of file diff --git a/Days/IaC/Automated-test-with-Terratest/examples/provider.tf b/Days/IaC/Automated-test-with-Terratest/examples/provider.tf new file mode 100644 index 0000000..696b517 --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/provider.tf @@ -0,0 +1,6 @@ +provider "aws" { + access_key = var.AWS_ACCESS_KEY + secret_key = var.AWS_SECRET_KEY + region = var.AWS_REGION +} + diff --git a/Days/IaC/Automated-test-with-Terratest/examples/securitygroup.tf b/Days/IaC/Automated-test-with-Terratest/examples/securitygroup.tf new file mode 100644 index 0000000..d562dee --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/securitygroup.tf @@ -0,0 +1,9 @@ +# Allow the instance to receive requests on port 8080. +resource "aws_security_group" "instance" { + ingress { + from_port = 8080 + to_port = 8080 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } +} \ No newline at end of file diff --git a/Days/IaC/Automated-test-with-Terratest/examples/terraform.tfvars b/Days/IaC/Automated-test-with-Terratest/examples/terraform.tfvars new file mode 100644 index 0000000..dcc3f3b --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/terraform.tfvars @@ -0,0 +1,3 @@ +AWS_ACCESS_KEY = "XXXX" +AWS_SECRET_KEY = "XXXXXXXX" +AWS_REGION="ap-south-1" diff --git a/Days/IaC/Automated-test-with-Terratest/examples/vars.tf b/Days/IaC/Automated-test-with-Terratest/examples/vars.tf new file mode 100644 index 0000000..9316302 --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/vars.tf @@ -0,0 +1,17 @@ +variable "AWS_ACCESS_KEY" { +} + +variable "AWS_SECRET_KEY" { +} + +variable "AWS_REGION" { + default = "ap-south-1" +} + +variable "AMIS" { + type = map(string) + default = { + ap-south-1 = "ami-0860c9429baba6ad2" + } +} + diff --git a/Days/IaC/Automated-test-with-Terratest/examples/versions.tf b/Days/IaC/Automated-test-with-Terratest/examples/versions.tf new file mode 100644 index 0000000..0ac1e24 --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/examples/versions.tf @@ -0,0 +1,3 @@ +terraform { + required_version = ">= 0.12.26" +} \ No newline at end of file diff --git a/Days/IaC/Automated-test-with-Terratest/test/terraform_test.go b/Days/IaC/Automated-test-with-Terratest/test/terraform_test.go new file mode 100644 index 0000000..93dc842 --- /dev/null +++ b/Days/IaC/Automated-test-with-Terratest/test/terraform_test.go @@ -0,0 +1,34 @@ +package test + +import ( + "fmt" + "testing" + "time" + + http_helper "github.com/gruntwork-io/terratest/modules/http-helper" + + "github.com/gruntwork-io/terratest/modules/terraform" +) + +func TestTerraformAwsHelloWorldExample(t *testing.T) { + t.Parallel() + + /*Construct the terraform options with default retryable errors to handle the most common retryable errors in terraform testing. */ + terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ + /* The path to where our Terraform code is located */ + TerraformDir: "../examples", + }) + + /* At the end of the test, run `terraform destroy` to clean up any resources that were created.*/ + defer terraform.Destroy(t, terraformOptions) + + /* Run `terraform init` and `terraform apply`. Fail the test if there are any errors. */ + terraform.InitAndApply(t, terraformOptions) + + /* Run `terraform output` to get the IP of the instance */ + publicIp := terraform.Output(t, terraformOptions, "public_ip") + + /* Make an HTTP request to the instance and make sure we get back a 200 OK with the body "Hello, World!" */ + url := fmt.Sprintf("http://%s:8080", publicIp) + http_helper.HttpGetWithRetry(t, url, nil, 200, "Hello, World!", 30, 5*time.Second) +}