diff --git a/.changelog/1377.txt b/.changelog/1377.txt new file mode 100644 index 0000000000..2d81d5cd2b --- /dev/null +++ b/.changelog/1377.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +Add support for Terraform's experimental deferred actions +``` \ No newline at end of file diff --git a/.changelog/1380.txt b/.changelog/1380.txt new file mode 100644 index 0000000000..6d79a96a1b --- /dev/null +++ b/.changelog/1380.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +`helm_release`: add new attributes metadata.last_deployed, metadata.first_deployed, metadata.notes +``` diff --git a/.copywrite.hcl b/.copywrite.hcl index 60c6fea8bc..8bc5bf20d9 100644 --- a/.copywrite.hcl +++ b/.copywrite.hcl @@ -11,5 +11,6 @@ project { ".release/**", "helm/testdata/**", "vendor/**", + "examples/**" ] } diff --git a/.github/workflows/acceptance_test_dfa.yaml b/.github/workflows/acceptance_test_dfa.yaml new file mode 100644 index 0000000000..f94d2a66dd --- /dev/null +++ b/.github/workflows/acceptance_test_dfa.yaml @@ -0,0 +1,31 @@ +name: Deferred Actions + +on: + pull_request: + branches: + - main + paths: + - "helm/**/*.go" + - "go.mod" + workflow_dispatch: + inputs: + terraformVersion: + description: Terraform version + default: 1.9.0-alpha20240516 + +jobs: + acceptance_tests: + runs-on: custom-linux-medium + steps: + - name: Checkout repository + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - name: Set up Go + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + with: + go-version-file: 'go.mod' + - name: Run Tests + env: + TF_ACC: 1 + TF_ACC_TERRAFORM_VERSION: ${{ github.event.inputs.terraformVersion || '1.9.0-alpha20240516' }} + run: | + go test -v -run '^TestAccDeferredActions_basic' ./helm/testing diff --git a/.github/workflows/changelog-checker.yml b/.github/workflows/changelog-checker.yml index 3963ea7498..0e7ca63e75 100644 --- a/.github/workflows/changelog-checker.yml +++ b/.github/workflows/changelog-checker.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 # by default the checkout action doesn't checkout all branches diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a3b73aed27..c0f86d8fff 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -38,7 +38,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@8e0b1c74b1d5a0077b04d064c76ee714d3da7637 # v2 + uses: github/codeql-action/init@c4fb451437765abf5018c6fbf22cce1a7da1e5cc # codeql-bundle-v2.17.1 with: languages: ${{ matrix.language }} @@ -50,7 +50,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@8e0b1c74b1d5a0077b04d064c76ee714d3da7637 # v2 + uses: github/codeql-action/autobuild@c4fb451437765abf5018c6fbf22cce1a7da1e5cc # codeql-bundle-v2.17.1 # ℹ️ Command-line programs to run using the OS shell. @@ -65,4 +65,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@8e0b1c74b1d5a0077b04d064c76ee714d3da7637 # v2 + uses: github/codeql-action/analyze@c4fb451437765abf5018c6fbf22cce1a7da1e5cc # codeql-bundle-v2.17.1 diff --git a/.github/workflows/hc-copywrite.yml b/.github/workflows/hc-copywrite.yml index 88755c8a00..86b8a7b645 100644 --- a/.github/workflows/hc-copywrite.yml +++ b/.github/workflows/hc-copywrite.yml @@ -16,10 +16,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Install copywrite - uses: hashicorp/setup-copywrite@867a1a2a064a0626db322392806428f7dc59cb3e # v1.1.2 + uses: hashicorp/setup-copywrite@32638da2d4e81d56a0764aa1547882fc4d209636 # v1.1.3 - name: Validate Header Compliance run: copywrite headers --plan diff --git a/.github/workflows/issue-opened.yml b/.github/workflows/issue-opened.yml index 1e6bba662a..b0e8f520e0 100644 --- a/.github/workflows/issue-opened.yml +++ b/.github/workflows/issue-opened.yml @@ -8,9 +8,49 @@ jobs: issue_triage: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - uses: github/issue-labeler@98b5412841f6c4b0b3d9c29d53c13fad16bd7de2 # v3.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: github/issue-labeler@c1b0f9f52a63158c4adc09425e858e87b32e9685 # v3.4 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" configuration-path: .github/labeler-issue-triage.yml enable-versioned-regex: 0 + oncall_review_assigner: + runs-on: ubuntu-latest + steps: + - uses: actions/setup-node@v4 + - run: npm install @pagerduty/pdjs + - uses: actions/github-script@e69ef5462fd455e02edcaf4dd7708eda96b9eda0 # v7.0.0 + env: + PAGERDUTY_TOKEN: ${{ secrets.PAGERDUTY_TOKEN }} + with: + script: | + const { PAGERDUTY_TOKEN } = process.env + const { api } = require('@pagerduty/pdjs'); + const pd = api({token: PAGERDUTY_TOKEN}); + const reviewerList = new Map([ + ["Sheneska Williams", "sheneska"], + ["Mauricio Alvarez Leon", "BBBmau"], + ["Alex Somesan", "alexsomesan"], + ["Alex Pilon", "appilon"], + ["John Houston", "jrhouston"], + ["Sacha Rybolovlev", "arybolovlev"], + ]); + + + let resp = await pd.get('oncalls?escalation_policy_ids%5B%5D=PH8IF3M') + if (resp.status != 200){ + core.setFailed("PagerDuty Error: " + resp.statusText) + } + const reviewer = resp.data.oncalls[0].user.summary + const reviewerGH = reviewerList.get(reviewer) + console.log("Assigning issue to " + reviewerGH); + + resp = await github.rest.issues.addAssignees({ + owner: context.repo.owner, + repo: context.repo.repo, + assignees: reviewerGH, + issue_number: context.issue.number, + }) + if (resp.status != 201){ + core.setFailed("error assigning reviewer: user doesn't have the appropriate permissions to be assigned an issue.") + } diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index b7bc3587bc..697265b291 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -8,7 +8,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@c1b35aecc5cdb1a34539d14196df55838bb2f836 # v4.0.0 + - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: github-token: ${{ github.token }} issue-lock-comment: > diff --git a/.github/workflows/prune_stale_issues.yml b/.github/workflows/prune_stale_issues.yml index 2a7862c2e4..9dad5a4928 100644 --- a/.github/workflows/prune_stale_issues.yml +++ b/.github/workflows/prune_stale_issues.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@1160a2240286f5da8ec72b1c0816ce2481aabf84 # v8.0.0 + - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # 9.0.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'Marking this issue as stale due to inactivity. If this issue receives no comments in the next 30 days it will automatically be closed. If this issue was automatically closed and you feel this issue should be reopened, we encourage creating a new issue linking back to this one for added context. This helps our maintainers find and focus on the active issues. Maintainers may also remove the stale label at their discretion. Thank you!' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 262bbc785e..99986a0294 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,12 +12,12 @@ jobs: release-notes: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: fetch-depth: 0 - name: Generate Release Notes - run: sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $(git describe --abbrev=0 --exclude="$(git describe --abbrev=0 --match='v*.*.*' --tags)" --match='v*.*.*' --tags | tr -d v)/q;p" CHANGELOG.md > release-notes.txt - - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + run: sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $(git tag --list 'v*' --sort=-version:refname | head -n 2 | tail -n 1 | tr -d v)/q;p" CHANGELOG.md > release-notes.txt + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: release-notes path: release-notes.txt @@ -25,7 +25,7 @@ jobs: terraform-provider-release: name: 'Terraform Provider Release' needs: [release-notes] - uses: hashicorp/ghaction-terraform-provider-release/.github/workflows/hashicorp.yml@01981baad5d35ce2342924e60ae91cf69fe31fd0 # v2.3.0 + uses: hashicorp/ghaction-terraform-provider-release/.github/workflows/hashicorp.yml@v3.0.1 secrets: hc-releases-key-prod: '${{ secrets.HC_RELEASES_KEY_PROD }}' hc-releases-key-staging: '${{ secrets.HC_RELEASES_KEY_STAGING }}' diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 64ab5c5f8a..79195603f4 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -14,7 +14,7 @@ jobs: get_version_matrix: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - id: get_version_matrix shell: bash run: scripts/get-version-matrix.sh @@ -23,9 +23,9 @@ jobs: unit_test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Set up Go - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 + uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: go.mod - name: Unit tests @@ -44,12 +44,12 @@ jobs: matrix: terraform_version: ${{ fromJson(needs.get_version_matrix.outputs.version_matrix) }} steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Set up Go - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 + uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 with: go-version-file: go.mod - - uses: helm/kind-action@d8ccf8fb623ce1bb360ae2f45f323d9d5c5e9f00 # v1.5.0 + - uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # v1.10.0 id: kind with: wait: 2m diff --git a/.github/workflows/website.yaml b/.github/workflows/website.yaml index a792fca7ce..ebc286367e 100644 --- a/.github/workflows/website.yaml +++ b/.github/workflows/website.yaml @@ -2,7 +2,7 @@ name: website on: push: paths: - - "website/**" + - "docs/**" pull_request: branches: - main @@ -11,7 +11,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: website-lint run: | make website-lint diff --git a/.markdownlinkcheck.json b/.markdownlinkcheck.json index 119d2aa0aa..3707354295 100644 --- a/.markdownlinkcheck.json +++ b/.markdownlinkcheck.json @@ -15,15 +15,15 @@ }, { "pattern": "^/docs/providers/helm/", - "replacement": "file:///github/workspace/website/docs/" + "replacement": "file:///github/workspace/docs/" }, { "pattern": "^(getting-started).html.markdown(#.*)?$", - "replacement": "file:///github/workspace/website/docs/guides/$1.html.md$2" + "replacement": "file:///github/workspace/docs/guides/$1.html.md$2" }, { - "pattern": "^file:///github/workspace/website/docs/guides/(.*)\\.markdown(#.*)?$", - "replacement": "file:///github/workspace/website/docs/guides/$1.md$2" + "pattern": "^file:///github/workspace/docs/guides/(.*)\\.markdown(#.*)?$", + "replacement": "file:///github/workspace/docs/guides/$1.md$2" } ] } diff --git a/.markdownlint.yml b/.markdownlint.yml index 425d9892fa..6bfeb93005 100644 --- a/.markdownlint.yml +++ b/.markdownlint.yml @@ -14,4 +14,6 @@ MD006: false MD012: false MD013: false MD014: false +MD022: false MD024: false +MD033: false diff --git a/CHANGELOG.md b/CHANGELOG.md index fb8bc8acb6..37d36db544 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 2.13.2 (May 8, 2024) + +DEPENDENCIES: + +* Bump github.com/docker/docker from 24.0.7 to 24.0.9 +* Bump golang.org/x/net from 0.21.0 to 0.23.0 +* Bundle license file with TF provider release artifacts + ## 2.13.1 (Apr 15, 2024) HOTFIX: diff --git a/GNUmakefile b/GNUmakefile index 7232b68c31..24dfd6604d 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -122,7 +122,7 @@ PROVIDER_DIR_DOCKER := $(abspath $(lastword $(dir $(MAKEFILE_LIST)))) website-lint: @echo "==> Checking website against linters..." @echo "==> Running markdownlint-cli using DOCKER='$(DOCKER)', DOCKER_RUN_OPTS='$(DOCKER_RUN_OPTS)' and DOCKER_VOLUME_OPTS='$(DOCKER_VOLUME_OPTS)'" - @$(DOCKER) run --rm $(DOCKER_RUN_OPTS) -v $(PROVIDER_DIR_DOCKER):/workspace:$(DOCKER_VOLUME_OPTS) -w /workspace 06kellyjac/markdownlint-cli ./website \ + @$(DOCKER) run --rm $(DOCKER_RUN_OPTS) -v $(PROVIDER_DIR_DOCKER):/workspace:$(DOCKER_VOLUME_OPTS) -w /workspace 06kellyjac/markdownlint-cli ./docs \ && (echo; echo "PASS - website markdown files pass linting"; echo ) \ || (echo; echo "FAIL - issues found in website markdown files"; echo ; exit 1) @echo "==> Checking for broken links..." diff --git a/docs/data-sources/template.md b/docs/data-sources/template.md new file mode 100644 index 0000000000..eb8a1c2309 --- /dev/null +++ b/docs/data-sources/template.md @@ -0,0 +1,221 @@ +--- +page_title: "helm: helm_template" +sidebar_current: "docs-helm-template" +description: |- + +--- +# Data Source: helm_template + +Render chart templates locally. + +`helm_template` renders chart templates locally and exposes the rendered manifests in the data source attributes. `helm_template` mimics the functionality of the `helm template` command. + +The arguments aim to be identical to the `helm_release` resource. + +For further details on the `helm template` command, refer to the [Helm documentation](https://helm.sh/docs/helm/helm_template/). + + +## Schema + +### Required + +- `chart` (String) Chart name to be installed. A path may be used. +- `name` (String) Release name. + +### Optional + +- `api_versions` (List of String) Kubernetes api versions used for Capabilities.APIVersions +- `atomic` (Boolean) If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`. +- `crds` (List of String) List of rendered CRDs from the chart. +- `create_namespace` (Boolean) Create the namespace if it does not exist. Defaults to `false`. +- `dependency_update` (Boolean) Run helm dependency update before installing the chart. Defaults to `false`. +- `description` (String) Add a custom description +- `devel` (Boolean) Use chart development versions, too. Equivalent to version '>0.0.0-0'. If `version` is set, this is ignored +- `disable_openapi_validation` (Boolean) If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema.Defaults to `false`. +- `disable_webhooks` (Boolean) Prevent hooks from running.Defaults to `300` seconds. +- `include_crds` (Boolean) Include CRDs in the templated output +- `is_upgrade` (Boolean) Set .Release.IsUpgrade instead of .Release.IsInstall +- `keyring` (String) Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home`. +- `kube_version` (String) Kubernetes version used for Capabilities.KubeVersion +- `manifest` (String) Concatenated rendered chart templates. This corresponds to the output of the `helm template` command. +- `manifests` (Map of String) Map of rendered chart templates indexed by the template name. +- `namespace` (String) Namespace to install the release into. Defaults to `default`. +- `notes` (String) Rendered notes if the chart contains a `NOTES.txt`. +- `pass_credentials` (Boolean) Pass credentials to all domains. Defaults to `false`. +- `postrender` (Block List, Max: 1) Postrender command configuration. (see [below for nested schema](#nestedblock--postrender)) +- `render_subchart_notes` (Boolean) If set, render subchart notes along with the parent. Defaults to `true`. +- `replace` (Boolean) Re-use the given name, even if that name is already used. This is unsafe in production. Defaults to `false`. +- `repository` (String) Repository where to locate the requested chart. If is a URL the chart is installed without installing the repository. +- `repository_ca_file` (String) The Repositories CA File +- `repository_cert_file` (String) The repositories cert file +- `repository_key_file` (String) The repositories cert key file +- `repository_password` (String, Sensitive) Password for HTTP basic authentication +- `repository_username` (String) Username for HTTP basic authentication +- `reset_values` (Boolean) When upgrading, reset the values to the ones built into the chart.Defaults to `false`. +- `reuse_values` (Boolean) When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`. +- `set` (Block Set) Custom values to be merged with the values. (see [below for nested schema](#nestedblock--set)) +- `set_list` (Block List) Custom sensitive values to be merged with the values. (see [below for nested schema](#nestedblock--set_list)) +- `set_sensitive` (Block Set) Custom sensitive values to be merged with the values. (see [below for nested schema](#nestedblock--set_sensitive)) +- `set_string` (Block Set, Deprecated) Custom string values to be merged with the values. (see [below for nested schema](#nestedblock--set_string)) +- `show_only` (List of String) Only show manifests rendered from the given templates +- `skip_crds` (Boolean) If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`. +- `skip_tests` (Boolean) If set, tests will not be rendered. By default, tests are rendered. Defaults to `false`. +- `timeout` (Number) Time in seconds to wait for any individual kubernetes operation. Defaults to `300` seconds. +- `validate` (Boolean) Validate your manifests against the Kubernetes cluster you are currently pointing at. This is the same validation performed on an install +- `values` (List of String) List of values in raw yaml format to pass to helm. +- `verify` (Boolean) Verify the package before installing it.Defaults to `false`. +- `version` (String) Specify the exact chart version to install. If this is not specified, the latest version is installed. +- `wait` (Boolean) Will wait until all resources are in a ready state before marking the release as successful.Defaults to `true`. + +### Read-Only + +- `id` (String) The ID of this resource. + + +### Nested Schema for `postrender` + +Required: + +- `binary_path` (String) The command binary path. + + + +### Nested Schema for `set` + +Required: + +- `name` (String) +- `value` (String) + +Optional: + +- `type` (String) + + + +### Nested Schema for `set_list` + +Required: + +- `name` (String) +- `value` (List of String) + + + +### Nested Schema for `set_sensitive` + +Required: + +- `name` (String) +- `value` (String, Sensitive) + +Optional: + +- `type` (String) + + + +### Nested Schema for `set_string` + +Required: + +- `name` (String) +- `value` (String) + + + + +## Example Usage + +### Render all chart templates + +The following example renders all templates of the `mariadb` chart of the official Helm stable repository. Concatenated manifests are exposed as output variable `mariadb_instance_manifest`. + +```terraform +data "helm_template" "mariadb_instance" { + name = "mariadb-instance" + namespace = "default" + repository = "https://charts.helm.sh/stable" + + chart = "mariadb" + version = "7.1.0" + + set { + name = "service.port" + value = "13306" + } + + set_sensitive { + name = "rootUser.password" + value = "s3cr3t!" + } +} + +resource "local_file" "mariadb_manifests" { + for_each = data.helm_template.mariadb_instance.manifests + + filename = "./${each.key}" + content = each.value +} + +output "mariadb_instance_manifest" { + value = data.helm_template.mariadb_instance.manifest +} + +output "mariadb_instance_manifests" { + value = data.helm_template.mariadb_instance.manifests +} + +output "mariadb_instance_notes" { + value = data.helm_template.mariadb_instance.notes +} +``` + +### Render selected chart templates + +The following example renders only the templates `master-statefulset.yaml` and `master-svc.yaml` of the `mariadb` chart of the official Helm stable repository. + +```terraform +data "helm_template" "mariadb_instance" { + name = "mariadb-instance" + namespace = "default" + repository = "https://charts.helm.sh/stable" + + chart = "mariadb" + version = "7.1.0" + + show_only = [ + "templates/master-statefulset.yaml", + "templates/master-svc.yaml", + ] + + set { + name = "service.port" + value = "13306" + } + + set_sensitive { + name = "rootUser.password" + value = "s3cr3t!" + } +} + +resource "local_file" "mariadb_manifests" { + for_each = data.helm_template.mariadb_instance.manifests + + filename = "./${each.key}" + content = each.value +} + +output "mariadb_instance_manifest" { + value = data.helm_template.mariadb_instance.manifest +} + +output "mariadb_instance_manifests" { + value = data.helm_template.mariadb_instance.manifests +} + +output "mariadb_instance_notes" { + value = data.helm_template.mariadb_instance.notes +} +``` diff --git a/website/docs/guides/v2-upgrade-guide.markdown b/docs/guides/v2-upgrade-guide.md similarity index 100% rename from website/docs/guides/v2-upgrade-guide.markdown rename to docs/guides/v2-upgrade-guide.md diff --git a/website/docs/index.html.markdown b/docs/index.md similarity index 83% rename from website/docs/index.html.markdown rename to docs/index.md index efe53163b6..7cbfbb24d3 100644 --- a/website/docs/index.html.markdown +++ b/docs/index.md @@ -1,5 +1,4 @@ --- -layout: "helm" page_title: "Provider: Helm" sidebar_current: "docs-helm-index" description: |- @@ -14,7 +13,7 @@ Try the [hands-on tutorial](https://learn.hashicorp.com/tutorials/terraform/helm ## Resources -* [Resource: helm_release](r/release.html) +* [Resource: helm_release](r/release.md) ## Data Sources @@ -22,7 +21,7 @@ Try the [hands-on tutorial](https://learn.hashicorp.com/tutorials/terraform/helm ## Example Usage -```hcl +```terraform provider "helm" { kubernetes { config_path = "~/.kube/config" @@ -66,21 +65,20 @@ resource "helm_release" "nginx_ingress" { The Helm provider can get its configuration in two ways: -1. _Explicitly_ by supplying attributes to the provider block. This includes: +1. *Explicitly* by supplying attributes to the provider block. This includes: * [Using a kubeconfig file](#file-config) * [Supplying credentials](#credentials-config) * [Exec plugins](#exec-plugins) -2. _Implicitly_ through environment variables. This includes: +2. *Implicitly* through environment variables. This includes: * [Using the in-cluster config](#in-cluster-config) For a full list of supported provider authentication arguments and their corresponding environment variables, see the [argument reference](#argument-reference) below. - ### File config The easiest way is to supply a path to your kubeconfig file using the `config_path` attribute or using the `KUBE_CONFIG_PATH` environment variable. A kubeconfig file may have multiple contexts. If `config_context` is not specified, the provider will use the `default` context. -```hcl +```terraform provider "helm" { kubernetes { config_path = "~/.kube/config" @@ -90,7 +88,7 @@ provider "helm" { The provider also supports multiple paths in the same way that kubectl does using the `config_paths` attribute or `KUBE_CONFIG_PATHS` environment variable. -```hcl +```terraform provider "helm" { kubernetes { config_paths = [ @@ -105,7 +103,7 @@ provider "helm" { You can also configure the host, basic auth credentials, and client certificate authentication explicitly or through environment variables. -```hcl +```terraform provider "helm" { kubernetes { host = "https://cluster_endpoint:port" @@ -127,7 +125,7 @@ If you want to connect to a different cluster than the one terraform is running Some cloud providers have short-lived authentication tokens that can expire relatively quickly. To ensure the Kubernetes provider is receiving valid credentials, an exec-based plugin can be used to fetch a new token before initializing the provider. For example, on EKS, the command `eks get-token` can be used: -```hcl +```terraform provider "helm" { kubernetes { host = var.cluster_endpoint @@ -141,6 +139,23 @@ provider "helm" { } ``` +For example, to [authenticate with GKE](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/using_gke_with_terraform#using-the-kubernetes-and-helm-providers), the `gke-cloud-auth-plugin` can be used: + +```terraform +provider "helm" { + kubernetes{ + host = "https://${data.google_container_cluster.my_cluster.endpoint}" + token = data.google_client_config.provider.access_token + cluster_ca_certificate = base64decode( + data.google_container_cluster.my_cluster.master_auth[0].cluster_ca_certificate,) + exec { + api_version = "client.authentication.k8s.io/v1beta1" + command = "gke-gcloud-auth-plugin" + } + } +} +``` + ## Argument Reference The following arguments are supported: @@ -150,8 +165,7 @@ The following arguments are supported: * `registry_config_path` - (Optional) The path to the registry config file. Defaults to `HELM_REGISTRY_CONFIG` env if it is set, otherwise uses the default path set by helm. * `repository_config_path` - (Optional) The path to the file containing repository names and URLs. Defaults to `HELM_REPOSITORY_CONFIG` env if it is set, otherwise uses the default path set by helm. * `repository_cache` - (Optional) The path to the file containing cached repository indexes. Defaults to `HELM_REPOSITORY_CACHE` env if it is set, otherwise uses the default path set by helm. -* `helm_driver` - (Optional) "The backend storage driver. Valid values are: `configmap`, `secret`, `memory`, `sql`. Defaults to `secret`. - Note: Regarding the sql driver, as of helm v3.2.0 SQL support exists only for the postgres dialect. The connection string can be configured by setting the `HELM_DRIVER_SQL_CONNECTION_STRING` environment variable e.g. `HELM_DRIVER_SQL_CONNECTION_STRING=postgres://username:password@host/dbname` more info [here](https://pkg.go.dev/github.com/lib/pq). +* `helm_driver` - (Optional) "The backend storage driver. Valid values are: `configmap`, `secret`, `memory`, `sql`. Defaults to `secret`. Note: Regarding the sql driver, as of helm v3.2.0 SQL support exists only for the postgres dialect. The connection string can be configured by setting the `HELM_DRIVER_SQL_CONNECTION_STRING` environment variable e.g. `HELM_DRIVER_SQL_CONNECTION_STRING=postgres://username:password@host/dbname` more info [here](https://pkg.go.dev/github.com/lib/pq). * `burst_limit` - (Optional) The helm burst limit to use. Set this value higher if your cluster has many CRDs. Default: `100` * `kubernetes` - Kubernetes configuration block. * `registry` - Private OCI registry configuration block. Can be specified multiple times. @@ -172,10 +186,10 @@ The `kubernetes` block supports: * `config_context` - (Optional) Context to choose from the config file. Can be sourced from `KUBE_CTX`. * `proxy_url` - (Optional) URL to the proxy to be used for all API requests. URLs with "http", "https", and "socks5" schemes are supported. Can be sourced from `KUBE_PROXY_URL`. * `exec` - (Optional) Configuration block to use an [exec-based credential plugin](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins), e.g. call an external command to receive user credentials. - * `api_version` - (Required) API version to use when decoding the ExecCredentials resource, e.g. `client.authentication.k8s.io/v1beta1`. - * `command` - (Required) Command to execute. - * `args` - (Optional) List of arguments to pass when executing the plugin. - * `env` - (Optional) Map of environment variables to set when executing the plugin. +* `api_version` - (Required) API version to use when decoding the ExecCredentials resource, e.g. `client.authentication.k8s.io/v1beta1`. +* `command` - (Required) Command to execute. +* `args` - (Optional) List of arguments to pass when executing the plugin. +* `env` - (Optional) Map of environment variables to set when executing the plugin. The `registry` block has options: diff --git a/docs/resources/release.md b/docs/resources/release.md new file mode 100644 index 0000000000..e42e1bd131 --- /dev/null +++ b/docs/resources/release.md @@ -0,0 +1,337 @@ +--- +page_title: "helm: helm_release" +sidebar_current: "docs-helm-release" +description: |- + +--- +# Resource: helm_release + +A Release is an instance of a chart running in a Kubernetes cluster. + +A Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster. + +`helm_release` describes the desired status of a chart in a kubernetes cluster. + + +## Schema + +### Required + +- `chart` (String) Chart name to be installed. A path may be used. +- `name` (String) Release name. The length must not be longer than 53 characters. + +### Optional + +- `atomic` (Boolean) If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`. +- `cleanup_on_fail` (Boolean) Allow deletion of new resources created in this upgrade when upgrade fails. Defaults to `false`. +- `create_namespace` (Boolean) Create the namespace if it does not exist. Defaults to `false`. +- `dependency_update` (Boolean) Run helm dependency update before installing the chart. Defaults to `false`. +- `description` (String) Add a custom description +- `devel` (Boolean) Use chart development versions, too. Equivalent to version '>0.0.0-0'. If `version` is set, this is ignored +- `disable_crd_hooks` (Boolean) Prevent CRD hooks from, running, but run other hooks. See helm install --no-crd-hook +- `disable_openapi_validation` (Boolean) If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema. Defaults to `false`. +- `disable_webhooks` (Boolean) Prevent hooks from running.Defaults to `false`. +- `force_update` (Boolean) Force resource update through delete/recreate if needed. Defaults to `false`. +- `keyring` (String) Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home`. +- `lint` (Boolean) Run helm lint when planning. Defaults to `false`. +- `max_history` (Number) Limit the maximum number of revisions saved per release. Use 0 for no limit. Defaults to 0 (no limit). +- `namespace` (String) Namespace to install the release into. Defaults to `default`. +- `pass_credentials` (Boolean) Pass credentials to all domains. Defaults to `false`. +- `postrender` (Block List, Max: 1) Postrender command configuration. (see [below for nested schema](#nestedblock--postrender)) +- `recreate_pods` (Boolean) Perform pods restart during upgrade/rollback. Defaults to `false`. +- `render_subchart_notes` (Boolean) If set, render subchart notes along with the parent. Defaults to `true`. +- `replace` (Boolean) Re-use the given name, even if that name is already used. This is unsafe in production. Defaults to `false`. +- `repository` (String) Repository where to locate the requested chart. If is a URL the chart is installed without installing the repository. +- `repository_ca_file` (String) The Repositories CA File +- `repository_cert_file` (String) The repositories cert file +- `repository_key_file` (String) The repositories cert key file +- `repository_password` (String, Sensitive) Password for HTTP basic authentication +- `repository_username` (String) Username for HTTP basic authentication +- `reset_values` (Boolean) When upgrading, reset the values to the ones built into the chart. Defaults to `false`. +- `reuse_values` (Boolean) When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`. +- `set` (Block Set) Custom values to be merged with the values. (see [below for nested schema](#nestedblock--set)) +- `set_list` (Block List) Custom sensitive values to be merged with the values. (see [below for nested schema](#nestedblock--set_list)) +- `set_sensitive` (Block Set) Custom sensitive values to be merged with the values. (see [below for nested schema](#nestedblock--set_sensitive)) +- `skip_crds` (Boolean) If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`. +- `timeout` (Number) Time in seconds to wait for any individual kubernetes operation. Defaults to 300 seconds. +- `values` (List of String) List of values in raw yaml format to pass to helm. +- `verify` (Boolean) Verify the package before installing it.Defaults to `false`. +- `version` (String) Specify the exact chart version to install. If this is not specified, the latest version is installed. +- `wait` (Boolean) Will wait until all resources are in a ready state before marking the release as successful. Defaults to `true`. +- `wait_for_jobs` (Boolean) If wait is enabled, will wait until all Jobs have been completed before marking the release as successful. Defaults to `false``. + +### Read-Only + +- `id` (String) The ID of this resource. +- `manifest` (String) The rendered manifest as JSON. +- `metadata` (List of Object) Status of the deployed release. (see [below for nested schema](#nestedatt--metadata)) +- `status` (String) Status of the release. + + +### Nested Schema for `postrender` + +Required: + +- `binary_path` (String) The command binary path. + +Optional: + +- `args` (List of String) an argument to the post-renderer (can specify multiple) + + + +### Nested Schema for `set` + +Required: + +- `name` (String) +- `value` (String) + +Optional: + +- `type` (String) + + + +### Nested Schema for `set_list` + +Required: + +- `name` (String) +- `value` (List of String) + + + +### Nested Schema for `set_sensitive` + +Required: + +- `name` (String) +- `value` (String, Sensitive) + +Optional: + +- `type` (String) + + + +### Nested Schema for `metadata` + +Read-Only: + +- `app_version` (String) +- `chart` (String) +- `first_deployed` (Number) +- `last_deployed` (Number) +- `name` (String) +- `namespace` (String) +- `notes` (String) +- `revision` (Number) +- `values` (String) +- `version` (String) + + + + + +## Example Usage - Chart Repository + +```terraform +resource "helm_release" "example" { + name = "my-redis-release" + repository = "https://charts.bitnami.com/bitnami" + chart = "redis" + version = "6.0.1" + + values = [ + "${file("values.yaml")}" + ] + + set { + name = "cluster.enabled" + value = "true" + } + + set { + name = "metrics.enabled" + value = "true" + } + + set { + name = "service.annotations.prometheus\\.io/port" + value = "9127" + type = "string" + } +} +``` + +## Example Usage - Local Chart + +In case a Chart is not available from a repository, a path may be used: + +```terraform +resource "helm_release" "example" { + name = "my-local-chart" + chart = "./charts/example" +} +``` + +## Example Usage - Chart URL + +An absolute URL to the .tgz of the Chart may also be used: + +```terraform +resource "helm_release" "example" { + name = "redis" + chart = "https://charts.bitnami.com/bitnami/redis-10.7.16.tgz" +} +``` + +## Example Usage - Chart Repository configured from OCI Registry + +Provider supports grabbing charts from an OCI repository: + +```terraform +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } + + # localhost registry with password protection + registry { + url = "oci://localhost:5000" + username = "username" + password = "password" + } +} + +resource "helm_release" "example" { + name = "testchart" + namespace = "helm_registry" + repository = "oci://localhost:5000/helm-charts" + version = "1.2.3" + chart = "test-chart" +} +``` + +## Example Usage - Chart Repository configured using GCS/S3 + +The provider also supports helm plugins such as GCS and S3 that add S3/GCS helm repositories by using `helm plugin install` + +```terraform +# Install GCS plugin +`helm plugin install https://github.com/hayorov/helm-gcs.git` + +# Run follow commands to setup GCS repository + +# Init a new repository: +# helm gcs init gs://bucket/path + +# Add your repository to Helm: +# helm repo add repo-name gs://bucket/path + +# Push a chart to your repository: +# helm gcs push chart.tar.gz repo-name + +# Update Helm cache: +# helm repo update + +# Get your chart: + +resource "helm_release" "GCS" { + name = "GCS" + repository = "gs://tf-test-helm-repo/charts" + chart = "chart" +} +``` + +```terraform +# Install AWS S3 plugin +`helm plugin install https://github.com/hypnoglow/helm-s3.git` + +# Run follow commands to setup S3 repository + +# Init a new repository: +# helm s3 init s3://my-helm-charts/stable/myapp + +# Add your repository to Helm: +# helm repo add stable-myapp s3://my-helm-charts/stable/myapp/ + +# Push a chart to your repository: +# helm s3 push chart.tar.gz repo-name + +# Update Helm cache: +# helm repo update + +# Get your chart: + +resource "helm_release" "S3" { + name = "S3" + repository = "s3://tf-test-helm-repo/charts" + chart = "chart" +} +``` + +## Example Usage - Chart Repository configured outside of Terraform + +The provider also supports repositories that are added to the local machine outside of Terraform by running `helm repo add` + +```terraform +# run this first: `helm repo add bitnami https://charts.bitnami.com/bitnami` + +resource "helm_release" "example" { + name = "redis" + chart = "bitnami/redis" +} +``` + +The `set`, `set_list`, and `set_sensitive` blocks support: + +* `name` - (Required) full name of the variable to be set. +* `value` - (Required) value of the variable to be set. +* `type` - (Optional) type of the variable to be set. Valid options are `auto` and `string`. + +Since Terraform Utilizes HCL as well as Helm using the Helm Template Language, it's necessary to escape the `{}`, `[]`, `.`, and `,` characters twice in order for it to be parsed. `name` should also be set to the `value path`, and `value` is the desired value that will be set. + +```terraform +set { + name = "grafana.ingress.annotations.alb\\.ingress\\.kubernetes\\.io/group\\.name" + value = "shared-ingress" +} +``` + +```terraform +set_list { + name = "hashicorp" + value = ["terraform", "nomad", "vault"] +} +``` + +```terraform +controller: + pod: + annotations: + status.kubernetes.io/restart-on-failure: {"timeout": "30s"} +``` + +```terraform +set { + name = "controller.pod.annotations.status\\.kubernetes\\.io/restart-on-failure" + value = "\\{\"timeout\": \"30s\"\\}" +} +``` + +The `postrender` block supports two attributes: + +* `binary_path` - (Required) relative or full path to command binary. +* `args` - (Optional) a list of arguments to supply to the post-renderer. + +## Import + +A Helm Release resource can be imported using its namespace and name e.g. + +```shell +$ terraform import helm_release.example default/example-name +``` + +~> **NOTE:** Since the `repository` attribute is not being persisted as metadata by helm, it will not be set to any value by default. All other provider specific attributes will be set to their default values and they can be overriden after running `apply` using the resource definition configuration. diff --git a/examples/data-sources/template/example_1.tf b/examples/data-sources/template/example_1.tf new file mode 100644 index 0000000000..26c4cfd773 --- /dev/null +++ b/examples/data-sources/template/example_1.tf @@ -0,0 +1,37 @@ +data "helm_template" "mariadb_instance" { + name = "mariadb-instance" + namespace = "default" + repository = "https://charts.helm.sh/stable" + + chart = "mariadb" + version = "7.1.0" + + set { + name = "service.port" + value = "13306" + } + + set_sensitive { + name = "rootUser.password" + value = "s3cr3t!" + } +} + +resource "local_file" "mariadb_manifests" { + for_each = data.helm_template.mariadb_instance.manifests + + filename = "./${each.key}" + content = each.value +} + +output "mariadb_instance_manifest" { + value = data.helm_template.mariadb_instance.manifest +} + +output "mariadb_instance_manifests" { + value = data.helm_template.mariadb_instance.manifests +} + +output "mariadb_instance_notes" { + value = data.helm_template.mariadb_instance.notes +} diff --git a/examples/data-sources/template/example_2.tf b/examples/data-sources/template/example_2.tf new file mode 100644 index 0000000000..6b79807d40 --- /dev/null +++ b/examples/data-sources/template/example_2.tf @@ -0,0 +1,42 @@ +data "helm_template" "mariadb_instance" { + name = "mariadb-instance" + namespace = "default" + repository = "https://charts.helm.sh/stable" + + chart = "mariadb" + version = "7.1.0" + + show_only = [ + "templates/master-statefulset.yaml", + "templates/master-svc.yaml", + ] + + set { + name = "service.port" + value = "13306" + } + + set_sensitive { + name = "rootUser.password" + value = "s3cr3t!" + } +} + +resource "local_file" "mariadb_manifests" { + for_each = data.helm_template.mariadb_instance.manifests + + filename = "./${each.key}" + content = each.value +} + +output "mariadb_instance_manifest" { + value = data.helm_template.mariadb_instance.manifest +} + +output "mariadb_instance_manifests" { + value = data.helm_template.mariadb_instance.manifests +} + +output "mariadb_instance_notes" { + value = data.helm_template.mariadb_instance.notes +} diff --git a/examples/example_1.tf b/examples/example_1.tf new file mode 100644 index 0000000000..d2036a7556 --- /dev/null +++ b/examples/example_1.tf @@ -0,0 +1,31 @@ +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } + + # localhost registry with password protection + registry { + url = "oci://localhost:5000" + username = "username" + password = "password" + } + + # private registry + registry { + url = "oci://private.registry" + username = "username" + password = "password" + } +} + +resource "helm_release" "nginx_ingress" { + name = "nginx-ingress-controller" + + repository = "https://charts.bitnami.com/bitnami" + chart = "nginx-ingress-controller" + + set { + name = "service.type" + value = "ClusterIP" + } +} diff --git a/examples/example_2.tf b/examples/example_2.tf new file mode 100644 index 0000000000..9fccea60dc --- /dev/null +++ b/examples/example_2.tf @@ -0,0 +1,5 @@ +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } +} diff --git a/examples/example_3.tf b/examples/example_3.tf new file mode 100644 index 0000000000..fe88018b39 --- /dev/null +++ b/examples/example_3.tf @@ -0,0 +1,8 @@ +provider "helm" { + kubernetes { + config_paths = [ + "/path/to/config_a.yaml", + "/path/to/config_b.yaml" + ] + } +} diff --git a/examples/example_4.tf b/examples/example_4.tf new file mode 100644 index 0000000000..21bd8b1101 --- /dev/null +++ b/examples/example_4.tf @@ -0,0 +1,9 @@ +provider "helm" { + kubernetes { + host = "https://cluster_endpoint:port" + + client_certificate = file("~/.kube/client-cert.pem") + client_key = file("~/.kube/client-key.pem") + cluster_ca_certificate = file("~/.kube/cluster-ca-cert.pem") + } +} diff --git a/examples/example_5.tf b/examples/example_5.tf new file mode 100644 index 0000000000..adc8e272a4 --- /dev/null +++ b/examples/example_5.tf @@ -0,0 +1,11 @@ +provider "helm" { + kubernetes { + host = var.cluster_endpoint + cluster_ca_certificate = base64decode(var.cluster_ca_cert) + exec { + api_version = "client.authentication.k8s.io/v1beta1" + args = ["eks", "get-token", "--cluster-name", var.cluster_name] + command = "aws" + } + } +} diff --git a/examples/example_6.tf b/examples/example_6.tf new file mode 100644 index 0000000000..98c90a8bfe --- /dev/null +++ b/examples/example_6.tf @@ -0,0 +1,12 @@ +provider "helm" { + kubernetes{ + host = "https://${data.google_container_cluster.my_cluster.endpoint}" + token = data.google_client_config.provider.access_token + cluster_ca_certificate = base64decode( + data.google_container_cluster.my_cluster.master_auth[0].cluster_ca_certificate,) + exec { + api_version = "client.authentication.k8s.io/v1beta1" + command = "gke-gcloud-auth-plugin" + } + } +} diff --git a/examples/resources/release/example_1.tf b/examples/resources/release/example_1.tf new file mode 100644 index 0000000000..a2097008ef --- /dev/null +++ b/examples/resources/release/example_1.tf @@ -0,0 +1,26 @@ +resource "helm_release" "example" { + name = "my-redis-release" + repository = "https://charts.bitnami.com/bitnami" + chart = "redis" + version = "6.0.1" + + values = [ + "${file("values.yaml")}" + ] + + set { + name = "cluster.enabled" + value = "true" + } + + set { + name = "metrics.enabled" + value = "true" + } + + set { + name = "service.annotations.prometheus\\.io/port" + value = "9127" + type = "string" + } +} diff --git a/examples/resources/release/example_10.tf b/examples/resources/release/example_10.tf new file mode 100644 index 0000000000..a4a122ea98 --- /dev/null +++ b/examples/resources/release/example_10.tf @@ -0,0 +1,4 @@ +controller: + pod: + annotations: + status.kubernetes.io/restart-on-failure: {"timeout": "30s"} diff --git a/examples/resources/release/example_11.tf b/examples/resources/release/example_11.tf new file mode 100644 index 0000000000..87aa171c49 --- /dev/null +++ b/examples/resources/release/example_11.tf @@ -0,0 +1,4 @@ +set { + name = "controller.pod.annotations.status\\.kubernetes\\.io/restart-on-failure" + value = "\\{\"timeout\": \"30s\"\\}" +} diff --git a/examples/resources/release/example_2.tf b/examples/resources/release/example_2.tf new file mode 100644 index 0000000000..2158a87984 --- /dev/null +++ b/examples/resources/release/example_2.tf @@ -0,0 +1,4 @@ +resource "helm_release" "example" { + name = "my-local-chart" + chart = "./charts/example" +} diff --git a/examples/resources/release/example_3.tf b/examples/resources/release/example_3.tf new file mode 100644 index 0000000000..dcebc081de --- /dev/null +++ b/examples/resources/release/example_3.tf @@ -0,0 +1,4 @@ +resource "helm_release" "example" { + name = "redis" + chart = "https://charts.bitnami.com/bitnami/redis-10.7.16.tgz" +} diff --git a/examples/resources/release/example_4.tf b/examples/resources/release/example_4.tf new file mode 100644 index 0000000000..344e0d28d1 --- /dev/null +++ b/examples/resources/release/example_4.tf @@ -0,0 +1,21 @@ + +provider "helm" { + kubernetes { + config_path = "~/.kube/config" + } + + # localhost registry with password protection + registry { + url = "oci://localhost:5000" + username = "username" + password = "password" + } +} + +resource "helm_release" "example" { + name = "testchart" + namespace = "helm_registry" + repository = "oci://localhost:5000/helm-charts" + version = "1.2.3" + chart = "test-chart" +} diff --git a/examples/resources/release/example_5.tf b/examples/resources/release/example_5.tf new file mode 100644 index 0000000000..6f4d600170 --- /dev/null +++ b/examples/resources/release/example_5.tf @@ -0,0 +1,25 @@ + +# Install GCS plugin +`helm plugin install https://github.com/hayorov/helm-gcs.git` + +# Run follow commands to setup GCS repository + +# Init a new repository: +# helm gcs init gs://bucket/path + +# Add your repository to Helm: +# helm repo add repo-name gs://bucket/path + +# Push a chart to your repository: +# helm gcs push chart.tar.gz repo-name + +# Update Helm cache: +# helm repo update + +# Get your chart: + +resource "helm_release" "GCS" { + name = "GCS" + repository = "gs://tf-test-helm-repo/charts" + chart = "chart" +} diff --git a/examples/resources/release/example_6.tf b/examples/resources/release/example_6.tf new file mode 100644 index 0000000000..5364672539 --- /dev/null +++ b/examples/resources/release/example_6.tf @@ -0,0 +1,25 @@ + +# Install AWS S3 plugin +`helm plugin install https://github.com/hypnoglow/helm-s3.git` + +# Run follow commands to setup S3 repository + +# Init a new repository: +# helm s3 init s3://my-helm-charts/stable/myapp + +# Add your repository to Helm: +# helm repo add stable-myapp s3://my-helm-charts/stable/myapp/ + +# Push a chart to your repository: +# helm s3 push chart.tar.gz repo-name + +# Update Helm cache: +# helm repo update + +# Get your chart: + +resource "helm_release" "S3" { + name = "S3" + repository = "s3://tf-test-helm-repo/charts" + chart = "chart" +} diff --git a/examples/resources/release/example_7.tf b/examples/resources/release/example_7.tf new file mode 100644 index 0000000000..58a9400f65 --- /dev/null +++ b/examples/resources/release/example_7.tf @@ -0,0 +1,7 @@ + +# run this first: `helm repo add bitnami https://charts.bitnami.com/bitnami` + +resource "helm_release" "example" { + name = "redis" + chart = "bitnami/redis" +} diff --git a/examples/resources/release/example_8.tf b/examples/resources/release/example_8.tf new file mode 100644 index 0000000000..a347b4527e --- /dev/null +++ b/examples/resources/release/example_8.tf @@ -0,0 +1,4 @@ +set { + name = "grafana.ingress.annotations.alb\\.ingress\\.kubernetes\\.io/group\\.name" + value = "shared-ingress" +} diff --git a/examples/resources/release/example_9.tf b/examples/resources/release/example_9.tf new file mode 100644 index 0000000000..22f6384175 --- /dev/null +++ b/examples/resources/release/example_9.tf @@ -0,0 +1,4 @@ +set_list { + name = "hashicorp" + value = ["terraform", "nomad", "vault"] +} diff --git a/go.mod b/go.mod index 05b60068f6..c821b53032 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,23 @@ module github.com/hashicorp/terraform-provider-helm -go 1.21 +go 1.22.0 + +toolchain go1.22.5 require ( github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637 github.com/hashicorp/terraform-plugin-docs v0.16.0 - github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0 + github.com/hashicorp/terraform-plugin-go v0.23.0 + github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 + github.com/hashicorp/terraform-plugin-testing v1.8.0 github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.8.4 - golang.org/x/crypto v0.21.0 - helm.sh/helm/v3 v3.13.2 - k8s.io/api v0.28.4 - k8s.io/apimachinery v0.28.4 - k8s.io/client-go v0.28.4 + golang.org/x/crypto v0.23.0 + helm.sh/helm/v3 v3.15.3 + k8s.io/api v0.30.0 + k8s.io/apimachinery v0.30.0 + k8s.io/client-go v0.30.0 k8s.io/klog v1.0.0 sigs.k8s.io/yaml v1.4.0 ) @@ -28,7 +32,7 @@ require ( github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + github.com/ProtonMail/go-crypto v1.1.0-alpha.2 // indirect github.com/agext/levenshtein v1.2.2 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/armon/go-radix v1.0.0 // indirect @@ -38,59 +42,59 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/containerd/containerd v1.7.11 // indirect + github.com/containerd/containerd v1.7.12 // indirect github.com/containerd/log v0.1.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v24.0.6+incompatible // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.9+incompatible // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/cli v25.0.1+incompatible // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v25.0.5+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.10.1 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch v5.7.0+incompatible // indirect github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect - github.com/fatih/color v1.13.0 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.0.1 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.5.1 // indirect + github.com/hashicorp/go-plugin v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hc-install v0.6.1 // indirect - github.com/hashicorp/hcl/v2 v2.19.1 // indirect + github.com/hashicorp/hc-install v0.6.4 // indirect + github.com/hashicorp/hcl/v2 v2.20.1 // indirect github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/terraform-exec v0.19.0 // indirect - github.com/hashicorp/terraform-json v0.17.1 // indirect - github.com/hashicorp/terraform-plugin-go v0.19.0 // indirect + github.com/hashicorp/terraform-exec v0.21.0 // indirect + github.com/hashicorp/terraform-json v0.22.1 // indirect github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect - github.com/hashicorp/terraform-registry-address v0.2.2 // indirect + github.com/hashicorp/terraform-registry-address v0.2.3 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect - github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.15 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -104,7 +108,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/cli v1.1.5 // indirect @@ -119,11 +123,11 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/image-spec v1.1.0-rc6 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/posener/complete v1.2.3 // indirect @@ -137,48 +141,49 @@ require ( github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect - github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect - github.com/zclconf/go-cty v1.14.1 // indirect + github.com/zclconf/go-cty v1.14.4 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect go.opentelemetry.io/otel v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect - golang.org/x/mod v0.13.0 // indirect + golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/grpc v1.58.3 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/tools v0.18.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect + google.golang.org/grpc v1.63.2 // indirect + google.golang.org/protobuf v1.34.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.28.2 // indirect - k8s.io/apiserver v0.28.2 // indirect - k8s.io/cli-runtime v0.28.2 // indirect - k8s.io/component-base v0.28.2 // indirect - k8s.io/klog/v2 v2.100.1 // indirect - k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect - k8s.io/kubectl v0.28.2 // indirect - k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect - oras.land/oras-go v1.2.4 // indirect + k8s.io/apiextensions-apiserver v0.30.0 // indirect + k8s.io/apiserver v0.30.0 // indirect + k8s.io/cli-runtime v0.30.0 // indirect + k8s.io/component-base v0.30.0 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/kubectl v0.30.0 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/go.sum b/go.sum index 5a4ec1c10c..8d44b99441 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -27,12 +27,10 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= +github.com/ProtonMail/go-crypto v1.1.0-alpha.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE= github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -63,7 +61,6 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembj github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -73,18 +70,17 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.11 h1:lfGKw3eU35sjV0aG2eYZTiwFEY1pCzxdzicHP3SZILw= -github.com/containerd/containerd v1.7.11/go.mod h1:5UluHxHTX2rdvYuZ5OJTC5m/KJNs0Zs9wVoJm9zf5ZE= +github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= +github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= @@ -95,37 +91,38 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= -github.com/docker/cli v24.0.6+incompatible h1:fF+XCQCgJjjQNIMjzaSmiKJSCcfcXb3TWTcc7GAneOY= -github.com/docker/cli v24.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= -github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v25.0.5+incompatible h1:UmQydMduGkrD5nQde1mecF/YnSbTOaPeFIeP5C4W+DE= +github.com/docker/docker v25.0.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= -github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= +github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI= @@ -138,18 +135,17 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git/v5 v5.9.0 h1:cD9SFA7sHVRdJ7AYck1ZaAa/yeuBvGPxwXDL8cxrObY= -github.com/go-git/go-git/v5 v5.9.0/go.mod h1:RKIqga24sWdMGZF+1Ekv9kylsDz6LzdTSI2s/OsZWE0= +github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= +github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= @@ -191,8 +187,9 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= @@ -218,13 +215,15 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= @@ -239,13 +238,13 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637 h1:Ud/6/AdmJ1R7ibdS0Wo5MWPj0T1R0fkpaD087bBaW8I= github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.5.1 h1:oGm7cWBaYIp3lJpx1RUEfLWophprE2EV/KUeqBYo+6k= -github.com/hashicorp/go-plugin v1.5.1/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= +github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -253,30 +252,32 @@ github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mO github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hc-install v0.6.1 h1:IGxShH7AVhPaSuSJpKtVi/EFORNjO+OYVJJrAtGG2mY= -github.com/hashicorp/hc-install v0.6.1/go.mod h1:0fW3jpg+wraYSnFDJ6Rlie3RvLf1bIqVIkzoon4KoVE= -github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= -github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/hc-install v0.6.4 h1:QLqlM56/+SIIGvGcfFiwMY3z5WGXT066suo/v9Km8e0= +github.com/hashicorp/hc-install v0.6.4/go.mod h1:05LWLy8TD842OtgcfBbOT0WMoInBMUSHjmDx10zuBIA= +github.com/hashicorp/hcl/v2 v2.20.1 h1:M6hgdyz7HYt1UN9e61j+qKJBqR3orTWbI1HKBJEdxtc= +github.com/hashicorp/hcl/v2 v2.20.1/go.mod h1:TZDqQ4kNKCbh1iJp99FdPiUaVDDUPivbqxZulxDYqL4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/terraform-exec v0.19.0 h1:FpqZ6n50Tk95mItTSS9BjeOVUb4eg81SpgVtZNNtFSM= -github.com/hashicorp/terraform-exec v0.19.0/go.mod h1:tbxUpe3JKruE9Cuf65mycSIT8KiNPZ0FkuTE3H4urQg= -github.com/hashicorp/terraform-json v0.17.1 h1:eMfvh/uWggKmY7Pmb3T85u86E2EQg6EQHgyRwf3RkyA= -github.com/hashicorp/terraform-json v0.17.1/go.mod h1:Huy6zt6euxaY9knPAFKjUITn8QxUFIe9VuSzb4zn/0o= +github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ= +github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= +github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= +github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= github.com/hashicorp/terraform-plugin-docs v0.16.0 h1:UmxFr3AScl6Wged84jndJIfFccGyBZn52KtMNsS12dI= github.com/hashicorp/terraform-plugin-docs v0.16.0/go.mod h1:M3ZrlKBJAbPMtNOPwHicGi1c+hZUh7/g0ifT/z7TVfA= -github.com/hashicorp/terraform-plugin-go v0.19.0 h1:BuZx/6Cp+lkmiG0cOBk6Zps0Cb2tmqQpDM3iAtnhDQU= -github.com/hashicorp/terraform-plugin-go v0.19.0/go.mod h1:EhRSkEPNoylLQntYsk5KrDHTZJh9HQoumZXbOGOXmec= +github.com/hashicorp/terraform-plugin-go v0.23.0 h1:AALVuU1gD1kPb48aPQUjug9Ir/125t+AAurhqphJ2Co= +github.com/hashicorp/terraform-plugin-go v0.23.0/go.mod h1:1E3Cr9h2vMlahWMbsSEcNrOCxovCZhOOIXjFHbjc/lQ= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0 h1:X7vB6vn5tON2b49ILa4W7mFAsndeqJ7bZFOGbVO+0Cc= -github.com/hashicorp/terraform-plugin-sdk/v2 v2.30.0/go.mod h1:ydFcxbdj6klCqYEPkPvdvFKiNGKZLUs+896ODUXCyao= -github.com/hashicorp/terraform-registry-address v0.2.2 h1:lPQBg403El8PPicg/qONZJDC6YlgCVbWDtNmmZKtBno= -github.com/hashicorp/terraform-registry-address v0.2.2/go.mod h1:LtwNbCihUoUZ3RYriyS2wF/lGPB6gF9ICLRtuDk7hSo= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJiWGx2kiQVo97Y5IOGR4EMcZ8DtMswHhUuFibsCQQE= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0/go.mod h1:sl/UoabMc37HA6ICVMmGO+/0wofkVIRxf+BMb/dnoIg= +github.com/hashicorp/terraform-plugin-testing v1.8.0 h1:wdYIgwDk4iO933gC4S8KbKdnMQShu6BXuZQPScmHvpk= +github.com/hashicorp/terraform-plugin-testing v1.8.0/go.mod h1:o2kOgf18ADUaZGhtOl0YCkfIxg01MAiMATT2EtIHlZk= +github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI= +github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -318,8 +319,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -346,8 +345,8 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -391,21 +390,21 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= -github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= +github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= +github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= +github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0-rc6 h1:XDqvyKsJEbRtATzkgItUqBA7QHk58yxX1Ov9HERHNqU= +github.com/opencontainers/image-spec v1.1.0-rc6/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= @@ -449,21 +448,21 @@ github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3V github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= -github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -486,8 +485,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -510,8 +509,10 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zclconf/go-cty v1.14.1 h1:t9fyA35fwjjUMcmL5hLER+e/rEPqrbCK1/OSE4SI9KA= -github.com/zclconf/go-cty v1.14.1/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= @@ -532,10 +533,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -545,16 +544,14 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -562,13 +559,11 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -576,9 +571,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -599,28 +593,23 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -632,27 +621,26 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -663,8 +651,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= +google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -685,43 +673,43 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -helm.sh/helm/v3 v3.13.2 h1:IcO9NgmmpetJODLZhR3f3q+6zzyXVKlRizKFwbi7K8w= -helm.sh/helm/v3 v3.13.2/go.mod h1:GIHDwZggaTGbedevTlrQ6DB++LBN6yuQdeGj0HNaDx0= +helm.sh/helm/v3 v3.15.3 h1:HcZDaVFe9uHa6hpsR54mJjYyRy4uz/pc6csg27nxFOc= +helm.sh/helm/v3 v3.15.3/go.mod h1:FzSIP8jDQaa6WAVg9F+OkKz7J0ZmAga4MABtTbsb9WQ= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY= -k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0= -k8s.io/apiextensions-apiserver v0.28.2 h1:J6/QRWIKV2/HwBhHRVITMLYoypCoPY1ftigDM0Kn+QU= -k8s.io/apiextensions-apiserver v0.28.2/go.mod h1:5tnkxLGa9nefefYzWuAlWZ7RZYuN/765Au8cWLA6SRg= -k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8= -k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg= -k8s.io/apiserver v0.28.2 h1:rBeYkLvF94Nku9XfXyUIirsVzCzJBs6jMn3NWeHieyI= -k8s.io/apiserver v0.28.2/go.mod h1:f7D5e8wH8MWcKD7azq6Csw9UN+CjdtXIVQUyUhrtb+E= -k8s.io/cli-runtime v0.28.2 h1:64meB2fDj10/ThIMEJLO29a1oujSm0GQmKzh1RtA/uk= -k8s.io/cli-runtime v0.28.2/go.mod h1:bTpGOvpdsPtDKoyfG4EG041WIyFZLV9qq4rPlkyYfDA= -k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY= -k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4= -k8s.io/component-base v0.28.2 h1:Yc1yU+6AQSlpJZyvehm/NkJBII72rzlEsd6MkBQ+G0E= -k8s.io/component-base v0.28.2/go.mod h1:4IuQPQviQCg3du4si8GpMrhAIegxpsgPngPRR/zWpzc= +k8s.io/api v0.30.0 h1:siWhRq7cNjy2iHssOB9SCGNCl2spiF1dO3dABqZ8niA= +k8s.io/api v0.30.0/go.mod h1:OPlaYhoHs8EQ1ql0R/TsUgaRPhpKNxIMrKQfWUp8QSE= +k8s.io/apiextensions-apiserver v0.30.0 h1:jcZFKMqnICJfRxTgnC4E+Hpcq8UEhT8B2lhBcQ+6uAs= +k8s.io/apiextensions-apiserver v0.30.0/go.mod h1:N9ogQFGcrbWqAY9p2mUAL5mGxsLqwgtUce127VtRX5Y= +k8s.io/apimachinery v0.30.0 h1:qxVPsyDM5XS96NIh9Oj6LavoVFYff/Pon9cZeDIkHHA= +k8s.io/apimachinery v0.30.0/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/apiserver v0.30.0 h1:QCec+U72tMQ+9tR6A0sMBB5Vh6ImCEkoKkTDRABWq6M= +k8s.io/apiserver v0.30.0/go.mod h1:smOIBq8t0MbKZi7O7SyIpjPsiKJ8qa+llcFCluKyqiY= +k8s.io/cli-runtime v0.30.0 h1:0vn6/XhOvn1RJ2KJOC6IRR2CGqrpT6QQF4+8pYpWQ48= +k8s.io/cli-runtime v0.30.0/go.mod h1:vATpDMATVTMA79sZ0YUCzlMelf6rUjoBzlp+RnoM+cg= +k8s.io/client-go v0.30.0 h1:sB1AGGlhY/o7KCyCEQ0bPWzYDL0pwOZO4vAtTSh/gJQ= +k8s.io/client-go v0.30.0/go.mod h1:g7li5O5256qe6TYdAMyX/otJqMhIiGgTapdLchhmOaY= +k8s.io/component-base v0.30.0 h1:cj6bp38g0ainlfYtaOQuRELh5KSYjhKxM+io7AUIk4o= +k8s.io/component-base v0.30.0/go.mod h1:V9x/0ePFNaKeKYA3bOvIbrNoluTSG+fSJKjLdjOoeXQ= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= -k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= -k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= -k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= -k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk= -k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -oras.land/oras-go v1.2.4 h1:djpBY2/2Cs1PV87GSJlxv4voajVOMZxqqtq9AB8YNvY= -oras.land/oras-go v1.2.4/go.mod h1:DYcGfb3YF1nKjcezfX2SNlDAeQFKSXmf+qrFmrh4324= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/kubectl v0.30.0 h1:xbPvzagbJ6RNYVMVuiHArC1grrV5vSmmIcSZuCdzRyk= +k8s.io/kubectl v0.30.0/go.mod h1:zgolRw2MQXLPwmic2l/+iHs239L49fhSeICuMhQQXTI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= +oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/helm/data_template.go b/helm/data_template.go index 19ace6eb17..542e123085 100644 --- a/helm/data_template.go +++ b/helm/data_template.go @@ -76,7 +76,7 @@ func dataTemplate() *schema.Resource { "pass_credentials": { Type: schema.TypeBool, Optional: true, - Description: "Pass credentials to all domains", + Description: "Pass credentials to all domains. Defaults to `false`.", }, "chart": { Type: schema.TypeString, @@ -196,20 +196,20 @@ func dataTemplate() *schema.Resource { Type: schema.TypeString, Optional: true, ForceNew: true, - Description: "Namespace to install the release into.", + Description: "Namespace to install the release into. Defaults to `default`.", DefaultFunc: schema.EnvDefaultFunc("HELM_NAMESPACE", "default"), }, "verify": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["verify"], - Description: "Verify the package before installing it.", + Description: "Verify the package before installing it.Defaults to `false`.", }, "keyring": { Type: schema.TypeString, Optional: true, Default: os.ExpandEnv("$HOME/.gnupg/pubring.gpg"), - Description: "Location of public keys used for verification. Used only if `verify` is true", + Description: "Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home`.", // Suppress changes of this attribute if `verify` is false DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return !d.Get("verify").(bool) @@ -219,73 +219,73 @@ func dataTemplate() *schema.Resource { Type: schema.TypeInt, Optional: true, Default: defaultAttributes["timeout"], - Description: "Time in seconds to wait for any individual kubernetes operation.", + Description: "Time in seconds to wait for any individual kubernetes operation. Defaults to `300` seconds.", }, "disable_webhooks": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["disable_webhooks"], - Description: "Prevent hooks from running.", + Description: "Prevent hooks from running.Defaults to `300` seconds.", }, "reuse_values": { Type: schema.TypeBool, Optional: true, - Description: "When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored", + Description: "When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`. ", Default: defaultAttributes["reuse_values"], }, "reset_values": { Type: schema.TypeBool, Optional: true, - Description: "When upgrading, reset the values to the ones built into the chart", + Description: "When upgrading, reset the values to the ones built into the chart.Defaults to `false`. ", Default: defaultAttributes["reset_values"], }, "atomic": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["atomic"], - Description: "If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used", + Description: "If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`.", }, "skip_crds": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["skip_crds"], - Description: "If set, no CRDs will be installed. By default, CRDs are installed if not already present", + Description: "If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`.", }, "skip_tests": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["skip_tests"], - Description: "If set, tests will not be rendered. By default, tests are rendered", + Description: "If set, tests will not be rendered. By default, tests are rendered. Defaults to `false`.", }, "render_subchart_notes": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["render_subchart_notes"], - Description: "If set, render subchart notes along with the parent", + Description: "If set, render subchart notes along with the parent. Defaults to `true`.", }, "disable_openapi_validation": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["disable_openapi_validation"], - Description: "If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema", + Description: "If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema.Defaults to `false`.", }, "wait": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["wait"], - Description: "Will wait until all resources are in a ready state before marking the release as successful.", + Description: "Will wait until all resources are in a ready state before marking the release as successful.Defaults to `true`.", }, "dependency_update": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["dependency_update"], - Description: "Run helm dependency update before installing the chart", + Description: "Run helm dependency update before installing the chart. Defaults to `false`.", }, "replace": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["replace"], - Description: "Re-use the given name, even if that name is already used. This is unsafe in production", + Description: "Re-use the given name, even if that name is already used. This is unsafe in production. Defaults to `false`.", }, "description": { Type: schema.TypeString, @@ -299,7 +299,7 @@ func dataTemplate() *schema.Resource { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["create_namespace"], - Description: "Create the namespace if it does not exist", + Description: "Create the namespace if it does not exist. Defaults to `false`.", }, "postrender": { Type: schema.TypeList, diff --git a/helm/provider.go b/helm/provider.go index 3662dbe248..fc8eeb47e4 100644 --- a/helm/provider.go +++ b/helm/provider.go @@ -156,8 +156,13 @@ func Provider() *schema.Provider { "helm_template": dataTemplate(), }, } - p.ConfigureContextFunc = func(ctx context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) { - return providerConfigure(d, p.TerraformVersion) + p.ConfigureProvider = func(ctx context.Context, req schema.ConfigureProviderRequest, res *schema.ConfigureProviderResponse) { + if req.DeferralAllowed && !req.ResourceData.GetRawConfig().IsWhollyKnown() { + res.Deferred = &schema.Deferred{ + Reason: schema.DeferredReasonProviderConfigUnknown, + } + } + res.Meta, res.Diagnostics = providerConfigure(req.ResourceData, p.TerraformVersion) } return p } diff --git a/helm/provider_test.go b/helm/provider_test.go index 0ed037afcc..3adb253a97 100644 --- a/helm/provider_test.go +++ b/helm/provider_test.go @@ -138,7 +138,7 @@ func buildChartRepository() { // package all the charts for _, c := range charts { - cmd := exec.Command("helm", "package", "-u", + cmd := exec.Command("helm", "--kubeconfig", os.Getenv("KUBE_CONFIG_PATH"), "package", "-u", filepath.Join(testChartsPath, c.Name()), "-d", testRepositoryDir) out, err := cmd.CombinedOutput() @@ -151,7 +151,7 @@ func buildChartRepository() { } // build the repository index - cmd := exec.Command("helm", "repo", "index", testRepositoryDir) + cmd := exec.Command("helm", "--kubeconfig", os.Getenv("KUBE_CONFIG_PATH"), "repo", "index", testRepositoryDir) out, err := cmd.CombinedOutput() if err != nil { log.Println(string(out)) diff --git a/helm/resource_release.go b/helm/resource_release.go index 80d1833acf..b34af611d3 100644 --- a/helm/resource_release.go +++ b/helm/resource_release.go @@ -110,7 +110,7 @@ func resourceRelease() *schema.Resource { "pass_credentials": { Type: schema.TypeBool, Optional: true, - Description: "Pass credentials to all domains", + Description: "Pass credentials to all domains. Defaults to `false`.", Default: defaultAttributes["pass_credentials"], }, "chart": { @@ -213,20 +213,20 @@ func resourceRelease() *schema.Resource { Type: schema.TypeString, Optional: true, ForceNew: true, - Description: "Namespace to install the release into.", + Description: "Namespace to install the release into. Defaults to `default`.", DefaultFunc: schema.EnvDefaultFunc("HELM_NAMESPACE", "default"), }, "verify": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["verify"], - Description: "Verify the package before installing it.", + Description: "Verify the package before installing it.Defaults to `false`.", }, "keyring": { Type: schema.TypeString, Optional: true, Default: os.ExpandEnv("$HOME/.gnupg/pubring.gpg"), - Description: "Location of public keys used for verification. Used only if `verify` is true", + Description: "Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home`.", // Suppress changes of this attribute if `verify` is false DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { return !d.Get("verify").(bool) @@ -236,13 +236,13 @@ func resourceRelease() *schema.Resource { Type: schema.TypeInt, Optional: true, Default: defaultAttributes["timeout"], - Description: "Time in seconds to wait for any individual kubernetes operation.", + Description: "Time in seconds to wait for any individual kubernetes operation. Defaults to 300 seconds.", }, "disable_webhooks": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["disable_webhooks"], - Description: "Prevent hooks from running.", + Description: "Prevent hooks from running.Defaults to `false`.", }, "disable_crd_hooks": { Type: schema.TypeBool, @@ -253,74 +253,74 @@ func resourceRelease() *schema.Resource { "reuse_values": { Type: schema.TypeBool, Optional: true, - Description: "When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored", + Description: "When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`.", Default: defaultAttributes["reuse_values"], }, "reset_values": { Type: schema.TypeBool, Optional: true, - Description: "When upgrading, reset the values to the ones built into the chart", + Description: "When upgrading, reset the values to the ones built into the chart. Defaults to `false`.", Default: defaultAttributes["reset_values"], }, "force_update": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["force_update"], - Description: "Force resource update through delete/recreate if needed.", + Description: "Force resource update through delete/recreate if needed. Defaults to `false`.", }, "recreate_pods": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["recreate_pods"], - Description: "Perform pods restart during upgrade/rollback", + Description: "Perform pods restart during upgrade/rollback. Defaults to `false`.", }, "cleanup_on_fail": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["cleanup_on_fail"], - Description: "Allow deletion of new resources created in this upgrade when upgrade fails", + Description: "Allow deletion of new resources created in this upgrade when upgrade fails. Defaults to `false`.", }, "max_history": { Type: schema.TypeInt, Optional: true, Default: defaultAttributes["max_history"], - Description: "Limit the maximum number of revisions saved per release. Use 0 for no limit", + Description: "Limit the maximum number of revisions saved per release. Use 0 for no limit. Defaults to 0 (no limit).", }, "atomic": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["atomic"], - Description: "If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used", + Description: "If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`.", }, "skip_crds": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["skip_crds"], - Description: "If set, no CRDs will be installed. By default, CRDs are installed if not already present", + Description: "If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`.", }, "render_subchart_notes": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["render_subchart_notes"], - Description: "If set, render subchart notes along with the parent", + Description: "If set, render subchart notes along with the parent. Defaults to `true`.", }, "disable_openapi_validation": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["disable_openapi_validation"], - Description: "If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema", + Description: "If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema. Defaults to `false`.", }, "wait": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["wait"], - Description: "Will wait until all resources are in a ready state before marking the release as successful.", + Description: "Will wait until all resources are in a ready state before marking the release as successful. Defaults to `true`.", }, "wait_for_jobs": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["wait_for_jobs"], - Description: "If wait is enabled, will wait until all Jobs have been completed before marking the release as successful.", + Description: "If wait is enabled, will wait until all Jobs have been completed before marking the release as successful. Defaults to `false``.", }, "status": { Type: schema.TypeString, @@ -331,13 +331,13 @@ func resourceRelease() *schema.Resource { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["dependency_update"], - Description: "Run helm dependency update before installing the chart", + Description: "Run helm dependency update before installing the chart. Defaults to `false`.", }, "replace": { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["replace"], - Description: "Re-use the given name, even if that name is already used. This is unsafe in production", + Description: "Re-use the given name, even if that name is already used. This is unsafe in production. Defaults to `false`.", }, "description": { Type: schema.TypeString, @@ -351,7 +351,7 @@ func resourceRelease() *schema.Resource { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["create_namespace"], - Description: "Create the namespace if it does not exist", + Description: "Create the namespace if it does not exist. Defaults to `false`.", }, "postrender": { Type: schema.TypeList, @@ -378,7 +378,7 @@ func resourceRelease() *schema.Resource { Type: schema.TypeBool, Optional: true, Default: defaultAttributes["lint"], - Description: "Run helm lint when planning", + Description: "Run helm lint when planning. Defaults to `false`.", }, "manifest": { Type: schema.TypeString, @@ -421,6 +421,21 @@ func resourceRelease() *schema.Resource { Computed: true, Description: "The version number of the application being deployed.", }, + "first_deployed": { + Type: schema.TypeInt, + Computed: true, + Description: "FirstDeployed is an int32 which represents timestamp when the release was first deployed.", + }, + "last_deployed": { + Type: schema.TypeInt, + Computed: true, + Description: "LastDeployed is an int32 which represents timestamp when the release was last deployed.", + }, + "notes": { + Type: schema.TypeString, + Computed: true, + Description: "Contains the rendered templates/NOTES.txt if available", + }, "values": { Type: schema.TypeString, Computed: true, @@ -1081,13 +1096,16 @@ func setReleaseAttributes(d *schema.ResourceData, r *release.Release, meta inter } return d.Set("metadata", []map[string]interface{}{{ - "name": r.Name, - "revision": r.Version, - "namespace": r.Namespace, - "chart": r.Chart.Metadata.Name, - "version": r.Chart.Metadata.Version, - "app_version": r.Chart.Metadata.AppVersion, - "values": values, + "name": r.Name, + "revision": r.Version, + "namespace": r.Namespace, + "chart": r.Chart.Metadata.Name, + "version": r.Chart.Metadata.Version, + "app_version": r.Chart.Metadata.AppVersion, + "first_deployed": r.Info.FirstDeployed.Time.Unix(), + "last_deployed": r.Info.LastDeployed.Time.Unix(), + "notes": r.Info.Notes, + "values": values, }}) } diff --git a/helm/resource_release_test.go b/helm/resource_release_test.go index babad0c4b1..966fc4b687 100644 --- a/helm/resource_release_test.go +++ b/helm/resource_release_test.go @@ -58,6 +58,9 @@ func TestAccResourceRelease_basic(t *testing.T) { resource.TestCheckResourceAttr("helm_release.test", "metadata.0.chart", "test-chart"), resource.TestCheckResourceAttr("helm_release.test", "metadata.0.version", "1.2.3"), resource.TestCheckResourceAttr("helm_release.test", "metadata.0.app_version", "1.19.5"), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.first_deployed", regexp.MustCompile("[0-9]+")), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.last_deployed", regexp.MustCompile("[0-9]+")), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.notes", regexp.MustCompile(`^1. Get the application URL by running these commands:\n export POD_NAME=.*`)), ), }, { @@ -99,6 +102,9 @@ func TestAccResourceRelease_emptyVersion(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "metadata.0.chart", "test-chart"), resource.TestCheckResourceAttr(resourceName, "metadata.0.version", "2.0.0"), resource.TestCheckResourceAttr(resourceName, "metadata.0.app_version", "1.19.5"), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.first_deployed", regexp.MustCompile("[0-9]+")), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.last_deployed", regexp.MustCompile("[0-9]+")), + resource.TestMatchResourceAttr("helm_release.test", "metadata.0.notes", regexp.MustCompile(`^1. Get the application URL by running these commands:\n export POD_NAME=.*`)), ), }, }, @@ -1504,7 +1510,7 @@ func TestAccResourceRelease_helm_repo_add(t *testing.T) { defer deleteNamespace(t, namespace) // add the repository with `helm repo add` - cmd := exec.Command("helm", "repo", "add", "hashicorp-test", testRepositoryURL) + cmd := exec.Command("helm", "--kubeconfig", os.Getenv("KUBE_CONFIG_PATH"), "repo", "add", "hashicorp-test", testRepositoryURL) out, err := cmd.CombinedOutput() t.Log(string(out)) if err != nil { @@ -1555,7 +1561,7 @@ func TestAccResourceRelease_delete_regression(t *testing.T) { { PreConfig: func() { // delete the release outside of terraform - cmd := exec.Command("helm", "delete", "--namespace", namespace, name) + cmd := exec.Command("helm", "--kubeconfig", os.Getenv("KUBE_CONFIG_PATH"), "delete", "--namespace", namespace, name) out, err := cmd.CombinedOutput() t.Log(string(out)) if err != nil { @@ -1572,7 +1578,7 @@ func TestAccResourceRelease_delete_regression(t *testing.T) { } func getReleaseJSONManifest(namespace, name string) (string, error) { - cmd := exec.Command("helm", "get", "manifest", "--namespace", namespace, name) + cmd := exec.Command("helm", "--kubeconfig", os.Getenv("KUBE_CONFIG_PATH"), "get", "manifest", "--namespace", namespace, name) manifest, err := cmd.Output() if err != nil { return "", err diff --git a/helm/structure_kubeconfig.go b/helm/structure_kubeconfig.go index 4ca241462b..6b245df542 100644 --- a/helm/structure_kubeconfig.go +++ b/helm/structure_kubeconfig.go @@ -62,7 +62,7 @@ func (k *KubeConfig) ToRESTMapper() (meta.RESTMapper, error) { } mapper := restmapper.NewDeferredDiscoveryRESTMapper(discoveryClient) - expander := restmapper.NewShortcutExpander(mapper, discoveryClient) + expander := restmapper.NewShortcutExpander(mapper, discoveryClient, nil) return expander, nil } diff --git a/helm/test-infra/gke/main.tf b/helm/test-infra/gke/main.tf index 17cbfde1a1..452a26a53b 100644 --- a/helm/test-infra/gke/main.tf +++ b/helm/test-infra/gke/main.tf @@ -32,23 +32,23 @@ variable "kube_config_dir" { } data "google_container_engine_versions" "supported" { - zone = "${data.google_compute_zones.available.names[0]}" - version_prefix = "${var.kubernetes_version}" + zone = data.google_compute_zones.available.names[0] + version_prefix = var.kubernetes_version } resource "google_container_cluster" "primary" { name = "tf-acc-test-${random_id.cluster_name.hex}" - zone = "${data.google_compute_zones.available.names[0]}" - initial_node_count = "${var.workers_count}" - min_master_version = "${data.google_container_engine_versions.supported.latest_master_version}" + zone = data.google_compute_zones.available.names[0] + initial_node_count = var.workers_count + min_master_version = data.google_container_engine_versions.supported.latest_master_version additional_zones = [ "${data.google_compute_zones.available.names[1]}", ] master_auth { - username = "${random_id.username.hex}" - password = "${random_id.password.hex}" + username = random_id.username.hex + password = random_id.password.hex } node_config { @@ -64,7 +64,7 @@ resource "google_container_cluster" "primary" { } resource "local_file" "kubeconfig" { - content = templatefile("${path.module}/kubeconfig-template.yaml",{ + content = templatefile("${path.module}/kubeconfig-template.yaml", { cluster_name = "${google_container_cluster.primary.name}" user_name = "${google_container_cluster.primary.master_auth.0.username}" user_password = "${google_container_cluster.primary.master_auth.0.password}" @@ -77,13 +77,13 @@ resource "local_file" "kubeconfig" { } output "google_zone" { - value = "${data.google_compute_zones.available.names[0]}" + value = data.google_compute_zones.available.names[0] } output "node_version" { - value = "${google_container_cluster.primary.node_version}" + value = google_container_cluster.primary.node_version } output "kubeconfig_path" { - value = "${local_file.kubeconfig.filename}" + value = local_file.kubeconfig.filename } diff --git a/helm/testing/config-da-basic/test.tf b/helm/testing/config-da-basic/test.tf new file mode 100644 index 0000000000..c82898f6d7 --- /dev/null +++ b/helm/testing/config-da-basic/test.tf @@ -0,0 +1,29 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + +terraform { + required_providers { + kind = { + source = "tehcyx/kind" + } + } +} + +resource "kind_cluster" "demo" { + name = "tfacc" +} + +provider "helm" { + kubernetes { + host = kind_cluster.demo.endpoint + cluster_ca_certificate = kind_cluster.demo.cluster_ca_certificate + client_certificate = kind_cluster.demo.client_certificate + client_key = kind_cluster.demo.client_key + } +} + +resource "helm_release" "test-release" { + name = "test-hello" + repository = "https://cloudecho.github.io/charts/" + chart = "hello" +} diff --git a/helm/testing/deferred_actions_test.go b/helm/testing/deferred_actions_test.go new file mode 100644 index 0000000000..88b78550b9 --- /dev/null +++ b/helm/testing/deferred_actions_test.go @@ -0,0 +1,85 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package testing + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-go/tfprotov5" + "github.com/hashicorp/terraform-plugin-testing/config" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/knownvalue" + "github.com/hashicorp/terraform-plugin-testing/plancheck" + "github.com/hashicorp/terraform-plugin-testing/statecheck" + "github.com/hashicorp/terraform-plugin-testing/tfjsonpath" + "github.com/hashicorp/terraform-plugin-testing/tfversion" + "github.com/hashicorp/terraform-provider-helm/helm" +) + +var providerFactory = map[string]func() (tfprotov5.ProviderServer, error){ + "helm": func() (tfprotov5.ProviderServer, error) { + return helm.Provider().GRPCProvider(), nil + }, +} + +func TestAccDeferredActions_basic(t *testing.T) { + resource.Test(t, resource.TestCase{ + TerraformVersionChecks: []tfversion.TerraformVersionCheck{ + tfversion.SkipBelow(tfversion.Version1_9_0), + }, + AdditionalCLIOptions: &resource.AdditionalCLIOptions{ + Plan: resource.PlanOptions{AllowDeferral: true}, + Apply: resource.ApplyOptions{AllowDeferral: true}, + }, + Steps: []resource.TestStep{ + { + ProtoV5ProviderFactories: providerFactory, + ConfigDirectory: func(tscr config.TestStepConfigRequest) string { + return "config-da-basic" + }, + ExpectNonEmptyPlan: true, + ConfigPlanChecks: resource.ConfigPlanChecks{ + PreApply: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction("kind_cluster.demo", plancheck.ResourceActionCreate), + plancheck.ExpectDeferredChange("helm_release.test-release", plancheck.DeferredReasonProviderConfigUnknown), + }, + PostApplyPostRefresh: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction("helm_release.test-release", plancheck.ResourceActionCreate), + }, + }, + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("endpoint"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("cluster_ca_certificate"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("client_certificate"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("client_key"), knownvalue.NotNull()), + }, + }, + { + ProtoV5ProviderFactories: providerFactory, + ConfigDirectory: func(tscr config.TestStepConfigRequest) string { + return "config-da-basic" + }, + ExpectNonEmptyPlan: false, + ConfigPlanChecks: resource.ConfigPlanChecks{ + PreApply: []plancheck.PlanCheck{ + plancheck.ExpectResourceAction("helm_release.test-release", plancheck.ResourceActionCreate), + }, + PostApplyPostRefresh: []plancheck.PlanCheck{ + plancheck.ExpectEmptyPlan(), + }, + }, + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("endpoint"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("cluster_ca_certificate"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("client_certificate"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("kind_cluster.demo", tfjsonpath.New("client_key"), knownvalue.NotNull()), + statecheck.ExpectKnownValue("helm_release.test-release", tfjsonpath.New("name"), knownvalue.StringExact("test-hello")), + statecheck.ExpectKnownValue("helm_release.test-release", tfjsonpath.New("chart"), knownvalue.StringExact("hello")), + statecheck.ExpectKnownValue("helm_release.test-release", tfjsonpath.New("repository"), knownvalue.StringExact("https://cloudecho.github.io/charts/")), + statecheck.ExpectKnownValue("helm_release.test-release", tfjsonpath.New("status"), knownvalue.StringExact("deployed")), + }, + }, + }, + }) +} diff --git a/scripts/get-version-matrix.sh b/scripts/get-version-matrix.sh index 686e2f023d..a567e7536a 100755 --- a/scripts/get-version-matrix.sh +++ b/scripts/get-version-matrix.sh @@ -9,4 +9,4 @@ function get_latest_version() { sort -V -r | head -1 } -echo "::set-output name=matrix::[$(get_latest_version v0.12), $(get_latest_version v0.13), $(get_latest_version v0.14), $(get_latest_version v0.15), $(get_latest_version v1.0), $(get_latest_version v1.3)]" +echo "::set-output name=matrix::[$(get_latest_version v0.12), $(get_latest_version v0.13), $(get_latest_version v0.14), $(get_latest_version v0.15), $(get_latest_version v1.0), $(get_latest_version v1.3), $(get_latest_version v1.5), $(get_latest_version v1.7), $(get_latest_version v1.9)]" diff --git a/scripts/markdown-link-check.sh b/scripts/markdown-link-check.sh index 89dc8a473f..1281fa3b62 100755 --- a/scripts/markdown-link-check.sh +++ b/scripts/markdown-link-check.sh @@ -35,7 +35,7 @@ ${DOCKER} run ${DOCKER_RUN_OPTS} --rm -t \ -w /github/workspace \ --entrypoint /usr/bin/find \ docker.io/robertbeal/markdown-link-checker \ - website \( -type f -name "*.md" -or -name "*.markdown" \) -exec markdown-link-check --config .markdownlinkcheck.json --quiet --verbose {} \; \ + docs/resources docs/data-sources \( -type f -name "*.md" -or -name "*.markdown" \) -exec markdown-link-check --config .markdownlinkcheck.json --quiet --verbose {} \; \ | tee -a "${output_file}" touch "${error_file}" diff --git a/templates/data-sources/template.md.tmpl b/templates/data-sources/template.md.tmpl new file mode 100644 index 0000000000..9a6e2c3632 --- /dev/null +++ b/templates/data-sources/template.md.tmpl @@ -0,0 +1,31 @@ +--- +page_title: "helm: helm_template" +sidebar_current: "docs-helm-template" +description: |- + +--- +# Data Source: {{ .Name }} + +Render chart templates locally. + +`helm_template` renders chart templates locally and exposes the rendered manifests in the data source attributes. `helm_template` mimics the functionality of the `helm template` command. + +The arguments aim to be identical to the `helm_release` resource. + +For further details on the `helm template` command, refer to the [Helm documentation](https://helm.sh/docs/helm/helm_template/). + +{{ .SchemaMarkdown }} + +## Example Usage + +### Render all chart templates + +The following example renders all templates of the `mariadb` chart of the official Helm stable repository. Concatenated manifests are exposed as output variable `mariadb_instance_manifest`. + +{{tffile "examples/data-sources/template/example_1.tf"}} + +### Render selected chart templates + +The following example renders only the templates `master-statefulset.yaml` and `master-svc.yaml` of the `mariadb` chart of the official Helm stable repository. + +{{tffile "examples/data-sources/template/example_2.tf"}} diff --git a/templates/guides/v2-upgrade-guide.md b/templates/guides/v2-upgrade-guide.md new file mode 100644 index 0000000000..2065c02647 --- /dev/null +++ b/templates/guides/v2-upgrade-guide.md @@ -0,0 +1,72 @@ +--- +layout: "helm" +page_title: "Helm: Upgrade Guide for Helm Provider v2.0.0" +description: |- + This guide covers the changes introduced in v2.0.0 of the Helm provider and what you may need to do to upgrade your configuration. +--- + +# Upgrading to v2.0.0 of the Helm provider + +This guide covers the changes introduced in v2.0.0 of the Helm provider and what you may need to do to upgrade your configuration. + +## Changes in v2.0.0 + +### Changes to Kubernetes credentials supplied in the provider block + +We have made several changes to the way access to Kubernetes is configured in the provider block. + +1. The `load_config_file` attribute has been removed. +2. Support for the `KUBECONFIG` environment variable has been dropped and replaced with `KUBE_CONFIG_PATH`. +3. The `config_path` attribute will no longer default to `~/.kube/config` and must be set explicitly. + +The above changes have been made to encourage the best practise of configuring access to Kubernetes in the provider block explicitly, instead of relying upon default paths or `KUBECONFIG` being set. We have done this because allowing the provider to configure its access to Kubernetes implicitly caused confusion with a subset of our users. It also created risk for users who use Terraform to manage multiple clusters. Requiring explicit configuring for kubernetes in the provider block eliminates the possibility that the configuration will be applied to the wrong cluster. + +You will therefore need to explicity configure access to your Kubernetes cluster in the provider block going forward. For many users this will simply mean specifying the `config_path` attribute in the provider block. Users already explicitly configuring the provider should not be affected by this change, but will need to remove the `load_config_file` attribute if they are currently using it. + +When running Terraform inside a Kubernetes cluster no provider configuration is neccessary, as the provider will detect that is has access to a service account token. + +### Removal of the `helm_repository` data source + +This feature of the provider caused a fair bit of confusion and was a source of instability as data sources are not supposed to be stateful. This data source performed a stateful operation that modified the filesystem, mirroring similar functionality to the `helm repo add` command. It has been the recommendation for some time to configure repository information explicity at the `helm_resource` level and so the data source has been removed. See the example below. + +```hcl +resource "helm_release" "redis" { + name = "redis" + + repository = "https://charts.bitnami.com/bitnami" + chart = "redis" +} +``` + +The provider will continue to work with repositories that are configured with `helm repo add` before Terraform is run. + +### Removal of `set_string` in the `helm_release` resource + +The addition of a `type` attribute to the `set` block has rendered `set_string` superfluous so it has been removed. See the example below on how to set a string using the `set` block. This is used when the type of a value is an ambigious (e.g strings containing only numbers, true, false) and we want it to be explicitly parsed as a string. + +```hcl +resource "helm_release" "redis" { + name = "redis" + + repository = "https://charts.bitnami.com/bitnami" + chart = "redis" + + set { + name = "test.value" + value = "123456" + type = "string" + } +} +``` + +### Dropped support for Terraform 0.11 + +All builds of the Helm provider going forward will no longer work with Terraform 0.11. See [Upgrade Guides](https://www.terraform.io/upgrade-guides/index.html) for how to migrate your configurations to a newer version of Terraform. + +### Upgrade to v2 of the Terraform Plugin SDK + +Contributors to the provider will be interested to know this upgrade has brought the latest version of the [Terraform Plugin SDK](https://github.com/hashicorp/terraform-plugin-sdk) which introduced a number of enhancements to the developer experience. Details of the changes introduced can be found under [Extending Terraform](https://www.terraform.io/docs/extend/guides/v2-upgrade-guide.html). + +## Helm 2 + +We removed support in the provider for Helm 2 earlier this year. In accordance with the [Helm v2 deprecation timeline](https://helm.sh/blog/helm-v2-deprecation-timeline/) we will no longer be accepting PRs or handling issues that relate to Helm 2 going forward. diff --git a/templates/index.md.tmpl b/templates/index.md.tmpl new file mode 100644 index 0000000000..2bad79b74d --- /dev/null +++ b/templates/index.md.tmpl @@ -0,0 +1,126 @@ +--- +page_title: "Provider: Helm" +sidebar_current: "docs-helm-index" +description: |- + The Helm provider is used to deploy software packages in Kubernetes. The provider needs to be configured with the proper credentials before it can be used. +--- + +{{/* This template serves as a starting point for documentation generation, and can be customized with hardcoded values and/or doc gen templates. + +For example, the {{ .SchemaMarkdown }} template can be used to replace manual schema documentation if descriptions of schema attributes are added in the provider source code. */ -}} + +# Helm Provider + +The Helm provider is used to deploy software packages in Kubernetes. The provider needs to be configured with the proper credentials before it can be used. + +Try the [hands-on tutorial](https://learn.hashicorp.com/tutorials/terraform/helm-provider?in=terraform/kubernetes) on the Helm provider on the HashiCorp Learn site. + +## Resources + +* [Resource: helm_release](r/release.md) + +## Data Sources + +* [Data Source: helm_template](d/template.html) + +## Example Usage + +{{tffile "examples/example_1.tf"}} + +## Requirements + +~> NOTE: The provider does not use the `KUBECONFIG` environment variable by default. See the attribute reference below for the environment variables that map to provider block attributes. + +- You must have a Kubernetes cluster available. We support version 1.14.0 or higher. + +## Authentication + +The Helm provider can get its configuration in two ways: + +1. *Explicitly* by supplying attributes to the provider block. This includes: + * [Using a kubeconfig file](#file-config) + * [Supplying credentials](#credentials-config) + * [Exec plugins](#exec-plugins) +2. *Implicitly* through environment variables. This includes: + * [Using the in-cluster config](#in-cluster-config) + +For a full list of supported provider authentication arguments and their corresponding environment variables, see the [argument reference](#argument-reference) below. + +### File config + +The easiest way is to supply a path to your kubeconfig file using the `config_path` attribute or using the `KUBE_CONFIG_PATH` environment variable. A kubeconfig file may have multiple contexts. If `config_context` is not specified, the provider will use the `default` context. + +{{tffile "examples/example_2.tf"}} + +The provider also supports multiple paths in the same way that kubectl does using the `config_paths` attribute or `KUBE_CONFIG_PATHS` environment variable. + +{{tffile "examples/example_3.tf"}} + +### Credentials config + +You can also configure the host, basic auth credentials, and client certificate authentication explicitly or through environment variables. + +{{tffile "examples/example_4.tf"}} + +### In-cluster Config + +The provider uses the `KUBERNETES_SERVICE_HOST` and `KUBERNETES_SERVICE_PORT` environment variables to detect when it is running inside a cluster, so in this case you do not need to specify any attributes in the provider block if you want to connect to the local kubernetes cluster. + +If you want to connect to a different cluster than the one terraform is running inside, configure the provider as [above](#credentials-config). + +## Exec plugins + +Some cloud providers have short-lived authentication tokens that can expire relatively quickly. To ensure the Kubernetes provider is receiving valid credentials, an exec-based plugin can be used to fetch a new token before initializing the provider. For example, on EKS, the command `eks get-token` can be used: + +{{tffile "examples/example_5.tf"}} + +For example, to [authenticate with GKE](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/using_gke_with_terraform#using-the-kubernetes-and-helm-providers), the `gke-cloud-auth-plugin` can be used: + +{{tffile "examples/example_6.tf"}} + +## Argument Reference + +The following arguments are supported: + +* `debug` - (Optional) - Debug indicates whether or not Helm is running in Debug mode. Defaults to `false`. +* `plugins_path` - (Optional) The path to the plugins directory. Defaults to `HELM_PLUGINS` env if it is set, otherwise uses the default path set by helm. +* `registry_config_path` - (Optional) The path to the registry config file. Defaults to `HELM_REGISTRY_CONFIG` env if it is set, otherwise uses the default path set by helm. +* `repository_config_path` - (Optional) The path to the file containing repository names and URLs. Defaults to `HELM_REPOSITORY_CONFIG` env if it is set, otherwise uses the default path set by helm. +* `repository_cache` - (Optional) The path to the file containing cached repository indexes. Defaults to `HELM_REPOSITORY_CACHE` env if it is set, otherwise uses the default path set by helm. +* `helm_driver` - (Optional) "The backend storage driver. Valid values are: `configmap`, `secret`, `memory`, `sql`. Defaults to `secret`. Note: Regarding the sql driver, as of helm v3.2.0 SQL support exists only for the postgres dialect. The connection string can be configured by setting the `HELM_DRIVER_SQL_CONNECTION_STRING` environment variable e.g. `HELM_DRIVER_SQL_CONNECTION_STRING=postgres://username:password@host/dbname` more info [here](https://pkg.go.dev/github.com/lib/pq). +* `burst_limit` - (Optional) The helm burst limit to use. Set this value higher if your cluster has many CRDs. Default: `100` +* `kubernetes` - Kubernetes configuration block. +* `registry` - Private OCI registry configuration block. Can be specified multiple times. + +The `kubernetes` block supports: + +* `config_path` - (Optional) Path to the kube config file. Can be sourced from `KUBE_CONFIG_PATH`. +* `config_paths` - (Optional) A list of paths to the kube config files. Can be sourced from `KUBE_CONFIG_PATHS`. +* `host` - (Optional) The hostname (in form of URI) of the Kubernetes API. Can be sourced from `KUBE_HOST`. +* `username` - (Optional) The username to use for HTTP basic authentication when accessing the Kubernetes API. Can be sourced from `KUBE_USER`. +* `password` - (Optional) The password to use for HTTP basic authentication when accessing the Kubernetes API. Can be sourced from `KUBE_PASSWORD`. +* `token` - (Optional) The bearer token to use for authentication when accessing the Kubernetes API. Can be sourced from `KUBE_TOKEN`. +* `insecure` - (Optional) Whether server should be accessed without verifying the TLS certificate. Can be sourced from `KUBE_INSECURE`. +* `tls_server_name` - (Optional) Server name passed to the server for SNI and is used in the client to check server certificates against. Can be sourced from `KUBE_TLS_SERVER_NAME`. +* `client_certificate` - (Optional) PEM-encoded client certificate for TLS authentication. Can be sourced from `KUBE_CLIENT_CERT_DATA`. +* `client_key` - (Optional) PEM-encoded client certificate key for TLS authentication. Can be sourced from `KUBE_CLIENT_KEY_DATA`. +* `cluster_ca_certificate` - (Optional) PEM-encoded root certificates bundle for TLS authentication. Can be sourced from `KUBE_CLUSTER_CA_CERT_DATA`. +* `config_context` - (Optional) Context to choose from the config file. Can be sourced from `KUBE_CTX`. +* `proxy_url` - (Optional) URL to the proxy to be used for all API requests. URLs with "http", "https", and "socks5" schemes are supported. Can be sourced from `KUBE_PROXY_URL`. +* `exec` - (Optional) Configuration block to use an [exec-based credential plugin](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins), e.g. call an external command to receive user credentials. + * `api_version` - (Required) API version to use when decoding the ExecCredentials resource, e.g. `client.authentication.k8s.io/v1beta1`. + * `command` - (Required) Command to execute. + * `args` - (Optional) List of arguments to pass when executing the plugin. + * `env` - (Optional) Map of environment variables to set when executing the plugin. + +The `registry` block has options: + +* `url` - (Required) url to the registry in format `oci://host:port` +* `username` - (Required) username to registry +* `password` - (Required) password to registry + +## Experiments + +The provider takes an `experiments` block that allows you enable experimental features by setting them to `true`. + +* `manifest` - Enable storing of the rendered manifest for `helm_release` so the full diff of what is changing can been seen in the plan. diff --git a/templates/resources/release.md.tmpl b/templates/resources/release.md.tmpl new file mode 100644 index 0000000000..8eba1608f1 --- /dev/null +++ b/templates/resources/release.md.tmpl @@ -0,0 +1,83 @@ +--- +page_title: "helm: helm_release" +sidebar_current: "docs-helm-release" +description: |- + +--- +# Resource: {{ .Name }} + +A Release is an instance of a chart running in a Kubernetes cluster. + +A Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster. + +`helm_release` describes the desired status of a chart in a kubernetes cluster. + +{{ .SchemaMarkdown }} + + +## Example Usage - Chart Repository + +{{tffile "examples/resources/release/example_1.tf"}} + +## Example Usage - Local Chart + +In case a Chart is not available from a repository, a path may be used: + +{{tffile "examples/resources/release/example_2.tf"}} + +## Example Usage - Chart URL + +An absolute URL to the .tgz of the Chart may also be used: + +{{tffile "examples/resources/release/example_3.tf"}} + +## Example Usage - Chart Repository configured from OCI Registry + +Provider supports grabbing charts from an OCI repository: + +{{tffile "examples/resources/release/example_4.tf"}} + +## Example Usage - Chart Repository configured using GCS/S3 + +The provider also supports helm plugins such as GCS and S3 that add S3/GCS helm repositories by using `helm plugin install` + +{{tffile "examples/resources/release/example_5.tf"}} + +{{tffile "examples/resources/release/example_6.tf"}} + +## Example Usage - Chart Repository configured outside of Terraform + +The provider also supports repositories that are added to the local machine outside of Terraform by running `helm repo add` + +{{tffile "examples/resources/release/example_7.tf"}} + +The `set`, `set_list`, and `set_sensitive` blocks support: + +* `name` - (Required) full name of the variable to be set. +* `value` - (Required) value of the variable to be set. +* `type` - (Optional) type of the variable to be set. Valid options are `auto` and `string`. + +Since Terraform Utilizes HCL as well as Helm using the Helm Template Language, it's necessary to escape the `{}`, `[]`, `.`, and `,` characters twice in order for it to be parsed. `name` should also be set to the `value path`, and `value` is the desired value that will be set. + +{{tffile "examples/resources/release/example_8.tf"}} + +{{tffile "examples/resources/release/example_9.tf"}} + +{{tffile "examples/resources/release/example_10.tf"}} + +{{tffile "examples/resources/release/example_11.tf"}} + +The `postrender` block supports two attributes: + +* `binary_path` - (Required) relative or full path to command binary. +* `args` - (Optional) a list of arguments to supply to the post-renderer. + +## Import + +A Helm Release resource can be imported using its namespace and name e.g. + +```shell +$ terraform import helm_release.example default/example-name +``` + +~> **NOTE:** Since the `repository` attribute is not being persisted as metadata by helm, it will not be set to any value by default. All other provider specific attributes will be set to their default values and they can be overriden after running `apply` using the resource definition configuration. diff --git a/website/docs/d/template.html.markdown b/website/docs/d/template.html.markdown deleted file mode 100644 index d7ed9d1ca5..0000000000 --- a/website/docs/d/template.html.markdown +++ /dev/null @@ -1,168 +0,0 @@ ---- -layout: "helm" -page_title: "helm: helm_template" -sidebar_current: "docs-helm-template" -description: |- - ---- - -# Data Source: helm_template - -Render chart templates locally. - -`helm_template` renders chart templates locally and exposes the rendered manifests in the data source attributes. `helm_template` mimics the functionality of the `helm template` command. - -The arguments aim to be identical to the `helm_release` resource. - -For further details on the `helm template` command, refer to the [Helm documentation](https://helm.sh/docs/helm/helm_template/). - -## Example Usage - -### Render all chart templates - -The following example renders all templates of the `mariadb` chart of the official Helm stable repository. Concatenated manifests are exposed as output variable `mariadb_instance_manifest`. - -```hcl -data "helm_template" "mariadb_instance" { - name = "mariadb-instance" - namespace = "default" - repository = "https://charts.helm.sh/stable" - - chart = "mariadb" - version = "7.1.0" - - set { - name = "service.port" - value = "13306" - } - - set_sensitive { - name = "rootUser.password" - value = "s3cr3t!" - } -} - -resource "local_file" "mariadb_manifests" { - for_each = data.helm_template.mariadb_instance.manifests - - filename = "./${each.key}" - content = each.value -} - -output "mariadb_instance_manifest" { - value = data.helm_template.mariadb_instance.manifest -} - -output "mariadb_instance_manifests" { - value = data.helm_template.mariadb_instance.manifests -} - -output "mariadb_instance_notes" { - value = data.helm_template.mariadb_instance.notes -} -``` - -### Render selected chart templates - -The following example renders only the templates `master-statefulset.yaml` and `master-svc.yaml` of the `mariadb` chart of the official Helm stable repository. - -```hcl -data "helm_template" "mariadb_instance" { - name = "mariadb-instance" - namespace = "default" - repository = "https://charts.helm.sh/stable" - - chart = "mariadb" - version = "7.1.0" - - show_only = [ - "templates/master-statefulset.yaml", - "templates/master-svc.yaml", - ] - - set { - name = "service.port" - value = "13306" - } - - set_sensitive { - name = "rootUser.password" - value = "s3cr3t!" - } -} - -resource "local_file" "mariadb_manifests" { - for_each = data.helm_template.mariadb_instance.manifests - - filename = "./${each.key}" - content = each.value -} - -output "mariadb_instance_manifest" { - value = data.helm_template.mariadb_instance.manifest -} - -output "mariadb_instance_manifests" { - value = data.helm_template.mariadb_instance.manifests -} - -output "mariadb_instance_notes" { - value = data.helm_template.mariadb_instance.notes -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Release name. -* `chart` - (Required) Chart name to be rendered. The chart name can be local path, a URL to a chart, or the name of the chart if `repository` is specified. It is also possible to use the `/` format here if you are running Terraform on a system that the repository has been added to with `helm repo add` but this is not recommended. -* `repository` - (Optional) Repository URL where to locate the requested chart. -* `repository_key_file` - (Optional) The repositories cert key file -* `repository_cert_file` - (Optional) The repositories cert file -* `repository_ca_file` - (Optional) The Repositories CA File. -* `repository_username` - (Optional) Username for HTTP basic authentication against the repository. -* `repository_password` - (Optional) Password for HTTP basic authentication against the repository. -* `devel` - (Optional) Use chart development versions, too. Equivalent to version '>0.0.0-0'. If version is set, this is ignored. -* `version` - (Optional) Specify the exact chart version to install. If this is not specified, the latest version is installed. `helm_release` will not automatically grab the latest release, version must explicitly upgraded when upgrading an installed chart. -* `namespace` - (Optional) The namespace to install the release into. Defaults to `default`. -* `verify` - (Optional) Verify the package before installing it. Helm uses a provenance file to verify the integrity of the chart; this must be hosted alongside the chart. For more information see the [Helm Documentation](https://helm.sh/docs/topics/provenance/). Defaults to `false`. -* `keyring` - (Optional) Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home` -* `timeout` - (Optional) Time in seconds to wait for any individual kubernetes operation (like Jobs for hooks). Defaults to `300` seconds. -* `disable_webhooks` - (Optional) Prevent hooks from running. Defaults to `false`. -* `reuse_values` - (Optional) When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`. -* `reset_values` - (Optional) When upgrading, reset the values to the ones built into the chart. Defaults to `false`. -* `atomic` - (Optional) If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`. -* `skip_crds` - (Optional) If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`. -* `skip_tests` - (Optional) If set, tests will not be rendered. By default, tests are rendered. Defaults to `false`. -* `render_subchart_notes` - (Optional) If set, render subchart notes along with the parent. Defaults to `true`. -* `disable_openapi_validation` - (Optional) If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema. Defaults to `false`. -* `wait` - (Optional) Will wait until all resources are in a ready state before marking the release as successful. It will wait for as long as `timeout`. Defaults to `true`. -* `values` - (Optional) List of values in raw yaml to pass to helm. Values will be merged, in order, as Helm does with multiple `-f` options. -* `set` - (Optional) Value block with custom values to be merged with the values yaml. -* `set_list` - (Optional) Value block with list of custom values to be merged with the values yaml. -* `set_sensitive` - (Optional) Value block with custom sensitive values to be merged with the values yaml that won't be exposed in the plan's diff. -* `set_string` - (Optional) Value block with custom STRING values to be merged with the values yaml. -* `dependency_update` - (Optional) Runs helm dependency update before installing the chart. Defaults to `false`. -* `replace` - (Optional) Re-use the given name, even if that name is already used. This is unsafe in production. Defaults to `false`. -* `description` - (Optional) Set release description attribute (visible in the history). -* `postrender` - (Optional) Configure a command to run after helm renders the manifest which can alter the manifest contents. -* `create_namespace` - (Optional) Create the namespace if it does not yet exist. Defaults to `false`. - -The following attributes are specific to the `helm_template` data source and not available in the `helm_release` resource: - -* `api_versions` - (Optional) List of Kubernetes api versions used for Capabilities.APIVersions. -* `include_crds` - (Optional) Include CRDs in the templated output. Defaults to `false`. -* `is_upgrade` - (Optional) Set .Release.IsUpgrade instead of .Release.IsInstall. Defaults to `false`. -* `show_only` - (Optional) Explicit list of chart templates to render, as Helm does with the `-s` or `--show-only` option. Paths to chart templates are relative to the root folder of the chart, e.g. `templates/deployment.yaml`. If not provided, all templates of the chart are rendered. -* `validate` - (Optional) Validate your manifests against the Kubernetes cluster you are currently pointing at. This is the same validation performed on an install. Defaults to `false`. -* `kube_version` - (Optional) Allows specifying a custom kubernetes version to use when templating. - -## Attributes Reference - -In addition to the arguments listed above, the following computed attributes are exported: - -* `manifests` - Map of rendered chart templates indexed by the template name. -* `crds` - List of CRDs in the chart. Is empty unless `include_crds` is set to `true`. -* `manifest` - Concatenated rendered chart templates. This corresponds to the output of the `helm template` command. -* `notes` - Rendered notes if the chart contains a `NOTES.txt`. diff --git a/website/docs/r/release.html.markdown b/website/docs/r/release.html.markdown deleted file mode 100644 index 3603fc2547..0000000000 --- a/website/docs/r/release.html.markdown +++ /dev/null @@ -1,284 +0,0 @@ ---- -layout: "helm" -page_title: "helm: helm_release" -sidebar_current: "docs-helm-release" -description: |- - ---- - -# Resource: helm_release - -A Release is an instance of a chart running in a Kubernetes cluster. - -A Chart is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster. - -`helm_release` describes the desired status of a chart in a kubernetes cluster. - -## Example Usage - Chart Repository - -```hcl -resource "helm_release" "example" { - name = "my-redis-release" - repository = "https://charts.bitnami.com/bitnami" - chart = "redis" - version = "6.0.1" - - values = [ - "${file("values.yaml")}" - ] - - set { - name = "cluster.enabled" - value = "true" - } - - set { - name = "metrics.enabled" - value = "true" - } - - set { - name = "service.annotations.prometheus\\.io/port" - value = "9127" - type = "string" - } -} -``` - -## Example Usage - Local Chart - -In case a Chart is not available from a repository, a path may be used: - -```hcl -resource "helm_release" "example" { - name = "my-local-chart" - chart = "./charts/example" -} -``` - -## Example Usage - Chart URL - -An absolute URL to the .tgz of the Chart may also be used: - -```hcl -resource "helm_release" "example" { - name = "redis" - chart = "https://charts.bitnami.com/bitnami/redis-10.7.16.tgz" -} -``` - -## Example Usage - Chart Repository configured from OCI Registry - -Provider supports grabbing charts from an OCI repository: - -```hcl - -provider "helm" { - kubernetes { - config_path = "~/.kube/config" - } - - # localhost registry with password protection - registry { - url = "oci://localhost:5000" - username = "username" - password = "password" - } -} - -resource "helm_release" "example" { - name = "testchart" - namespace = "helm_registry" - repository = "oci://localhost:5000/helm-charts" - version = "1.2.3" - chart = "test-chart" -} -``` - -## Example Usage - Chart Repository configured using GCS/S3 - -The provider also supports helm plugins such as GCS and S3 that add S3/GCS helm repositories by using `helm plugin install` - -```hcl - -# Install GCS plugin -`helm plugin install https://github.com/hayorov/helm-gcs.git` - -# Run follow commands to setup GCS repository - -# Init a new repository: -# helm gcs init gs://bucket/path - -# Add your repository to Helm: -# helm repo add repo-name gs://bucket/path - -# Push a chart to your repository: -# helm gcs push chart.tar.gz repo-name - -# Update Helm cache: -# helm repo update - -# Get your chart: - -resource "helm_release" "GCS" { - name = "GCS" - repository = "gs://tf-test-helm-repo/charts" - chart = "chart" -} -``` - -```hcl - -# Install AWS S3 plugin -`helm plugin install https://github.com/hypnoglow/helm-s3.git` - -# Run follow commands to setup S3 repository - -# Init a new repository: -# helm s3 init s3://my-helm-charts/stable/myapp - -# Add your repository to Helm: -# helm repo add stable-myapp s3://my-helm-charts/stable/myapp/ - -# Push a chart to your repository: -# helm s3 push chart.tar.gz repo-name - -# Update Helm cache: -# helm repo update - -# Get your chart: - -resource "helm_release" "S3" { - name = "S3" - repository = "s3://tf-test-helm-repo/charts" - chart = "chart" -} -``` - -## Example Usage - Chart Repository configured outside of Terraform - -The provider also supports repositories that are added to the local machine outside of Terraform by running `helm repo add` - -```hcl - -# run this first: `helm repo add bitnami https://charts.bitnami.com/bitnami` - -resource "helm_release" "example" { - name = "redis" - chart = "bitnami/redis" -} -``` - -## Argument Reference - -The following arguments are supported: - -* `name` - (Required) Release name. The length must not be longer than 53 characters. -* `chart` - (Required) Chart name to be installed. The chart name can be local path, a URL to a chart, or the name of the chart if `repository` is specified. It is also possible to use the `/` format here if you are running Terraform on a system that the repository has been added to with `helm repo add` but this is not recommended. -* `repository` - (Optional) Repository URL where to locate the requested chart. -* `repository_key_file` - (Optional) The repositories cert key file -* `repository_cert_file` - (Optional) The repositories cert file -* `repository_ca_file` - (Optional) The Repositories CA File. -* `repository_username` - (Optional) Username for HTTP basic authentication against the repository. -* `repository_password` - (Optional) Password for HTTP basic authentication against the repository. -* `devel` - (Optional) Use chart development versions, too. Equivalent to version '>0.0.0-0'. If version is set, this is ignored. -* `version` - (Optional) Specify the exact chart version to install. If this is not specified, the latest version is installed. `helm_release` will not automatically grab the latest release, version must explicitly upgraded when upgrading an installed chart. -* `namespace` - (Optional) The namespace to install the release into. Defaults to `default`. -* `verify` - (Optional) Verify the package before installing it. Helm uses a provenance file to verify the integrity of the chart; this must be hosted alongside the chart. For more information see the [Helm Documentation](https://helm.sh/docs/topics/provenance/). Defaults to `false`. -* `keyring` - (Optional) Location of public keys used for verification. Used only if `verify` is true. Defaults to `/.gnupg/pubring.gpg` in the location set by `home` -* `timeout` - (Optional) Time in seconds to wait for any individual kubernetes operation (like Jobs for hooks). Defaults to `300` seconds. -* `disable_webhooks` - (Optional) Prevent hooks from running. Defaults to `false`. -* `reuse_values` - (Optional) When upgrading, reuse the last release's values and merge in any overrides. If 'reset_values' is specified, this is ignored. Defaults to `false`. -* `reset_values` - (Optional) When upgrading, reset the values to the ones built into the chart. Defaults to `false`. -* `force_update` - (Optional) Force resource update through delete/recreate if needed. Defaults to `false`. -* `recreate_pods` - (Optional) Perform pods restart during upgrade/rollback. Defaults to `false`. -* `cleanup_on_fail` - (Optional) Allow deletion of new resources created in this upgrade when upgrade fails. Defaults to `false`. -* `max_history` - (Optional) Maximum number of release versions stored per release. Defaults to `0` (no limit). -* `atomic` - (Optional) If set, installation process purges chart on fail. The wait flag will be set automatically if atomic is used. Defaults to `false`. -* `skip_crds` - (Optional) If set, no CRDs will be installed. By default, CRDs are installed if not already present. Defaults to `false`. -* `render_subchart_notes` - (Optional) If set, render subchart notes along with the parent. Defaults to `true`. -* `disable_openapi_validation` - (Optional) If set, the installation process will not validate rendered templates against the Kubernetes OpenAPI Schema. Defaults to `false`. -* `wait` - (Optional) Will wait until all resources are in a ready state before marking the release as successful. It will wait for as long as `timeout`. Defaults to `true`. -* `wait_for_jobs` - (Optional) If wait is enabled, will wait until all Jobs have been completed before marking the release as successful. It will wait for as long as `timeout`. Defaults to false. - -* `values` - (Optional) List of values in raw yaml to pass to helm. Values will be merged, in order, as Helm does with multiple `-f` options. -* `set` - (Optional) Value block with custom values to be merged with the values yaml. -* `set_list` - (Optional) Value block with list of custom values to be merged with the values yaml. -* `set_sensitive` - (Optional) Value block with custom sensitive values to be merged with the values yaml that won't be exposed in the plan's diff. -* `dependency_update` - (Optional) Runs helm dependency update before installing the chart. Defaults to `false`. -* `replace` - (Optional) Re-use the given name, only if that name is a deleted release which remains in the history. This is unsafe in production. Defaults to `false`. -* `description` - (Optional) Set release description attribute (visible in the history). -* `postrender` - (Optional) Configure a command to run after helm renders the manifest which can alter the manifest contents. -* `pass_credentials` - (Optional) Pass credentials to all domains. Defaults to `false`. -* `lint` - (Optional) Run the helm chart linter during the plan. Defaults to `false`. -* `create_namespace` - (Optional) Create the namespace if it does not yet exist. Defaults to `false`. - -The `set`, `set_list`, and `set_sensitive` blocks support: - -* `name` - (Required) full name of the variable to be set. -* `value` - (Required) value of the variable to be set. -* `type` - (Optional) type of the variable to be set. Valid options are `auto` and `string`. - -Since Terraform Utilizes HCL as well as Helm using the Helm Template Language, it's necessary to escape the `{}`, `[]`, `.`, and `,` characters twice in order for it to be parsed. `name` should also be set to the `value path`, and `value` is the desired value that will be set. - -```hcl -set { - name = "grafana.ingress.annotations.alb\\.ingress\\.kubernetes\\.io/group\\.name" - value = "shared-ingress" -} -``` - -```hcl -set_list { - name = "hashicorp" - value = ["terraform", "nomad", "vault"] -} -``` - -```hcl -controller: - pod: - annotations: - status.kubernetes.io/restart-on-failure: {"timeout": "30s"} -``` - -```hcl -set { - name = "controller.pod.annotations.status\\.kubernetes\\.io/restart-on-failure" - value = "\\{\"timeout\": \"30s\"\\}" -} -``` - -The `postrender` block supports two attributes: - -* `binary_path` - (Required) relative or full path to command binary. -* `args` - (Optional) a list of arguments to supply to the post-renderer. - -## Attributes Reference - -In addition to the arguments listed above, the following computed attributes are -exported: - -* `manifest` - The rendered manifest of the release as JSON. Enable the `manifest` experiment to use this feature. -* `metadata` - Block status of the deployed release. -* `status` - Status of the release. - -The `metadata` block supports: - -* `chart` - The name of the chart. -* `name` - Name is the name of the release. -* `namespace` - Namespace is the kubernetes namespace of the release. -* `revision` - Version is an int32 which represents the version of the release. -* `version` - A SemVer 2 conformant version string of the chart. -* `app_version` - The version number of the application being deployed. -* `values` - The compounded values from `values` and `set*` attributes. - -## Import - -A Helm Release resource can be imported using its namespace and name e.g. - -```shell -$ terraform import helm_release.example default/example-name -``` - -~> **NOTE:** Since the `repository` attribute is not being persisted as metadata by helm, it will not be set to any value by default. All other provider specific attributes will be set to their default values and they can be overriden after running `apply` using the resource definition configuration. diff --git a/website/helm.erb b/website/helm.erb deleted file mode 100644 index 3ce9b2ac04..0000000000 --- a/website/helm.erb +++ /dev/null @@ -1,36 +0,0 @@ -<% wrap_layout :inner do %> - <% content_for :sidebar do %> - - <% end %> - - <%= yield %> -<% end %>