Full Code of gruntwork-io/terratest for AI

main 68667d560018 cached
1130 files
3.0 MB
849.1k tokens
3057 symbols
1 requests
Download .txt
Showing preview only (3,372K chars total). Download the full file or copy to clipboard to get everything.
Repository: gruntwork-io/terratest
Branch: main
Commit: 68667d560018
Files: 1130
Total size: 3.0 MB

Directory structure:
gitextract_g6sf3yo0/

├── .circleci/
│   └── config.yml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── no-response.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── ci.yml
│       ├── lint.yml
│       └── update-lint-config.yml
├── .gitignore
├── .golangci.yml
├── .pre-commit-config.yaml
├── CODEOWNERS
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── REFACTOR.md
├── SECURITY.md
├── cmd/
│   ├── pick-instance-type/
│   │   └── main.go
│   └── terratest_log_parser/
│       └── main.go
├── docs/
│   ├── .gitignore
│   ├── CNAME
│   ├── Dockerfile
│   ├── Gemfile
│   ├── README.md
│   ├── _config.yml
│   ├── _data/
│   │   ├── examples.yml
│   │   └── prism_extends.yml
│   ├── _docs/
│   │   ├── 01_getting-started/
│   │   │   ├── examples.md
│   │   │   ├── godoc.md
│   │   │   ├── introduction.md
│   │   │   ├── packages-overview.md
│   │   │   ├── quick-start.md
│   │   │   └── testing-terragrunt.md
│   │   ├── 02_testing-best-practices/
│   │   │   ├── alternative-testing-tools.md
│   │   │   ├── avoid-test-caching.md
│   │   │   ├── cleanup.md
│   │   │   ├── debugging-interleaved-test-output.md
│   │   │   ├── error-handling.md
│   │   │   ├── idempotent.md
│   │   │   ├── iterating-locally-using-docker.md
│   │   │   ├── iterating-locally-using-test-stages.md
│   │   │   ├── namespacing.md
│   │   │   ├── picking-instance-types.md
│   │   │   ├── testing-environment.md
│   │   │   ├── timeouts-and-logging.md
│   │   │   ├── tools-and-plugins.md
│   │   │   └── unit-integration-end-to-end-test.md
│   │   └── 04_community/
│   │       ├── contributing.md
│   │       ├── license.md
│   │       └── support.md
│   ├── _includes/
│   │   ├── built-by.html
│   │   ├── canonical-url.html
│   │   ├── collection_browser/
│   │   │   ├── _cta-section.html
│   │   │   ├── _doc-header.html
│   │   │   ├── _doc-page.html
│   │   │   ├── _doc-thumb.html
│   │   │   ├── _doc-thumb__excerpt.html
│   │   │   ├── _docs-list.html
│   │   │   ├── _no-search-results.html
│   │   │   ├── _search.html
│   │   │   ├── _sidebar.html
│   │   │   ├── browser.html
│   │   │   └── navigation/
│   │   │       └── _collection_toc.html
│   │   ├── examples/
│   │   │   ├── example.html
│   │   │   └── explorer.html
│   │   ├── favicon.html
│   │   ├── footer.html
│   │   ├── get-access.html
│   │   ├── head.html
│   │   ├── header-min.html
│   │   ├── header.html
│   │   ├── links-n-built-by.html
│   │   ├── links-n-get-access.html
│   │   ├── links-section.html
│   │   ├── logo.html
│   │   ├── navbar.html
│   │   ├── scripts.html
│   │   ├── share-meta.html
│   │   ├── styles.html
│   │   ├── switch.html
│   │   └── video-player.html
│   ├── _layouts/
│   │   ├── collection-browser-doc.html
│   │   ├── collection-browser.html
│   │   ├── contact.html
│   │   ├── default.html
│   │   ├── post.html
│   │   └── subpage.html
│   ├── _pages/
│   │   ├── 404/
│   │   │   └── 404.md
│   │   ├── commercial-support/
│   │   │   └── index.html
│   │   ├── contact/
│   │   │   ├── _contact-form.html
│   │   │   └── index.html
│   │   ├── cookie-policy/
│   │   │   └── index.md
│   │   ├── docs/
│   │   │   └── index.html
│   │   ├── examples/
│   │   │   └── index.html
│   │   ├── index/
│   │   │   ├── _built_by.html
│   │   │   ├── _cta_section.html
│   │   │   ├── _header.html
│   │   │   ├── _terratest-in-4-steps.html
│   │   │   ├── _test-with-terratest.html
│   │   │   ├── _watch.html
│   │   │   └── index.html
│   │   └── thanks/
│   │       └── index.html
│   ├── _posts/
│   │   └── .keep
│   ├── assets/
│   │   ├── css/
│   │   │   ├── _variables.scss
│   │   │   ├── bootstrap/
│   │   │   │   └── scss/
│   │   │   │       └── bootstrap.scss
│   │   │   ├── collection_browser.scss
│   │   │   ├── components.scss
│   │   │   ├── examples.scss
│   │   │   ├── global.scss
│   │   │   ├── pages/
│   │   │   │   ├── contact.scss
│   │   │   │   ├── cookie-policy.scss
│   │   │   │   ├── home.scss
│   │   │   │   └── support.scss
│   │   │   ├── prism.css
│   │   │   ├── prism_custom.scss
│   │   │   ├── styles.scss
│   │   │   ├── subpage.scss
│   │   │   └── utilities.scss
│   │   ├── img/
│   │   │   └── favicon/
│   │   │       ├── browserconfig.xml
│   │   │       └── manifest.json
│   │   └── js/
│   │       ├── collection-browser_scroll.js
│   │       ├── collection-browser_search.js
│   │       ├── collection-browser_toc.js
│   │       ├── contact-form.js
│   │       ├── cookie.js
│   │       ├── examples.js
│   │       ├── main.js
│   │       ├── prism.js
│   │       └── video-player.js
│   ├── docker-compose.yml
│   ├── jekyll-serve.sh
│   └── scripts/
│       ├── convert_adoc_to_md.sh
│       └── convert_md_to_adoc.sh
├── examples/
│   ├── azure/
│   │   ├── README.md
│   │   ├── terraform-azure-aci-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-acr-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-actiongroup-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-aks-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── nginx-deployment.yml
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-availabilityset-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-container-apps-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-cosmosdb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-datafactory-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-disk-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-frontdoor-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-functionapp-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-keyvault-example/
│   │   │   ├── README.md
│   │   │   ├── example.pfx
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-loadbalancer-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-loganalytics-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-monitor-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-mysqldb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-network-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-nsg-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-postgresql-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-recoveryservices-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-resourcegroup-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-servicebus-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-sqldb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-sqlmanagedinstance-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-storage-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-synapse-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   └── terraform-azure-vm-example/
│   │       ├── README.md
│   │       ├── main.tf
│   │       ├── outputs.tf
│   │       └── variables.tf
│   ├── docker-compose-stdout-example/
│   │   ├── Dockerfile
│   │   ├── bash_script.sh
│   │   └── docker-compose.yml
│   ├── docker-hello-world-example/
│   │   ├── Dockerfile
│   │   └── README.md
│   ├── helm-basic-example/
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── values.yaml
│   ├── helm-dependency-example/
│   │   ├── .gitignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── values.yaml
│   ├── kubernetes-basic-example/
│   │   ├── README.md
│   │   ├── nginx-deployment.yml
│   │   └── podinfo-daemonset.yml
│   ├── kubernetes-hello-world-example/
│   │   ├── README.md
│   │   └── hello-world-deployment.yml
│   ├── kubernetes-kustomize-example/
│   │   ├── README.md
│   │   ├── deployment.yaml
│   │   ├── kustomization.yaml
│   │   └── service.yaml
│   ├── kubernetes-rbac-example/
│   │   ├── README.md
│   │   └── namespace-service-account.yml
│   ├── packer-basic-example/
│   │   ├── README.md
│   │   ├── build-gcp.pkr.hcl
│   │   └── build.pkr.hcl
│   ├── packer-docker-example/
│   │   ├── README.md
│   │   ├── app.rb
│   │   ├── build.json
│   │   ├── build.pkr.hcl
│   │   ├── configure-sinatra-app.sh
│   │   └── docker-compose.yml
│   ├── packer-hello-world-example/
│   │   ├── README.md
│   │   └── build.pkr.hcl
│   ├── terraform-asg-scp-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-dynamodb-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── terraform-aws-ec2-windows-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── packer/
│   │   │   ├── build.pkr.hcl
│   │   │   └── scripts/
│   │   │       ├── bootstrap_windows.txt
│   │   │       ├── install_chocolatey.ps1
│   │   │       └── install_packages.ps1
│   │   └── variables.tf
│   ├── terraform-aws-ecs-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-aws-lambda-example/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── src/
│   │   │   ├── README.md
│   │   │   └── bootstrap.go
│   │   └── variables.tf
│   ├── terraform-aws-network-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── terraform-aws-rds-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-s3-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-ssm-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-backend-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-basic-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── varfile.tfvars
│   │   └── variables.tf
│   ├── terraform-database-example/
│   │   ├── REAME.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-gcp-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-gcp-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-gcp-ig-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-http-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-opa-example/
│   │   ├── README.md
│   │   ├── fail/
│   │   │   ├── main_fail.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── pass/
│   │   │   ├── main_pass.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   └── policy/
│   │       ├── enforce_source.rego
│   │       └── enforce_source_v0.rego
│   ├── terraform-packer-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-redeploy-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-remote-exec-example/
│   │   ├── README.md
│   │   ├── files/
│   │   │   └── get-public-ip.sh
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-ssh-certificate-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user_data.sh
│   │   └── variables.tf
│   ├── terraform-ssh-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-ssh-password-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user_data.sh
│   │   └── variables.tf
│   ├── terragrunt-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── terragrunt.hcl
│   ├── terragrunt-multi-module-example/
│   │   ├── README.md
│   │   ├── live/
│   │   │   ├── app/
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── database/
│   │   │   │   └── terragrunt.hcl
│   │   │   └── vpc/
│   │   │       └── terragrunt.hcl
│   │   └── modules/
│   │       ├── app/
│   │       │   └── main.tf
│   │       ├── database/
│   │       │   └── main.tf
│   │       └── vpc/
│   │           └── main.tf
│   └── terragrunt-second-example/
│       ├── main.tf
│       └── terragrunt.hcl
├── go.mod
├── go.sum
├── internal/
│   └── lib/
│       └── formatting/
│           ├── format.go
│           └── format_test.go
├── mise.toml
├── modules/
│   ├── aws/
│   │   ├── account.go
│   │   ├── account_test.go
│   │   ├── acm.go
│   │   ├── ami.go
│   │   ├── ami_test.go
│   │   ├── asg.go
│   │   ├── asg_test.go
│   │   ├── auth.go
│   │   ├── aws.go
│   │   ├── cloudwatch.go
│   │   ├── dynamodb.go
│   │   ├── ebs.go
│   │   ├── ec2-files.go
│   │   ├── ec2-syslog.go
│   │   ├── ec2.go
│   │   ├── ec2_test.go
│   │   ├── ecr.go
│   │   ├── ecr_test.go
│   │   ├── ecs.go
│   │   ├── ecs_test.go
│   │   ├── errors.go
│   │   ├── iam.go
│   │   ├── iam_test.go
│   │   ├── keypair.go
│   │   ├── keypair_test.go
│   │   ├── kms.go
│   │   ├── lambda.go
│   │   ├── lambda_test.go
│   │   ├── rds.go
│   │   ├── rds_test.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── route53.go
│   │   ├── route53_test.go
│   │   ├── s3.go
│   │   ├── s3_test.go
│   │   ├── secretsmanager.go
│   │   ├── secretsmanager_test.go
│   │   ├── sns.go
│   │   ├── sns_test.go
│   │   ├── sqs.go
│   │   ├── sqs_test.go
│   │   ├── ssm.go
│   │   ├── ssm_test.go
│   │   ├── vpc.go
│   │   └── vpc_test.go
│   ├── azure/
│   │   ├── actiongroup.go
│   │   ├── actiongroup_test.go
│   │   ├── aks.go
│   │   ├── appService.go
│   │   ├── appService_test.go
│   │   ├── authorizer.go
│   │   ├── availabilityset.go
│   │   ├── availabilityset_test.go
│   │   ├── azure.go
│   │   ├── client_factory.go
│   │   ├── client_factory_test.go
│   │   ├── common.go
│   │   ├── common_test.go
│   │   ├── compute.go
│   │   ├── compute_test.go
│   │   ├── container_apps.go
│   │   ├── container_apps_test.go
│   │   ├── containers.go
│   │   ├── containers_test.go
│   │   ├── cosmosdb.go
│   │   ├── datafactory.go
│   │   ├── datafactory_test.go
│   │   ├── disk.go
│   │   ├── disk_test.go
│   │   ├── enums.go
│   │   ├── errors.go
│   │   ├── frontdoor.go
│   │   ├── frontdoor_test.go
│   │   ├── keyvault.go
│   │   ├── keyvault_test.go
│   │   ├── loadbalancer.go
│   │   ├── loadbalancer_test.go
│   │   ├── loganalytics.go
│   │   ├── loganalytics_test.go
│   │   ├── monitor.go
│   │   ├── monitor_test.go
│   │   ├── mysql.go
│   │   ├── mysql_test.go
│   │   ├── networkinterface.go
│   │   ├── networkinterface_test.go
│   │   ├── nsg.go
│   │   ├── nsg_test.go
│   │   ├── postgresql.go
│   │   ├── postgresql_test.go
│   │   ├── privatednszone.go
│   │   ├── privatednszone_test.go
│   │   ├── publicaddress.go
│   │   ├── publicaddress_test.go
│   │   ├── recoveryservices.go
│   │   ├── recoveryservices_test.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── resourcegroup.go
│   │   ├── resourcegroup_test.go
│   │   ├── resourcegroupv2.go
│   │   ├── resourcegroupv2_test.go
│   │   ├── resourceid.go
│   │   ├── resourceid_test.go
│   │   ├── servicebus.go
│   │   ├── servicebus_test.go
│   │   ├── sql.go
│   │   ├── sql_managedinstance.go
│   │   ├── sql_managedinstance_test.go
│   │   ├── sql_test.go
│   │   ├── storage.go
│   │   ├── storage_test.go
│   │   ├── subscription.go
│   │   ├── synapse.go
│   │   ├── synapse_test.go
│   │   ├── virtualnetwork.go
│   │   └── virtualnetwork_test.go
│   ├── collections/
│   │   ├── collections.go
│   │   ├── errors.go
│   │   ├── lists.go
│   │   ├── lists_test.go
│   │   ├── stringslicevalue.go
│   │   └── stringslicevalue_test.go
│   ├── database/
│   │   └── database.go
│   ├── dns-helper/
│   │   ├── dns_helper.go
│   │   ├── dns_helper_test.go
│   │   ├── dns_local_server.go
│   │   └── errors.go
│   ├── docker/
│   │   ├── build.go
│   │   ├── build_test.go
│   │   ├── docker.go
│   │   ├── docker_compose.go
│   │   ├── docker_compose_test.go
│   │   ├── host.go
│   │   ├── host_test.go
│   │   ├── images.go
│   │   ├── images_test.go
│   │   ├── inspect.go
│   │   ├── inspect_test.go
│   │   ├── push.go
│   │   ├── run.go
│   │   ├── run_test.go
│   │   ├── stop.go
│   │   └── stop_test.go
│   ├── environment/
│   │   ├── environment.go
│   │   ├── envvar.go
│   │   └── envvar_test.go
│   ├── files/
│   │   ├── errors.go
│   │   ├── files.go
│   │   └── files_test.go
│   ├── gcp/
│   │   ├── cloudbuild.go
│   │   ├── cloudbuild_test.go
│   │   ├── compute.go
│   │   ├── compute_test.go
│   │   ├── compute_unit_test.go
│   │   ├── gcp.go
│   │   ├── gcr.go
│   │   ├── oslogin.go
│   │   ├── oslogin_test.go
│   │   ├── provider.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── static_token.go
│   │   ├── static_token_test.go
│   │   ├── storage.go
│   │   └── storage_test.go
│   ├── git/
│   │   ├── git.go
│   │   └── git_test.go
│   ├── helm/
│   │   ├── cmd.go
│   │   ├── cmd_test.go
│   │   ├── delete.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── helm.go
│   │   ├── install.go
│   │   ├── install_test.go
│   │   ├── options.go
│   │   ├── repo.go
│   │   ├── rollback.go
│   │   ├── template.go
│   │   ├── template_test.go
│   │   ├── testdata/
│   │   │   ├── configmap-literalblock.yaml
│   │   │   ├── deployment.yaml
│   │   │   ├── deployments-array.yaml
│   │   │   ├── deployments.yaml
│   │   │   ├── deprecated-chart/
│   │   │   │   ├── Chart.yaml
│   │   │   │   └── templates/
│   │   │   │       └── deployment.yaml
│   │   │   ├── invalid-duplicate.yaml
│   │   │   └── multiple-manifests/
│   │   │       ├── Chart.yaml
│   │   │       └── templates/
│   │   │           ├── configmap.yaml
│   │   │           └── deployment.yaml
│   │   ├── upgrade.go
│   │   └── upgrade_test.go
│   ├── http-helper/
│   │   ├── continuous.go
│   │   ├── dummy_server.go
│   │   ├── dummy_server_test.go
│   │   ├── errors.go
│   │   ├── http_helper.go
│   │   └── http_helper_test.go
│   ├── k8s/
│   │   ├── client.go
│   │   ├── cluster_role.go
│   │   ├── cluster_role_test.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── configmap.go
│   │   ├── configmap_test.go
│   │   ├── cronjob.go
│   │   ├── cronjob_test.go
│   │   ├── daemonset.go
│   │   ├── daemonset_test.go
│   │   ├── deployment.go
│   │   ├── deployment_test.go
│   │   ├── errors.go
│   │   ├── errors_test.go
│   │   ├── event.go
│   │   ├── event_test.go
│   │   ├── ingress.go
│   │   ├── ingress_test.go
│   │   ├── job.go
│   │   ├── job_test.go
│   │   ├── jsonpath.go
│   │   ├── jsonpath_test.go
│   │   ├── k8s.go
│   │   ├── kubectl.go
│   │   ├── kubectl_options.go
│   │   ├── kubectl_test.go
│   │   ├── minikube.go
│   │   ├── minikube_test.go
│   │   ├── namespace.go
│   │   ├── namespace_test.go
│   │   ├── networkpolicy.go
│   │   ├── networkpolicy_test.go
│   │   ├── node.go
│   │   ├── node_test.go
│   │   ├── persistent_volume.go
│   │   ├── persistent_volume_claim.go
│   │   ├── persistent_volume_claim_test.go
│   │   ├── persistent_volume_test.go
│   │   ├── pod.go
│   │   ├── pod_test.go
│   │   ├── replicaset.go
│   │   ├── replicaset_test.go
│   │   ├── role.go
│   │   ├── role_test.go
│   │   ├── secret.go
│   │   ├── secret_test.go
│   │   ├── self_subject_access_review.go
│   │   ├── self_subject_access_review_test.go
│   │   ├── service.go
│   │   ├── service_account.go
│   │   ├── service_account_test.go
│   │   ├── service_test.go
│   │   ├── tunnel.go
│   │   ├── tunnel_test.go
│   │   ├── version.go
│   │   └── version_test.go
│   ├── logger/
│   │   ├── logger.go
│   │   ├── logger_test.go
│   │   └── parser/
│   │       ├── failed_test_marker.go
│   │       ├── failed_test_marker_test.go
│   │       ├── fixtures/
│   │       │   ├── basic_example.log
│   │       │   ├── basic_example_expected/
│   │       │   │   ├── TestCloseChannelsClosesAll.log
│   │       │   │   ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │   │   ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │   │   ├── TestGetIndent/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── EmptyString.log
│   │       │   │   │   ├── MixTabSpace.log
│   │       │   │   │   ├── NoIndent.log
│   │       │   │   │   └── Tabs.log
│   │       │   │   ├── TestGetIndent.log
│   │       │   │   ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │   │   ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │   │   ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │   │   ├── TestGetTestNameFromResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestGetTestNameFromResultLine.log
│   │       │   │   ├── TestGetTestNameFromStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestGetTestNameFromStatusLine.log
│   │       │   │   ├── TestIsEmpty.log
│   │       │   │   ├── TestIsPanicLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotPanic.log
│   │       │   │   ├── TestIsPanicLine.log
│   │       │   │   ├── TestIsResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonResultLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestIsResultLine.log
│   │       │   │   ├── TestIsStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonStatusLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestIsStatusLine.log
│   │       │   │   ├── TestIsSummaryLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotSummary.log
│   │       │   │   ├── TestIsSummaryLine.log
│   │       │   │   ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │   │   ├── TestPeek.log
│   │       │   │   ├── TestPeekEmpty.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkers.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │   │   ├── TestStackPop.log
│   │       │   │   ├── TestStackPopEmpty.log
│   │       │   │   ├── TestStackPush.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── failing_example.log
│   │       │   ├── failing_example_expected/
│   │       │   │   ├── TestBasicExample.log
│   │       │   │   ├── TestCloseChannelsClosesAll.log
│   │       │   │   ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │   │   ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │   │   ├── TestGetIndent/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── EmptyString.log
│   │       │   │   │   ├── MixTabSpace.log
│   │       │   │   │   ├── NoIndent.log
│   │       │   │   │   └── Tabs.log
│   │       │   │   ├── TestGetIndent.log
│   │       │   │   ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │   │   ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │   │   ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │   │   ├── TestGetTestNameFromResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestGetTestNameFromResultLine.log
│   │       │   │   ├── TestGetTestNameFromStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestGetTestNameFromStatusLine.log
│   │       │   │   ├── TestIsEmpty.log
│   │       │   │   ├── TestIsPanicLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotPanic.log
│   │       │   │   ├── TestIsPanicLine.log
│   │       │   │   ├── TestIsResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonResultLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestIsResultLine.log
│   │       │   │   ├── TestIsStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonStatusLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestIsStatusLine.log
│   │       │   │   ├── TestIsSummaryLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotSummary.log
│   │       │   │   ├── TestIsSummaryLine.log
│   │       │   │   ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │   │   ├── TestPanicExample.log
│   │       │   │   ├── TestPeek.log
│   │       │   │   ├── TestPeekEmpty.log
│   │       │   │   ├── TestRealWorldExample.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkers.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │   │   ├── TestStackPop.log
│   │       │   │   ├── TestStackPopEmpty.log
│   │       │   │   ├── TestStackPush.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── new_go_failing_example.log
│   │       │   ├── new_go_failing_example_expected/
│   │       │   │   ├── TestIntegrationBasicExample.log
│   │       │   │   ├── TestIntegrationFailingExample.log
│   │       │   │   ├── TestIntegrationPanicExample.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── panic_example.log
│   │       │   └── panic_example_expected/
│   │       │       ├── TestCloseChannelsClosesAll.log
│   │       │       ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │       ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │       ├── TestGetIndent/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── EmptyString.log
│   │       │       │   ├── MixTabSpace.log
│   │       │       │   ├── NoIndent.log
│   │       │       │   └── Tabs.log
│   │       │       ├── TestGetIndent.log
│   │       │       ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │       ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │       ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │       ├── TestGetTestNameFromResultLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   └── WhenFailed.log
│   │       │       ├── TestGetTestNameFromResultLine.log
│   │       │       ├── TestGetTestNameFromStatusLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   ├── WhenCont.log
│   │       │       │   └── WhenPaused.log
│   │       │       ├── TestGetTestNameFromStatusLine.log
│   │       │       ├── TestIsEmpty.log
│   │       │       ├── TestIsPanicLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   └── NotPanic.log
│   │       │       ├── TestIsPanicLine.log
│   │       │       ├── TestIsResultLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── NonResultLine.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   └── WhenFailed.log
│   │       │       ├── TestIsResultLine.log
│   │       │       ├── TestIsStatusLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── NonStatusLine.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   ├── WhenCont.log
│   │       │       │   └── WhenPaused.log
│   │       │       ├── TestIsStatusLine.log
│   │       │       ├── TestIsSummaryLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   └── NotSummary.log
│   │       │       ├── TestIsSummaryLine.log
│   │       │       ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │       ├── TestPeek.log
│   │       │       ├── TestPeekEmpty.log
│   │       │       ├── TestRemoveDedentedTestResultMarkers.log
│   │       │       ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │       ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │       ├── TestStackPop.log
│   │       │       ├── TestStackPopEmpty.log
│   │       │       ├── TestStackPush.log
│   │       │       ├── report.xml
│   │       │       └── summary.log
│   │       ├── helpers_for_test.go
│   │       ├── integration_test.go
│   │       ├── parser.go
│   │       ├── parser_test.go
│   │       ├── store.go
│   │       └── store_test.go
│   ├── oci/
│   │   ├── compute.go
│   │   ├── identity.go
│   │   ├── network.go
│   │   └── provider.go
│   ├── opa/
│   │   ├── download_policy.go
│   │   ├── download_policy_test.go
│   │   ├── eval.go
│   │   └── eval_test.go
│   ├── packer/
│   │   ├── packer.go
│   │   └── packer_test.go
│   ├── random/
│   │   ├── random.go
│   │   └── random_test.go
│   ├── retry/
│   │   ├── retry.go
│   │   └── retry_test.go
│   ├── shell/
│   │   ├── command.go
│   │   ├── command_test.go
│   │   ├── output.go
│   │   └── shell.go
│   ├── slack/
│   │   ├── doc.go
│   │   ├── validate.go
│   │   └── validate_test.go
│   ├── ssh/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── key_pair.go
│   │   ├── key_pair_test.go
│   │   ├── session.go
│   │   ├── session_test.go
│   │   ├── ssh.go
│   │   └── ssh_test.go
│   ├── terraform/
│   │   ├── apply.go
│   │   ├── apply_test.go
│   │   ├── cmd.go
│   │   ├── cmd_test.go
│   │   ├── count.go
│   │   ├── count_test.go
│   │   ├── destroy.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── get.go
│   │   ├── init.go
│   │   ├── init_test.go
│   │   ├── opa_check.go
│   │   ├── options.go
│   │   ├── options_test.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── plan.go
│   │   ├── plan_struct.go
│   │   ├── plan_struct_test.go
│   │   ├── plan_test.go
│   │   ├── show.go
│   │   ├── show_test.go
│   │   ├── terraform.go
│   │   ├── validate.go
│   │   ├── validate_test.go
│   │   ├── var-file.go
│   │   ├── var-file_test.go
│   │   ├── var.go
│   │   ├── workspace.go
│   │   └── workspace_test.go
│   ├── terragrunt/
│   │   ├── README.md
│   │   ├── apply.go
│   │   ├── apply_test.go
│   │   ├── cmd.go
│   │   ├── cmd_args_test.go
│   │   ├── destroy.go
│   │   ├── destroy_test.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── graph.go
│   │   ├── graph_test.go
│   │   ├── hcl_validate.go
│   │   ├── hcl_validate_test.go
│   │   ├── init.go
│   │   ├── init_test.go
│   │   ├── json_helpers.go
│   │   ├── json_helpers_test.go
│   │   ├── options.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── plan.go
│   │   ├── plan_test.go
│   │   ├── render.go
│   │   ├── render_test.go
│   │   ├── run.go
│   │   ├── run_all.go
│   │   ├── run_all_test.go
│   │   ├── run_test.go
│   │   ├── stack_clean.go
│   │   ├── stack_clean_test.go
│   │   ├── stack_generate.go
│   │   ├── stack_generate_test.go
│   │   ├── stack_output.go
│   │   ├── stack_output_test.go
│   │   ├── stack_run.go
│   │   ├── stack_run_test.go
│   │   ├── terragrunt_e2e_test.go
│   │   ├── terragrunt_example_test.go
│   │   ├── testdata/
│   │   │   ├── terragrunt-multi-plan/
│   │   │   │   ├── bar/
│   │   │   │   │   ├── main.tf
│   │   │   │   │   └── terragrunt.hcl
│   │   │   │   └── foo/
│   │   │   │       ├── main.tf
│   │   │   │       └── terragrunt.hcl
│   │   │   ├── terragrunt-no-error/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── terragrunt-output/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── terragrunt-stack-init/
│   │   │   │   ├── live/
│   │   │   │   │   ├── placeholder.tf
│   │   │   │   │   ├── terragrunt.hcl
│   │   │   │   │   └── terragrunt.stack.hcl
│   │   │   │   └── units/
│   │   │   │       ├── chick/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       ├── chicken/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       ├── father/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       └── mother/
│   │   │   │           ├── main.tf
│   │   │   │           └── terragrunt.hcl
│   │   │   ├── terragrunt-stack-init-error/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   └── terragrunt-with-plan-error/
│   │   │       ├── main.tf
│   │   │       └── terragrunt.hcl
│   │   ├── validate.go
│   │   └── validate_test.go
│   ├── test-structure/
│   │   ├── save_test_data.go
│   │   ├── save_test_data_test.go
│   │   ├── test_structure.go
│   │   ├── test_structure_test.go
│   │   └── validate_struct.go
│   ├── testing/
│   │   └── types.go
│   └── version-checker/
│       ├── errors.go
│       ├── version_checker.go
│       └── version_checker_test.go
├── test/
│   ├── azure/
│   │   ├── terraform_azure_aci_example_test.go
│   │   ├── terraform_azure_acr_example_test.go
│   │   ├── terraform_azure_actiongroup_example_test.go
│   │   ├── terraform_azure_aks_example_test.go
│   │   ├── terraform_azure_availabilityset_example_test.go
│   │   ├── terraform_azure_container_apps_example_test.go
│   │   ├── terraform_azure_cosmosdb_example_test.go
│   │   ├── terraform_azure_datafactory_example_test.go
│   │   ├── terraform_azure_disk_example_test.go
│   │   ├── terraform_azure_example_test.go
│   │   ├── terraform_azure_frontdoor_example_test.go
│   │   ├── terraform_azure_functionapp_example_test.go
│   │   ├── terraform_azure_keyvault_example_test.go
│   │   ├── terraform_azure_loadbalancer_example_test.go
│   │   ├── terraform_azure_loganalytics_example_test.go
│   │   ├── terraform_azure_monitor_example_test.go
│   │   ├── terraform_azure_mysqldb_example_test.go
│   │   ├── terraform_azure_network_example_test.go
│   │   ├── terraform_azure_nsg_example_test.go
│   │   ├── terraform_azure_postgresql_example_test.go
│   │   ├── terraform_azure_recoveryservices_example_test.go
│   │   ├── terraform_azure_resourcegroup_example_test.go
│   │   ├── terraform_azure_servicebus_example_test.go
│   │   ├── terraform_azure_sqldb_example_test.go
│   │   ├── terraform_azure_sqlmanagedinstance_example_test.go
│   │   ├── terraform_azure_storage_example_test.go
│   │   ├── terraform_azure_synapse_example_test.go
│   │   └── terraform_azure_vm_example_test.go
│   ├── docker_hello_world_example_test.go
│   ├── docker_stdout_example_test.go
│   ├── fixtures/
│   │   ├── copy-folder-contents/
│   │   │   ├── full-copy/
│   │   │   │   ├── .hidden-file.txt
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       ├── .hidden-folder/
│   │   │   │       │   └── baz.txt
│   │   │   │       └── bar.txt
│   │   │   ├── no-hidden-files/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── no-hidden-files-no-terraform-files/
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── no-state-files/
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── original/
│   │   │   │   ├── .hidden-file.txt
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       ├── .hidden-folder/
│   │   │   │       │   └── baz.txt
│   │   │   │       └── bar.txt
│   │   │   ├── symlinks/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── symlinks-broken/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   └── terragrunt-files/
│   │   │       └── terragrunt.hcl
│   │   ├── docker/
│   │   │   └── Dockerfile
│   │   ├── docker-compose-with-buildkit/
│   │   │   ├── Dockerfile
│   │   │   ├── bash_script.sh
│   │   │   └── docker-compose.yml
│   │   ├── docker-compose-with-custom-project-name/
│   │   │   └── docker-compose.yml
│   │   ├── docker-with-buildkit/
│   │   │   └── Dockerfile
│   │   ├── helm/
│   │   │   └── keda-values.yaml
│   │   ├── terraform-backend/
│   │   │   ├── backend.hcl
│   │   │   └── main.tf
│   │   ├── terraform-basic-configuration/
│   │   │   └── main.tf
│   │   ├── terraform-no-error/
│   │   │   └── main.tf
│   │   ├── terraform-not-idempotent/
│   │   │   └── main.tf
│   │   ├── terraform-null/
│   │   │   └── main.tf
│   │   ├── terraform-output/
│   │   │   └── output.tf
│   │   ├── terraform-output-all/
│   │   │   └── output.tf
│   │   ├── terraform-output-list/
│   │   │   └── output.tf
│   │   ├── terraform-output-listofobjects/
│   │   │   └── output.tf
│   │   ├── terraform-output-map/
│   │   │   └── output.tf
│   │   ├── terraform-output-mapofobjects/
│   │   │   └── output.tf
│   │   ├── terraform-output-struct/
│   │   │   └── output.tf
│   │   ├── terraform-parallelism/
│   │   │   └── main.tf
│   │   ├── terraform-validation-valid/
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── vars.tf
│   │   ├── terraform-with-error/
│   │   │   └── main.tf
│   │   ├── terraform-with-plan-error/
│   │   │   └── main.tf
│   │   ├── terraform-with-warning/
│   │   │   └── main.tf
│   │   └── terraform-workspace/
│   │       └── main.tf
│   ├── gcp/
│   │   ├── packer_gcp_basic_example_test.go
│   │   ├── terraform_gcp_example_test.go
│   │   ├── terraform_gcp_hello_world_example_test.go
│   │   └── terraform_gcp_ig_example_test.go
│   ├── helm_basic_example_integration_test.go
│   ├── helm_basic_example_template_test.go
│   ├── helm_dependency_example_template_test.go
│   ├── helm_keda_remote_example_template_snapshot_test.go
│   ├── helm_keda_remote_example_template_test.go
│   ├── helm_log_redirect_integration_test.go
│   ├── kubernetes_basic_example_logs_test.go
│   ├── kubernetes_basic_example_service_check_test.go
│   ├── kubernetes_basic_example_test.go
│   ├── kubernetes_hello_world_example_test.go
│   ├── kubernetes_kustomize_example_test.go
│   ├── kubernetes_rbac_example_test.go
│   ├── kubernetes_rest_config_example_test.go
│   ├── packer_basic_example_test.go
│   ├── packer_docker_example_test.go
│   ├── packer_hello_world_example_test.go
│   ├── packer_oci_example_test.go
│   ├── terraform_aws_dynamodb_example_test.go
│   ├── terraform_aws_ec2_windows_test.go
│   ├── terraform_aws_ecs_example_test.go
│   ├── terraform_aws_example_plan_test.go
│   ├── terraform_aws_example_test.go
│   ├── terraform_aws_hello_world_example_test.go
│   ├── terraform_aws_lambda_example_test.go
│   ├── terraform_aws_network_example_test.go
│   ├── terraform_aws_rds_example_test.go
│   ├── terraform_aws_s3_example_test.go
│   ├── terraform_aws_ssm_example_test.go
│   ├── terraform_backend_example_test.go
│   ├── terraform_basic_example_regression_test.go
│   ├── terraform_basic_example_test.go
│   ├── terraform_database_example_test.go
│   ├── terraform_hello_world_example_test.go
│   ├── terraform_http_example_test.go
│   ├── terraform_opa_example_extra_args_test.go
│   ├── terraform_opa_example_test.go
│   ├── terraform_packer_example_test.go
│   ├── terraform_redeploy_example_test.go
│   ├── terraform_remote_exec_example_test.go
│   ├── terraform_scp_example_test.go
│   ├── terraform_ssh_certificate_example_test.go
│   ├── terraform_ssh_example_test.go
│   ├── terraform_ssh_password_example_test.go
│   └── terraform_unit_null_test.go
└── test-docker-images/
    ├── README.md
    ├── gruntwork-amazon-linux-test/
    │   ├── Dockerfile
    │   └── README.md
    ├── gruntwork-centos-test/
    │   ├── Dockerfile
    │   └── README.md
    ├── gruntwork-ubuntu-test/
    │   ├── Dockerfile
    │   └── README.md
    └── moto/
        ├── Dockerfile
        └── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
env: &env
  environment:
    GRUNTWORK_INSTALLER_VERSION: v0.0.36
    MODULE_CI_VERSION: v0.46.0
    MODULE_GCP_CI_VERSION: v0.1.1
    MODULE_CI_CIRCLECI_HELPER_VERSION: v0.56.0
    TERRAFORM_VERSION: 1.5.7
    TOFU_VERSION: 1.8.0
    PACKER_VERSION: 1.10.0
    TERRAGRUNT_VERSION: v0.80.4
    TERRAGRUNT_TEST_VERSION: v0.93.10  # Version used for terragrunt module tests
    OPA_VERSION: v1.1.0
    GO_VERSION: 1.26.0
    GO111MODULE: auto
    K8S_VERSION: v1.28.0  # Same as EKS
    MINIKUBE_VERSION: v1.35.0
    CRI_DOCKERD_VERSION: v0.3.16
    CNI_PLUGINS_VERSION: v1.6.2
    HELM_VERSION: v3.13.1
    KUBECONFIG: /home/circleci/.kube/config
    BIN_BUILD_PARALLELISM: 3
    MISE_VERSION: v2024.4.0
    # Mise ASDF defaults to using main.tf to determine the terraform version to use, so we need to
    # override this to use the .terraform-version file instead.
    ASDF_HASHICORP_TERRAFORM_VERSION_FILE: .terraform-version

defaults: &defaults
  machine:
    enabled: true
    image: ubuntu-2004:2022.10.1
  <<: *env

setup_minikube: &setup_minikube
  command: |
    sudo apt update -y
    sudo apt install -y conntrack

    # Install cri-dockerd (required for minikube none driver with K8s v1.24+)
    CRI_DOCKERD_VERSION_NUM="${CRI_DOCKERD_VERSION#v}"
    curl -sLO "https://github.com/Mirantis/cri-dockerd/releases/download/${CRI_DOCKERD_VERSION}/cri-dockerd-${CRI_DOCKERD_VERSION_NUM}.amd64.tgz"
    tar xzf "cri-dockerd-${CRI_DOCKERD_VERSION_NUM}.amd64.tgz"
    sudo install -m 0755 cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd

    # Set up cri-dockerd systemd service
    curl -sLo /tmp/cri-docker.service "https://raw.githubusercontent.com/Mirantis/cri-dockerd/${CRI_DOCKERD_VERSION}/packaging/systemd/cri-docker.service"
    curl -sLo /tmp/cri-docker.socket "https://raw.githubusercontent.com/Mirantis/cri-dockerd/${CRI_DOCKERD_VERSION}/packaging/systemd/cri-docker.socket"
    sudo mv /tmp/cri-docker.service /tmp/cri-docker.socket /etc/systemd/system/
    sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
    sudo systemctl daemon-reload
    sudo systemctl enable --now cri-docker.socket

    # Install CNI plugins (required for minikube none driver with K8s v1.24+)
    curl -sLO "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-amd64-${CNI_PLUGINS_VERSION}.tgz"
    sudo mkdir -p /opt/cni/bin
    sudo tar -C /opt/cni/bin -xzf "cni-plugins-linux-amd64-${CNI_PLUGINS_VERSION}.tgz"

    # Retry setup-minikube to reduce flakes from transient GPG key retrieval timeouts
    for i in 1 2 3; do
      echo "Attempt $i: setting up minikube..."

      if setup-minikube --k8s-version "$K8S_VERSION" --minikube-version "$MINIKUBE_VERSION"; then
        break
      fi

      echo "setup-minikube failed on attempt $i"

      if [ "$i" -eq 3 ]; then
        echo "setup-minikube failed after 3 attempts"
        exit 1
      fi

      sleep 10
    done

install_helm: &install_helm
  name: install helm
  command: |
    # install helm
    curl -Lo helm.tar.gz https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz
    tar -xvf helm.tar.gz
    chmod +x linux-amd64/helm
    sudo mv linux-amd64/helm /usr/local/bin/

install_gruntwork_utils: &install_gruntwork_utils
  name: install gruntwork utils
  command: |
    curl -Ls https://raw.githubusercontent.com/gruntwork-io/gruntwork-installer/master/bootstrap-gruntwork-installer.sh | bash /dev/stdin --version "${GRUNTWORK_INSTALLER_VERSION}"
    gruntwork-install --module-name "gruntwork-module-circleci-helpers" --repo "https://github.com/gruntwork-io/terraform-aws-ci" --tag "${MODULE_CI_CIRCLECI_HELPER_VERSION}"
    gruntwork-install --module-name "kubernetes-circleci-helpers" --repo "https://github.com/gruntwork-io/terraform-aws-ci" --tag "${MODULE_CI_VERSION}"
    gruntwork-install --module-name "gcp-helpers" --repo "https://github.com/gruntwork-io/terraform-google-ci" --tag "${MODULE_GCP_CI_VERSION}"
    configure-environment-for-gruntwork-module \
      --mise-version ${MISE_VERSION} \
      --terraform-version ${TERRAFORM_VERSION} \
      --terragrunt-version ${TERRAGRUNT_VERSION} \
      --packer-version ${PACKER_VERSION} \
      --go-version NONE

    # Install OPA
    echo "Installing OPA version ${OPA_VERSION}"
    curl -sLO "https://github.com/open-policy-agent/opa/releases/download/${OPA_VERSION}/opa_linux_amd64_static"
    chmod +x ./opa_linux_amd64_static
    sudo mv ./opa_linux_amd64_static /usr/local/bin/opa

    # Temporary fix for installing go - remove when we can update gruntwork-module-circleci-helpers to version with fix
    GO_VERSION="${GO_VERSION:-1.26.0}"
    echo "Installing Go version ${GO_VERSION}"
    curl -O --silent --location --fail --show-error --retry 3 "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"
    sudo rm -rf /usr/local/go
    sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
    sudo rm -f /usr/bin/go
    sudo ln -sf /usr/local/go/bin/go /usr/bin/go
    echo "The installed version of Go is now $(go version)"

install_tofu: &install_tofu
  name: Install OpenTofu
  command: |
    curl -L "https://github.com/opentofu/opentofu/releases/download/v${TOFU_VERSION}/tofu_${TOFU_VERSION}_linux_amd64.zip" -o tofu.zip
    unzip -o tofu.zip
    sudo install -m 0755 tofu /usr/local/bin/tofu
    rm -rf tofu
    rm -rf tofu.zip
    tofu --version

install_terragrunt_latest: &install_terragrunt_latest
  name: Install Terragrunt (latest test version)
  command: |
    echo "Installing Terragrunt ${TERRAGRUNT_TEST_VERSION}..."
    curl -sL "https://github.com/gruntwork-io/terragrunt/releases/download/${TERRAGRUNT_TEST_VERSION}/terragrunt_linux_amd64" -o /tmp/terragrunt
    chmod +x /tmp/terragrunt
    sudo mv /tmp/terragrunt /usr/local/bin/terragrunt
    terragrunt --version

install_docker_buildx: &install_docker_buildx
  name: install docker buildx
  command: |
    curl -sLO https://github.com/docker/buildx/releases/download/v0.6.1/buildx-v0.6.1.linux-amd64
    mkdir -p ~/.docker/cli-plugins
    mv buildx-v0.6.1.linux-amd64 ~/.docker/cli-plugins/docker-buildx
    chmod a+x ~/.docker/cli-plugins/docker-buildx

    # Verify buildx is available
    docker buildx create --use

configure_environment_for_gcp: &configure_environment_for_gcp
  name: configure environment for gcp
  command: |
    # install the Google Cloud SDK CLI
    install-gcloud

    # Make GCP Service Account credentials available as a file
    echo $GCLOUD_SERVICE_KEY > ${HOME}/gcloud-service-key.json
    echo 'export GOOGLE_APPLICATION_CREDENTIALS=${HOME}/gcloud-service-key.json' >> $BASH_ENV

    # Tell gcloud to use the credentials and set defaults
    echo $GCLOUD_SERVICE_KEY | gcloud auth activate-service-account --key-file=-
    gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
    gcloud --quiet config set compute/zone ${GOOGLE_COMPUTE_ZONE}

version: 2
jobs:
  setup:
    <<: *env
    resource_class: xlarge
    docker:
      - image: cimg/python:3.10.2

    steps:
      - checkout
      - restore_cache:
          keys:
            - gomod-{{ checksum "go.sum" }}

      # Install gruntwork utilities
      - run:
          <<: *install_gruntwork_utils

      - save_cache:
          key: gomod-{{ checksum "go.sum" }}
          paths:
            - $HOME/go/src/

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/go/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      # Run pre-commit hooks and fail the build if any hook finds required changes.
      - run:
          name: run precommit
          command: |
            go install golang.org/x/tools/cmd/goimports@latest
            # Install the latest minor version for v2
            pip install pre-commit~=2.9
            pre-commit install
            pre-commit run --all-files

      # Build any binaries that need to be built
      # We always want to build the binaries to test that there are no compile failures. Also, we will use the
      # terratest_log_parser to parse out the test output during a failure. Finally, on releases, we'll push these
      # binaries to GitHub as release assets.
      - run:
          command: |
            # For some reason, the circleci environment requires additional module dependencies that are not captured by
            # our Linux or Mac OSX dev environments. We workaround this by running `go mod tidy` in the CircleCI
            # environment so it pulls in what it needs.
            go mod tidy

            go install github.com/mitchellh/gox@latest

            GO_ENABLED=0 build-go-binaries \
              --parallel "$BIN_BUILD_PARALLELISM" \
              --app-name terratest_log_parser \
              --src-path ./cmd/terratest_log_parser \
              --dest-path ./cmd/bin \
              --ld-flags "-X main.VERSION=$CIRCLE_TAG -extldflags '-static'"

            GO_ENABLED=0 build-go-binaries \
              --parallel "$BIN_BUILD_PARALLELISM" \
              --app-name pick-instance-type \
              --src-path ./cmd/pick-instance-type \
              --dest-path ./cmd/bin \
              --ld-flags "-X main.VERSION=$CIRCLE_TAG -extldflags '-static'"
          when: always

      - persist_to_workspace:
          root: /home/circleci
          paths:
            - project

  # run tests with terraform binary
  terraform_test:
    <<: *defaults
    resource_class: xlarge
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils
      - run:
          <<: *install_docker_buildx

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      # Run the tests. Note that we set the "-p 1" flag to tell Go to run tests in each package sequentially. Without
      # this, Go buffers all log output until all packages are done, which with slower running tests can cause CircleCI
      # to kill the build after more than 10 minutes without log output.
      # NOTE: because this doesn't build with the kubernetes tag, it will not run the kubernetes tests. See
      # kubernetes_test build steps.
      # NOTE: terragrunt tests are excluded here and run in a separate terragrunt_test job.
      - run: mkdir -p /tmp/logs
      # check we can compile the azure code, but don't actually run the tests
      - run: run-go-tests --packages "-p 1 -tags=azure -run IDontExist ./modules/azure"
      - run: |
          # Run only terraform module tests
          run-go-tests --packages "-p 1 ./modules/terraform" | tee /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  # run tests with tofu binary
  terraform_test_tofu:
    <<: *defaults
    resource_class: large
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils
      - run:
          <<: *install_docker_buildx
      - run:
          <<: *install_tofu

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV
          # remove terraform binary so tofu will be used
          sudo rm -f $(which terraform)

      # Run the tests. Note that we set the "-p 1" flag to tell Go to run tests in each package sequentially. Without
      # this, Go buffers all log output until all packages are done, which with slower running tests can cause CircleCI
      # to kill the build after more than 10 minutes without log output.
      # NOTE: because this doesn't build with the kubernetes tag, it will not run the kubernetes tests. See
      # kubernetes_test build steps.
      # NOTE: terragrunt tests are excluded here and run in a separate terragrunt_test job.
      - run: mkdir -p /tmp/logs
      # check we can compile the azure code, but don't actually run the tests
      - run: run-go-tests --packages "-p 1 -tags=azure -run IDontExist ./modules/azure"
      - run: |
          # Run only terraform module tests
          run-go-tests --packages "-p 1 ./modules/terraform" | tee /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  # We run the GCP tests in a separate build step using the Docker executor for better isolation and resiliency. Using
  # The Docker executor ensures GCP tests do not erroneously make metadata network calls within CircleCI's private
  # environment. For more information see: https://github.com/gruntwork-io/terratest/pull/765.
  gcp_test:
    <<: *env
    docker:
      - image: cimg/base:2022.03

    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      - run:
          <<: *configure_environment_for_gcp

      # Run the GCP tests. These tests are run because the gcp build tag is included, and we explicitly
      # select the GCP tests
      - run:
          command: |
            mkdir -p /tmp/logs
            # Run the unit tests first, then the integration tests. They are separate because the integration tests
            # require additional filtering.
            run-go-tests --packages "-tags gcp ./modules/gcp" | tee /tmp/logs/test_output.log
            run-go-tests --packages "-tags=gcp ./test/gcp" | tee /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  kubernetes_test:
    <<: *defaults
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      - run:
          <<: *setup_minikube

      # Run the Kubernetes tests. These tests are run because the kubernetes build tag is included, and we explicitly
      # select the kubernetes tests
      - run:
          command: |
            mkdir -p /tmp/logs
            # Run the unit tests first, then the integration tests. They are separate because the integration tests
            # require additional filtering.
            run-go-tests --packages "-tags kubernetes ./modules/k8s" | tee /tmp/logs/test_output.log
            run-go-tests --packages "-tags kubernetes -run TestKubernetes ./test" | tee -a /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs


  helm_test:
    <<: *defaults
    resource_class: large
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      - run:
          <<: *setup_minikube

      - run:
          <<: *install_helm

      # Run the Helm tests. These tests are run because the helm build tag is included, and we explicitly
      # select the helm tests
      - run:
          command: |
            mkdir -p /tmp/logs
            # Run the unit tests first, then the integration tests. They are separate because the integration tests
            # require additional filtering.
            run-go-tests --packages "-tags helm ./modules/helm" | tee /tmp/logs/test_output.log
            run-go-tests --packages "-tags helm -run TestHelm ./test" | tee -a /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  # Dedicated terragrunt tests with terraform as the underlying IaC binary
  terragrunt_test:
    <<: *defaults
    resource_class: large
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils
      - run:
          <<: *install_terragrunt_latest
      - run:
          <<: *install_docker_buildx

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV

      # Run the terragrunt-specific tests. These tests specifically target the terragrunt module
      # and require terragrunt binary to be available (which is installed via install_gruntwork_utils)
      - run:
          command: |
            mkdir -p /tmp/logs
            # Run only the terragrunt module tests
            run-go-tests --packages "-p 1 ./modules/terragrunt" | tee /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  # Dedicated terragrunt tests with tofu as the underlying IaC binary
  terragrunt_test_tofu:
    <<: *defaults
    resource_class: large
    steps:
      - attach_workspace:
          at: /home/circleci

      - run:
          <<: *install_gruntwork_utils
      - run:
          <<: *install_tofu
      - run:
          <<: *install_terragrunt_latest
      - run:
          <<: *install_docker_buildx

      # The weird way you have to set PATH in Circle 2.0
      - run: |
          echo 'export PATH=$HOME/.local/bin:$HOME/terraform:$HOME/packer:$PATH' >> $BASH_ENV
          # Remove terraform binary so tofu will be used by terragrunt
          sudo rm -f $(which terraform)
          # Verify tofu is available
          which tofu
          tofu --version

      # Run the terragrunt-specific tests with tofu as the backend
      - run:
          command: |
            mkdir -p /tmp/logs
            # Run only the terragrunt module tests
            run-go-tests --packages "-p 1 ./modules/terragrunt" | tee /tmp/logs/test_output.log

      - run:
          command: |
            ./cmd/bin/terratest_log_parser_linux_amd64 --testlog /tmp/logs/test_output.log --outputdir /tmp/logs
          when: always

      # Store test result and log artifacts for browsing purposes
      - store_artifacts:
          path: /tmp/logs
      - store_test_results:
          path: /tmp/logs

  deploy:
    <<: *defaults
    steps:
      - checkout
      - attach_workspace:
          at: /home/circleci
      - run: |
          curl -Ls https://raw.githubusercontent.com/gruntwork-io/gruntwork-installer/master/bootstrap-gruntwork-installer.sh | bash /dev/stdin --version "$GRUNTWORK_INSTALLER_VERSION"
      - run: |
          gruntwork-install --module-name "gruntwork-module-circleci-helpers" --repo "https://github.com/gruntwork-io/terraform-aws-ci" --tag "$MODULE_CI_VERSION"
      - run: cd cmd/bin && sha256sum * > SHA256SUMS
      - run: upload-github-release-assets cmd/bin/*


workflows:
  version: 2
  build-and-test:
    jobs:
      - setup:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          filters:
            tags:
              only: /^v.*/

      - kubernetes_test:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - helm_test:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - terragrunt_test:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - terragrunt_test_tofu:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - terraform_test:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
            - SLACK__TOKEN__refarch-deployer-test
            - SLACK__WEBHOOK__refarch-deployer-test
            - SLACK__CHANNEL__test-workflow-approvals
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - terraform_test_tofu:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
            - SLACK__TOKEN__refarch-deployer-test
            - SLACK__WEBHOOK__refarch-deployer-test
            - SLACK__CHANNEL__test-workflow-approvals
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - gcp_test:
          context:
            - GCP__automated-tests
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/

      - deploy:
          context:
            - AWS__PHXDEVOPS__circle-ci-test
            - GITHUB__PAT__gruntwork-ci
          requires:
            - setup
          filters:
            tags:
              only: /^v.*/
            branches:
              ignore: /.*/


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: gruntwork-io


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a bug report to help us improve Terratest.
title: ''
labels: bug
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior, code snippets and examples which can be used to reproduce the issue.

```go
// paste code snippets here
```

**Expected behavior**
A clear and concise description of what you expected to happen.

**Nice to have**
- [ ] Terminal output
- [ ] Screenshots

**Versions**
- Terratest version:
- Environment details (Ubuntu 20.04, Windows 10, etc.):

**Additional context**
Add any other context about the problem here.

================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Submit a feature request to improve Terratest.
title: ''
labels: enhancement
assignees: ''

---

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/no-response.yml
================================================
# Configuration for probot-no-response - https://github.com/probot/no-response

# Number of days of inactivity before an Issue is closed for lack of response
daysUntilClose: 30
# Label requiring a response
responseRequiredLabel: more-information-needed
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
closeComment: >
  This issue has been automatically closed because there has been no response
  to our request for more information from the original author. With only the
  information that is currently in the issue, we don't have enough information
  to take action. Please feel free to reach out if you have or find the answers we need so
  that we can investigate further. Thank you!

================================================
FILE: .github/pull_request_template.md
================================================
<!-- Prepend '[WIP]' to the title if this PR is still a work-in-progress. Remove it when it is ready for review! -->

## Description

Fixes #000.

<!-- Description of the changes introduced by this PR. -->

## TODOs

Read the [Gruntwork contribution guidelines](https://gruntwork.notion.site/Gruntwork-Coding-Methodology-02fdcd6e4b004e818553684760bf691e).

- [ ] Update the docs.
- [ ] Run the relevant tests successfully, including pre-commit checks.
- [ ] Ensure any 3rd party code adheres with our [license policy](https://www.notion.so/gruntwork/Gruntwork-licenses-and-open-source-usage-policy-f7dece1f780341c7b69c1763f22b1378) or delete this line if its not applicable.
- [ ] Include release notes. If this PR is backward incompatible, include a migration guide.
- [ ] Make a plan for release of the functionality in this PR. If it delivers value to an end user, you are responsible for ensuring it is released promptly, and correctly. If you are not a maintainer, you are responsible for finding a maintainer to do this for you.

## Release Notes (draft)

<!-- One-line description of the PR that can be included in the final release notes. -->
Added / Removed / Updated [X].

### Migration Guide

<!-- Important: If you made any backward incompatible changes, then you must write a migration guide! -->


================================================
FILE: .github/workflows/ci.yml
================================================
name: ci-workflow

# actors
  # source repo: official terratest repo (gruntwork-io/terratest)
  # forked repo: (e.g., xyz/terratest, abc/terratest)
  # pr: created from forked repo, against source repo (gruntwork-io/terratest/pull/{PR NUMBER})
# flow
  # developer fork the source repo
  # developer creates a branch in the forked repo
  # developer does the development 😎
  # developer creates a pr
  # webhook on source repo calls a webapp when the pr has been created
  # this pipeline will be triggered automatically by the webapp, with the following input values
    # repo: name of the forked repo (e.g. xyz/terratest)
    # branch: branch name on the forked repo (e.g. feature/adding-some-important-module)
    # target_repository: home of the target_pr, which is the source repo (gruntwork-io/terratest)
    # target_pr: pr number on the source repo (e.g. 14, 25, etc.)

on:
  push:
    branches: master
  workflow_dispatch:
    inputs:
      repo:
        description: 'Repository info'
        required: true
      branch:
        description: 'Name of the branch'
        required: true
      target_repository:
        description: 'Name of the official terratest repo'
        required: false
        default: 'gruntwork-io/terratest'
      target_pr:
        description: 'PR number on the official terratest repo'
        required: false
      skip_provider_registration:
        description: 'When set to true, terraform will skip provider registration (see: https://www.terraform.io/docs/providers/azurerm/index.html#skip_provider_registration for more information)'
        required: true
        default: 'false'

permissions:
  contents: read

jobs:
  ci-job:
    runs-on: [ubuntu-latest]
    steps:
      - uses: hashicorp/setup-terraform@v1
        with:
          terraform_version: 0.15.1
          terraform_wrapper: false  
      - name: checkout to repo
        uses: actions/checkout@v2
        with:
          repository: ${{ github.event.inputs.repo }}
          ref: ${{ github.event.inputs.branch }}
      - name: install golangci-lint binary
        run: |
          curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./bin v1.53.2
      - name: lint modules/azure folder
        id: azure_module_lint
        run: |
          # list files to be linted
          [ -d "modules/azure" ] && ls -li "modules/azure"

          # run the linter
          ./bin/golangci-lint run ./modules/azure/ --build-tags=azure --timeout 5m0s
      - name: lint test/azure folder
        id: azure_test_lint
        run: |
          # list files to be linted
          [ -d "test/azure" ] && ls -li "test/azure"

          # run the linter
          ./bin/golangci-lint run ./test/azure/ --build-tags=azure --timeout 5m0s
      - name: run terraform format
        id: azure_terraform_format
        run: terraform fmt -check -recursive ./examples/azure
      - name: login to azure cli
        uses: azure/login@v1.1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}
      - name: run go unit test for azure
        id: azure_unit_test
        env:
          AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}
        run: |
          cd modules

          APP_ID=`echo $AZURE_CREDENTIALS | jq -r -c ".clientId"`
          APP_PASSWORD=`echo $AZURE_CREDENTIALS | jq -r -c ".clientSecret"`
          TENANT_ID=`echo $AZURE_CREDENTIALS | jq -r -c ".tenantId"`

          # if clientId, subscriptionId, tenantId doesn't provide to the go tests
          # by default, terratest reads them from below environment variables
          export ARM_CLIENT_ID="$APP_ID"
          export ARM_CLIENT_SECRET="$APP_PASSWORD"
          export ARM_SUBSCRIPTION_ID=`az account show --query "id" --output tsv`
          export ARM_TENANT_ID="$TENANT_ID"
          export ARM_SKIP_PROVIDER_REGISTRATION=${{ github.event.inputs.skip_provider_registration }}

          # run the unit tests under the `azure` subfolder
          go test ./azure/* -v -timeout 90m
      - name: run go test for azure
        id: azure_test
        env:
          AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}
        run: |
          cd test/azure

          APP_ID=`echo $AZURE_CREDENTIALS | jq -r -c ".clientId"`
          APP_PASSWORD=`echo $AZURE_CREDENTIALS | jq -r -c ".clientSecret"`
          TENANT_ID=`echo $AZURE_CREDENTIALS | jq -r -c ".tenantId"`

          # if clientId, subscriptionId, tenantId doesn't provide to the go tests
          # by default, terratest reads them from below environment variables
          export ARM_CLIENT_ID="$APP_ID"
          export ARM_CLIENT_SECRET="$APP_PASSWORD"
          export ARM_SUBSCRIPTION_ID=`az account show --query "id" --output tsv`
          export ARM_TENANT_ID="$TENANT_ID"
          export ARM_SKIP_PROVIDER_REGISTRATION=${{ github.event.inputs.skip_provider_registration }}

          # some resources may require ssh keys (e.g. Kubernetes, VMs, etc.)
          # terraform will read below environment variables
          # if those values didn't provide to the terraform explicitly
          rm -rf ssh_key*
          ssh-keygen -m PEM -t rsa -b 4096 -f ./ssh_key -q -N ""
          export TF_VAR_ssh_public_key="$PWD/ssh_key.pub"
          export TF_VAR_client_id="$APP_ID"
          export TF_VAR_client_secret="$APP_PASSWORD"

          # run the actual tests under the `azure` subfolder
          go test --tags=azure -v -timeout 90m
      - name: report back the result
        if: always()
        env:
          CURRENT_REPOSITORY: ${{ github.repository }}
          RUN_ID: ${{ github.run_id }}
          GITHUB_TOKEN: ${{ secrets.PAT }}
          TARGET_REPOSITORY: ${{ github.event.inputs.target_repository }}
          TARGET_PR: ${{ github.event.inputs.target_pr }}
          TEST_RESULT: ${{ steps.azure_test.conclusion }}
          TEST_LINT_RESULT: ${{ steps.azure_test_lint.conclusion }}
          MODULE_LINT_RESULT: ${{ steps.azure_module_lint.conclusion }}
        run: |
          # if no PR number provided, simply exit...
          [[ -z "$TARGET_PR" ]] && { echo "No PR Number provided, exiting..." ; exit 0; }

          # if no PAT provided, simply exit...
          [[ -z "$GITHUB_TOKEN" ]] && { echo "No PAT provided, exiting..." ; exit 0; }

          echo "PR Number provided... ${TARGET_REPOSITORY}:#${TARGET_PR}"

          BODY_PAYLOAD=""
          # if all the previous steps finished successfully, create a comment on the PR with the "success" information
          if [ "$TEST_RESULT" == "success" ] && [ "$TEST_LINT_RESULT" == "success" ] && [ "$MODULE_LINT_RESULT" == "success" ]; then
            BODY_PAYLOAD="[Microsoft CI Bot] TL;DR; success :thumbsup:\n\nYou can check the status of the CI Pipeline logs here ; https://github.com/${CURRENT_REPOSITORY}/actions/runs/$RUN_ID"
          # if at least one of the previous steps failed, create a comment on the PR with the "failure" information
          elif [ "$TEST_RESULT" == "failure" ] || [ "$TEST_LINT_RESULT" == "failure" ] || [ "$MODULE_LINT_RESULT" == "failure" ]; then
            BODY_PAYLOAD="[Microsoft CI Bot] TL;DR; failure :facepalm:\n\nYou can check the status of the CI Pipeline logs here ; https://github.com/${CURRENT_REPOSITORY}/actions/runs/$RUN_ID"
          fi

          echo "Comment message is ready..."
          echo "${BODY_PAYLOAD}"

          # if pipeline has something to report back to the PR

          if [[ -z "$BODY_PAYLOAD" ]]
          then
            echo "BODY_PAYLOAD is empty"
          else
            echo "Here is the target repository: ${TARGET_REPOSITORY}"
            # TARGET_REPOSITORY is in {owner}/{repo format}
            [[ $TARGET_REPOSITORY =~ (.*)/(.*)$ ]]
            # take the {owner} piece from the TARGET_REPOSITORY variable
            TARGET_REPO_OWNER=${BASH_REMATCH[1]}
            # take the {repo} piece from the TARGET_REPOSITORY variable
            TARGET_REPO_NAME=${BASH_REMATCH[2]}

            echo "Target repository is parsed: ${TARGET_REPO_OWNER} <-> ${TARGET_REPO_NAME}"

            # create the query string to get the pr id
            QUERY_PR_ID="query findPRID { repository(owner: \\\"$TARGET_REPO_OWNER\\\", name: \\\"$TARGET_REPO_NAME\\\") { pullRequest(number: $TARGET_PR) { id } } }"

            # get the pr id from github api
            PR_ID=$(curl --silent --request POST --header "Authorization: Bearer ${GITHUB_TOKEN}" --data-raw "{\"query\":\"${QUERY_PR_ID}\"}" "https://api.github.com/graphql" | jq -r '.data.repository.pullRequest.id')

            echo "Target PR ID is ${PR_ID}"

            # create the mutation string to create the comment on the pr
            MUTATION_ADD_COMMENT="mutation addComment { addComment(input: {subjectId: \\\"${PR_ID}\\\", body: \\\"${BODY_PAYLOAD}\\\"}) { commentEdge { node { createdAt body } } subject { id } } }"

            # call the github api to create the comment
            curl --request POST --header "Authorization: Bearer ${GITHUB_TOKEN}" --data-raw "{\"query\":\"${MUTATION_ADD_COMMENT}\"}" "https://api.github.com/graphql"

            echo "Comment is created..."
          fi


================================================
FILE: .github/workflows/lint.yml
================================================
name: Lint

on:
  push:

permissions:
  contents: read

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

    - name: Set up mise
      uses: jdx/mise-action@5228313ee0372e111a38da051671ca30fc5a96db # v3
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

    - id: go-cache-paths
      shell: bash
      run: |
        echo "go-build=$(go env GOCACHE)" >> "$GITHUB_OUTPUT"
        echo "go-mod=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT"
        echo "golangci-lint-cache=$HOME/.cache/golangci-lint" >> "$GITHUB_OUTPUT"

    - name: Go Build Cache
      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
      with:
        path: ${{ steps.go-cache-paths.outputs.go-build }}
        key: ${{ runner.os }}-go-build-lint-${{ hashFiles('**/go.sum') }}
        restore-keys: |
          ${{ runner.os }}-go-build-lint-

    - name: Go Mod Cache
      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
      with:
        path: ${{ steps.go-cache-paths.outputs.go-mod }}
        key: ${{ runner.os }}-go-mod-${{ hashFiles('**/go.sum') }}
        restore-keys: |
          ${{ runner.os }}-go-mod-

    - name: golangci-lint Cache
      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5
      with:
        path: ${{ steps.go-cache-paths.outputs.golangci-lint-cache }}
        key: ${{ runner.os }}-golangci-lint-${{ hashFiles('**/go.sum') }}
        restore-keys: |
          ${{ runner.os }}-golangci-lint-

    - name: Lint
      run: make lint-allow-list


================================================
FILE: .github/workflows/update-lint-config.yml
================================================
name: Update Lint Config

on:
  schedule:
    # Run every Monday at 00:00 UTC
    - cron: '0 0 * * 1'
  workflow_dispatch:

jobs:
  update-lint-config:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v5

    - name: Update lint config from upstream
      run: make update-lint-config

    - name: Check for changes
      id: check
      run: |
        if git diff --quiet .golangci.yml; then
          echo "changed=false" >> "$GITHUB_OUTPUT"
        else
          echo "changed=true" >> "$GITHUB_OUTPUT"
        fi

    - name: Create Pull Request
      if: steps.check.outputs.changed == 'true'
      uses: peter-evans/create-pull-request@v7
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        commit-message: "chore: update golangci-lint config from upstream"
        title: "chore: update golangci-lint config from upstream"
        body: |
          This PR updates the golangci-lint configuration from the upstream Terragrunt repository.

          Source: https://github.com/gruntwork-io/terragrunt/blob/main/.golangci.yml

          This is an automated PR created by the update-lint-config workflow.
        branch: update-lint-config
        delete-branch: true


================================================
FILE: .gitignore
================================================
# Terraform files
.terraform
terraform.tfstate
terraform.tfvars
terraform.tfvars.json
*.tfstate*
.terragrunt
.terragrunt-cache
.terraform.lock.hcl
# IDE files
.idea
.vscode
*.iml
vendor

# Folder used to store temporary test data by Terratest
.test-data

# rbenv
.ruby-version

# OS X
.DS_Store
# Intermediate file for testing
kubeconfig

# environment files
.env


================================================
FILE: .golangci.yml
================================================
# This file is generated from https://github.com/gruntwork-io/terragrunt/blob/main/.golangci.yml
# It is automatically updated weekly via the update-lint-config workflow. Do not edit manually.
version: "2"
run:
  go: "1.26"
  issues-exit-code: 1
  tests: true
output:
  formats:
    text:
      path: stdout
      print-linter-name: true
      print-issued-lines: true
linters:
  enable:
    - asasalint
    - asciicheck
    - bidichk
    - bodyclose
    - contextcheck
    - dupl
    - durationcheck
    - errchkjson
    - errorlint
    - exhaustive
    - fatcontext
    - gocheckcompilerdirectives
    - gochecksumtype
    - goconst
    - gocritic
    - gosmopolitan
    - lll
    - loggercheck
    - makezero
    - misspell
    - mnd
    - musttag
    - nilerr
    - nilnesserr
    - noctx
    - paralleltest
    - perfsprint
    - prealloc
    - protogetter
    - reassign
    - rowserrcheck
    - spancheck
    - sqlclosecheck
    - staticcheck
    - testableexamples
    - testifylint
    - testpackage
    - thelper
    - tparallel
    - unconvert
    - unparam
    - usetesting
    - wastedassign
    - wsl_v5
    - zerologlint
  settings:
    dupl:
      threshold: 120
    errcheck:
      check-type-assertions: false
      check-blank: false
      exclude-functions:
        - (*os.File).Close
    errorlint:
      errorf: true
      asserts: true
      comparison: true
    goconst:
      min-len: 3
      min-occurrences: 5
    gocritic:
      enabled-tags:
        - performance
      disabled-tags:
        - experimental
    govet:
      enable:
        - fieldalignment
        - printf
        - unusedwrite
    nakedret:
      max-func-lines: 20
    staticcheck:
      checks:
        - all
        - -SA9005
        - -QF1008
        - -ST1001
    unparam:
      check-exported: false
    wsl_v5:
      allow-whole-block: false
      branch-max-lines: 2
  exclusions:
    generated: lax
    rules:
      - linters:
          - dupl
          - errcheck
          - gocyclo
          - mnd
          - unparam
          - wsl
        path: _test\.go
      # We end up with duplicated content in this package to save us from duplicating code in other packages.
      - linters:
          - dupl
        path: cli/flags/shared
      # Incrementally linting lines that are too long to ensure that
      # we don't have conflicts on every file in the codebase while
      # trying to get this merged in.
      - linters:
          - lll
        path-except: '^(internal/awshelper/|internal/cas/)'
    paths:
      - docs
      - _ci
      - .github
      - .circleci
      - third_party$
      - builtin$
      - examples$
issues:
  max-issues-per-linter: 0
  max-same-issues: 0
formatters:
  enable:
    - goimports
  settings:
    gofmt:
      simplify: true
  exclusions:
    generated: lax
    paths:
      - docs
      - _ci
      - .github
      - .circleci
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: https://github.com/gruntwork-io/pre-commit
  rev: v0.1.10
  hooks:
    - id: goimports
    - id: terraform-fmt
- repo: local
  hooks:
    - id: test-interfaces-used
      name: test-interfaces-used
      entry: bash -c 'grep -Rw "*testing.T" modules | grep -v _test.go | wc -l'
      language: system
      types: [go]
      pass_filenames: false


================================================
FILE: CODEOWNERS
================================================
* @denis256 @yhakbar @thisguycodes @james00012


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: Makefile
================================================
update-lint-config: SHELL:=/bin/bash
update-lint-config:
	curl -s https://raw.githubusercontent.com/gruntwork-io/terragrunt/main/.golangci.yml --output .golangci.yml
	tmpfile=$$(mktemp) ;\
	{ echo '# This file is generated from https://github.com/gruntwork-io/terragrunt/blob/main/.golangci.yml' ;\
	  echo '# It is automatically updated weekly via the update-lint-config workflow. Do not edit manually.' ;\
	  cat .golangci.yml; } > $${tmpfile} && mv $${tmpfile} .golangci.yml

lint:
	golangci-lint run ./...

lint-allow-list:
	golangci-lint run ./modules/random/... ./modules/testing/... ./modules/slack/... ./modules/collections/... ./modules/environment/... ./modules/retry/... ./modules/shell/... ./modules/git/... ./modules/files/...

.PHONY: lint update-lint-config


================================================
FILE: NOTICE
================================================
terratest
Copyright 2018 Gruntwork, Inc.

This product includes software developed at Gruntwork (https://www.gruntwork.io/).

================================================
FILE: README.md
================================================
# Terratest

[![Maintained by Gruntwork.io](https://img.shields.io/badge/maintained%20by-gruntwork.io-%235849a6.svg)](https://gruntwork.io/?ref=repo_terratest)
[![CircleCI](https://dl.circleci.com/status-badge/img/gh/gruntwork-io/terratest/tree/main.svg?style=svg&circle-token=8abd167739d60e4c1b6c1502d2092339a6c6a133)](https://dl.circleci.com/status-badge/redirect/gh/gruntwork-io/terratest/tree/main)
[![Go Report Card](https://goreportcard.com/badge/github.com/gruntwork-io/terratest)](https://goreportcard.com/report/github.com/gruntwork-io/terratest)
[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/gruntwork-io/terratest?tab=overview)
![go.mod version](https://img.shields.io/github/go-mod/go-version/gruntwork-io/terratest)

Terratest is a Go library that makes it easier to write automated tests for your infrastructure code. It provides a
variety of helper functions and patterns for common infrastructure testing tasks, including:

- Testing Terraform code
- Testing Packer templates
- Testing Docker images
- Executing commands on servers over SSH
- Working with AWS APIs
- Working with Azure APIs
- Working with GCP APIs
- Working with Kubernetes APIs
- Testing Helm Charts
- Making HTTP requests
- Running shell commands
- And much more

Please see the following for more info:

- [Terratest Website](https://terratest.gruntwork.io)
- [Getting started with Terratest](https://terratest.gruntwork.io/docs/getting-started/quick-start/)
- [Terratest Documentation](https://terratest.gruntwork.io/docs/)
- [Contributing to Terratest](https://terratest.gruntwork.io/docs/community/contributing/)
- [Commercial Support](https://gruntwork.io/support/)

## License

This code is released under the Apache 2.0 License. Please see [LICENSE](LICENSE) and [NOTICE](NOTICE) for more details.

Copyright &copy; 2025 Gruntwork, Inc.


================================================
FILE: REFACTOR.md
================================================
# Terratest refactor

Terratest started out as a set of Bash scripts we were using at Gruntwork to test some of our Terraform code. As the
amount of Terraform code grew, it was getting trickier and trickier to test it with Bash, so we rewrote those scripts
in Go. Over time, this Go code grew into a library called Terratest, which contains collection of utilities that we
use to test all aspects of our [Infrastructure as Code Library](https://gruntwork.io/infrastructure-as-code-library/).

We developed patterns to test Terraform configurations, Packer templates, Docker images, SSH access, AWS APIs, shell
commands, and much more. We built this library because we couldn't find any existing tools out there that could do
the type of real-world testing we needed. It turns out many other companies want to do this type of testing too, so
now it's time to open source Terratest.

This library grew organically, so it needs lots of refactoring, cleanup, and documentation to be useful to people
outside of Gruntwork. This document lays out the refactoring we are planning to (a) get feedback and (b) document what
changed so that when we update our code, we know how to deal with the backwards incompatibilities.




## Name change

"Terratest" made sense as the name for this library when it was all about testing Terraform code, but now this library
also can help you test Packer templates, Docker images, and much more. I propose that we rename it. Some ideas:

- grunt-test
- test-grunt
- gruntUnit
- iac-test
- infratest




## Build updates

1. Move from Glide to Dep
1. Move from CircleCI 1.0 to 2.0
1. Add support for Google Cloud Platform
1. Move from Dep to Go Modules.


## Folder structure

Change to the same folder structure we use for just about all other Gruntwork repos:

- `examples`: This will contain a number of real-world examples of code you might want to test with Terratest, such as
  Terraform modules, Packer templates, and Docker images. The `test` folder (described below) shows how to use
  Terratest to test these examples.

- `modules`: The Terratest source code. Move all the `.go` files and packages into this folder so it's easier to browse
  the repo. That does mean all Terratest imports will have to be updated to
  `github.com/gruntwork-io/terratest/modules/xxx`. Unit tests for the Go source code will be in this folder too (e.g., the
  unit test for `foo.go` will be in `foo_test.go`).

- `test`: This will contain the automated tests for the examples in the `examples` folder. These will act both as an
  example of how to use Terratest, as well as integration tests for the library.




## Documentation

Update the root `README.md` with documentation that shows how to use Terratest:

- Overview of what Terratest is.
- Link to blog post we'll write about Terratest (this blog post is a TODO for after this refactor).
- Discuss some of the challenges of testing infrastructure code: i.e., lack of "localhost," lock of "unit tests,"
  slowness, brittleness.
- Discuss the value of doing this testing despite the challenges: i.e., there is no way to maintain lots of
  infrastructure code without tests, building reusable, tested, versioned modules changes how you manage
  infrastructure.
- Discussion of test strategies: using Docker for local testing, test stages, retries, mocks, small modules, test
  pyramid, cleanup, `cloud-nuke`.
- Point to `examples` folder for real-world code you may want to test and `test` folder for examples of how to use
  Terratest to test that code.
- Overview of Terratest packages. Explain what each top-level package in Terratest does. We can't do a method-by-method
  breakdown, as that would go out of date immediately, so instead, link to the appropriate `examples` subfolder that
  shows real-world usage of that package.
- In the future: links to our open source repos (Vault, Consul, Nomad, Couchbase, etc) that show how we use Terratest
  with our own code. We can't add this until we update those open source repos to this refactored version of Terratest
  so the code matches up.




## Package-by-package refactor

I've gone through each of the packages in Terratest and took down some notes on cleanup we need to do. This is not a
comprehensive list, as things will become clearer once I actually start doing the work.

In fact, my plan is to first create all the examples in the `examples` folder, then write tests for them in the `test`
folder using "wishful thinking" (in the
[SICP](https://www.amazon.com/Structure-Interpretation-Computer-Programs-Engineering/dp/0262510871) sense), where I
come up with the test API I want to have for doing the testing, and then go and refactor the Terratest code to match.


### Root package

We have a lot of stuff in the root package and I propose moving all of it out into appropriate sub-packages:

- `apply.go`, `apply_and_destroy.go`, `destroy.go`, `output.go`, and `output_test.go` will all be moved into
  `modules/terraform`, as they are all specific to testing Terraform code.

- I propose deleting `rand_resources.go` and `rand_resource_test.go` and extracting its logic into other places. The
  `RandomResourceCollection` ended up being a, well, random collection of resources, most of which don't apply to most
  of our tests, and certainly won't apply to tests written by the open source community. Here's what
  `RandomResourceCollection` contains and what I propose to do with it:

    - `UniqueId`: We already have a separate method for generating a unique ID and we can pass it around as a `string`.

    - `AwsRegion`: This is only needed for AWS tests. We want to expand Terratest to support other clouds, so it needs
      to be separated anyway. Code that needs an AWS region should call a method in the `modules/aws` package to pick a
      random AWS region (passing in a list of forbidden regions, if necessary) and can pass that around as a `string`.

    - `KeyPair`: This is only needed for a small percentage of our AWS tests that deploy EC2 Instances and SSH to them.
      Those tests should call a standalone method in the `modules/aws` package to generate this `KeyPair` when they need it,
      instead of us assuming every single test needs it.

    - `AmiId`: We used to look up vanilla Ubuntu or Amazon Linux AMI IDs and put them in this field, but now that
      Terraform has `data` sources and Packer has `source_ami_filter`, this is no longer necessary. We can keep the
      methods around to find Ubuntu or Amazon Linux AMI IDs for tests that need them, but there's no need to assume
      every single test needs this.

    - `AccountId`: Our Terraform examples used to require an account ID to be passed in. We now avoid this to make the
      examples easier to use, and fetch it automatically using Terraform's `aws_caller_identity` data source if it's
      absolutely necessary. Code that needs an account ID should call a method in the `modules/aws` package to fetch it,
      but we shouldn't assume every single test needs it.

    - `SnsTopicArn`: A very, very small percentage of our tests needed an SNS topic passed in. Those tests should call
      a method in the `modules/aws` package to create this topic instead of us assuming every single test needs it.

- I propose moving `terratest_options.go` to `modules/terraform/options.go` and renaming the struct within it from
  `TerratestOptions` to `Options`, since this is solely used for testing Terraform code. We should also rename
  `TemplatePath` to `TerraformDir`, as `.tf` files are technically called "configurations" and not "templates".

- `url_checker.go` will be deleted. It's too hard-coded for one specific type of check. The reuse value is limited and
  it's not obvious the code exists, so it's best for the test cases to reimplement this themselves, with their specific
  needs, even if it's a tiny bit less DRY.


### _docker-images package

- Rename to `test-docker-images` to make it clearer these are only used for testing.
- Use these Docker images in the `examples` folder to show how to do "unit tests" for Packer templates.
- Follow-up PR: build and push a new version of these Docker images on each release?
- Follow-up PR: tag each new Docker image with a unique version number (e.g., sha1 of commit).


### `aws` package

- Right now, much of this code has no unit tests, since it relies on resources in AWS. By adding an `examples` folder
  that deploys real resources in AWS, we will be able to test this code better, _and_ show users how to use this code!

- `ami.go`: Update these methods to use the AWS APIs to find the latest Ubuntu / Amazon Linux AMI IDs instead of
  hard-coding them.

- `kms.go`: What to do about `GetDedicatedTestKeyArn`? For tests that use KMS, we don't want to create a new CMK each
  time the test runs, as AWS charges $1/month for CMKs, even if you delete them immediately after use. This method
  currently assumes we have a key called `alias/dedicated-test-key` in every AWS region. Should we leave it as-is and
  document it for Terratest users that want to follow a similar pattern? Or perhaps read the key name from an env var?

- `region.go`: What should we do about `GetGloballyForbiddenRegions`? Right now, it's hard-coded to include `us-west-2`
  as a globally forbidden region, as Josh is running his personal blog there. Obviously, we don't want that in the open
  source version. Josh, can you finally migrate your blog out of there so we don't have to have this exception?


### `log` package

- Rename to `logger`. That way, we don't have to alias it as `terralog` all over our test code.
- Change what the package does. Instead of creating a custom `*log.Logger` and passing it around, we are going to have
  a `Log` and `Logf` method you can call from anywhere. To use those methods, you have to pass them a `*testing.T`,
  which they will use to read out the test name. We already pass `*testing.T` to almost all of our test methods, so
  this reduces the number of arguments by one.


### `parallel` package

- I propose removing this package entirely. Now that go has [subtests](https://blog.golang.org/subtests) that you can
  easily run with `t.Run()` and parallelize with `t.Parallel()`, I think that's a cleaner way of handling parallelism
  than this custom package.


### `packer` package

- Rename `PackerOptions` to `Options` (the package name is already `packer`).


### `resources` package

- `base_resources.go` is no longer necessary if we remove `RandomResourceCollection`.
- `exclusions.go` is not used much and very out of date.
- `terraform_options.go` is hard-coded to how we do things at Gruntwork, but won't apply to many other users.


### `terraform` package

- `apply.go`: Remove `terraformDebugEnv` and instead make it easy to pass a map of env vars to the `Apply` method.
  Refactor `ApplyAndGetOutputWithRetry` to accept a list of errors on which to retry and how many retries to do.


### `test-util` package

- `dummy_server.go`: Move into the `modules/http` package.
- Remove `test-util` since that would leave it empty!


### `util` package

- `collections.go`: Move into its own `modules/collections` package.
- `keygen.go`: Move into `modules/ssh` package.
- `network.go`: Move into `modules/aws` package.
- `sleep.go`: Remove. Didn't even know we had this and doubt it gets much use!
- `random.go`: Move into its own `modules/random` package.
- `retry.go`: Move into its own `modules/retry` package.




## Error handling

I am updating most of the methods to support handling errors in one of two ways:

1. Each method `foo` will take in a `*testing.T` and upon hitting an error, call `t.Fatal`.
1. Each method `fooE` will explicitly return any errors it hits and NOT call `t.Fatal`.

Example:

```go
func GetCurrentBranchName(t *testing.T) string {
	out, err := GetCurrentBranchNameE(t)
	if err != nil {
		t.Fatal(err)
	}
	return out
}

func GetCurrentBranchNameE(t *testing.T) (string, error) {
	cmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
	bytes, err := cmd.Output()
	if err != nil {
		return "", err
	}
	return strings.TrimSpace(string(bytes)), nil
}
```

In most places in our code, we will use `GetCurrentBranchName`, which will call `t.Fatal` if it hits any errors. This
is typically the behavior we want anyway, and not having to deal with a returned error will keep our code smaller and
easier to read. However, in those cases where we may want to get the original error back and not fail the test
immediately, we can use `GetCurrentBranchNameE`.




## Other thoughts on the refactor

- Updating to the refactored version of Terratest will be a pain that requires lots of search & replace. But in the
  long term, it seems like worthwhile cleanup.

- There are a bunch of patterns we often end up using throughout our tests that would be good to copy into Terratest.
  Anyone remember what those are off the top of our head?

- Having two copies of each method (`foo` and `fooE`) is a bit tedious, but the `foo` variety is essentially the same
  boilerplate everywhere, so it only increases the maintenance burden on Terratest library maintainers a little, but
  it improves code readability for all Terratest users enormously.


================================================
FILE: SECURITY.md
================================================
# Reporting Security Issues

Gruntwork takes security seriously, and we value the input of independent security researchers. If you're reading this because you're looking to engage in responsible disclosure of a security vulnerability, we want to start with thanking you for your efforts. We appreciate your work and will make every effort to acknowledge your contributions.

To report a security issue, please use the GitHub Security Advisory ["Report a vulnerability"](https://github.com/gruntwork-io/terratest/security/advisories/new) button in the ["Security"](https://github.com/gruntwork-io/terratest/security) tab.

After receiving the report, we will investigate the issue and inform you of next steps. After the initial reply, we may ask for additional information, and will endeavor to keep you informed of our progress.

If you are reporting a bug related to an associated tool that Terratest integrates with, we ask that you report the issue directly to the maintainers of that tool.

Please do not disclose the issue publicly until we have had a chance to address it.

## Expectations on timelines

You can expect that Gruntwork will take any report of a security vulnerability seriously, but we ask that you also respect that it can take time to investigate and address issues given the size of the team maintaining Terratest. We will do our best to keep you informed of our progress, and provide insight into the timeline for addressing the issue.

## Thank you

We appreciate your help in making Terratest more secure. Thank you for your efforts in responsibly disclosing security issues, and for your patience as we work to address them.



================================================
FILE: cmd/pick-instance-type/main.go
================================================
package main

import (
	"fmt"

	"github.com/gruntwork-io/go-commons/entrypoint"
	"github.com/gruntwork-io/terratest/modules/aws"
	"github.com/urfave/cli"
)

const CustomUsageText = `Usage: pick-instance-type [OPTIONS] <REGION> <INSTANCE_TYPE> <INSTANCE_TYPE...> 

This tool takes in an AWS region and a list of EC2 instance types and returns the first instance type in the list that is available in all Availability Zones (AZs) in the given region, or exits with an error if no instance type is available in all AZs. This is useful because certain instance types, such as t2.micro, are not available in some of the newer AZs, while t3.micro is not available in some of the older AZs. If you have code that needs to run on a "small" instance across all AZs in many different regions, you can use this CLI tool to automatically figure out which instance type you should use.

Arguments:
   
  REGION           The AWS region in which to look up instance availability. E.g.: us-east-1. 
  INSTANCE_TYPE    One more more EC2 instance types. E.g.: t2.micro.


Options:

  --help            Show this help text and exit.

Example:

  pick-instance-type ap-northeast-2 t2.micro t3.micro 
`

func run(cliContext *cli.Context) error {
	region := cliContext.Args().First()
	if region == "" {
		return fmt.Errorf("You must specify an AWS region as the first argument")
	}

	instanceTypes := cliContext.Args().Tail()
	if len(instanceTypes) == 0 {
		return fmt.Errorf("You must specify at least one instance type")
	}

	// Create mock testing.T implementation so we can re-use Terratest methods
	t := MockTestingT{MockName: "pick-instance-type"}

	recommendedInstanceType, err := aws.GetRecommendedInstanceTypeE(t, region, instanceTypes)
	if err != nil {
		return err
	}

	// Print the recommended instance type to stdout
	fmt.Print(recommendedInstanceType)

	return nil
}

func main() {
	app := entrypoint.NewApp()
	cli.AppHelpTemplate = CustomUsageText
	entrypoint.HelpTextLineWidth = 120

	app.Name = "pick-instance-type"
	app.Author = "Gruntwork <www.gruntwork.io>"
	app.Description = `This tool takes in a list of EC2 instance types (e.g., "t2.micro", "t3.micro") and returns the first instance type in the list that is available in all Availability Zones (AZs) in the given AWS region, or exits with an error if no instance type is available in all AZs.`
	app.Action = run

	entrypoint.RunApp(app)
}

// MockTestingT is a mock implementation of testing.TestingT. All the functions are essentially no-ops. This allows us
// to use Terratest methods outside of a testing context (e.g., in a CLI tool).
type MockTestingT struct {
	MockName string
}

func (t MockTestingT) Fail()                                     {}
func (t MockTestingT) FailNow()                                  {}
func (t MockTestingT) Fatal(args ...interface{})                 {}
func (t MockTestingT) Fatalf(format string, args ...interface{}) {}
func (t MockTestingT) Error(args ...interface{})                 {}
func (t MockTestingT) Errorf(format string, args ...interface{}) {}
func (t MockTestingT) Name() string {
	return t.MockName
}


================================================
FILE: cmd/terratest_log_parser/main.go
================================================
// A CLI command to parse parallel terratest output to produce test summaries and break out interleaved test output.
//
// This command will take as input a terratest log output from either stdin (through a pipe) or from a file, and output
// to a directory the following files:
// outputDir
//   |-> TEST_NAME.log
//   |-> summary.log
//   |-> report.xml
// where:
// - `TEST_NAME.log` is a log for each test run that only includes the relevant logs for that test.
// - `summary.log` is a summary of all the tests in the suite, including PASS/FAIL information.
// - `report.xml` is the test summary in junit XML format to be consumed by a CI engine.
//
// Certain tradeoffs were made in the decision to implement this functionality as a separate parsing command, as opposed
// to being built into the logger module as part of `Logf`. Specifically, this implementation avoids the difficulties of
// hooking into go's testing framework to be able to extract the summary logs, at the expense of a more complicated
// implementation in handling various corner cases due to logging flexibility. Here are the list of pros and cons of
// this approach that were considered:
//
// Pros:
// - Robust to unexpected failures in testing code, like `ctrl+c`, panics, OOM kills and the like since the parser is
//   not tied to the testing process. This approach is less likely to miss these entries, and can be surfaced to the
//   summary view for easy viewing in CI engines (no need to scroll), like the panic example.
// - Can combine `go test` output (e.g `--- PASS` entries) with the log entries for the test in a single log file.
// - Can extract out the summary view (those are all `go test` log entries).
// - Can build `junit.xml` report that CI engines can use for test insights.
//
// Cons:
// - Complicated implementation that is potentially brittle. E.g if someone decides to change the logging format then
//   this will all break. If we hook during the test, then the implementation is easier because those logs are all emitted
//   at certain points in code, the information of which is lost in the final log and have to parse out.
// - Have to store all the logs twice (the full interleaved version, and the broken out version) because the parsing
//   depends on logs being available. (NOTE: this is avoidable with a pipe).

package main

import (
	"fmt"
	"os"
	"path/filepath"

	"github.com/gruntwork-io/go-commons/entrypoint"
	"github.com/gruntwork-io/go-commons/errors"
	"github.com/gruntwork-io/go-commons/logging"
	"github.com/gruntwork-io/terratest/modules/logger/parser"
	"github.com/sirupsen/logrus"
	"github.com/urfave/cli"
)

var logger = logging.GetLogger("terratest_log_parser")

const CUSTOM_USAGE_TEXT = `Usage: terratest_log_parser [--help] [--log-level=info] [--testlog=LOG_INPUT] [--outputdir=OUTPUT_DIR]

A tool for parsing parallel terratest output to produce a test summary and to break out the interleaved logs by test for better debuggability.

Options:
   --log-level LEVEL  Set the log level to LEVEL. Must be one of: [panic fatal error warning info debug]
                      (default: "info")
   --testlog value    Path to file containing test log. If unset will use stdin.
   --outputdir value  Path to directory to output test output to. If unset will use the current directory.
   --help, -h         show help
`

func run(cliContext *cli.Context) error {
	filename := cliContext.String("testlog")
	outputDir := cliContext.String("outputdir")
	logLevel := cliContext.String("log-level")
	level, err := logrus.ParseLevel(logLevel)
	if err != nil {
		return errors.WithStackTrace(err)
	}
	logger.SetLevel(level)

	var file *os.File
	if filename != "" {
		logger.Infof("reading from file")
		file, err = os.Open(filename)
		if err != nil {
			logger.Fatalf("Error opening file: %s", err)
		}
	} else {
		logger.Infof("reading from stdin")
		file = os.Stdin
	}
	defer file.Close()

	outputDir, err = filepath.Abs(outputDir)
	if err != nil {
		logger.Fatalf("Error extracting absolute path of output directory: %s", err)
	}

	parser.SpawnParsers(logger, file, outputDir)
	return nil
}

func main() {
	app := entrypoint.NewApp()
	cli.AppHelpTemplate = CUSTOM_USAGE_TEXT
	entrypoint.HelpTextLineWidth = 120

	app.Name = "terratest_log_parser"
	app.Author = "Gruntwork <www.gruntwork.io>"
	app.Description = `A tool for parsing parallel terratest output to produce a test summary and to break out the interleaved logs by test for better debuggability.`
	app.Action = run

	currentDir, err := os.Getwd()
	if err != nil {
		logger.Fatalf("Error finding current directory: %s", err)
	}
	defaultOutputDir := filepath.Join(currentDir, "out")

	logInputFlag := cli.StringFlag{
		Name:  "testlog, l",
		Value: "",
		Usage: "Path to file containing test log. If unset will use stdin.",
	}
	outputDirFlag := cli.StringFlag{
		Name:  "outputdir, o",
		Value: defaultOutputDir,
		Usage: "Path to directory to output test output to. If unset will use the current directory.",
	}
	logLevelFlag := cli.StringFlag{
		Name:  "log-level",
		Value: logrus.InfoLevel.String(),
		Usage: fmt.Sprintf("Set the log level to `LEVEL`. Must be one of: %v", logrus.AllLevels),
	}
	app.Flags = []cli.Flag{
		logLevelFlag,
		logInputFlag,
		outputDirFlag,
	}

	entrypoint.RunApp(app)
}


================================================
FILE: docs/.gitignore
================================================
.jekyll-cache
_site


================================================
FILE: docs/CNAME
================================================
terratest.gruntwork.io

================================================
FILE: docs/Dockerfile
================================================
FROM ruby:2.6.2-stretch
MAINTAINER Gruntwork <info@gruntwork.io>

# This project requires bundler 2, but the docker image comes with bundler 1 so we need to upgrade
RUN gem install bundler

# Copy the Gemfile and Gemfile.lock into the image and run bundle install in a way that will be cached
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

RUN mkdir -p /src
VOLUME ["/src"]
WORKDIR /src
COPY . /src

# Jekyll runs on port 4000 by default
EXPOSE 4000

# Run jekyll serve - jekyll will build first to create a plain html file for TOS update
CMD ["./jekyll-serve.sh"]


================================================
FILE: docs/Gemfile
================================================
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
#     bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
# gem "jekyll", "~> 4.0.0"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
# gem "minima", "~> 2.5"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
gem "github-pages", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
  gem 'jekyll-sitemap', '1.4.0'
  gem 'therubyracer', '0.12.3'
  gem 'less', '2.6.0'
  gem 'jekyll-toc'
  gem 'jekyll-redirect-from'
end

# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?


================================================
FILE: docs/README.md
================================================
# Terratest website

This is the code for the [Terratest website](https://terratest.gruntwork.io).

Terratest website is built with Jekyll and published on Github Pages from `docs` folder on `main` branch.

# Quick Start

## Download project

Clone or fork Terratest [repository](https://github.com/gruntwork-io/terratest).

## Run

1. Install [Ruby](https://www.ruby-lang.org/en/documentation/installation/). Version 2.4 or above is recommended.
   Consider using [rbenv](https://github.com/rbenv/rbenv) to manage Ruby versions.

2. Install `bundler`:

    ```bash
    gem install bundler
    ```

3. Go to the `docs` folder:

    ```bash
    cd docs
    ```

4. Install gems:

    ```bash
    bundle install
    ```

5. Run the docs site locally:

    ```bash
    bundle exec jekyll serve
    ```

6. Open [http://localhost:4000/](http://localhost:4000/) in your web browser.

# Deployment

GitHub Pages automatically rebuilds the website from the `/docs` folder whenever you commit and push changes to the `main`
branch.

# Working with the documentation

We recommend updating the documentation *before* updating any code (see [Readme Driven
Development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html)). This ensures the documentation
stays up to date and allows you to think through the problem at a high level before you get lost in the weeds of
coding.

The Terratest website contains *Docs* collection stored in `/docs/_docs`.

When you work with the documentation, it's good to preview the changes. To do that, run project as it is described in [Run section](#run).

1. [Change content on the existing page](#change-content-on-the-existing-page)
2. [Add a new page](#add-a-new-page)
3. [Remove or rename page](#remove-or-rename-page)
4. [Add custom redirection](#add-custom-redirection)

## Change content on the existing page

1. Find page in `_docs` by file name (it's the same as page's title).
2. Edit content and save file.

## Add a new page

1. Create a new file in `_docs`. The file's name and title have to be the same.
2. At the beginning of the file, add:

```
---
layout: collection-browser-doc                  # X Cannot be changed
title: Quick start                              # <--- Change this
categories:
  - getting-started                             # <--- Change this if needed
excerpt: Learn how to work with Terratest.      # <--- Change page description
tags: ["Quick Start", "DRY", "backend", "CLI"]  # <--- Set tags
order: 100                                      # <--- It sorts the docs on the list
nav_title: Documentation                        # X Cannot be changed
nav_title_link: /docs/                          # X Cannot be changed
---

```

* `layout` - do not change! (Layout sets components like a navigation sidebar, page header, footer, etc.)
* `title` - document title
* `categories` - the document's category. Four categories are in use for now: "getting-started", "testing-best-practices", "alternative-testing-tools", and "community".
* `excerpt` - description. Try to keep it short.
* `tags` - check other posts to see common tags, but you can set a new as well.
* `order` - it is used to sort the documents within collection.
* `nav_title` - the title displayed above navigation. It's optional and it's recommended to use the same as other files in the collection.
* `nav_title_link` - it is URL. If it is set, the `nav_title` becomes a link with a given URL.

3. Add content at the end of the file.

## Remove or rename page

1. Find page in `_docs` by file name (it's the same as page's title).
2. Delete page or rename.

## Add custom redirection

To add link to any page, including subpages outside of any collection, you can create a new file in specific collection (e.g. `_docs`), and set following content in the file:

```
---
title: Support
categories: Community
excerpt: Need help?
tags: ["support"]
redirect_to:
  - /support
order: 301
---
```


## Navigation

The navigation sidebar is built in `_includes/collection_browser/navigation/_collection_toc.html`.

First, the script groups documents of the given collection by categories. Categories make the uppermost level in the navigation sidebar.
Then, within each category, the script adds documents titles to the navigation under specific categories. Documents are sorted by `order` field set in frontmatter section.
Next, headings from each document are being extracted and added to the navigation.

# Development

## Project structure
```
|-- _docs                     # docs *collection*
|-- _includes                 # partials
|-- _layouts                  # layouts
|-- _pages                    # static pages
| |-- 404                     # "404: Not found" page
| |-- cookie-policy           # "Cookie Policy" page
| |-- docs                    # index page for *_docs* collection
| |-- index                   # home page
|
|-- _posts                    # Posts collection - empty and not used
|-- _site                     # website generated by Jekyll
|-- assets                    # Javascript, Stylesheets, and images
|-- scripts                   # useful scripts to use in development
| |-- convert_md_to_adoc      # contains the command to convert MD files to ADOC
|
|-- Gemfile
|-- _config.yml               # Jekyll configuration file
```

## Documentation and Examples collections

The [*documentation*](https://terratest.gruntwork.io/docs) is implemented as a Jekyll collection and built with [*Collection Browser*](#collection-browser).

### Documentation collection

The index page of the *Docs* collection is in: `_pages/docs/index.html` and is available under `/docs` URL. It uses *Collection browser* from `_includes/collection_browser/browser` which makes the list of docs, adds search input with tag filter and puts navigation sidebar containing collection's categories.

Collection is stored in `_docs` folder.

## Adding new pages to collections

The *Docs* collection uses *collection browser* which requires to setup proper meta tags in the doc file.

1. Create a new file in collection folder. *Docs* add to the `_docs`.
```
---
layout: collection-browser-doc
title: CLI options  # CHANGE THIS
categories:
  - getting-started # CHANGE THIS
excerpt: >- # CHANGE THIS
  Terratest example description
tags: ["CLI"] # CHANGE THIS
order: 102 # CHANGE THIS
nav_title: Documentation # OPTIONAL
nav_title_link: /docs/ # OPTIONAL
---
```

* layout - always has to be: `collection-browser-doc` [DO NOT CHANGE]
* title - the doc title.
* categories - set one category. Use downcase with dashes, e.g. `getting-started`.
* excerpt - the doc description.
* tags - doc tags.
* order - it is use to list documents in the right order. "Getting Started" starts from 100, "Features" starts from 200, and "Community" starts from 300.
* nav_title - the title above navigation. It's optional. It's a link if `nav_title_link` is set.
* nav_title_link - it is a URL. If it is set, `nav_link` is transformed to the link.

## Adding new collections

To add a new collection based on *Collection browser*, like *Docs* collection:

1. Add collection to the `_config.yml`:
```
collections:
  my-collection:   # --> Change to your collection's name
    output: true
    sort_by: order
    permalink: /:collection/:categories/:title/  # --> You can adjust this to your needs. You can remove ":categories" if your collection doesn't use it.
```
2. Create a folder for collection in root directory, e.g: `_my-collection` (change name)
3. Add documents to the `_my-collection` folder and set proper meta tags (see: [Adding new docs to collections](#adding-new-docs-to-collections)).
4. Create folder for collection's index page in `_pages`. Use collection name, e.g: `_pages/my-collection`.
5. Add `index.html` file to newly create folder:
```
---
layout: collection-browser # DO NOT CAHNGE THIS
title: Use cases
subtitle: Learn how to work with Terratest.
excerpt: Learn how to work with Terratest.
permalink: /examples/
slug: examples
nav_title: Documentation # OPTIONAL
nav_title_link: /docs/ # OPTIONAL
---

{% include collection_browser/browser.html collection=site.examples collection_name='examples' %}
```
6. Change `title`, `subtitle`, `excerpt`, `permalink`, and `slug` in meta tags.
7. In `include` statement, set `collection` to your collection set in `_config.yml` and set `collection_name`.


## Collection Browser

_The Collection Browser is strongly inspired by implementation of `guides` on *gruntwork.io* website._

The Collection Browser's purpose is to wrap Jekyll collection into:
* _index_ page containing ordered list of docs with search form,
* _show_ pages presenting docs' contents, and containing navigation sidebar,
* and build navigation sidebar.

### Usage

1. Add collection to `_config.yml`
```
collections:
  my-collection:   # --> Change to your collection's name
    output: true
    sort_by: order
    permalink: /:collection/:categories/:title/  # --> You can adjust this to your needs. You can remove ":categories" if your collection doesn't use it.
```
2. Create a folder for collection in root directory: `_my-collection`
3. Add documents (`.md` format is recommended) to the `_my-collection` folder.
4. In each document add:
```
---
layout: collection-browser-doc  # <-- It has to be "collection-browser-doc"
title: CLI options              # <-- [CHANGE THIS] doc's title
categories:                     # <-- [CHANGE THIS] use single category. (Downcase and dashes instead of spaces)
  - getting-started
excerpt: >-                     # <-- [CHANGE THIS] doc's description
  Some description.
tags: ["CLI", "Another tag"]    # <-- [CHANGE THIS] doc's tags
order: 102                      # <-- [CHANGE THIS] set different number to each doc to set right order
---
```
5. Create `index` page for collection. Create folder with collection name in `_pages`: `my-collection`
6. Add `index.html` in `_pages/my-collection`:
```
---
layout: collection-browser         # <-- It has to be "collection-browser"
title: Use cases
subtitle: Learn how to work with Terratest.
excerpt: Learn how to work with Terratest.
permalink: /use-cases/
slug: use-cases
---

{% include collection_browser/browser.html collection=site.my-collection collection_name='my-collection' %}
```
Adjust meta tags and replace `my-collection` with your collection name in `{% include ... %}`

### How it works

The Collection Browser needs the _index_ page in `_pages` folder. It basically imports `browser.html` from `_includes/collection_browser`.
Meta tags, like `title`, `subtitle`, `excerpt`, are used by Collection Browser on _index_ page. The _index_ page is then published under URL assigned to `permalink`.

The _index_ page displays the list of collection's docs. Clicking on any of them, redirects user to the collection's doc page.

#### config.yml

Collections are registered in the `_config.yml` file like other typical Jekyll collections.
Additional field used in the configuration is: `sort_by: order`. It ensures that collection's documents are displayed in the right order.
The `order` is set then in every collection document. For large collections it's recommended to split files into several folders, and then to use 3-digit numbers. So each folder would have reserved range of numbers, like: `100 - 199`, `200-299`, etc. It makes easy to add new documents without overwriting `order` fields in other docs.

#### Layouts

The Collection Browser uses two layouts:
* `_layouts/collection-browser.html` - for the _index_ page containing the list of documents
* `_layouts/collection-browser-doc.html` - for the "_show_" page of collection's doc

#### Includes

All Collection Browser partials are stored in `_includes/collection_browser`.
* `browser.html` - it is the collection's _index_ page
* `_doc-page.html` - is a starting point for collection's document pages (_show_ pages)

Some includes may use partials from `_includes` directory. For example, `_includes/collection_browser/_cta-section.html` uses `_includes/links-n-built-by.html`.

#### Assets

Names of assets used by `collection-browser` in `assets` folder start with `collection-browser`.

Collection Browser's classes in stylesheets starts mostly with `cb`, `collection-browser` and `collection-browser-doc`.

Javascript files used by  Collection Browser:
* `collection-browser_scroll.js` - responsible for the scroll spying in navigation sidebar and sticking this bar at the top of the screen when page is being scrolled.
* `collection-browser_search.js` - responsible for handling text search and tag filters.
* `collection-browser_toc.js` - responsible for opening and closing navigation sidebar on the document page.

#### Navigation Sidebar

The navigation sidebar is built in `_includes/collection_browser/navigation/_collection_toc.html`. Read more: [Navigation](#navigation)

## Markdown (md) > AsciiDoc (adoc) converter

Recommended format of documents is Github Markdown (`.md`). If you use the Markdown format (`.md`), and you want to convert to AsciiDoc format, you can do this with *Pandoc*:

1. Create `input.md` file and paste there Markdown content
2. Run:
```
$ pandoc --from=gfm --to=asciidoc --wrap=none --atx-headers  input.md > output.adoc
```
3. The converted content in `.adoc` format is printed in `output.adoc`

You can use also `scripts/convert_md_to_adoc.sh`.

## AsciiDoc (adoc) > Markdown (md) converter

To convert from `.adoc` (AsciiDoc) format to Markdown, you need *AsciiDoctor* and *Pandoc*.

First, install Asciidoctor:
```
$ sudo apt-get install asciidoctor
```

Next, install Pandoc:
https://pandoc.org/installing.html

Then you can use script: `scripts/convert_adoc_to_md.sh` or use the command:

```
$ asciidoctor -b docbook input.adoc && pandoc -f docbook -t gfm input.xml -o output.md --wrap=none --atx-headers
```

In both cases:
1. create a file: `input.adoc`,
2. add content to the file,
3. run script or command,
4. The output can be found in `output.md`.


================================================
FILE: docs/_config.yml
================================================
# Welcome to Jekyll!
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
#
# If you need help with YAML syntax, here are some quick references for you:
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.

title: Terratest
url: "https://terratest.gruntwork.io"
email: info@gruntwork.io
name: "Terratest | Automated tests for your infrastructure code."
description: >- # this means to ignore newlines until "baseurl:"
  Terratest is a Go library that provides patterns and helper functions for
  testing infrastructure, with 1st-class support for Terraform, Packer, Docker,
  Kubernetes, AWS, GCP, and more.
baseurl: "" # the subpath of your site, e.g. /blog
full_company_name: "Gruntwork, Inc"
thumbnail_path: "/assets/img/terratest-thumbnail.png"
repository: "github.com/gruntwork-io/terratest"
twitter_username: https://twitter.com/gruntwork_io
github_username:  https://github.com/gruntwork-io

github_api_url: https://raw.githubusercontent.com/gruntwork-io/terratest/main

# Build settings
# theme: minima
assets_base_url: '/assets/'

gtm_tracker: GTM-5TTJJGTL

theme: null

plugins:
  - jekyll-toc
  - jekyll-redirect-from
  - jekyll-sitemap

sass:
  sass_dir: assets/css
  style: compressed

whitelist:
  - jekyll-redirect-from

include: ['_pages']

collections:
  docs:
    output: true
    sort_by: order
    permalink: /:collection/:categories/:title/

# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
exclude:
  - .sass-cache/
  - .jekyll-cache/
  - gemfiles/
  - Gemfile
  - Gemfile.lock
  - node_modules/
  - vendor/bundle/
  - vendor/cache/
  - vendor/gems/
  - vendor/ruby/
  - scripts/


================================================
FILE: docs/_data/examples.yml
================================================
- id: terraform-hello-world
  name: Terraform Hello, World Example
  image: /assets/img/logos/terraform-logo.png
  files:
    - url: /examples/terraform-hello-world-example/main.tf
      id: terraform_code
    - url: /test/terraform_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Terraform Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terraform-hello-world-example

- id: packer-hello-world
  name: Packer Hello, World Example
  image: /assets/img/logos/packer-logo.png
  files:
    - url: /examples/packer-hello-world-example/build.pkr.hcl
      id: packer_code
    - url: /test/packer_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Packer Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/packer-hello-world-example

- id: docker-hello-world
  name: Docker Hello, World Example
  image: /assets/img/logos/docker-logo.png
  files:
    - url: /examples/docker-hello-world-example/Dockerfile
      id: docker_code
      prism_lang: docker
    - url: /test/docker_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Docker Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/docker-hello-world-example

- id: kubernetes-hello-world
  name: Kubernetes Hello, World Example
  image: /assets/img/logos/kubernetes-logo.png
  files:
    - url: /examples/kubernetes-hello-world-example/hello-world-deployment.yml
      id: k8s_code
    - url: /test/kubernetes_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Kubernetes Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/kubernetes-hello-world-example

- id: terragrunt-hello-world
  name: Terragrunt Example
  image: /assets/img/logos/terragrunt-logo.png
  files:
    - url: /examples/terragrunt-example/terragrunt.hcl
      id: terragrunt_code
    - url: /examples/terragrunt-example/main.tf
      id: terraform_code
    - url: /modules/terragrunt/terragrunt_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Terragrunt Unit
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terragrunt-example
    - name: Terragrunt Stack
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terragrunt-multi-module-example

- id: aws-hello-world
  name: AWS Hello, World Example
  image: /assets/img/logos/aws-logo.png
  files:
    - url: /examples/terraform-aws-hello-world-example/main.tf
      id: terraform_code
    - url: /test/terraform_aws_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: AWS Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terraform-aws-hello-world-example

- id: gcp-hello-world
  name: GCP Hello, World Example
  image: /assets/img/logos/gcp-logo.png
  files:
    - url: /examples/terraform-gcp-hello-world-example/main.tf
      id: terraform_code
    - url: /test/gcp/terraform_gcp_hello_world_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: GCP Hello, World
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terraform-gcp-hello-world-example

- id: azure-basic
  name: Azure Hello, World Example
  image: /assets/img/logos/azure-logo.png
  files:
    - url: /examples/azure/terraform-azure-example/main.tf
      id: terraform_main_code
    - url: /examples/azure/terraform-azure-example/outputs.tf
      id: terraform_output_code
    - url: /examples/azure/terraform-azure-example/variables.tf
      id: terraform_var_code
    - url: /test/azure/terraform_azure_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Terraform Azure Example
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/azure/terraform-azure-example

- id: opa-terraform
  name: OPA Terraform Example
  image: /assets/img/logos/opa-logo.png
  files:
    - url: /examples/terraform-opa-example/pass/main_pass.tf
      id: pass_terraform_main_code
    - url: /examples/terraform-opa-example/fail/main_fail.tf
      id: fail_terraform_main_code
    - url: /examples/terraform-opa-example/policy/enforce_source.rego
      id: policy_main_code
    - url: /test/terraform_opa_example_test.go
      id: test_code
      default: true
  learn_more:
    - name: Terraform OPA Example
      url: https://github.com/gruntwork-io/terratest/tree/main/examples/terraform-opa-example

- id: client-factory
  name: Azure Client Factory
  display_in_examples: false
  files:
    - url: /modules/azure/client_factory.go
      id: client_factory_code
    - url: /modules/azure/client_factory_test.go
      id: client_factory_test
    - url: /modules/azure/compute.go
      id: client_factory_helper


================================================
FILE: docs/_data/prism_extends.yml
================================================
sh: bash
tpl: yaml
tf: hcl
tfvars: hcl
yml: yaml


================================================
FILE: docs/_docs/01_getting-started/examples.md
================================================
---
title: Examples
category: getting-started
excerpt: Examples are the best way to start testing Terraform, Docker, Packer, Kubernetes, AWS, GCP, and more with Terratest.
tags: ["example"]
redirect_to:
  - /examples/
order: 102
nav_title: Documentation
nav_title_link: /docs/
---


================================================
FILE: docs/_docs/01_getting-started/godoc.md
================================================
---
layout: collection-browser-doc
title: GoDoc
category: getting-started
excerpt: >-
  Browse Terratest methods and types in GoDoc.
tags: ["packages"]
redirect_to:
  - https://godoc.org/github.com/gruntwork-io/terratest
target_blank: true
order: 104
nav_title: Documentation
nav_title_link: /docs/
---


================================================
FILE: docs/_docs/01_getting-started/introduction.md
================================================
---
layout: collection-browser-doc
title: Introduction
category: getting-started
toc: true
excerpt: >-
  Terratest provides a variety of helper functions and patterns for common infrastructure testing tasks. Learn more about Terratest basic usage.
tags: ["basic-usage"]
order: 100
nav_title: Documentation
nav_title_link: /docs/
---

## Introduction

Terratest is a Go library that makes it easier to write automated tests for your infrastructure code. It provides a
variety of helper functions and patterns for common infrastructure testing tasks, including:

- Testing Terraform code
- Testing Packer templates
- Testing Docker images
- Executing commands on servers over SSH
- Working with AWS APIs
- Working with Azure APIs
- Working with GCP APIs
- Working with Kubernetes APIs
- Enforcing policies with OPA
- Testing Helm Charts
- Making HTTP requests
- Running shell commands
- And much more


## Watch: “How to test infrastructure code”

Yevgeniy Brikman talks about how to write automated tests for infrastructure code, including the code written for use with tools such as Terraform, Docker, Packer, and Kubernetes. Topics covered include: unit tests, integration tests, end-to-end tests, dependency injection, test parallelism, retries and error handling, static analysis, property testing and CI / CD for infrastructure code.

This presentation was recorded at QCon San Francisco 2019: https://qconsf.com/.

<iframe width="100%" height="450" allowfullscreen src="https://www.youtube.com/embed/xhHOW0EF5u8"></iframe>

### Slides

Slides to the video can be found here: [Slides: How to test infrastructure code](https://www.slideshare.net/brikis98/how-to-test-infrastructure-code-automated-testing-for-terraform-kubernetes-docker-packer-and-more){:target="\_blank"}.


## Gruntwork

Terratest was developed at [Gruntwork](https://gruntwork.io/) to help maintain the [Infrastructure as Code
Library](https://gruntwork.io/infrastructure-as-code-library/), which contains over 300,000 lines of code written
in Terraform, Go, Python, and Bash, and is used in production by hundreds of companies.

<div class="cb-post-cta">
  <span class="title">See how to get started with Terratest</span>
  <a class="btn btn-primary" href="{{site.baseurl}}/docs/getting-started/quick-start/">Quick Start</a>
</div>


================================================
FILE: docs/_docs/01_getting-started/packages-overview.md
================================================
---
layout: collection-browser-doc
title: Package by package overview
category: getting-started
excerpt: >-
  Learn more about Terratest modules and how they can help you test different types infrastructure.
tags: ["packages"]
order: 103
nav_title: Documentation
nav_title_link: /docs/
---

Now that you've had a chance to browse the examples and their tests, here's an overview of the packages you'll find in
Terratest's [modules folder](https://github.com/gruntwork-io/terratest/tree/main/modules) and how they can help you test different types infrastructure:

{:.doc-styled-table}
| Package            | Description                                                                                                                                                                                                                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **aws**            | Functions that make it easier to work with the AWS APIs. Examples: find an EC2 Instance by tag, get the IPs of EC2 Instances in an ASG, create an EC2 KeyPair, look up a VPC ID.                                                                                                                     |
| **azure**          | Functions that make it easier to work with the Azure APIs. Examples: get the size of a virtual machine, get the tags of a virtual machine.                                                                                                                                                           |
| **collections**    | Go doesn't have much of a collections library built-in, so this package has a few helper methods for working with lists and maps. Examples: subtract two lists from each other.                                                                                                                      |
| **docker**         | Functions that make it easier to work with Docker and Docker Compose. Examples: run `docker compose` commands.                                                                                                                                                                                       |
| **environment**    | Functions for interacting with os environment. Examples: check for first non empty environment variable in a list.                                                                                                                                                                                   |
| **files**          | Functions for manipulating files and folders. Examples: check if a file exists, copy a folder and all of its contents.                                                                                                                                                                               |
| **gcp**            | Functions that make it easier to work with the GCP APIs. Examples: Add labels to a Compute Instance, get the Public IPs of an Instance, Get a list of Instances in a Managed Instance Group, Work with Storage Buckets and Objects.                                                                                                                                                                                                                     |
| **git**            | Functions for working with Git. Examples: get the name of the current Git branch.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **helm**           | Functions for working with Helm. Examples: Install a Helm chart.                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| **http-helper**    | Functions for making HTTP requests. Examples: make an HTTP request to a URL and check the status code and body contain the expected values, run a simple HTTP server locally.                                                                                                                        |
| **k8s**            | Functions that make it easier to work with Kubernetes. Examples: Getting the list of nodes in a cluster, waiting until all nodes in a cluster is ready.                                                                                                                                              |
| **logger**         | A replacement for Go's `t.Log` and `t.Logf` that writes the logs to `stdout` immediately, rather than buffering them until the very end of the test. This makes debugging and iterating easier.                                                                                                      |
| **logger/parser**  | Includes functions for parsing out interleaved go test output and piecing out the individual test logs. Used by the [terratest_log_parser](https://github.com/gruntwork-io/terratest/tree/main/cmd/terratest_log_parser) command.                                                                                                                       |
| **oci**            | Functions that make it easier to work with OCI. Examples: Getting the most recent image of a compartment + OS pair, deleting a custom image, retrieving a random subnet.                                                                                                                             |
| **packer**         | Functions for working with Packer. Examples: run a Packer build and return the ID of the artifact that was created.                                                                                                                                                                                  |
| **random**         | Functions for generating random data. Examples: generate a unique ID that can be used to namespace resources so multiple tests running in parallel don't clash.                                                                                                                                      |
| **retry**          | Functions for retrying actions. Examples: retry a function up to a maximum number of retries, retry a function until a stop function is called, wait up to a certain timeout for a function to complete. These are especially useful when working with distributed systems and eventual consistency. |
| **shell**          | Functions to run shell commands. Examples: run a shell command and return its `stdout` and `stderr`.                                                                                                                                                                                                 |
| **ssh**            | Functions to SSH to servers. Examples: SSH to a server, execute a command, and return `stdout` and `stderr`.                                                                                                                                                                                         |
| **terraform**      | Functions for working with Terraform. Examples: run `terraform init`, `terraform apply`, `terraform destroy`.                                                                                                                                                                                        |
| **terragrunt**     | Functions for working with Terragrunt. Examples: run `terragrunt apply --all`, `terragrunt destroy --all`, test stack configurations with dependencies, and work with Terragrunt stacks.                                                                                                      |
| **test_structure** | Functions for structuring your tests to speed up local iteration. Examples: break up your tests into stages so that any stage can be skipped by setting an environment variable.                                                                                                                     |


================================================
FILE: docs/_docs/01_getting-started/quick-start.md
================================================
---
layout: collection-browser-doc
title: Quick start
category: getting-started
excerpt: Learn how to start with Terratest.
tags: ["quick-start"]
order: 101
nav_title: Documentation
nav_title_link: /docs/
custom_js:
  - examples
  - prism
---

## Requirements

Terratest uses the Go testing framework. To use Terratest, you need to install:

- [Go](https://golang.org/) (requires version >=1.21.1)

## Setting up your project

The easiest way to get started with Terratest is to copy one of the examples and its corresponding tests from this
repo. This quick start section uses a Terraform example, but check out the [Examples]({{site.baseurl}}/examples/) section for other
types of infrastructure code you can test (e.g., Packer, Kubernetes, etc).

1. Create an `examples` and `test` folder.

1. Copy the folder including all the files from the [basic terraform example](https://github.com/gruntwork-io/terratest/tree/main/examples/terraform-basic-example/) into the `examples` folder.

1. Copy the [basic terraform example test](https://github.com/gruntwork-io/terratest/blob/main/test/terraform_basic_example_test.go) into the `test` folder.

1. To configure dependencies, run:

    ```bash
    cd test
    go mod init "<MODULE_NAME>"
    go mod tidy
    ```

    Where `<MODULE_NAME>` is the name of your module, typically in the format
    `github.com/<YOUR_USERNAME>/<YOUR_REPO_NAME>`.

1. To run the tests:

    ```bash
    cd test
    go test -v -timeout 30m
    ```

    *(See [Timeouts and logging]({{ site.baseurl }}/docs/testing-best-practices/timeouts-and-logging/) for why the `-timeout` parameter is used.)*


## Terratest intro

The basic usage pattern for writing automated tests with Terratest is to:

1. Write tests using Go’s built-in [package testing](https://golang.org/pkg/testing/): you create a file ending in `_test.go` and run tests with the `go test` command. E.g., `go test my_test.go`.
1. Use Terratest to execute your _real_ IaC tools (e.g., Terraform, Packer, etc.) to deploy _real_ infrastructure (e.g., servers) in a _real_ environment (e.g., AWS).
1. Use the tools built into Terratest to validate that the infrastructure works correctly in that environment by making HTTP requests, API calls, SSH connections, etc.
1. Undeploy everything at the end of the test.

To make this sort of testing easier, Terratest provides a variety of helper functions and patterns for common infrastructure testing tasks, such as testing Terraform code, testing Packer templates, testing Docker images, executing commands on servers over SSH, making HTTP requests, working with AWS APIs, and so on.


## Example #1: Terraform "Hello, World"

Let's start with the simplest possible [Terraform](https://www.terraform.io/) code, which just outputs the text, 
"Hello, World" (if you’re new to Terraform, check out our [Comprehensive Guide to 
Terraform](https://blog.gruntwork.io/a-comprehensive-guide-to-terraform-b3d32832baca)): 
 
{% include examples/explorer.html example_id='terraform-hello-world' file_id='terraform_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}
 
How can you test this code to be confident it works correctly? Well, let’s think about how you would test it manually:

1. Run `terraform init` and `terraform apply` to execute the code.
1. When `apply` finishes, check that the output variable says, "Hello, World".
1. When you're done testing, run `terraform destroy` to clean everything up.
 
Using Terratest, you can write an automated test that performs the exact same steps! Here’s what the code looks like:
 
{% include examples/explorer.html example_id='terraform-hello-world' file_id='test_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}
 
This code does all the steps we mentioned above, including running `terraform init`, `terraform apply`, reading the 
output variable using `terraform output`, checking its value is what we expect, and running `terraform destroy` 
(using [`defer`](https://blog.golang.org/defer-panic-and-recover) to run it at the end of the test, whether the test 
succeeds or fails). If you put this code in a file called `terraform_hello_world_example_test.go`, you can run it by 
executing `go test`, and you’ll see output that looks like this (truncated for readability):

```
$ go test -v
=== RUN   TestTerraformHelloWorldExample
Running command terraform with args [init]
Initializing provider plugins...
[...]
Terraform has been successfully initialized!
[...]
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
hello_world = "Hello, World!"
[...]
Running command terraform with args [destroy -force -input=false]
[...]
Destroy complete! Resources: 2 destroyed.
--- PASS: TestTerraformHelloWorldExample (149.36s)
```

Success! 

## Example #2: Terraform and AWS

Let's now try out a more realistic Terraform example. Here is some Terraform code that deploys a simple web server in 
AWS:

{% include examples/explorer.html example_id='aws-hello-world' file_id='terraform_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

The code above deploys an [EC2 Instance](https://aws.amazon.com/ec2/) that is running an Ubuntu 
[Amazon Machine Image (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html). To keep this example 
simple, we specify a [User Data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-api-cli) 
script that, while the server is booting, fires up a dirt-simple web server that returns “Hello, World” on port 8080.

How can you test this code to be confident it works correctly? Well, let’s again think about how you would test it 
manually:

1. Run `terraform init` and `terraform apply` to deploy the web server into your AWS account.
1. When `apply` finishes, get the IP of the web server by reading the `public_ip` output variable.
1. Open the IP in your web browser with port 8080 and make sure it says “Hello, World”. Note that it can take 1–2 
   minutes for the server to boot up, so you may have to retry a few times.
1. When you’re done testing, run `terraform destroy` to clean everything up.

Here's how we can automate the steps above using Terratest:

{% include examples/explorer.html example_id='aws-hello-world' file_id='test_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

This test code runs `terraform init` and `terraform apply`, reads the server IP using `terraform output`, makes HTTP 
requests to the web server (including plenty of retries to account for the server taking time to boot), checks the HTTP
response is what we expect, and then runs `terraform destroy` at the end. If you put this code in a file called 
`terraform_aws_hello_world_example_test.go`, you can run just this test by passing the `-run` argument to `go test` as 
follows:

```
$ go test -v -run TestTerraformAwsHelloWorldExample -timeout 30m
=== RUN   TestTerraformAwsHelloWorldExample
Running command terraform with args [init]
Initializing provider plugins...
[...]
Terraform has been successfully initialized!
[...]
Running command terraform with args [apply -auto-approve]
aws_instance.example: Creating...
  associate_public_ip_address:       "" => "<computed>"
  availability_zone:                 "" => "<computed>"
  ephemeral_block_device.#:          "" => "<computed>"
  instance_type:                     "" => "t2.micro"
  key_name:                          "" => "<computed>"
[...]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
public_ip = 52.67.41.31
[...]
Making an HTTP GET call to URL http://52.67.41.31:8080
dial tcp 52.67.41.31:8080: getsockopt: connection refused.
Sleeping for 5s and will try again.
Making an HTTP GET call to URL http://52.67.41.31:8080
dial tcp 52.67.41.31:8080: getsockopt: connection refused.
Sleeping for 5s and will try again.
Making an HTTP GET call to URL http://52.67.41.31:8080
Success!
[...]
Running command terraform with args [destroy -force -input=false]
[...]
Destroy complete! Resources: 2 destroyed.
--- PASS: TestTerraformAwsHelloWorldExample (149.36s)
```

Success! Now, every time you make a change to this Terraform code, the test code can run and make sure your web server 
works as expected.

Note that in the `go test` command above, we set `-timeout 30m`. This is because Go sets a default test time out of 10
minutes, and if your test take longer than that to run, Go will panic, and kill the test code part way through. This is
not only annoying, but also prevents the clean up code from running (the `terraform destroy`), leaving you with lots of
resources hanging in your AWS account. To prevent this, we always recommend setting a high test timeout; the test above
doesn't actually take anywhere near 30 minutes (typical runtime is ~3 minutes), but we give lots of extra buffer to be
extra sure that the test always has a chance to finish cleanly. 

## Example #3: Docker

You can use Terratest for testing a variety of infrastructure code, not just Terraform. For example, you can use it to
test your [Docker](https://www.docker.com/) images:

{% include examples/explorer.html example_id='docker-hello-world' file_id='docker_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

The `Dockerfile` above creates a simple Docker image that uses Ubuntu 18.04 as a base and writes the text "Hello, World!" 
to a text file. At this point, you should already know the drill. First, let's think through how you'd test this 
`Dockerfile` manually:

1. Run `docker build` to build the Docker image.
1. Run the image via `docker run`.
1. Check that the running Docker container has a text file with the text "Hello, World!" in it.

Here's how you can use Terratest to automate this process:  

{% include examples/explorer.html example_id='docker-hello-world' file_id='test_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

Instead of using Terraform helpers, this test code uses Terratest's Docker helpers to run `docker build`, `docker run`,
and check the contents of the text file. As before, you can run this test using `go test`!

## Example #4: Kubernetes

Terratest also provides helpers for testing your [Kubernetes](https://kubernetes.io/) code. For example, here's a 
Kubernetes manifest you might want to test:

{% include examples/explorer.html example_id='kubernetes-hello-world' file_id='k8s_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

This manifest deploys the [Docker training webapp](https://hub.docker.com/r/training/webapp/), a simple app that 
responds with the text "Hello, World!", as a Kubernetes Deployment and exposes it to the outside world on port 5000 
using a `LoadBalancer`.

To test this code manually, you would:

1. Run `kubectl apply` to deploy the Docker training webapp.
1. Use the Kubernetes APIs to figure out the endpoint to hit for the load balancer.
1. Open the endpoint in your web browser on port 5000 and make sure it says “Hello, World”. Note that, depending on 
   your Kubernetes cluster, it could take a minute or two for the Docker container to come up, so you may have to retry 
   a few times.
1. When you're done testing, run `kubectl delete` to clean everything up.

Here's how you automate this process with Terratest:

{% include examples/explorer.html example_id='kubernetes-hello-world' file_id='test_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true %}

The test code above uses Kuberenetes helpers built into Terratest to run `kubectl apply`, wait for the service to come
up, get the service endpoint, make HTTP requests to the service (with plenty of retries), check the response is what
we expect, and runs `kubectl delete` at the end. You run this test with `go test` as well! 


## Give it a shot!

The above is just a small taste of what you can do with [Terratest](https://github.com/gruntwork-io/terratest). To 
learn more:

1. Check out the [examples]({{site.baseurl}}/examples/) and the corresponding automated tests for those examples for fully working (and tested!) sample code.
1. Browse through the list of [Terratest packages]({{site.baseurl}}/docs/getting-started/packages-overview/) to get a sense of all the tools available in Terratest.
1. Read our [Testing Best Practices Guide]({{site.baseurl}}/docs/#testing-best-practices).
1. Check out real-world examples of Terratest usage in our open source infrastructure modules: [Consul](https://github.com/hashicorp/terraform-aws-consul), [Vault](https://github.com/hashicorp/terraform-aws-vault), [Nomad](https://github.com/hashicorp/terraform-aws-nomad).

Happy testing!


================================================
FILE: docs/_docs/01_getting-started/testing-terragrunt.md
================================================
---
layout: collection-browser-doc
title: Testing Terragrunt
category: getting-started
excerpt: >-
  Learn how to test Terragrunt configurations with Terratest.
tags: ["terragrunt", "testing", "quick-start"]
order: 104
nav_title: Documentation
nav_title_link: /docs/
---

## Overview

Terratest provides two approaches for testing Terragrunt configurations:

| Approach | Use Case | Package |
|----------|----------|---------|
| **Unit** | Testing individual units | `modules/terraform` with `TerraformBinary: "terragrunt"` |
| **Stack** | Testing a stack of units with `--all` commands | `modules/terragrunt` |

## Unit Testing

For testing a single Terragrunt unit, use the `terraform` package with `TerraformBinary` set to `"terragrunt"`:

```go
func TestTerragruntModule(t *testing.T) {
    t.Parallel()

    terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
        TerraformDir:    "../examples/my-module",
        TerraformBinary: "terragrunt",
    })

    defer terraform.Destroy(t, terraformOptions)
    terraform.Apply(t, terraformOptions)

    output := terraform.Output(t, terraformOptions, "my_output")
    assert.Equal(t, "expected_value", output)
}
```

## Stack Testing

For testing a stack of units with dependencies, use the dedicated `terragrunt` package:

```go
func TestStack(t *testing.T) {
    t.Parallel()

    testFolder, err := files.CopyTerragruntFolderToTemp("../live/prod", t.Name())
    require.NoError(t, err)

    options := &terragrunt.Options{
        TerragruntDir: testFolder,
    }

    defer terragrunt.DestroyAll(t, options)
    terragrunt.ApplyAll(t, options)

    exitCode := terragrunt.PlanAllExitCode(t, options)
    require.Equal(t, 0, exitCode)
}
```

### Available Functions

| Function | Description |
|----------|-------------|
| `Init` | Run `terragrunt init` |
| `ApplyAll` | Run `terragrunt apply --all` |
| `DestroyAll` | Run `terragrunt destroy --all` |
| `PlanAllExitCode` | Run `terragrunt plan --all`, return exit code |
| `ValidateAll` | Run `terragrunt validate --all` |
| `FormatAll` | Run `terragrunt fmt --all` |
| `RunAll` | Run any command with `--all` flag |

### Stack Functions

For Terragrunt [stacks](https://terragrunt.gruntwork.io/docs/features/stacks/):

| Function | Description |
|----------|-------------|
| `StackGenerate` | Generate stack from `terragrunt.stack.hcl` |
| `StackRun` | Run command on generated stack |
| `StackClean` | Remove `.terragrunt-stack` directory |
| `Output` | Get stack output value |
| `OutputAll` | Get all stack outputs as map |

## Further Reading

- [Terragrunt Documentation](https://terragrunt.gruntwork.io/)
- [Stack example](https://github.com/gruntwork-io/terratest/tree/main/examples/terragrunt-multi-module-example)
- [terragrunt package reference](https://pkg.go.dev/github.com/gruntwork-io/terratest/modules/terragrunt)


================================================
FILE: docs/_docs/02_testing-best-practices/alternative-testing-tools.md
================================================
---
layout: collection-browser-doc
title: Alternative testing tools
category: testing-best-practices
excerpt: >-
  Learn more about alternatives to Terratest, and how Terratest compares to other testing tools.
tags: ["testing-best-practices", "alternatives"]
order: 211
nav_title: Documentation
nav_title_link: /docs/
---

## A list of infrastructure testing tools

Below is a list of other infrastructure testing tools you may wish to use in addition to Terratest. Check out [How
Terratest compares to other testing tools]({{site.baseurl}}/docs/testing-best-practices/alternative-testing-tools/#how-terratest-compares-to-other-testing-tools) to understand the trade-offs.

1.  [kitchen-terraform](https://github.com/newcontext-oss/kitchen-terraform)
1.  [rspec-terraform](https://github.com/bsnape/rspec-terraform)
1.  [serverspec](https://serverspec.org/)
1.  [inspec](https://www.inspec.io/)
1.  [Goss](https://github.com/aelsabbahy/goss)
1.  [awspec](https://github.com/k1LoW/awspec)
1.  [Terraform's acceptance testing framework](https://github.com/hashicorp/terraform/blob/master/.github/CONTRIBUTING.md#acceptance-tests-testing-interactions-with-external-services)
1.  [ruby_terraform](https://github.com/infrablocks/ruby_terraform)



## Why Terratest?

Our experience with building the [Infrastructure as Code Library](https://gruntwork.io/infrastructure-as-code-library/)
is that the _only_ way to create reliable, maintainable infrastructure code is to have a thorough suite of real-world,
end-to-end acceptance tests. Without these sorts of tests, you simply cannot be confident that the infrastructure code
actually works.

This is especially important with modern DevOps, as all the tools are changing so quickly. Terratest has helped us
catch bugs not only in our own code, but also in AWS, Azure, Terraform, Packer, Kafka, Elasticsearch, CircleCI, and
so on. Moreover, by running tests nightly, we're able to catch backwards incompatible changes and
regressions in our dependencies (e.g., backwards incompatibilities in new versions of Terraform) as early as possible.



## How Terratest compares to other testing tools

Most of the other infrastructure testing tools we've seen are focused on making it easy to check the properties of a
single server or resource. For example, the various `xxx-spec` tools offer a nice, concise language for connecting to
a server and checking if, say, `httpd` is installed and running. These tools are effectively verifying that individual
"properties" of your infrastructure meet a certain spec.

Terratest approaches the testing problem from a different angle. The question we're trying to answer is, "does the
infrastructure actually work?" Instead of checking individual server properties (e.g., is `httpd` installed and
running), we'll actually make HTTP requests to the server and check that we get the expected response; or we'll store
data in a database and make sure we can read it back out; or we'll try to deploy a new version of a Docker container
and make sure the orchestration tool can roll out the new container with no downtime.

Moreover, we use Terratest not only with individual servers, but to test entire systems. For example, the automated
tests for the [Vault module](https://github.com/hashicorp/terraform-aws-vault/tree/master/modules) do the following:

1.  Use Packer to build an AMI.
1.  Use Terraform to create self-signed TLS certificates.
1.  Use Terraform to deploy all the infrastructure: a Vault cluster (which runs the AMI from the previous step), Consul
    cluster, load balancers, security groups, S3 buckets, and so on.
1.  SSH to a Vault node to initialize the cluster.
1.  SSH to all the Vault nodes to unseal them.
1.  Use the Vault SDK to store data in Vault.
1.  Use the Vault SDK to make sure you can read the same data back out of Vault.
1.  Use Terraform to undeploy and clean up all the infrastructure.

The steps above are exactly what you would've done to test the Vault module manually. Terratest helps automate this
process. You can think of Terratest as a way to do end-to-end, acceptance or integration testing, whereas most other
tools are focused on unit or functional testing.


================================================
FILE: docs/_docs/02_testing-best-practices/avoid-test-caching.md
================================================
---
layout: collection-browser-doc
title: Avoid test caching
category: testing-best-practices
excerpt: >-
  Since Go 1.10, test results are automatically cached. See how to turn off caching test results.
tags: ["testing-best-practices", "cache"]
order: 207
nav_title: Documentation
nav_title_link: /docs/
---

Since Go 1.10, test results are automatically [cached](https://golang.org/doc/go1.10#test). This can lead to Go not
running your tests again if you haven't changed any of the Go code. Since you're probably mainly manipulating Terraform
files, you should consider turning the caching of test results off. This ensures that the tests are run every time
you run `go test` and the result is not just read from the cache.

To turn caching off, you can set the `-count` flag to `1` force the tests to run:

```shell
$ go test -count=1 -timeout 30m -p 1 ./...
```


================================================
FILE: docs/_docs/02_testing-best-practices/cleanup.md
================================================
---
layout: collection-browser-doc
title: Cleanup
category: testing-best-practices
excerpt: >-
  Since automated tests with Terratest deploy real resources into real environments, you'll want to make sure your tests
  always cleanup after themselves.
tags: ["testing-best-practices", "clean", "terraform-destroy", "terraform-apply"]
order: 204
nav_title: Documentation
nav_title_link: /docs/
---

Since automated tests with Terratest deploy real resources into real environments, you'll want to make sure your tests
always cleanup after themselves so you don't leave a bunch of resources lying around. Typically, you should use Go's
`defer` keyword to ensure that the cleanup code always runs, even if the test hits an error along the way.

For example, if your test runs `terraform apply`, you should run `terraform destroy` at the end to clean up:

```go
// Ensure cleanup always runs
defer terraform.Destroy(t, options)

// Deploy
terraform.Apply(t, options)

// Validate
checkServerWorks(t, options)
```

Of course, despite your best efforts, occasionally cleanup will fail, perhaps due to the CI server going down, or a bug
in your code, or a temporary network outage. To handle those cases, we run a tool called
[cloud-nuke](https://github.com/gruntwork-io/cloud-nuke) in our test AWS account on a nightly basis to clean up any
leftover resources.


================================================
FILE: docs/_docs/02_testing-best-practices/debugging-interleaved-test-output.md
================================================
---
layout: collection-browser-doc
title: Debugging interleaved test output
category: testing-best-practices
excerpt: >-
  Learn more about `terratest_log_parser`.
tags: ["testing-best-practices", "logger"]
order: 206
nav_title: Documentation
nav_title_link: /docs/
---

## Debugging interleaved test output

**Note**: The `terratest_log_parser` requires an explicit installation. See [Installing the utility
binaries](#installing-the-utility-binaries) for installation instructions.

If you log using Terratest's `logger` package, you may notice that all the test outputs are interleaved from the
parallel execution. This may make it difficult to debug failures, as it can be tedious to sift through the logs to find
the relevant entries for a failing test, let alone find the test that failed.

Therefore, Terratest ships with a utility binary `terratest_log_parser` that can be used to break out the logs.

To use the utility, you simply give it the log output from a `go test` run and a desired output directory:

```bash
go test -timeout 30m | tee test_output.log
terratest_log_parser -testlog test_output.log -outputdir test_output
```

This will:

- Create a file `TEST_NAME.log` for each test it finds from the test output containing the logs corresponding to that
  test.
- Create a `summary.log` file containing the test result lines for each test.
- Create a `report.xml` file containing a Junit XML file of the test summary (so it can be integrated in your CI).

The output can be integrated in your CI engine to further enhance the debugging experience. See Terratest's own
[circleci configuration](https://github.com/gruntwork-io/terratest/blob/main/.circleci/config.yml) for an example of how to integrate the utility with CircleCI. This
provides for each build:

- A test summary view showing you which tests failed:

![CircleCI test summary]({{site.baseurl}}/assets/img/docs/debugging-interleaved-test-output/circleci-test-summary.png)

- A snapshot of all the logs broken out by test:

![CircleCI logs]({{site.baseurl}}/assets/img/docs/debugging-interleaved-test-output/circleci-logs.png)

## Installing the utility binaries

Terratest also ships utility binaries that you can use to improve the debugging experience (see [Debugging interleaved
test output](#debugging-interleaved-test-output)). The compiled binaries are shipped separately from the library in the
[Releases page](https://github.com/gruntwork-io/terratest/releases).

The following binaries are currently available with `terratest`:

{:.doc-styled-table}
| Command                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **terratest_log_parser** | Parses test output from the `go test` command and breaks out the interleaved logs into logs for each test. Integrate with your CI environment to help debug failing tests.                                                                                                                                                                                                                                                                                                                                                                                                            |
| **pick-instance-type**   | Takes an AWS region and a list of EC2 instance types and returns the first instance type in the list that is available in all Availability Zones in the given region, or exits with an error if no instance type is available in all AZs. This is useful because certain instance types, such as t2.micro, are not available in some newer AZs, while t3.micro is not available in some older AZs. If you have code that needs to run on a "small" instance across all AZs in many regions, you can use this CLI tool to automatically figure out which instance type you should use. |

You can install any binary using one of the following methods:

- [Manual installation](#manual-installation)
- [go install](#go-install)
- [gruntwork-installer](#gruntwork-installer)

### Manual installation

To install the binary manually, download the version that matches your platform and place it somewhere on your `PATH`.
For example to install version 0.13.13 of `terratest_log_parser`:

```bash
# This example assumes a linux 64bit machine
# Use curl to download the binary
curl --location --silent --fail --show-error -o terratest_log_parser https://github.com/gruntwork-io/terratest/releases/download/v0.13.13/terratest_log_parser_linux_amd64
# Make the downloaded binary executable
chmod +x terratest_log_parser
# Finally, we place the downloaded binary to a place in the PATH
sudo mv terratest_log_parser /usr/local/bin
```

### go install

`go` supports building and installing packages and commands from source using the [go
install](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies) command. To install the binaries
with `go install`, point `go install` to the repo and path where the main code for each relevant command lives. For
example, you can install the terratest log parser binary with:

```
go install github.com/gruntwork-io/terratest/cmd/terratest_log_parser@latest
```

Similarly, to install `pick-instance-type`, you can run:

```
go install github.com/gruntwork-io/terratest/cmd/pick-instance-type@latest
```

### gruntwork-installer

You can also use [the gruntwork-installer utility](https://github.com/gruntwork-io/gruntwork-installer) to install the
binaries, which will do the above steps and automatically select the right binary for your platform:

```bash
gruntwork-install --binary-name 'terratest_log_parser' --repo 'https://github.com/gruntwork-io/terratest' --tag 'v0.13.13'
```


================================================
FILE: docs/_docs/02_testing-best-practices/error-handling.md
================================================
---
layout: collection-browser-doc
title: Error handling
category: testing-best-practices
excerpt: >-
  Learn how to handle errors.
tags: ["testing-best-practices", "terraform", "error"]
order: 208
nav_title: Documentation
nav_title_link: /docs/
---

Just about every method `foo` in Terratest comes in two versions: `foo` and `fooE` (e.g., `terraform.Apply` and
`terraform.ApplyE`).

- `foo`: The base method takes a `t *testing.T` as an argument. If the method hits any errors, it calls `t.Fatal` to
  fail the test.

- `fooE`: Methods that end with the capital letter `E` always return an `error` as the last argument and never call
  `t.Fatal` themselves. This allows you to decide how to handle errors.

You will use the base method name most of the time, as it allows you to keep your code more concise by avoiding
`if err != nil` checks all over the place:

```go
terraform.Init(t, terraformOptions)
terraform.Apply(t, terraformOptions)
url := terraform.Output(t, terraformOptions, "url")
```

In the code above, if `Init`, `Apply`, or `Output` hits an error, the method will call `t.Fatal` and fail the test
immediately, which is typically the behavior you want. However, if you are _expecting_ an error and don't want it to
cause a test failure, use the method name that ends with a capital `E`:

```go
if _, err := terraform.InitE(t, terraformOptions); err != nil {
  // Do something with err
}

if _, err := terraform.ApplyE(t, terraformOptions); err != nil {
  // Do something with err
}

url, err := terraform.OutputE(t, terraformOptions, "url")
if err != nil {
  // Do something with err
}
```

As you can see, the code above is more verbose, but gives you more flexibility with how to handle errors.


================================================
FILE: docs/_docs/02_testing-best-practices/idempotent.md
================================================
---
layout: collection-browser-doc
title: Idempotent
category: testing-best-practices
excerpt: >-
  Test that your Terraform configuration results in consistent deployments.
tags: ["testing-best-practices", "idempotent", "terraform"]
order: 212
nav_title: Documentation
nav_title_link: /docs/
---

A Terraform configuration is idempotent when a second apply results in 0 changes. An idempotent configuration ensures that:

1.  What you define in Terraform is exactly what is being deployed. 
1.  Detection of bugs in Terraform resources and providers that might affect your configuration.

You can use Terratest's `terraform.ApplyAndIdempotent()` function to both apply your Terraform configuration and test its
idempotency.

```go
terraform.ApplyAndIdempotent(t, terraformOptions)
```

If a second apply of your Terraform configuration results in changes then your test will fail.


================================================
FILE: docs/_docs/02_testing-best-practices/iterating-locally-using-docker.md
================================================
---
layout: collection-browser-doc
title: Iterating locally using Docker
category: testing-best-practices
excerpt: >-
  If you're writing scripts (i.e., Bash, Python, or Go), you should be able to test them locally using Docker. Docker containers typically build 10x faster and start 100x faster than real servers.
tags: ["testing-best-practices", "docker"]
order: 209
nav_title: Documentation
nav_title_link: /docs/
---

For most infrastructure code, your only option is to deploy into a real environment such as AWS. However, if you're
writing scripts (i.e., Bash, Python, or Go), you should be able to test them locally using Docker. Docker containers
typically build 10x faster and start 100x faster than real servers, so using Docker for testing can help you iterate
much faster.

Here are some techniques we use with Docker:

- If your script is used in a Packer template, add a [Docker
  builder](https://www.packer.io/docs/builders/docker.html) to the template so you can create a Docker image from the
  same code. See the [Packer Docker Example](https://github.com/gruntwork-io/terratest/tree/main/examples/packer-docker-example) for working sample code.

- We have prebuilt Docker images for major Linux distros that have many important dependencies (e.g., curl, vim,
  tar, sudo) already installed. See the [test-docker-images folder](https://github.com/gruntwork-io/terratest/tree/main/test-docker-images) for more details.

- Create a `docker-compose.yml` to make it easier to run your Docker image with all the ports, environment variables,
  and other settings it needs. See the [Packer Docker Example](https://github.com/gruntwork-io/terratest/tree/main/examples/packer-docker-example) for working sample code.

- With scripts in Docker, you can replace _some_ real-world dependencies with mocks! One way to do this is to create
  some "mock scripts" and to bind-mount them in `docker-compose.yml` in a way that replaces the real dependency. For
  example, if your script calls the `aws` CLI, you could create a mock script called `aws` that shows up earlier in the
  `PATH`. Using mocks allows you to test 100% locally, without external dependencies such as AWS.


================================================
FILE: docs/_docs/02_testing-best-practices/iterating-locally-using-test-stages.md
================================================
---
layout: collection-browser-doc
title: Iterating locally using test stages
category: testing-best-practices
excerpt: >-
  Learn more about Terratest's `test_structure`.
tags: ["testing-best-practices", "test_structure"]
order: 210
nav_title: Documentation
nav_title_link: /docs/
---

Most automated tests written with Terratest consist of multiple "stages", such as:

1.  Build an AMI using Packer
1.  Deploy the AMI using Terraform
1.  Validate that the AMI works as expected
1.  Undeploy the AMI using Terraform

Often, while testing locally, you'll want to re-run some subset of these stages over and over again: for example, you
might want to repeatedly run the validation step while you work out the kinks. Having to run _all_ of these stages
each time you change a single line of code can be very slow.

This is where Terratest's `test_structure` package comes in handy: it allows you to explicitly break up your tests into
stages and to be able to disable any one of those stages by setting an environment variable. Check out the
[terraform_packer_example_test.go](https://github.com/gruntwork-io/terratest/blob/main/test/terraform_packer_example_test.go)
for working sample code.

## How to skip stages

To skip a stage, set `SKIP_<stage_name>` to any non-empty value. For example, to re-run deploy and validation without rebuilding the AMI:

```bash
SKIP_build_ami=true go test -v -run TestTerraformPackerExample
```

This works because each stage saves its outputs (AMI IDs, Terraform options, etc.) to the working directory using functions like `SaveString` and `SaveAmiId`. Subsequent stages load this cached data using `LoadString`, `LoadAmiId`, etc. When any `SKIP_*` variable is set, Terratest also skips copying to a temp folder, preserving cached state between runs.


================================================
FILE: docs/_docs/02_testing-best-practices/namespacing.md
================================================
---
layout: collection-browser-doc
title: Namespacing
category: testing-best-practices
excerpt: >-
  Learn how to avoid conflicts due to duplicated identifiers.
tags: ["testing-best-practices", "namespace", "id", "identifiers"]
order: 203
nav_title: Documentation
nav_title_link: /docs/
---

Just about all resources your tests create (e.g., servers, load balancers, machine images) should be "namespaced" with
a unique name to ensure that:

1.  You don't accidentally overwrite any "production" resources in that environment (though as mentioned in the previous
    section, your test environment should be completely isolated from prod anyway).
1.  You don't accidentally clash with other tests running in parallel.

For example, when deploying AWS infrastructure with Terraform, that typically means exposing variables that allow you
to configure auto scaling group names, security group names, IAM role names, and any other names that must be unique.

You can use Terratest's `random.UniqueId()` function to generate identifiers that are short enough to use in resource
names (just 6 characters) but random enough to make it unlikely that you'll have a conflict.

```go
uniqueId := random.UniqueId()
instanceName := fmt.Sprintf("terratest-http-example-%s", uniqueId)

terraformOptions := &terraform.Options {
  TerraformDir: "../examples/terraform-http-example",
  Vars: map[string]interface{} {
    "instance_name": instanceName,
  },
}

terraform.Apply(t, terraformOptions)
```


================================================
FILE: docs/_docs/02_testing-best-practices/picking-instance-types.md
================================================
---
layout: collection-browser-doc
title: Picking EC2 instance types
category: testing-best-practices
excerpt: >-
  Pick EC2 instance types that are available in the current AWS region.
tags: ["testing-best-practices", "aws", "ec2"]
order: 213
nav_title: Documentation
nav_title_link: /docs/
---

It's common to want to test infrastructure code that deploys [EC2 instances](https://aws.amazon.com/ec2/) into AWS. 
There are many different [instance types](https://aws.amazon.com/ec2/instance-types/), but not all instance types
are available in all [regions or availability zones 
(AZs)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html). For example, 
`t3.micro` is sometimes available only in newer AZs, while `t2.micro` is sometimes only available in older AZs. If you
are testing code that needs to deploy a "small" instance across many regions, this can make it tricky to know which
region to pick.

To help work around this problem, Terratest includes:

1. [`GetRecommendedInstanceType`](#getrecommendedinstancetype): A Go function that helps you pick a recommended instance type.
1. [`pick-instance-type`](#pick-instance-type): A CLI tool that helps you pick a recommended instance type.




## `GetRecommendedInstanceType`

`GetRecommendedInstanceType` takes in an AWS region and a list of EC2 instance types and returns the first instance 
type in the list that is available in all Availability Zones (AZs) in the given region. If there's no
instance available in all AZs, this function exits with an error. 

Example usage:

```go
aws.GetRecommendedInstanceType(t, "eu-west-1", []string{"t2.micro", "t3.micro"})
// As of July, 2020, returns "t2.micro"

aws.GetRecommendedInstanceType(t, "ap-northeast-2", []string{"t2.micro", "t3.micro"})
// As of July, 2020, returns "t3.micro"
```   



## `pick-instance-type`

`pick-instance-type` is a CLI tool that you can download from the [Terratest releases 
page](https://github.com/gruntwork-io/terratest/releases) (click "Assets" under any release). It takes in an AWS 
region and a list of EC2 instance types and prints to `stdout` the first instance type in the list that is available in 
all Availability Zones (AZs) in the given region. If there's no instance available in all AZs, `pick-instance-type`
exits with an error.

Example usage:

```bash
# Data below is from July, 2020

$ pick-instance-type eu-west-1 t2.micro t3.micro
t2.micro

$ pick-instance-type ap-northeast-2 t2.micro t3.micro
t3.micro
```   


================================================
FILE: docs/_docs/02_testing-best-practices/testing-environment.md
================================================
---
layout: collection-browser-doc
title: Testing environment
category: testing-best-practices
excerpt: >-
  Learn more about testing environments.
tags: ["testing-best-practices"]
order: 202
nav_title: Documentation
nav_title_link: /docs/
---

Since most automated tests written with Terratest can make potentially destructive changes in your environment, we
strongly recommend running tests in an environment that is totally separate from production. For example, if you are
testing infrastructure code for AWS, you should run your tests in a completely separate AWS account.

This means that you will have to write your infrastructure code in such a way that you can plug in ([dependency
injection](https://en.wikipedia.org/wiki/Dependency_injection)) environment-specific details, such as account IDs,
domain names, IP addresses, etc. Adding support for this will typically make your code cleaner and more flexible.


================================================
FILE: docs/_docs/02_testing-best-practices/timeouts-and-logging.md
================================================
---
layout: collection-browser-doc
title: Timeouts and logging
category: testing-best-practices
excerpt: >-
  Long-running infrastructure tests may exceed timeouts or can be killed if they do not prompt logs.
tags: ["testing-best-practices", "timeout", "error"]
order: 205
nav_title: Documentation
nav_title_link: /docs/
---

Go's package testing has a default timeout of 10 minutes, after which it forcibly kills your tests—even your cleanup
code won't run! It's not uncommon for infrastructure tests to take longer than 10 minutes, so you'll almost always
want to increase the timeout by using the `-timeout` option, which takes a `go` duration string (e.g `10m` for 10
minutes or `1h` for 1 hour):

```bash
go test -timeout 30m
```

Note that many CI systems will also kill your tests if they don't see any log output for a certain period of time
(e.g., 10 minutes in CircleCI). If you use Go's `t.Log` and `t.Logf` for logging in your tests, you'll find that these
functions buffer all log output until the very end of the test (see https://github.com/golang/go/issues/24929 for more
info). If you have a long-running test, this might mean you get no log output for more than 10 minutes, and the CI
system will shut down your tests. Moreover, if your test has a bug that causes it to hang, you won't see any log output
at all to help you debug it.

Therefore, we recommend instead using Terratest's `logger.Log` and `logger.Logf` functions, which log to `stdout`
immediately:

```go
func TestFoo(t *testing.T) {
  logger.Log(t, "This will show up in stdout immediately")
}
```

Finally, if you're testing multiple Go packages, be aware that Go will buffer log output—even that sent directly to
`stdout` by `logger.Log` and `logger.Logf`—until all the tests in the package are done. This leads to the same
difficulties with CI servers and debugging. The workaround is to tell Go to test each package sequentially using the
`-p 1` flag:

```bash
go test -timeout 30m -p 1 ./...
```

See the [Cleanup]({{site.baseurl}}/docs/testing-best-practices/cleanup/) for more information on how to setup robust clean up procedures in the face of test timeouts and instabilities.


================================================
FILE: docs/_docs/02_testing-best-practices/tools-and-plugins.md
================================================
---
layout: collection-browser-doc
title: Tools and Plugins
category: testing-best-practices
excerpt: >-
  Additional tools and plugins for terratest to make integration with existing workflows easier.
tags: ["testing-best-practices", "alternatives","plugins","tooling"]
order: 214
nav_title: Documentation
nav_title_link: /docs/
---

## Tools and Plugins

This page contains a list of tools and plugins for Terratest to make integration with existing workflows easier. If you've created other tools that integrate with Terratest, a PR to add it to this list is very welcome!

- [Tools and Plugins](#tools-and-plugins)
  - [Terratest Maven Plugin](#terratest-maven-plugin)

### Terratest Maven Plugin

The Terratest Maven Plugin aims to bring Terratest to the JVM world. Create your Go based tests beside your Java code with Maven and run them together. You can export the results into Json or an HTML page. As the plugin is MIT licensed, it is easy and painless to integrate into any Java+Maven combination. To learn more check out the website: [Terratest Maven Plugin](https://terratest-maven-plugin.github.io) and the [GitHub repository](https://github.com/terratest-maven-plugin/terratest-maven-plugin)


================================================
FILE: docs/_docs/02_testing-best-practices/unit-integration-end-to-end-test.md
================================================
---
layout: collection-browser-doc
title: Unit tests, integration tests, end-to-end tests
category: testing-best-practices
excerpt: >-
  See the talk about unit tests, integration tests, end-to-end tests, dependency injection, test parallelism, retries, error handling, and static analysis.
tags: ["testing-best-practices"]
order: 201
nav_title: Documentation
nav_title_link: /docs/
---


For an introduction to Terratest, including unit tests, integration tests, end-to-end tests, dependency injection, test
parallelism, retries, error handling, and static analysis, see the talk "Automated Testing for Terraform, Docker,
Packer, Kubernetes, and More".

<iframe width="100%" height="450" allowfullscreen src="https://www.youtube.com/embed/xhHOW0EF5u8"></iframe>

Link to the video at [infoq.com](https://www.infoq.com/presentations/automated-testing-terraform-docker-packer/).

## Slides

Slides to the video can be found here: [Slides: How to test infrastructure code](https://www.slideshare.net/brikis98/how-to-test-infrastructure-code-automated-testing-for-terraform-kubernetes-docker-packer-and-more){:target="_blank"}.


================================================
FILE: docs/_docs/04_community/contributing.md
================================================
---
layout: collection-browser-doc
title: Contributing
category: community
excerpt: >-
  Terratest is an open source project, and contributions from the community are very welcome!
tags: ["contributing", "community"]
order: 400
nav_title: Documentation
nav_title_link: /docs/
custom_js:
  - examples
  - prism
  - collection-browser_scroll
  - collection-browser_search
  - collection-browser_toc
---

Terratest is an open source project, and contributions from the community are very welcome\! Please check out the
[Contribution Guidelines](#contribution-guidelines) and [Developing Terratest](#developing-terratest) for
instructions.

## Contribution Guidelines

Contributions to this repo are very welcome! We follow a fairly standard [pull request
process](https://help.github.com/articles/about-pull-requests/) for contributions, subject to the following guidelines:

1. [Types of contributions](#types-of-contributions)
1. [File a GitHub issue](#file-a-github-issue)
1. [Update the documentation](#update-the-documentation)
1. [Update the tests](#update-the-tests)
1. [Update the code](#update-the-code)
1. [Create a pull request](#create-a-pull-request)
1. [Merge and release](#merge-and-release)

### Types of contributions

Broadly speaking, Terratest contains two types of helper functions:

1. Integrations with external tools
1. Infrastructure and validation helpers

We accept different types of contributions for each of these two types of helper functions, as described next.

#### Integrations with external tools

These are helper functions that integrate with various DevOps tools—e.g., Terraform, Docker, Packer, and
Kubernetes—that you can use to deploy infrastructure in your automated tests. Examples:

* `terraform.InitAndApply`: run `terraform init` and `terraform apply`.
* `packer.BuildArtifacts`: run `packer build`.
* `shell.RunCommandAndGetOutput`: run an arbitrary shell command and return `stdout` and `stderr` as a string.

Here are the guidelines for contributions with external tools:

1. **Fixes and improvements to existing integrations**: All bug fixes and new features for existing tool integrations
   are very welcome!  

1. **New integrations**: Before contributing an integration with a totally new tool, please file a GitHub issue to
   discuss with us if it's something we are interested in supporting and maintaining. For example, we may be open to
   new integrations with Docker and Kubernetes tools, but we may not be open to integrations with Chef or Puppet, as
   there are already testing tools available for them.

#### Infrastructure and validation helpers

These are helper functions for creating, destroying, and validating infrastructure directly via API calls or SDKs.
Examples:

* `http_helper.HttpGetWithRetry`: make an HTTP request, retrying until you get a certain expected response.
* `ssh.CheckSshCommand`: SSH to a server and execute a command.
* `aws.CreateS3Bucket`: create an S3 bucket.
* `aws.GetPrivateIpsOfEc2Instances`:  use the AWS APIs to fetch IPs of some EC2 instances.

The number of possible such helpers is nearly infinite, so to avoid Terratest becoming a gigantic, sprawling library
we ask that contributions for new infrastructure helpers are limited to:

1. **Platforms**: we currently only support three major public clouds (AWS, GCP, Azure) and Kubernetes. There is some
   code contributed earlier for other platforms (e.g., OCI), but until we have the time/resources to support those
   platforms fully, we will only accept contributions for the major public clouds and Kubernetes.

1. **Complexity**: we ask that you only contribute infrastructure and validation helpers for code that is relatively
   complex to do from scratch. For example, a helper that merely wraps an existing function in the AWS or GCP SDK is
   not a great choice, as the wrapper isn't contributing much value, but is bloating the Terratest API. On the other
   hand, helpers that expose simple APIs for complex logic are great contributions: `ssh.CheckSshCommand` is a great
   example of this, as it provides a simple one-line interface for dozens of lines of complicated SSH logic.

1. **Popularity**: Terratest should only contain helpers for common use cases that come up again and again in the
   course of testing. We don't want to bloat the library with lots of esoteric helpers for rarely used tools, so
   here's a quick litmus test: (a) Is this helper something you've used once or twice in your own tests, or is it
   something you're using over and over again? (b) Does this helper only apply to some use case specific to your
   company or is it likely that many other Terratest users are hitting this use case over and over again too?

1. **Creating infrastructure**: we try to keep helper functions that create infrastructure (e.g., use the AWS SDK to
   create an S3 bucket or EC2 instance) to a minimum, as those functions typically require maintaining state (so that
   they are idempotent and can clean up that infrastructure at the end of the test) and dealing with asynchronous and
   eventually consistent cloud APIs. This can be surprisingly complicated, so we typically recommend using a tool like
   Terraform, which already handles all that complexity, to create any infrastructure you need at test time, and
   running Terratest's built-in `terraform` helpers as necessary. If you're considering contributing a function that
   creates infrastructure directly (e.g., using a cloud provider's APIs), please file a GitHub issue to explain why
   such a function would be a better choice than using a tool like Terraform.

### File a GitHub issue

Before starting any work, we recommend filing a GitHub issue in this repo. This is your chance to ask questions and
get feedback from the maintainers and the community before you sink a lot of time into writing (possibly the wrong)
code. If there is anything you're unsure about, just ask!

### Update the documentation

We recommend updating the documentation *before* updating any code (see [Readme Driven
Development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html)). This ensures the documentation
stays up to date and allows you to think through the problem at a high level before you get lost in the weeds of
coding.

The documentation is built with Jekyll and hosted on the Github Pages from `docs` folder on `main` branch. Check out [Terratest website](https://github.com/gruntwork-io/terratest/tree/main/docs#working-with-the-documentation) to learn more about working with the documentation.

### Update the tests

We also recommend updating the automated tests *before* updating any code (see [Test Driven
Development](https://en.wikipedia.org/wiki/Test-driven_development)). That means you add or update a test case,
verify that it's failing with a clear error message, and *then* make the code changes to get that test to pass. This
ensures the tests stay up to date and verify all the functionality in this Module, including whatever new
functionality you're adding in your contribution. The instructions for running the automated tests can be
found [here](https://terratest.gruntwork.io/docs/community/contributing/#developing-terratest).

### Update the code

At this point, make your code changes and use your new test case to verify that everything is working. As you work,
please make every effort to avoid unnecessary backwards incompatible changes. This generally means that you should
not delete or rename anything in a public API.

If a backwards incompatible change cannot be avoided, please make sure to call that out when you submit a pull request,
explaining why the change is absolutely necessary.

Note that we use pre-commit hooks with this project. To ensure they run:

1. Install [pre-commit](https://pre-commit.com/).
1. Run `pre-commit install`.

One of the pre-commit hooks we run is [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports). To prevent the
hook from failing, make sure to :

1. Install [goimports](https://godoc.org/golang.org/x/tools/cmd/goimports)
1. Run `goimports -w .`.

We have a [style guide](https://gruntwork.io/guides/style%20guides/golang-style-guide/) for the Go programming language,
in which we documented some best practices for writing Go code. Please ensure your code adheres to the guidelines
outlined in the guide.

### Create a pull request

[Create a pull request](https://help.github.com/articles/creating-a-pull-request/) with your changes. Please make sure
to include the following:

1. A description of the change, including a link to your GitHub issue.
1. The output of your automated test run, preferably in a [GitHub Gist](https://gist.github.com/). We cannot run
   automated tests for pull requests automatically due to [security
   concerns](https://circleci.com/docs/2.0/oss/#security), so we need you to manually provide this
   test output so we can verify that everything is working.
1. Any notes on backwards incompatibility or downtime.

#### Validate the Pull Request for Azure Platform

If you're contributing code for the [Azure Platform](https://azure.com) and if you have an active _Azure subscription_, it's recommended to follow the below guidelines after [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). If you're contributing code for any other platform (e.g., AWS, GCP, etc), you can skip these steps.

> Once the Terratest maintainers add `Azure` tag and _Approve_ the PR, following pipeline will run automatically to perform a full validation of the Azure contribution. You also can run the pipeline manually on your forked repo by following the below guideline.


We have a separate CI pipeline for _Azure_ code. To run it on a forked repo:

1. Run the following [Azure Cli](https://docs.microsoft.com/cli/azure/) command on your preferred Terminal to create Azure credentials and copy the output:

    ```bash
    az ad sp create-for-rbac --name "terratest-az-cli" --role contributor --sdk-auth
    ```

1. Go to Secrets settings page under `Settings` tab in your forked project, `https://github.com/<YOUR_GITHUB_ACCOUNT>/terratest/settings`, on GitHub.

1. Create a new `Secret` named `AZURE_CREDENTIALS` and paste the Azure credentials you copied from the 1<sup>st</sup> step as the value

    > `AZURE_CREDENTIALS` will be stored in _your_ GitHub account; neither the Terratest maintainers nor anyone else will have any access to it. Under the hood, GitHub stores your secrets in a secure, encrypted format (see: [GitHub Actions Secrets Reference](https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets) for more information). Once the secret is created, it's only possible to update or delete it; the value of the secret can't be viewed. GitHub uses a [libsodium sealed box](https://libsodium.gitbook.io/doc/public-key_cryptography/sealed_boxes) to help ensure that secrets are encrypted before they reach GitHub.

1. Create a [new Personal Access Token (PAT)](https://github.com/settings/tokens/new) page under [Settings](https://github.com/settings/profile) / [Developer Settings](https://github.com/settings/apps), making sure `write:discussion` and `public_repo` scopes are checked. Click the _Generate token_ button and copy the generated PAT.

1. Go back to settings/secrets in your fork and [Create a new Secret](https://docs.github.com/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository) named `PAT`.  Paste the output from the 4<sup>th</sup> step as the value

    > `PAT` will be stored in _your_ GitHub account; neither the Terratest maintainers nor anyone else will have any access to it. Under the hood, GitHub stores your secrets in a secure, encrypted format (see: [GitHub Actions Secrets Reference](https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets) for more information). Once the secret is created, it's only possible to update or delete it; the value of the secret can't be viewed. GitHub uses a [libsodium sealed box](https://libsodium.gitbook.io/doc/public-key_cryptography/sealed_boxes) to help ensure that secrets are encrypted before they reach GitHub.

1. Go to Actions tab on GitHub (https://github.com/<GITHUB_ACCOUNT>/terratest/actions)

1. Click `ci-workflow` workflow

1. Click `Run workflow` button and fill the fields in the drop down
    * _Repository Info_ : name of the forked repo (_e.g. xyz/terratest_)
    * _Name of the branch_ : branch name on the forked repo (_e.g. feature/adding-some-important-module_)
    * _Name of the official terratest repo_ : home of the target pr (_gruntwork-io/terratest_)
    * PR number on the official terratest repo : pr number on the official terratest repo (_e.g. 14, 25, etc._).  Setting this value will leave a success/failure comment in the PR once CI completes execution.

    * Skip provider registration : set true if you want to skip terraform provider registration for debug purposes (_false_ or _true_)

1. Wait for the `ci-workflow` to be finished

    > The pipeline will use the given Azure subscription and deploy real resources in your Azure account as part of running the test. When the tests finish, they will tear down the resources they created. Of course, if there is a bug or glitch that prevents the clean up code from running, some resources may be left behind, but this is rare. Note that these resources may cost you money! You are responsible for all charges in your Azure subscription.

1. PR with the given _PR Number_ will have the result of the `ci-workflow` as a comment

### Merge and release

The maintainers for this repo will review your code and provide feedback. Once the PR is accepted, they will merge the
code and release a new version, which you'll be able to find in the [releases page](https://github.com/gruntwork-io/terratest/releases).

## Developing Terratest

1. [Running tests](#running-tests)
1. [Versioning](#versioning)
1. [Developing For Azure](#developing-for-azure)

### Running tests

Terratest itself includes a number of automated tests.

**Note #1**: Some of these tests create real resources in an AWS account. That means they cost money to run, especially
if you don't clean up after yourself. Please be considerate of the resources you create and take extra care to clean
everything up when you're done!

**Note #2**: In order to run tests that access your AWS account, you will need to configure your [AWS CLI
credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html). For example, you could
set the credentials as the environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`.

**Note #3**: Never hit `CTRL + C` or cancel a build once tests are running or the cleanup tasks won't run!

**Prerequisite**: The tests expect Terraform, Terragrunt, Packer, and/or Docker to already be installed and in your `PATH`.

To run all the tests:

```bash
go test -v -timeout 30m -p 1 ./...
```

To run the tests in a specific folder:

```bash
cd "<FOLDER_PATH>"
go test -timeout 30m
```

To run a specific test in a specific folder:

```bash
cd "<FOLDER_PATH>"
go test -timeout 30m -run "<TEST_NAME>"
```

### Versioning

This repo follows the principles of [Semantic Versioning](http://semver.org/). You can find each new release,
along with the changelog, in the [Releases Page](https://github.com/gruntwork-io/terratest/releases).

During initial development, the major version will be 0 (e.g., `0.x.y`), which indicates the code does not yet have a
stable API. Once we hit `1.0.0`, we will make every effort to maintain a backwards compatible API and use the MAJOR,
MINOR, and PATCH versions on each release to indicate any incompatibilities.

### Developing For Azure

Azure supports multliple cloud environments. In order to properly register the correct environment for you test code, you need to use the Azure SDK Client Factory.

#### Azure SDK Client Factory

This documentation provides and overview of the `client_factory.go` module, targeted use cases, and behaviors.  This module is intended to provide support for and simplify working with Azure's multiple cloud environments (Azure Public, Azure Government, Azure China, Azure Germany and Azure Stack).  Developers looking to contribute to additional support for Azure to Terratest should leverage client_factory and use the patterns below to add a resource REST client from Azure Go SDK.  By doing so, it provides a consistent means for developers using Terratest to test their Azure Infrastructure to connect to the correct cloud and its associated REST apis.

##### Background

The Azure REST APIs support both Public and sovereign cloud environments (at the moment this includes Public, US Government, Germany, China, and Azure Stack environments).  If you are interacting with an environment other than public cloud, you need to set the base URI for the Azure REST API you are interacting with.

###### Base URI

You must use the correct base URI's for the Azure REST API's (either directly or via Azure SDK for GO) to communicate with a cloud environment other than Azure Public. The Azure Go SDK supports this by using the `WithBaseURI` suffixed calls when creating service clients. For example, when using the `VirtualMachinesClient` with the public cloud, a developer would normally write code for the public cloud like so:

```go
import (
    "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
)

func SomeVMHelperMethod() {
    subscriptionID := "your subscription ID"

    // Create a VM client and return
    vmClient, err := compute.NewVirtualMachinesClient(subscriptionID)

    // Use client / etc
}
```

However, this code will not work in non-Public cloud environments as the REST endpoints have different URIs depending on environment.  Instead, you need to use an alternative method (provided in the Azure REST SDK for Go) to get a properly configured client (*all REST API clients should support this alternate method*):

```go
import (
    "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute"
)

func SomeVMHelperMethod() {
    subscriptionID := "your subscription ID"
    baseURI := "management.azure.com"

    // Create a VM client and return
    vmClient, err := compute.NewVirtualMachinesClientWithBaseURI(baseURI, subscriptionID)

    // Use client / etc
}
```

Using code similar to above, you can communicate with any Azure cloud environment just by changing the base URI that is passed to the clients (Azure Public shown in above example).

##### Lookup Environment Metadata

Developers MUST avoid hardcoding these base URI's.  Instead, they should be looked up from an authoritative source. The AutoRest-GO library (used by the Go SDK) provides such functionality. The `client_factory` module makes use of the AutoRest `EnvironmentFromName(envName string)` function to return the appropriate structure.  This method and Environment structure is documented on GoDoc [here](https://godoc.org/github.com/Azure/go-autorest/autorest/azure#EnvironmentFromName).

To configure different cloud environments, we will use the same `AZURE_ENVIRONMENT` environment variable that the Go SDK uses. This can currently be set to one of the following values:

|Value                      |Cloud Environment  |
|---------------------------|-------------------|
|"AzureChinaCloud"          |ChinaCloud         |
|"AzureGermanCloud"         |GermanCloud        |
|"AzurePublicCloud"         |PublicCloud        |
|"AzureUSGovernmentCloud"   |USGovernmentCloud  |
|"AzureStackCloud"          |Azure stack        |

When using the "AzureStackCloud" setting, you MUST also set the `AZURE_ENVIRONMENT_FILEPATH` variable to point to a JSON file containing your Azure Stack URI details.

##### Putting it all together

 `client_factory` implements this pattern described above in order to instantiate and return properly configured *REST SDK for GO* clients so that test implementers don't have to consider REST API client implementation as long as they have the correct `AZURE_ENVIRONMENT` env setting.  If this environment variable is not set, the client will assume public cloud as the cloud environment to communicate with.  We strongly recommend developers creating Terratest helper methods for Azure use this pattern with client factory to create REST API clients.  This will reduce effort for Terratest users creating test for Azure resources.

Note the following:

* TERRAFORM uses [ARM_ENVIRONMENT](https://www.terraform.io/docs/backends/types/azurerm.html#environment) environment variable to set the correct cloud environment.  
* The default behavior of the `client_factory` is to use the AzurePublicCloud environment. This requires no work from the developer to configure, and ensures consistent behavior with the current SDK code.

###### Wait, I don't see the client in client factory for the rest api I want to interact with

 If you require a client that is not already implemented in client factory for your helper method, you will need to create a corresponding method that instantiates the client and accepts base URI following the patterns discussed.  Below is a walkthrough for adding a client to client factory.

##### Walkthrough, adding a client to client_factory

###### Add your client namespace to client factory

In the Azure SDK for GO, each service should have a module that implements that services client.  You can find the correct module [here](https://godoc.org/github.com/Azure/azure-sdk-for-go).  Add that module to the client factory imports.  Below is an example for client imports that shows clients for compute, container service and subscriptions.

{% include examples/explorer.html example_id='client-factory' file_id='client_factory_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true snippet_id='client_factory_example.imports' %}

###### Add your client method to instantiate the client

The next step is to add your method to instantiate the client.  Below is an example of adding the method to create a client for Virtual Machines, note that we lookup the environment using `getEnvironmentEndpointE` and then pass that base URI to the actual method on the Virtual Machines Module to create the client `NewVirtualMachinesClientWithBaseURI`.

{% include examples/explorer.html example_id='client-factory' file_id='client_factory_code' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true snippet_id='client_factory_example.CreateClient' %}

###### Add a unit test to client_factory_test.go

In order to ensure that your CreateClient method works properly, add a unit test to `client_factory_test.go`.  The unit test MUST assert that the base URI is correctly set for your client.  Some key points for writing your unit test are:

- Use table-driven testing to test the various combinations of cloud environments
- Give the test case a descriptive name so it is easy to identify which test failed.
- PRs will be rejected if a client is added without a corresponding unit test.

Below is an example of the Virtual Machines client unit test:

{% include examples/explorer.html example_id='client-factory' file_id='client_factory_test' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true snippet_id='client_factory_example.UnitTest' %}

###### Use your CreateClient method in your helper

We now can use this client creation method in our helpers to create a Virtual Machines client.  Below is an example for how to call into this create method from `client_factory`:

{% include examples/explorer.html example_id='client-factory' file_id='client_factory_helper' class='wide quick-start-examples' skip_learn_more=true skip_view_on_github=true skip_tags=true snippet_id='client_factory_example.helper' %}


================================================
FILE: docs/_docs/04_community/license.md
================================================
---
layout: collection-browser-doc
title: License
category: community
excerpt: >-
  This code is released under the Apache 2.0 License. Read more here.
tags: ["license"]
order: 402
nav_title: Documentation
nav_title_link: /docs/
---

## License

This code is released under the Apache 2.0 License. See [LICENSE](https://github.com/gruntwork-io/terratest/blob/main/LICENSE){:target="_blank"} and [NOTICE](https://github.com/gruntwork-io/terratest/blob/main/NOTICE){:target="_blank"} for more details.


================================================
FILE: docs/_docs/04_community/support.md
================================================
---
layout: collection-browser-doc
title: Support
category: community
excerpt: >-
  Need help?
tags: ["support", "community"]
order: 401
nav_title: Documentation
nav_title_link: /docs/
---

## Github Discussions

Search our [Knowledge Base](https://github.com/gruntwork-io/knowledge-base/discussions) to find existing questions or ask your own. Github Discussions is a good place for general discussions and questions.

## Github Issues

Read through [existing issues](https://github.com/gruntwork-io/terratest/issues) or post a new one. Github issues is a good place to:

- report a bug,

- ask for a help,

- ask for improvements,

- to start contributing by solving simple issues.

## Commercial support

Does your company rely on Terratest in production? If so, you can get commercial support directly from Gruntwork, the creators of Terratest! Check out the [Gruntwork Support Page](https://gruntwork.io/support) for more details.


================================================
FILE: docs/_includes/built-by.html
================================================
<div class="built-by-cmp box-component">
  <div class="box shadow">
    <h2>Built by <strong>Gruntwork</strong></h2>
    <p class="subtitle">Your entire infrastructure. Defined as code. In about a day.</p>
    <a href="https://gruntwork.io/" target="_blank" class="btn btn-primary btn-lg">Explore Gruntwork.io</a>
  </div>
</div>


================================================
FILE: docs/_includes/canonical-url.html
================================================
{% if include.url %}{% assign url = include.url %}{% else %}{% assign url = page.url %}{% endif %}{{ site.url | replace:'www.','' }}{{site.baseurl}}{{ url | replace:'index.html','' }}


================================================
FILE: docs/_includes/collection_browser/_cta-section.html
================================================
{% include links-n-built-by.html %}


================================================
FILE: docs/_includes/collection_browser/_doc-header.html
================================================
<div class="cb-doc-header">
  <ol class="breadcrumb text-center">
    {% assign crumbs = page.url | split: '/' %}
    <a href="{{site.baseurl}}/{{ page.collection }}" ga-on="click" ga-event-category="{{ page.collection }}-{{ page.title | slugify }}" ga-event-action="{{ page.collection }}-main-index">{{ page.collection | capitalize }}</a>
    {% for crumb in crumbs offset: 2 %}
      {% if forloop.last %}
        <a href="#"> / <span> {{ page.title | replace: '-',' ' | replace: '%20', ' ' }}</span></a>
      {% else %}
        <a href="{{ site.baseurl }}/{{ page.collection }}#{{ crumb | replace: '%20', '-' }}" ga-on="click" ga-event-category="{{ page.collection }}-{{ page.title | slugify }}" ga-event-action="{{ page.collection }}-breadcrumb-{{ crumb }}">/ <span>{{ crumb | replace:'-',' ' | replace: '%20', ' ' | capitalize }}</span></a>
      {% endif %}
    {% endfor %}
  </ol>
  <div class="cb-doc-title text-center">
    {% if page.image %}
      <img class="img-center cb-doc-title-image" src="{{ site.baseurl }}{{ page.image }}" alt="post logo">
    {% endif %}
    <h1>{{ page.title }}</h1>
    {% if page.tags %}
      {% for tag in page.tags %}
        <span class="badge badge-pill badge-default">
          {% capture tag-name %}{{tag | upcase }}{% endcapture %}
          {{tag-name | capitalize}}
        </span>
      {% endfor %}
    {% endif %}
  </div>
</div>


================================================
FILE: docs/_includes/collection_browser/_doc-page.html
================================================
<div class="cb-doc-detail">
  <div class="container-fluid">
    <div class="row">
      <div class="col-xs-12">
        {% include collection_browser/_doc-header.html %}
      </div>
    </div>
  </div>
  <div class="container-cb-lg">
    <div class="row equal">
      {% assign data_scroll_after_selector = '.cb-doc-header' %}
      {% assign data_scroll_until_selector = '.cb-doc-detail' %}
      {% include collection_browser/_sidebar.html data_scroll_until_selector=data_scroll_until_selector data_scroll_after_selector=data_scroll_after_selector %}
      <div class="col-xs-12 col-md-7 col-lg-9 cb-section-white">
        <div class="cb-doc-content js-scroll-spy" data-scroll-spy-nav-selector="#toc">
            {{ content }}
        </div>
      </div>
    </div>
  </div>
</div>


================================================
FILE: docs/_includes/collection_browser/_doc-thumb.html
================================================
{% assign cb_doc_card_class = '' %}

{% if doc.index_list !=nil and doc.index_list.no_hover_enlarge_effect == true %}
  {% assign cb_doc_card_class = 'no-hover-enlarge' %}
{% endif %}

<div
  class="cb-doc-card card-shadow {{ cb_doc_card_class }}"
  id="{{ doc.title | slugify | downcase | split: ' ' | join: '-' | append: '-card' }}"
  >
  <div class="card" ga-on="click" ga-event-category="cb-doc-{{ doc.title | slugify }}" ga-event-action="cb-doc-click">
    <div class="row no-padding">

      {% if doc.image %}
        {% if doc.index_list !=nil and doc.index_list.read_more_btn == true %}
          <a href="{{ site.baseurl }}{{ doc.url }}" class="read-more-btn btn btn-primary">Read more</a>
        {% endif %}
        {% unless doc.index_list !=nil and doc.index_list.disable_card_link == true %}
          <a href="{{ site.baseurl }}{{ doc.url }}">
        {% endunless %}
          <div class="col-xs-2 img-inner no-padding">
            <img src="{{ site.baseurl }}{{ doc.image }}" alt="card image" class="img-center">
          </div>
          <div class="col-xs-10 card-body cb-doc-card-description float-right">
            {% if doc.index_list !=nil and doc.index_list.disable_card_link == true %}
              <a href="{{ site.baseurl }}{{ doc.url }}" class="card-title__link">
                <h5 class="card-title"><b>{{ doc.title }}</b></h5>
              </a>
            {% else %}
              <h5 class="card-title"><b>{{ doc.title }}</b></h5>
            {% endif %}
            {% include collection_browser/_doc-thumb__excerpt.html doc=doc %}
          </div>
        {% unless doc.index_list !=nil and doc.index_list.disable_card_link == true %}
          </a>
        {% endunless %}
      {% else %}
        {% if doc.index_list !=nil and doc.index_list.read_more_btn == true %}
          <a href="{{ site.baseurl }}{{ doc.url }}" class="read-more-btn btn btn-primary">Read more</a>
        {% endif %}
        {% unless doc.index_list !=nil and doc.index_list.disable_card_link == true %}
          <a href="{{ site.baseurl }}{{ doc.url }}">
        {% endunless %}
          <div class="col-xs-12 card-body cb-doc-card-description float-right">
            {% if doc.index_list !=nil and doc.index_list.disable_card_link == true %}
              <a href="{{ site.baseurl }}{{ doc.url }}" class="card-title__link">
                <h5 class="card-title"><b>{{ doc.title }}</b></h5>
              </a>
            {% else %}
              <h5 class="card-title"><b>{{ doc.title }}</b></h5>
            {% endif %}
            {% include collection_browser/_doc-thumb__excerpt.html doc=doc %}
          </div>
        {% unless doc.index_list !=nil and doc.index_list.disable_card_link == true %}
          </a>
        {% endunless %}
      {% endif %}
    </div>
  </div>
</div>


================================================
FILE: docs/_includes/collection_browser/_doc-thumb__excerpt.html
================================================
{% if doc.excerpt_md %}
  {{ doc.excerpt_md | markdownify }}
{% elsif doc.excerpt_html %}
  {{ doc.excerpt_html }}
{% else %}
  <p class="card-text">{{ doc.excerpt | strip_html }}</p>
{% endif %}


================================================
FILE: docs/_includes/collection_browser/_docs-list.html
================================================
<di
Download .txt
gitextract_g6sf3yo0/

├── .circleci/
│   └── config.yml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── no-response.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── ci.yml
│       ├── lint.yml
│       └── update-lint-config.yml
├── .gitignore
├── .golangci.yml
├── .pre-commit-config.yaml
├── CODEOWNERS
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── REFACTOR.md
├── SECURITY.md
├── cmd/
│   ├── pick-instance-type/
│   │   └── main.go
│   └── terratest_log_parser/
│       └── main.go
├── docs/
│   ├── .gitignore
│   ├── CNAME
│   ├── Dockerfile
│   ├── Gemfile
│   ├── README.md
│   ├── _config.yml
│   ├── _data/
│   │   ├── examples.yml
│   │   └── prism_extends.yml
│   ├── _docs/
│   │   ├── 01_getting-started/
│   │   │   ├── examples.md
│   │   │   ├── godoc.md
│   │   │   ├── introduction.md
│   │   │   ├── packages-overview.md
│   │   │   ├── quick-start.md
│   │   │   └── testing-terragrunt.md
│   │   ├── 02_testing-best-practices/
│   │   │   ├── alternative-testing-tools.md
│   │   │   ├── avoid-test-caching.md
│   │   │   ├── cleanup.md
│   │   │   ├── debugging-interleaved-test-output.md
│   │   │   ├── error-handling.md
│   │   │   ├── idempotent.md
│   │   │   ├── iterating-locally-using-docker.md
│   │   │   ├── iterating-locally-using-test-stages.md
│   │   │   ├── namespacing.md
│   │   │   ├── picking-instance-types.md
│   │   │   ├── testing-environment.md
│   │   │   ├── timeouts-and-logging.md
│   │   │   ├── tools-and-plugins.md
│   │   │   └── unit-integration-end-to-end-test.md
│   │   └── 04_community/
│   │       ├── contributing.md
│   │       ├── license.md
│   │       └── support.md
│   ├── _includes/
│   │   ├── built-by.html
│   │   ├── canonical-url.html
│   │   ├── collection_browser/
│   │   │   ├── _cta-section.html
│   │   │   ├── _doc-header.html
│   │   │   ├── _doc-page.html
│   │   │   ├── _doc-thumb.html
│   │   │   ├── _doc-thumb__excerpt.html
│   │   │   ├── _docs-list.html
│   │   │   ├── _no-search-results.html
│   │   │   ├── _search.html
│   │   │   ├── _sidebar.html
│   │   │   ├── browser.html
│   │   │   └── navigation/
│   │   │       └── _collection_toc.html
│   │   ├── examples/
│   │   │   ├── example.html
│   │   │   └── explorer.html
│   │   ├── favicon.html
│   │   ├── footer.html
│   │   ├── get-access.html
│   │   ├── head.html
│   │   ├── header-min.html
│   │   ├── header.html
│   │   ├── links-n-built-by.html
│   │   ├── links-n-get-access.html
│   │   ├── links-section.html
│   │   ├── logo.html
│   │   ├── navbar.html
│   │   ├── scripts.html
│   │   ├── share-meta.html
│   │   ├── styles.html
│   │   ├── switch.html
│   │   └── video-player.html
│   ├── _layouts/
│   │   ├── collection-browser-doc.html
│   │   ├── collection-browser.html
│   │   ├── contact.html
│   │   ├── default.html
│   │   ├── post.html
│   │   └── subpage.html
│   ├── _pages/
│   │   ├── 404/
│   │   │   └── 404.md
│   │   ├── commercial-support/
│   │   │   └── index.html
│   │   ├── contact/
│   │   │   ├── _contact-form.html
│   │   │   └── index.html
│   │   ├── cookie-policy/
│   │   │   └── index.md
│   │   ├── docs/
│   │   │   └── index.html
│   │   ├── examples/
│   │   │   └── index.html
│   │   ├── index/
│   │   │   ├── _built_by.html
│   │   │   ├── _cta_section.html
│   │   │   ├── _header.html
│   │   │   ├── _terratest-in-4-steps.html
│   │   │   ├── _test-with-terratest.html
│   │   │   ├── _watch.html
│   │   │   └── index.html
│   │   └── thanks/
│   │       └── index.html
│   ├── _posts/
│   │   └── .keep
│   ├── assets/
│   │   ├── css/
│   │   │   ├── _variables.scss
│   │   │   ├── bootstrap/
│   │   │   │   └── scss/
│   │   │   │       └── bootstrap.scss
│   │   │   ├── collection_browser.scss
│   │   │   ├── components.scss
│   │   │   ├── examples.scss
│   │   │   ├── global.scss
│   │   │   ├── pages/
│   │   │   │   ├── contact.scss
│   │   │   │   ├── cookie-policy.scss
│   │   │   │   ├── home.scss
│   │   │   │   └── support.scss
│   │   │   ├── prism.css
│   │   │   ├── prism_custom.scss
│   │   │   ├── styles.scss
│   │   │   ├── subpage.scss
│   │   │   └── utilities.scss
│   │   ├── img/
│   │   │   └── favicon/
│   │   │       ├── browserconfig.xml
│   │   │       └── manifest.json
│   │   └── js/
│   │       ├── collection-browser_scroll.js
│   │       ├── collection-browser_search.js
│   │       ├── collection-browser_toc.js
│   │       ├── contact-form.js
│   │       ├── cookie.js
│   │       ├── examples.js
│   │       ├── main.js
│   │       ├── prism.js
│   │       └── video-player.js
│   ├── docker-compose.yml
│   ├── jekyll-serve.sh
│   └── scripts/
│       ├── convert_adoc_to_md.sh
│       └── convert_md_to_adoc.sh
├── examples/
│   ├── azure/
│   │   ├── README.md
│   │   ├── terraform-azure-aci-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-acr-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-actiongroup-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-aks-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── nginx-deployment.yml
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-availabilityset-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-container-apps-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-cosmosdb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-datafactory-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-disk-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-frontdoor-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-functionapp-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-keyvault-example/
│   │   │   ├── README.md
│   │   │   ├── example.pfx
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-loadbalancer-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-loganalytics-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-monitor-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-mysqldb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-network-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-nsg-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-postgresql-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-recoveryservices-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-resourcegroup-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-servicebus-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-sqldb-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-sqlmanagedinstance-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-storage-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   ├── terraform-azure-synapse-example/
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── variables.tf
│   │   └── terraform-azure-vm-example/
│   │       ├── README.md
│   │       ├── main.tf
│   │       ├── outputs.tf
│   │       └── variables.tf
│   ├── docker-compose-stdout-example/
│   │   ├── Dockerfile
│   │   ├── bash_script.sh
│   │   └── docker-compose.yml
│   ├── docker-hello-world-example/
│   │   ├── Dockerfile
│   │   └── README.md
│   ├── helm-basic-example/
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── values.yaml
│   ├── helm-dependency-example/
│   │   ├── .gitignore
│   │   ├── Chart.yaml
│   │   ├── README.md
│   │   ├── templates/
│   │   │   ├── _helpers.tpl
│   │   │   ├── deployment.yaml
│   │   │   └── service.yaml
│   │   └── values.yaml
│   ├── kubernetes-basic-example/
│   │   ├── README.md
│   │   ├── nginx-deployment.yml
│   │   └── podinfo-daemonset.yml
│   ├── kubernetes-hello-world-example/
│   │   ├── README.md
│   │   └── hello-world-deployment.yml
│   ├── kubernetes-kustomize-example/
│   │   ├── README.md
│   │   ├── deployment.yaml
│   │   ├── kustomization.yaml
│   │   └── service.yaml
│   ├── kubernetes-rbac-example/
│   │   ├── README.md
│   │   └── namespace-service-account.yml
│   ├── packer-basic-example/
│   │   ├── README.md
│   │   ├── build-gcp.pkr.hcl
│   │   └── build.pkr.hcl
│   ├── packer-docker-example/
│   │   ├── README.md
│   │   ├── app.rb
│   │   ├── build.json
│   │   ├── build.pkr.hcl
│   │   ├── configure-sinatra-app.sh
│   │   └── docker-compose.yml
│   ├── packer-hello-world-example/
│   │   ├── README.md
│   │   └── build.pkr.hcl
│   ├── terraform-asg-scp-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-dynamodb-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── variables.tf
│   ├── terraform-aws-ec2-windows-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── packer/
│   │   │   ├── build.pkr.hcl
│   │   │   └── scripts/
│   │   │       ├── bootstrap_windows.txt
│   │   │       ├── install_chocolatey.ps1
│   │   │       └── install_packages.ps1
│   │   └── variables.tf
│   ├── terraform-aws-ecs-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-aws-lambda-example/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── src/
│   │   │   ├── README.md
│   │   │   └── bootstrap.go
│   │   └── variables.tf
│   ├── terraform-aws-network-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── terraform-aws-rds-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-s3-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-aws-ssm-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-backend-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-basic-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── varfile.tfvars
│   │   └── variables.tf
│   ├── terraform-database-example/
│   │   ├── REAME.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-gcp-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-gcp-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-gcp-ig-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-hello-world-example/
│   │   ├── README.md
│   │   └── main.tf
│   ├── terraform-http-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-opa-example/
│   │   ├── README.md
│   │   ├── fail/
│   │   │   ├── main_fail.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   ├── pass/
│   │   │   ├── main_pass.tf
│   │   │   ├── output.tf
│   │   │   └── variables.tf
│   │   └── policy/
│   │       ├── enforce_source.rego
│   │       └── enforce_source_v0.rego
│   ├── terraform-packer-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-redeploy-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user-data/
│   │   │   └── user-data.sh
│   │   └── variables.tf
│   ├── terraform-remote-exec-example/
│   │   ├── README.md
│   │   ├── files/
│   │   │   └── get-public-ip.sh
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-ssh-certificate-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user_data.sh
│   │   └── variables.tf
│   ├── terraform-ssh-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── terraform-ssh-password-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── user_data.sh
│   │   └── variables.tf
│   ├── terragrunt-example/
│   │   ├── README.md
│   │   ├── main.tf
│   │   └── terragrunt.hcl
│   ├── terragrunt-multi-module-example/
│   │   ├── README.md
│   │   ├── live/
│   │   │   ├── app/
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── database/
│   │   │   │   └── terragrunt.hcl
│   │   │   └── vpc/
│   │   │       └── terragrunt.hcl
│   │   └── modules/
│   │       ├── app/
│   │       │   └── main.tf
│   │       ├── database/
│   │       │   └── main.tf
│   │       └── vpc/
│   │           └── main.tf
│   └── terragrunt-second-example/
│       ├── main.tf
│       └── terragrunt.hcl
├── go.mod
├── go.sum
├── internal/
│   └── lib/
│       └── formatting/
│           ├── format.go
│           └── format_test.go
├── mise.toml
├── modules/
│   ├── aws/
│   │   ├── account.go
│   │   ├── account_test.go
│   │   ├── acm.go
│   │   ├── ami.go
│   │   ├── ami_test.go
│   │   ├── asg.go
│   │   ├── asg_test.go
│   │   ├── auth.go
│   │   ├── aws.go
│   │   ├── cloudwatch.go
│   │   ├── dynamodb.go
│   │   ├── ebs.go
│   │   ├── ec2-files.go
│   │   ├── ec2-syslog.go
│   │   ├── ec2.go
│   │   ├── ec2_test.go
│   │   ├── ecr.go
│   │   ├── ecr_test.go
│   │   ├── ecs.go
│   │   ├── ecs_test.go
│   │   ├── errors.go
│   │   ├── iam.go
│   │   ├── iam_test.go
│   │   ├── keypair.go
│   │   ├── keypair_test.go
│   │   ├── kms.go
│   │   ├── lambda.go
│   │   ├── lambda_test.go
│   │   ├── rds.go
│   │   ├── rds_test.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── route53.go
│   │   ├── route53_test.go
│   │   ├── s3.go
│   │   ├── s3_test.go
│   │   ├── secretsmanager.go
│   │   ├── secretsmanager_test.go
│   │   ├── sns.go
│   │   ├── sns_test.go
│   │   ├── sqs.go
│   │   ├── sqs_test.go
│   │   ├── ssm.go
│   │   ├── ssm_test.go
│   │   ├── vpc.go
│   │   └── vpc_test.go
│   ├── azure/
│   │   ├── actiongroup.go
│   │   ├── actiongroup_test.go
│   │   ├── aks.go
│   │   ├── appService.go
│   │   ├── appService_test.go
│   │   ├── authorizer.go
│   │   ├── availabilityset.go
│   │   ├── availabilityset_test.go
│   │   ├── azure.go
│   │   ├── client_factory.go
│   │   ├── client_factory_test.go
│   │   ├── common.go
│   │   ├── common_test.go
│   │   ├── compute.go
│   │   ├── compute_test.go
│   │   ├── container_apps.go
│   │   ├── container_apps_test.go
│   │   ├── containers.go
│   │   ├── containers_test.go
│   │   ├── cosmosdb.go
│   │   ├── datafactory.go
│   │   ├── datafactory_test.go
│   │   ├── disk.go
│   │   ├── disk_test.go
│   │   ├── enums.go
│   │   ├── errors.go
│   │   ├── frontdoor.go
│   │   ├── frontdoor_test.go
│   │   ├── keyvault.go
│   │   ├── keyvault_test.go
│   │   ├── loadbalancer.go
│   │   ├── loadbalancer_test.go
│   │   ├── loganalytics.go
│   │   ├── loganalytics_test.go
│   │   ├── monitor.go
│   │   ├── monitor_test.go
│   │   ├── mysql.go
│   │   ├── mysql_test.go
│   │   ├── networkinterface.go
│   │   ├── networkinterface_test.go
│   │   ├── nsg.go
│   │   ├── nsg_test.go
│   │   ├── postgresql.go
│   │   ├── postgresql_test.go
│   │   ├── privatednszone.go
│   │   ├── privatednszone_test.go
│   │   ├── publicaddress.go
│   │   ├── publicaddress_test.go
│   │   ├── recoveryservices.go
│   │   ├── recoveryservices_test.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── resourcegroup.go
│   │   ├── resourcegroup_test.go
│   │   ├── resourcegroupv2.go
│   │   ├── resourcegroupv2_test.go
│   │   ├── resourceid.go
│   │   ├── resourceid_test.go
│   │   ├── servicebus.go
│   │   ├── servicebus_test.go
│   │   ├── sql.go
│   │   ├── sql_managedinstance.go
│   │   ├── sql_managedinstance_test.go
│   │   ├── sql_test.go
│   │   ├── storage.go
│   │   ├── storage_test.go
│   │   ├── subscription.go
│   │   ├── synapse.go
│   │   ├── synapse_test.go
│   │   ├── virtualnetwork.go
│   │   └── virtualnetwork_test.go
│   ├── collections/
│   │   ├── collections.go
│   │   ├── errors.go
│   │   ├── lists.go
│   │   ├── lists_test.go
│   │   ├── stringslicevalue.go
│   │   └── stringslicevalue_test.go
│   ├── database/
│   │   └── database.go
│   ├── dns-helper/
│   │   ├── dns_helper.go
│   │   ├── dns_helper_test.go
│   │   ├── dns_local_server.go
│   │   └── errors.go
│   ├── docker/
│   │   ├── build.go
│   │   ├── build_test.go
│   │   ├── docker.go
│   │   ├── docker_compose.go
│   │   ├── docker_compose_test.go
│   │   ├── host.go
│   │   ├── host_test.go
│   │   ├── images.go
│   │   ├── images_test.go
│   │   ├── inspect.go
│   │   ├── inspect_test.go
│   │   ├── push.go
│   │   ├── run.go
│   │   ├── run_test.go
│   │   ├── stop.go
│   │   └── stop_test.go
│   ├── environment/
│   │   ├── environment.go
│   │   ├── envvar.go
│   │   └── envvar_test.go
│   ├── files/
│   │   ├── errors.go
│   │   ├── files.go
│   │   └── files_test.go
│   ├── gcp/
│   │   ├── cloudbuild.go
│   │   ├── cloudbuild_test.go
│   │   ├── compute.go
│   │   ├── compute_test.go
│   │   ├── compute_unit_test.go
│   │   ├── gcp.go
│   │   ├── gcr.go
│   │   ├── oslogin.go
│   │   ├── oslogin_test.go
│   │   ├── provider.go
│   │   ├── region.go
│   │   ├── region_test.go
│   │   ├── static_token.go
│   │   ├── static_token_test.go
│   │   ├── storage.go
│   │   └── storage_test.go
│   ├── git/
│   │   ├── git.go
│   │   └── git_test.go
│   ├── helm/
│   │   ├── cmd.go
│   │   ├── cmd_test.go
│   │   ├── delete.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── helm.go
│   │   ├── install.go
│   │   ├── install_test.go
│   │   ├── options.go
│   │   ├── repo.go
│   │   ├── rollback.go
│   │   ├── template.go
│   │   ├── template_test.go
│   │   ├── testdata/
│   │   │   ├── configmap-literalblock.yaml
│   │   │   ├── deployment.yaml
│   │   │   ├── deployments-array.yaml
│   │   │   ├── deployments.yaml
│   │   │   ├── deprecated-chart/
│   │   │   │   ├── Chart.yaml
│   │   │   │   └── templates/
│   │   │   │       └── deployment.yaml
│   │   │   ├── invalid-duplicate.yaml
│   │   │   └── multiple-manifests/
│   │   │       ├── Chart.yaml
│   │   │       └── templates/
│   │   │           ├── configmap.yaml
│   │   │           └── deployment.yaml
│   │   ├── upgrade.go
│   │   └── upgrade_test.go
│   ├── http-helper/
│   │   ├── continuous.go
│   │   ├── dummy_server.go
│   │   ├── dummy_server_test.go
│   │   ├── errors.go
│   │   ├── http_helper.go
│   │   └── http_helper_test.go
│   ├── k8s/
│   │   ├── client.go
│   │   ├── cluster_role.go
│   │   ├── cluster_role_test.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── configmap.go
│   │   ├── configmap_test.go
│   │   ├── cronjob.go
│   │   ├── cronjob_test.go
│   │   ├── daemonset.go
│   │   ├── daemonset_test.go
│   │   ├── deployment.go
│   │   ├── deployment_test.go
│   │   ├── errors.go
│   │   ├── errors_test.go
│   │   ├── event.go
│   │   ├── event_test.go
│   │   ├── ingress.go
│   │   ├── ingress_test.go
│   │   ├── job.go
│   │   ├── job_test.go
│   │   ├── jsonpath.go
│   │   ├── jsonpath_test.go
│   │   ├── k8s.go
│   │   ├── kubectl.go
│   │   ├── kubectl_options.go
│   │   ├── kubectl_test.go
│   │   ├── minikube.go
│   │   ├── minikube_test.go
│   │   ├── namespace.go
│   │   ├── namespace_test.go
│   │   ├── networkpolicy.go
│   │   ├── networkpolicy_test.go
│   │   ├── node.go
│   │   ├── node_test.go
│   │   ├── persistent_volume.go
│   │   ├── persistent_volume_claim.go
│   │   ├── persistent_volume_claim_test.go
│   │   ├── persistent_volume_test.go
│   │   ├── pod.go
│   │   ├── pod_test.go
│   │   ├── replicaset.go
│   │   ├── replicaset_test.go
│   │   ├── role.go
│   │   ├── role_test.go
│   │   ├── secret.go
│   │   ├── secret_test.go
│   │   ├── self_subject_access_review.go
│   │   ├── self_subject_access_review_test.go
│   │   ├── service.go
│   │   ├── service_account.go
│   │   ├── service_account_test.go
│   │   ├── service_test.go
│   │   ├── tunnel.go
│   │   ├── tunnel_test.go
│   │   ├── version.go
│   │   └── version_test.go
│   ├── logger/
│   │   ├── logger.go
│   │   ├── logger_test.go
│   │   └── parser/
│   │       ├── failed_test_marker.go
│   │       ├── failed_test_marker_test.go
│   │       ├── fixtures/
│   │       │   ├── basic_example.log
│   │       │   ├── basic_example_expected/
│   │       │   │   ├── TestCloseChannelsClosesAll.log
│   │       │   │   ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │   │   ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │   │   ├── TestGetIndent/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── EmptyString.log
│   │       │   │   │   ├── MixTabSpace.log
│   │       │   │   │   ├── NoIndent.log
│   │       │   │   │   └── Tabs.log
│   │       │   │   ├── TestGetIndent.log
│   │       │   │   ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │   │   ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │   │   ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │   │   ├── TestGetTestNameFromResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestGetTestNameFromResultLine.log
│   │       │   │   ├── TestGetTestNameFromStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestGetTestNameFromStatusLine.log
│   │       │   │   ├── TestIsEmpty.log
│   │       │   │   ├── TestIsPanicLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotPanic.log
│   │       │   │   ├── TestIsPanicLine.log
│   │       │   │   ├── TestIsResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonResultLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestIsResultLine.log
│   │       │   │   ├── TestIsStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonStatusLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestIsStatusLine.log
│   │       │   │   ├── TestIsSummaryLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotSummary.log
│   │       │   │   ├── TestIsSummaryLine.log
│   │       │   │   ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │   │   ├── TestPeek.log
│   │       │   │   ├── TestPeekEmpty.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkers.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │   │   ├── TestStackPop.log
│   │       │   │   ├── TestStackPopEmpty.log
│   │       │   │   ├── TestStackPush.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── failing_example.log
│   │       │   ├── failing_example_expected/
│   │       │   │   ├── TestBasicExample.log
│   │       │   │   ├── TestCloseChannelsClosesAll.log
│   │       │   │   ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │   │   ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │   │   ├── TestGetIndent/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── EmptyString.log
│   │       │   │   │   ├── MixTabSpace.log
│   │       │   │   │   ├── NoIndent.log
│   │       │   │   │   └── Tabs.log
│   │       │   │   ├── TestGetIndent.log
│   │       │   │   ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │   │   ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │   │   ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │   │   ├── TestGetTestNameFromResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestGetTestNameFromResultLine.log
│   │       │   │   ├── TestGetTestNameFromStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestGetTestNameFromStatusLine.log
│   │       │   │   ├── TestIsEmpty.log
│   │       │   │   ├── TestIsPanicLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotPanic.log
│   │       │   │   ├── TestIsPanicLine.log
│   │       │   │   ├── TestIsResultLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonResultLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   └── WhenFailed.log
│   │       │   │   ├── TestIsResultLine.log
│   │       │   │   ├── TestIsStatusLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   ├── Indented.log
│   │       │   │   │   ├── NonStatusLine.log
│   │       │   │   │   ├── SpecialChars.log
│   │       │   │   │   ├── WhenCont.log
│   │       │   │   │   └── WhenPaused.log
│   │       │   │   ├── TestIsStatusLine.log
│   │       │   │   ├── TestIsSummaryLine/
│   │       │   │   │   ├── BaseCase.log
│   │       │   │   │   └── NotSummary.log
│   │       │   │   ├── TestIsSummaryLine.log
│   │       │   │   ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │   │   ├── TestPanicExample.log
│   │       │   │   ├── TestPeek.log
│   │       │   │   ├── TestPeekEmpty.log
│   │       │   │   ├── TestRealWorldExample.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkers.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │   │   ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │   │   ├── TestStackPop.log
│   │       │   │   ├── TestStackPopEmpty.log
│   │       │   │   ├── TestStackPush.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── new_go_failing_example.log
│   │       │   ├── new_go_failing_example_expected/
│   │       │   │   ├── TestIntegrationBasicExample.log
│   │       │   │   ├── TestIntegrationFailingExample.log
│   │       │   │   ├── TestIntegrationPanicExample.log
│   │       │   │   ├── report.xml
│   │       │   │   └── summary.log
│   │       │   ├── panic_example.log
│   │       │   └── panic_example_expected/
│   │       │       ├── TestCloseChannelsClosesAll.log
│   │       │       ├── TestEnsureDirectoryExistsCreatesDirectory.log
│   │       │       ├── TestEnsureDirectoryExistsHandlesExistingDirectory.log
│   │       │       ├── TestGetIndent/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── EmptyString.log
│   │       │       │   ├── MixTabSpace.log
│   │       │       │   ├── NoIndent.log
│   │       │       │   └── Tabs.log
│   │       │       ├── TestGetIndent.log
│   │       │       ├── TestGetOrCreateChannelCreatesNewChannel.log
│   │       │       ├── TestGetOrCreateChannelReturnsExistingChannel.log
│   │       │       ├── TestGetOrCreateChannelSpawnsLogCollectorOnCreate.log
│   │       │       ├── TestGetTestNameFromResultLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   └── WhenFailed.log
│   │       │       ├── TestGetTestNameFromResultLine.log
│   │       │       ├── TestGetTestNameFromStatusLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   ├── WhenCont.log
│   │       │       │   └── WhenPaused.log
│   │       │       ├── TestGetTestNameFromStatusLine.log
│   │       │       ├── TestIsEmpty.log
│   │       │       ├── TestIsPanicLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   └── NotPanic.log
│   │       │       ├── TestIsPanicLine.log
│   │       │       ├── TestIsResultLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── NonResultLine.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   └── WhenFailed.log
│   │       │       ├── TestIsResultLine.log
│   │       │       ├── TestIsStatusLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   ├── Indented.log
│   │       │       │   ├── NonStatusLine.log
│   │       │       │   ├── SpecialChars.log
│   │       │       │   ├── WhenCont.log
│   │       │       │   └── WhenPaused.log
│   │       │       ├── TestIsStatusLine.log
│   │       │       ├── TestIsSummaryLine/
│   │       │       │   ├── BaseCase.log
│   │       │       │   └── NotSummary.log
│   │       │       ├── TestIsSummaryLine.log
│   │       │       ├── TestLogCollectorCreatesAndWritesToFile.log
│   │       │       ├── TestPeek.log
│   │       │       ├── TestPeekEmpty.log
│   │       │       ├── TestRemoveDedentedTestResultMarkers.log
│   │       │       ├── TestRemoveDedentedTestResultMarkersAll.log
│   │       │       ├── TestRemoveDedentedTestResultMarkersEmpty.log
│   │       │       ├── TestStackPop.log
│   │       │       ├── TestStackPopEmpty.log
│   │       │       ├── TestStackPush.log
│   │       │       ├── report.xml
│   │       │       └── summary.log
│   │       ├── helpers_for_test.go
│   │       ├── integration_test.go
│   │       ├── parser.go
│   │       ├── parser_test.go
│   │       ├── store.go
│   │       └── store_test.go
│   ├── oci/
│   │   ├── compute.go
│   │   ├── identity.go
│   │   ├── network.go
│   │   └── provider.go
│   ├── opa/
│   │   ├── download_policy.go
│   │   ├── download_policy_test.go
│   │   ├── eval.go
│   │   └── eval_test.go
│   ├── packer/
│   │   ├── packer.go
│   │   └── packer_test.go
│   ├── random/
│   │   ├── random.go
│   │   └── random_test.go
│   ├── retry/
│   │   ├── retry.go
│   │   └── retry_test.go
│   ├── shell/
│   │   ├── command.go
│   │   ├── command_test.go
│   │   ├── output.go
│   │   └── shell.go
│   ├── slack/
│   │   ├── doc.go
│   │   ├── validate.go
│   │   └── validate_test.go
│   ├── ssh/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── key_pair.go
│   │   ├── key_pair_test.go
│   │   ├── session.go
│   │   ├── session_test.go
│   │   ├── ssh.go
│   │   └── ssh_test.go
│   ├── terraform/
│   │   ├── apply.go
│   │   ├── apply_test.go
│   │   ├── cmd.go
│   │   ├── cmd_test.go
│   │   ├── count.go
│   │   ├── count_test.go
│   │   ├── destroy.go
│   │   ├── errors.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── get.go
│   │   ├── init.go
│   │   ├── init_test.go
│   │   ├── opa_check.go
│   │   ├── options.go
│   │   ├── options_test.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── plan.go
│   │   ├── plan_struct.go
│   │   ├── plan_struct_test.go
│   │   ├── plan_test.go
│   │   ├── show.go
│   │   ├── show_test.go
│   │   ├── terraform.go
│   │   ├── validate.go
│   │   ├── validate_test.go
│   │   ├── var-file.go
│   │   ├── var-file_test.go
│   │   ├── var.go
│   │   ├── workspace.go
│   │   └── workspace_test.go
│   ├── terragrunt/
│   │   ├── README.md
│   │   ├── apply.go
│   │   ├── apply_test.go
│   │   ├── cmd.go
│   │   ├── cmd_args_test.go
│   │   ├── destroy.go
│   │   ├── destroy_test.go
│   │   ├── format.go
│   │   ├── format_test.go
│   │   ├── graph.go
│   │   ├── graph_test.go
│   │   ├── hcl_validate.go
│   │   ├── hcl_validate_test.go
│   │   ├── init.go
│   │   ├── init_test.go
│   │   ├── json_helpers.go
│   │   ├── json_helpers_test.go
│   │   ├── options.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── plan.go
│   │   ├── plan_test.go
│   │   ├── render.go
│   │   ├── render_test.go
│   │   ├── run.go
│   │   ├── run_all.go
│   │   ├── run_all_test.go
│   │   ├── run_test.go
│   │   ├── stack_clean.go
│   │   ├── stack_clean_test.go
│   │   ├── stack_generate.go
│   │   ├── stack_generate_test.go
│   │   ├── stack_output.go
│   │   ├── stack_output_test.go
│   │   ├── stack_run.go
│   │   ├── stack_run_test.go
│   │   ├── terragrunt_e2e_test.go
│   │   ├── terragrunt_example_test.go
│   │   ├── testdata/
│   │   │   ├── terragrunt-multi-plan/
│   │   │   │   ├── bar/
│   │   │   │   │   ├── main.tf
│   │   │   │   │   └── terragrunt.hcl
│   │   │   │   └── foo/
│   │   │   │       ├── main.tf
│   │   │   │       └── terragrunt.hcl
│   │   │   ├── terragrunt-no-error/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── terragrunt-output/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── terragrunt-stack-init/
│   │   │   │   ├── live/
│   │   │   │   │   ├── placeholder.tf
│   │   │   │   │   ├── terragrunt.hcl
│   │   │   │   │   └── terragrunt.stack.hcl
│   │   │   │   └── units/
│   │   │   │       ├── chick/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       ├── chicken/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       ├── father/
│   │   │   │       │   ├── main.tf
│   │   │   │       │   └── terragrunt.hcl
│   │   │   │       └── mother/
│   │   │   │           ├── main.tf
│   │   │   │           └── terragrunt.hcl
│   │   │   ├── terragrunt-stack-init-error/
│   │   │   │   ├── main.tf
│   │   │   │   └── terragrunt.hcl
│   │   │   └── terragrunt-with-plan-error/
│   │   │       ├── main.tf
│   │   │       └── terragrunt.hcl
│   │   ├── validate.go
│   │   └── validate_test.go
│   ├── test-structure/
│   │   ├── save_test_data.go
│   │   ├── save_test_data_test.go
│   │   ├── test_structure.go
│   │   ├── test_structure_test.go
│   │   └── validate_struct.go
│   ├── testing/
│   │   └── types.go
│   └── version-checker/
│       ├── errors.go
│       ├── version_checker.go
│       └── version_checker_test.go
├── test/
│   ├── azure/
│   │   ├── terraform_azure_aci_example_test.go
│   │   ├── terraform_azure_acr_example_test.go
│   │   ├── terraform_azure_actiongroup_example_test.go
│   │   ├── terraform_azure_aks_example_test.go
│   │   ├── terraform_azure_availabilityset_example_test.go
│   │   ├── terraform_azure_container_apps_example_test.go
│   │   ├── terraform_azure_cosmosdb_example_test.go
│   │   ├── terraform_azure_datafactory_example_test.go
│   │   ├── terraform_azure_disk_example_test.go
│   │   ├── terraform_azure_example_test.go
│   │   ├── terraform_azure_frontdoor_example_test.go
│   │   ├── terraform_azure_functionapp_example_test.go
│   │   ├── terraform_azure_keyvault_example_test.go
│   │   ├── terraform_azure_loadbalancer_example_test.go
│   │   ├── terraform_azure_loganalytics_example_test.go
│   │   ├── terraform_azure_monitor_example_test.go
│   │   ├── terraform_azure_mysqldb_example_test.go
│   │   ├── terraform_azure_network_example_test.go
│   │   ├── terraform_azure_nsg_example_test.go
│   │   ├── terraform_azure_postgresql_example_test.go
│   │   ├── terraform_azure_recoveryservices_example_test.go
│   │   ├── terraform_azure_resourcegroup_example_test.go
│   │   ├── terraform_azure_servicebus_example_test.go
│   │   ├── terraform_azure_sqldb_example_test.go
│   │   ├── terraform_azure_sqlmanagedinstance_example_test.go
│   │   ├── terraform_azure_storage_example_test.go
│   │   ├── terraform_azure_synapse_example_test.go
│   │   └── terraform_azure_vm_example_test.go
│   ├── docker_hello_world_example_test.go
│   ├── docker_stdout_example_test.go
│   ├── fixtures/
│   │   ├── copy-folder-contents/
│   │   │   ├── full-copy/
│   │   │   │   ├── .hidden-file.txt
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       ├── .hidden-folder/
│   │   │   │       │   └── baz.txt
│   │   │   │       └── bar.txt
│   │   │   ├── no-hidden-files/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── no-hidden-files-no-terraform-files/
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── no-state-files/
│   │   │   │   └── terragrunt.hcl
│   │   │   ├── original/
│   │   │   │   ├── .hidden-file.txt
│   │   │   │   ├── .terraform-version
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       ├── .hidden-folder/
│   │   │   │       │   └── baz.txt
│   │   │   │       └── bar.txt
│   │   │   ├── symlinks/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   ├── symlinks-broken/
│   │   │   │   ├── foo.txt
│   │   │   │   └── subfolder/
│   │   │   │       └── bar.txt
│   │   │   └── terragrunt-files/
│   │   │       └── terragrunt.hcl
│   │   ├── docker/
│   │   │   └── Dockerfile
│   │   ├── docker-compose-with-buildkit/
│   │   │   ├── Dockerfile
│   │   │   ├── bash_script.sh
│   │   │   └── docker-compose.yml
│   │   ├── docker-compose-with-custom-project-name/
│   │   │   └── docker-compose.yml
│   │   ├── docker-with-buildkit/
│   │   │   └── Dockerfile
│   │   ├── helm/
│   │   │   └── keda-values.yaml
│   │   ├── terraform-backend/
│   │   │   ├── backend.hcl
│   │   │   └── main.tf
│   │   ├── terraform-basic-configuration/
│   │   │   └── main.tf
│   │   ├── terraform-no-error/
│   │   │   └── main.tf
│   │   ├── terraform-not-idempotent/
│   │   │   └── main.tf
│   │   ├── terraform-null/
│   │   │   └── main.tf
│   │   ├── terraform-output/
│   │   │   └── output.tf
│   │   ├── terraform-output-all/
│   │   │   └── output.tf
│   │   ├── terraform-output-list/
│   │   │   └── output.tf
│   │   ├── terraform-output-listofobjects/
│   │   │   └── output.tf
│   │   ├── terraform-output-map/
│   │   │   └── output.tf
│   │   ├── terraform-output-mapofobjects/
│   │   │   └── output.tf
│   │   ├── terraform-output-struct/
│   │   │   └── output.tf
│   │   ├── terraform-parallelism/
│   │   │   └── main.tf
│   │   ├── terraform-validation-valid/
│   │   │   ├── main.tf
│   │   │   ├── outputs.tf
│   │   │   └── vars.tf
│   │   ├── terraform-with-error/
│   │   │   └── main.tf
│   │   ├── terraform-with-plan-error/
│   │   │   └── main.tf
│   │   ├── terraform-with-warning/
│   │   │   └── main.tf
│   │   └── terraform-workspace/
│   │       └── main.tf
│   ├── gcp/
│   │   ├── packer_gcp_basic_example_test.go
│   │   ├── terraform_gcp_example_test.go
│   │   ├── terraform_gcp_hello_world_example_test.go
│   │   └── terraform_gcp_ig_example_test.go
│   ├── helm_basic_example_integration_test.go
│   ├── helm_basic_example_template_test.go
│   ├── helm_dependency_example_template_test.go
│   ├── helm_keda_remote_example_template_snapshot_test.go
│   ├── helm_keda_remote_example_template_test.go
│   ├── helm_log_redirect_integration_test.go
│   ├── kubernetes_basic_example_logs_test.go
│   ├── kubernetes_basic_example_service_check_test.go
│   ├── kubernetes_basic_example_test.go
│   ├── kubernetes_hello_world_example_test.go
│   ├── kubernetes_kustomize_example_test.go
│   ├── kubernetes_rbac_example_test.go
│   ├── kubernetes_rest_config_example_test.go
│   ├── packer_basic_example_test.go
│   ├── packer_docker_example_test.go
│   ├── packer_hello_world_example_test.go
│   ├── packer_oci_example_test.go
│   ├── terraform_aws_dynamodb_example_test.go
│   ├── terraform_aws_ec2_windows_test.go
│   ├── terraform_aws_ecs_example_test.go
│   ├── terraform_aws_example_plan_test.go
│   ├── terraform_aws_example_test.go
│   ├── terraform_aws_hello_world_example_test.go
│   ├── terraform_aws_lambda_example_test.go
│   ├── terraform_aws_network_example_test.go
│   ├── terraform_aws_rds_example_test.go
│   ├── terraform_aws_s3_example_test.go
│   ├── terraform_aws_ssm_example_test.go
│   ├── terraform_backend_example_test.go
│   ├── terraform_basic_example_regression_test.go
│   ├── terraform_basic_example_test.go
│   ├── terraform_database_example_test.go
│   ├── terraform_hello_world_example_test.go
│   ├── terraform_http_example_test.go
│   ├── terraform_opa_example_extra_args_test.go
│   ├── terraform_opa_example_test.go
│   ├── terraform_packer_example_test.go
│   ├── terraform_redeploy_example_test.go
│   ├── terraform_remote_exec_example_test.go
│   ├── terraform_scp_example_test.go
│   ├── terraform_ssh_certificate_example_test.go
│   ├── terraform_ssh_example_test.go
│   ├── terraform_ssh_password_example_test.go
│   └── terraform_unit_null_test.go
└── test-docker-images/
    ├── README.md
    ├── gruntwork-amazon-linux-test/
    │   ├── Dockerfile
    │   └── README.md
    ├── gruntwork-centos-test/
    │   ├── Dockerfile
    │   └── README.md
    ├── gruntwork-ubuntu-test/
    │   ├── Dockerfile
    │   └── README.md
    └── moto/
        ├── Dockerfile
        └── README.md
Download .txt
Showing preview only (341K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3057 symbols across 446 files)

FILE: cmd/pick-instance-type/main.go
  constant CustomUsageText (line 11) | CustomUsageText = `Usage: pick-instance-type [OPTIONS] <REGION> <INSTANC...
  function run (line 30) | func run(cliContext *cli.Context) error {
  function main (line 55) | func main() {
  type MockTestingT (line 70) | type MockTestingT struct
    method Fail (line 74) | func (t MockTestingT) Fail()                                     {}
    method FailNow (line 75) | func (t MockTestingT) FailNow()                                  {}
    method Fatal (line 76) | func (t MockTestingT) Fatal(args ...interface{})                 {}
    method Fatalf (line 77) | func (t MockTestingT) Fatalf(format string, args ...interface{}) {}
    method Error (line 78) | func (t MockTestingT) Error(args ...interface{})                 {}
    method Errorf (line 79) | func (t MockTestingT) Errorf(format string, args ...interface{}) {}
    method Name (line 80) | func (t MockTestingT) Name() string {

FILE: cmd/terratest_log_parser/main.go
  constant CUSTOM_USAGE_TEXT (line 52) | CUSTOM_USAGE_TEXT = `Usage: terratest_log_parser [--help] [--log-level=i...
  function run (line 64) | func run(cliContext *cli.Context) error {
  function main (line 96) | func main() {

FILE: docs/assets/js/collection-browser_search.js
  function initializeCbSearch (line 38) | function initializeCbSearch(el) {
  function filterSearchData (line 67) | function filterSearchData(collectionName) {
  function filterDocs (line 110) | function filterDocs(collectionName, searchInputValue, checkedTags) {
  function containsTerms (line 127) | function containsTerms(content, terms) {
  function containsText (line 137) | function containsText(doc, terms) {
  function containsTag (line 142) | function containsTag(doc, terms) {
  function fetchDocsData (line 151) | function fetchDocsData(collectionName) {
  function debounce (line 165) | function debounce(func, wait, immediate) {
  function showAll (line 186) | function showAll() {
  function hideAll (line 192) | function hideAll() {
  function showDoc (line 198) | function showDoc(docId) {
  function showCategory (line 202) | function showCategory(categoryId) {
  function showNoResults (line 210) | function showNoResults(state) {

FILE: docs/assets/js/collection-browser_toc.js
  function toggleNav (line 38) | function toggleNav(el) {

FILE: docs/assets/js/contact-form.js
  function selectPlanFromUrl (line 11) | function selectPlanFromUrl() {
  function submitForm (line 22) | function submitForm(e) {

FILE: docs/assets/js/examples.js
  function scrollToTests (line 72) | function scrollToTests() {
  function openExample (line 78) | function openExample(exampleContainerId, target) {
  function loadCodeSnippet (line 99) | function loadCodeSnippet() {
  function extractSnippet (line 137) | function extractSnippet(content, snippetId) {
  function searchTagInLines (line 155) | function searchTagInLines (tagRegExp, lines) {
  function findTags (line 159) | function findTags(content, exampleTarget, fileId) {
  function findLineNumber (line 180) | function findLineNumber(content, text) {
  function updatePopups (line 187) | function updatePopups() {
  function openPopup (line 228) | function openPopup(techName, step) {
  function loadExampleDescription (line 233) | function loadExampleDescription(name) {
  function initExamplesNav (line 237) | function initExamplesNav() {
  function buildExamplesNav (line 259) | function buildExamplesNav() {

FILE: docs/assets/js/main.js
  function s (line 2) | function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"funct...
  function fa (line 2) | function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.node...
  function ga (line 2) | function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLengt...
  function ha (line 2) | function ha(a){return a[u]=!0,a}
  function ia (line 2) | function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){re...
  function ja (line 2) | function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[...
  function ka (line 2) | function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sou...
  function la (line 2) | function la(a){return function(b){var c=b.nodeName.toLowerCase();return"...
  function ma (line 2) | function ma(a){return function(b){var c=b.nodeName.toLowerCase();return(...
  function na (line 2) | function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,...
  function oa (line 2) | function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}
  function pa (line 2) | function pa(){}
  function qa (line 2) | function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}
  function ra (line 2) | function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.firs...
  function sa (line 2) | function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e-...
  function ta (line 2) | function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}
  function ua (line 2) | function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(...
  function va (line 2) | function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)...
  function wa (line 2) | function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.r...
  function xa (line 2) | function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var...
  function z (line 2) | function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){retur...
  function F (line 2) | function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}
  function H (line 2) | function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!...
  function J (line 2) | function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded...
  function K (line 2) | function K(){(d.addEventListener||"load"===a.event.type||"complete"===d....
  function P (line 2) | function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace...
  function Q (line 3) | function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&...
  function R (line 3) | function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cach...
  function S (line 3) | function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.ex...
  function X (line 3) | function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:functi...
  function ca (line 3) | function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.cre...
  function ea (line 3) | function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagNam...
  function fa (line 3) | function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval"...
  function ia (line 3) | function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}
  function ja (line 3) | function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0...
  function pa (line 3) | function pa(){return!0}
  function qa (line 3) | function qa(){return!1}
  function ra (line 3) | function ra(){try{return d.activeElement}catch(a){}}
  function sa (line 3) | function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof...
  function Ca (line 3) | function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeTyp...
  function Da (line 3) | function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}
  function Ea (line 3) | function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttrib...
  function Fa (line 3) | function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a)...
  function Ga (line 3) | function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCas...
  function Ha (line 3) | function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-...
  function Ia (line 3) | function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)...
  function La (line 3) | function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[...
  function Ma (line 3) | function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(...
  function k (line 3) | function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssTex...
  function Ua (line 3) | function Ua(a,b){return{get:function(){return a()?void delete this.get:(...
  function bb (line 3) | function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.sli...
  function cb (line 3) | function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.styl...
  function db (line 3) | function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[...
  function eb (line 3) | function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===...
  function fb (line 3) | function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f...
  function gb (line 4) | function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}
  function lb (line 4) | function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}
  function mb (line 4) | function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d[...
  function nb (line 4) | function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["...
  function ob (line 4) | function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeTyp...
  function pb (line 4) | function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a...
  function qb (line 4) | function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().alw...
  function Cb (line 4) | function Cb(a){return n.attr(a,"class")||""}
  function Tb (line 4) | function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var ...
  function Ub (line 4) | function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!...
  function Vb (line 4) | function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)voi...
  function Wb (line 4) | function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[...
  function Xb (line 4) | function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])fo...
  function y (line 4) | function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j...
  function Yb (line 4) | function Yb(a){return a.style&&a.style.display||n.css(a,"display")}
  function Zb (line 4) | function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1=...
  function dc (line 4) | function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b....
  function hc (line 4) | function hc(){try{return new a.XMLHttpRequest}catch(b){}}
  function ic (line 4) | function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(...
  function mc (line 4) | function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.pa...
  function b (line 12) | function b(){var a=document.createElement("bootstrap"),b={WebkitTransiti...
  function b (line 12) | function b(b){return this.each(function(){var c=a(this),e=c.data("bs.ale...
  function c (line 12) | function c(){g.detach().trigger("closed.bs.alert").remove()}
  function b (line 12) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.but...
  function b (line 12) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.car...
  function b (line 12) | function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.repla...
  function c (line 12) | function c(b){return this.each(function(){var c=a(this),e=c.data("bs.col...
  function b (line 12) | function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A...
  function c (line 12) | function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=...
  function d (line 12) | function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dro...
  function b (line 12) | function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.m...
  function b (line 12) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.too...
  function d (line 12) | function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.remov...
  function b (line 12) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.pop...
  function b (line 12) | function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).i...
  function c (line 12) | function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scr...
  function b (line 13) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab...
  function f (line 13) | function f(){g.removeClass("active").find("> .dropdown-menu > .active")....
  function b (line 13) | function b(b){return this.each(function(){var d=a(this),e=d.data("bs.aff...
  function d (line 21) | function d(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.has...
  function f (line 21) | function f(A){var e;if("string"==typeof A||A instanceof String)e=[].slic...
  function c (line 31) | function c(){var u=this,c=+new Date-a,f=arguments;function d(){a=+new Da...

FILE: docs/assets/js/prism.js
  function l (line 3) | function l(e){o.highlightedCode=e,C.hooks.run("before-insert",o),o.eleme...
  function _ (line 3) | function _(e,n,r,t,a){this.type=e,this.content=n,this.alias=r,this.lengt...
  function r (line 3) | function r(){C.manual||C.highlightAll()}

FILE: examples/terraform-aws-lambda-example/src/bootstrap.go
  type Event (line 10) | type Event struct
  function HandleRequest (line 16) | func HandleRequest(ctx context.Context, evnt *Event) (string, error) {
  function main (line 26) | func main() {

FILE: internal/lib/formatting/format.go
  function FormatBackendConfigAsArgs (line 13) | func FormatBackendConfigAsArgs(vars map[string]interface{}) []string {
  function FormatPluginDirAsArgs (line 19) | func FormatPluginDirAsArgs(pluginDir string) []string {
  function formatTerraformArgs (line 27) | func formatTerraformArgs(vars map[string]interface{}, prefix string, use...
  function toHclString (line 50) | func toHclString(value interface{}, isNested bool) string {
  function tryToConvertToGenericSlice (line 61) | func tryToConvertToGenericSlice(value interface{}) ([]interface{}, bool) {
  function tryToConvertToGenericMap (line 77) | func tryToConvertToGenericMap(value interface{}) (map[string]interface{}...
  function sliceToHclString (line 98) | func sliceToHclString(slice []interface{}) string {
  function mapToHclString (line 109) | func mapToHclString(m map[string]interface{}) string {
  function primitiveToHclString (line 120) | func primitiveToHclString(value interface{}, isNested bool) string {

FILE: internal/lib/formatting/format_test.go
  function TestFormatBackendConfigAsArgs (line 9) | func TestFormatBackendConfigAsArgs(t *testing.T) {
  function TestFormatPluginDirAsArgs (line 47) | func TestFormatPluginDirAsArgs(t *testing.T) {
  function TestToHclString (line 75) | func TestToHclString(t *testing.T) {
  function TestToHclStringNested (line 102) | func TestToHclStringNested(t *testing.T) {

FILE: modules/aws/account.go
  function GetAccountId (line 15) | func GetAccountId(t testing.TestingT) string {
  function GetAccountIdE (line 24) | func GetAccountIdE(t testing.TestingT) (string, error) {
  function extractAccountIDFromARN (line 40) | func extractAccountIDFromARN(arn string) (string, error) {
  function NewStsClientE (line 51) | func NewStsClientE(t testing.TestingT, region string) (*sts.Client, erro...

FILE: modules/aws/account_test.go
  function TestGetAccountId (line 9) | func TestGetAccountId(t *testing.T) {
  function TestExtractAccountIdFromValidArn (line 14) | func TestExtractAccountIdFromValidArn(t *testing.T) {
  function TestExtractAccountIdFromInvalidArn (line 30) | func TestExtractAccountIdFromInvalidArn(t *testing.T) {

FILE: modules/aws/acm.go
  function GetAcmCertificateArn (line 12) | func GetAcmCertificateArn(t testing.TestingT, awsRegion string, certDoma...
  function GetAcmCertificateArnE (line 21) | func GetAcmCertificateArnE(t testing.TestingT, awsRegion string, certDom...
  function NewAcmClient (line 42) | func NewAcmClient(t testing.TestingT, region string) *acm.Client {
  function NewAcmClientE (line 51) | func NewAcmClientE(t testing.TestingT, awsRegion string) (*acm.Client, e...

FILE: modules/aws/ami.go
  constant CanonicalAccountId (line 18) | CanonicalAccountId = "099720109477"
  constant CentOsAccountId (line 19) | CentOsAccountId    = "679593333241"
  constant AmazonAccountId (line 20) | AmazonAccountId    = "amazon"
  function DeleteAmiAndAllSnapshots (line 24) | func DeleteAmiAndAllSnapshots(t testing.TestingT, region string, ami str...
  function DeleteAmiAndAllSnapshotsE (line 32) | func DeleteAmiAndAllSnapshotsE(t testing.TestingT, region string, ami st...
  function GetEbsSnapshotsForAmi (line 54) | func GetEbsSnapshotsForAmi(t testing.TestingT, region string, ami string...
  function GetEbsSnapshotsForAmiE (line 63) | func GetEbsSnapshotsForAmiE(t testing.TestingT, region string, ami strin...
  function GetMostRecentAmiId (line 94) | func GetMostRecentAmiId(t testing.TestingT, region string, ownerId strin...
  function GetMostRecentAmiIdE (line 105) | func GetMostRecentAmiIdE(t testing.TestingT, region string, ownerId stri...
  type imageSort (line 136) | type imageSort
    method Len (line 138) | func (a imageSort) Len() int      { return len(a) }
    method Swap (line 139) | func (a imageSort) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
    method Less (line 140) | func (a imageSort) Less(i, j int) bool {
  function mostRecentAMI (line 147) | func mostRecentAMI(images []types.Image) types.Image {
  function GetUbuntu1404Ami (line 154) | func GetUbuntu1404Ami(t testing.TestingT, region string) string {
  function GetUbuntu1404AmiE (line 163) | func GetUbuntu1404AmiE(t testing.TestingT, region string) (string, error) {
  function GetUbuntu1604Ami (line 176) | func GetUbuntu1604Ami(t testing.TestingT, region string) string {
  function GetUbuntu1604AmiE (line 185) | func GetUbuntu1604AmiE(t testing.TestingT, region string) (string, error) {
  function GetUbuntu2004Ami (line 198) | func GetUbuntu2004Ami(t testing.TestingT, region string) string {
  function GetUbuntu2004AmiE (line 207) | func GetUbuntu2004AmiE(t testing.TestingT, region string) (string, error) {
  function GetUbuntu2204Ami (line 220) | func GetUbuntu2204Ami(t testing.TestingT, region string) string {
  function GetUbuntu2204AmiE (line 229) | func GetUbuntu2204AmiE(t testing.TestingT, region string) (string, error) {
  function GetCentos7Ami (line 244) | func GetCentos7Ami(t testing.TestingT, region string) string {
  function GetCentos7AmiE (line 255) | func GetCentos7AmiE(t testing.TestingT, region string) (string, error) {
  function GetAmazonLinuxAmi (line 268) | func GetAmazonLinuxAmi(t testing.TestingT, region string) string {
  function GetAmazonLinuxAmiE (line 277) | func GetAmazonLinuxAmiE(t testing.TestingT, region string) (string, erro...
  function GetEcsOptimizedAmazonLinuxAmi (line 290) | func GetEcsOptimizedAmazonLinuxAmi(t testing.TestingT, region string) st...
  function GetEcsOptimizedAmazonLinuxAmiE (line 299) | func GetEcsOptimizedAmazonLinuxAmiE(t testing.TestingT, region string) (...
  type NoImagesFound (line 312) | type NoImagesFound struct
    method Error (line 318) | func (err NoImagesFound) Error() string {

FILE: modules/aws/ami_test.go
  function TestGetUbuntu1404AmiReturnsSomeAmi (line 9) | func TestGetUbuntu1404AmiReturnsSomeAmi(t *testing.T) {
  function TestGetUbuntu1604AmiReturnsSomeAmi (line 16) | func TestGetUbuntu1604AmiReturnsSomeAmi(t *testing.T) {
  function TestGetUbuntu2004AmiReturnsSomeAmi (line 23) | func TestGetUbuntu2004AmiReturnsSomeAmi(t *testing.T) {
  function TestGetUbuntu2204AmiReturnsSomeAmi (line 30) | func TestGetUbuntu2204AmiReturnsSomeAmi(t *testing.T) {
  function TestGetCentos7AmiReturnsSomeAmi (line 37) | func TestGetCentos7AmiReturnsSomeAmi(t *testing.T) {
  function TestGetAmazonLinuxAmiReturnsSomeAmi (line 44) | func TestGetAmazonLinuxAmiReturnsSomeAmi(t *testing.T) {
  function TestGetEcsOptimizedAmazonLinuxAmiEReturnsSomeAmi (line 51) | func TestGetEcsOptimizedAmazonLinuxAmiEReturnsSomeAmi(t *testing.T) {

FILE: modules/aws/asg.go
  type AsgCapacityInfo (line 17) | type AsgCapacityInfo struct
  function GetCapacityInfoForAsg (line 25) | func GetCapacityInfoForAsg(t testing.TestingT, asgName string, awsRegion...
  function GetCapacityInfoForAsgE (line 32) | func GetCapacityInfoForAsgE(t testing.TestingT, asgName string, awsRegio...
  function GetInstanceIdsForAsg (line 57) | func GetInstanceIdsForAsg(t testing.TestingT, asgName string, awsRegion ...
  function GetInstanceIdsForAsgE (line 66) | func GetInstanceIdsForAsgE(t testing.TestingT, asgName string, awsRegion...
  function WaitForCapacity (line 89) | func WaitForCapacity(
  function WaitForCapacityE (line 101) | func WaitForCapacityE(
  function NewAsgClient (line 129) | func NewAsgClient(t testing.TestingT, region string) *autoscaling.Client {
  function NewAsgClientE (line 138) | func NewAsgClientE(t testing.TestingT, region string) (*autoscaling.Clie...

FILE: modules/aws/asg_test.go
  function TestGetCapacityInfoForAsg (line 20) | func TestGetCapacityInfoForAsg(t *testing.T) {
  function TestGetInstanceIdsForAsg (line 38) | func TestGetInstanceIdsForAsg(t *testing.T) {
  function createTestAutoScalingGroup (line 53) | func createTestAutoScalingGroup(t *testing.T, name string, region string...
  function createTestEC2Instance (line 88) | func createTestEC2Instance(t *testing.T, region string, name string) typ...
  function terminateEc2InstancesByName (line 144) | func terminateEc2InstancesByName(t *testing.T, region string, names []st...
  function deleteAutoScalingGroup (line 153) | func deleteAutoScalingGroup(t *testing.T, name string, region string) {
  function scaleAsgToZero (line 175) | func scaleAsgToZero(t *testing.T, name string, region string) {

FILE: modules/aws/auth.go
  constant AuthAssumeRoleEnvVar (line 20) | AuthAssumeRoleEnvVar = "TERRATEST_IAM_ROLE"
  function NewAuthenticatedSession (line 25) | func NewAuthenticatedSession(region string) (*aws.Config, error) {
  function NewAuthenticatedSessionFromDefaultCredentials (line 34) | func NewAuthenticatedSessionFromDefaultCredentials(region string) (*aws....
  function NewAuthenticatedSessionFromRole (line 46) | func NewAuthenticatedSessionFromRole(region string, roleARN string) (*aw...
  function CreateAwsSessionWithCreds (line 70) | func CreateAwsSessionWithCreds(region string, accessKeyID string, secret...
  function CreateAwsSessionWithMfa (line 78) | func CreateAwsSessionWithMfa(region string, stsClient *sts.Client, mfaDe...
  function GetTimeBasedOneTimePassword (line 103) | func GetTimeBasedOneTimePassword(mfaDevice *types.VirtualMFADevice) (str...
  function ReadPasswordPolicyMinPasswordLength (line 115) | func ReadPasswordPolicyMinPasswordLength(iamClient *iam.Client) (int, er...
  type CredentialsError (line 125) | type CredentialsError struct
    method Error (line 129) | func (err CredentialsError) Error() string {

FILE: modules/aws/cloudwatch.go
  function GetCloudWatchLogEntries (line 12) | func GetCloudWatchLogEntries(t testing.TestingT, awsRegion string, logSt...
  function GetCloudWatchLogEntriesE (line 21) | func GetCloudWatchLogEntriesE(t testing.TestingT, awsRegion string, logS...
  function NewCloudWatchLogsClient (line 45) | func NewCloudWatchLogsClient(t testing.TestingT, region string) *cloudwa...
  function NewCloudWatchLogsClientE (line 54) | func NewCloudWatchLogsClientE(t testing.TestingT, region string) (*cloud...

FILE: modules/aws/dynamodb.go
  function GetDynamoDbTableTags (line 14) | func GetDynamoDbTableTags(t testing.TestingT, region string, tableName s...
  function GetDynamoDbTableTagsE (line 21) | func GetDynamoDbTableTagsE(t testing.TestingT, region string, tableName ...
  function GetDynamoDBTableTimeToLive (line 40) | func GetDynamoDBTableTimeToLive(t testing.TestingT, region string, table...
  function GetDynamoDBTableTimeToLiveE (line 47) | func GetDynamoDBTableTimeToLiveE(t testing.TestingT, region string, tabl...
  function GetDynamoDBTable (line 62) | func GetDynamoDBTable(t testing.TestingT, region string, tableName strin...
  function GetDynamoDBTableE (line 69) | func GetDynamoDBTableE(t testing.TestingT, region string, tableName stri...
  function NewDynamoDBClient (line 84) | func NewDynamoDBClient(t testing.TestingT, region string) *dynamodb.Clie...
  function NewDynamoDBClientE (line 91) | func NewDynamoDBClientE(t testing.TestingT, region string) (*dynamodb.Cl...

FILE: modules/aws/ebs.go
  function DeleteEbsSnapshot (line 13) | func DeleteEbsSnapshot(t testing.TestingT, region string, snapshot strin...
  function DeleteEbsSnapshotE (line 21) | func DeleteEbsSnapshotE(t testing.TestingT, region string, snapshot stri...

FILE: modules/aws/ec2-files.go
  type RemoteFileSpecification (line 14) | type RemoteFileSpecification struct
  function FetchContentsOfFileFromInstance (line 26) | func FetchContentsOfFileFromInstance(t testing.TestingT, awsRegion strin...
  function FetchContentsOfFileFromInstanceE (line 37) | func FetchContentsOfFileFromInstanceE(t testing.TestingT, awsRegion stri...
  function FetchContentsOfFilesFromInstance (line 55) | func FetchContentsOfFilesFromInstance(t testing.TestingT, awsRegion stri...
  function FetchContentsOfFilesFromInstanceE (line 66) | func FetchContentsOfFilesFromInstanceE(t testing.TestingT, awsRegion str...
  function FetchContentsOfFileFromAsg (line 85) | func FetchContentsOfFileFromAsg(t testing.TestingT, awsRegion string, ss...
  function FetchContentsOfFileFromAsgE (line 97) | func FetchContentsOfFileFromAsgE(t testing.TestingT, awsRegion string, s...
  function FetchContentsOfFilesFromAsg (line 120) | func FetchContentsOfFilesFromAsg(t testing.TestingT, awsRegion string, s...
  function FetchContentsOfFilesFromAsgE (line 132) | func FetchContentsOfFilesFromAsgE(t testing.TestingT, awsRegion string, ...
  function FetchFilesFromInstance (line 155) | func FetchFilesFromInstance(t testing.TestingT, awsRegion string, sshUse...
  function FetchFilesFromInstanceE (line 167) | func FetchFilesFromInstanceE(t testing.TestingT, awsRegion string, sshUs...
  function FetchFilesFromAsgs (line 201) | func FetchFilesFromAsgs(t testing.TestingT, awsRegion string, spec Remot...
  function FetchFilesFromAsgsE (line 214) | func FetchFilesFromAsgsE(t testing.TestingT, awsRegion string, spec Remo...

FILE: modules/aws/ec2-syslog.go
  function GetSyslogForInstance (line 20) | func GetSyslogForInstance(t testing.TestingT, instanceID string, awsRegi...
  function GetSyslogForInstanceE (line 32) | func GetSyslogForInstanceE(t testing.TestingT, instanceID string, region...
  function GetSyslogForInstancesInAsg (line 79) | func GetSyslogForInstancesInAsg(t testing.TestingT, asgName string, awsR...
  function GetSyslogForInstancesInAsgE (line 92) | func GetSyslogForInstancesInAsgE(t testing.TestingT, asgName string, aws...

FILE: modules/aws/ec2.go
  function GetPrivateIpOfEc2Instance (line 16) | func GetPrivateIpOfEc2Instance(t testing.TestingT, instanceID string, aw...
  function GetPrivateIpOfEc2InstanceE (line 23) | func GetPrivateIpOfEc2InstanceE(t testing.TestingT, instanceID string, a...
  function GetPrivateIpsOfEc2Instances (line 39) | func GetPrivateIpsOfEc2Instances(t testing.TestingT, instanceIDs []strin...
  function GetPrivateIpsOfEc2InstancesE (line 46) | func GetPrivateIpsOfEc2InstancesE(t testing.TestingT, instanceIDs []stri...
  function GetPrivateHostnameOfEc2Instance (line 67) | func GetPrivateHostnameOfEc2Instance(t testing.TestingT, instanceID stri...
  function GetPrivateHostnameOfEc2InstanceE (line 74) | func GetPrivateHostnameOfEc2InstanceE(t testing.TestingT, instanceID str...
  function GetPrivateHostnamesOfEc2Instances (line 90) | func GetPrivateHostnamesOfEc2Instances(t testing.TestingT, instanceIDs [...
  function GetPrivateHostnamesOfEc2InstancesE (line 97) | func GetPrivateHostnamesOfEc2InstancesE(t testing.TestingT, instanceIDs ...
  function GetPublicIpOfEc2Instance (line 121) | func GetPublicIpOfEc2Instance(t testing.TestingT, instanceID string, aws...
  function GetPublicIpOfEc2InstanceE (line 128) | func GetPublicIpOfEc2InstanceE(t testing.TestingT, instanceID string, aw...
  function GetPublicIpsOfEc2Instances (line 144) | func GetPublicIpsOfEc2Instances(t testing.TestingT, instanceIDs []string...
  function GetPublicIpsOfEc2InstancesE (line 151) | func GetPublicIpsOfEc2InstancesE(t testing.TestingT, instanceIDs []strin...
  function GetEc2InstanceIdsByTag (line 172) | func GetEc2InstanceIdsByTag(t testing.TestingT, region string, tagName s...
  function GetEc2InstanceIdsByTagE (line 179) | func GetEc2InstanceIdsByTagE(t testing.TestingT, region string, tagName ...
  function GetEc2InstanceIdsByFilters (line 188) | func GetEc2InstanceIdsByFilters(t testing.TestingT, region string, ec2Fi...
  function GetEc2InstanceIdsByFiltersE (line 196) | func GetEc2InstanceIdsByFiltersE(t testing.TestingT, region string, ec2F...
  function GetTagsForEc2Instance (line 226) | func GetTagsForEc2Instance(t testing.TestingT, region string, instanceID...
  function GetTagsForEc2InstanceE (line 233) | func GetTagsForEc2InstanceE(t testing.TestingT, region string, instanceI...
  function DeleteAmi (line 267) | func DeleteAmi(t testing.TestingT, region string, imageID string) {
  function DeleteAmiE (line 272) | func DeleteAmiE(t testing.TestingT, region string, imageID string) error {
  function AddTagsToResource (line 285) | func AddTagsToResource(t testing.TestingT, region string, resource strin...
  function AddTagsToResourceE (line 290) | func AddTagsToResourceE(t testing.TestingT, region string, resource stri...
  function TerminateInstance (line 313) | func TerminateInstance(t testing.TestingT, region string, instanceID str...
  function TerminateInstanceE (line 318) | func TerminateInstanceE(t testing.TestingT, region string, instanceID st...
  function GetAmiPubliclyAccessible (line 336) | func GetAmiPubliclyAccessible(t testing.TestingT, awsRegion string, amiI...
  function GetAmiPubliclyAccessibleE (line 343) | func GetAmiPubliclyAccessibleE(t testing.TestingT, awsRegion string, ami...
  function GetAccountsWithLaunchPermissionsForAmi (line 357) | func GetAccountsWithLaunchPermissionsForAmi(t testing.TestingT, awsRegio...
  function GetAccountsWithLaunchPermissionsForAmiE (line 364) | func GetAccountsWithLaunchPermissionsForAmiE(t testing.TestingT, awsRegi...
  function GetLaunchPermissionsForAmiE (line 379) | func GetLaunchPermissionsForAmiE(t testing.TestingT, awsRegion string, a...
  function GetRecommendedInstanceType (line 400) | func GetRecommendedInstanceType(t testing.TestingT, region string, insta...
  function GetRecommendedInstanceTypeE (line 412) | func GetRecommendedInstanceTypeE(t testing.TestingT, region string, inst...
  function GetRecommendedInstanceTypeWithClientE (line 427) | func GetRecommendedInstanceTypeWithClientE(t testing.TestingT, ec2Client...
  function pickRecommendedInstanceTypeE (line 444) | func pickRecommendedInstanceTypeE(availabilityZones []string, instanceTy...
  function instanceTypeExistsInAllAzs (line 457) | func instanceTypeExistsInAllAzs(instanceType string, availabilityZones [...
  function hasOffering (line 473) | func hasOffering(instanceTypeOfferings []types.InstanceTypeOffering, ava...
  function getInstanceTypeOfferingsE (line 485) | func getInstanceTypeOfferingsE(client *ec2.Client, instanceTypeOptions [...
  function getAllAvailabilityZonesE (line 505) | func getAllAvailabilityZonesE(client *ec2.Client) ([]string, error) {
  function NewEc2Client (line 530) | func NewEc2Client(t testing.TestingT, region string) *ec2.Client {
  function NewEc2ClientE (line 537) | func NewEc2ClientE(t testing.TestingT, region string) (*ec2.Client, erro...

FILE: modules/aws/ec2_test.go
  function TestGetEc2InstanceIdsByTag (line 15) | func TestGetEc2InstanceIdsByTag(t *testing.T) {
  function TestGetEc2InstanceIdsByFilters (line 24) | func TestGetEc2InstanceIdsByFilters(t *testing.T) {
  function TestGetRecommendedInstanceType (line 38) | func TestGetRecommendedInstanceType(t *testing.T) {
  function TestPickRecommendedInstanceTypeHappyPath (line 67) | func TestPickRecommendedInstanceTypeHappyPath(t *testing.T) {
  function TestPickRecommendedInstanceTypeErrors (line 134) | func TestPickRecommendedInstanceTypeErrors(t *testing.T) {
  function offerings (line 186) | func offerings(offerings map[string][]string) []types.InstanceTypeOfferi...

FILE: modules/aws/ecr.go
  function CreateECRRepo (line 17) | func CreateECRRepo(t testing.TestingT, region string, name string) *type...
  function CreateECRRepoE (line 24) | func CreateECRRepoE(t testing.TestingT, region string, name string) (*ty...
  function GetECRRepo (line 35) | func GetECRRepo(t testing.TestingT, region string, name string) *types.R...
  function GetECRRepoE (line 43) | func GetECRRepoE(t testing.TestingT, region string, name string) (*types...
  function DeleteECRRepo (line 58) | func DeleteECRRepo(t testing.TestingT, region string, repo *types.Reposi...
  function DeleteECRRepoE (line 64) | func DeleteECRRepoE(t testing.TestingT, region string, repo *types.Repos...
  function NewECRClient (line 89) | func NewECRClient(t testing.TestingT, region string) *ecr.Client {
  function NewECRClientE (line 96) | func NewECRClientE(t testing.TestingT, region string) (*ecr.Client, erro...
  function GetECRRepoLifecyclePolicy (line 106) | func GetECRRepoLifecyclePolicy(t testing.TestingT, region string, repo *...
  function GetECRRepoLifecyclePolicyE (line 113) | func GetECRRepoLifecyclePolicyE(t testing.TestingT, region string, repo ...
  function PutECRRepoLifecyclePolicy (line 124) | func PutECRRepoLifecyclePolicy(t testing.TestingT, region string, repo *...
  function PutECRRepoLifecyclePolicyE (line 130) | func PutECRRepoLifecyclePolicyE(t testing.TestingT, region string, repo ...
  function GetECRRepoPolicy (line 149) | func GetECRRepoPolicy(t testing.TestingT, region string, repo *types.Rep...
  function GetECRRepoPolicyE (line 156) | func GetECRRepoPolicyE(t testing.TestingT, region string, repo *types.Re...
  function PutECRRepoPolicy (line 167) | func PutECRRepoPolicy(t testing.TestingT, region string, repo *types.Rep...
  function PutECRRepoPolicyE (line 173) | func PutECRRepoPolicyE(t testing.TestingT, region string, repo *types.Re...

FILE: modules/aws/ecr_test.go
  function TestEcrRepo (line 14) | func TestEcrRepo(t *testing.T) {
  function TestGetEcrRepoLifecyclePolicyError (line 30) | func TestGetEcrRepoLifecyclePolicyError(t *testing.T) {
  function TestCanSetECRRepoLifecyclePolicyWithSingleRule (line 45) | func TestCanSetECRRepoLifecyclePolicyWithSingleRule(t *testing.T) {
  function TestCanSetRepositoryPolicyWithSimplePolicy (line 79) | func TestCanSetRepositoryPolicyWithSimplePolicy(t *testing.T) {

FILE: modules/aws/ecs.go
  function GetEcsCluster (line 15) | func GetEcsCluster(t testing.TestingT, region string, name string) *type...
  function GetEcsClusterE (line 22) | func GetEcsClusterE(t testing.TestingT, region string, name string) (*ty...
  function GetEcsClusterWithInclude (line 28) | func GetEcsClusterWithInclude(t testing.TestingT, region string, name st...
  function GetEcsClusterWithIncludeE (line 36) | func GetEcsClusterWithIncludeE(t testing.TestingT, region string, name s...
  function GetDefaultEcsClusterE (line 63) | func GetDefaultEcsClusterE(t testing.TestingT, region string) (*types.Cl...
  function GetDefaultEcsCluster (line 68) | func GetDefaultEcsCluster(t testing.TestingT, region string) *types.Clus...
  function CreateEcsCluster (line 73) | func CreateEcsCluster(t testing.TestingT, region string, name string) *t...
  function CreateEcsClusterE (line 80) | func CreateEcsClusterE(t testing.TestingT, region string, name string) (...
  function DeleteEcsCluster (line 91) | func DeleteEcsCluster(t testing.TestingT, region string, cluster *types....
  function DeleteEcsClusterE (line 97) | func DeleteEcsClusterE(t testing.TestingT, region string, cluster *types...
  function GetEcsService (line 106) | func GetEcsService(t testing.TestingT, region string, clusterName string...
  function GetEcsServiceE (line 113) | func GetEcsServiceE(t testing.TestingT, region string, clusterName strin...
  function GetEcsTaskDefinition (line 134) | func GetEcsTaskDefinition(t testing.TestingT, region string, taskDefinit...
  function GetEcsTaskDefinitionE (line 141) | func GetEcsTaskDefinitionE(t testing.TestingT, region string, taskDefini...
  function NewEcsClient (line 152) | func NewEcsClient(t testing.TestingT, region string) *ecs.Client {
  function NewEcsClientE (line 159) | func NewEcsClientE(t testing.TestingT, region string) (*ecs.Client, erro...

FILE: modules/aws/ecs_test.go
  function TestEcsCluster (line 14) | func TestEcsCluster(t *testing.T) {
  function TestEcsClusterWithInclude (line 30) | func TestEcsClusterWithInclude(t *testing.T) {

FILE: modules/aws/errors.go
  type IpForEc2InstanceNotFound (line 8) | type IpForEc2InstanceNotFound struct
    method Error (line 14) | func (err IpForEc2InstanceNotFound) Error() string {
  type HostnameForEc2InstanceNotFound (line 19) | type HostnameForEc2InstanceNotFound struct
    method Error (line 25) | func (err HostnameForEc2InstanceNotFound) Error() string {
  type NotFoundError (line 30) | type NotFoundError struct
    method Error (line 36) | func (err NotFoundError) Error() string {
  function NewNotFoundError (line 40) | func NewNotFoundError(objectType string, objectID string, region string)...
  type AsgCapacityNotMetError (line 45) | type AsgCapacityNotMetError struct
    method Error (line 51) | func (err AsgCapacityNotMetError) Error() string {
  function NewAsgCapacityNotMetError (line 60) | func NewAsgCapacityNotMetError(asgName string, desiredCapacity int64, cu...
  type BucketVersioningNotEnabledError (line 65) | type BucketVersioningNotEnabledError struct
    method Error (line 71) | func (err BucketVersioningNotEnabledError) Error() string {
  function NewBucketVersioningNotEnabledError (line 80) | func NewBucketVersioningNotEnabledError(s3BucketName string, awsRegion s...
  type NoBucketPolicyError (line 85) | type NoBucketPolicyError struct
    method Error (line 91) | func (err NoBucketPolicyError) Error() string {
  function NewNoBucketPolicyError (line 99) | func NewNoBucketPolicyError(s3BucketName string, awsRegion string, bucke...
  type NoInstanceTypeError (line 104) | type NoInstanceTypeError struct
    method Error (line 109) | func (err NoInstanceTypeError) Error() string {
  type NoRdsInstanceTypeError (line 118) | type NoRdsInstanceTypeError struct
    method Error (line 124) | func (err NoRdsInstanceTypeError) Error() string {

FILE: modules/aws/iam.go
  function GetIamCurrentUserName (line 17) | func GetIamCurrentUserName(t testing.TestingT) string {
  function GetIamCurrentUserNameE (line 26) | func GetIamCurrentUserNameE(t testing.TestingT) (string, error) {
  function GetIamCurrentUserArn (line 41) | func GetIamCurrentUserArn(t testing.TestingT) string {
  function GetIamCurrentUserArnE (line 50) | func GetIamCurrentUserArnE(t testing.TestingT) (string, error) {
  function GetIamPolicyDocument (line 65) | func GetIamPolicyDocument(t testing.TestingT, region string, policyARN s...
  function GetIamPolicyDocumentE (line 74) | func GetIamPolicyDocumentE(t testing.TestingT, region string, policyARN ...
  function CreateMfaDevice (line 116) | func CreateMfaDevice(t testing.TestingT, iamClient *iam.Client, deviceNa...
  function CreateMfaDeviceE (line 125) | func CreateMfaDeviceE(t testing.TestingT, iamClient *iam.Client, deviceN...
  function EnableMfaDevice (line 144) | func EnableMfaDevice(t testing.TestingT, iamClient *iam.Client, mfaDevic...
  function EnableMfaDeviceE (line 153) | func EnableMfaDeviceE(t testing.TestingT, iamClient *iam.Client, mfaDevi...
  function NewIamClient (line 192) | func NewIamClient(t testing.TestingT, region string) *iam.Client {
  function NewIamClientE (line 201) | func NewIamClientE(t testing.TestingT, region string) (*iam.Client, erro...

FILE: modules/aws/iam_test.go
  function TestGetIamCurrentUserName (line 15) | func TestGetIamCurrentUserName(t *testing.T) {
  function TestGetIamCurrentUserArn (line 22) | func TestGetIamCurrentUserArn(t *testing.T) {
  function TestGetIAMPolicyDocument (line 29) | func TestGetIAMPolicyDocument(t *testing.T) {

FILE: modules/aws/keypair.go
  type Ec2Keypair (line 14) | type Ec2Keypair struct
  function CreateAndImportEC2KeyPair (line 21) | func CreateAndImportEC2KeyPair(t testing.TestingT, region string, name s...
  function CreateAndImportEC2KeyPairE (line 30) | func CreateAndImportEC2KeyPairE(t testing.TestingT, region string, name ...
  function ImportEC2KeyPair (line 40) | func ImportEC2KeyPair(t testing.TestingT, region string, name string, ke...
  function ImportEC2KeyPairE (line 49) | func ImportEC2KeyPairE(t testing.TestingT, region string, name string, k...
  function DeleteEC2KeyPair (line 71) | func DeleteEC2KeyPair(t testing.TestingT, keyPair *Ec2Keypair) {
  function DeleteEC2KeyPairE (line 79) | func DeleteEC2KeyPairE(t testing.TestingT, keyPair *Ec2Keypair) error {

FILE: modules/aws/keypair_test.go
  function TestCreateImportAndDeleteEC2KeyPair (line 14) | func TestCreateImportAndDeleteEC2KeyPair(t *testing.T) {
  function keyPairExists (line 31) | func keyPairExists(t *testing.T, keyPair *Ec2Keypair) bool {
  function deleteKeyPair (line 49) | func deleteKeyPair(t *testing.T, keyPair *Ec2Keypair) {

FILE: modules/aws/kms.go
  function GetCmkArn (line 13) | func GetCmkArn(t testing.TestingT, region string, cmkID string) string {
  function GetCmkArnE (line 23) | func GetCmkArnE(t testing.TestingT, region string, cmkID string) (string...
  function NewKmsClient (line 41) | func NewKmsClient(t testing.TestingT, region string) *kms.Client {
  function NewKmsClientE (line 50) | func NewKmsClientE(t testing.TestingT, region string) (*kms.Client, erro...

FILE: modules/aws/lambda.go
  type InvocationTypeOption (line 15) | type InvocationTypeOption
    method Value (line 22) | func (itype *InvocationTypeOption) Value() (string, error) {
  constant InvocationTypeRequestResponse (line 18) | InvocationTypeRequestResponse InvocationTypeOption = "RequestResponse"
  constant InvocationTypeDryRun (line 19) | InvocationTypeDryRun                               = "DryRun"
  type LambdaOptions (line 41) | type LambdaOptions struct
  type LambdaOutput (line 57) | type LambdaOutput struct
  function InvokeFunction (line 68) | func InvokeFunction(t testing.TestingT, region, functionName string, pay...
  function InvokeFunctionE (line 75) | func InvokeFunctionE(t testing.TestingT, region, functionName string, pa...
  function InvokeFunctionWithParams (line 107) | func InvokeFunctionWithParams(t testing.TestingT, region, functionName s...
  function InvokeFunctionWithParamsE (line 118) | func InvokeFunctionWithParamsE(t testing.TestingT, region, functionName ...
  type FunctionError (line 165) | type FunctionError struct
    method Error (line 171) | func (err *FunctionError) Error() string {
  function NewLambdaClient (line 176) | func NewLambdaClient(t testing.TestingT, region string) *lambda.Client {
  function NewLambdaClientE (line 183) | func NewLambdaClientE(t testing.TestingT, region string) (*lambda.Client...

FILE: modules/aws/lambda_test.go
  function TestFunctionError (line 9) | func TestFunctionError(t *testing.T) {

FILE: modules/aws/rds.go
  function GetAddressOfRdsInstance (line 18) | func GetAddressOfRdsInstance(t testing.TestingT, dbInstanceID string, aw...
  function GetAddressOfRdsInstanceE (line 27) | func GetAddressOfRdsInstanceE(t testing.TestingT, dbInstanceID string, a...
  function GetPortOfRdsInstance (line 37) | func GetPortOfRdsInstance(t testing.TestingT, dbInstanceID string, awsRe...
  function GetPortOfRdsInstanceE (line 46) | func GetPortOfRdsInstanceE(t testing.TestingT, dbInstanceID string, awsR...
  function GetWhetherSchemaExistsInRdsMySqlInstance (line 56) | func GetWhetherSchemaExistsInRdsMySqlInstance(t testing.TestingT, dbUrl ...
  function GetWhetherSchemaExistsInRdsMySqlInstanceE (line 65) | func GetWhetherSchemaExistsInRdsMySqlInstanceE(t testing.TestingT, dbUrl...
  function GetWhetherSchemaExistsInRdsPostgresInstance (line 85) | func GetWhetherSchemaExistsInRdsPostgresInstance(t testing.TestingT, dbU...
  function GetWhetherSchemaExistsInRdsPostgresInstanceE (line 94) | func GetWhetherSchemaExistsInRdsPostgresInstanceE(t testing.TestingT, db...
  function GetParameterValueForParameterOfRdsInstance (line 115) | func GetParameterValueForParameterOfRdsInstance(t testing.TestingT, para...
  function GetParameterValueForParameterOfRdsInstanceE (line 124) | func GetParameterValueForParameterOfRdsInstanceE(t testing.TestingT, par...
  function GetOptionSettingForOfRdsInstance (line 135) | func GetOptionSettingForOfRdsInstance(t testing.TestingT, optionName str...
  function GetOptionSettingForOfRdsInstanceE (line 144) | func GetOptionSettingForOfRdsInstanceE(t testing.TestingT, optionName st...
  function GetOptionGroupNameOfRdsInstance (line 160) | func GetOptionGroupNameOfRdsInstance(t testing.TestingT, dbInstanceID st...
  function GetOptionGroupNameOfRdsInstanceE (line 169) | func GetOptionGroupNameOfRdsInstanceE(t testing.TestingT, dbInstanceID s...
  function GetOptionsOfOptionGroup (line 178) | func GetOptionsOfOptionGroup(t testing.TestingT, optionGroupName string,...
  function GetOptionsOfOptionGroupE (line 187) | func GetOptionsOfOptionGroupE(t testing.TestingT, optionGroupName string...
  function GetAllParametersOfRdsInstance (line 198) | func GetAllParametersOfRdsInstance(t testing.TestingT, dbInstanceID stri...
  function GetAllParametersOfRdsInstanceE (line 207) | func GetAllParametersOfRdsInstanceE(t testing.TestingT, dbInstanceID str...
  function GetRdsInstanceDetailsE (line 235) | func GetRdsInstanceDetailsE(t testing.TestingT, dbInstanceID string, aws...
  function NewRdsClient (line 246) | func NewRdsClient(t testing.TestingT, region string) *rds.Client {
  function NewRdsClientE (line 255) | func NewRdsClientE(t testing.TestingT, region string) (*rds.Client, erro...
  function GetRecommendedRdsInstanceType (line 267) | func GetRecommendedRdsInstanceType(t testing.TestingT, region string, en...
  function GetRecommendedRdsInstanceTypeE (line 276) | func GetRecommendedRdsInstanceTypeE(t testing.TestingT, region string, e...
  function GetRecommendedRdsInstanceTypeWithClientE (line 288) | func GetRecommendedRdsInstanceTypeWithClientE(t testing.TestingT, rdsCli...
  function instanceTypeExistsForEngineAndRegionE (line 304) | func instanceTypeExistsForEngineAndRegionE(client *rds.Client, engine st...
  function GetValidEngineVersion (line 325) | func GetValidEngineVersion(t testing.TestingT, region string, engine str...
  function GetValidEngineVersionE (line 332) | func GetValidEngineVersionE(t testing.TestingT, region string, engine st...
  type ParameterForDbInstanceNotFound (line 349) | type ParameterForDbInstanceNotFound struct
    method Error (line 355) | func (err ParameterForDbInstanceNotFound) Error() string {
  type OptionGroupOptionSettingForDbInstanceNotFound (line 360) | type OptionGroupOptionSettingForDbInstanceNotFound struct
    method Error (line 367) | func (err OptionGroupOptionSettingForDbInstanceNotFound) Error() string {

FILE: modules/aws/rds_test.go
  function TestGetRecommendedRdsInstanceTypeHappyPath (line 10) | func TestGetRecommendedRdsInstanceTypeHappyPath(t *testing.T) {
  function TestGetRecommendedRdsInstanceTypeErrors (line 68) | func TestGetRecommendedRdsInstanceTypeErrors(t *testing.T) {

FILE: modules/aws/region.go
  constant regionOverrideEnvVarName (line 19) | regionOverrideEnvVarName = "TERRATEST_REGION"
  constant defaultRegion (line 24) | defaultRegion = "us-east-1"
  function GetRandomStableRegion (line 50) | func GetRandomStableRegion(t testing.TestingT, approvedRegions []string,...
  function GetRandomRegion (line 64) | func GetRandomRegion(t testing.TestingT, approvedRegions []string, forbi...
  function GetRandomRegionE (line 75) | func GetRandomRegionE(t testing.TestingT, approvedRegions []string, forb...
  function GetAllAwsRegions (line 100) | func GetAllAwsRegions(t testing.TestingT) []string {
  function GetAllAwsRegionsE (line 109) | func GetAllAwsRegionsE(t testing.TestingT) ([]string, error) {
  function GetAvailabilityZones (line 132) | func GetAvailabilityZones(t testing.TestingT, region string) []string {
  function GetAvailabilityZonesE (line 142) | func GetAvailabilityZonesE(t testing.TestingT, region string) ([]string,...
  function GetRegionsForService (line 164) | func GetRegionsForService(t testing.TestingT, serviceName string) []stri...
  function GetRegionsForServiceE (line 174) | func GetRegionsForServiceE(t testing.TestingT, serviceName string) ([]st...
  function GetRandomRegionForService (line 201) | func GetRandomRegionForService(t testing.TestingT, serviceName string) s...

FILE: modules/aws/region_test.go
  function TestGetRandomRegion (line 10) | func TestGetRandomRegion(t *testing.T) {
  function TestGetRandomRegionExcludesForbiddenRegions (line 17) | func TestGetRandomRegionExcludesForbiddenRegions(t *testing.T) {
  function TestGetAllAwsRegions (line 29) | func TestGetAllAwsRegions(t *testing.T) {
  function assertLooksLikeRegionName (line 41) | func assertLooksLikeRegionName(t *testing.T, regionName string) {
  function TestGetAvailabilityZones (line 45) | func TestGetAvailabilityZones(t *testing.T) {
  function TestGetRandomRegionForService (line 58) | func TestGetRandomRegionForService(t *testing.T) {

FILE: modules/aws/route53.go
  function GetRoute53Record (line 16) | func GetRoute53Record(t *testing.T, hostedZoneID, recordName, recordType...
  function GetRoute53RecordE (line 24) | func GetRoute53RecordE(t *testing.T, hostedZoneID, recordName, recordTyp...
  function NewRoute53Client (line 50) | func NewRoute53Client(t *testing.T, region string) *route53.Client {
  function NewRoute53ClientE (line 58) | func NewRoute53ClientE(t *testing.T, region string) (*route53.Client, er...

FILE: modules/aws/route53_test.go
  function TestRoute53Record (line 16) | func TestRoute53Record(t *testing.T) {

FILE: modules/aws/s3.go
  function FindS3BucketWithTag (line 20) | func FindS3BucketWithTag(t testing.TestingT, awsRegion string, key strin...
  function FindS3BucketWithTagE (line 28) | func FindS3BucketWithTagE(t testing.TestingT, awsRegion string, key stri...
  function GetS3BucketTags (line 69) | func GetS3BucketTags(t testing.TestingT, awsRegion string, bucket string...
  function GetS3BucketTagsE (line 77) | func GetS3BucketTagsE(t testing.TestingT, awsRegion string, bucket strin...
  function GetS3ObjectContents (line 99) | func GetS3ObjectContents(t testing.TestingT, awsRegion string, bucket st...
  function GetS3ObjectContentsE (line 107) | func GetS3ObjectContentsE(t testing.TestingT, awsRegion string, bucket s...
  function PutS3ObjectContents (line 135) | func PutS3ObjectContents(t testing.TestingT, awsRegion string, bucket st...
  function PutS3ObjectContentsE (line 141) | func PutS3ObjectContentsE(t testing.TestingT, awsRegion string, bucket s...
  function CreateS3Bucket (line 158) | func CreateS3Bucket(t testing.TestingT, region string, name string) {
  function CreateS3BucketE (line 164) | func CreateS3BucketE(t testing.TestingT, region string, name string) err...
  function PutS3BucketPolicy (line 188) | func PutS3BucketPolicy(t testing.TestingT, region string, bucketName str...
  function PutS3BucketPolicyE (line 194) | func PutS3BucketPolicyE(t testing.TestingT, region string, bucketName st...
  function PutS3BucketVersioning (line 212) | func PutS3BucketVersioning(t testing.TestingT, region string, bucketName...
  function PutS3BucketVersioningE (line 218) | func PutS3BucketVersioningE(t testing.TestingT, region string, bucketNam...
  function DeleteS3Bucket (line 239) | func DeleteS3Bucket(t testing.TestingT, region string, name string) {
  function DeleteS3BucketE (line 245) | func DeleteS3BucketE(t testing.TestingT, region string, name string) err...
  function EmptyS3Bucket (line 261) | func EmptyS3Bucket(t testing.TestingT, region string, name string) {
  function EmptyS3BucketE (line 267) | func EmptyS3BucketE(t testing.TestingT, region string, name string) error {
  function GetS3BucketLoggingTarget (line 336) | func GetS3BucketLoggingTarget(t testing.TestingT, awsRegion string, buck...
  function GetS3BucketLoggingTargetE (line 345) | func GetS3BucketLoggingTargetE(t testing.TestingT, awsRegion string, buc...
  function GetS3BucketLoggingTargetPrefix (line 367) | func GetS3BucketLoggingTargetPrefix(t testing.TestingT, awsRegion string...
  function GetS3BucketLoggingTargetPrefixE (line 376) | func GetS3BucketLoggingTargetPrefixE(t testing.TestingT, awsRegion strin...
  function GetS3BucketVersioning (line 398) | func GetS3BucketVersioning(t testing.TestingT, awsRegion string, bucket ...
  function GetS3BucketVersioningE (line 406) | func GetS3BucketVersioningE(t testing.TestingT, awsRegion string, bucket...
  function GetS3BucketPolicy (line 423) | func GetS3BucketPolicy(t testing.TestingT, awsRegion string, bucket stri...
  function GetS3BucketPolicyE (line 431) | func GetS3BucketPolicyE(t testing.TestingT, awsRegion string, bucket str...
  function GetS3BucketOwnershipControls (line 447) | func GetS3BucketOwnershipControls(t testing.TestingT, awsRegion, bucket ...
  function GetS3BucketOwnershipControlsE (line 454) | func GetS3BucketOwnershipControlsE(t testing.TestingT, awsRegion, bucket...
  function AssertS3BucketExists (line 475) | func AssertS3BucketExists(t testing.TestingT, region string, name string) {
  function AssertS3BucketExistsE (line 481) | func AssertS3BucketExistsE(t testing.TestingT, region string, name strin...
  function AssertS3BucketVersioningExists (line 495) | func AssertS3BucketVersioningExists(t testing.TestingT, region string, b...
  function AssertS3BucketVersioningExistsE (line 501) | func AssertS3BucketVersioningExistsE(t testing.TestingT, region string, ...
  function AssertS3BucketPolicyExists (line 514) | func AssertS3BucketPolicyExists(t testing.TestingT, region string, bucke...
  function AssertS3BucketPolicyExistsE (line 520) | func AssertS3BucketPolicyExistsE(t testing.TestingT, region string, buck...
  function NewS3Client (line 533) | func NewS3Client(t testing.TestingT, region string) *s3.Client {
  function NewS3ClientE (line 541) | func NewS3ClientE(t testing.TestingT, region string) (*s3.Client, error) {
  function NewS3Uploader (line 551) | func NewS3Uploader(t testing.TestingT, region string) *manager.Uploader {
  function NewS3UploaderE (line 558) | func NewS3UploaderE(t testing.TestingT, region string) (*manager.Uploade...
  type S3AccessLoggingNotEnabledErr (line 568) | type S3AccessLoggingNotEnabledErr struct
    method Error (line 573) | func (err S3AccessLoggingNotEnabledErr) Error() string {

FILE: modules/aws/s3_test.go
  function TestCreateAndDestroyS3Bucket (line 22) | func TestCreateAndDestroyS3Bucket(t *testing.T) {
  function TestAssertS3BucketExistsNoFalseNegative (line 35) | func TestAssertS3BucketExistsNoFalseNegative(t *testing.T) {
  function TestAssertS3BucketExistsNoFalsePositive (line 48) | func TestAssertS3BucketExistsNoFalsePositive(t *testing.T) {
  function TestAssertS3BucketVersioningEnabled (line 64) | func TestAssertS3BucketVersioningEnabled(t *testing.T) {
  function TestEmptyS3Bucket (line 78) | func TestEmptyS3Bucket(t *testing.T) {
  function TestEmptyS3BucketVersioned (line 98) | func TestEmptyS3BucketVersioned(t *testing.T) {
  function TestAssertS3BucketPolicyExists (line 132) | func TestAssertS3BucketPolicyExists(t *testing.T) {
  function TestGetS3BucketTags (line 151) | func TestGetS3BucketTags(t *testing.T) {
  function testEmptyBucket (line 192) | func testEmptyBucket(t *testing.T, s3Client *s3.Client, region string, s...
  function TestGetS3BucketOwnershipControls (line 272) | func TestGetS3BucketOwnershipControls(t *testing.T) {
  function TestS3ObjectContents (line 317) | func TestS3ObjectContents(t *testing.T) {

FILE: modules/aws/secretsmanager.go
  function CreateSecretStringWithDefaultKey (line 14) | func CreateSecretStringWithDefaultKey(t testing.TestingT, awsRegion, des...
  function CreateSecretStringWithDefaultKeyE (line 21) | func CreateSecretStringWithDefaultKeyE(t testing.TestingT, awsRegion, de...
  function GetSecretValue (line 40) | func GetSecretValue(t testing.TestingT, awsRegion, id string) string {
  function GetSecretValueE (line 47) | func GetSecretValueE(t testing.TestingT, awsRegion, id string) (string, ...
  function PutSecretString (line 63) | func PutSecretString(t testing.TestingT, awsRegion, id string, secretStr...
  function PutSecretStringE (line 69) | func PutSecretStringE(t testing.TestingT, awsRegion, id string, secretSt...
  function DeleteSecret (line 83) | func DeleteSecret(t testing.TestingT, awsRegion, id string, forceDelete ...
  function DeleteSecretE (line 89) | func DeleteSecretE(t testing.TestingT, awsRegion, id string, forceDelete...
  function NewSecretsManagerClient (line 103) | func NewSecretsManagerClient(t testing.TestingT, region string) *secrets...
  function NewSecretsManagerClientE (line 110) | func NewSecretsManagerClientE(t testing.TestingT, region string) (*secre...

FILE: modules/aws/secretsmanager_test.go
  function TestSecretsManagerMethods (line 11) | func TestSecretsManagerMethods(t *testing.T) {
  function deleteSecret (line 32) | func deleteSecret(t *testing.T, region, id string) {

FILE: modules/aws/sns.go
  function CreateSnsTopic (line 13) | func CreateSnsTopic(t testing.TestingT, region string, snsTopicName stri...
  function CreateSnsTopicE (line 22) | func CreateSnsTopicE(t testing.TestingT, region string, snsTopicName str...
  function DeleteSNSTopic (line 43) | func DeleteSNSTopic(t testing.TestingT, region string, snsTopicArn strin...
  function DeleteSNSTopicE (line 51) | func DeleteSNSTopicE(t testing.TestingT, region string, snsTopicArn stri...
  function NewSnsClient (line 68) | func NewSnsClient(t testing.TestingT, region string) *sns.Client {
  function NewSnsClientE (line 77) | func NewSnsClientE(t testing.TestingT, region string) (*sns.Client, erro...

FILE: modules/aws/sns_test.go
  function TestCreateAndDeleteSnsTopic (line 15) | func TestCreateAndDeleteSnsTopic(t *testing.T) {
  function snsTopicExists (line 28) | func snsTopicExists(t *testing.T, region string, arn string) bool {
  function deleteTopic (line 43) | func deleteTopic(t *testing.T, region string, arn string) {

FILE: modules/aws/sqs.go
  function CreateRandomQueue (line 18) | func CreateRandomQueue(t testing.TestingT, awsRegion string, prefix stri...
  function CreateRandomQueueE (line 27) | func CreateRandomQueueE(t testing.TestingT, awsRegion string, prefix str...
  function CreateRandomFifoQueue (line 54) | func CreateRandomFifoQueue(t testing.TestingT, awsRegion string, prefix ...
  function CreateRandomFifoQueueE (line 63) | func CreateRandomFifoQueueE(t testing.TestingT, awsRegion string, prefix...
  function DeleteQueue (line 94) | func DeleteQueue(t testing.TestingT, awsRegion string, queueURL string) {
  function DeleteQueueE (line 102) | func DeleteQueueE(t testing.TestingT, awsRegion string, queueURL string)...
  function DeleteMessageFromQueue (line 118) | func DeleteMessageFromQueue(t testing.TestingT, awsRegion string, queueU...
  function DeleteMessageFromQueueE (line 126) | func DeleteMessageFromQueueE(t testing.TestingT, awsRegion string, queue...
  function SendMessageToQueue (line 143) | func SendMessageToQueue(t testing.TestingT, awsRegion string, queueURL s...
  function SendMessageToQueueE (line 151) | func SendMessageToQueueE(t testing.TestingT, awsRegion string, queueURL ...
  function SendMessageFifoToQueue (line 178) | func SendMessageFifoToQueue(t testing.TestingT, awsRegion string, queueU...
  function SendMessageToFifoQueueE (line 186) | func SendMessageToFifoQueueE(t testing.TestingT, awsRegion string, queue...
  type QueueMessageResponse (line 214) | type QueueMessageResponse struct
  function WaitForQueueMessage (line 222) | func WaitForQueueMessage(t testing.TestingT, awsRegion string, queueURL ...
  function NewSqsClient (line 259) | func NewSqsClient(t testing.TestingT, region string) *sqs.Client {
  function NewSqsClientE (line 268) | func NewSqsClientE(t testing.TestingT, region string) (*sqs.Client, erro...
  type ReceiveMessageTimeout (line 278) | type ReceiveMessageTimeout struct
    method Error (line 283) | func (err ReceiveMessageTimeout) Error() string {

FILE: modules/aws/sqs_test.go
  function TestSqsQueueMethods (line 15) | func TestSqsQueueMethods(t *testing.T) {
  function TestFifoSqsQueueMethods (line 42) | func TestFifoSqsQueueMethods(t *testing.T) {
  function queueExists (line 70) | func queueExists(t *testing.T, region string, url string) bool {
  function deleteQueue (line 85) | func deleteQueue(t *testing.T, region string, url string) {

FILE: modules/aws/ssm.go
  function GetParameter (line 19) | func GetParameter(t testing.TestingT, awsRegion string, keyName string) ...
  function GetParameterE (line 26) | func GetParameterE(t testing.TestingT, awsRegion string, keyName string)...
  function GetParameterWithClientE (line 36) | func GetParameterWithClientE(t testing.TestingT, client *ssm.Client, key...
  function PutParameter (line 47) | func PutParameter(t testing.TestingT, awsRegion string, keyName string, ...
  function PutParameterE (line 54) | func PutParameterE(t testing.TestingT, awsRegion string, keyName string,...
  function PutParameterWithClientE (line 63) | func PutParameterWithClientE(t testing.TestingT, client *ssm.Client, key...
  function DeleteParameter (line 78) | func DeleteParameter(t testing.TestingT, awsRegion string, keyName strin...
  function DeleteParameterE (line 84) | func DeleteParameterE(t testing.TestingT, awsRegion string, keyName stri...
  function DeleteParameterWithClientE (line 93) | func DeleteParameterWithClientE(t testing.TestingT, client *ssm.Client, ...
  function NewSsmClient (line 103) | func NewSsmClient(t testing.TestingT, region string) *ssm.Client {
  function NewSsmClientE (line 110) | func NewSsmClientE(t testing.TestingT, region string) (*ssm.Client, erro...
  function WaitForSsmInstanceE (line 120) | func WaitForSsmInstanceE(t testing.TestingT, awsRegion, instanceID strin...
  function WaitForSsmInstanceWithClientE (line 129) | func WaitForSsmInstanceWithClientE(t testing.TestingT, client *ssm.Clien...
  function WaitForSsmInstance (line 161) | func WaitForSsmInstance(t testing.TestingT, awsRegion, instanceID string...
  function CheckSsmCommand (line 167) | func CheckSsmCommand(t testing.TestingT, awsRegion, instanceID, command ...
  type CommandOutput (line 172) | type CommandOutput struct
  function CheckSsmCommandE (line 179) | func CheckSsmCommandE(t testing.TestingT, awsRegion, instanceID, command...
  function CheckSSMCommandWithClientE (line 184) | func CheckSSMCommandWithClientE(t testing.TestingT, client *ssm.Client, ...
  function CheckSsmCommandWithDocument (line 189) | func CheckSsmCommandWithDocument(t testing.TestingT, awsRegion, instance...
  function CheckSsmCommandWithDocumentE (line 196) | func CheckSsmCommandWithDocumentE(t testing.TestingT, awsRegion, instanc...
  function CheckSSMCommandWithClientWithDocumentE (line 208) | func CheckSSMCommandWithClientWithDocumentE(t testing.TestingT, client *...

FILE: modules/aws/ssm_test.go
  function TestParameterIsFound (line 12) | func TestParameterIsFound(t *testing.T) {
  function TestParameterIsDeleted (line 26) | func TestParameterIsDeleted(t *testing.T) {

FILE: modules/aws/vpc.go
  type Vpc (line 18) | type Vpc struct
  type Subnet (line 29) | type Subnet struct
  constant vpcIDFilterName (line 37) | vpcIDFilterName = "vpc-id"
  constant defaultForAzFilterName (line 38) | defaultForAzFilterName = "default-for-az"
  constant resourceTypeFilterName (line 39) | resourceTypeFilterName = "resource-type"
  constant resourceIdFilterName (line 40) | resourceIdFilterName = "resource-id"
  constant vpcResourceTypeFilterValue (line 41) | vpcResourceTypeFilterValue = "vpc"
  constant subnetResourceTypeFilterValue (line 42) | subnetResourceTypeFilterValue = "subnet"
  constant isDefaultFilterName (line 43) | isDefaultFilterName = "isDefault"
  constant isDefaultFilterValue (line 44) | isDefaultFilterValue = "true"
  constant defaultVPCName (line 45) | defaultVPCName = "Default"
  function GetDefaultVpc (line 48) | func GetDefaultVpc(t testing.TestingT, region string) *Vpc {
  function GetDefaultVpcE (line 55) | func GetDefaultVpcE(t testing.TestingT, region string) (*Vpc, error) {
  function GetVpcById (line 68) | func GetVpcById(t testing.TestingT, vpcId string, region string) *Vpc {
  function GetVpcByIdE (line 75) | func GetVpcByIdE(t testing.TestingT, vpcId string, region string) (*Vpc,...
  function GetVpcsE (line 88) | func GetVpcsE(t testing.TestingT, filters []types.Filter, region string)...
  function FindVpcName (line 146) | func FindVpcName(vpc types.Vpc) string {
  function GetSubnetsForVpc (line 161) | func GetSubnetsForVpc(t testing.TestingT, vpcID string, region string) [...
  function GetAzDefaultSubnetsForVpc (line 171) | func GetAzDefaultSubnetsForVpc(t testing.TestingT, vpcID string, region ...
  function generateVpcIdFilter (line 185) | func generateVpcIdFilter(vpcID string) types.Filter {
  function GetSubnetsForVpcE (line 190) | func GetSubnetsForVpcE(t testing.TestingT, region string, filters []type...
  function GetTagsForVpc (line 213) | func GetTagsForVpc(t testing.TestingT, vpcID string, region string) map[...
  function GetTagsForVpcE (line 221) | func GetTagsForVpcE(t testing.TestingT, vpcID string, region string) (ma...
  function GetDefaultSubnetIDsForVpc (line 239) | func GetDefaultSubnetIDsForVpc(t testing.TestingT, vpc Vpc) []string {
  function GetDefaultSubnetIDsForVpcE (line 246) | func GetDefaultSubnetIDsForVpcE(t testing.TestingT, vpc Vpc) ([]string, ...
  function GetTagsForSubnet (line 267) | func GetTagsForSubnet(t testing.TestingT, subnetId string, region string...
  function GetTagsForSubnetE (line 275) | func GetTagsForSubnetE(t testing.TestingT, subnetId string, region strin...
  function IsPublicSubnet (line 293) | func IsPublicSubnet(t testing.TestingT, subnetId string, region string) ...
  function IsPublicSubnetE (line 300) | func IsPublicSubnetE(t testing.TestingT, subnetId string, region string)...
  function getImplicitRouteTableForSubnetE (line 337) | func getImplicitRouteTableForSubnetE(t testing.TestingT, subnetId string...
  function GetRandomPrivateCidrBlock (line 376) | func GetRandomPrivateCidrBlock(routingPrefix int) string {
  function GetFirstTwoOctets (line 442) | func GetFirstTwoOctets(cidrBlock string) string {

FILE: modules/aws/vpc_test.go
  function TestGetDefaultVpc (line 15) | func TestGetDefaultVpc(t *testing.T) {
  function TestGetVpcById (line 26) | func TestGetVpcById(t *testing.T) {
  function TestGetVpcsE (line 38) | func TestGetVpcsE(t *testing.T) {
  function TestGetFirstTwoOctets (line 58) | func TestGetFirstTwoOctets(t *testing.T) {
  function TestIsPublicSubnet (line 67) | func TestIsPublicSubnet(t *testing.T) {
  function TestGetDefaultSubnetIDsForVpc (line 82) | func TestGetDefaultSubnetIDsForVpc(t *testing.T) {
  function TestGetTagsForVpc (line 110) | func TestGetTagsForVpc(t *testing.T) {
  function TestGetTagsForSubnet (line 133) | func TestGetTagsForSubnet(t *testing.T) {
  function TestGetDefaultAzSubnets (line 162) | func TestGetDefaultAzSubnets(t *testing.T) {
  function createPublicRoute (line 174) | func createPublicRoute(t *testing.T, vpcId string, routeTableId string, ...
  function createRouteTable (line 195) | func createRouteTable(t *testing.T, vpcId string, region string) types.R...
  function createSubnet (line 206) | func createSubnet(t *testing.T, vpcId string, routeTableId string, regio...
  function createVpc (line 224) | func createVpc(t *testing.T, region string) types.Vpc {
  function deleteRouteTables (line 235) | func deleteRouteTables(t *testing.T, vpcId string, region string) {
  function deleteSubnets (line 268) | func deleteSubnets(t *testing.T, vpcId string, region string) {
  function deleteInternetGateways (line 284) | func deleteInternetGateways(t *testing.T, vpcId string, region string) {
  function deleteVpc (line 307) | func deleteVpc(t *testing.T, vpcId string, region string) {

FILE: modules/azure/actiongroup.go
  function GetActionGroupResource (line 15) | func GetActionGroupResource(t *testing.T, ruleName string, resGroupName ...
  function GetActionGroupResourceE (line 26) | func GetActionGroupResourceE(ruleName string, resGroupName string, subsc...
  function getActionGroupClient (line 46) | func getActionGroupClient(subscriptionID string) (*insights.ActionGroups...

FILE: modules/azure/actiongroup_test.go
  function TestGetActionGroupResourceEWithMissingResourceGroupName (line 21) | func TestGetActionGroupResourceEWithMissingResourceGroupName(t *testing....
  function TestGetActionGroupResourceEWithInvalidResourceGroupName (line 33) | func TestGetActionGroupResourceEWithInvalidResourceGroupName(t *testing....
  function TestGetActionGroupClient (line 45) | func TestGetActionGroupClient(t *testing.T) {

FILE: modules/azure/aks.go
  function GetManagedClustersClientE (line 11) | func GetManagedClustersClientE(subscriptionID string) (*containerservice...
  function GetManagedClusterE (line 29) | func GetManagedClusterE(t testing.TestingT, resourceGroupName, clusterNa...

FILE: modules/azure/appService.go
  function AppExists (line 13) | func AppExists(t *testing.T, appName string, resourceGroupName string, s...
  function AppExistsE (line 21) | func AppExistsE(appName string, resourceGroupName string, subscriptionID...
  function GetAppService (line 34) | func GetAppService(t *testing.T, appName string, resGroupName string, su...
  function GetAppServiceE (line 42) | func GetAppServiceE(appName string, resGroupName string, subscriptionID ...
  function GetAppServiceClientE (line 62) | func GetAppServiceClientE(subscriptionID string) (*armappservice.WebApps...

FILE: modules/azure/appService_test.go
  function TestAppExistsE (line 20) | func TestAppExistsE(t *testing.T) {
  function TestGetAppServiceE (line 31) | func TestGetAppServiceE(t *testing.T) {
  function TestGetAppServiceClientE (line 42) | func TestGetAppServiceClientE(t *testing.T) {

FILE: modules/azure/authorizer.go
  constant AuthFromEnvClient (line 13) | AuthFromEnvClient = "AZURE_CLIENT_ID"
  constant AuthFromEnvTenant (line 16) | AuthFromEnvTenant = "AZURE_TENANT_ID"
  constant AuthFromFile (line 19) | AuthFromFile = "AZURE_AUTH_LOCATION"
  function NewAuthorizer (line 24) | func NewAuthorizer() (*autorest.Authorizer, error) {

FILE: modules/azure/availabilityset.go
  function AvailabilitySetExists (line 14) | func AvailabilitySetExists(t testing.TestingT, avsName string, resGroupN...
  function AvailabilitySetExistsE (line 21) | func AvailabilitySetExistsE(t testing.TestingT, avsName string, resGroup...
  function CheckAvailabilitySetContainsVM (line 34) | func CheckAvailabilitySetContainsVM(t testing.TestingT, vmName string, a...
  function CheckAvailabilitySetContainsVME (line 41) | func CheckAvailabilitySetContainsVME(t testing.TestingT, vmName string, ...
  function GetAvailabilitySetVMNamesInCaps (line 66) | func GetAvailabilitySetVMNamesInCaps(t testing.TestingT, avsName string,...
  function GetAvailabilitySetVMNamesInCapsE (line 73) | func GetAvailabilitySetVMNamesInCapsE(t testing.TestingT, avsName string...
  function GetAvailabilitySetFaultDomainCount (line 99) | func GetAvailabilitySetFaultDomainCount(t testing.TestingT, avsName stri...
  function GetAvailabilitySetFaultDomainCountE (line 106) | func GetAvailabilitySetFaultDomainCountE(t testing.TestingT, avsName str...
  function GetAvailabilitySetE (line 115) | func GetAvailabilitySetE(t testing.TestingT, avsName string, resGroupNam...
  function GetAvailabilitySetClientE (line 139) | func GetAvailabilitySetClientE(subscriptionID string) (*compute.Availabi...

FILE: modules/azure/availabilityset_test.go
  function TestCreateAvailabilitySetClientE (line 21) | func TestCreateAvailabilitySetClientE(t *testing.T) {
  function TestGetAvailabilitySetE (line 32) | func TestGetAvailabilitySetE(t *testing.T) {
  function TestCheckAvailabilitySetContainsVME (line 44) | func TestCheckAvailabilitySetContainsVME(t *testing.T) {
  function TestGetAvailabilitySetVMNamesInCapsE (line 57) | func TestGetAvailabilitySetVMNamesInCapsE(t *testing.T) {
  function TestGetAvailabilitySetFaultDomainCountE (line 69) | func TestGetAvailabilitySetFaultDomainCountE(t *testing.T) {
  function TestAvailabilitySetExistsE (line 81) | func TestAvailabilitySetExistsE(t *testing.T) {

FILE: modules/azure/client_factory.go
  constant AzureEnvironmentEnvName (line 58) | AzureEnvironmentEnvName = "AZURE_ENVIRONMENT"
  constant ResourceManagerEndpointName (line 61) | ResourceManagerEndpointName = "ResourceManagerEndpoint"
  type ClientType (line 65) | type ClientType
  function CreateSubscriptionsClientE (line 69) | func CreateSubscriptionsClientE() (subscriptions.Client, error) {
  function CreateVirtualMachinesClientE (line 84) | func CreateVirtualMachinesClientE(subscriptionID string) (*compute.Virtu...
  function CreateManagedClustersClientE (line 107) | func CreateManagedClustersClientE(subscriptionID string) (containerservi...
  function CreateCosmosDBAccountClientE (line 126) | func CreateCosmosDBAccountClientE(subscriptionID string) (*documentdb.Da...
  function CreateCosmosDBSQLClientE (line 147) | func CreateCosmosDBSQLClientE(subscriptionID string) (*documentdb.SQLRes...
  function getArmKeyVaultClientFactory (line 167) | func getArmKeyVaultClientFactory(subscriptionID string) (*armkeyvault.Cl...
  function getArmPostgreSQLClientFactory (line 192) | func getArmPostgreSQLClientFactory(subscriptionID string) (*armpostgresq...
  function CreateStorageAccountClientE (line 217) | func CreateStorageAccountClientE(subscriptionID string) (*storage.Accoun...
  function CreateStorageBlobContainerClientE (line 240) | func CreateStorageBlobContainerClientE(subscriptionID string) (*storage....
  function CreateStorageFileSharesClientE (line 262) | func CreateStorageFileSharesClientE(subscriptionID string) (*storage.Fil...
  function CreateAvailabilitySetClientE (line 284) | func CreateAvailabilitySetClientE(subscriptionID string) (*compute.Avail...
  function CreateResourceGroupClientE (line 311) | func CreateResourceGroupClientE(subscriptionID string) (*resources.Group...
  function CreateSQLServerClient (line 334) | func CreateSQLServerClient(subscriptionID string) (*armsql.ServersClient...
  function CreateSQLMangedInstanceClient (line 343) | func CreateSQLMangedInstanceClient(subscriptionID string) (*armsql.Manag...
  function CreateSQLMangedDatabasesClient (line 352) | func CreateSQLMangedDatabasesClient(subscriptionID string) (*armsql.Mana...
  function getArmSQLClientFactory (line 361) | func getArmSQLClientFactory(subscriptionID string) (*armsql.ClientFactor...
  function CreateDatabaseClient (line 386) | func CreateDatabaseClient(subscriptionID string) (*armsql.DatabasesClien...
  function CreateMySQLServerClientE (line 395) | func CreateMySQLServerClientE(subscriptionID string) (*armmysql.ServersC...
  function getArmMySQLClientFactory (line 404) | func getArmMySQLClientFactory(subscriptionID string) (*armmysql.ClientFa...
  function CreateDisksClientE (line 429) | func CreateDisksClientE(subscriptionID string) (*compute.DisksClient, er...
  function CreateActionGroupClient (line 456) | func CreateActionGroupClient(subscriptionID string) (*insights.ActionGro...
  function CreateVMInsightsClientE (line 481) | func CreateVMInsightsClientE(subscriptionID string) (*insights.VMInsight...
  function CreateActivityLogAlertsClientE (line 507) | func CreateActivityLogAlertsClientE(subscriptionID string) (*insights.Ac...
  function CreateDiagnosticsSettingsClientE (line 535) | func CreateDiagnosticsSettingsClientE(subscriptionID string) (*insights....
  function CreateNsgDefaultRulesClientE (line 562) | func CreateNsgDefaultRulesClientE(subscriptionID string) (*network.Defau...
  function CreateNsgCustomRulesClientE (line 582) | func CreateNsgCustomRulesClientE(subscriptionID string) (*network.Securi...
  function CreateNewNetworkInterfacesClientE (line 602) | func CreateNewNetworkInterfacesClientE(subscriptionID string) (*network....
  function CreateNewNetworkInterfaceIPConfigurationClientE (line 622) | func CreateNewNetworkInterfaceIPConfigurationClientE(subscriptionID stri...
  function CreatePublicIPAddressesClientE (line 642) | func CreatePublicIPAddressesClientE(subscriptionID string) (*network.Pub...
  function CreateLoadBalancerClientE (line 662) | func CreateLoadBalancerClientE(subscriptionID string) (*network.LoadBala...
  function CreateNewSubnetClientE (line 682) | func CreateNewSubnetClientE(subscriptionID string) (*network.SubnetsClie...
  function CreateNewVirtualNetworkClientE (line 702) | func CreateNewVirtualNetworkClientE(subscriptionID string) (*network.Vir...
  function CreateAppServiceClientE (line 722) | func CreateAppServiceClientE(subscriptionID string) (*armappservice.WebA...
  function getArmAppServiceClientFactory (line 731) | func getArmAppServiceClientFactory(subscriptionID string) (*armappservic...
  function CreateContainerRegistryClientE (line 757) | func CreateContainerRegistryClientE(subscriptionID string) (*containerre...
  function CreateContainerInstanceClientE (line 777) | func CreateContainerInstanceClientE(subscriptionID string) (*containerin...
  function CreateFrontDoorClientE (line 797) | func CreateFrontDoorClientE(subscriptionID string) (*frontdoor.FrontDoor...
  function CreateFrontDoorFrontendEndpointClientE (line 817) | func CreateFrontDoorFrontendEndpointClientE(subscriptionID string) (*fro...
  function CreateSynapseWorkspaceClientE (line 836) | func CreateSynapseWorkspaceClientE(subscriptionID string) (*armsynapse.W...
  function CreateSynapseSqlPoolClientE (line 845) | func CreateSynapseSqlPoolClientE(subscriptionID string) (*armsynapse.SQL...
  function getArmSynapseClientFactory (line 854) | func getArmSynapseClientFactory(subscriptionID string) (*armsynapse.Clie...
  function CreateDataFactoriesClientE (line 879) | func CreateDataFactoriesClientE(subscriptionID string) (*armdatafactory....
  function CreatePrivateDnsZonesClientE (line 888) | func CreatePrivateDnsZonesClientE(subscriptionID string) (*privatedns.Pr...
  function CreateManagedEnvironmentsClientE (line 916) | func CreateManagedEnvironmentsClientE(subscriptionID string) (*armappcon...
  function CreateResourceGroupClientV2E (line 925) | func CreateResourceGroupClientV2E(subscriptionID string) (*armresources....
  function CreateContainerAppsClientE (line 933) | func CreateContainerAppsClientE(subscriptionID string) (*armappcontainer...
  function CreateContainerAppJobsClientE (line 942) | func CreateContainerAppJobsClientE(subscriptionID string) (*armappcontai...
  function GetKeyVaultURISuffixE (line 953) | func GetKeyVaultURISuffixE() (string, error) {
  function getDefaultEnvironmentName (line 963) | func getDefaultEnvironmentName() string {
  function getEnvironmentEndpointE (line 974) | func getEnvironmentEndpointE(endpointName string) (string, error) {
  function getFieldValue (line 984) | func getFieldValue(env *autorestAzure.Environment, field string) string {
  function getBaseURI (line 991) | func getBaseURI() (string, error) {
  function getArmResourcesClientFactory (line 1001) | func getArmResourcesClientFactory(subscriptionID string) (*armresources....
  function getArmAppContainersClientFactory (line 1026) | func getArmAppContainersClientFactory(subscriptionID string) (*armappcon...
  function getArmDataFactoryClientFactory (line 1051) | func getArmDataFactoryClientFactory(subscriptionID string) (*armdatafact...
  function getClientCloudConfig (line 1075) | func getClientCloudConfig() (cloud.Configuration, error) {

FILE: modules/azure/client_factory_test.go
  constant govCloudEnvName (line 19) | govCloudEnvName = "AzureUSGovernmentCloud"
  constant publicCloudEnvName (line 20) | publicCloudEnvName = "AzurePublicCloud"
  constant chinaCloudEnvName (line 21) | chinaCloudEnvName = "AzureChinaCloud"
  constant germanyCloudEnvName (line 22) | germanyCloudEnvName = "AzureGermanCloud"
  function TestDefaultEnvIsPublicWhenNotSet (line 24) | func TestDefaultEnvIsPublicWhenNotSet(t *testing.T) {
  function TestDefaultEnvSetToGov (line 39) | func TestDefaultEnvSetToGov(t *testing.T) {
  function TestSubscriptionClientBaseURISetCorrectly (line 54) | func TestSubscriptionClientBaseURISetCorrectly(t *testing.T) {
  function TestVMClientBaseURISetCorrectly (line 90) | func TestVMClientBaseURISetCorrectly(t *testing.T) {
  function TestManagedClustersClientBaseURISetCorrectly (line 126) | func TestManagedClustersClientBaseURISetCorrectly(t *testing.T) {
  function TestCosmosDBAccountClientBaseURISetCorrectly (line 160) | func TestCosmosDBAccountClientBaseURISetCorrectly(t *testing.T) {
  function TestCosmosDBSQLClientBaseURISetCorrectly (line 194) | func TestCosmosDBSQLClientBaseURISetCorrectly(t *testing.T) {
  function TestPublicIPAddressesClientBaseURISetCorrectly (line 227) | func TestPublicIPAddressesClientBaseURISetCorrectly(t *testing.T) {
  function TestLoadBalancerClientBaseURISetCorrectly (line 260) | func TestLoadBalancerClientBaseURISetCorrectly(t *testing.T) {
  function TestFrontDoorClientBaseURISetCorrectly (line 294) | func TestFrontDoorClientBaseURISetCorrectly(t *testing.T) {
  function TestFrontDoorFrontendEndpointClientBaseURISetCorrectly (line 328) | func TestFrontDoorFrontendEndpointClientBaseURISetCorrectly(t *testing.T) {
  function TestCreateManagedEnvironmentsClientEEndpointURISetCorrectly (line 362) | func TestCreateManagedEnvironmentsClientEEndpointURISetCorrectly(t *test...
  function TestCreateContainerAppsClientEEndpointURISetCorrectly (line 407) | func TestCreateContainerAppsClientEEndpointURISetCorrectly(t *testing.T) {
  function TestCreateContainerAppJobsClientEEndpointURISetCorrectly (line 452) | func TestCreateContainerAppJobsClientEEndpointURISetCorrectly(t *testing...

FILE: modules/azure/common.go
  constant AzureSubscriptionID (line 10) | AzureSubscriptionID = "ARM_SUBSCRIPTION_ID"
  constant AzureResGroupName (line 13) | AzureResGroupName = "AZURE_RES_GROUP_NAME"
  function GetTargetAzureSubscription (line 18) | func GetTargetAzureSubscription(subscriptionID string) (string, error) {
  function getTargetAzureSubscription (line 22) | func getTargetAzureSubscription(subscriptionID string) (string, error) {
  function GetTargetAzureResourceGroupName (line 36) | func GetTargetAzureResourceGroupName(resourceGroupName string) (string, ...
  function getTargetAzureResourceGroupName (line 40) | func getTargetAzureResourceGroupName(resourceGroupName string) (string, ...
  function safePtrToString (line 53) | func safePtrToString(raw *string) string {
  function safePtrToInt32 (line 61) | func safePtrToInt32(raw *int32) int32 {
  function safePtrToList (line 69) | func safePtrToList(raw *[]string) []string {

FILE: modules/azure/common_test.go
  function TestGetTargetAzureSubscription (line 17) | func TestGetTargetAzureSubscription(t *testing.T) {
  function TestGetTargetAzureResourceGroupName (line 50) | func TestGetTargetAzureResourceGroupName(t *testing.T) {
  function TestSafePtrToString (line 80) | func TestSafePtrToString(t *testing.T) {
  function TestSafePtrToInt32 (line 92) | func TestSafePtrToInt32(t *testing.T) {

FILE: modules/azure/compute.go
  function GetVirtualMachineClient (line 12) | func GetVirtualMachineClient(t testing.TestingT, subscriptionID string) ...
  function GetVirtualMachineClientE (line 19) | func GetVirtualMachineClientE(subscriptionID string) (*compute.VirtualMa...
  function VirtualMachineExists (line 42) | func VirtualMachineExists(t testing.TestingT, vmName string, resGroupNam...
  function VirtualMachineExistsE (line 49) | func VirtualMachineExistsE(vmName string, resGroupName string, subscript...
  function GetVirtualMachineNics (line 63) | func GetVirtualMachineNics(t testing.TestingT, vmName string, resGroupNa...
  function GetVirtualMachineNicsE (line 71) | func GetVirtualMachineNicsE(vmName string, resGroupName string, subscrip...
  function GetVirtualMachineManagedDisks (line 95) | func GetVirtualMachineManagedDisks(t testing.TestingT, vmName string, re...
  function GetVirtualMachineManagedDisksE (line 103) | func GetVirtualMachineManagedDisksE(vmName string, resGroupName string, ...
  function GetVirtualMachineOSDiskName (line 126) | func GetVirtualMachineOSDiskName(t testing.TestingT, vmName string, resG...
  function GetVirtualMachineOSDiskNameE (line 134) | func GetVirtualMachineOSDiskNameE(vmName string, resGroupName string, su...
  function GetVirtualMachineAvailabilitySetID (line 146) | func GetVirtualMachineAvailabilitySetID(t testing.TestingT, vmName strin...
  function GetVirtualMachineAvailabilitySetIDE (line 154) | func GetVirtualMachineAvailabilitySetIDE(vmName string, resGroupName str...
  type VMImage (line 176) | type VMImage struct
  function GetVirtualMachineImage (line 185) | func GetVirtualMachineImage(t testing.TestingT, vmName string, resGroupN...
  function GetVirtualMachineImageE (line 193) | func GetVirtualMachineImageE(vmName string, resGroupName string, subscri...
  function GetSizeOfVirtualMachine (line 213) | func GetSizeOfVirtualMachine(t testing.TestingT, vmName string, resGroup...
  function GetSizeOfVirtualMachineE (line 221) | func GetSizeOfVirtualMachineE(vmName string, resGroupName string, subscr...
  function GetVirtualMachineTags (line 233) | func GetVirtualMachineTags(t testing.TestingT, vmName string, resGroupNa...
  function GetVirtualMachineTagsE (line 241) | func GetVirtualMachineTagsE(vmName string, resGroupName string, subscrip...
  function ListVirtualMachinesForResourceGroup (line 265) | func ListVirtualMachinesForResourceGroup(t testing.TestingT, resGroupNam...
  function ListVirtualMachinesForResourceGroupE (line 272) | func ListVirtualMachinesForResourceGroupE(resourceGroupName string, subs...
  function GetVirtualMachinesForResourceGroup (line 294) | func GetVirtualMachinesForResourceGroup(t testing.TestingT, resGroupName...
  function GetVirtualMachinesForResourceGroupE (line 302) | func GetVirtualMachinesForResourceGroupE(resourceGroupName string, subsc...
  type Instance (line 329) | type Instance struct
    method GetVirtualMachineInstanceSize (line 334) | func (vm *Instance) GetVirtualMachineInstanceSize() compute.VirtualMac...
  function GetVirtualMachine (line 344) | func GetVirtualMachine(t testing.TestingT, vmName string, resGroupName s...
  function GetVirtualMachineE (line 351) | func GetVirtualMachineE(vmName string, resGroupName string, subscription...

FILE: modules/azure/compute_test.go
  function TestGetVirtualMachineE (line 20) | func TestGetVirtualMachineE(t *testing.T) {
  function TestListVirtualMachinesForResourceGroupE (line 32) | func TestListVirtualMachinesForResourceGroupE(t *testing.T) {
  function TestGetVirtualMachinesForResourceGroupE (line 43) | func TestGetVirtualMachinesForResourceGroupE(t *testing.T) {
  function TestGetVirtualMachineTagsE (line 54) | func TestGetVirtualMachineTagsE(t *testing.T) {
  function TestGetSizeOfVirtualMachineE (line 66) | func TestGetSizeOfVirtualMachineE(t *testing.T) {
  function TestGetVirtualMachineImageE (line 78) | func TestGetVirtualMachineImageE(t *testing.T) {
  function TestGetVirtualMachineAvailabilitySetIDE (line 90) | func TestGetVirtualMachineAvailabilitySetIDE(t *testing.T) {
  function TestGetVirtualMachineOSDiskNameE (line 102) | func TestGetVirtualMachineOSDiskNameE(t *testing.T) {
  function TestGetVirtualMachineManagedDisksE (line 114) | func TestGetVirtualMachineManagedDisksE(t *testing.T) {
  function TestGetVirtualMachineNicsE (line 126) | func TestGetVirtualMachineNicsE(t *testing.T) {
  function TestVirtualMachineExistsE (line 138) | func TestVirtualMachineExistsE(t *testing.T) {

FILE: modules/azure/container_apps.go
  function ManagedEnvironmentExists (line 13) | func ManagedEnvironmentExists(t *testing.T, environmentName string, reso...
  function ManagedEnvironmentExistsE (line 20) | func ManagedEnvironmentExistsE(environmentName string, resourceGroupName...
  function GetManagedEnvironment (line 34) | func GetManagedEnvironment(t *testing.T, environmentName string, resourc...
  function GetManagedEnvironmentE (line 41) | func GetManagedEnvironmentE(environmentName string, resourceGroupName st...
  function ContainerAppExists (line 55) | func ContainerAppExists(t *testing.T, containerAppName string, resourceG...
  function ContainerAppExistsE (line 62) | func ContainerAppExistsE(containerAppName string, resourceGroupName stri...
  function GetContainerApp (line 76) | func GetContainerApp(t *testing.T, containerAppName string, resourceGrou...
  function GetContainerAppE (line 83) | func GetContainerAppE(environmentName string, resourceGroupName string, ...
  function ContainerAppJobExists (line 97) | func ContainerAppJobExists(t *testing.T, containerAppName string, resour...
  function ContainerAppJobExistsE (line 104) | func ContainerAppJobExistsE(containerAppName string, resourceGroupName s...
  function GetContainerAppJob (line 118) | func GetContainerAppJob(t *testing.T, containerAppName string, resourceG...
  function GetContainerAppJobE (line 125) | func GetContainerAppJobE(environmentName string, resourceGroupName strin...

FILE: modules/azure/container_apps_test.go
  function TestManagedEnvironmentExists (line 20) | func TestManagedEnvironmentExists(t *testing.T) {
  function TestGetManagedEnvironmentE (line 31) | func TestGetManagedEnvironmentE(t *testing.T) {
  function TestContainerAppExists (line 42) | func TestContainerAppExists(t *testing.T) {
  function TestGetContainerAppE (line 53) | func TestGetContainerAppE(t *testing.T) {
  function TestContainerAppJobExists (line 64) | func TestContainerAppJobExists(t *testing.T) {
  function TestGetContainerJobAppE (line 75) | func TestGetContainerJobAppE(t *testing.T) {

FILE: modules/azure/containers.go
  function ContainerRegistryExists (line 15) | func ContainerRegistryExists(t *testing.T, registryName string, resource...
  function ContainerRegistryExistsE (line 23) | func ContainerRegistryExistsE(registryName string, resourceGroupName str...
  function GetContainerRegistry (line 36) | func GetContainerRegistry(t *testing.T, registryName string, resGroupNam...
  function GetContainerRegistryE (line 45) | func GetContainerRegistryE(registryName string, resGroupName string, sub...
  function GetContainerRegistryClientE (line 65) | func GetContainerRegistryClientE(subscriptionID string) (*containerregis...
  function ContainerInstanceExists (line 85) | func ContainerInstanceExists(t *testing.T, instanceName string, resource...
  function ContainerInstanceExistsE (line 93) | func ContainerInstanceExistsE(instanceName string, resourceGroupName str...
  function GetContainerInstance (line 106) | func GetContainerInstance(t *testing.T, instanceName string, resGroupNam...
  function GetContainerInstanceE (line 115) | func GetContainerInstanceE(instanceName string, resGroupName string, sub...
  function GetContainerInstanceClientE (line 135) | func GetContainerInstanceClientE(subscriptionID string) (*containerinsta...

FILE: modules/azure/containers_test.go
  function TestContainerRegistryExistsE (line 20) | func TestContainerRegistryExistsE(t *testing.T) {
  function TestGetContainerRegistryE (line 31) | func TestGetContainerRegistryE(t *testing.T) {
  function TestGetContainerRegistryClientE (line 42) | func TestGetContainerRegistryClientE(t *testing.T) {
  function TestContainerInstanceExistsE (line 51) | func TestContainerInstanceExistsE(t *testing.T) {
  function TestGetContainerInstanceE (line 62) | func TestGetContainerInstanceE(t *testing.T) {
  function TestGetContainerInstanceClientE (line 73) | func TestGetContainerInstanceClientE(t *testing.T) {

FILE: modules/azure/cosmosdb.go
  function GetCosmosDBAccountClientE (line 12) | func GetCosmosDBAccountClientE(subscriptionID string) (*documentdb.Datab...
  function GetCosmosDBAccountClient (line 33) | func GetCosmosDBAccountClient(t testing.TestingT, subscriptionID string)...
  function GetCosmosDBAccount (line 41) | func GetCosmosDBAccount(t testing.TestingT, subscriptionID string, resou...
  function GetCosmosDBAccountE (line 49) | func GetCosmosDBAccountE(t testing.TestingT, subscriptionID string, reso...
  function GetCosmosDBSQLClientE (line 67) | func GetCosmosDBSQLClientE(subscriptionID string) (*documentdb.SQLResour...
  function GetCosmosDBSQLClient (line 88) | func GetCosmosDBSQLClient(t testing.TestingT, subscriptionID string) *do...
  function GetCosmosDBSQLDatabase (line 96) | func GetCosmosDBSQLDatabase(t testing.TestingT, subscriptionID string, r...
  function GetCosmosDBSQLDatabaseE (line 104) | func GetCosmosDBSQLDatabaseE(t testing.TestingT, subscriptionID string, ...
  function GetCosmosDBSQLContainer (line 122) | func GetCosmosDBSQLContainer(t testing.TestingT, subscriptionID string, ...
  function GetCosmosDBSQLContainerE (line 130) | func GetCosmosDBSQLContainerE(t testing.TestingT, subscriptionID string,...
  function GetCosmosDBSQLDatabaseThroughput (line 148) | func GetCosmosDBSQLDatabaseThroughput(t testing.TestingT, subscriptionID...
  function GetCosmosDBSQLDatabaseThroughputE (line 156) | func GetCosmosDBSQLDatabaseThroughputE(t testing.TestingT, subscriptionI...
  function GetCosmosDBSQLContainerThroughput (line 174) | func GetCosmosDBSQLContainerThroughput(t testing.TestingT, subscriptionI...
  function GetCosmosDBSQLContainerThroughputE (line 182) | func GetCosmosDBSQLContainerThroughputE(t testing.TestingT, subscription...

FILE: modules/azure/datafactory.go
  function DataFactoryExists (line 13) | func DataFactoryExists(t testing.TestingT, dataFactoryName string, resou...
  function DataFactoryExistsE (line 20) | func DataFactoryExistsE(dataFactoryName string, resourceGroupName string...
  function GetDataFactory (line 33) | func GetDataFactory(t testing.TestingT, resGroupName string, factoryName...
  function GetDataFactoryE (line 41) | func GetDataFactoryE(subscriptionID string, resGroupName string, factory...

FILE: modules/azure/datafactory_test.go
  function TestDataFactoryExists (line 13) | func TestDataFactoryExists(t *testing.T) {
  function TestGetDataFactoryE (line 26) | func TestGetDataFactoryE(t *testing.T) {

FILE: modules/azure/disk.go
  function DiskExists (line 13) | func DiskExists(t testing.TestingT, diskName string, resGroupName string...
  function DiskExistsE (line 20) | func DiskExistsE(diskName string, resGroupName string, subscriptionID st...
  function GetDisk (line 34) | func GetDisk(t testing.TestingT, diskName string, resGroupName string, s...
  function GetDiskE (line 41) | func GetDiskE(diskName string, resGroupName string, subscriptionID strin...
  function GetDiskClientE (line 65) | func GetDiskClientE(subscriptionID string) (*compute.DisksClient, error) {

FILE: modules/azure/disk_test.go
  function TestGetDiskE (line 15) | func TestGetDiskE(t *testing.T) {

FILE: modules/azure/enums.go
  type LoadBalancerIPType (line 4) | type LoadBalancerIPType
  constant PublicIP (line 8) | PublicIP  LoadBalancerIPType = "PublicIP"
  constant PrivateIP (line 9) | PrivateIP LoadBalancerIPType = "PrivateIP"
  constant NoIP (line 10) | NoIP      LoadBalancerIPType = "NoIP"

FILE: modules/azure/errors.go
  type SubscriptionIDNotFound (line 11) | type SubscriptionIDNotFound struct
    method Error (line 13) | func (err SubscriptionIDNotFound) Error() string {
  type ResourceGroupNameNotFound (line 18) | type ResourceGroupNameNotFound struct
    method Error (line 20) | func (err ResourceGroupNameNotFound) Error() string {
  type FailedToParseError (line 25) | type FailedToParseError struct
    method Error (line 30) | func (err FailedToParseError) Error() string {
  function NewFailedToParseError (line 35) | func NewFailedToParseError(objectType string, objectID string) FailedToP...
  type NotFoundError (line 40) | type NotFoundError struct
    method Error (line 46) | func (err NotFoundError) Error() string {
  function NewNotFoundError (line 57) | func NewNotFoundError(objectType string, objectID string, region string)...
  function ResourceNotFoundErrorExists (line 62) | func ResourceNotFoundErrorExists(err error) bool {

FILE: modules/azure/frontdoor.go
  function FrontDoorExists (line 13) | func FrontDoorExists(t testing.TestingT, frontDoorName string, resourceG...
  function GetFrontDoor (line 21) | func GetFrontDoor(t testing.TestingT, frontDoorName string, resourceGrou...
  function FrontDoorFrontendEndpointExists (line 29) | func FrontDoorFrontendEndpointExists(t testing.TestingT, endpointName st...
  function GetFrontDoorFrontendEndpoint (line 37) | func GetFrontDoorFrontendEndpoint(t testing.TestingT, endpointName strin...
  function FrontDoorExistsE (line 44) | func FrontDoorExistsE(frontDoorName string, resourceGroupName string, su...
  function FrontDoorFrontendEndpointExistsE (line 56) | func FrontDoorFrontendEndpointExistsE(endpointName string, frontDoorName...
  function GetFrontDoorE (line 68) | func GetFrontDoorE(frontDoorName, resourceGroupName, subscriptionID stri...
  function GetFrontDoorFrontendEndpointE (line 83) | func GetFrontDoorFrontendEndpointE(endpointName, frontDoorName, resource...
  function GetFrontDoorClientE (line 98) | func GetFrontDoorClientE(subscriptionID string) (*frontdoor.FrontDoorsCl...
  function GetFrontDoorFrontendEndpointClientE (line 114) | func GetFrontDoorFrontendEndpointClientE(subscriptionID string) (*frontd...

FILE: modules/azure/frontdoor_test.go
  function TestFrontDoorExists (line 20) | func TestFrontDoorExists(t *testing.T) {
  function TestGetFrontDoor (line 33) | func TestGetFrontDoor(t *testing.T) {
  function TestFrontDoorFrontendEndpointExists (line 46) | func TestFrontDoorFrontendEndpointExists(t *testing.T) {
  function TestGetFrontDoorFrontendEndpoint (line 60) | func TestGetFrontDoorFrontendEndpoint(t *testing.T) {

FILE: modules/azure/keyvault.go
  function NewAzureCredentialE (line 17) | func NewAzureCredentialE() (*azidentity.DefaultAzureCredential, error) {
  function KeyVaultSecretExists (line 23) | func KeyVaultSecretExists(t *testing.T, keyVaultName string, secretName ...
  function KeyVaultKeyExists (line 31) | func KeyVaultKeyExists(t *testing.T, keyVaultName string, keyName string...
  function KeyVaultCertificateExists (line 39) | func KeyVaultCertificateExists(t *testing.T, keyVaultName string, certif...
  function KeyVaultCertificateExistsE (line 46) | func KeyVaultCertificateExistsE(keyVaultName, certificateName string) (b...
  function KeyVaultKeyExistsE (line 67) | func KeyVaultKeyExistsE(keyVaultName, keyName string) (bool, error) {
  function KeyVaultSecretExistsE (line 88) | func KeyVaultSecretExistsE(keyVaultName, secretName string) (bool, error) {
  function GetKeyVaultSecretsClientE (line 109) | func GetKeyVaultSecretsClientE(keyVaultName string) (*azsecrets.Client, ...
  function GetKeyVaultKeysClientE (line 125) | func GetKeyVaultKeysClientE(keyVaultName string) (*azkeys.Client, error) {
  function GetKeyVaultCertificatesClientE (line 141) | func GetKeyVaultCertificatesClientE(keyVaultName string) (*azcertificate...
  function GetKeyVault (line 158) | func GetKeyVault(t *testing.T, resGroupName string, keyVaultName string,...
  function GetKeyVaultE (line 166) | func GetKeyVaultE(t *testing.T, resGroupName string, keyVaultName string...
  function GetKeyVaultManagementClientE (line 183) | func GetKeyVaultManagementClientE(subscriptionID string) (*armkeyvault.V...

FILE: modules/azure/keyvault_test.go
  function TestKeyVaultSecretExists (line 14) | func TestKeyVaultSecretExists(t *testing.T) {
  function TestKeyVaultKeyExists (line 23) | func TestKeyVaultKeyExists(t *testing.T) {
  function TestKeyVaultCertificateExists (line 32) | func TestKeyVaultCertificateExists(t *testing.T) {
  function TestGetKeyVault (line 41) | func TestGetKeyVault(t *testing.T) {

FILE: modules/azure/loadbalancer.go
  function LoadBalancerExists (line 13) | func LoadBalancerExists(t testing.TestingT, loadBalancerName string, res...
  function LoadBalancerExistsE (line 20) | func LoadBalancerExistsE(loadBalancerName string, resourceGroupName stri...
  function GetLoadBalancerFrontendIPConfigNames (line 33) | func GetLoadBalancerFrontendIPConfigNames(t testing.TestingT, loadBalanc...
  function GetLoadBalancerFrontendIPConfigNamesE (line 40) | func GetLoadBalancerFrontendIPConfigNamesE(loadBalancerName string, reso...
  function GetIPOfLoadBalancerFrontendIPConfig (line 65) | func GetIPOfLoadBalancerFrontendIPConfig(t testing.TestingT, feConfigNam...
  function GetIPOfLoadBalancerFrontendIPConfigE (line 72) | func GetIPOfLoadBalancerFrontendIPConfigE(feConfigName string, loadBalan...
  function GetLoadBalancerFrontendIPConfig (line 103) | func GetLoadBalancerFrontendIPConfig(t testing.TestingT, feConfigName st...
  function GetLoadBalancerFrontendIPConfigE (line 110) | func GetLoadBalancerFrontendIPConfigE(feConfigName string, loadBalancerN...
  function GetLoadBalancerFrontendIPConfigClientE (line 133) | func GetLoadBalancerFrontendIPConfigClientE(subscriptionID string) (*net...
  function GetLoadBalancer (line 155) | func GetLoadBalancer(t testing.TestingT, loadBalancerName string, resour...
  function GetLoadBalancerE (line 162) | func GetLoadBalancerE(loadBalancerName string, resourceGroupName string,...
  function GetLoadBalancerClientE (line 185) | func GetLoadBalancerClientE(subscriptionID string) (*network.LoadBalance...

FILE: modules/azure/loadbalancer_test.go
  function TestLoadBalancerExistsE (line 20) | func TestLoadBalancerExistsE(t *testing.T) {
  function TestGetLoadBalancerE (line 32) | func TestGetLoadBalancerE(t *testing.T) {

FILE: modules/azure/loganalytics.go
  function LogAnalyticsWorkspaceExists (line 14) | func LogAnalyticsWorkspaceExists(t testing.TestingT, workspaceName strin...
  function GetLogAnalyticsWorkspace (line 22) | func GetLogAnalyticsWorkspace(t testing.TestingT, workspaceName string, ...
  function GetLogAnalyticsWorkspaceE (line 30) | func GetLogAnalyticsWorkspaceE(workspaceName, resoureGroupName, subscrip...
  function LogAnalyticsWorkspaceExistsE (line 44) | func LogAnalyticsWorkspaceExistsE(workspaceName string, resourceGroupNam...
  function GetLogAnalyticsWorkspacesClientE (line 56) | func GetLogAnalyticsWorkspacesClientE(subscriptionID string) (*operation...

FILE: modules/azure/loganalytics_test.go
  function TestLogAnalyticsWorkspace (line 15) | func TestLogAnalyticsWorkspace(t *testing.T) {
  function TestGetLogAnalyticsWorkspaceE (line 22) | func TestGetLogAnalyticsWorkspaceE(t *testing.T) {

FILE: modules/azure/monitor.go
  function DiagnosticSettingsResourceExists (line 13) | func DiagnosticSettingsResourceExists(t testing.TestingT, diagnosticSett...
  function DiagnosticSettingsResourceExistsE (line 21) | func DiagnosticSettingsResourceExistsE(diagnosticSettingsResourceName st...
  function GetDiagnosticsSettingsResource (line 35) | func GetDiagnosticsSettingsResource(t testing.TestingT, name string, res...
  function GetDiagnosticsSettingsResourceE (line 42) | func GetDiagnosticsSettingsResourceE(name string, resourceURI string, su...
  function GetDiagnosticsSettingsClientE (line 64) | func GetDiagnosticsSettingsClientE(subscriptionID string) (*insights.Dia...
  function GetVMInsightsOnboardingStatus (line 84) | func GetVMInsightsOnboardingStatus(t testing.TestingT, resourceURI strin...
  function GetVMInsightsOnboardingStatusE (line 92) | func GetVMInsightsOnboardingStatusE(t testing.TestingT, resourceURI stri...
  function GetVMInsightsClientE (line 108) | func GetVMInsightsClientE(t testing.TestingT, subscriptionID string) (*i...
  function GetActivityLogAlertResource (line 129) | func GetActivityLogAlertResource(t testing.TestingT, activityLogAlertNam...
  function GetActivityLogAlertResourceE (line 137) | func GetActivityLogAlertResourceE(activityLogAlertName string, resGroupN...
  function GetActivityLogAlertsClientE (line 161) | func GetActivityLogAlertsClientE(subscriptionID string) (*insights.Activ...

FILE: modules/azure/monitor_test.go
  function TestDiagnosticsSettingsResourceExists (line 12) | func TestDiagnosticsSettingsResourceExists(t *testing.T) {

FILE: modules/azure/mysql.go
  function GetMYSQLServerClientE (line 12) | func GetMYSQLServerClientE(subscriptionID string) (*armmysql.ServersClie...
  function GetMYSQLServer (line 22) | func GetMYSQLServer(t testing.TestingT, resGroupName string, serverName ...
  function GetMYSQLServerE (line 30) | func GetMYSQLServerE(t testing.TestingT, subscriptionID string, resGroup...
  function GetMYSQLDBClientE (line 47) | func GetMYSQLDBClientE(subscriptionID string) (*armmysql.DatabasesClient...
  function GetMYSQLDB (line 57) | func GetMYSQLDB(t testing.TestingT, resGroupName string, serverName stri...
  function GetMYSQLDBE (line 65) | func GetMYSQLDBE(t testing.TestingT, subscriptionID string, resGroupName...
  function ListMySQLDB (line 82) | func ListMySQLDB(t testing.TestingT, resGroupName string, serverName str...
  function ListMySQLDBE (line 90) | func ListMySQLDBE(t testing.TestingT, subscriptionID string, resGroupNam...

FILE: modules/azure/mysql_test.go
  function TestGetMYSQLServerE (line 20) | func TestGetMYSQLServerE(t *testing.T) {
  function TestGetMYSQLDBE (line 31) | func TestGetMYSQLDBE(t *testing.T) {

FILE: modules/azure/networkinterface.go
  function NetworkInterfaceExists (line 13) | func NetworkInterfaceExists(t testing.TestingT, nicName string, resGroup...
  function NetworkInterfaceExistsE (line 20) | func NetworkInterfaceExistsE(nicName string, resGroupName string, subscr...
  function GetNetworkInterfacePrivateIPs (line 34) | func GetNetworkInterfacePrivateIPs(t testing.TestingT, nicName string, r...
  function GetNetworkInterfacePrivateIPsE (line 42) | func GetNetworkInterfacePrivateIPsE(nicName string, resGroupName string,...
  function GetNetworkInterfacePublicIPs (line 61) | func GetNetworkInterfacePublicIPs(t testing.TestingT, nicName string, re...
  function GetNetworkInterfacePublicIPsE (line 68) | func GetNetworkInterfacePublicIPsE(nicName string, resGroupName string, ...
  function GetNetworkInterfaceConfigurationE (line 97) | func GetNetworkInterfaceConfigurationE(nicName string, nicConfigName str...
  function GetNetworkInterfaceConfigurationClientE (line 120) | func GetNetworkInterfaceConfigurationClientE(subscriptionID string) (*ne...
  function GetNetworkInterfaceE (line 138) | func GetNetworkInterfaceE(nicName string, resGroupName string, subscript...
  function GetNetworkInterfaceClientE (line 161) | func GetNetworkInterfaceClientE(subscriptionID string) (*network.Interfa...

FILE: modules/azure/networkinterface_test.go
  function TestGetNetworkInterfaceE (line 20) | func TestGetNetworkInterfaceE(t *testing.T) {
  function TestGetNetworkInterfacePrivateIPsE (line 32) | func TestGetNetworkInterfacePrivateIPsE(t *testing.T) {
  function TestGetNetworkInterfacePublicIPsE (line 44) | func TestGetNetworkInterfacePublicIPsE(t *testing.T) {
  function TestNetworkInterfaceExistsE (line 56) | func TestNetworkInterfaceExistsE(t *testing.T) {

FILE: modules/azure/nsg.go
  type NsgRuleSummaryList (line 16) | type NsgRuleSummaryList struct
    method FindRuleByName (line 190) | func (summarizedRules *NsgRuleSummaryList) FindRuleByName(name string)...
  type NsgRuleSummary (line 22) | type NsgRuleSummary struct
    method AllowsDestinationPort (line 202) | func (summarizedRule *NsgRuleSummary) AllowsDestinationPort(t *testing...
    method AllowsSourcePort (line 210) | func (summarizedRule *NsgRuleSummary) AllowsSourcePort(t *testing.T, p...
  function GetDefaultNsgRulesClient (line 43) | func GetDefaultNsgRulesClient(t *testing.T, subscriptionID string) netwo...
  function GetDefaultNsgRulesClientE (line 52) | func GetDefaultNsgRulesClientE(subscriptionID string) (network.DefaultSe...
  function GetCustomNsgRulesClient (line 73) | func GetCustomNsgRulesClient(t *testing.T, subscriptionID string) networ...
  function GetCustomNsgRulesClientE (line 82) | func GetCustomNsgRulesClientE(subscriptionID string) (network.SecurityRu...
  function GetAllNSGRules (line 102) | func GetAllNSGRules(t *testing.T, resourceGroupName, nsgName, subscripti...
  function GetAllNSGRulesE (line 110) | func GetAllNSGRulesE(resourceGroupName, nsgName, subscriptionID string) ...
  function bindRuleList (line 155) | func bindRuleList(source network.SecurityRuleListResultIterator) ([]NsgR...
  function convertToNsgRuleSummary (line 170) | func convertToNsgRuleSummary(name *string, rule *network.SecurityRulePro...
  function portRangeAllowsPort (line 217) | func portRangeAllowsPort(portRange string, port string) (bool, error) {
  function parsePortRangeString (line 246) | func parsePortRangeString(rangeString string) (uint16, uint16, error) {

FILE: modules/azure/nsg_test.go
  function TestPortRangeParsing (line 19) | func TestPortRangeParsing(t *testing.T) {
  function TestNsgRuleSummaryConversion (line 48) | func TestNsgRuleSummaryConversion(t *testing.T) {
  function TestAllowSourcePort (line 63) | func TestAllowSourcePort(t *testing.T) {
  function TestAllowDestinationPort (line 94) | func TestAllowDestinationPort(t *testing.T) {
  function TestFindSummarizedRule (line 125) | func TestFindSummarizedRule(t *testing.T) {

FILE: modules/azure/postgresql.go
  function GetPostgreSQLServerClientE (line 12) | func GetPostgreSQLServerClientE(subscriptionID string) (*armpostgresql.S...
  function GetPostgreSQLServer (line 22) | func GetPostgreSQLServer(t testing.TestingT, resGroupName string, server...
  function GetPostgreSQLServerE (line 30) | func GetPostgreSQLServerE(t testing.TestingT, subscriptionID string, res...
  function GetPostgreSQLDBClientE (line 47) | func GetPostgreSQLDBClientE(subscriptionID string) (*armpostgresql.Datab...
  function GetPostgreSQLDB (line 57) | func GetPostgreSQLDB(t testing.TestingT, resGroupName string, serverName...
  function GetPostgreSQLDBE (line 65) | func GetPostgreSQLDBE(t testing.TestingT, subscriptionID string, resGrou...
  function ListPostgreSQLDB (line 82) | func ListPostgreSQLDB(t testing.TestingT, subscriptionID string, resGrou...
  function ListPostgreSQLDBE (line 90) | func ListPostgreSQLDBE(t testing.TestingT, subscriptionID string, resGro...

FILE: modules/azure/postgresql_test.go
  function TestGetPostgreSQLServerE (line 20) | func TestGetPostgreSQLServerE(t *testing.T) {
  function TestGetPostgreSQLDBE (line 31) | func TestGetPostgreSQLDBE(t *testing.T) {

FILE: modules/azure/privatednszone.go
  function PrivateDNSZoneExistsE (line 10) | func PrivateDNSZoneExistsE(zoneName string, resourceGroupName string, su...
  function GetPrivateDNSZoneE (line 22) | func GetPrivateDNSZoneE(zoneName string, resGroupName string, subscripti...

FILE: modules/azure/privatednszone_test.go
  function TestPrivateDNSZoneExists (line 13) | func TestPrivateDNSZoneExists(t *testing.T) {
  function TestPrivateDNSZoneExistsE (line 26) | func TestPrivateDNSZoneExistsE(t *testing.T) {

FILE: modules/azure/publicaddress.go
  function PublicAddressExists (line 13) | func PublicAddressExists(t testing.TestingT, publicAddressName string, r...
  function PublicAddressExistsE (line 20) | func PublicAddressExistsE(publicAddressName string, resGroupName string,...
  function GetIPOfPublicIPAddressByName (line 34) | func GetIPOfPublicIPAddressByName(t testing.TestingT, publicAddressName ...
  function GetIPOfPublicIPAddressByNameE (line 41) | func GetIPOfPublicIPAddressByNameE(publicAddressName string, resGroupNam...
  function CheckPublicDNSNameAvailability (line 53) | func CheckPublicDNSNameAvailability(t testing.TestingT, location string,...
  function CheckPublicDNSNameAvailabilityE (line 62) | func CheckPublicDNSNameAvailabilityE(location string, domainNameLabel st...
  function GetPublicIPAddressE (line 77) | func GetPublicIPAddressE(publicIPAddressName string, resGroupName string...
  function GetPublicIPAddressClientE (line 99) | func GetPublicIPAddressClientE(subscriptionID string) (*network.PublicIP...

FILE: modules/azure/publicaddress_test.go
  function TestGetPublicIPAddressE (line 20) | func TestGetPublicIPAddressE(t *testing.T) {
  function TestCheckPublicDNSNameAvailabilityE (line 32) | func TestCheckPublicDNSNameAvailabilityE(t *testing.T) {
  function TestGetIPOfPublicIPAddressByNameE (line 44) | func TestGetIPOfPublicIPAddressByNameE(t *testing.T) {
  function TestPublicAddressExistsE (line 56) | func TestPublicAddressExistsE(t *testing.T) {

FILE: modules/azure/recoveryservices.go
  function RecoveryServicesVaultExists (line 15) | func RecoveryServicesVaultExists(t *testing.T, vaultName, resourceGroupN...
  function GetRecoveryServicesVaultBackupPolicyList (line 23) | func GetRecoveryServicesVaultBackupPolicyList(t *testing.T, vaultName, r...
  function GetRecoveryServicesVaultBackupProtectedVMList (line 31) | func GetRecoveryServicesVaultBackupProtectedVMList(t *testing.T, policyN...
  function RecoveryServicesVaultExistsE (line 38) | func RecoveryServicesVaultExistsE(vaultName, resourceGroupName, subscrip...
  function GetRecoveryServicesVaultE (line 50) | func GetRecoveryServicesVaultE(vaultName, resourceGroupName, subscriptio...
  function GetRecoveryServicesVaultBackupPolicyListE (line 77) | func GetRecoveryServicesVaultBackupPolicyListE(vaultName, resourceGroupN...
  function GetRecoveryServicesVaultBackupProtectedVMListE (line 115) | func GetRecoveryServicesVaultBackupProtectedVMListE(policyName, vaultNam...

FILE: modules/azure/recoveryservices_test.go
  function TestRecoveryServicesVaultName (line 14) | func TestRecoveryServicesVaultName(t *testing.T) {
  function TestRecoveryServicesVaultExists (line 19) | func TestRecoveryServicesVaultExists(t *testing.T) {
  function TestRecoveryServicesVaultBackupPolicyList (line 24) | func TestRecoveryServicesVaultBackupPolicyList(t *testing.T) {
  function TestRecoveryServicesVaultBackupProtectedVMList (line 29) | func TestRecoveryServicesVaultBackupProtectedVMList(t *testing.T) {

FILE: modules/azure/region.go
  function GetRandomStableRegion (line 66) | func GetRandomStableRegion(t testing.TestingT, approvedRegions []string,...
  function GetRandomRegion (line 80) | func GetRandomRegion(t testing.TestingT, approvedRegions []string, forbi...
  function GetRandomRegionE (line 97) | func GetRandomRegionE(t testing.TestingT, approvedRegions []string, forb...
  function GetAllAzureRegions (line 121) | func GetAllAzureRegions(t testing.TestingT, subscriptionID string) []str...
  function GetAllAzureRegionsE (line 138) | func GetAllAzureRegionsE(t testing.TestingT, subscriptionID string) ([]s...

FILE: modules/azure/region_test.go
  function TestGetRandomRegion (line 15) | func TestGetRandomRegion(t *testing.T) {
  function TestGetRandomRegionExcludesForbiddenRegions (line 22) | func TestGetRandomRegionExcludesForbiddenRegions(t *testing.T) {
  function TestGetAllAzureRegions (line 34) | func TestGetAllAzureRegions(t *testing.T) {
  function assertLooksLikeRegionName (line 47) | func assertLooksLikeRegionName(t *testing.T, regionName string) {

FILE: modules/azure/resourcegroup.go
  function ResourceGroupExists (line 17) | func ResourceGroupExists(t *testing.T, resourceGroupName string, subscri...
  function ResourceGroupExistsE (line 24) | func ResourceGroupExistsE(resourceGroupName, subscriptionID string) (boo...
  function GetResourceGroupE (line 37) | func GetResourceGroupE(resourceGroupName, subscriptionID string) (bool, ...
  function GetResourceGroupClientE (line 48) | func GetResourceGroupClientE(subscriptionID string) (*resources.GroupsCl...
  function GetAResourceGroup (line 64) | func GetAResourceGroup(t *testing.T, resourceGroupName string, subscript...
  function GetAResourceGroupE (line 71) | func GetAResourceGroupE(resourceGroupName, subscriptionID string) (*reso...
  function ListResourceGroupsByTag (line 86) | func ListResourceGroupsByTag(t *testing.T, tag, subscriptionID string) [...
  function ListResourceGroupsByTagE (line 93) | func ListResourceGroupsByTagE(tag string, subscriptionID string) ([]reso...
  function resourceGroupNotFoundError (line 106) | func resourceGroupNotFoundError(err error) bool {

FILE: modules/azure/resourcegroup_test.go
  function TestResourceGroupExists (line 20) | func TestResourceGroupExists(t *testing.T) {
  function TestGetAResourceGroup (line 29) | func TestGetAResourceGroup(t *testing.T) {

FILE: modules/azure/resourcegroupv2.go
  function ResourceGroupExistsV2 (line 14) | func ResourceGroupExistsV2(t *testing.T, resourceGroupName string, subsc...
  function ResourceGroupExistsV2E (line 21) | func ResourceGroupExistsV2E(resourceGroupName, subscriptionID string) (b...
  function GetResourceGroupV2E (line 34) | func GetResourceGroupV2E(resourceGroupName, subscriptionID string) (bool...
  function GetAResourceGroupV2 (line 44) | func GetAResourceGroupV2(t *testing.T, resourceGroupName string, subscri...
  function GetAResourceGroupV2E (line 51) | func GetAResourceGroupV2E(resourceGroupName, subscriptionID string) (*ar...
  function ListResourceGroupsByTagV2 (line 66) | func ListResourceGroupsByTagV2(t *testing.T, tag, subscriptionID string)...
  function ListResourceGroupsByTagV2E (line 73) | func ListResourceGroupsByTagV2E(tag string, subscriptionID string) (rg [...

FILE: modules/azure/resourcegroupv2_test.go
  function TestResourceGroupExistsV2 (line 21) | func TestResourceGroupExistsV2(t *testing.T) {
  function TestGetAResourceGroupV2 (line 30) | func TestGetAResourceGroupV2(t *testing.T) {

FILE: modules/azure/resourceid.go
  function GetNameFromResourceID (line 6) | func GetNameFromResourceID(resourceID string) string {
  function GetNameFromResourceIDE (line 16) | func GetNameFromResourceIDE(resourceID string) (string, error) {

FILE: modules/azure/resourceid_test.go
  function TestGetNameFromResourceID (line 15) | func TestGetNameFromResourceID(t *testing.T) {

FILE: modules/azure/servicebus.go
  function serviceBusNamespaceClientE (line 11) | func serviceBusNamespaceClientE(subscriptionID string) (*servicebus.Name...
  function serviceBusTopicClientE (line 22) | func serviceBusTopicClientE(subscriptionID string) (*servicebus.TopicsCl...
  function serviceBusSubscriptionsClientE (line 33) | func serviceBusSubscriptionsClientE(subscriptionID string) (*servicebus....
  function ListServiceBusNamespaceE (line 45) | func ListServiceBusNamespaceE(subscriptionID string) ([]servicebus.SBNam...
  function ListServiceBusNamespace (line 68) | func ListServiceBusNamespace(t *testing.T, subscriptionID string) []serv...
  function ListServiceBusNamespaceNamesE (line 77) | func ListServiceBusNamespaceNamesE(subscriptionID string) ([]string, err...
  function BuildNamespaceNamesList (line 89) | func BuildNamespaceNamesList(sbNamespace []servicebus.SBNamespace) []str...
  function BuildNamespaceIdsList (line 100) | func BuildNamespaceIdsList(sbNamespace []servicebus.SBNamespace) []string {
  function ListServiceBusNamespaceNames (line 111) | func ListServiceBusNamespaceNames(t *testing.T, subscriptionID string) [...
  function ListServiceBusNamespaceIDsE (line 120) | func ListServiceBusNamespaceIDsE(subscriptionID string) ([]string, error) {
  function ListServiceBusNamespaceIDs (line 132) | func ListServiceBusNamespaceIDs(t *testing.T, subscriptionID string) []s...
  function ListServiceBusNamespaceByResourceGroupE (line 140) | func ListServiceBusNamespaceByResourceGroupE(subscriptionID string, reso...
  function ListServiceBusNamespaceByResourceGroup (line 164) | func ListServiceBusNamespaceByResourceGroup(t *testing.T, subscriptionID...
  function ListServiceBusNamespaceNamesByResourceGroupE (line 172) | func ListServiceBusNamespaceNamesByResourceGroupE(subscriptionID string,...
  function ListServiceBusNamespaceNamesByResourceGroup (line 184) | func ListServiceBusNamespaceNamesByResourceGroup(t *testing.T, subscript...
  function ListServiceBusNamespaceIDsByResourceGroupE (line 192) | func ListServiceBusNamespaceIDsByResourceGroupE(subscriptionID string, r...
  function ListServiceBusNamespaceIDsByResourceGroup (line 204) | func ListServiceBusNamespaceIDsByResourceGroup(t *testing.T, subscriptio...
  function ListNamespaceAuthRulesE (line 213) | func ListNamespaceAuthRulesE(subscriptionID string, namespace string, re...
  function ListNamespaceAuthRules (line 237) | func ListNamespaceAuthRules(t *testing.T, subscriptionID string, namespa...
  function ListNamespaceTopicsE (line 245) | func ListNamespaceTopicsE(subscriptionID string, namespace string, resou...
  function ListNamespaceTopics (line 269) | func ListNamespaceTopics(t *testing.T, subscriptionID string, namespace ...
  function ListTopicSubscriptionsE (line 277) | func ListTopicSubscriptionsE(subscriptionID string, namespace string, re...
  function ListTopicSubscriptions (line 300) | func ListTopicSubscriptions(t *testing.T, subscriptionID string, namespa...
  function ListTopicSubscriptionsNameE (line 309) | func ListTopicSubscriptionsNameE(subscriptionID string, namespace string...
  function ListTopicSubscriptionsName (line 332) | func ListTopicSubscriptionsName(t *testing.T, subscriptionID string, nam...
  function ListTopicAuthRulesE (line 341) | func ListTopicAuthRulesE(subscriptionID string, namespace string, resour...
  function ListTopicAuthRules (line 365) | func ListTopicAuthRules(t *testing.T, subscriptionID string, namespace s...

FILE: modules/azure/servicebus_test.go
  function TestListServiceBusNamespaceNamesE (line 17) | func TestListServiceBusNamespaceNamesE(t *testing.T) {
  function TestListServiceBusNamespaceIDsByResourceGroupE (line 26) | func TestListServiceBusNamespaceIDsByResourceGroupE(t *testing.T) {
  function TestListNamespaceAuthRulesE (line 36) | func TestListNamespaceAuthRulesE(t *testing.T) {
  function TestListNamespaceTopicsE (line 47) | func TestListNamespaceTopicsE(t *testing.T) {
  function TestListTopicAuthRulesE (line 58) | func TestListTopicAuthRulesE(t *testing.T) {
  function TestListTopicSubscriptionsNameE (line 70) | func TestListTopicSubscriptionsNameE(t *testing.T) {

FILE: modules/azure/sql.go
  function GetSQLServerClient (line 12) | func GetSQLServerClient(subscriptionID string) (*armsql.ServersClient, e...
  function GetSQLServer (line 18) | func GetSQLServer(t testing.TestingT, resGroupName string, serverName st...
  function GetSQLServerE (line 26) | func GetSQLServerE(t testing.TestingT, subscriptionID string, resGroupNa...
  function GetDatabaseClient (line 43) | func GetDatabaseClient(subscriptionID string) (*armsql.DatabasesClient, ...
  function ListSQLServerDatabases (line 48) | func ListSQLServerDatabases(t testing.TestingT, resGroupName string, ser...
  function ListSQLServerDatabasesE (line 56) | func ListSQLServerDatabasesE(t testing.TestingT, resGroupName string, se...
  function GetSQLDatabase (line 79) | func GetSQLDatabase(t testing.TestingT, resGroupName string, serverName ...
  function GetSQLDatabaseE (line 87) | func GetSQLDatabaseE(t testing.TestingT, subscriptionID string, resGroup...

FILE: modules/azure/sql_managedinstance.go
  function SQLManagedInstanceExists (line 13) | func SQLManagedInstanceExists(t testing.TestingT, managedInstanceName st...
  function SQLManagedInstanceExistsE (line 20) | func SQLManagedInstanceExistsE(managedInstanceName string, resourceGroup...
  function GetManagedInstance (line 33) | func GetManagedInstance(t testing.TestingT, resGroupName string, managed...
  function GetManagedInstanceDatabase (line 42) | func GetManagedInstanceDatabase(t testing.TestingT, resGroupName string,...
  function GetManagedInstanceE (line 50) | func GetManagedInstanceE(subscriptionID string, resGroupName string, man...
  function GetManagedInstanceDatabaseE (line 67) | func GetManagedInstanceDatabaseE(t testing.TestingT, subscriptionID stri...

FILE: modules/azure/sql_managedinstance_test.go
  function TestSQLManagedInstanceExists (line 19) | func TestSQLManagedInstanceExists(t *testing.T) {
  function TestGetManagedInstanceE (line 32) | func TestGetManagedInstanceE(t *testing.T) {
  function TestGetManagedInstanceDatabasesE (line 43) | func TestGetManagedInstanceDatabasesE(t *testing.T) {

FILE: modules/azure/sql_test.go
  function TestGetSQLServerE (line 19) | func TestGetSQLServerE(t *testing.T) {
  function TestGetSQLDatabaseE (line 30) | func TestGetSQLDatabaseE(t *testing.T) {

FILE: modules/azure/storage.go
  function StorageAccountExists (line 15) | func StorageAccountExists(t *testing.T, storageAccountName string, resou...
  function StorageBlobContainerExists (line 23) | func StorageBlobContainerExists(t *testing.T, containerName string, stor...
  function StorageFileShareExists (line 31) | func StorageFileShareExists(t *testing.T, fileSahreName string, storageA...
  function StorageFileShareExistsE (line 39) | func StorageFileShareExistsE(t *testing.T, fileSahreName string, storage...
  function GetStorageBlobContainerPublicAccess (line 52) | func GetStorageBlobContainerPublicAccess(t *testing.T, containerName str...
  function GetStorageAccountKind (line 60) | func GetStorageAccountKind(t *testing.T, storageAccountName string, reso...
  function GetStorageAccountSkuTier (line 68) | func GetStorageAccountSkuTier(t *testing.T, storageAccountName string, r...
  function GetStorageDNSString (line 76) | func GetStorageDNSString(t *testing.T, storageAccountName string, resour...
  function StorageAccountExistsE (line 83) | func StorageAccountExistsE(storageAccountName, resourceGroupName, subscr...
  function GetStorageAccountE (line 95) | func GetStorageAccountE(storageAccountName, resourceGroupName, subscript...
  function StorageBlobContainerExistsE (line 112) | func StorageBlobContainerExistsE(containerName, storageAccountName, reso...
  function GetStorageBlobContainerPublicAccessE (line 124) | func GetStorageBlobContainerPublicAccessE(containerName, storageAccountN...
  function GetStorageAccountKindE (line 137) | func GetStorageAccountKindE(storageAccountName, resourceGroupName, subsc...
  function GetStorageAccountSkuTierE (line 147) | func GetStorageAccountSkuTierE(storageAccountName, resourceGroupName, su...
  function GetStorageBlobContainerE (line 156) | func GetStorageBlobContainerE(containerName, storageAccountName, resourc...
  function GetStorageAccountPropertyE (line 177) | func GetStorageAccountPropertyE(storageAccountName, resourceGroupName, s...
  function GetStorageFileShare (line 198) | func GetStorageFileShare(t *testing.T, fileShareName, storageAccountName...
  function GetStorageFileShareE (line 206) | func GetStorageFileShareE(fileShareName, storageAccountName, resourceGro...
  function GetStorageAccountClientE (line 224) | func GetStorageAccountClientE(subscriptionID string) (*storage.AccountsC...
  function GetStorageBlobContainerClientE (line 242) | func GetStorageBlobContainerClientE(subscriptionID string) (*storage.Blo...
  function GetStorageURISuffixE (line 259) | func GetStorageURISuffixE() (string, error) {
  function GetStorageAccountPrimaryBlobEndpointE (line 269) | func GetStorageAccountPrimaryBlobEndpointE(storageAccountName, resourceG...
  function GetStorageDNSStringE (line 279) | func GetStorageDNSStringE(storageAccountName, resourceGroupName, subscri...

FILE: modules/azure/storage_test.go
  function TestStorageAccountExists (line 14) | func TestStorageAccountExists(t *testing.T) {
  function TestStorageBlobContainerExists (line 19) | func TestStorageBlobContainerExists(t *testing.T) {
  function TestStorageBlobContainerPublicAccess (line 24) | func TestStorageBlobContainerPublicAccess(t *testing.T) {
  function TestGetStorageAccountKind (line 29) | func TestGetStorageAccountKind(t *testing.T) {
  function TestGetStorageAccountSkuTier (line 34) | func TestGetStorageAccountSkuTier(t *testing.T) {
  function TestGetStorageDNSString (line 39) | func TestGetStorageDNSString(t *testing.T) {

FILE: modules/azure/subscription.go
  function GetSubscriptionClientE (line 8) | func GetSubscriptionClientE() (*subscriptions.Client, error) {

FILE: modules/azure/synapse.go
  function GetSynapseWorkspace (line 13) | func GetSynapseWorkspace(t testing.TestingT, resGroupName string, worksp...
  function GetSynapseSqlPool (line 22) | func GetSynapseSqlPool(t testing.TestingT, resGroupName string, workspac...
  function GetSynapseWorkspaceE (line 30) | func GetSynapseWorkspaceE(t testing.TestingT, subscriptionID string, res...
  function GetSynapseSqlPoolE (line 47) | func GetSynapseSqlPoolE(t testing.TestingT, subscriptionID string, resGr...

FILE: modules/azure/synapse_test.go
  function TestGetSynapseWorkspaceE (line 14) | func TestGetSynapseWorkspaceE(t *testing.T) {
  function TestGetSynapseSqlPoolE (line 25) | func TestGetSynapseSqlPoolE(t *testing.T) {

FILE: modules/azure/virtualnetwork.go
  function VirtualNetworkExists (line 14) | func VirtualNetworkExists(t testing.TestingT, vnetName string, resGroupN...
  function VirtualNetworkExistsE (line 21) | func VirtualNetworkExistsE(vnetName string, resGroupName string, subscri...
  function SubnetExists (line 35) | func SubnetExists(t testing.TestingT, subnetName string, vnetName string...
  function SubnetExistsE (line 42) | func SubnetExistsE(subnetName string, vnetName string, resGroupName stri...
  function CheckSubnetContainsIP (line 56) | func CheckSubnetContainsIP(t testing.TestingT, IP string, subnetName str...
  function CheckSubnetContainsIPE (line 63) | func CheckSubnetContainsIPE(ipAddress string, subnetName string, vnetNam...
  function GetVirtualNetworkSubnets (line 90) | func GetVirtualNetworkSubnets(t testing.TestingT, vnetName string, resGr...
  function GetVirtualNetworkSubnetsE (line 98) | func GetVirtualNetworkSubnetsE(vnetName string, resGroupName string, sub...
  function GetVirtualNetworkDNSServerIPs (line 122) | func GetVirtualNetworkDNSServerIPs(t testing.TestingT, vnetName string, ...
  function GetVirtualNetworkDNSServerIPsE (line 130) | func GetVirtualNetworkDNSServerIPsE(vnetName string, resGroupName string...
  function GetSubnetE (line 141) | func GetSubnetE(subnetName string, vnetName string, resGroupName string,...
  function GetSubnetClientE (line 164) | func GetSubnetClientE(subscriptionID string) (*network.SubnetsClient, er...
  function GetVirtualNetworkE (line 182) | func GetVirtualNetworkE(vnetName string, resGroupName string, subscripti...
  function GetVirtualNetworksClientE (line 204) | func GetVirtualNetworksClientE(subscriptionID string) (*network.VirtualN...

FILE: modules/azure/virtualnetwork_test.go
  function TestGetVirtualNetworkE (line 20) | func TestGetVirtualNetworkE(t *testing.T) {
  function TestGetSubnetE (line 32) | func TestGetSubnetE(t *testing.T) {
  function TestGetVirtualNetworkDNSServerIPsE (line 45) | func TestGetVirtualNetworkDNSServerIPsE(t *testing.T) {
  function TestGetVirtualNetworkSubnetsE (line 57) | func TestGetVirtualNetworkSubnetsE(t *testing.T) {
  function TestCheckSubnetContainsIPE (line 69) | func TestCheckSubnetContainsIPE(t *testing.T) {
  function TestSubnetExistsE (line 83) | func TestSubnetExistsE(t *testing.T) {
  function TestVirtualNetworkExistsE (line 96) | func TestVirtualNetworkExistsE(t *testing.T) {

FILE: modules/collections/errors.go
  type SliceValueNotFoundError (line 4) | type SliceValueNotFoundError struct
    method Error (line 8) | func (err SliceValueNotFoundError) Error() string {
  function NewSliceValueNotFoundError (line 13) | func NewSliceValueNotFoundError(sourceString string) SliceValueNotFoundE...

FILE: modules/collections/lists.go
  function ListIntersection (line 7) | func ListIntersection[T comparable](list1 []T, list2 []T) []T {
  function ListSubtract (line 21) | func ListSubtract[T comparable](list1 []T, list2 []T) []T {
  function ListContains (line 36) | func ListContains(haystack []string, needle string) bool {

FILE: modules/collections/lists_test.go
  function TestListContains (line 11) | func TestListContains(t *testing.T) {
  function TestSubtract (line 39) | func TestSubtract(t *testing.T) {
  function TestIntersection (line 69) | func TestIntersection(t *testing.T) {

FILE: modules/collections/stringslicevalue.go
  function GetSliceLastValueE (line 8) | func GetSliceLastValueE(source string, separator string) (string, error) {
  function GetSliceIndexValueE (line 20) | func GetSliceIndexValueE(source string, separator string, index int) (st...

FILE: modules/collections/stringslicevalue_test.go
  function TestGetSliceLastValue (line 12) | func TestGetSliceLastValue(t *testing.T) {
  function TestGetSliceIndexValue (line 49) | func TestGetSliceIndexValue(t *testing.T) {

FILE: modules/database/database.go
  constant _databaseTypeMSSQL (line 19) | _databaseTypeMSSQL    = "mssql"
  constant _databaseTypePostgres (line 20) | _databaseTypePostgres = "postgres"
  constant _databaseTypeMySQL (line 21) | _databaseTypeMySQL    = "mysql"
  constant _postgresConnStr (line 22) | _postgresConnStr      = "host=%s port=%s user=%s password=%s dbname=%s s...
  constant _mssqlConnStr (line 23) | _mssqlConnStr         = "server = %s; port = %s; user id = %s; password ...
  constant _mysqlConnStr (line 24) | _mysqlConnStr         = "%s:%s@tcp(%s:%s)/%s?allowNativePasswords=true"
  type DBConfig (line 28) | type DBConfig struct
  function DBConnection (line 37) | func DBConnection(t *testing.T, dbType string, dbConfig DBConfig) *sql.DB {
  function DBConnectionE (line 46) | func DBConnectionE(t *testing.T, dbType string, dbConfig DBConfig) (*sql...
  function DBExecution (line 70) | func DBExecution(t *testing.T, db *sql.DB, command string) {
  function DBExecutionE (line 78) | func DBExecutionE(t *testing.T, db *sql.DB, command string) (sql.Result,...
  function DBQuery (line 87) | func DBQuery(t *testing.T, db *sql.DB, command string) *sql.Rows {
  function DBQueryE (line 96) | func DBQueryE(t *testing.T, db *sql.DB, command string) (*sql.Rows, erro...
  function DBQueryWithValidation (line 105) | func DBQueryWithValidation(t *testing.T, db *sql.DB, command string, exp...
  function DBQueryWithValidationE (line 113) | func DBQueryWithValidationE(t *testing.T, db *sql.DB, command string, ex...
  function DBQueryWithCustomValidation (line 130) | func DBQueryWithCustomValidation(t *testing.T, db *sql.DB, command strin...
  function DBQueryWithCustomValidationE (line 138) | func DBQueryWithCustomValidationE(t *testing.T, db *sql.DB, command stri...
  type ValidationFunctionFailed (line 151) | type ValidationFunctionFailed struct
    method Error (line 155) | func (err ValidationFunctionFailed) Error() string {
  type DBUnknown (line 160) | type DBUnknown struct
    method Error (line 164) | func (err DBUnknown) Error() string {

FILE: modules/dns-helper/dns_helper.go
  function DNSFindNameservers (line 21) | func DNSFindNameservers(t testing.TestingT, fqdn string, resolvers []str...
  function DNSFindNameserversE (line 29) | func DNSFindNameserversE(t testing.TestingT, fqdn string, resolvers []st...
  function DNSLookupAuthoritative (line 84) | func DNSLookupAuthoritative(t testing.TestingT, query DNSQuery, resolver...
  function DNSLookupAuthoritativeE (line 94) | func DNSLookupAuthoritativeE(t testing.TestingT, query DNSQuery, resolve...
  function DNSLookupAuthoritativeWithRetry (line 109) | func DNSLookupAuthoritativeWithRetry(t testing.TestingT, query DNSQuery,...
  function DNSLookupAuthoritativeWithRetryE (line 119) | func DNSLookupAuthoritativeWithRetryE(t testing.TestingT, query DNSQuery...
  function DNSLookupAuthoritativeAll (line 134) | func DNSLookupAuthoritativeAll(t testing.TestingT, query DNSQuery, resol...
  function DNSLookupAuthoritativeAllE (line 145) | func DNSLookupAuthoritativeAllE(t testing.TestingT, query DNSQuery, reso...
  function DNSLookupAuthoritativeAllWithRetry (line 178) | func DNSLookupAuthoritativeAllWithRetry(t testing.TestingT, query DNSQue...
  function DNSLookupAuthoritativeAllWithRetryE (line 186) | func DNSLookupAuthoritativeAllWithRetryE(t testing.TestingT, query DNSQu...
  function DNSLookupAuthoritativeAllWithValidation (line 201) | func DNSLookupAuthoritativeAllWithValidation(t testing.TestingT, query D...
  function DNSLookupAuthoritativeAllWithValidationE (line 211) | func DNSLookupAuthoritativeAllWithValidationE(t testing.TestingT, query ...
  function DNSLookupAuthoritativeAllWithValidationRetry (line 233) | func DNSLookupAuthoritativeAllWithValidationRetry(t testing.TestingT, qu...
  function DNSLookupAuthoritativeAllWithValidationRetryE (line 242) | func DNSLookupAuthoritativeAllWithValidationRetryE(t testing.TestingT, q...
  function DNSLookup (line 256) | func DNSLookup(t testing.TestingT, query DNSQuery, resolvers []string) D...
  function DNSLookupE (line 266) | func DNSLookupE(t testing.TestingT, query DNSQuery, resolvers []string) ...
  function dnsLookup (line 288) | func dnsLookup(t testing.TestingT, query DNSQuery, resolver string) (DNS...
  type DNSQuery (line 348) | type DNSQuery struct
  type DNSAnswer (line 353) | type DNSAnswer struct
    method String (line 357) | func (a DNSAnswer) String() string {
  type DNSAnswers (line 362) | type DNSAnswers
    method Sort (line 365) | func (a DNSAnswers) Sort() {

FILE: modules/dns-helper/dns_helper_test.go
  function TestOkDNSFindNameservers (line 59) | func TestOkDNSFindNameservers(t *testing.T) {
  function TestErrorDNSFindNameservers (line 70) | func TestErrorDNSFindNameservers(t *testing.T) {
  function TestOkTerratestDNSLookupAuthoritative (line 80) | func TestOkTerratestDNSLookupAuthoritative(t *testing.T) {
  function TestOkLocalDNSLookupAuthoritative (line 93) | func TestOkLocalDNSLookupAuthoritative(t *testing.T) {
  function TestErrorLocalDNSLookupAuthoritative (line 106) | func TestErrorLocalDNSLookupAuthoritative(t *testing.T) {
  function TestOkLocalDNSLookupAuthoritativeAll (line 118) | func TestOkLocalDNSLookupAuthoritativeAll(t *testing.T) {
  function TestError1DNSLookupAuthoritativeAll (line 132) | func TestError1DNSLookupAuthoritativeAll(t *testing.T) {
  function TestError2DNSLookupAuthoritativeAll (line 144) | func TestError2DNSLookupAuthoritativeAll(t *testing.T) {
  function TestError3DNSLookupAuthoritativeAll (line 157) | func TestError3DNSLookupAuthoritativeAll(t *testing.T) {
  function TestError4DNSLookupAuthoritativeAll (line 171) | func TestError4DNSLookupAuthoritativeAll(t *testing.T) {
  function TestOkDNSLookupAuthoritativeWithRetry (line 184) | func TestOkDNSLookupAuthoritativeWithRetry(t *testing.T) {
  function TestErrorDNSLookupAuthoritativeWithRetry (line 198) | func TestErrorDNSLookupAuthoritativeWithRetry(t *testing.T) {
  function TestOkDNSLookupAuthoritativeAllWithRetryNotfound (line 212) | func TestOkDNSLookupAuthoritativeAllWithRetryNotfound(t *testing.T) {
  function TestOkDNSLookupAuthoritativeAllWithRetryInconsistent (line 228) | func TestOkDNSLookupAuthoritativeAllWithRetryInconsistent(t *testing.T) {
  function TestErrorDNSLookupAuthoritativeAllWithRetry (line 245) | func TestErrorDNSLookupAuthoritativeAllWithRetry(t *testing.T) {
  function TestOkDNSLookupAuthoritativeAllWithValidation (line 261) | func TestOkDNSLookupAuthoritativeAllWithValidation(t *testing.T) {
  function TestErrorDNSLookupAuthoritativeAllWithValidation (line 274) | func TestErrorDNSLookupAuthoritativeAllWithValidation(t *testing.T) {
  function TestError2DNSLookupAuthoritativeAllWithValidation (line 288) | func TestError2DNSLookupAuthoritativeAllWithValidation(t *testing.T) {
  function TestError3DNSLookupAuthoritativeAllWithValidation (line 303) | func TestError3DNSLookupAuthoritativeAllWithValidation(t *testing.T) {
  function TestOkDNSLookupAuthoritativeAllWithValidationRetry (line 320) | func TestOkDNSLookupAuthoritativeAllWithValidationRetry(t *testing.T) {
  function TestOk2DNSLookupAuthoritativeAllWithValidationRetry (line 334) | func TestOk2DNSLookupAuthoritativeAllWithValidationRetry(t *testing.T) {
  function TestOk3DNSLookupAuthoritativeAllWithValidationRetry (line 349) | func TestOk3DNSLookupAuthoritativeAllWithValidationRetry(t *testing.T) {
  function TestErrorDNSLookupAuthoritativeAllWithValidationRetry (line 365) | func TestErrorDNSLookupAuthoritativeAllWithValidationRetry(t *testing.T) {
  function shutDownServers (line 381) | func shutDownServers(t *testing.T, s1, s2 *dnsTestServer) {

FILE: modules/dns-helper/dns_local_server.go
  type dnsDatabase (line 17) | type dnsDatabase
  type dnsTestServer (line 20) | type dnsTestServer struct
    method Address (line 32) | func (s *dnsTestServer) Address() string {
    method AddEntryToDNSDatabase (line 37) | func (s *dnsTestServer) AddEntryToDNSDatabase(q DNSQuery, a DNSAnswers) {
    method AddEntryToDNSDatabaseRetry (line 42) | func (s *dnsTestServer) AddEntryToDNSDatabaseRetry(q DNSQuery, a DNSAn...
  function newDNSTestServer (line 27) | func newDNSTestServer(server *dns.Server) *dnsTestServer {
  function setupTestDNSServers (line 48) | func setupTestDNSServers(t *testing.T) (s1, s2 *dnsTestServer) {
  function setupTestDNSServersRetry (line 69) | func setupTestDNSServersRetry(t *testing.T) (s1, s2 *dnsTestServer) {
  function runTestDNSServer (line 91) | func runTestDNSServer(t *testing.T, port string) *dnsTestServer {
  function doDNSAnswer (line 112) | func doDNSAnswer(t *testing.T, w dns.ResponseWriter, r *dns.Msg, d dnsDa...
  function stdDNSHandler (line 147) | func stdDNSHandler(t *testing.T, w dns.ResponseWriter, r *dns.Msg, s *dn...
  function retryDNSHandler (line 155) | func retryDNSHandler(t *testing.T, w dns.ResponseWriter, r *dns.Msg, s *...

FILE: modules/dns-helper/errors.go
  type NoResolversError (line 6) | type NoResolversError struct
    method Error (line 8) | func (err NoResolversError) Error() string {
  type QueryTypeError (line 13) | type QueryTypeError struct
    method Error (line 17) | func (err QueryTypeError) Error() string {
  type NotFoundError (line 22) | type NotFoundError struct
    method Error (line 27) | func (err NotFoundError) Error() string {
  type InconsistentAuthoritativeError (line 32) | type InconsistentAuthoritativeError struct
    method Error (line 39) | func (err InconsistentAuthoritativeError) Error() string {
  type NSNotFoundError (line 44) | type NSNotFoundError struct
    method Error (line 49) | func (err NSNotFoundError) Error() string {
  type MaxRetriesExceeded (line 54) | type MaxRetriesExceeded struct
    method Error (line 59) | func (err MaxRetriesExceeded) Error() string {
  type ValidationError (line 64) | type ValidationError struct
    method Error (line 70) | func (err ValidationError) Error() string {

FILE: modules/docker/build.go
  type BuildOptions (line 16) | type BuildOptions struct
  function Build (line 64) | func Build(t testing.TestingT, path string, options *BuildOptions) {
  function BuildE (line 69) | func BuildE(t testing.TestingT, path string, options *BuildOptions) error {
  function GitCloneAndBuild (line 121) | func GitCloneAndBuild(
  function GitCloneAndBuildE (line 134) | func GitCloneAndBuildE(
  function formatDockerBuildArgs (line 172) | func formatDockerBuildArgs(path string, options *BuildOptions) []string {
  function formatDockerBuildxLoadArgs (line 194) | func formatDockerBuildxLoadArgs(path string, options *BuildOptions) []st...
  function formatDockerBuildBaseArgs (line 204) | func formatDockerBuildBaseArgs(path string, options *BuildOptions) []str...

FILE: modules/docker/build_test.go
  function TestBuild (line 14) | func TestBuild(t *testing.T) {
  function TestBuildWithBuildKit (line 31) | func TestBuildWithBuildKit(t *testing.T) {
  function TestBuildMultiArch (line 48) | func TestBuildMultiArch(t *testing.T) {
  function TestBuildWithTarget (line 66) | func TestBuildWithTarget(t *testing.T) {
  function TestGitCloneAndBuild (line 85) | func TestGitCloneAndBuild(t *testing.T) {

FILE: modules/docker/docker_compose.go
  type Options (line 15) | type Options struct
  function RunDockerCompose (line 28) | func RunDockerCompose(t testing.TestingT, options *Options, args ...stri...
  function RunDockerComposeAndGetStdOut (line 37) | func RunDockerComposeAndGetStdOut(t testing.TestingT, options *Options, ...
  function RunDockerComposeE (line 44) | func RunDockerComposeE(t testing.TestingT, options *Options, args ...str...
  function runDockerComposeE (line 48) | func runDockerComposeE(t testing.TestingT, stdout bool, options *Options...
  function generateValidDockerComposeProjectName (line 96) | func generateValidDockerComposeProjectName(str string) string {

FILE: modules/docker/docker_compose_test.go
  function TestDockerComposeWithBuildKit (line 9) | func TestDockerComposeWithBuildKit(t *testing.T) {
  function TestDockerComposeWithCustomProjectName (line 29) | func TestDockerComposeWithCustomProjectName(t *testing.T) {

FILE: modules/docker/host.go
  function GetDockerHost (line 9) | func GetDockerHost() string {
  function getDockerHostFromEnv (line 13) | func getDockerHostFromEnv(env []string) string {

FILE: modules/docker/host_test.go
  function TestGetDockerHostFromEnv (line 10) | func TestGetDockerHostFromEnv(t *testing.T) {

FILE: modules/docker/images.go
  type Image (line 18) | type Image struct
    method String (line 50) | func (image Image) String() string {
  function DeleteImage (line 55) | func DeleteImage(t testing.TestingT, img string, logger *logger.Logger) {
  function DeleteImageE (line 60) | func DeleteImageE(t testing.TestingT, img string, logger *logger.Logger)...
  function ListImages (line 70) | func ListImages(t testing.TestingT, logger *logger.Logger) []Image {
  function ListImagesE (line 77) | func ListImagesE(t testing.TestingT, logger *logger.Logger) ([]Image, er...
  function DoesImageExist (line 105) | func DoesImageExist(t testing.TestingT, imgLabel string, logger *logger....

FILE: modules/docker/images_test.go
  function TestListImagesAndDeleteImage (line 12) | func TestListImagesAndDeleteImage(t *testing.T) {

FILE: modules/docker/inspect.go
  type ContainerInspect (line 18) | type ContainerInspect struct
    method GetExposedHostPort (line 235) | func (inspectOutput ContainerInspect) GetExposedHostPort(containerPort...
  type Port (line 51) | type Port struct
  type VolumeBind (line 58) | type VolumeBind struct
  type HealthCheck (line 64) | type HealthCheck struct
  type HealthLog (line 76) | type HealthLog struct
  type inspectOutput (line 92) | type inspectOutput struct
  function Inspect (line 116) | func Inspect(t *testing.T, id string) *ContainerInspect {
  function InspectE (line 125) | func InspectE(t *testing.T, id string) (*ContainerInspect, error) {
  function transformContainer (line 154) | func transformContainer(t *testing.T, container inspectOutput) (*Contain...
  function transformContainerPorts (line 199) | func transformContainerPorts(container inspectOutput) ([]Port, error) {
  function transformContainerVolumes (line 246) | func transformContainerVolumes(container inspectOutput) []VolumeBind {

FILE: modules/docker/inspect_test.go
  constant dockerInspectTestImage (line 13) | dockerInspectTestImage = "nginx:1.17-alpine"
  function TestInspect (line 15) | func TestInspect(t *testing.T) {
  function TestInspectWithExposedPort (line 38) | func TestInspectWithExposedPort(t *testing.T) {
  function TestInspectWithRandomExposedPort (line 59) | func TestInspectWithRandomExposedPort(t *testing.T) {
  function TestInspectWithHostVolume (line 79) | func TestInspectWithHostVolume(t *testing.T) {
  function TestInspectWithAnonymousVolume (line 89) | func TestInspectWithAnonymousVolume(t *testing.T) {
  function TestInspectWithNamedVolume (line 97) | func TestInspectWithNamedVolume(t *testing.T) {
  function TestInspectWithInvalidContainerID (line 107) | func TestInspectWithInvalidContainerID(t *testing.T) {
  function TestInspectWithUnknownContainerID (line 114) | func TestInspectWithUnknownContainerID(t *testing.T) {
  function TestInspectReturnsCorrectHealthCheckWhenStarting (line 121) | func TestInspectReturnsCorrectHealthCheckWhenStarting(t *testing.T) {
  function TestInspectReturnsCorrectHealthCheckWhenUnhealthy (line 131) | func TestInspectReturnsCorrectHealthCheckWhenUnhealthy(t *testing.T) {
  function runWithHealthCheck (line 143) | func runWithHealthCheck(t *testing.T, check string, frequency time.Durat...
  function runWithVolume (line 165) | func runWithVolume(t *testing.T, volume string) *ContainerInspect {
  function removeContainer (line 177) | func removeContainer(t *testing.T, id string) {

FILE: modules/docker/push.go
  function Push (line 11) | func Push(t testing.TestingT, logger *logger.Logger, tag string) {
  function PushE (line 16) | func PushE(t testing.TestingT, logger *logger.Logger, tag string) error {

FILE: modules/docker/run.go
  type RunOptions (line 11) | type RunOptions struct
  function Run (line 60) | func Run(t testing.TestingT, image string, options *RunOptions) string {
  function RunE (line 67) | func RunE(t testing.TestingT, image string, options *RunOptions) (string...
  function RunAndGetID (line 86) | func RunAndGetID(t testing.TestingT, image string, options *RunOptions) ...
  function RunAndGetIDE (line 94) | func RunAndGetIDE(t testing.TestingT, image string, options *RunOptions)...
  function formatDockerRunArgs (line 112) | func formatDockerRunArgs(image string, options *RunOptions) ([]string, e...

FILE: modules/docker/run_test.go
  function TestRun (line 9) | func TestRun(t *testing.T) {

FILE: modules/docker/stop.go
  type StopOptions (line 13) | type StopOptions struct
  function Stop (line 23) | func Stop(t testing.TestingT, containers []string, options *StopOptions)...
  function StopE (line 30) | func StopE(t testing.TestingT, containers []string, options *StopOptions...
  function formatDockerStopArgs (line 49) | func formatDockerStopArgs(containers []string, options *StopOptions) ([]...

FILE: modules/docker/stop_test.go
  function TestStop (line 16) | func TestStop(t *testing.T) {
  function verifyNginxIsUp (line 55) | func verifyNginxIsUp(statusCode int, body string) bool {

FILE: modules/environment/envvar.go
  function GetFirstNonEmptyEnvVarOrFatal (line 11) | func GetFirstNonEmptyEnvVarOrFatal(t testing.TestingT, envVarNames []str...
  function GetFirstNonEmptyEnvVarOrEmptyString (line 22) | func GetFirstNonEmptyEnvVarOrEmptyString(t testing.TestingT, envVarNames...
  function RequireEnvVar (line 33) | func RequireEnvVar(t testing.TestingT, envVarName string) {

FILE: modules/environment/envvar_test.go
  type MockT (line 11) | type MockT struct
    method Fail (line 15) | func (t *MockT) Fail() {
    method FailNow (line 19) | func (t *MockT) FailNow() {
    method Error (line 23) | func (t *MockT) Error(args ...any) {
    method Errorf (line 27) | func (t *MockT) Errorf(format string, args ...any) {
    method Fatal (line 31) | func (t *MockT) Fatal(args ...any) {
    method Fatalf (line 35) | func (t *MockT) Fatalf(format string, args ...any) {
    method Name (line 39) | func (t *MockT) Name() string {
  function TestGetFirstNonEmptyEnvVarOrEmptyStringChecksInOrder (line 52) | func TestGetFirstNonEmptyEnvVarOrEmptyStringChecksInOrder(t *testing.T) {
  function TestGetFirstNonEmptyEnvVarOrEmptyStringReturnsEmpty (line 61) | func TestGetFirstNonEmptyEnvVarOrEmptyStringReturnsEmpty(t *testing.T) {
  function TestRequireEnvVarFails (line 67) | func TestRequireEnvVarFails(t *testing.T) {
  function TestRequireEnvVarPasses (line 77) | func TestRequireEnvVarPasses(t *testing.T) {

FILE: modules/files/errors.go
  type DirNotFoundError (line 6) | type DirNotFoundError struct
    method Error (line 10) | func (err DirNotFoundError) Error() string {

FILE: modules/files/files.go
  constant defaultDirPermissions (line 14) | defaultDirPermissions = 0o755
  function FileExists (line 17) | func FileExists(path string) bool {
  function FileExistsE (line 24) | func FileExistsE(path string) (bool, error) {
  function IsExistingFile (line 34) | func IsExistingFile(path string) bool {
  function IsExistingDir (line 40) | func IsExistingDir(path string) bool {
  function CopyTerraformFolderToDest (line 52) | func CopyTerraformFolderToDest(folderPath string, destRootFolder string,...
  function CopyTerraformFolderToTemp (line 74) | func CopyTerraformFolderToTemp(folderPath string, tempFolderPrefix strin...
  function CopyTerragruntFolderToDest (line 81) | func CopyTerragruntFolderToDest(folderPath string, destRootFolder string...
  function CopyTerragruntFolderToTemp (line 95) | func CopyTerragruntFolderToTemp(folderPath string, tempFolderPrefix stri...
  function CopyFolderToDest (line 101) | func CopyFolderToDest(folderPath string, destRootFolder string, tempFold...
  function CopyFolderToTemp (line 146) | func CopyFolderToTemp(folderPath string, tempFolderPrefix string, filter...
  function CopyFolderContents (line 151) | func CopyFolderContents(source string, destination string) error {
  function CopyFolderContentsWithFilter (line 159) | func CopyFolderContentsWithFilter(source string, destination string, fil...
  function PathContainsTerraformStateOrVars (line 198) | func PathContainsTerraformStateOrVars(path string) bool {
  function PathContainsTerraformState (line 204) | func PathContainsTerraformState(path string) bool {
  function PathContainsHiddenFileOrFolder (line 210) | func PathContainsHiddenFileOrFolder(path string) bool {
  function PathIsTerraformVersionFile (line 221) | func PathIsTerraformVersionFile(path string) bool {
  function PathIsTerraformLockFile (line 226) | func PathIsTerraformLockFile(path string) bool {
  function CopyFile (line 231) | func CopyFile(source string, destination string) error {
  function WriteFileWithSamePermissions (line 241) | func WriteFileWithSamePermissions(source string, destination string, con...
  function isSymLink (line 252) | func isSymLink(file os.FileInfo) bool {
  function copySymlink (line 257) | func copySymlink(source string, destination string) error {
  function FindTerraformSourceFilesInDir (line 269) | func FindTerraformSourceFilesInDir(dirPath string) ([]string, error) {

FILE: modules/files/files_test.go
  constant copyFolderContentsFixtureRoot (line 15) | copyFolderContentsFixtureRoot = "../../test/fixtures/copy-folder-contents"
  function TestFileExists (line 17) | func TestFileExists(t *testing.T) {
  function TestIsExistingFile (line 27) | func TestIsExistingFile(t *testing.T) {
  function TestIsExistingDir (line 40) | func TestIsExistingDir(t *testing.T) {
  function TestCopyFolderToDest (line 53) | func TestCopyFolderToDest(t *testing.T) {
  function TestCopyFolderContents (line 73) | func TestCopyFolderContents(t *testing.T) {
  function TestCopyFolderContentsWithHiddenFilesFilter (line 86) | func TestCopyFolderContentsWithHiddenFilesFilter(t *testing.T) {
  function TestCopyFolderContentsWithSymLinks (line 102) | func TestCopyFolderContentsWithSymLinks(t *testing.T) {
  function TestCopyFolderContentsWithBrokenSymLinks (line 118) | func TestCopyFolderContentsWithBrokenSymLinks(t *testing.T) {
  function TestCopyTerraformFolderToTemp (line 152) | func TestCopyTerraformFolderToTemp(t *testing.T) {
  function TestCopyTerraformFolderToDest (line 164) | func TestCopyTerraformFolderToDest(t *testing.T) {
  function TestCopyTerragruntFolderToTemp (line 177) | func TestCopyTerragruntFolderToTemp(t *testing.T) {
  function TestCopyTerragruntFolderToDest (line 189) | func TestCopyTerragruntFolderToDest(t *testing.T) {
  function TestPathContainsTerraformStateOrVars (line 202) | func TestPathContainsTerraformStateOrVars(t *testing.T) {
  function requireDirectoriesEqual (line 236) | func requireDirectoriesEqual(t *testing.T, folderWithExpectedContents st...

FILE: modules/gcp/cloudbuild.go
  function CreateBuild (line 15) | func CreateBuild(t testing.TestingT, projectID string, build *cloudbuild...
  function CreateBuildE (line 22) | func CreateBuildE(t testing.TestingT, projectID string, build *cloudbuil...
  function GetBuild (line 49) | func GetBuild(t testing.TestingT, projectID string, buildID string) *clo...
  function GetBuildE (line 56) | func GetBuildE(t testing.TestingT, projectID string, buildID string) (*c...
  function GetBuilds (line 78) | func GetBuilds(t testing.TestingT, projectID string) []*cloudbuildpb.Bui...
  function GetBuildsE (line 85) | func GetBuildsE(t testing.TestingT, projectID string) ([]*cloudbuildpb.B...
  function GetBuildsForTrigger (line 116) | func GetBuildsForTrigger(t testing.TestingT, projectID string, triggerID...
  function GetBuildsForTriggerE (line 123) | func GetBuildsForTriggerE(t testing.TestingT, projectID string, triggerI...
  function NewCloudBuildService (line 140) | func NewCloudBuildService(t testing.TestingT) *cloudbuild.Client {
  function NewCloudBuildServiceE (line 147) | func NewCloudBuildServiceE(t testing.TestingT) (*cloudbuild.Client, erro...

FILE: modules/gcp/cloudbuild_test.go
  function TestCreateBuild (line 22) | func TestCreateBuild(t *testing.T) {
  function createSampleAppTarball (line 89) | func createSampleAppTarball(t *testing.T) *bytes.Reader {

FILE: modules/gcp/compute.go
  type Instance (line 22) | type Instance struct
    method GetPublicIp (line 176) | func (i *Instance) GetPublicIp(t testing.TestingT) string {
    method GetPublicIpE (line 185) | func (i *Instance) GetPublicIpE(t testing.TestingT) (string, error) {
    method GetLabels (line 198) | func (i *Instance) GetLabels(t testing.TestingT) map[string]string {
    method GetZone (line 203) | func (i *Instance) GetZone(t testing.TestingT) string {
    method SetLabels (line 208) | func (i *Instance) SetLabels(t testing.TestingT, labels map[string]str...
    method SetLabelsE (line 216) | func (i *Instance) SetLabelsE(t testing.TestingT, labels map[string]st...
    method GetMetadata (line 234) | func (i *Instance) GetMetadata(t testing.TestingT) []*compute.Metadata...
    method SetMetadata (line 239) | func (i *Instance) SetMetadata(t testing.TestingT, metadata map[string...
    method SetMetadataE (line 247) | func (i *Instance) SetMetadataE(t testing.TestingT, metadata map[strin...
    method AddSshKey (line 297) | func (i *Instance) AddSshKey(t testing.TestingT, username string, publ...
    method AddSshKeyE (line 305) | func (i *Instance) AddSshKeyE(t testing.TestingT, username string, pub...
  type Image (line 28) | type Image struct
    method DeleteImage (line 325) | func (i *Image) DeleteImage(t testing.TestingT) {
    method DeleteImageE (line 333) | func (i *Image) DeleteImageE(t testing.TestingT) error {
  type ZonalInstanceGroup (line 34) | type ZonalInstanceGroup struct
    method GetInstanceIds (line 350) | func (ig *ZonalInstanceGroup) GetInstanceIds(t testing.TestingT) []str...
    method GetInstanceIdsE (line 359) | func (ig *ZonalInstanceGroup) GetInstanceIdsE(t testing.TestingT) ([]s...
    method GetInstances (line 441) | func (ig *ZonalInstanceGroup) GetInstances(t testing.TestingT, project...
    method GetInstancesE (line 446) | func (ig *ZonalInstanceGroup) GetInstancesE(t testing.TestingT, projec...
    method GetPublicIps (line 492) | func (ig *ZonalInstanceGroup) GetPublicIps(t testing.TestingT, project...
    method GetPublicIpsE (line 497) | func (ig *ZonalInstanceGroup) GetPublicIpsE(t testing.TestingT, projec...
    method GetRandomInstance (line 539) | func (ig *ZonalInstanceGroup) GetRandomInstance(t testing.TestingT) *I...
    method GetRandomInstanceE (line 544) | func (ig *ZonalInstanceGroup) GetRandomInstanceE(t testing.TestingT) (...
  type RegionalInstanceGroup (line 40) | type RegionalInstanceGroup struct
    method GetInstanceIds (line 395) | func (ig *RegionalInstanceGroup) GetInstanceIds(t testing.TestingT) []...
    method GetInstanceIdsE (line 404) | func (ig *RegionalInstanceGroup) GetInstanceIdsE(t testing.TestingT) (...
    method GetInstances (line 451) | func (ig *RegionalInstanceGroup) GetInstances(t testing.TestingT, proj...
    method GetInstancesE (line 456) | func (ig *RegionalInstanceGroup) GetInstancesE(t testing.TestingT, pro...
    method GetPublicIps (line 502) | func (ig *RegionalInstanceGroup) GetPublicIps(t testing.TestingT, proj...
    method GetPublicIpsE (line 507) | func (ig *RegionalInstanceGroup) GetPublicIpsE(t testing.TestingT, pro...
    method GetRandomInstance (line 549) | func (ig *RegionalInstanceGroup) GetRandomInstance(t testing.TestingT)...
    method GetRandomInstanceE (line 554) | func (ig *RegionalInstanceGroup) GetRandomInstanceE(t testing.TestingT...
  type InstanceGroup (line 45) | type InstanceGroup interface
  function FetchInstance (line 51) | func FetchInstance(t testing.TestingT, projectID string, name string) *I...
  function FetchInstanceE (line 61) | func FetchInstanceE(t testing.TestingT, projectID string, name string) (...
  function FetchImage (line 89) | func FetchImage(t testing.TestingT, projectID string, name string) *Image {
  function FetchImageE (line 99) | func FetchImageE(t testing.TestingT, projectID string, name string) (*Im...
  function FetchRegionalInstanceGroup (line 118) | func FetchRegionalInstanceGroup(t testing.TestingT, projectID string, re...
  function FetchRegionalInstanceGroupE (line 128) | func FetchRegionalInstanceGroupE(t testing.TestingT, projectID string, r...
  function FetchZonalInstanceGroup (line 147) | func FetchZonalInstanceGroup(t testing.TestingT, projectID string, zone ...
  function FetchZonalInstanceGroupE (line 157) | func FetchZonalInstanceGroupE(t testing.TestingT, projectID string, zone...
  function newMetadata (line 266) | func newMetadata(t testing.TestingT, oldMetadata *compute.Metadata, kvs ...
  function getInstances (line 461) | func getInstances(t testing.TestingT, ig InstanceGroup, projectId string...
  function getInstancesE (line 471) | func getInstancesE(t testing.TestingT, ig InstanceGroup, projectId strin...
  function getPublicIps (line 512) | func getPublicIps(t testing.TestingT, ig InstanceGroup, projectId string...
  function getPublicIpsE (line 522) | func getPublicIpsE(t testing.TestingT, ig InstanceGroup, projectId strin...
  function getRandomInstance (line 558) | func getRandomInstance(t testing.TestingT, ig InstanceGroup, name string...
  function getRandomInstanceE (line 567) | func getRandomInstanceE(t testing.TestingT, ig InstanceGroup, name strin...
  function NewComputeService (line 586) | func NewComputeService(t testing.TestingT) *compute.Service {
  function NewComputeServiceE (line 595) | func NewComputeServiceE(t testing.TestingT) (*compute.Service, error) {
  function NewInstancesService (line 630) | func NewInstancesService(t testing.TestingT) *compute.InstancesService {
  function NewInstancesServiceE (line 639) | func NewInstancesServiceE(t testing.TestingT) (*compute.InstancesService...
  function RandomValidGcpName (line 649) | func RandomValidGcpName() string {

FILE: modules/gcp/compute_test.go
  constant DEFAULT_MACHINE_TYPE (line 21) | DEFAULT_MACHINE_TYPE = "f1-micro"
  constant DEFAULT_IMAGE_FAMILY_PROJECT_NAME (line 22) | DEFAULT_IMAGE_FAMILY_PROJECT_NAME = "ubuntu-os-cloud"
  constant DEFAULT_IMAGE_FAMILY_NAME (line 23) | DEFAULT_IMAGE_FAMILY_NAME = "family/ubuntu-2204-lts"
  function TestGetPublicIpOfInstance (line 28) | func TestGetPublicIpOfInstance(t *testing.T) {
  function TestZoneUrlToZone (line 57) | func TestZoneUrlToZone(t *testing.T) {
  function TestGetAndSetLabels (line 74) | func TestGetAndSetLabels(t *testing.T) {
  function TestGetAndSetMetadata (line 110) | func TestGetAndSetMetadata(t *testing.T) {
  function createComputeInstance (line 154) | func createComputeInstance(t *testing.T, projectID string, zone string, ...
  function deleteComputeInstance (line 211) | func deleteComputeInstance(t *testing.T, projectID string, zone string, ...

FILE: modules/gcp/compute_unit_test.go
  function TestNewMetadataPreservesExisting (line 12) | func TestNewMetadataPreservesExisting(t *testing.T) {

FILE: modules/gcp/gcp.go
  function withOptions (line 8) | func withOptions() (opts []option.ClientOption) {

FILE: modules/gcp/gcr.go
  function DeleteGCRRepo (line 17) | func DeleteGCRRepo(t testing.TestingT, repo string) {
  function DeleteGCRRepoE (line 23) | func DeleteGCRRepoE(t testing.TestingT, repo string) error {
  function DeleteGCRImageRef (line 62) | func DeleteGCRImageRef(t testing.TestingT, ref string) {
  function DeleteGCRImageRefE (line 68) | func DeleteGCRImageRefE(t testing.TestingT, ref string) error {
  function newGCRAuther (line 89) | func newGCRAuther() (authn.Authenticator, error) {

FILE: modules/gcp/oslogin.go
  function ImportSSHKey (line 20) | func ImportSSHKey(t testing.TestingT, user, key string) {
  function ImportSSHKeyE (line 27) | func ImportSSHKeyE(t testing.TestingT, user, key string) error {
  function ImportProjectSSHKey (line 36) | func ImportProjectSSHKey(t testing.TestingT, user, key, projectID string) {
  function ImportProjectSSHKeyE (line 44) | func ImportProjectSSHKeyE(t testing.TestingT, user, key, projectID strin...
  function importProjectSSHKeyE (line 48) | func importProjectSSHKeyE(t testing.TestingT, user, key string, projectI...
  function DeleteSSHKey (line 79) | func DeleteSSHKey(t testing.TestingT, user, key string) {
  function DeleteSSHKeyE (line 86) | func DeleteSSHKeyE(t testing.TestingT, user, key string) error {
  function GetLoginProfile (line 116) | func GetLoginProfile(t testing.TestingT, user string) *oslogin.LoginProf...
  function GetLoginProfileE (line 126) | func GetLoginProfileE(t testing.TestingT, user string) (*oslogin.LoginPr...
  function NewOSLoginServiceE (line 146) | func NewOSLoginServiceE(t testing.TestingT) (*oslogin.Service, error) {

FILE: modules/gcp/oslogin_test.go
  function TestOSLogin (line 24) | func TestOSLogin(t *testing.T) {
  function purgeAllSSHKeys (line 85) | func purgeAllSSHKeys(t *testing.T, user string) {

FILE: modules/gcp/provider.go
  function GetGoogleCredentialsFromEnvVar (line 35) | func GetGoogleCredentialsFromEnvVar(t testing.TestingT) string {
  function GetGoogleProjectIDFromEnvVar (line 40) | func GetGoogleProjectIDFromEnvVar(t testing.TestingT) string {
  function GetGoogleRegionFromEnvVar (line 45) | func GetGoogleRegionFromEnvVar(t testing.TestingT) string {
  function GetGoogleIdentityEmailEnvVar (line 50) | func GetGoogleIdentityEmailEnvVar(t testing.TestingT) string {

FILE: modules/gcp/region.go
  constant regionOverrideEnvVarName (line 17) | regionOverrideEnvVarName = "TERRATEST_GCP_REGION"
  constant zoneOverrideEnvVarName (line 21) | zoneOverrideEnvVarName = "TERRATEST_GCP_ZONE"
  constant defaultRegion (line 26) | defaultRegion = "us-west1"
  constant defaultZone (line 31) | defaultZone = "us-west1-b"
  function GetRandomRegion (line 36) | func GetRandomRegion(t testing.TestingT, projectID string, approvedRegio...
  function GetRandomRegionE (line 47) | func GetRandomRegionE(t testing.TestingT, projectID string, approvedRegi...
  function GetRandomZone (line 74) | func GetRandomZone(t testing.TestingT, projectID string, approvedZones [...
  function GetRandomZoneE (line 85) | func GetRandomZoneE(t testing.TestingT, projectID string, approvedZones ...
  function GetRandomZoneForRegion (line 117) | func GetRandomZoneForRegion(t testing.TestingT, projectID string, region...
  function GetRandomZoneForRegionE (line 126) | func GetRandomZoneForRegionE(t testing.TestingT, projectID string, regio...
  function GetAllGcpRegions (line 153) | func GetAllGcpRegions(t testing.TestingT, projectID string) []string {
  function GetAllGcpRegionsE (line 162) | func GetAllGcpRegionsE(t testing.TestingT, projectID string) ([]string, ...
  function GetAllGcpZones (line 191) | func GetAllGcpZones(t testing.TestingT, projectID string) []string {
  function GetAllGcpZonesE (line 200) | func GetAllGcpZonesE(t testing.TestingT, projectID string) ([]string, er...
  function ZoneUrlToZone (line 229) | func ZoneUrlToZone(zoneUrl string) string {
  function RegionUrlToRegion (line 237) | func RegionUrlToRegion(zoneUrl string) string {
  function isInRegions (line 243) | func isInRegions(zone string, regions []string) bool {
  function isInRegion (line 254) | func isInRegion(zone string, region string) bool {

FILE: modules/gcp/region_test.go
  function TestGetRandomRegion (line 15) | func TestGetRandomRegion(t *testing.T) {
  function TestGetRandomZone (line 24) | func TestGetRandomZone(t *testing.T) {
  function TestGetRandomRegionExcludesForbiddenRegions (line 33) | func TestGetRandomRegionExcludesForbiddenRegions(t *testing.T) {
  function TestGetRandomZoneExcludesForbiddenZones (line 47) | func TestGetRandomZoneExcludesForbiddenZones(t *testing.T) {
  function TestGetRandomZoneExcludesForbiddenRegions (line 61) | func TestGetRandomZoneExcludesForbiddenRegions(t *testing.T) {
  function TestGetAllGcpRegions (line 78) | func TestGetAllGcpRegions(t *testing.T) {
  function TestGetAllGcpZones (line 92) | func TestGetAllGcpZones(t *testing.T) {
  function TestGetRandomZoneForRegion (line 106) | func TestGetRandomZoneForRegion(t *testing.T) {
  function TestGetInRegion (line 127) | func TestGetInRegion(t *testing.T) {
  function TestGetInRegions (line 146) | func TestGetInRegions(t *testing.T) {
  function assertLooksLikeRegionName (line 166) | func assertLooksLikeRegionName(t *testing.T, regionName string) {
  function assertLooksLikeZoneName (line 170) | func assertLooksLikeZoneName(t *testing.T, zoneName string) {

FILE: modules/gcp/static_token.go
  function getStaticTokenSource (line 9) | func getStaticTokenSource() (oauth2.TokenSource, bool) {

FILE: modules/gcp/static_token_test.go
  function TestStaticTokenClient (line 16) | func TestStaticTokenClient(t *testing.T) {

FILE: modules/gcp/storage.go
  function CreateStorageBucket (line 15) | func CreateStorageBucket(t testing.TestingT, projectID string, name stri...
  function CreateStorageBucketE (line 23) | func CreateStorageBucketE(t testing.TestingT, projectID string, name str...
  function DeleteStorageBucket (line 42) | func DeleteStorageBucket(t testing.TestingT, name string) {
  function DeleteStorageBucketE (line 50) | func DeleteStorageBucketE(t testing.TestingT, name string) error {
  function ReadBucketObject (line 64) | func ReadBucketObject(t testing.TestingT, bucketName string, filePath st...
  function ReadBucketObjectE (line 73) | func ReadBucketObjectE(t testing.TestingT, bucketName string, filePath s...
  function WriteBucketObject (line 93) | func WriteBucketObject(t testing.TestingT, bucketName string, filePath s...
  function WriteBucketObjectE (line 102) | func WriteBucketObjectE(t testing.TestingT, bucketName string, filePath ...
  function EmptyStorageBucket (line 137) | func EmptyStorageBucket(t testing.TestingT, name string) {
  function EmptyStorageBucketE (line 145) | func EmptyStorageBucketE(t testing.TestingT, name string) error {
  function AssertStorageBucketExists (line 183) | func AssertStorageBucketExists(t testing.TestingT, name string) {
  function AssertStorageBucketExistsE (line 191) | func AssertStorageBucketExistsE(t testing.TestingT, name string) error {
  function newStorageClient (line 223) | func newStorageClient() (*storage.Client, error) {

FILE: modules/gcp/storage_test.go
  function TestCreateAndDestroyStorageBucket (line 19) | func TestCreateAndDestroyStorageBucket(t *testing.T) {
  function TestAssertStorageBucketExistsNoFalseNegative (line 50) | func TestAssertStorageBucketExistsNoFalseNegative(t *testing.T) {
  function TestAssertStorageBucketExistsNoFalsePositive (line 64) | func TestAssertStorageBucketExistsNoFalsePositive(t *testing.T) {

FILE: modules/git/git.go
  function GetCurrentBranchName (line 20) | func GetCurrentBranchName(t testing.TestingT) string {
  function GetCurrentBranchNameContext (line 28) | func GetCurrentBranchNameContext(t testing.TestingT, ctx context.Context...
  function GetCurrentBranchNameE (line 44) | func GetCurrentBranchNameE(t testing.TestingT) (string, error) {
  function GetCurrentBranchNameContextE (line 53) | func GetCurrentBranchNameContextE(t testing.TestingT, ctx context.Contex...
  function GetCurrentBranchNameOldE (line 76) | func GetCurrentBranchNameOldE(t testing.TestingT) (string, error) {
  function GetCurrentBranchNameOldContextE (line 85) | func GetCurrentBranchNameOldContextE(t testing.TestingT, ctx context.Con...
  function GetCurrentGitRef (line 109) | func GetCurrentGitRef(t testing.TestingT) string {
  function GetCurrentGitRefContext (line 118) | func GetCurrentGitRefContext(t testing.TestingT, ctx context.Context, di...
  function GetCurrentGitRefE (line 134) | func GetCurrentGitRefE(t testing.TestingT) (string, error) {
  function GetCurrentGitRefContextE (line 142) | func GetCurrentGitRefContextE(t testing.TestingT, ctx context.Context, d...
  function GetTagE (line 166) | func GetTagE(t testing.TestingT) (string, error) {
  function GetTagContextE (line 174) | func GetTagContextE(t testing.TestingT, ctx context.Context, dir string)...
  function GetRepoRoot (line 192) | func GetRepoRoot(t testing.TestingT) string {
  function GetRepoRootContext (line 199) | func GetRepoRootContext(t testing.TestingT, ctx context.Context, dir str...
  function GetRepoRootE (line 211) | func GetRepoRootE(t testing.TestingT) (string, error) {
  function GetRepoRootContextE (line 218) | func GetRepoRootContextE(t testing.TestingT, ctx context.Context, dir st...
  function GetRepoRootForDir (line 236) | func GetRepoRootForDir(t testing.TestingT, dir string) string {
  function GetRepoRootForDirContext (line 242) | func GetRepoRootForDirContext(t testing.TestingT, ctx context.Context, d...
  function GetRepoRootForDirE (line 254) | func GetRepoRootForDirE(t testing.TestingT, dir string) (string, error) {
  function GetRepoRootForDirContextE (line 260) | func GetRepoRootForDirContextE(t testing.TestingT, ctx context.Context, ...

FILE: modules/git/git_test.go
  function TestGitRefChecks (line 15) | func TestGitRefChecks(t *testing.T) {
  function TestGetRepoRoot (line 71) | func TestGetRepoRoot(t *testing.T) {

FILE: modules/helm/cmd.go
  function getCommonArgs (line 15) | func getCommonArgs(options *Options, args ...string) []string {
  function getNamespaceArgs (line 29) | func getNamespaceArgs(options *Options) []string {
  function getValuesArgsE (line 37) | func getValuesArgsE(t testing.TestingT, options *Options, args ...string...
  function RunHelmCommandAndGetOutputE (line 57) | func RunHelmCommandAndGetOutputE(t testing.TestingT, options *Options, c...
  function RunHelmCommandAndGetStdOutE (line 63) | func RunHelmCommandAndGetStdOutE(t testing.TestingT, options *Options, c...
  function RunHelmCommandAndGetStdOutErrE (line 69) | func RunHelmCommandAndGetStdOutErrE(t testing.TestingT, options *Options...
  function prepareHelmCommand (line 74) | func prepareHelmCommand(t testing.TestingT, options *Options, cmd string...

FILE: modules/helm/cmd_test.go
  function TestPrepareHelmCommand (line 11) | func TestPrepareHelmCommand(t *testing.T) {

FILE: modules/helm/delete.go
  function Delete (line 10) | func Delete(t testing.TestingT, options *Options, releaseName string, pu...
  function DeleteE (line 16) | func DeleteE(t testing.TestingT, options *Options, releaseName string, p...

FILE: modules/helm/errors.go
  type ValuesFileNotFoundError (line 8) | type ValuesFileNotFoundError struct
    method Error (line 12) | func (err ValuesFileNotFoundError) Error() string {
  type SetFileNotFoundError (line 17) | type SetFileNotFoundError struct
    method Error (line 21) | func (err SetFileNotFoundError) Error() string {
  type TemplateFileNotFoundError (line 26) | type TemplateFileNotFoundError struct
    method Error (line 31) | func (err TemplateFileNotFoundError) Error() string {
  type ChartNotFoundError (line 36) | type ChartNotFoundError struct
    method Error (line 40) | func (err ChartNotFoundError) Error() string {

FILE: modules/helm/format.go
  function formatSetValuesAsArgs (line 17) | func formatSetValuesAsArgs(setValues map[string]string, flag string) []s...
  function formatValuesFilesAsArgs (line 33) | func formatValuesFilesAsArgs(t testing.TestingT, valuesFiles []string) [...
  function formatValuesFilesAsArgsE (line 41) | func formatValuesFilesAsArgsE(t testing.TestingT, valuesFiles []string) ...
  function formatSetFilesAsArgs (line 62) | func formatSetFilesAsArgs(t testing.TestingT, setFiles map[string]string...
  function formatSetFilesAsArgsE (line 70) | func formatSetFilesAsArgsE(t testing.TestingT, setFiles map[string]strin...

FILE: modules/helm/format_test.go
  function TestFormatSetValuesAsArgs (line 13) | func TestFormatSetValuesAsArgs(t *testing.T) {
  function TestFormatSetFilesAsArgs (line 86) | func TestFormatSetFilesAsArgs(t *testing.T) {
  function TestFormatValuesFilesAsArgs (line 138) | func TestFormatValuesFilesAsArgs(t *testing.T) {
  function createTempFiles (line 188) | func createTempFiles(numFiles int) ([]string, error) {
  function deleteTempFiles (line 204) | func deleteTempFiles(paths []string) {
  function absPaths (line 211) | func absPaths(t *testing.T, paths []string) []string {

FILE: modules/helm/install.go
  function Install (line 15) | func Install(t testing.TestingT, options *Options, chart string, release...
  function InstallE (line 20) | func InstallE(t testing.TestingT, options *Options, chart string, releas...

FILE: modules/helm/install_test.go
  constant remoteChartSource (line 30) | remoteChartSource  = "https://charts.bitnami.com/bitnami"
  constant remoteChartName (line 31) | remoteChartName    = "nginx"
  constant remoteChartVersion (line 32) | remoteChartVersion = "22.4.0"
  function TestRemoteChartInstall (line 36) | func TestRemoteChartInstall(t *testing.T) {
  function TestHelmDependencyInstall (line 109) | func TestHelmDependencyInstall(t *testing.T) {
  function waitForRemoteChartPods (line 156) | func waitForRemoteChartPods(t *testing.T, kubectlOptions *k8s.KubectlOpt...

FILE: modules/helm/options.go
  type Options (line 8) | type Options struct

FILE: modules/helm/repo.go
  function AddRepo (line 11) | func AddRepo(t testing.TestingT, options *Options, repoName string, repo...
  function AddRepoE (line 16) | func AddRepoE(t testing.TestingT, options *Options, repoName string, rep...
  function RemoveRepo (line 32) | func RemoveRepo(t testing.TestingT, options *Options, repoName string) {
  function RemoveRepoE (line 37) | func RemoveRepoE(t testing.TestingT, options *Options, repoName string) ...

FILE: modules/helm/rollback.go
  function Rollback (line 10) | func Rollback(t testing.TestingT, options *Options, releaseName string, ...
  function RollbackE (line 15) | func RollbackE(t testing.TestingT, options *Options, releaseName string,...

FILE: modules/helm/template.go
  function RenderTemplate (line 24) | func RenderTemplate(t testing.TestingT, options *Options, chartDir strin...
  function RenderTemplateE (line 32) | func RenderTemplateE(t testing.TestingT, options *Options, chartDir stri...
  function RenderTemplateAndGetStdOutErrE (line 45) | func RenderTemplateAndGetStdOutErrE(t testing.TestingT, options *Options...
  function getRenderArgs (line 55) | func getRenderArgs(t testing.TestingT, options *Options, chartDir string...
  function RenderRemoteTemplate (line 104) | func RenderRemoteTemplate(t testing.TestingT, options *Options, chartURL...
  function RenderRemoteTemplateE (line 112) | func RenderRemoteTemplateE(t testing.TestingT, options *Options, chartUR...
  function UnmarshalK8SYamls (line 143) | func UnmarshalK8SYamls[T any](t testing.TestingT, yamlData string, desti...
  function UnmarshalK8SYamlsE (line 150) | func UnmarshalK8SYamlsE[T any](t testing.TestingT, yamlData string, dest...
  function UnmarshalK8SYaml (line 174) | func UnmarshalK8SYaml(t testing.TestingT, yamlData string, destinationOb...
  function UnmarshalK8SYamlE (line 185) | func UnmarshalK8SYamlE(t testing.TestingT, yamlData string, destinationO...
  function UpdateSnapshot (line 267) | func UpdateSnapshot(t testing.TestingT, options *Options, yamlData strin...
  function UpdateSnapshotE (line 277) | func UpdateSnapshotE(t testing.TestingT, options *Options, yamlData stri...
  function DiffAgainstSnapshot (line 314) | func DiffAgainstSnapshot(t testing.TestingT, options *Options, yamlData ...
  function DiffAgainstSnapshotE (line 324) | func DiffAgainstSnapshotE(t testing.TestingT, options *Options, yamlData...

FILE: modules/helm/template_test.go
  function TestRemoteChartRender (line 31) | func TestRemoteChartRender(t *testing.T) {
  function TestRemoteChartRenderDump (line 81) | func TestRemoteChartRenderDump(t *testing.T) {
  function TestRemoteChartRenderDiff (line 87) | func TestRemoteChartRenderDiff(t *testing.T) {
  function renderChartDump (line 104) | func renderChartDump(t *testing.T, remoteChartVersion, snapshotDir strin...
  function TestUnmarshall (line 146) | func TestUnmarshall(t *testing.T) {
  function TestRenderWarning (line 190) | func TestRenderWarning(t *testing.T) {
  function TestRenderMultipleManifests (line 204) | func TestRenderMultipleManifests(t *testing.T) {

FILE: modules/helm/upgrade.go
  function Upgrade (line 14) | func Upgrade(t testing.TestingT, options *Options, chart string, release...
  function UpgradeE (line 19) | func UpgradeE(t testing.TestingT, options *Options, chart string, releas...

FILE: modules/helm/upgrade_test.go
  function TestRemoteChartInstallUpgradeRollback (line 28) | func TestRemoteChartInstallUpgradeRollback(t *testing.T) {
  function TestHelmDependencyUpgrade (line 108) | func TestHelmDependencyUpgrade(t *testing.T) {

FILE: modules/http-helper/continuous.go
  type GetResponse (line 12) | type GetResponse struct
  function ContinuouslyCheckUrl (line 21) | func ContinuouslyCheckUrl(

FILE: modules/http-helper/dummy_server.go
  function RunDummyServer (line 17) | func RunDummyServer(t testing.TestingT, text string) (net.Listener, int) {
  function RunDummyServerE (line 28) | func RunDummyServerE(t testing.TestingT, text string) (net.Listener, int...
  function RunDummyServerWithHandlers (line 52) | func RunDummyServerWithHandlers(t testing.TestingT, handlers map[string]...
  function RunDummyServerWithHandlersE (line 63) | func RunDummyServerWithHandlersE(t testing.TestingT, handlers map[string...
  function getNextPort (line 88) | func getNextPort() int {

FILE: modules/http-helper/dummy_server_test.go
  function TestRunDummyServer (line 15) | func TestRunDummyServer(t *testing.T) {
  function TestContinuouslyCheck (line 28) | func TestContinuouslyCheck(t *testing.T) {
  function TestRunDummyServersWithHandlers (line 55) | func TestRunDummyServersWithHandlers(t *testing.T) {
  function shutDownServer (line 97) | func shutDownServer(t *testing.T, listener io.Closer) {

FILE: modules/http-helper/errors.go
  type ValidationFunctionFailed (line 6) | type ValidationFunctionFailed struct
    method Error (line 12) | func (err ValidationFunctionFailed) Error() string {

FILE: modules/http-helper/http_helper.go
  type HttpGetOptions (line 18) | type HttpGetOptions struct
  type HttpDoOptions (line 24) | type HttpDoOptions struct
  function HttpGet (line 35) | func HttpGet(t testing.TestingT, url string, tlsConfig *tls.Config) (int...
  function HttpGetWithOptions (line 41) | func HttpGetWithOptions(t testing.TestingT, options HttpGetOptions) (int...
  function HttpGetE (line 51) | func HttpGetE(t testing.TestingT, url string, tlsConfig *tls.Config) (in...
  function HttpGetWithOptionsE (line 57) | func HttpGetWithOptionsE(t testing.TestingT, options HttpGetOptions) (in...
  function HttpGetWithValidation (line 88) | func HttpGetWithValidation(t testing.TestingT, url string, tlsConfig *tl...
  function HttpGetWithValidationWithOptions (line 95) | func HttpGetWithValidationWithOptions(t testing.TestingT, options HttpGe...
  function HttpGetWithValidationE (line 104) | func HttpGetWithValidationE(t testing.TestingT, url string, tlsConfig *t...
  function HttpGetWithValidationWithOptionsE (line 111) | func HttpGetWithValidationWithOptionsE(t testing.TestingT, options HttpG...
  function HttpGetWithCustomValidation (line 118) | func HttpGetWithCustomValidation(t testing.TestingT, url string, tlsConf...
  function HttpGetWithCustomValidationWithOptions (line 123) | func HttpGetWithCustomValidationWithOptions(t testing.TestingT, options ...
  function HttpGetWithCustomValidationE (line 131) | func HttpGetWithCustomValidationE(t testing.TestingT, url string, tlsCon...
  function HttpGetWithCustomValidationWithOptionsE (line 136) | func HttpGetWithCustomValidationWithOptionsE(t testing.TestingT, options...
  function HttpGetWithRetry (line 152) | func HttpGetWithRetry(t testing.TestingT, url string, tlsConfig *tls.Con...
  function HttpGetWithRetryWithOptions (line 159) | func HttpGetWithRetryWithOptions(t testing.TestingT, options HttpGetOpti...
  function HttpGetWithRetryE (line 168) | func HttpGetWithRetryE(t testing.TestingT, url string, tlsConfig *tls.Co...
  function HttpGetWithRetryWithOptionsE (line 175) | func HttpGetWithRetryWithOptionsE(t testing.TestingT, options HttpGetOpt...
  function HttpGetWithRetryWithCustomValidation (line 185) | func HttpGetWithRetryWithCustomValidation(t testing.TestingT, url string...
  function HttpGetWithRetryWithCustomValidationWithOptions (line 192) | func HttpGetWithRetryWithCustomValidationWithOptions(t testing.TestingT,...
  function HttpGetWithRetryWithCustomValidationE (line 201) | func HttpGetWithRetryWithCustomValidationE(t testing.TestingT, url strin...
  function HttpGetWithRetryWithCustomValidationWithOptionsE (line 208) | func HttpGetWithRetryWithCustomValidationWithOptionsE(t testing.TestingT...
  function HTTPDo (line 218) | func HTTPDo(
  function HTTPDoWithOptions (line 234) | func HTTPDoWithOptions(
  function HTTPDoE (line 245) | func HTTPDoE(
  function HTTPDoWithOptionsE (line 260) | func HTTPDoWithOptionsE(
  function HTTPDoWithRetry (line 293) | func HTTPDoWithRetry(
  function HTTPDoWithRetryWithOptions (line 311) | func HTTPDoWithRetryWithOptions(
  function HTTPDoWithRetryE (line 325) | func HTTPDoWithRetryE(
  function HTTPDoWithRetryWithOptionsE (line 344) | func HTTPDoWithRetryWithOptionsE(
  function HTTPDoWithValidationRetry (line 381) | func HTTPDoWithValidationRetry(
  function HTTPDoWithValidationRetryWithOptions (line 399) | func HTTPDoWithValidationRetryWithOptions(
  function HTTPDoWithValidationRetryE (line 411) | func HTTPDoWithValidationRetryE(
  function HTTPDoWithValidationRetryWithOptionsE (line 429) | func HTTPDoWithValidationRetryWithOptionsE(
  function HTTPDoWithValidation (line 443) | func HTTPDoWithValidation(t testing.TestingT, method string, url string,...
  function HTTPDoWithValidationWithOptions (line 457) | func HTTPDoWithValidationWithOptions(t testing.TestingT, options HttpDoO...
  function HTTPDoWithValidationE (line 466) | func HTTPDoWithValidationE(t testing.TestingT, method string, url string...
  function HTTPDoWithValidationWithOptionsE (line 480) | func HTTPDoWithValidationWithOptionsE(t testing.TestingT, options HttpDo...
  function HTTPDoWithCustomValidation (line 488) | func HTTPDoWithCustomValidation(t testing.TestingT, method string, url s...
  function HTTPDoWithCustomValidationWithOptions (line 502) | func HTTPDoWithCustomValidationWithOptions(t testing.TestingT, options H...
  function HTTPDoWithCustomValidationE (line 511) | func HTTPDoWithCustomValidationE(t testing.TestingT, method string, url ...
  function HTTPDoWithCustomValidationWithOptionsE (line 525) | func HTTPDoWithCustomValidationWithOptionsE(t testing.TestingT, options ...
  function newRequest (line 539) | func newRequest(method string, url string, body io.Reader, headers map[s...

FILE: modules/http-helper/http_helper_test.go
  function getTestServerForFunction (line 18) | func getTestServerForFunction(handler func(w http.ResponseWriter,
  function TestOkBody (line 23) | func TestOkBody(t *testing.T) {
  function TestHTTPDoWithValidation (line 41) | func TestHTTPDoWithValidation(t *testing.T) {
  function TestHTTPDoWithCustomValidation (line 51) | func TestHTTPDoWithCustomValidation(t *testing.T) {
  function TestOkHeaders (line 66) | func TestOkHeaders(t *testing.T) {
  function TestWrongStatus (line 84) | func TestWrongStatus(t *testing.T) {
  function TestRequestTimeout (line 97) | func TestRequestTimeout(t *testing.T) {
  function TestOkWithRetry (line 112) | func TestOkWithRetry(t *testing.T) {
  function TestErrorWithRetry (line 124) | func TestErrorWithRetry(t *testing.T) {
  function TestEmptyRequestBodyWithRetryWithOptions (line 143) | func TestEmptyRequestBodyWithRetryWithOptions(t *testing.T) {
  function bodyCopyHandler (line 158) | func bodyCopyHandler(w http.ResponseWriter, r *http.Request) {
  function headersCopyHandler (line 164) | func headersCopyHandler(w http.ResponseWriter, r *http.Request) {
  function wrongStatusHandler (line 173) | func wrongStatusHandler(w http.ResponseWriter, r *http.Request) {
  function sleepingHandler (line 177) | func sleepingHandler(w http.ResponseWriter, r *http.Request) {
  function retryHandler (line 183) | func retryHandler(w http.ResponseWriter, r *http.Request) {
  function failRetryHandler (line 197) | func failRetryHandler(w http.ResponseWriter, r *http.Request) {
  function TestGlobalProxy (line 209) | func TestGlobalProxy(t *testing.T) {

FILE: modules/k8s/client.go
  function GetKubernetesClientE (line 15) | func GetKubernetesClientE(t testing.TestingT) (*kubernetes.Clientset, er...
  function GetKubernetesClientFromOptionsE (line 26) | func GetKubernetesClientFromOptionsE(t testing.TestingT, options *Kubect...

FILE: modules/k8s/cluster_role.go
  function GetClusterRole (line 13) | func GetClusterRole(t testing.TestingT, options *KubectlOptions, roleNam...
  function GetClusterRoleE (line 20) | func GetClusterRoleE(t testing.TestingT, options *KubectlOptions, roleNa...

FILE: modules/k8s/cluster_role_test.go
  function TestGetClusterRoleEReturnsErrorForNonExistantClusterRole (line 18) | func TestGetClusterRoleEReturnsErrorForNonExistantClusterRole(t *testing...
  function TestGetClusterRoleEReturnsCorrectClusterRoleInCorrectNamespace (line 26) | func TestGetClusterRoleEReturnsCorrectClusterRoleInCorrectNamespace(t *t...
  constant EXAMPLE_CLUSTER_ROLE_YAML_TEMPLATE (line 37) | EXAMPLE_CLUSTER_ROLE_YAML_TEMPLATE = `---

FILE: modules/k8s/config.go
  function LoadConfigFromPath (line 23) | func LoadConfigFromPath(path string) clientcmd.ClientConfig {
  function LoadApiClientConfigE (line 32) | func LoadApiClientConfigE(configPath string, contextName string) (*restc...
  function DeleteConfigContextE (line 46) | func DeleteConfigContextE(t testing.TestingT, contextName string) error {
  function DeleteConfigContextWithPathE (line 57) | func DeleteConfigContextWithPathE(t testing.TestingT, kubeConfigPath str...
  function setNewContext (line 98) | func setNewContext(config *api.Config) error {
  function RemoveOrphanedClusterAndAuthInfoConfig (line 115) | func RemoveOrphanedClusterAndAuthInfoConfig(config *api.Config) {
  function GetKubeConfigPathE (line 127) | func GetKubeConfigPathE(t testing.TestingT) (string, error) {
  function KubeConfigPathFromHomeDirE (line 141) | func KubeConfigPathFromHomeDirE() (string, error) {
  function CopyHomeKubeConfigToTemp (line 152) | func CopyHomeKubeConfigToTemp(t testing.TestingT) string {
  function CopyHomeKubeConfigToTempE (line 164) | func CopyHomeKubeConfigToTempE(t testing.TestingT) (string, error) {
  function UpsertConfigContext (line 180) | func UpsertConfigContext(config *api.Config, contextName string, cluster...

FILE: modules/k8s/config_test.go
  function TestDeleteConfigContext (line 21) | func TestDeleteConfigContext(t *testing.T) {
  function TestDeleteConfigContextWithAnotherContextRemaining (line 36) | func TestDeleteConfigContextWithAnotherContextRemaining(t *testing.T) {
  function TestRemoveOrphanedClusterAndAuthInfoConfig (line 51) | func TestRemoveOrphanedClusterAndAuthInfoConfig(t *testing.T) {
  function removeOrphanedClusterAndAuthInfoConfigTestFunc (line 81) | func removeOrphanedClusterAndAuthInfoConfigTestFunc(t *testing.T, inputC...
  constant BASIC_CONFIG (line 99) | BASIC_CONFIG = `apiVersion: v1
  constant BASIC_CONFIG_WITH_EXTRA_CLUSTER (line 119) | BASIC_CONFIG_WITH_EXTRA_CLUSTER = `apiVersion: v1
  constant BASIC_CONFIG_WITH_EXTRA_AUTH_INFO (line 144) | BASIC_CONFIG_WITH_EXTRA_AUTH_INFO = `apiVersion: v1
  constant BASIC_CONFIG_WITH_EXTRA_CONTEXT (line 169) | BASIC_CONFIG_WITH_EXTRA_CONTEXT = `apiVersion: v1
  constant BASIC_CONFIG_WITH_EXTRA_CONTEXT_NO_GARBAGE (line 202) | BASIC_CONFIG_WITH_EXTRA_CONTEXT_NO_GARBAGE = `apiVersion: v1
  constant EXPECTED_CONFIG_AFTER_EXTRA_MINIKUBE_DELETED_NO_GARBAGE (line 240) | EXPECTED_CONFIG_AFTER_EXTRA_MINIKUBE_DELETED_NO_GARBAGE = `apiVersion: v1

FILE: modules/k8s/configmap.go
  function GetConfigMap (line 18) | func GetConfigMap(t testing.TestingT, options *KubectlOptions, configMap...
  function GetConfigMapE (line 26) | func GetConfigMapE(t testing.TestingT, options *KubectlOptions, configMa...
  function WaitUntilConfigMapAvailable (line 36) | func WaitUntilConfigMapAvailable(t testing.TestingT, options *KubectlOpt...

FILE: modules/k8s/configmap_test.go
  function TestGetConfigMapEReturnsErrorForNonExistantConfigMap (line 23) | func TestGetConfigMapEReturnsErrorForNonExistantConfigMap(t *testing.T) {
  function TestGetConfigMapEReturnsCorrectConfigMapInCorrectNamespace (line 31) | func TestGetConfigMapEReturnsCorrectConfigMapInCorrectNamespace(t *testi...
  function TestWaitUntilConfigMapAvailableReturnsSuccessfully (line 45) | func TestWaitUntilConfigMapAvailableReturnsSuccessfully(t *testing.T) {
  constant EXAMPLE_CONFIGMAP_YAML_TEMPLATE (line 57) | EXAMPLE_CONFIGMAP_YAML_TEMPLATE = `---

FILE: modules/k8s/cronjob.go
  function ListCronJobs (line 17) | func ListCronJobs(t testing.TestingT, options *KubectlOptions, filters m...
  function ListCronJobsE (line 24) | func ListCronJobsE(t testing.TestingT, options *KubectlOptions, filters ...
  function GetCronJob (line 37) | func GetCronJob(t testing.TestingT, options *KubectlOptions, cronJobName...
  function GetCronJobE (line 44) | func GetCronJobE(t testing.TestingT, options *KubectlOptions, cronJobNam...
  function WaitUntilCronJobSucceed (line 54) | func WaitUntilCronJobSucceed(t testing.TestingT, options *KubectlOptions...
  function WaitUntilCronJobSucceedE (line 60) | func WaitUntilCronJobSucceedE(t testing.TestingT, options *KubectlOption...
  function IsCronJobSucceeded (line 88) | func IsCronJobSucceeded(cronJob *batchv1.CronJob) bool {

FILE: modules/k8s/cronjob_test.go
  function TestListCronJobsReturnsCronJobsInNamespace (line 20) | func TestListCronJobsReturnsCronJobsInNamespace(t *testing.T) {
  function TestGetCronJobEReturnErrorForNotExistingCronJob (line 36) | func TestGetCronJobEReturnErrorForNotExistingCronJob(t *testing.T) {
  function TestGetCronJobEReturnsCorrectJobInNamespace (line 44) | func TestGetCronJobEReturnsCorrectJobInNamespace(t *testing.T) {
  function TestWaitUntilCronJobScheduleSuccessfullyContainer (line 57) | func TestWaitUntilCronJobScheduleSuccessfullyContainer(t *testing.T) {
  function TestIsCronJobSucceeded (line 69) | func TestIsCronJobSucceeded(t *testing.T) {
  constant ExampleCronjobYamlTemplate (line 106) | ExampleCronjobYamlTemplate = `---

FILE: modules/k8s/daemonset.go
  function ListDaemonSets (line 15) | func ListDaemonSets(t testing.TestingT, options *KubectlOptions, filters...
  function ListDaemonSetsE (line 22) | func ListDaemonSetsE(t testing.TestingT, options *KubectlOptions, filter...
  function GetDaemonSet (line 36) | func GetDaemonSet(t testing.TestingT, options *KubectlOptions, daemonSet...
  function GetDaemonSetE (line 43) | func GetDaemonSetE(t testing.TestingT, options *KubectlOptions, daemonSe...

FILE: modules/k8s/daemonset_test.go
  function TestGetDaemonSetEReturnsErrorForNonExistantDaemonSet (line 23) | func TestGetDaemonSetEReturnsErrorForNonExistantDaemonSet(t *testing.T) {
  function TestGetDaemonSetEReturnsCorrectServiceInCorrectNamespace (line 31) | func TestGetDaemonSetEReturnsCorrectServiceInCorrectNamespace(t *testing...
  function TestListDaemonSetsReturnsCorrectServiceInCorrectNamespace (line 45) | func TestListDaemonSetsReturnsCorrectServiceInCorrectNamespace(t *testin...
  constant EXAMPLE_DAEMONSET_YAML_TEMPLATE (line 62) | EXAMPLE_DAEMONSET_YAML_TEMPLATE = `---

FILE: modules/k8s/deployment.go
  function ListDeployments (line 19) | func ListDeployments(t testing.TestingT, options *KubectlOptions, filter...
  function ListDeploymentsE (line 26) | func ListDeploymentsE(t testing.TestingT, options *KubectlOptions, filte...
  function GetDeployment (line 40) | func GetDeployment(t testing.TestingT, options *KubectlOptions, deployme...
  function GetDeploymentE (line 47) | func GetDeploymentE(t testing.TestingT, options *KubectlOptions, deploym...
  function WaitUntilDeploymentAvailable (line 59) | func WaitUntilDeploymentAvailable(t testing.TestingT, options *KubectlOp...
  function WaitUntilDeploymentAvailableE (line 66) | func WaitUntilDeploymentAvailableE(
  function IsDeploymentAvailable (line 99) | func IsDeploymentAvailable(deploy *appsv1.Deployment) bool {
  function getDeploymentCondition (line 104) | func getDeploymentCondition(deploy *appsv1.Deployment, cType appsv1.Depl...

FILE: modules/k8s/deployment_test.go
  function TestGetDeploymentEReturnsError (line 26) | func TestGetDeploymentEReturnsError(t *testing.T) {
  function TestGetDeployments (line 34) | func TestGetDeployments(t *testing.T) {
  function TestListDeployments (line 48) | func TestListDeployments(t *testing.T) {
  function TestWaitUntilDeploymentAvailable (line 65) | func TestWaitUntilDeploymentAvailable(t *testing.T) {
  function TestTestIsDeploymentAvailable (line 77) | func TestTestIsDeploymentAvailable(t *testing.T) {
  constant ExampleDeploymentYAMLTemplate (line 134) | ExampleDeploymentYAMLTemplate = `---

FILE: modules/k8s/errors.go
  type IngressNotAvailable (line 15) | type IngressNotAvailable struct
    method Error (line 20) | func (err IngressNotAvailable) Error() string {
  type IngressNotAvailableV1Beta1 (line 25) | type IngressNotAvailableV1Beta1 struct
    method Error (line 30) | func (err IngressNotAvailableV1Beta1) Error() string {
  type UnknownKubeResourceType (line 35) | type UnknownKubeResourceType struct
    method Error (line 39) | func (err UnknownKubeResourceType) Error() string {
  type DesiredNumberOfPodsNotCreated (line 45) | type DesiredNumberOfPodsNotCreated struct
    method Error (line 51) | func (err DesiredNumberOfPodsNotCreated) Error() string {
  type ServiceAccountTokenNotAvailable (line 56) | type ServiceAccountTokenNotAvailable struct
    method Error (line 61) | func (err ServiceAccountTokenNotAvailable) Error() string {
  type DeploymentNotAvailable (line 66) | type DeploymentNotAvailable struct
    method E
Condensed preview — 1130 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,418K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 22861,
    "preview": "env: &env\n  environment:\n    GRUNTWORK_INSTALLER_VERSION: v0.0.36\n    MODULE_CI_VERSION: v0.46.0\n    MODULE_GCP_CI_VERSI"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 68,
    "preview": "# These are supported funding model platforms\n\ngithub: gruntwork-io\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 657,
    "preview": "---\nname: Bug report\nabout: Create a bug report to help us improve Terratest.\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 457,
    "preview": "---\nname: Feature request\nabout: Submit a feature request to improve Terratest.\ntitle: ''\nlabels: enhancement\nassignees:"
  },
  {
    "path": ".github/no-response.yml",
    "chars": 728,
    "preview": "# Configuration for probot-no-response - https://github.com/probot/no-response\n\n# Number of days of inactivity before an"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1310,
    "preview": "<!-- Prepend '[WIP]' to the title if this PR is still a work-in-progress. Remove it when it is ready for review! -->\n\n##"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 9140,
    "preview": "name: ci-workflow\n\n# actors\n  # source repo: official terratest repo (gruntwork-io/terratest)\n  # forked repo: (e.g., xy"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 1604,
    "preview": "name: Lint\n\non:\n  push:\n\npermissions:\n  contents: read\n\njobs:\n  lint:\n    name: Lint\n    runs-on: ubuntu-latest\n\n    ste"
  },
  {
    "path": ".github/workflows/update-lint-config.yml",
    "chars": 1204,
    "preview": "name: Update Lint Config\n\non:\n  schedule:\n    # Run every Monday at 00:00 UTC\n    - cron: '0 0 * * 1'\n  workflow_dispatc"
  },
  {
    "path": ".gitignore",
    "chars": 364,
    "preview": "# Terraform files\n.terraform\nterraform.tfstate\nterraform.tfvars\nterraform.tfvars.json\n*.tfstate*\n.terragrunt\n.terragrunt"
  },
  {
    "path": ".golangci.yml",
    "chars": 2935,
    "preview": "# This file is generated from https://github.com/gruntwork-io/terragrunt/blob/main/.golangci.yml\n# It is automatically u"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 362,
    "preview": "repos:\n- repo: https://github.com/gruntwork-io/pre-commit\n  rev: v0.1.10\n  hooks:\n    - id: goimports\n    - id: terrafor"
  },
  {
    "path": "CODEOWNERS",
    "chars": 47,
    "preview": "* @denis256 @yhakbar @thisguycodes @james00012\n"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "Makefile",
    "chars": 773,
    "preview": "update-lint-config: SHELL:=/bin/bash\nupdate-lint-config:\n\tcurl -s https://raw.githubusercontent.com/gruntwork-io/terragr"
  },
  {
    "path": "NOTICE",
    "chars": 124,
    "preview": "terratest\nCopyright 2018 Gruntwork, Inc.\n\nThis product includes software developed at Gruntwork (https://www.gruntwork.i"
  },
  {
    "path": "README.md",
    "chars": 1935,
    "preview": "# Terratest\n\n[![Maintained by Gruntwork.io](https://img.shields.io/badge/maintained%20by-gruntwork.io-%235849a6.svg)](ht"
  },
  {
    "path": "REFACTOR.md",
    "chars": 13207,
    "preview": "# Terratest refactor\n\nTerratest started out as a set of Bash scripts we were using at Gruntwork to test some of our Terr"
  },
  {
    "path": "SECURITY.md",
    "chars": 1656,
    "preview": "# Reporting Security Issues\n\nGruntwork takes security seriously, and we value the input of independent security research"
  },
  {
    "path": "cmd/pick-instance-type/main.go",
    "chars": 3107,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gruntwork-io/go-commons/entrypoint\"\n\t\"github.com/gruntwork-io/terratest/modu"
  },
  {
    "path": "cmd/terratest_log_parser/main.go",
    "chars": 5285,
    "preview": "// A CLI command to parse parallel terratest output to produce test summaries and break out interleaved test output.\n//\n"
  },
  {
    "path": "docs/.gitignore",
    "chars": 20,
    "preview": ".jekyll-cache\n_site\n"
  },
  {
    "path": "docs/CNAME",
    "chars": 22,
    "preview": "terratest.gruntwork.io"
  },
  {
    "path": "docs/Dockerfile",
    "chars": 601,
    "preview": "FROM ruby:2.6.2-stretch\nMAINTAINER Gruntwork <info@gruntwork.io>\n\n# This project requires bundler 2, but the docker imag"
  },
  {
    "path": "docs/Gemfile",
    "chars": 1011,
    "preview": "source \"https://rubygems.org\"\n# Hello! This is where you manage which Jekyll version is used to run.\n# When you want to "
  },
  {
    "path": "docs/README.md",
    "chars": 13939,
    "preview": "# Terratest website\n\nThis is the code for the [Terratest website](https://terratest.gruntwork.io).\n\nTerratest website is"
  },
  {
    "path": "docs/_config.yml",
    "chars": 2659,
    "preview": "# Welcome to Jekyll!\n#\n# This config file is meant for settings that affect your whole blog, values\n# which you are expe"
  },
  {
    "path": "docs/_data/examples.yml",
    "chars": 5031,
    "preview": "- id: terraform-hello-world\r\n  name: Terraform Hello, World Example\r\n  image: /assets/img/logos/terraform-logo.png\r\n  fi"
  },
  {
    "path": "docs/_data/prism_extends.yml",
    "chars": 49,
    "preview": "sh: bash\ntpl: yaml\ntf: hcl\ntfvars: hcl\nyml: yaml\n"
  },
  {
    "path": "docs/_docs/01_getting-started/examples.md",
    "chars": 292,
    "preview": "---\r\ntitle: Examples\r\ncategory: getting-started\r\nexcerpt: Examples are the best way to start testing Terraform, Docker, "
  },
  {
    "path": "docs/_docs/01_getting-started/godoc.md",
    "chars": 317,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: GoDoc\r\ncategory: getting-started\r\nexcerpt: >-\r\n  Browse Terratest methods an"
  },
  {
    "path": "docs/_docs/01_getting-started/introduction.md",
    "chars": 2362,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Introduction\r\ncategory: getting-started\r\ntoc: true\r\nexcerpt: >-\r\n  Terratest"
  },
  {
    "path": "docs/_docs/01_getting-started/packages-overview.md",
    "chars": 8892,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Package by package overview\r\ncategory: getting-started\r\nexcerpt: >-\r\n  Learn"
  },
  {
    "path": "docs/_docs/01_getting-started/quick-start.md",
    "chars": 13111,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Quick start\r\ncategory: getting-started\r\nexcerpt: Learn how to start with Ter"
  },
  {
    "path": "docs/_docs/01_getting-started/testing-terragrunt.md",
    "chars": 2866,
    "preview": "---\nlayout: collection-browser-doc\ntitle: Testing Terragrunt\ncategory: getting-started\nexcerpt: >-\n  Learn how to test T"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/alternative-testing-tools.md",
    "chars": 4187,
    "preview": "---\nlayout: collection-browser-doc\ntitle: Alternative testing tools\ncategory: testing-best-practices\nexcerpt: >-\n  Learn"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/avoid-test-caching.md",
    "chars": 889,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Avoid test caching\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Since G"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/cleanup.md",
    "chars": 1388,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Cleanup\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Since automated te"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/debugging-interleaved-test-output.md",
    "chars": 6886,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Debugging interleaved test output\r\ncategory: testing-best-practices\r\nexcerpt"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/error-handling.md",
    "chars": 1765,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Error handling\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Learn how t"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/idempotent.md",
    "chars": 907,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Idempotent\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Test that your "
  },
  {
    "path": "docs/_docs/02_testing-best-practices/iterating-locally-using-docker.md",
    "chars": 2214,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Iterating locally using Docker\r\ncategory: testing-best-practices\r\nexcerpt: >"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/iterating-locally-using-test-stages.md",
    "chars": 1824,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Iterating locally using test stages\r\ncategory: testing-best-practices\r\nexcer"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/namespacing.md",
    "chars": 1522,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Namespacing\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Learn how to a"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/picking-instance-types.md",
    "chars": 2511,
    "preview": "---\nlayout: collection-browser-doc\ntitle: Picking EC2 instance types\ncategory: testing-best-practices\nexcerpt: >-\n  Pick"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/testing-environment.md",
    "chars": 939,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Testing environment\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Learn "
  },
  {
    "path": "docs/_docs/02_testing-best-practices/timeouts-and-logging.md",
    "chars": 2217,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Timeouts and logging\r\ncategory: testing-best-practices\r\nexcerpt: >-\r\n  Long-"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/tools-and-plugins.md",
    "chars": 1207,
    "preview": "---\nlayout: collection-browser-doc\ntitle: Tools and Plugins\ncategory: testing-best-practices\nexcerpt: >-\n  Additional to"
  },
  {
    "path": "docs/_docs/02_testing-best-practices/unit-integration-end-to-end-test.md",
    "chars": 1149,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Unit tests, integration tests, end-to-end tests\r\ncategory: testing-best-prac"
  },
  {
    "path": "docs/_docs/04_community/contributing.md",
    "chars": 24246,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Contributing\r\ncategory: community\r\nexcerpt: >-\r\n  Terratest is an open sourc"
  },
  {
    "path": "docs/_docs/04_community/license.md",
    "chars": 515,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: License\r\ncategory: community\r\nexcerpt: >-\r\n  This code is released under the"
  },
  {
    "path": "docs/_docs/04_community/support.md",
    "chars": 967,
    "preview": "---\r\nlayout: collection-browser-doc\r\ntitle: Support\r\ncategory: community\r\nexcerpt: >-\r\n  Need help?\r\ntags: [\"support\", \""
  },
  {
    "path": "docs/_includes/built-by.html",
    "chars": 330,
    "preview": "<div class=\"built-by-cmp box-component\">\n  <div class=\"box shadow\">\n    <h2>Built by <strong>Gruntwork</strong></h2>\n   "
  },
  {
    "path": "docs/_includes/canonical-url.html",
    "chars": 184,
    "preview": "{% if include.url %}{% assign url = include.url %}{% else %}{% assign url = page.url %}{% endif %}{{ site.url | replace:"
  },
  {
    "path": "docs/_includes/collection_browser/_cta-section.html",
    "chars": 36,
    "preview": "{% include links-n-built-by.html %}\n"
  },
  {
    "path": "docs/_includes/collection_browser/_doc-header.html",
    "chars": 1387,
    "preview": "<div class=\"cb-doc-header\">\n  <ol class=\"breadcrumb text-center\">\n    {% assign crumbs = page.url | split: '/' %}\n    <a"
  },
  {
    "path": "docs/_includes/collection_browser/_doc-page.html",
    "chars": 787,
    "preview": "<div class=\"cb-doc-detail\">\n  <div class=\"container-fluid\">\n    <div class=\"row\">\n      <div class=\"col-xs-12\">\n        "
  },
  {
    "path": "docs/_includes/collection_browser/_doc-thumb.html",
    "chars": 2814,
    "preview": "{% assign cb_doc_card_class = '' %}\n\n{% if doc.index_list !=nil and doc.index_list.no_hover_enlarge_effect == true %}\n  "
  },
  {
    "path": "docs/_includes/collection_browser/_doc-thumb__excerpt.html",
    "chars": 196,
    "preview": "{% if doc.excerpt_md %}\n  {{ doc.excerpt_md | markdownify }}\n{% elsif doc.excerpt_html %}\n  {{ doc.excerpt_html }}\n{% el"
  },
  {
    "path": "docs/_includes/collection_browser/_docs-list.html",
    "chars": 537,
    "preview": "<div class=\"col-xs-12 col-md-7 col-lg-9\">\n  <div class=\"row\">\n    <div class=\"cb-doc-listing js-scroll-spy\" data-scroll-"
  },
  {
    "path": "docs/_includes/collection_browser/_no-search-results.html",
    "chars": 483,
    "preview": "<div id=\"no-matches\" class=\"cb-section-white container-fluid\">\n    <div class=\"row text-center\">\n        <div class=\"no-"
  },
  {
    "path": "docs/_includes/collection_browser/_search.html",
    "chars": 2007,
    "preview": "<div class='cb-search-cmp container-fluid' data-collection_name='{{collection_name}}'>\n  <div class=\"row\">\n      <div cl"
  },
  {
    "path": "docs/_includes/collection_browser/_sidebar.html",
    "chars": 1375,
    "preview": "<div class=\"col-md-2-5\">\n  <div id=\"toc\" class=\"cb-doc-sidebar js-scroll-with-user\" data-scroll-after-selector=\"{{ inclu"
  },
  {
    "path": "docs/_includes/collection_browser/browser.html",
    "chars": 2817,
    "preview": "<!-- Basic collection data -->\n{% assign collection_name = include.collection_name %}\n{% assign nav_title = include.nav_"
  },
  {
    "path": "docs/_includes/collection_browser/navigation/_collection_toc.html",
    "chars": 7480,
    "preview": "{% capture tocWorkspace %}\r\n  {% comment %}\r\n    To build navigation:\r\n    == A1: Group docs by categories\r\n    == A2: ["
  },
  {
    "path": "docs/_includes/examples/example.html",
    "chars": 3191,
    "preview": "<div id=\"example__block-{{ include.example.id }}\" class=\"examples__block active\" data-target=\"{{ include.example.id }}\">"
  },
  {
    "path": "docs/_includes/examples/explorer.html",
    "chars": 2151,
    "preview": "<div id=\"{{ include.id }}\" class=\"examples__container {{ include.class }}\">\r\n  <nav class=\"examples__nav\">\r\n    <div cla"
  },
  {
    "path": "docs/_includes/favicon.html",
    "chars": 1761,
    "preview": "{% assign base_favicon_url = site.assets_base_url | append: 'img/favicon' | prepend: site.baseurl %}\n\n<link rel=\"icon\" t"
  },
  {
    "path": "docs/_includes/footer.html",
    "chars": 1307,
    "preview": "<footer class=\"footer\">\n  <div class=\"container-fluid\">\n    <div class=\"row\">\n\n      <div class=\"col-xs-12 col-sm-6\">\n  "
  },
  {
    "path": "docs/_includes/get-access.html",
    "chars": 295,
    "preview": "<div class=\"get-access-cmp\">\n    <span>Get access to a library of over 300,000 lines of battle-tested, production grade "
  },
  {
    "path": "docs/_includes/head.html",
    "chars": 1369,
    "preview": "<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device"
  },
  {
    "path": "docs/_includes/header-min.html",
    "chars": 220,
    "preview": "<div class=\"subpage__header subpage__header--min section-colorful-bg\">\n  {% include navbar.html %}\n  <img src='{{site.ba"
  },
  {
    "path": "docs/_includes/header.html",
    "chars": 511,
    "preview": "<div class=\"subpage__header section-colorful-bg\">\n  {% include navbar.html %}\n  <div class=\"subpage__hero\">\n    <h1>{{ p"
  },
  {
    "path": "docs/_includes/links-n-built-by.html",
    "chars": 86,
    "preview": "<section>\n  {% include built-by.html %}\n  {% include links-section.html %}\n</section>\n"
  },
  {
    "path": "docs/_includes/links-n-get-access.html",
    "chars": 130,
    "preview": "<section class='links-n-get-access__section'>\n    {% include get-access.html %}\n    {% include links-section.html %}\n</s"
  },
  {
    "path": "docs/_includes/links-section.html",
    "chars": 702,
    "preview": "<div class=\"links-section-cmp section-colorful-bg gradient-primary gradient-diagonal\">\n  <h2>Links</h2>\n  <div class=\"li"
  },
  {
    "path": "docs/_includes/logo.html",
    "chars": 210,
    "preview": "<div class=\"terragrunt-logo\">\n  <a class=\"logo-terragrunt\" href=\"{{site.baseurl}}/\">Terratest</a>\n  <a class=\"gruntwork\""
  },
  {
    "path": "docs/_includes/navbar.html",
    "chars": 1672,
    "preview": "<header class=\"header\">\n  <nav class=\"navbar navbar-default\">\n    <div class=\"container-fluid\">\n      <div class=\"navbar"
  },
  {
    "path": "docs/_includes/scripts.html",
    "chars": 1150,
    "preview": "<script src=\"{{site.baseurl}}{{ site.assets_base_url }}js/main.js\"></script>\n{% if page.custom_js %}\n  {% for js_file in"
  },
  {
    "path": "docs/_includes/share-meta.html",
    "chars": 1168,
    "preview": "{% capture title %}{% if page.title %}{{ page.title }}{% else %}{{ site.name }}{% endif %}{% endcapture %}\n{% capture de"
  },
  {
    "path": "docs/_includes/styles.html",
    "chars": 90,
    "preview": "<link rel=\"stylesheet\" href=\"{{site.baseurl}}{{ site.assets_base_url }}css/styles.css\" />\n"
  },
  {
    "path": "docs/_includes/switch.html",
    "chars": 78,
    "preview": "<div class=\"switch-cmp {{ include.class }}\">\n  <span class=\"marker\" />\n</div>\n"
  },
  {
    "path": "docs/_includes/video-player.html",
    "chars": 270,
    "preview": "<div class=\"video-player\" data-video-url=\"{{ include.url }}\">\n  <img src=\"{{ site.baseurl }}/assets/img/terratest_video_"
  },
  {
    "path": "docs/_layouts/collection-browser-doc.html",
    "chars": 570,
    "preview": "---\ncustom_js:\n- prism\n- collection-browser_scroll\n- collection-browser_search\n- collection-browser_toc\n- video-player\n-"
  },
  {
    "path": "docs/_layouts/collection-browser.html",
    "chars": 449,
    "preview": "---\ncustom_js:\n- prism\n- collection-browser_scroll\n- collection-browser_search\n- collection-browser_toc\n- video-player\n-"
  },
  {
    "path": "docs/_layouts/contact.html",
    "chars": 744,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    {% include head.html %}\n  </head>\n  <body{% if page.slug %} class=\"{{ page"
  },
  {
    "path": "docs/_layouts/default.html",
    "chars": 429,
    "preview": "---\ncustom_js:\n- video-player\n- examples\n- prism\n---\n\n<!doctype html>\n<html lang=\"en\">\n    <head>\n        {% include hea"
  },
  {
    "path": "docs/_layouts/post.html",
    "chars": 105,
    "preview": "---\nlayout: default\ncustom_js:\n- prism\n- video-player\n---\n\n<div  class=\"post-bg\">\n  {{ content }}\n</div>\n"
  },
  {
    "path": "docs/_layouts/subpage.html",
    "chars": 387,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    {% include head.html %}\n  </head>\n  <body{% if page.slug %} class=\"{{ page"
  },
  {
    "path": "docs/_pages/404/404.md",
    "chars": 178,
    "preview": "---\npermalink: /404.html\nslug: 404\nlayout: subpage\ntitle: 404\nsubtitle: Page not found :(\nclasses: text-large text-cente"
  },
  {
    "path": "docs/_pages/commercial-support/index.html",
    "chars": 86,
    "preview": "---\npermalink: /commercial-support/\nredirect_to:\n  - https://gruntwork.io/support\n---\n"
  },
  {
    "path": "docs/_pages/contact/_contact-form.html",
    "chars": 1760,
    "preview": "<div class=\"contact-form-container\">\n  <img class='contact-form-back' src='{{ site.baseurl}}/assets/img/contact/right.sv"
  },
  {
    "path": "docs/_pages/contact/index.html",
    "chars": 1089,
    "preview": "---\nlayout: contact\ntitle: contact\nsubtitle: Get help via email, chat, and phone/video from the team that created Terrat"
  },
  {
    "path": "docs/_pages/cookie-policy/index.md",
    "chars": 124,
    "preview": "---\nlayout: subpage\npermalink: /cookie-policy/\nslug: cookie-policy\nredirect_to:\n  - https://gruntwork.io/cookie-policy/\n"
  },
  {
    "path": "docs/_pages/docs/index.html",
    "chars": 288,
    "preview": "---\nlayout: collection-browser\ntitle: Documentation\nsubtitle: Learn how to work with Terratest.\nexcerpt: Learn how to wo"
  },
  {
    "path": "docs/_pages/examples/index.html",
    "chars": 1280,
    "preview": "---\nlayout: collection-browser\ntitle: Examples\nsubtitle: The best way to learn how to use Terratest is through examples."
  },
  {
    "path": "docs/_pages/index/_built_by.html",
    "chars": 393,
    "preview": "<section class=\"section index-page__built-by\">\n  <h2>Built by <strong>Gruntwork</strong></h2>\n  <p class=\"subtitle\">Your"
  },
  {
    "path": "docs/_pages/index/_cta_section.html",
    "chars": 484,
    "preview": "<div class=\"index-page__cta-section section gradient-primary gradient-diagonal text-center\">\r\n  <a href=\"{{ site.baseurl"
  },
  {
    "path": "docs/_pages/index/_header.html",
    "chars": 1318,
    "preview": "<div class=\"section section-hero section-colorful-bg\">\n  {% include navbar.html %}\n  <div class=\"index-page__header\">\n  "
  },
  {
    "path": "docs/_pages/index/_terratest-in-4-steps.html",
    "chars": 2471,
    "preview": "<div class=\"index-page__terratest-in-4-steps\">\n\n  <div class=\"section text-center container-fluid\">\n    <div class=\"row\""
  },
  {
    "path": "docs/_pages/index/_test-with-terratest.html",
    "chars": 339,
    "preview": "<div id=\"index-page__test-with-terratest\" class=\"section index-page__test-with-terratest\">\n\n  <div class=\"text-center co"
  },
  {
    "path": "docs/_pages/index/_watch.html",
    "chars": 1404,
    "preview": "<div class=\"index-page__watch\">\r\n\r\n  <div class=\"section text-center container-fluid\">\r\n    <div class=\"row flex align-i"
  },
  {
    "path": "docs/_pages/index/index.html",
    "chars": 386,
    "preview": "---\nlayout: default\npermalink: /\nslug: index-page\n---\n\n<div class=\"main\">\n  {% include_relative _header.html %}\n  {% inc"
  },
  {
    "path": "docs/_pages/thanks/index.html",
    "chars": 670,
    "preview": "---\nlayout: default\ntitle: Thank you.\nexcerpt: Thank you for contacting us. A Grunt will be in touch soon!\npermalink: /t"
  },
  {
    "path": "docs/_posts/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/assets/css/_variables.scss",
    "chars": 591,
    "preview": "$primary-color: #07a7fd;\n$primary-color-2: #068ee4;\n\n$gray-color-1: #f0f0f1;\n$gray-color-2: #dedede;\n$gray-color-3: #bbb"
  },
  {
    "path": "docs/assets/css/bootstrap/scss/bootstrap.scss",
    "chars": 145737,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "docs/assets/css/collection_browser.scss",
    "chars": 42243,
    "preview": ".collection-browser-doc.subpage .subpage__header {\r\n  padding-top: 5px;\r\n  padding-bottom: 5px;\r\n  overflow: hidden;\r\n\r\n"
  },
  {
    "path": "docs/assets/css/components.scss",
    "chars": 4724,
    "preview": ".box-component {\n  position: relative;\n  z-index: 1;\n  max-width: 800px;\n  margin: auto;\n\n  .box {\n    max-width: 800px;"
  },
  {
    "path": "docs/assets/css/examples.scss",
    "chars": 10420,
    "preview": ".examples__container {\r\n  max-width: 1200px;\r\n  padding: 15px 50px;\r\n  margin-left: auto;\r\n  margin-right: auto;\r\n  .exa"
  },
  {
    "path": "docs/assets/css/global.scss",
    "chars": 19986,
    "preview": "//\n// BODY\n// -------------------------------------------------------\nbody {\n  background: #fff;\n}\n\n@media all and (max-"
  },
  {
    "path": "docs/assets/css/pages/contact.scss",
    "chars": 5679,
    "preview": "\n.contact {\n  font-family: \"Source Sans Pro\", sans-serif;\n  background: #001191;\n  background: -webkit-linear-gradient(-"
  },
  {
    "path": "docs/assets/css/pages/cookie-policy.scss",
    "chars": 80,
    "preview": ".page-cookie-policy {\n  .container > .row + .row {\n    padding-top: 28px;\n  }\n}\n"
  },
  {
    "path": "docs/assets/css/pages/home.scss",
    "chars": 8583,
    "preview": "body.index-page {\n  header.header {\n    z-index: 20;\n    position: relative;\n  }\n\n  .section.section-hero {\n    position"
  },
  {
    "path": "docs/assets/css/pages/support.scss",
    "chars": 103,
    "preview": ".page-support {\n  .subheader {\n    font-weight: bold; font-style:italic; margin: -16px 0 10px 0;\n  }\n}\n"
  },
  {
    "path": "docs/assets/css/prism.css",
    "chars": 2762,
    "preview": "/* PrismJS 1.17.1\nhttps://prismjs.com/download#themes=prism-solarizedlight&languages=markup+css+clike+javascript+bash+ru"
  },
  {
    "path": "docs/assets/css/prism_custom.scss",
    "chars": 506,
    "preview": ".token.atrule, .token.attr-value, .token.keyword {\n  color: #07a7fd;\n}\n\n.token.function, .token.class-name {\n  color: #0"
  },
  {
    "path": "docs/assets/css/styles.scss",
    "chars": 478,
    "preview": "---\n# Frontmatter\n---\n\n@import \"_variables\";\n@import \"bootstrap/scss/bootstrap\";\n@import \"global\";\n@import \"components\";"
  },
  {
    "path": "docs/assets/css/subpage.scss",
    "chars": 2301,
    "preview": ".subpage {\n  .subpage-top-spacing.main.subpage__main {\n    padding-top: 120px;\n  }\n\n  .subpage__header {\n    background:"
  },
  {
    "path": "docs/assets/css/utilities.scss",
    "chars": 4335,
    "preview": ".text-red {\n  color: #f44336;\n}\n\n.text-pink {\n  color: #e91e63;\n}\n\n.text-purple {\n  color: #9c27b0;\n}\n\n.text-deep-purple"
  },
  {
    "path": "docs/assets/img/favicon/browserconfig.xml",
    "chars": 338,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig><msapplication><tile><square70x70logo src=\"/assets/img/favicon/ms-"
  },
  {
    "path": "docs/assets/img/favicon/manifest.json",
    "chars": 828,
    "preview": "{\n \"name\": \"App\",\n \"icons\": [\n  {\n   \"src\": \"/assets/img/favicon/android-icon-36x36.png\",\n   \"sizes\": \"36x36\",\n   \"type\""
  },
  {
    "path": "docs/assets/js/collection-browser_scroll.js",
    "chars": 3698,
    "preview": "$(document).ready(function () {\n\n  const getElementForDataSelector = function (parentElement, selectorName, elementName)"
  },
  {
    "path": "docs/assets/js/collection-browser_search.js",
    "chars": 7266,
    "preview": "/**\n * Javascript for the Collection Browser search.\n *\n * TOC:\n *  - FILTER FUNCTIONS - functions to extract the terms "
  },
  {
    "path": "docs/assets/js/collection-browser_toc.js",
    "chars": 1965,
    "preview": "$(document).ready(function () {\n  $('#toc-toggle-open').on('click', function () {\n    $('.col-md-2-5').addClass('opened'"
  },
  {
    "path": "docs/assets/js/contact-form.js",
    "chars": 2104,
    "preview": "\n/* Contact form */\n$(function() {\n  var submitButton = $(\"#submit-button\");\n  var form = $(\"#contact-form\");\n  \n  selec"
  },
  {
    "path": "docs/assets/js/cookie.js",
    "chars": 1183,
    "preview": "---\n---\n/**\n * Cookie notice\n * @author AKOS\n *\n * This cookie script must load AFTER the Intercom code above to detect "
  },
  {
    "path": "docs/assets/js/examples.js",
    "chars": 11031,
    "preview": "---\n---\n$(document).ready(function () {\n\n  const CODE_LINE_HEIGHT = 22\n  const CODE_BLOCK_PADDING = 10\n\n  window.example"
  },
  {
    "path": "docs/assets/js/main.js",
    "chars": 141417,
    "preview": "/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typ"
  },
  {
    "path": "docs/assets/js/prism.js",
    "chars": 28802,
    "preview": "/* PrismJS 1.17.1\nhttps://prismjs.com/download#themes=prism-solarizedlight&languages=markup+css+clike+javascript+bash+ru"
  },
  {
    "path": "docs/assets/js/video-player.js",
    "chars": 500,
    "preview": "$(document).ready(function () {\n  $('.video-player').on('click', function() {\n    if ($(this).find('.frame').length > 0)"
  },
  {
    "path": "docs/docker-compose.yml",
    "chars": 689,
    "preview": "version: '3'\n\nservices:\n  web:\n    build: .\n    volumes:\n      # Bind mount the working dir so the app reloads automatic"
  },
  {
    "path": "docs/jekyll-serve.sh",
    "chars": 150,
    "preview": "#!/bin/bash\n\nset -e\n\necho -e \"\\e[1;31mRun Jekyll serve to watch for changes\"\nbundle exec jekyll serve --no-watch --liver"
  },
  {
    "path": "docs/scripts/convert_adoc_to_md.sh",
    "chars": 419,
    "preview": "# Required:\n#  - asciidoctor\n#  - pandoc\n#\n# Install Asciidoctor:\n# $ sudo apt-get install asciidoctor\n#\n# Install Pando"
  },
  {
    "path": "docs/scripts/convert_md_to_adoc.sh",
    "chars": 195,
    "preview": "# Create input.md file, paste markdown text, and run script. The output will be printed to the output.adoc file.\npandoc "
  },
  {
    "path": "examples/azure/README.md",
    "chars": 3759,
    "preview": "# Terratest Configuration and Setup\n\nTerratest uses Go to make calls to Azure through the azure-sdk-for-go library and i"
  },
  {
    "path": "examples/azure/terraform-azure-aci-example/README.md",
    "chars": 1964,
    "preview": "# Terraform Azure Example\n\nThis folder contains a Terraform module that deploys resources in [Azure](https://azure.micro"
  },
  {
    "path": "examples/azure/terraform-azure-aci-example/main.tf",
    "chars": 2023,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-aci-example/output.tf",
    "chars": 291,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.rg.name\n}\n\noutput \"ip_address\" {\n  value = azurerm_conta"
  },
  {
    "path": "examples/azure/terraform-azure-aci-example/variables.tf",
    "chars": 1316,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-acr-example/README.md",
    "chars": 1981,
    "preview": "# Terraform Azure Container Registry Example\n\nThis folder contains a Terraform module that deploys resources in [Azure]("
  },
  {
    "path": "examples/azure/terraform-azure-acr-example/main.tf",
    "chars": 1766,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-acr-example/output.tf",
    "chars": 455,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.rg.name\n}\n\noutput \"container_registry_name\" {\n  value = "
  },
  {
    "path": "examples/azure/terraform-azure-acr-example/variables.tf",
    "chars": 1403,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-actiongroup-example/README.md",
    "chars": 2480,
    "preview": "# Terraform Azure Action Group Example\n\nThis folder contains a Terraform module that deploys an [Azure Action Group](htt"
  },
  {
    "path": "examples/azure/terraform-azure-actiongroup-example/main.tf",
    "chars": 2290,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-actiongroup-example/output.tf",
    "chars": 82,
    "preview": "output \"action_group_id\" {\n  value = azurerm_monitor_action_group.actionGroup.id\n}"
  },
  {
    "path": "examples/azure/terraform-azure-actiongroup-example/variables.tf",
    "chars": 2663,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-aks-example/README.md",
    "chars": 2928,
    "preview": "# Terraform Azure AKS Example\n\nThis folder contains a Terraform module that deploys a basic AKS cluster in [Azure](https"
  },
  {
    "path": "examples/azure/terraform-azure-aks-example/main.tf",
    "chars": 2983,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-aks-example/nginx-deployment.yml",
    "chars": 498,
    "preview": "---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: nginx-deployment\nspec:\n  selector:\n    matchLabels:\n      app"
  },
  {
    "path": "examples/azure/terraform-azure-aks-example/output.tf",
    "chars": 801,
    "preview": "output \"client_key\" {\n  value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key\n}\n\noutput \"client_certificate\" {"
  },
  {
    "path": "examples/azure/terraform-azure-aks-example/variables.tf",
    "chars": 1578,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-availabilityset-example/README.md",
    "chars": 2703,
    "preview": "# Terraform Azure Availability Set Example\n\nThis folder contains a simple Terraform module that deploys resources in [Az"
  },
  {
    "path": "examples/azure/terraform-azure-availabilityset-example/main.tf",
    "chars": 5281,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-availabilityset-example/outputs.tf",
    "chars": 322,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.avs.name\n}\n\noutput \"availability_set_name\" {\n  value = a"
  },
  {
    "path": "examples/azure/terraform-azure-availabilityset-example/variables.tf",
    "chars": 1465,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-container-apps-example/README.md",
    "chars": 1916,
    "preview": "# Terraform Azure Container Apps Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azur"
  },
  {
    "path": "examples/azure/terraform-azure-container-apps-example/main.tf",
    "chars": 3968,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-container-apps-example/outputs.tf",
    "chars": 321,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.aca.name\n}\n\noutput \"container_app_env_name\" {\n  value = "
  },
  {
    "path": "examples/azure/terraform-azure-container-apps-example/variables.tf",
    "chars": 1318,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-cosmosdb-example/README.md",
    "chars": 2172,
    "preview": "# Terraform Azure CosmosDB Example\n\nThis folder contains a complete Terraform Cosmos DB module that deploys resources in"
  },
  {
    "path": "examples/azure/terraform-azure-cosmosdb-example/main.tf",
    "chars": 3858,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-cosmosdb-example/outputs.tf",
    "chars": 319,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.rg.name\n}\n\noutput \"account_name\" {\n  value = azurerm_cos"
  },
  {
    "path": "examples/azure/terraform-azure-cosmosdb-example/variables.tf",
    "chars": 1010,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-datafactory-example/README.md",
    "chars": 1885,
    "preview": "# Terraform Azure Data Factory Example\n\nThis folder contains a Terraform module that deploys resources in [Azure](https:"
  },
  {
    "path": "examples/azure/terraform-azure-datafactory-example/main.tf",
    "chars": 2438,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-datafactory-example/outputs.tf",
    "chars": 166,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.datafactory_rg.name\n}\n\noutput \"datafactory_name\" {\n  val"
  },
  {
    "path": "examples/azure/terraform-azure-datafactory-example/variables.tf",
    "chars": 1320,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-disk-example/README.md",
    "chars": 2315,
    "preview": "# Terraform Azure Disk Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](https:/"
  },
  {
    "path": "examples/azure/terraform-azure-disk-example/main.tf",
    "chars": 1984,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-disk-example/outputs.tf",
    "chars": 225,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.disk_rg.name\n}\n\noutput \"disk_name\" {\n  value = azurerm_m"
  },
  {
    "path": "examples/azure/terraform-azure-disk-example/variables.tf",
    "chars": 1439,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-example/README.md",
    "chars": 6022,
    "preview": "# Terraform Azure Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](https://azur"
  },
  {
    "path": "examples/azure/terraform-azure-example/main.tf",
    "chars": 4677,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-example/outputs.tf",
    "chars": 142,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.main.name\n}\n\noutput \"vm_name\" {\n  value = azurerm_virtua"
  },
  {
    "path": "examples/azure/terraform-azure-example/variables.tf",
    "chars": 1456,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-frontdoor-example/README.md",
    "chars": 1862,
    "preview": "# Terraform Azure Front Door Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](h"
  },
  {
    "path": "examples/azure/terraform-azure-frontdoor-example/main.tf",
    "chars": 2464,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-frontdoor-example/output.tf",
    "chars": 591,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.rg.name\n}\n\noutput \"front_door_name\" {\n  description = \"S"
  },
  {
    "path": "examples/azure/terraform-azure-frontdoor-example/variables.tf",
    "chars": 1135,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-functionapp-example/README.md",
    "chars": 2165,
    "preview": "# Terraform Azure Function App Example\n\nThis folder contains a Terraform module that deploys a Function App in [Azure](h"
  },
  {
    "path": "examples/azure/terraform-azure-functionapp-example/main.tf",
    "chars": 4098,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-functionapp-example/output.tf",
    "chars": 409,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.app_rg.name\n}\n\noutput \"function_app_id\" {\n  value = azur"
  },
  {
    "path": "examples/azure/terraform-azure-functionapp-example/variables.tf",
    "chars": 1316,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-keyvault-example/README.md",
    "chars": 2637,
    "preview": "# Terraform Azure Keyvault Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](htt"
  },
  {
    "path": "examples/azure/terraform-azure-keyvault-example/main.tf",
    "chars": 6021,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-keyvault-example/outputs.tf",
    "chars": 412,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.resource_group.name\n}\n\noutput \"key_vault_name\" {\n  value"
  },
  {
    "path": "examples/azure/terraform-azure-keyvault-example/variables.tf",
    "chars": 1727,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-loadbalancer-example/README.md",
    "chars": 3419,
    "preview": "# Terraform Load Balancer Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](http"
  },
  {
    "path": "examples/azure/terraform-azure-loadbalancer-example/main.tf",
    "chars": 5143,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-loadbalancer-example/outputs.tf",
    "chars": 885,
    "preview": "output \"lb_default_name\" {\n  value = azurerm_lb.default.name\n}\n\noutput \"lb_private_name\" {\n  value = azurerm_lb.private."
  },
  {
    "path": "examples/azure/terraform-azure-loadbalancer-example/variables.tf",
    "chars": 1460,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-loganalytics-example/README.md",
    "chars": 3060,
    "preview": "# Terraform Azure Log Analytics Example\n\nThis folder contains a Terraform module that deploys resources in [Azure](https"
  },
  {
    "path": "examples/azure/terraform-azure-loganalytics-example/main.tf",
    "chars": 1781,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-loganalytics-example/outputs.tf",
    "chars": 442,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.resource_group.name\n}\n\noutput \"loganalytics_workspace_na"
  },
  {
    "path": "examples/azure/terraform-azure-loganalytics-example/variables.tf",
    "chars": 1309,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-monitor-example/README.md",
    "chars": 2518,
    "preview": "# Terraform Azure Monitor Example\n\nThis folder contains a simple Terraform module that deploys resources in [Azure](http"
  },
  {
    "path": "examples/azure/terraform-azure-monitor-example/main.tf",
    "chars": 4795,
    "preview": "# ---------------------------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "examples/azure/terraform-azure-monitor-example/outputs.tf",
    "chars": 332,
    "preview": "output \"resource_group_name\" {\n  value = azurerm_resource_group.monitor.name\n}\n\noutput \"diagnostic_setting_name\" {\n  val"
  }
]

// ... and 930 more files (download for full content)

About this extraction

This page contains the full source code of the gruntwork-io/terratest GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1130 files (3.0 MB), approximately 849.1k tokens, and a symbol index with 3057 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!