Source code for infrahouse_toolkit.terraform.tests.status.test_comment
import json
from base64 import b64decode
from os import path as osp
import pytest
from infrahouse_toolkit.terraform.backends import TFS3Backend
from infrahouse_toolkit.terraform.status import RunOutput, RunResult, TFStatus
[docs]@pytest.mark.parametrize(
"plan_file, result_counts, expected_comment",
[
(
"plan-no-output.stdout",
(1, 1, 1),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | 🟢 Add | 🟡 Change | 🔴 Destroy |
|----------:|---------:|------------:|-------------:|
| ✅ | 1 | 1 | 1 |
<details>
<summary>STDOUT</summary>
```
no stdout
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAxLCAiY2hhbmdlIjogMSwgImRlc3Ryb3kiOiAxfX0=
```
</details>""",
),
(
"plan-0-0-0.stdout",
(0, 0, 0),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | Add | Change | Destroy |
|----------:|-------:|----------:|-----------:|
| ✅ | 0 | 0 | 0 |
<details>
<summary>STDOUT</summary>
```
Terraform has compared your real infrastructure against your configuration
and found no differences, so no changes are needed.
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAwLCAiY2hhbmdlIjogMCwgImRlc3Ryb3kiOiAwfX0=
```
</details>""",
),
(
"plan-2-0-0.stdout",
(2, 0, 0),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | 🟢 Add | Change | Destroy |
|----------:|---------:|----------:|-----------:|
| ✅ | 2 | 0 | 0 |
<details>
<summary>STDOUT</summary>
```
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# module.repos["test"].github_repository.repo will be created
+ resource "github_repository" "repo" {
+ allow_auto_merge = false
+ allow_merge_commit = true
+ allow_rebase_merge = true
+ allow_squash_merge = true
+ archived = false
+ default_branch = (known after apply)
+ delete_branch_on_merge = false
+ description = "Template for a GitHub Control repository"
+ etag = (known after apply)
+ full_name = (known after apply)
+ git_clone_url = (known after apply)
+ has_issues = true
+ html_url = (known after apply)
+ http_clone_url = (known after apply)
+ id = (known after apply)
+ merge_commit_message = "PR_TITLE"
+ merge_commit_title = "MERGE_MESSAGE"
+ name = "test"
+ node_id = (known after apply)
+ private = (known after apply)
+ repo_id = (known after apply)
+ squash_merge_commit_message = "COMMIT_MESSAGES"
+ squash_merge_commit_title = "COMMIT_OR_PR_TITLE"
+ ssh_clone_url = (known after apply)
+ svn_url = (known after apply)
+ visibility = "public"
+ security_and_analysis {
+ advanced_security {
+ status = (known after apply)
}
+ secret_scanning {
+ status = (known after apply)
}
+ secret_scanning_push_protection {
+ status = (known after apply)
}
}
}
# module.repos["test"].github_team_repository.dev will be created
+ resource "github_team_repository" "dev" {
+ etag = (known after apply)
+ id = (known after apply)
+ permission = "push"
+ repository = "test"
+ team_id = "7332815"
}
Plan: 2 to add, 0 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: tf.plan
To perform exactly these actions, run the following command to apply:
terraform apply "tf.plan"
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAyLCAiY2hhbmdlIjogMCwgImRlc3Ryb3kiOiAwfX0=
```
</details>""",
),
(
"plan-2-1-2.stdout",
(2, 1, 2),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | 🟢 Add | 🟡 Change | 🔴 Destroy |
|----------:|---------:|------------:|-------------:|
| ✅ | 2 | 1 | 2 |
<details>
<summary>STDOUT</summary>
```
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
~ update in-place
- destroy
Terraform will perform the following actions:
# module.repos["cookiecutter-github-control"].github_repository.repo will be destroyed
# (because module.repos["cookiecutter-github-control"] is not in configuration)
- resource "github_repository" "repo" {
- allow_auto_merge = false -> null
- allow_merge_commit = true -> null
- allow_rebase_merge = true -> null
- allow_squash_merge = true -> null
- allow_update_branch = false -> null
- archived = false -> null
- default_branch = "main" -> null
- delete_branch_on_merge = false -> null
- description = "Template for a GitHub Control repository" -> null
- etag = "W/\\\"8b4a792bc1474d381caaa63b76668993b4adc42ae76ed53d6886d8562ebb0c67\\\"" -> null
- full_name = "infrahouse/cookiecutter-github-control" -> null
- git_clone_url = "git://github.com/infrahouse/cookiecutter-github-control.git" -> null
- has_discussions = false -> null
- has_downloads = false -> null
- has_issues = true -> null
- has_projects = false -> null
- has_wiki = false -> null
- html_url = "https://github.com/infrahouse/cookiecutter-github-control" -> null
- http_clone_url = "https://github.com/infrahouse/cookiecutter-github-control.git" -> null
- id = "cookiecutter-github-control" -> null
- is_template = false -> null
- merge_commit_message = "PR_TITLE" -> null
- merge_commit_title = "MERGE_MESSAGE" -> null
- name = "cookiecutter-github-control" -> null
- node_id = "R_kgDOI528zg" -> null
- private = false -> null
- repo_id = 597540046 -> null
- squash_merge_commit_message = "COMMIT_MESSAGES" -> null
- squash_merge_commit_title = "COMMIT_OR_PR_TITLE" -> null
- ssh_clone_url = "git@github.com:infrahouse/cookiecutter-github-control.git" -> null
- svn_url = "https://github.com/infrahouse/cookiecutter-github-control" -> null
- topics = [] -> null
- visibility = "public" -> null
- vulnerability_alerts = false -> null
- security_and_analysis {
- secret_scanning {
- status = "disabled" -> null
}
- secret_scanning_push_protection {
- status = "disabled" -> null
}
}
}
# module.repos["cookiecutter-github-control"].github_team_repository.dev will be destroyed
# (because module.repos["cookiecutter-github-control"] is not in configuration)
- resource "github_team_repository" "dev" {
- etag = "W/\\\"8043f81b19693f6c1a72d21bb8dc03859c98bf78bfbe79782bfe13fa813992ca\\\"" -> null
- id = "7332815:cookiecutter-github-control" -> null
- permission = "push" -> null
- repository = "cookiecutter-github-control" -> null
- team_id = "7332815" -> null
}
# module.repos["infrahouse-toolkit"].github_repository.repo will be updated in-place
~ resource "github_repository" "repo" {
~ description = "InfraHouse Toolkit" -> "InfraHouse Toolkit1"
id = "infrahouse-toolkit"
name = "infrahouse-toolkit"
# (31 unchanged attributes hidden)
# (1 unchanged block hidden)
}
# module.repos["test"].github_repository.repo will be created
+ resource "github_repository" "repo" {
+ allow_auto_merge = false
+ allow_merge_commit = true
+ allow_rebase_merge = true
+ allow_squash_merge = true
+ archived = false
+ default_branch = (known after apply)
+ delete_branch_on_merge = false
+ description = "Template for a GitHub Control repository"
+ etag = (known after apply)
+ full_name = (known after apply)
+ git_clone_url = (known after apply)
+ has_issues = true
+ html_url = (known after apply)
+ http_clone_url = (known after apply)
+ id = (known after apply)
+ merge_commit_message = "PR_TITLE"
+ merge_commit_title = "MERGE_MESSAGE"
+ name = "test"
+ node_id = (known after apply)
+ private = (known after apply)
+ repo_id = (known after apply)
+ squash_merge_commit_message = "COMMIT_MESSAGES"
+ squash_merge_commit_title = "COMMIT_OR_PR_TITLE"
+ ssh_clone_url = (known after apply)
+ svn_url = (known after apply)
+ visibility = "public"
+ security_and_analysis {
+ advanced_security {
+ status = (known after apply)
}
+ secret_scanning {
+ status = (known after apply)
}
+ secret_scanning_push_protection {
+ status = (known after apply)
}
}
}
# module.repos["test"].github_team_repository.dev will be created
+ resource "github_team_repository" "dev" {
+ etag = (known after apply)
+ id = (known after apply)
+ permission = "push"
+ repository = "test"
+ team_id = "7332815"
}
Plan: 2 to add, 1 to change, 2 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: tf.plan
To perform exactly these actions, run the following command to apply:
terraform apply "tf.plan"
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAyLCAiY2hhbmdlIjogMSwgImRlc3Ryb3kiOiAyfX0=
```
</details>""",
),
(
"plan-0-2-0-a.stdout",
(0, 2, 0),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | Add | 🟡 Change | Destroy |
|----------:|-------:|------------:|-----------:|
| ✅ | 0 | 2 | 0 |
<details>
<summary>STDOUT</summary>
```
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# module.website.aws_autoscaling_group.website will be updated in-place
~ resource "aws_autoscaling_group" "website" {
id = "web20231125205239428700000003"
name = "web20231125205239428700000003"
# (32 unchanged attributes hidden)
~ launch_template {
id = "lt-042ea5dd55b0fff3b"
name = "web20231125205151213200000001"
~ version = "8" -> (known after apply)
}
# (9 unchanged blocks hidden)
}
# module.website.aws_launch_template.website will be updated in-place
~ resource "aws_launch_template" "website" {
id = "lt-042ea5dd55b0fff3b"
~ latest_version = 8 -> (known after apply)
name = "web20231125205151213200000001"
tags = {}
~ user_data = "Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJNSU1FQk9VTkRBUlkiCk1JTUUtVmVyc2lvbjogMS4wDQoNCi0tTUlNRUJPVU5EQVJZDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQpDb250ZW50LVR5cGU6IHRleHQvY2xvdWQtY29uZmlnDQpNaW1lLVZlcnNpb246IDEuMA0KDQojY2xvdWQtY29uZmlnCiJhcHQiOgogICJzb3VyY2VzIjoKICAgICJpbmZyYWhvdXNlIjoKICAgICAgImtleSI6IHwKICAgICAgICAtLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KCiAgICAgICAgbVFJTkJHUzdGdGtCRUFERitZbURnNlF2c3Y1VjZaUXcrUWh4ZFR2ak1YZUxDOVQ2UkZSVkQ5NDdxS3p0Tk5RbgogICAgICAgICtBL3l4cHJMQW1XMjVVdS8xMW9Dc3pOVklJYVIzT1k4TXR5aWxiQ3R6VWtCenZXZGxYM0h2VHc5MUxwOGJ4VUwKICAgICAgICBFWE9NOW5zY3FPck92ZkJqYW5wbEtERUtQTVk2dklaM2twMXJVc0NOR0xCTDB4MktaZ1U4MHVsUnNNTThxbkJOCiAgICAgICAga3BUaUFlWEtPRVZ0UnpsV2x2T0ZMSjdwWUR2YVowVWdIU1Z1RStaa2xkcU9kTExScEtrZEl2SlBja1hxTDV4VAogICAgICAgIFV2V1RXMWVuRkFIZDUrTlF4TW5DYTNpa2pRVjNEVGxFanNnTExRYmJ5c1hqWFByNlBJUHMyOWNUY2ZvcTQzMU8KICAgICAgICB0UjREclpCNHZNRU9BODhUbUtCa0VpTUcraUI5Y2p6NXdCSXVNdTk1Wm1vSnhkdmpQUjcyRllLZ3JDWE50TmhkCiAgICAgICAgVmVyRVJ2cExUaGRhUm1aZ2k3bHkrRHZrWTdMcXlKUHZkSGNxeGVkZ0ZuUEtSNFQrZ1NRbWJVUGQ5cXFkSlIwUQogICAgICAgIEtsL1BtdHVTL3c5Z3kyWjRheTBRSUtyTkJ6UXhoQThMRFpwcDFydWZDSjUrWk1lZjkwdkhwd3hNK09hUHJ5TmwKICAgICAgICBFZERXN1lROGZ1QjVuUHFqd1VBcG1sWVlMSllsZDd2Sjc5RUl4L3NqZ2g2RytJRmltN3hSN1dpUUYvbkpldmZxCiAgICAgICAgdnpZTzdvci9HSUNiNmVad3ZQZHR5NzlIbVZlUHFFVGxEVTAwb3lvcFd5VHNZeVNZRFNIbi80ZG9UdXg4ditGLwogICAgICAgIFlleWJ2Z3FicmlIN2lTRjhIeHdFRmVEanJNdFVUSHNYQzM1REhGZU1DaEpveHN5S3Y0OEorYklHRndBUkFRQUIKICAgICAgICB0QzFKYm1aeVlVaHZkWE5sSUZCaFkydGhaMlZ5SUR4d1lXTnJZV2RsY2tCcGJtWnlZV2h2ZFhObExtTnZiVDZKCiAgICAgICAgQWxRRUV3RUtBRDRXSVFTaU5oNWtZM3c4VzBnQUY4WGd1SmFveGZjRDd3VUNaTHNXMlFJYkF3VUpBOEpuQUFVTAogICAgICAgIENRZ0hBZ1lWQ2drSUN3SUVGZ0lEQVFJZUFRSVhnQUFLQ1JEZ3VKYW94ZmNEN3diN0QvOWVuYnRPMURFUW4xUHQKICAgICAgICBoZ2t0SCtJcmJCZFlSSGs3MWlsMmhibm1BYm9Ma2sxYWsvYWFRWS9YUURKRmhyQTdqTWtQTE9DUmVvdEhpUW12CiAgICAgICAgMVVmcURjTTJlUTQveDBOOUYyRExVU2t1d3cxMTd2dHRVb0J4aXJCNzJwTzBUL2xkOW8zOVNITUMvRGZrNnk2aAogICAgICAgIHRUR3F4TGdoOGozRFN5TzVFRXJKTGEvM0J2TXFyNGlxYjNQVHdOZURSRWphdlFKaFhTdkVGanlBQ29vOWQ3cnMKICAgICAgICA3bGhDYmJTUGpnVGNHL1BDZnpMcjM3UXl6WGlUUi9Ud2ppd1ZkVGhkQ1MvQ0tuc29NOG5nSHhqWFlwSzdNNndnCiAgICAgICAgdHpBOEprSFpyNU1wa3JQR3JnUWV2aEpCTGtIUi9qY3NhYUJaTjdudzhhZUhjd3dNNC9DaEhJeVpkUTkxMDU5cAogICAgICAgIE9NYVltV21qUFFmcTFyT25BQXZBMXhXdytUWk56SGdXSXE0dnVzeDdPQnZyRnNWZVpOc3FkN09hNHBydFZXZzAKICAgICAgICA5MWNLWkpvL092Nm9wTS93RFdOMnlCbmttQkN3YVhwb0g1TkRRMjJiaG5HVEplSVdkZWk4VVNHcHZCa1R4QkkyCiAgICAgICAgWDMycHlPbVpEbjgxTDJ6TTJpb052Z1hJYjV1NXRqYjlOT2lBdDZvVzBHMHgwMGRncjNyNnB1OHFtTXdrQlZCQwogICAgICAgIHZXd0VtYXhRbmtUaG5iQWQ1N1ZiYXQ0Ly91RGNIRnBEYUJQcEZXZUNMMmRmRFNyUzlpaUs2SzFWa3ZHTG9YaDgKICAgICAgICBNcEpxam9kZHBmTmg0dXlmekt5TkUxZHJRMjltY3dmSWx6WG9QcmIwOVc2WkhwbSt0cWQ4TWs3MDd6d3NkRkdSCiAgICAgICAgcVJzeG10UG45SjFyZVlaaVZ1RTVHMjZmMWFLVFI3a0NEUVJrdXhiWkFSQUE0KzlrbjRzbUJYWmNNMHZGcTlSOAogICAgICAgIDI0WEtadFRhVm1Wb1ZKTVJRTTQ0cVdSK3MvUzBNenZiTzV1MGNTVlRoWTY1WXpNTHM5MjBVWTZ1R3BvUzJaWXcKICAgICAgICBJTWlwa2FCKzJGNkI4UjdWN25sL1NnYVhHYTJNZXhrQzd3dDZibEZiYXc3cGJ2SStpSTl3UzhCS0hnTUR6ZDBGCiAgICAgICAgVGpTcTl2ZGtWa2Y3eUkzaEV3bGxYN3pUNklMT3Zrbk5HYm9zMGRGSTkyY0JXUXMraVhQNTB4RFZpdDMrOW1DRAogICAgICAgIHJ1V1ZZazczbXZTRXpGY3VYQ3liS0o1VS9uelNRNzBKb1FtU1BjNTBSUWp1SEdkemwvWXpHRmFGbjV6SVo1cFAKICAgICAgICBrNVMrS1RZZWt6Y2lSa0h6YmVhNVBqK0E2S1ppbEtqNXlrQVJGencrQ1B4cXN1ZWpEa2k3QSthM20zV0dxK21tCiAgICAgICAgQWtsUTRZQmNvbHpOT3BnV2NsSVN1RTNkNWtndGFKQUNJZ3RlODdGNlFCQnNrOG9EQkZRQ25abW9PaXJsU2xiZgogICAgICAgIEp1RDZmVkNKdTJ6WTdUaE4xTzBvV1R3QWFOQXZNNTVDTFR2NnMzRm10UjkybG5sUURGdUorZmo4NjNjNnF4MTQKICAgICAgICBGdU80bU03ZXVTMDh3R2dWR205MXdBN2JZbDRhaHhDNlMyQkdCNUZ2a1pmekJCd2pzZm1VV0hBdTdWUlpKeGtYCiAgICAgICAgSnA2OTZPVGRSM1JmSTdJWjZPVzZ0R0VMaWpzd1diYlpYYjVYUldFVzk5dldPN05JSzZzT3ZoTUROcDliU011YgogICAgICAgIFhQM1BiUHhneVQwYm1zczB5d05Zd3VjbmZjbURYcVBWdTNHZHQ1M2F0MStoSzdtbG5RM3VVczVlVkVPSUhuSm0KICAgICAgICBmMXRyRGdnU1RFN2Zua3g2Q3psK2lNa0FFUUVBQVlrQ1BBUVlBUW9BSmhZaEJLSTJIbVJqZkR4YlNBQVh4ZUM0CiAgICAgICAgbHFqRjl3UHZCUUprdXhiWkFoc01CUWtEd21jQUFBb0pFT0M0bHFqRjl3UHY4U1FQL2pzUWZKQ1VIcmpwWDRmUAogICAgICAgIDBOdFZ5cWxDcnExT21MUDdCTHJYckN4b0FGUmI2NFlKVWRXazVQMzVrOXdqMkJRanBqY05qMmlrODBGb28wMkUKICAgICAgICB5YytQelcvNHR6VnZkeFJyRXpzT0ZtK21NUitsbFVIQUt6QmE2UUJ4SFQwb2ZMN3A1WFlUdU1ObllvK1BqVk1tCiAgICAgICAgalAzVEVKR1lYWW11aEdmYWFKWnBqTG1KRnFwNTl4Ly9kc01IZUxxVUNod2I2Q2c2RHVrQWloZUFzM1ArclhvMwogICAgICAgIHRCbkE0SkNDaVhSNy8vMFdlelJvU1BkYWxOZW00dnM4UFQ4N3NuSGJEbGlGTVZmOHcrZmtzSW5xdm90aVJESTQKICAgICAgICBRQnJCZnMzTmRlWlcvdG11cE9hWkpSekhEdnZLYmcvL082aXAxYVB2SUxXdlRETThLY1FDUUVTYVdrQ2JJMXVjCiAgICAgICAgcml6QU1ibFRCMmd5dzl5b2pDcFZDTUJYZGl6QXFxeWw1WlZydzQrWC9pMDlJc050OGhBOS81Ulk3djNjN1oyQwogICAgICAgIFh5MnhLV210TEk5bmxPU1N3VXhCNTY2STI5bFZLQkxVbVhtUWZuUklJSENpSkRYWUZEUC82TGZ2OSttaEVXVTgKICAgICAgICBxZWQzeGhwZU5TQUl6QStNVGxqdGlSbW9yeHBkZGlYYnRDYWZjUGwvSjNYMEIwN2ZjY0pad1pzQ1lDcHRMeTFjCiAgICAgICAgeXZWYU4rRUJtam9DcDNqdDZ3TGU0eGNscVUzQUN3ei84VEREbXRKN1VVZGw3TWRraXBRWjI3OEwya3BsNm82MQogICAgICAgIE1GMmZYRDdmWk1lWmZFdzZsdTBCRjVtWjAvY2gzSHhYZVpvWGlmNzlnMjV2Wm1TZFc5N3BjZWV3UGx2bEVURlEKICAgICAgICA1NXBNb3JReVVURVFDUTNFQ3pIWVNuTC9UbVc3CiAgICAgICAgPSswUmMKICAgICAgICAtLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCiAgICAgICJzb3VyY2UiOiAiZGViIFtzaWduZWQtYnk9JEtFWV9GSUxFXSBodHRwczovL3JlbGVhc2UtamFtbXkuaW5mcmFob3VzZS5jb20vICRSRUxFQVNFCiAgICAgICAgbWFpbiIKInBhY2thZ2VfdXBkYXRlIjogdHJ1ZQoicGFja2FnZXMiOgotICJtYWtlIgotICJnY2MiCi0gInB1cHBldC1jb2RlIgotICJpbmZyYWhvdXNlLXRvb2xraXQiCi0gImluZnJhaG91c2UtcHVwcGV0LWRhdGEiCiJwdXBwZXQiOgogICJjb2xsZWN0aW9uIjogInB1cHBldDgiCiAgImluc3RhbGwiOiB0cnVlCiAgImluc3RhbGxfdHlwZSI6ICJhaW8iCiAgInBhY2thZ2VfbmFtZSI6ICJwdXBwZXQtYWdlbnQiCiAgInN0YXJ0X3NlcnZpY2UiOiBmYWxzZQoicnVuY21kIjoKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwganNvbiIKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwgYXdzLXNkay1jb3JlIgotICIvb3B0L3B1cHBldGxhYnMvcHVwcGV0L2Jpbi9nZW0gaW5zdGFsbCBhd3Mtc2RrLXNlY3JldHNtYW5hZ2VyIgotICJpaC1wdXBwZXQgIC0tZW52aXJvbm1lbnQgcHJvZHVjdGlvbiAtLWVudmlyb25tZW50cGF0aCB7cm9vdF9kaXJlY3Rvcnl9L2Vudmlyb25tZW50cwogIC0tcm9vdC1kaXJlY3RvcnkgL29wdC9wdXBwZXQtY29kZSAtLWhpZXJhLWNvbmZpZyAvb3B0L2luZnJhaG91c2UtcHVwcGV0LWRhdGEvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vaGllcmEueWFtbAogIC0tbW9kdWxlLXBhdGgge3Jvb3RfZGlyZWN0b3J5fS9tb2R1bGVzIGFwcGx5IC9vcHQvcHVwcGV0LWNvZGUvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vbWFuaWZlc3RzL3NpdGUucHAiCiJ3cml0ZV9maWxlcyI6Ci0gImNvbnRlbnQiOiAiZXhwb3J0IEFXU19ERUZBVUxUX1JFR0lPTj11cy13ZXN0LTEiCiAgInBhdGgiOiAiL2V0Yy9wcm9maWxlLmQvYXdzLnNoIgogICJwZXJtaXNzaW9ucyI6ICIwNjQ0IgotICJjb250ZW50IjogfC0KICAgIFtkZWZhdWx0XQogICAgcmVnaW9uPXVzLXdlc3QtMQogICJwYXRoIjogIi9yb290Ly5hd3MvY29uZmlnIgogICJwZXJtaXNzaW9ucyI6ICIwNjAwIgotICJjb250ZW50IjogfAogICAgInB1cHBldF9lbnZpcm9ubWVudCI6ICJwcm9kdWN0aW9uIgogICAgInB1cHBldF9yb2xlIjogIndlYnNlcnZlciIKICAicGF0aCI6ICIvZXRjL3B1cHBldGxhYnMvZmFjdGVyL2ZhY3RzLmQvcHVwcGV0LnlhbWwiCiAgInBlcm1pc3Npb25zIjogIjA2NDQiCi0gImNvbnRlbnQiOiAie1wiaWgtcHVwcGV0XCI6e1wiZGVidWdcIjpmYWxzZSxcImVudmlyb25tZW50cGF0aFwiOlwie3Jvb3RfZGlyZWN0b3J5fS9lbnZpcm9ubWVudHNcIixcImhpZXJhLWNvbmZpZ1wiOlwiL29wdC9pbmZyYWhvdXNlLXB1cHBldC1kYXRhL2Vudmlyb25tZW50cy9wcm9kdWN0aW9uL2hpZXJhLnlhbWxcIixcIm1hbmlmZXN0XCI6XCIvb3B0L3B1cHBldC1jb2RlL2Vudmlyb25tZW50cy9wcm9kdWN0aW9uL21hbmlmZXN0cy9zaXRlLnBwXCIsXCJtb2R1bGUtcGF0aFwiOlwie3Jvb3RfZGlyZWN0b3J5fS9tb2R1bGVzXCIsXCJyb290LWRpcmVjdG9yeVwiOlwiL29wdC9wdXBwZXQtY29kZVwifX0iCiAgInBhdGgiOiAiL2V0Yy9wdXBwZXRsYWJzL2ZhY3Rlci9mYWN0cy5kL2loLXB1cHBldC5qc29uIgogICJwZXJtaXNzaW9ucyI6ICIwNjQ0IgotICJjb250ZW50IjogInt9IgogICJwYXRoIjogIi9ldGMvcHVwcGV0bGFicy9mYWN0ZXIvZmFjdHMuZC9jdXN0b20uanNvbiIKICAicGVybWlzc2lvbnMiOiAiMDY0NCIKDQotLU1JTUVCT1VOREFSWS0tDQo=" -> (known after apply)
userdata changes:
--- before
+++ after
@@ -1,109 +1 @@
-Content-Type: multipart/mixed; boundary="MIMEBOUNDARY"
-MIME-Version: 1.0
-
---MIMEBOUNDARY
-Content-Transfer-Encoding: 7bit
-Content-Type: text/cloud-config
-Mime-Version: 1.0
-
-#cloud-config
-"apt":
- "sources":
- "infrahouse":
- "key": |
- -----BEGIN PGP PUBLIC KEY BLOCK-----
-
- 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
- 55pMorQyUTEQCQ3ECzHYSnL/TmW7
- =+0Rc
- -----END PGP PUBLIC KEY BLOCK-----
- "source": "deb [signed-by=$KEY_FILE] https://release-jammy.infrahouse.com/ $RELEASE
- main"
-"package_update": true
-"packages":
-- "make"
-- "gcc"
-- "puppet-code"
-- "infrahouse-toolkit"
-- "infrahouse-puppet-data"
-"puppet":
- "collection": "puppet8"
- "install": true
- "install_type": "aio"
- "package_name": "puppet-agent"
- "start_service": false
-"runcmd":
-- "/opt/puppetlabs/puppet/bin/gem install json"
-- "/opt/puppetlabs/puppet/bin/gem install aws-sdk-core"
-- "/opt/puppetlabs/puppet/bin/gem install aws-sdk-secretsmanager"
-- "ih-puppet --environment production --environmentpath {root_directory}/environments
- --root-directory /opt/puppet-code --hiera-config /opt/infrahouse-puppet-data/environments/production/hiera.yaml
- --module-path {root_directory}/modules apply /opt/puppet-code/environments/production/manifests/site.pp"
-"write_files":
-- "content": "export AWS_DEFAULT_REGION=us-west-1"
- "path": "/etc/profile.d/aws.sh"
- "permissions": "0644"
-- "content": |-
- [default]
- region=us-west-1
- "path": "/root/.aws/config"
- "permissions": "0600"
-- "content": |
- "puppet_environment": "production"
- "puppet_role": "webserver"
- "path": "/etc/puppetlabs/facter/facts.d/puppet.yaml"
- "permissions": "0644"
-- "content": "{\\"ih-puppet\\":{\\"debug\\":false,\\"environmentpath\\":\\"{root_directory}/environments\\",\\"hiera-config\\":\\"/opt/infrahouse-puppet-data/environments/production/hiera.yaml\\",\\"manifest\\":\\"/opt/puppet-code/environments/production/manifests/site.pp\\",\\"module-path\\":\\"{root_directory}/modules\\",\\"root-directory\\":\\"/opt/puppet-code\\"}}"
- "path": "/etc/puppetlabs/facter/facts.d/ih-puppet.json"
- "permissions": "0644"
-- "content": "{}"
- "path": "/etc/puppetlabs/facter/facts.d/custom.json"
- "permissions": "0644"
-
---MIMEBOUNDARY--
+(known after apply)
EOF userdata changes.
# (16 unchanged attributes hidden)
+ metadata_options {
+ http_tokens = "required"
}
# (4 unchanged blocks hidden)
}
Plan: 0 to add, 2 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: tf.plan
To perform exactly these actions, run the following command to apply:
terraform apply "tf.plan"
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAwLCAiY2hhbmdlIjogMiwgImRlc3Ryb3kiOiAwfX0=
```
</details>""",
),
(
"plan-0-2-0.stdout",
(0, 2, 0),
"""
# State **`s3://foo_backet/path/to/tf.state`**
## Affected resources counts
| Success | Add | 🟡 Change | Destroy |
|----------:|-------:|------------:|-----------:|
| ✅ | 0 | 2 | 0 |
<details>
<summary>STDOUT</summary>
```
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# module.website.aws_autoscaling_group.website will be updated in-place
~ resource "aws_autoscaling_group" "website" {
id = "web20231125205239428700000003"
name = "web20231125205239428700000003"
# (32 unchanged attributes hidden)
~ launch_template {
id = "lt-042ea5dd55b0fff3b"
name = "web20231125205151213200000001"
~ version = "8" -> (known after apply)
}
# (9 unchanged blocks hidden)
}
# module.website.aws_launch_template.website will be updated in-place
~ resource "aws_launch_template" "website" {
id = "lt-042ea5dd55b0fff3b"
~ latest_version = 8 -> (known after apply)
name = "web20231125205151213200000001"
tags = {}
~ user_data = "Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJNSU1FQk9VTkRBUlkiCk1JTUUtVmVyc2lvbjogMS4wDQoNCi0tTUlNRUJPVU5EQVJZDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQpDb250ZW50LVR5cGU6IHRleHQvY2xvdWQtY29uZmlnDQpNaW1lLVZlcnNpb246IDEuMA0KDQojY2xvdWQtY29uZmlnCiJhcHQiOgogICJzb3VyY2VzIjoKICAgICJpbmZyYWhvdXNlIjoKICAgICAgImtleSI6IHwKICAgICAgICAtLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KCiAgICAgICAgbVFJTkJHUzdGdGtCRUFERitZbURnNlF2c3Y1VjZaUXcrUWh4ZFR2ak1YZUxDOVQ2UkZSVkQ5NDdxS3p0Tk5RbgogICAgICAgICtBL3l4cHJMQW1XMjVVdS8xMW9Dc3pOVklJYVIzT1k4TXR5aWxiQ3R6VWtCenZXZGxYM0h2VHc5MUxwOGJ4VUwKICAgICAgICBFWE9NOW5zY3FPck92ZkJqYW5wbEtERUtQTVk2dklaM2twMXJVc0NOR0xCTDB4MktaZ1U4MHVsUnNNTThxbkJOCiAgICAgICAga3BUaUFlWEtPRVZ0UnpsV2x2T0ZMSjdwWUR2YVowVWdIU1Z1RStaa2xkcU9kTExScEtrZEl2SlBja1hxTDV4VAogICAgICAgIFV2V1RXMWVuRkFIZDUrTlF4TW5DYTNpa2pRVjNEVGxFanNnTExRYmJ5c1hqWFByNlBJUHMyOWNUY2ZvcTQzMU8KICAgICAgICB0UjREclpCNHZNRU9BODhUbUtCa0VpTUcraUI5Y2p6NXdCSXVNdTk1Wm1vSnhkdmpQUjcyRllLZ3JDWE50TmhkCiAgICAgICAgVmVyRVJ2cExUaGRhUm1aZ2k3bHkrRHZrWTdMcXlKUHZkSGNxeGVkZ0ZuUEtSNFQrZ1NRbWJVUGQ5cXFkSlIwUQogICAgICAgIEtsL1BtdHVTL3c5Z3kyWjRheTBRSUtyTkJ6UXhoQThMRFpwcDFydWZDSjUrWk1lZjkwdkhwd3hNK09hUHJ5TmwKICAgICAgICBFZERXN1lROGZ1QjVuUHFqd1VBcG1sWVlMSllsZDd2Sjc5RUl4L3NqZ2g2RytJRmltN3hSN1dpUUYvbkpldmZxCiAgICAgICAgdnpZTzdvci9HSUNiNmVad3ZQZHR5NzlIbVZlUHFFVGxEVTAwb3lvcFd5VHNZeVNZRFNIbi80ZG9UdXg4ditGLwogICAgICAgIFlleWJ2Z3FicmlIN2lTRjhIeHdFRmVEanJNdFVUSHNYQzM1REhGZU1DaEpveHN5S3Y0OEorYklHRndBUkFRQUIKICAgICAgICB0QzFKYm1aeVlVaHZkWE5sSUZCaFkydGhaMlZ5SUR4d1lXTnJZV2RsY2tCcGJtWnlZV2h2ZFhObExtTnZiVDZKCiAgICAgICAgQWxRRUV3RUtBRDRXSVFTaU5oNWtZM3c4VzBnQUY4WGd1SmFveGZjRDd3VUNaTHNXMlFJYkF3VUpBOEpuQUFVTAogICAgICAgIENRZ0hBZ1lWQ2drSUN3SUVGZ0lEQVFJZUFRSVhnQUFLQ1JEZ3VKYW94ZmNEN3diN0QvOWVuYnRPMURFUW4xUHQKICAgICAgICBoZ2t0SCtJcmJCZFlSSGs3MWlsMmhibm1BYm9Ma2sxYWsvYWFRWS9YUURKRmhyQTdqTWtQTE9DUmVvdEhpUW12CiAgICAgICAgMVVmcURjTTJlUTQveDBOOUYyRExVU2t1d3cxMTd2dHRVb0J4aXJCNzJwTzBUL2xkOW8zOVNITUMvRGZrNnk2aAogICAgICAgIHRUR3F4TGdoOGozRFN5TzVFRXJKTGEvM0J2TXFyNGlxYjNQVHdOZURSRWphdlFKaFhTdkVGanlBQ29vOWQ3cnMKICAgICAgICA3bGhDYmJTUGpnVGNHL1BDZnpMcjM3UXl6WGlUUi9Ud2ppd1ZkVGhkQ1MvQ0tuc29NOG5nSHhqWFlwSzdNNndnCiAgICAgICAgdHpBOEprSFpyNU1wa3JQR3JnUWV2aEpCTGtIUi9qY3NhYUJaTjdudzhhZUhjd3dNNC9DaEhJeVpkUTkxMDU5cAogICAgICAgIE9NYVltV21qUFFmcTFyT25BQXZBMXhXdytUWk56SGdXSXE0dnVzeDdPQnZyRnNWZVpOc3FkN09hNHBydFZXZzAKICAgICAgICA5MWNLWkpvL092Nm9wTS93RFdOMnlCbmttQkN3YVhwb0g1TkRRMjJiaG5HVEplSVdkZWk4VVNHcHZCa1R4QkkyCiAgICAgICAgWDMycHlPbVpEbjgxTDJ6TTJpb052Z1hJYjV1NXRqYjlOT2lBdDZvVzBHMHgwMGRncjNyNnB1OHFtTXdrQlZCQwogICAgICAgIHZXd0VtYXhRbmtUaG5iQWQ1N1ZiYXQ0Ly91RGNIRnBEYUJQcEZXZUNMMmRmRFNyUzlpaUs2SzFWa3ZHTG9YaDgKICAgICAgICBNcEpxam9kZHBmTmg0dXlmekt5TkUxZHJRMjltY3dmSWx6WG9QcmIwOVc2WkhwbSt0cWQ4TWs3MDd6d3NkRkdSCiAgICAgICAgcVJzeG10UG45SjFyZVlaaVZ1RTVHMjZmMWFLVFI3a0NEUVJrdXhiWkFSQUE0KzlrbjRzbUJYWmNNMHZGcTlSOAogICAgICAgIDI0WEtadFRhVm1Wb1ZKTVJRTTQ0cVdSK3MvUzBNenZiTzV1MGNTVlRoWTY1WXpNTHM5MjBVWTZ1R3BvUzJaWXcKICAgICAgICBJTWlwa2FCKzJGNkI4UjdWN25sL1NnYVhHYTJNZXhrQzd3dDZibEZiYXc3cGJ2SStpSTl3UzhCS0hnTUR6ZDBGCiAgICAgICAgVGpTcTl2ZGtWa2Y3eUkzaEV3bGxYN3pUNklMT3Zrbk5HYm9zMGRGSTkyY0JXUXMraVhQNTB4RFZpdDMrOW1DRAogICAgICAgIHJ1V1ZZazczbXZTRXpGY3VYQ3liS0o1VS9uelNRNzBKb1FtU1BjNTBSUWp1SEdkemwvWXpHRmFGbjV6SVo1cFAKICAgICAgICBrNVMrS1RZZWt6Y2lSa0h6YmVhNVBqK0E2S1ppbEtqNXlrQVJGencrQ1B4cXN1ZWpEa2k3QSthM20zV0dxK21tCiAgICAgICAgQWtsUTRZQmNvbHpOT3BnV2NsSVN1RTNkNWtndGFKQUNJZ3RlODdGNlFCQnNrOG9EQkZRQ25abW9PaXJsU2xiZgogICAgICAgIEp1RDZmVkNKdTJ6WTdUaE4xTzBvV1R3QWFOQXZNNTVDTFR2NnMzRm10UjkybG5sUURGdUorZmo4NjNjNnF4MTQKICAgICAgICBGdU80bU03ZXVTMDh3R2dWR205MXdBN2JZbDRhaHhDNlMyQkdCNUZ2a1pmekJCd2pzZm1VV0hBdTdWUlpKeGtYCiAgICAgICAgSnA2OTZPVGRSM1JmSTdJWjZPVzZ0R0VMaWpzd1diYlpYYjVYUldFVzk5dldPN05JSzZzT3ZoTUROcDliU011YgogICAgICAgIFhQM1BiUHhneVQwYm1zczB5d05Zd3VjbmZjbURYcVBWdTNHZHQ1M2F0MStoSzdtbG5RM3VVczVlVkVPSUhuSm0KICAgICAgICBmMXRyRGdnU1RFN2Zua3g2Q3psK2lNa0FFUUVBQVlrQ1BBUVlBUW9BSmhZaEJLSTJIbVJqZkR4YlNBQVh4ZUM0CiAgICAgICAgbHFqRjl3UHZCUUprdXhiWkFoc01CUWtEd21jQUFBb0pFT0M0bHFqRjl3UHY4U1FQL2pzUWZKQ1VIcmpwWDRmUAogICAgICAgIDBOdFZ5cWxDcnExT21MUDdCTHJYckN4b0FGUmI2NFlKVWRXazVQMzVrOXdqMkJRanBqY05qMmlrODBGb28wMkUKICAgICAgICB5YytQelcvNHR6VnZkeFJyRXpzT0ZtK21NUitsbFVIQUt6QmE2UUJ4SFQwb2ZMN3A1WFlUdU1ObllvK1BqVk1tCiAgICAgICAgalAzVEVKR1lYWW11aEdmYWFKWnBqTG1KRnFwNTl4Ly9kc01IZUxxVUNod2I2Q2c2RHVrQWloZUFzM1ArclhvMwogICAgICAgIHRCbkE0SkNDaVhSNy8vMFdlelJvU1BkYWxOZW00dnM4UFQ4N3NuSGJEbGlGTVZmOHcrZmtzSW5xdm90aVJESTQKICAgICAgICBRQnJCZnMzTmRlWlcvdG11cE9hWkpSekhEdnZLYmcvL082aXAxYVB2SUxXdlRETThLY1FDUUVTYVdrQ2JJMXVjCiAgICAgICAgcml6QU1ibFRCMmd5dzl5b2pDcFZDTUJYZGl6QXFxeWw1WlZydzQrWC9pMDlJc050OGhBOS81Ulk3djNjN1oyQwogICAgICAgIFh5MnhLV210TEk5bmxPU1N3VXhCNTY2STI5bFZLQkxVbVhtUWZuUklJSENpSkRYWUZEUC82TGZ2OSttaEVXVTgKICAgICAgICBxZWQzeGhwZU5TQUl6QStNVGxqdGlSbW9yeHBkZGlYYnRDYWZjUGwvSjNYMEIwN2ZjY0pad1pzQ1lDcHRMeTFjCiAgICAgICAgeXZWYU4rRUJtam9DcDNqdDZ3TGU0eGNscVUzQUN3ei84VEREbXRKN1VVZGw3TWRraXBRWjI3OEwya3BsNm82MQogICAgICAgIE1GMmZYRDdmWk1lWmZFdzZsdTBCRjVtWjAvY2gzSHhYZVpvWGlmNzlnMjV2Wm1TZFc5N3BjZWV3UGx2bEVURlEKICAgICAgICA1NXBNb3JReVVURVFDUTNFQ3pIWVNuTC9UbVc3CiAgICAgICAgPSswUmMKICAgICAgICAtLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCiAgICAgICJzb3VyY2UiOiAiZGViIFtzaWduZWQtYnk9JEtFWV9GSUxFXSBodHRwczovL3JlbGVhc2UtamFtbXkuaW5mcmFob3VzZS5jb20vICRSRUxFQVNFCiAgICAgICAgbWFpbiIKInBhY2thZ2VfdXBkYXRlIjogdHJ1ZQoicGFja2FnZXMiOgotICJtYWtlIgotICJnY2MiCi0gInB1cHBldC1jb2RlIgotICJpbmZyYWhvdXNlLXRvb2xraXQiCi0gImluZnJhaG91c2UtcHVwcGV0LWRhdGEiCiJwdXBwZXQiOgogICJjb2xsZWN0aW9uIjogInB1cHBldDgiCiAgImluc3RhbGwiOiB0cnVlCiAgImluc3RhbGxfdHlwZSI6ICJhaW8iCiAgInBhY2thZ2VfbmFtZSI6ICJwdXBwZXQtYWdlbnQiCiAgInN0YXJ0X3NlcnZpY2UiOiBmYWxzZQoicnVuY21kIjoKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwganNvbiIKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwgYXdzLXNkay1jb3JlIgotICIvb3B0L3B1cHBldGxhYnMvcHVwcGV0L2Jpbi9nZW0gaW5zdGFsbCBhd3Mtc2RrLXNlY3JldHNtYW5hZ2VyIgotICJpaC1wdXBwZXQgIC0tZW52aXJvbm1lbnQgcHJvZHVjdGlvbiAtLWVudmlyb25tZW50cGF0aCB7cm9vdF9kaXJlY3Rvcnl9L2Vudmlyb25tZW50cwogIC0tcm9vdC1kaXJlY3RvcnkgL29wdC9wdXBwZXQtY29kZSAtLWhpZXJhLWNvbmZpZyAvb3B0L2luZnJhaG91c2UtcHVwcGV0LWRhdGEvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vaGllcmEueWFtbAogIC0tbW9kdWxlLXBhdGgge3Jvb3RfZGlyZWN0b3J5fS9tb2R1bGVzIGFwcGx5IC9vcHQvcHVwcGV0LWNvZGUvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vbWFuaWZlc3RzL3NpdGUucHAiCiJ3cml0ZV9maWxlcyI6Ci0gImNvbnRlbnQiOiAiZXhwb3J0IEFXU19ERUZBVUxUX1JFR0lPTj11cy13ZXN0LTEiCiAgInBhdGgiOiAiL2V0Yy9wcm9maWxlLmQvYXdzLnNoIgogICJwZXJtaXNzaW9ucyI6ICIwNjQ0IgotICJjb250ZW50IjogfC0KICAgIFtkZWZhdWx0XQogICAgcmVnaW9uPXVzLXdlc3QtMQogICJwYXRoIjogIi9yb290Ly5hd3MvY29uZmlnIgogICJwZXJtaXNzaW9ucyI6ICIwNjAwIgotICJjb250ZW50IjogfAogICAgInB1cHBldF9lbnZpcm9ubWVudCI6ICJwcm9kdWN0aW9uIgogICAgInB1cHBldF9yb2xlIjogIndlYnNlcnZlciIKICAicGF0aCI6ICIvZXRjL3B1cHBldGxhYnMvZmFjdGVyL2ZhY3RzLmQvcHVwcGV0LnlhbWwiCiAgInBlcm1pc3Npb25zIjogIjA2NDQiCi0gImNvbnRlbnQiOiAie1wiaWgtcHVwcGV0XCI6e1wiZGVidWdcIjpmYWxzZSxcImVudmlyb25tZW50cGF0aFwiOlwie3Jvb3RfZGlyZWN0b3J5fS9lbnZpcm9ubWVudHNcIixcImhpZXJhLWNvbmZpZ1wiOlwiL29wdC9pbmZyYWhvdXNlLXB1cHBldC1kYXRhL2Vudmlyb25tZW50cy9wcm9kdWN0aW9uL2hpZXJhLnlhbWxcIixcIm1hbmlmZXN0XCI6XCIvb3B0L3B1cHBldC1jb2RlL2Vudmlyb25tZW50cy9wcm9kdWN0aW9uL21hbmlmZXN0cy9zaXRlLnBwXCIsXCJtb2R1bGUtcGF0aFwiOlwie3Jvb3RfZGlyZWN0b3J5fS9tb2R1bGVzXCIsXCJyb290LWRpcmVjdG9yeVwiOlwiL29wdC9wdXBwZXQtY29kZVwifX0iCiAgInBhdGgiOiAiL2V0Yy9wdXBwZXRsYWJzL2ZhY3Rlci9mYWN0cy5kL2loLXB1cHBldC5qc29uIgogICJwZXJtaXNzaW9ucyI6ICIwNjQ0IgotICJjb250ZW50IjogInt9IgogICJwYXRoIjogIi9ldGMvcHVwcGV0bGFicy9mYWN0ZXIvZmFjdHMuZC9jdXN0b20uanNvbiIKICAicGVybWlzc2lvbnMiOiAiMDY0NCIKDQotLU1JTUVCT1VOREFSWS0tDQo=" -> "Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJNSU1FQk9VTkRBUlkiCk1JTUUtVmVyc2lvbjogMS4wDQoNCi0tTUlNRUJPVU5EQVJZDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQpDb250ZW50LVR5cGU6IHRleHQvY2xvdWQtY29uZmlnDQpNaW1lLVZlcnNpb246IDEuMA0KDQojY2xvdWQtY29uZmlnCiJhcHQiOgogICJzb3VyY2VzIjoKICAgICJpbmZyYWhvdXNlIjoKICAgICAgImtleSI6IHwKICAgICAgICAtLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KCiAgICAgICAgbVFJTkJHUzdGdGtCRUFERitZbURnNlF2c3Y1VjZaUXcrUWh4ZFR2ak1YZUxDOVQ2UkZSVkQ5NDdxS3p0Tk5RbgogICAgICAgICtBL3l4cHJMQW1XMjVVdS8xMW9Dc3pOVklJYVIzT1k4TXR5aWxiQ3R6VWtCenZXZGxYM0h2VHc5MUxwOGJ4VUwKICAgICAgICBFWE9NOW5zY3FPck92ZkJqYW5wbEtERUtQTVk2dklaM2twMXJVc0NOR0xCTDB4MktaZ1U4MHVsUnNNTThxbkJOCiAgICAgICAga3BUaUFlWEtPRVZ0UnpsV2x2T0ZMSjdwWUR2YVowVWdIU1Z1RStaa2xkcU9kTExScEtrZEl2SlBja1hxTDV4VAogICAgICAgIFV2V1RXMWVuRkFIZDUrTlF4TW5DYTNpa2pRVjNEVGxFanNnTExRYmJ5c1hqWFByNlBJUHMyOWNUY2ZvcTQzMU8KICAgICAgICB0UjREclpCNHZNRU9BODhUbUtCa0VpTUcraUI5Y2p6NXdCSXVNdTk1Wm1vSnhkdmpQUjcyRllLZ3JDWE50TmhkCiAgICAgICAgVmVyRVJ2cExUaGRhUm1aZ2k3bHkrRHZrWTdMcXlKUHZkSGNxeGVkZ0ZuUEtSNFQrZ1NRbWJVUGQ5cXFkSlIwUQogICAgICAgIEtsL1BtdHVTL3c5Z3kyWjRheTBRSUtyTkJ6UXhoQThMRFpwcDFydWZDSjUrWk1lZjkwdkhwd3hNK09hUHJ5TmwKICAgICAgICBFZERXN1lROGZ1QjVuUHFqd1VBcG1sWVlMSllsZDd2Sjc5RUl4L3NqZ2g2RytJRmltN3hSN1dpUUYvbkpldmZxCiAgICAgICAgdnpZTzdvci9HSUNiNmVad3ZQZHR5NzlIbVZlUHFFVGxEVTAwb3lvcFd5VHNZeVNZRFNIbi80ZG9UdXg4ditGLwogICAgICAgIFlleWJ2Z3FicmlIN2lTRjhIeHdFRmVEanJNdFVUSHNYQzM1REhGZU1DaEpveHN5S3Y0OEorYklHRndBUkFRQUIKICAgICAgICB0QzFKYm1aeVlVaHZkWE5sSUZCaFkydGhaMlZ5SUR4d1lXTnJZV2RsY2tCcGJtWnlZV2h2ZFhObExtTnZiVDZKCiAgICAgICAgQWxRRUV3RUtBRDRXSVFTaU5oNWtZM3c4VzBnQUY4WGd1SmFveGZjRDd3VUNaTHNXMlFJYkF3VUpBOEpuQUFVTAogICAgICAgIENRZ0hBZ1lWQ2drSUN3SUVGZ0lEQVFJZUFRSVhnQUFLQ1JEZ3VKYW94ZmNEN3diN0QvOWVuYnRPMURFUW4xUHQKICAgICAgICBoZ2t0SCtJcmJCZFlSSGs3MWlsMmhibm1BYm9Ma2sxYWsvYWFRWS9YUURKRmhyQTdqTWtQTE9DUmVvdEhpUW12CiAgICAgICAgMVVmcURjTTJlUTQveDBOOUYyRExVU2t1d3cxMTd2dHRVb0J4aXJCNzJwTzBUL2xkOW8zOVNITUMvRGZrNnk2aAogICAgICAgIHRUR3F4TGdoOGozRFN5TzVFRXJKTGEvM0J2TXFyNGlxYjNQVHdOZURSRWphdlFKaFhTdkVGanlBQ29vOWQ3cnMKICAgICAgICA3bGhDYmJTUGpnVGNHL1BDZnpMcjM3UXl6WGlUUi9Ud2ppd1ZkVGhkQ1MvQ0tuc29NOG5nSHhqWFlwSzdNNndnCiAgICAgICAgdHpBOEprSFpyNU1wa3JQR3JnUWV2aEpCTGtIUi9qY3NhYUJaTjdudzhhZUhjd3dNNC9DaEhJeVpkUTkxMDU5cAogICAgICAgIE9NYVltV21qUFFmcTFyT25BQXZBMXhXdytUWk56SGdXSXE0dnVzeDdPQnZyRnNWZVpOc3FkN09hNHBydFZXZzAKICAgICAgICA5MWNLWkpvL092Nm9wTS93RFdOMnlCbmttQkN3YVhwb0g1TkRRMjJiaG5HVEplSVdkZWk4VVNHcHZCa1R4QkkyCiAgICAgICAgWDMycHlPbVpEbjgxTDJ6TTJpb052Z1hJYjV1NXRqYjlOT2lBdDZvVzBHMHgwMGRncjNyNnB1OHFtTXdrQlZCQwogICAgICAgIHZXd0VtYXhRbmtUaG5iQWQ1N1ZiYXQ0Ly91RGNIRnBEYUJQcEZXZUNMMmRmRFNyUzlpaUs2SzFWa3ZHTG9YaDgKICAgICAgICBNcEpxam9kZHBmTmg0dXlmekt5TkUxZHJRMjltY3dmSWx6WG9QcmIwOVc2WkhwbSt0cWQ4TWs3MDd6d3NkRkdSCiAgICAgICAgcVJzeG10UG45SjFyZVlaaVZ1RTVHMjZmMWFLVFI3a0NEUVJrdXhiWkFSQUE0KzlrbjRzbUJYWmNNMHZGcTlSOAogICAgICAgIDI0WEtadFRhVm1Wb1ZKTVJRTTQ0cVdSK3MvUzBNenZiTzV1MGNTVlRoWTY1WXpNTHM5MjBVWTZ1R3BvUzJaWXcKICAgICAgICBJTWlwa2FCKzJGNkI4UjdWN25sL1NnYVhHYTJNZXhrQzd3dDZibEZiYXc3cGJ2SStpSTl3UzhCS0hnTUR6ZDBGCiAgICAgICAgVGpTcTl2ZGtWa2Y3eUkzaEV3bGxYN3pUNklMT3Zrbk5HYm9zMGRGSTkyY0JXUXMraVhQNTB4RFZpdDMrOW1DRAogICAgICAgIHJ1V1ZZazczbXZTRXpGY3VYQ3liS0o1VS9uelNRNzBKb1FtU1BjNTBSUWp1SEdkemwvWXpHRmFGbjV6SVo1cFAKICAgICAgICBrNVMrS1RZZWt6Y2lSa0h6YmVhNVBqK0E2S1ppbEtqNXlrQVJGencrQ1B4cXN1ZWpEa2k3QSthM20zV0dxK21tCiAgICAgICAgQWtsUTRZQmNvbHpOT3BnV2NsSVN1RTNkNWtndGFKQUNJZ3RlODdGNlFCQnNrOG9EQkZRQ25abW9PaXJsU2xiZgogICAgICAgIEp1RDZmVkNKdTJ6WTdUaE4xTzBvV1R3QWFOQXZNNTVDTFR2NnMzRm10UjkybG5sUURGdUorZmo4NjNjNnF4MTQKICAgICAgICBGdU80bU03ZXVTMDh3R2dWR205MXdBN2JZbDRhaHhDNlMyQkdCNUZ2a1pmekJCd2pzZm1VV0hBdTdWUlpKeGtYCiAgICAgICAgSnA2OTZPVGRSM1JmSTdJWjZPVzZ0R0VMaWpzd1diYlpYYjVYUldFVzk5dldPN05JSzZzT3ZoTUROcDliU011YgogICAgICAgIFhQM1BiUHhneVQwYm1zczB5d05Zd3VjbmZjbURYcVBWdTNHZHQ1M2F0MStoSzdtbG5RM3VVczVlVkVPSUhuSm0KICAgICAgICBmMXRyRGdnU1RFN2Zua3g2Q3psK2lNa0FFUUVBQVlrQ1BBUVlBUW9BSmhZaEJLSTJIbVJqZkR4YlNBQVh4ZUM0CiAgICAgICAgbHFqRjl3UHZCUUprdXhiWkFoc01CUWtEd21jQUFBb0pFT0M0bHFqRjl3UHY4U1FQL2pzUWZKQ1VIcmpwWDRmUAogICAgICAgIDBOdFZ5cWxDcnExT21MUDdCTHJYckN4b0FGUmI2NFlKVWRXazVQMzVrOXdqMkJRanBqY05qMmlrODBGb28wMkUKICAgICAgICB5YytQelcvNHR6VnZkeFJyRXpzT0ZtK21NUitsbFVIQUt6QmE2UUJ4SFQwb2ZMN3A1WFlUdU1ObllvK1BqVk1tCiAgICAgICAgalAzVEVKR1lYWW11aEdmYWFKWnBqTG1KRnFwNTl4Ly9kc01IZUxxVUNod2I2Q2c2RHVrQWloZUFzM1ArclhvMwogICAgICAgIHRCbkE0SkNDaVhSNy8vMFdlelJvU1BkYWxOZW00dnM4UFQ4N3NuSGJEbGlGTVZmOHcrZmtzSW5xdm90aVJESTQKICAgICAgICBRQnJCZnMzTmRlWlcvdG11cE9hWkpSekhEdnZLYmcvL082aXAxYVB2SUxXdlRETThLY1FDUUVTYVdrQ2JJMXVjCiAgICAgICAgcml6QU1ibFRCMmd5dzl5b2pDcFZDTUJYZGl6QXFxeWw1WlZydzQrWC9pMDlJc050OGhBOS81Ulk3djNjN1oyQwogICAgICAgIFh5MnhLV210TEk5bmxPU1N3VXhCNTY2STI5bFZLQkxVbVhtUWZuUklJSENpSkRYWUZEUC82TGZ2OSttaEVXVTgKICAgICAgICBxZWQzeGhwZU5TQUl6QStNVGxqdGlSbW9yeHBkZGlYYnRDYWZjUGwvSjNYMEIwN2ZjY0pad1pzQ1lDcHRMeTFjCiAgICAgICAgeXZWYU4rRUJtam9DcDNqdDZ3TGU0eGNscVUzQUN3ei84VEREbXRKN1VVZGw3TWRraXBRWjI3OEwya3BsNm82MQogICAgICAgIE1GMmZYRDdmWk1lWmZFdzZsdTBCRjVtWjAvY2gzSHhYZVpvWGlmNzlnMjV2Wm1TZFc5N3BjZWV3UGx2bEVURlEKICAgICAgICA1NXBNb3JReVVURVFDUTNFQ3pIWVNuTC9UbVc3CiAgICAgICAgPSswUmMKICAgICAgICAtLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCiAgICAgICJzb3VyY2UiOiAiZGViIFtzaWduZWQtYnk9JEtFWV9GSUxFXSBodHRwczovL3JlbGVhc2UtamFtbXkuaW5mcmFob3VzZS5jb20vICRSRUxFQVNFCiAgICAgICAgbWFpbiIKInBhY2thZ2VfdXBkYXRlIjogdHJ1ZQoicGFja2FnZXMiOgotICJtYWtlIgotICJnY2MiCi0gInB1cHBldC1jb2RlIgotICJpbmZyYWhvdXNlLXRvb2xraXQiCi0gImluZnJhaG91c2UtcHVwcGV0LWRhdGEiCiJwdXBwZXQiOgogICJjb2xsZWN0aW9uIjogInB1cHBldDgiCiAgImluc3RhbGwiOiB0cnVlCiAgImluc3RhbGxfdHlwZSI6ICJhaW8iCiAgInBhY2thZ2VfbmFtZSI6ICJwdXBwZXQtYWdlbnQiCiAgInN0YXJ0X3NlcnZpY2UiOiBmYWxzZQoicnVuY21kIjoKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwganNvbiIKLSAiL29wdC9wdXBwZXRsYWJzL3B1cHBldC9iaW4vZ2VtIGluc3RhbGwgYXdzLXNkay1jb3JlIgotICIvb3B0L3B1cHBldGxhYnMvcHVwcGV0L2Jpbi9nZW0gaW5zdGFsbCBhd3Mtc2RrLXNlY3JldHNtYW5hZ2VyIgotICJpaC1wdXBwZXQgIC0tZW52aXJvbm1lbnQgcHJvZHVjdGlvbiAtLWVudmlyb25tZW50cGF0aCB7cm9vdF9kaXJlY3Rvcnl9L2Vudmlyb25tZW50cwogIC0tcm9vdC1kaXJlY3RvcnkgL29wdC9wdXBwZXQtY29kZSAtLWhpZXJhLWNvbmZpZyAvb3B0L2luZnJhaG91c2UtcHVwcGV0LWRhdGEvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vaGllcmEueWFtbAogIC0tbW9kdWxlLXBhdGgge3Jvb3RfZGlyZWN0b3J5fS9tb2R1bGVzIGFwcGx5IC9vcHQvcHVwcGV0LWNvZGUvZW52aXJvbm1lbnRzL3Byb2R1Y3Rpb24vbWFuaWZlc3RzL3NpdGUucHAiCiJ3cml0ZV9maWxlcyI6Ci0gImNvbnRlbnQiOiAiZXhwb3J0IEFXU19ERUZBVUxUX1JFR0lPTj11cy13ZXN0LTEiCiAgInBhdGgiOiAiL2V0Yy9wcm9maWxlLmQvYXdzLnNoIgogICJwZXJtaXNzaW9ucyI6ICIwNjQ0IgotICJjb250ZW50IjogfC0KICAgIFtkZWZhdWx0XQogICAgcmVnaW9uPXVzLXdlc3QtMQogICJwYXRoIjogIi9yb290Ly5hd3MvY29uZmlnIgogICJwZXJtaXNzaW9ucyI6ICIwNjAwIgotICJjb250ZW50IjogfAogICAgInB1cHBldF9lbnZpcm9ubWVudCI6ICJwcm9kdWN0aW9uIgogICAgInB1cHBldF9yb2xlIjogIndlYnNlcnZlciIKICAicGF0aCI6ICIvZXRjL3B1cHBldGxhYnMvZmFjdGVyL2ZhY3RzLmQvcHVwcGV0LnlhbWwiCiAgInBlcm1pc3Npb25zIjogIjA2NDQiCi0gImNvbnRlbnQiOiAie1wiaWgtcHVwcGV0XCI6e1wiY2FuY2VsX2luc3RhbmNlX3JlZnJlc2hfb25fZXJyb3JcIjpmYWxzZSxcImRlYnVnXCI6ZmFsc2UsXCJlbnZpcm9ubWVudHBhdGhcIjpcIntyb290X2RpcmVjdG9yeX0vZW52aXJvbm1lbnRzXCIsXCJoaWVyYS1jb25maWdcIjpcIi9vcHQvaW5mcmFob3VzZS1wdXBwZXQtZGF0YS9lbnZpcm9ubWVudHMvcHJvZHVjdGlvbi9oaWVyYS55YW1sXCIsXCJtYW5pZmVzdFwiOlwiL29wdC9wdXBwZXQtY29kZS9lbnZpcm9ubWVudHMvcHJvZHVjdGlvbi9tYW5pZmVzdHMvc2l0ZS5wcFwiLFwibW9kdWxlLXBhdGhcIjpcIntyb290X2RpcmVjdG9yeX0vbW9kdWxlc1wiLFwicm9vdC1kaXJlY3RvcnlcIjpcIi9vcHQvcHVwcGV0LWNvZGVcIn19IgogICJwYXRoIjogIi9ldGMvcHVwcGV0bGFicy9mYWN0ZXIvZmFjdHMuZC9paC1wdXBwZXQuanNvbiIKICAicGVybWlzc2lvbnMiOiAiMDY0NCIKLSAiY29udGVudCI6ICJ7fSIKICAicGF0aCI6ICIvZXRjL3B1cHBldGxhYnMvZmFjdGVyL2ZhY3RzLmQvY3VzdG9tLmpzb24iCiAgInBlcm1pc3Npb25zIjogIjA2NDQiCg0KLS1NSU1FQk9VTkRBUlktLQ0K"
userdata changes:
--- before
+++ after
@@ -99,7 +99,7 @@
"puppet_role": "webserver"
"path": "/etc/puppetlabs/facter/facts.d/puppet.yaml"
"permissions": "0644"
-- "content": "{\\"ih-puppet\\":{\\"debug\\":false,\\"environmentpath\\":\\"{root_directory}/environments\\",\\"hiera-config\\":\\"/opt/infrahouse-puppet-data/environments/production/hiera.yaml\\",\\"manifest\\":\\"/opt/puppet-code/environments/production/manifests/site.pp\\",\\"module-path\\":\\"{root_directory}/modules\\",\\"root-directory\\":\\"/opt/puppet-code\\"}}"
+- "content": "{\\"ih-puppet\\":{\\"cancel_instance_refresh_on_error\\":false,\\"debug\\":false,\\"environmentpath\\":\\"{root_directory}/environments\\",\\"hiera-config\\":\\"/opt/infrahouse-puppet-data/environments/production/hiera.yaml\\",\\"manifest\\":\\"/opt/puppet-code/environments/production/manifests/site.pp\\",\\"module-path\\":\\"{root_directory}/modules\\",\\"root-directory\\":\\"/opt/puppet-code\\"}}"
"path": "/etc/puppetlabs/facter/facts.d/ih-puppet.json"
"permissions": "0644"
- "content": "{}"
EOF userdata changes.
# (16 unchanged attributes hidden)
+ metadata_options {
+ http_tokens = "required"
}
# (4 unchanged blocks hidden)
}
Plan: 0 to add, 2 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────
Saved the plan to: tf.plan
To perform exactly these actions, run the following command to apply:
terraform apply "tf.plan"
```
</details>
<details><summary><i>metadata</i></summary>
```
eyJzMzovL2Zvb19iYWNrZXQvcGF0aC90by90Zi5zdGF0ZSI6IHsic3VjY2VzcyI6IHRydWUsICJhZGQiOiAwLCAiY2hhbmdlIjogMiwgImRlc3Ryb3kiOiAwfX0=
```
</details>""",
),
],
)
def test_comment(plan_file, result_counts, expected_comment):
with open(osp.join("infrahouse_toolkit/terraform/tests/plans", plan_file)) as fp:
status = TFStatus(
TFS3Backend("foo_backet", "path/to/tf.state"), True, RunResult(*result_counts), RunOutput(fp.read(), None)
)
assert isinstance(status.comment, str)
print("\nActual comment:")
print(status.comment)
print("EOF Actual comment.")
assert status.comment == expected_comment
[docs]def test_comment_none():
status = TFStatus(
TFS3Backend("foo_backet", "path/to/tf.state"),
True,
RunResult(None, None, None),
RunOutput("no stdout", "no stderr"),
affected_resources=RunResult(None, None, None),
)
assert isinstance(status.comment, str)
print(status.comment)
[docs]def test_comment_sensitive_user_data():
"""Test that sensitive user_data in terraform plan doesn't crash with binascii.Error."""
stdout = """\
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# module.website.aws_launch_template.website will be updated in-place
~ resource "aws_launch_template" "website" {
id = "lt-042ea5dd55b0fff3b"
~ latest_version = 8 -> (known after apply)
name = "web20231125205151213200000001"
tags = {}
~ user_data = (sensitive value)
# (16 unchanged attributes hidden)
}
Plan: 0 to add, 1 to change, 0 to destroy.
"""
status = TFStatus(
TFS3Backend("foo_backet", "path/to/tf.state"),
True,
RunResult(0, 1, 0),
RunOutput(stdout, None),
)
assert isinstance(status.comment, str)
assert "(sensitive value)" in status.comment