From 12c1c8904b35802a6b85f2949f43be6f0cabc109 Mon Sep 17 00:00:00 2001 From: John Houston Date: Tue, 25 Feb 2025 16:05:21 -0700 Subject: [PATCH] Add write-only attribute "set_wo" (#1592) --- .changelog/1592.txt | 3 + docs/resources/release.md | 2 + go.mod | 62 ++++---- go.sum | 123 ++++++++------- helm/resource_helm_release.go | 109 ++++++++++++- helm/resource_helm_release_test.go | 241 +++++++++++++++++++++-------- scripts/get-version-matrix.sh | 2 +- 7 files changed, 383 insertions(+), 159 deletions(-) create mode 100644 .changelog/1592.txt diff --git a/.changelog/1592.txt b/.changelog/1592.txt new file mode 100644 index 000000000..f433883c2 --- /dev/null +++ b/.changelog/1592.txt @@ -0,0 +1,3 @@ +```release-note:feature +`helm_release`: Add `set_wo` write-only attribute +``` diff --git a/docs/resources/release.md b/docs/resources/release.md index aa1ca5394..1f7242e93 100644 --- a/docs/resources/release.md +++ b/docs/resources/release.md @@ -50,6 +50,8 @@ A Chart is a Helm package. It contains all of the resource definitions necessary - `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_wo` (Attribute List) Custom values to be merged with the values. This is the same as "set" but write-only. (see [below for nested schema](#nestedblock--set)) +- `set_wo_revision` (Number) The current revision of the write-only "set_wo" attribute. Incrementing this integer value will cause Terraform to update the write-only value.` - `set_list` (Block List) Custom list 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`. diff --git a/go.mod b/go.mod index 95a8ed8c6..291a220e7 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,20 @@ module github.com/hashicorp/terraform-provider-helm -go 1.22.0 +go 1.22.7 -toolchain go1.22.3 +toolchain go1.24.0 require ( - github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637 - github.com/hashicorp/terraform-plugin-docs v0.19.4 - github.com/hashicorp/terraform-plugin-framework v1.11.0 + github.com/hashicorp/terraform-plugin-docs v0.20.1 + github.com/hashicorp/terraform-plugin-framework v1.14.1 github.com/hashicorp/terraform-plugin-framework-validators v0.13.0 - github.com/hashicorp/terraform-plugin-go v0.23.0 + github.com/hashicorp/terraform-plugin-go v0.26.0 github.com/hashicorp/terraform-plugin-log v0.9.0 - github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 - github.com/hashicorp/terraform-plugin-testing v1.10.0 + github.com/hashicorp/terraform-plugin-testing v1.11.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.31.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/crypto v0.32.0 helm.sh/helm/v3 v3.15.3 k8s.io/api v0.30.3 k8s.io/apimachinery v0.30.3 @@ -28,7 +26,7 @@ require ( require ( github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect - github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect github.com/hashicorp/cli v1.1.6 // indirect github.com/rivo/uniseg v0.2.0 // indirect ) @@ -50,7 +48,7 @@ require ( github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.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.12 // indirect @@ -72,7 +70,7 @@ require ( github.com/ghodss/yaml v1.0.0 // 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.4.1 // indirect + github.com/go-logr/logr v1.4.2 // 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 @@ -93,18 +91,20 @@ require ( 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-cty v1.4.1-0.20200723130312-85980079f637 // 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.6.0 // indirect + github.com/hashicorp/go-plugin v1.6.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/hashicorp/hc-install v0.8.0 // indirect - github.com/hashicorp/hcl/v2 v2.21.0 // indirect + github.com/hashicorp/hc-install v0.9.0 // indirect + github.com/hashicorp/hcl/v2 v2.23.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-exec v0.21.0 // indirect - github.com/hashicorp/terraform-json v0.22.1 // indirect - github.com/hashicorp/terraform-registry-address v0.2.3 // indirect + github.com/hashicorp/terraform-json v0.23.0 // indirect + github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0 // indirect + github.com/hashicorp/terraform-registry-address v0.2.4 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect @@ -160,29 +160,29 @@ require ( 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/yuin/goldmark v1.7.1 // indirect + github.com/yuin/goldmark v1.7.7 // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect github.com/zclconf/go-cty v1.15.0 // indirect go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/mod v0.19.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/tools v0.22.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 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.69.4 // indirect + google.golang.org/protobuf v1.36.3 // 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 diff --git a/go.sum b/go.sum index c0b1197cb..c1dd9856b 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= -github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -63,8 +63,8 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0Bsq 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/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= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -146,8 +146,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 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.2/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/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/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= @@ -246,8 +246,8 @@ github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH 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.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= -github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= +github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= +github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -257,32 +257,32 @@ github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKe github.com/hashicorp/go-version v1.7.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.8.0 h1:LdpZeXkZYMQhoKPCecJHlKvUkQFixN/nvyR1CdfOLjI= -github.com/hashicorp/hc-install v0.8.0/go.mod h1:+MwJYjDfCruSD/udvBmRB22Nlkwwkwf5sAB6uTIhSaU= -github.com/hashicorp/hcl/v2 v2.21.0 h1:lve4q/o/2rqwYOgUg3y3V2YPyD1/zkCLGjIV74Jit14= -github.com/hashicorp/hcl/v2 v2.21.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= +github.com/hashicorp/hc-install v0.9.0 h1:2dIk8LcvANwtv3QZLckxcjyF5w8KVtiMxu6G6eLhghE= +github.com/hashicorp/hc-install v0.9.0/go.mod h1:+6vOP+mf3tuGgMApVYtmsnDoKWMDcFXeTxCACYZ8SFg= +github.com/hashicorp/hcl/v2 v2.23.0 h1:Fphj1/gCylPxHutVSEOf2fBOh1VE4AuLV7+kbJf3qos= +github.com/hashicorp/hcl/v2 v2.23.0/go.mod h1:62ZYHrXgPoX8xBnzl8QzbWq4dyDsDtfCRgIq1rbJEvA= 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.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.19.4 h1:G3Bgo7J22OMtegIgn8Cd/CaSeyEljqjH3G39w28JK4c= -github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:4pLASsatTmRynVzsjEhbXZ6s7xBlUw/2Kt0zfrq8HxA= -github.com/hashicorp/terraform-plugin-framework v1.11.0 h1:M7+9zBArexHFXDx/pKTxjE6n/2UCXY6b8FIq9ZYhwfE= -github.com/hashicorp/terraform-plugin-framework v1.11.0/go.mod h1:qBXLDn69kM97NNVi/MQ9qgd1uWWsVftGSnygYG1tImM= +github.com/hashicorp/terraform-json v0.23.0 h1:sniCkExU4iKtTADReHzACkk8fnpQXrdD2xoR+lppBkI= +github.com/hashicorp/terraform-json v0.23.0/go.mod h1:MHdXbBAbSg0GvzuWazEGKAn/cyNfIB7mN6y7KJN6y2c= +github.com/hashicorp/terraform-plugin-docs v0.20.1 h1:Fq7E/HrU8kuZu3hNliZGwloFWSYfWEOWnylFhYQIoys= +github.com/hashicorp/terraform-plugin-docs v0.20.1/go.mod h1:Yz6HoK7/EgzSrHPB9J/lWFzwl9/xep2OPnc5jaJDV90= +github.com/hashicorp/terraform-plugin-framework v1.14.1 h1:jaT1yvU/kEKEsxnbrn4ZHlgcxyIfjvZ41BLdlLk52fY= +github.com/hashicorp/terraform-plugin-framework v1.14.1/go.mod h1:xNUKmvTs6ldbwTuId5euAtg37dTxuyj3LHS3uj7BHQ4= github.com/hashicorp/terraform-plugin-framework-validators v0.13.0 h1:bxZfGo9DIUoLLtHMElsu+zwqI4IsMZQBRRy4iLzZJ8E= github.com/hashicorp/terraform-plugin-framework-validators v0.13.0/go.mod h1:wGeI02gEhj9nPANU62F2jCaHjXulejm/X+af4PdZaNo= -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-go v0.26.0 h1:cuIzCv4qwigug3OS7iKhpGAbZTiypAfFQmw8aE65O2M= +github.com/hashicorp/terraform-plugin-go v0.26.0/go.mod h1:+CXjuLDiFgqR+GcrM5a2E2Kal5t5q2jb0E3D57tTdNY= 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.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.10.0 h1:2+tmRNhvnfE4Bs8rB6v58S/VpqzGC6RCh9Y8ujdn+aw= -github.com/hashicorp/terraform-plugin-testing v1.10.0/go.mod h1:iWRW3+loP33WMch2P/TEyCxxct/ZEcCGMquSLSCVsrc= -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-plugin-sdk/v2 v2.35.0 h1:wyKCCtn6pBBL46c1uIIBNUOWlNfYXfXpVo16iDyLp8Y= +github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0/go.mod h1:B0Al8NyYVr8Mp/KLwssKXG1RqnTk7FySqSn4fRuLNgw= +github.com/hashicorp/terraform-plugin-testing v1.11.0 h1:MeDT5W3YHbONJt2aPQyaBsgQeAIckwPX41EUHXEn29A= +github.com/hashicorp/terraform-plugin-testing v1.11.0/go.mod h1:WNAHQ3DcgV/0J+B15WTE6hDvxcUdkPPpnB1FR3M910U= +github.com/hashicorp/terraform-registry-address v0.2.4 h1:JXu/zHB2Ymg/TGVCRu10XqNa4Sh2bWcqCNyKWjnCPJA= +github.com/hashicorp/terraform-registry-address v0.2.4/go.mod h1:tUNYTVyCtU4OIGXXMDp7WNcJ+0W1B4nmstVDgHMjfAU= 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.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= @@ -444,8 +444,8 @@ github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+Pymzi github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rubenv/sql-migrate v1.5.2 h1:bMDqOnrJVV/6JQgQ/MxOpU+AdO8uzYYA/TxFUBzFtS0= github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -470,8 +470,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -481,8 +482,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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= @@ -504,8 +505,8 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= -github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.7 h1:5m9rrB1sW3JUMToKFQfb+FGt1U7r57IHu5GrYrG2nqU= +github.com/yuin/goldmark v1.7.7/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= @@ -524,12 +525,16 @@ 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= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -538,8 +543,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/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.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= @@ -549,8 +554,8 @@ 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.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -564,11 +569,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.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -599,14 +604,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc 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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.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.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= 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= @@ -626,8 +631,8 @@ 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.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= 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= @@ -639,13 +644,13 @@ google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJ 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-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/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= 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.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= @@ -656,8 +661,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.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= -google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= diff --git a/helm/resource_helm_release.go b/helm/resource_helm_release.go index 4130087cc..ec9feb725 100644 --- a/helm/resource_helm_release.go +++ b/helm/resource_helm_release.go @@ -14,6 +14,7 @@ import ( "strings" "time" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -91,6 +92,8 @@ type HelmReleaseModel struct { RepositoryUsername types.String `tfsdk:"repository_username"` ResetValues types.Bool `tfsdk:"reset_values"` ReuseValues types.Bool `tfsdk:"reuse_values"` + SetWO types.List `tfsdk:"set_wo"` + SetWORevision types.Int64 `tfsdk:"set_wo_revision"` Set types.List `tfsdk:"set"` SetList types.List `tfsdk:"set_list"` SetSensitive types.List `tfsdk:"set_sensitive"` @@ -531,6 +534,37 @@ func (r *HelmRelease) Schema(ctx context.Context, req resource.SchemaRequest, re }, }, }, + "set_wo": schema.ListNestedAttribute{ + Description: "Custom values to be merged with the values", + Optional: true, + WriteOnly: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "name": schema.StringAttribute{ + Required: true, + WriteOnly: true, + }, + "value": schema.StringAttribute{ + Required: true, + WriteOnly: true, + }, + "type": schema.StringAttribute{ + Optional: true, + WriteOnly: true, + Validators: []validator.String{ + stringvalidator.OneOf("auto", "string"), + }, + }, + }, + }, + }, + "set_wo_revision": schema.Int64Attribute{ + Optional: true, + Description: `The current revision of the write-only "set_wo" attribute. Incrementing this integer value will cause Terraform to update the write-only value.`, + Validators: []validator.Int64{ + int64validator.AtLeast(1), + }, + }, "set_list": schema.ListNestedAttribute{ Description: "Custom sensitive values to be merged with the values", Optional: true, @@ -649,6 +683,12 @@ func (r *HelmRelease) Create(ctx context.Context, req resource.CreateRequest, re if resp.Diagnostics.HasError() { return } + var config HelmReleaseModel + diags = req.Config.Get(ctx, &config) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } tflog.Debug(ctx, fmt.Sprintf("Plan state on Create: %+v", state)) @@ -700,6 +740,17 @@ func (r *HelmRelease) Create(ctx context.Context, req resource.CreateRequest, re return } + if config.SetWORevision.ValueInt64() > 0 { + woValues, woDiags := getWriteOnlyValues(ctx, &config) + resp.Diagnostics.Append(woDiags...) + if resp.Diagnostics.HasError() { + return + } + if len(woValues) > 0 { + values = mergeMaps(values, woValues) + } + } + err = isChartInstallable(c) if err != nil { resp.Diagnostics.AddError("Error checking if chart is installable", fmt.Sprintf("Chart is not installable: %s", err)) @@ -863,6 +914,13 @@ func (r *HelmRelease) Update(ctx context.Context, req resource.UpdateRequest, re return } + var config HelmReleaseModel + diags = req.Config.Get(ctx, &config) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + logID := fmt.Sprintf("[resourceReleaseUpdate: %s]", state.Name.ValueString()) tflog.Debug(ctx, fmt.Sprintf("%s Started", logID)) @@ -947,6 +1005,16 @@ func (r *HelmRelease) Update(ctx context.Context, req resource.UpdateRequest, re if resp.Diagnostics.HasError() { return } + if plan.SetWORevision.ValueInt64() > state.SetWORevision.ValueInt64() { + woValues, woDiags := getWriteOnlyValues(ctx, &config) + resp.Diagnostics.Append(woDiags...) + if resp.Diagnostics.HasError() { + return + } + if len(woValues) > 0 { + values = mergeMaps(values, woValues) + } + } name := plan.Name.ValueString() release, err := client.Run(name, c, values) @@ -1154,6 +1222,30 @@ func getChart(ctx context.Context, model *HelmReleaseModel, m *Meta, name string return c, path, diags } +func getWriteOnlyValues(ctx context.Context, model *HelmReleaseModel) (map[string]interface{}, diag.Diagnostics) { + base := map[string]interface{}{} + diags := diag.Diagnostics{} + + if !model.SetWO.IsUnknown() && !model.SetWO.IsNull() { + tflog.Debug(ctx, "Processing SetWO attribute") + var setvals []setResourceModel + setDiags := model.SetWO.ElementsAs(ctx, &setvals, false) + diags.Append(setDiags...) + if diags.HasError() { + return nil, diags + } + for _, set := range setvals { + setDiags := getValue(base, set) + diags.Append(setDiags...) + if diags.HasError() { + return nil, diags + } + } + } + + return base, diags +} + func getValues(ctx context.Context, model *HelmReleaseModel) (map[string]interface{}, diag.Diagnostics) { base := map[string]interface{}{} var diags diag.Diagnostics @@ -1400,6 +1492,14 @@ func setReleaseAttributes(ctx context.Context, state *HelmReleaseModel, r *relea state.Manifest = types.StringValue(manifest) } + // NOTE Don't retrieve values if write-only is being used. + // It is not possible to pick out which values are write-only + // at read time because write-only values are ephemeral + valuesstr := types.StringValue("{}") + if state.SetWORevision.ValueInt64() <= 0 { + valuesstr = types.StringValue(values) + } + // Create metadata as a slice of maps metadata := map[string]attr.Value{ "name": types.StringValue(r.Name), @@ -1408,7 +1508,7 @@ func setReleaseAttributes(ctx context.Context, state *HelmReleaseModel, r *relea "chart": types.StringValue(r.Chart.Metadata.Name), "version": types.StringValue(r.Chart.Metadata.Version), "app_version": types.StringValue(r.Chart.Metadata.AppVersion), - "values": types.StringValue(values), + "values": valuesstr, "first_deployed": types.Int64Value(r.Info.FirstDeployed.Unix()), "last_deployed": types.Int64Value(r.Info.LastDeployed.Unix()), } @@ -2004,6 +2104,13 @@ func (r *HelmRelease) ImportState(ctx context.Context, req resource.ImportStateR "value": types.StringType, }, }) + state.SetWO = types.ListNull(types.ObjectType{ + AttrTypes: map[string]attr.Type{ + "name": types.StringType, + "type": types.StringType, + "value": types.StringType, + }, + }) state.SetSensitive = types.ListNull(types.ObjectType{ AttrTypes: map[string]attr.Type{ "name": types.StringType, diff --git a/helm/resource_helm_release_test.go b/helm/resource_helm_release_test.go index 3fe628917..ca256589d 100644 --- a/helm/resource_helm_release_test.go +++ b/helm/resource_helm_release_test.go @@ -17,9 +17,11 @@ import ( "testing" "time" + "github.com/hashicorp/go-version" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" + "github.com/hashicorp/terraform-plugin-testing/tfversion" "github.com/pkg/errors" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/helmpath" @@ -35,9 +37,9 @@ func TestAccResourceRelease_basic(t *testing.T) { defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2.3"), @@ -64,6 +66,41 @@ func TestAccResourceRelease_basic(t *testing.T) { }, }) } + +func TestAccResourceRelease_set_wo(t *testing.T) { + name := randName("writeonly") + namespace := createRandomNamespace(t) + defer deleteNamespace(t, namespace) + + resource.Test(t, resource.TestCase{ + TerraformVersionChecks: []tfversion.TerraformVersionCheck{ + // FIXME use const from terraform-plugin-testing once v1.11.0 is released. + tfversion.SkipBelow(version.Must(version.NewVersion("1.11.0"))), + }, + // PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: protoV6ProviderFactories(), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + Steps: []resource.TestStep{ + { + Config: testAccHelmReleaseConfig_set_wo(testResourceName, namespace, name, "1.2.3"), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("helm_release.test", "status", release.StatusDeployed.String()), + resource.TestCheckResourceAttr("helm_release.test", "set_wo_revision", "1"), + resource.TestCheckResourceAttr("helm_release.test", "metadata.values", "{}"), + ), + }, + { + Config: testAccHelmReleaseConfig_set_wo2(testResourceName, namespace, name, "1.2.3"), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("helm_release.test", "status", release.StatusDeployed.String()), + resource.TestCheckResourceAttr("helm_release.test", "set_wo_revision", "2"), + resource.TestCheckResourceAttr("helm_release.test", "metadata.values", "{}"), + ), + }, + }, + }) +} + func TestAccResourceRelease_emptyVersion(t *testing.T) { name := randName("basic") namespace := createRandomNamespace(t) @@ -71,9 +108,9 @@ func TestAccResourceRelease_emptyVersion(t *testing.T) { resourceName := "helm_release.test" resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigEmptyVersion(testResourceName, namespace, name), @@ -98,9 +135,9 @@ func TestAccResourceRelease_import(t *testing.T) { defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2.3"), @@ -210,9 +247,9 @@ func TestAccResourceRelease_multiple_releases(t *testing.T) { config += releaseConfig } resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: config, @@ -247,15 +284,16 @@ func TestAccResourceRelease_parallel(t *testing.T) { }, }) } + func TestAccResourceRelease_update(t *testing.T) { name := randName("update") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2.3"), @@ -278,15 +316,16 @@ func TestAccResourceRelease_update(t *testing.T) { }, }) } + func TestAccResourceRelease_emptyValuesList(t *testing.T) { name := randName("test-empty-values-list") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigValues( @@ -301,15 +340,16 @@ func TestAccResourceRelease_emptyValuesList(t *testing.T) { }, }) } + func TestAccResourceRelease_updateValues(t *testing.T) { name := randName("test-update-values") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigValues( @@ -334,15 +374,16 @@ func TestAccResourceRelease_updateValues(t *testing.T) { }, }) } + func TestAccResourceRelease_cloakValues(t *testing.T) { name := randName("test-update-values") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigSensitiveValue( @@ -358,15 +399,16 @@ func TestAccResourceRelease_cloakValues(t *testing.T) { }, }) } + func TestAccResourceRelease_updateMultipleValues(t *testing.T) { name := randName("test-update-multiple-values") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigValues( @@ -393,13 +435,14 @@ func TestAccResourceRelease_updateMultipleValues(t *testing.T) { }, }) } + func TestAccResourceRelease_repository_url(t *testing.T) { name := randName("test-repository-url") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), Steps: []resource.TestStep{ { @@ -423,6 +466,7 @@ func TestAccResourceRelease_repository_url(t *testing.T) { }, }) } + func TestAccResourceRelease_updateAfterFail(t *testing.T) { name := randName("test-update-after-fail") namespace := createRandomNamespace(t) @@ -467,9 +511,9 @@ func TestAccResourceRelease_updateAfterFail(t *testing.T) { }`, name, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: malformed, @@ -494,9 +538,9 @@ func TestAccResourceRelease_updateExistingFailed(t *testing.T) { defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigValues( @@ -531,6 +575,7 @@ func TestAccResourceRelease_updateExistingFailed(t *testing.T) { }, }) } + func TestAccResourceRelease_SetNull(t *testing.T) { name := randName("test-update-set-value") namespace := createRandomNamespace(t) @@ -538,9 +583,9 @@ func TestAccResourceRelease_SetNull(t *testing.T) { // Ensure that value is null resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigSetNull( @@ -554,6 +599,7 @@ func TestAccResourceRelease_SetNull(t *testing.T) { }, }) } + func TestAccResourceRelease_updateSetValue(t *testing.T) { name := randName("test-update-set-value") namespace := createRandomNamespace(t) @@ -563,9 +609,9 @@ func TestAccResourceRelease_updateSetValue(t *testing.T) { // use checkResourceAttrExists rather than testCheckResourceAttrSet as the latter also checks if the value is not "" // and the default for 'type' is an empty string when not explicitly set. resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigSet( @@ -588,15 +634,16 @@ func TestAccResourceRelease_updateSetValue(t *testing.T) { }, }) } + func TestAccResourceRelease_validation(t *testing.T) { invalidName := "this-helm-release-name-is-longer-than-53-characters-long" namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, invalidName, "1.2.3"), @@ -625,6 +672,7 @@ func checkResourceAttrExists(name, key string) resource.TestCheckFunc { return fmt.Errorf("%s: Attribute '%s' expected to be set", name, key) } } + func checkResourceAttrNotSet(name, key string) resource.TestCheckFunc { return func(s *terraform.State) error { ms := s.RootModule() @@ -652,9 +700,9 @@ func TestAccResourceRelease_postrender(t *testing.T) { defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigPostrender(testResourceName, namespace, testResourceName, "echo"), @@ -679,6 +727,7 @@ func TestAccResourceRelease_postrender(t *testing.T) { }, }) } + func TestAccResourceRelease_namespaceDoesNotExist(t *testing.T) { name := randName("test-namespace-does-not-exist") namespace := createRandomNamespace(t) @@ -701,9 +750,9 @@ func TestAccResourceRelease_namespaceDoesNotExist(t *testing.T) { }`, name, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: broken, @@ -718,6 +767,7 @@ func TestAccResourceRelease_namespaceDoesNotExist(t *testing.T) { }, }) } + func TestAccResourceRelease_invalidName(t *testing.T) { namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) @@ -731,9 +781,9 @@ func TestAccResourceRelease_invalidName(t *testing.T) { }`, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: broken, @@ -743,6 +793,7 @@ func TestAccResourceRelease_invalidName(t *testing.T) { }, }) } + func TestAccResourceRelease_createNamespace(t *testing.T) { name := randName("create-namespace") namespace := randName("helm-created-namespace") @@ -758,9 +809,9 @@ func TestAccResourceRelease_createNamespace(t *testing.T) { }`, name, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: config, @@ -843,6 +894,52 @@ func testAccHelmReleaseConfigBasic(resource, ns, name, version string) string { `, resource, name, ns, testRepositoryURL, version) } +func testAccHelmReleaseConfig_set_wo(resource, ns, name, version string) string { + return fmt.Sprintf(` + resource "helm_release" "%s" { + name = %q + namespace = %q + description = "Test" + repository = %q + chart = "test-chart" + version = %q + + set_wo_revision = 1 + set_wo = [ + { + name = "foo" + value = "bar" + }, + ] + } + `, resource, name, ns, testRepositoryURL, version) +} + +func testAccHelmReleaseConfig_set_wo2(resource, ns, name, version string) string { + return fmt.Sprintf(` + resource "helm_release" "%s" { + name = %q + namespace = %q + description = "Test" + repository = %q + chart = "test-chart" + version = %q + + set_wo_revision = 2 + set_wo = [ + { + name = "foo" + value = "bar" + }, + { + name = "fizz" + value = 1337 + } + ] + } + `, resource, name, ns, testRepositoryURL, version) +} + func testAccHelmReleaseConfigParallel(resource string, count int, ns, name, version string) string { return fmt.Sprintf(` resource "helm_release" "%s" { @@ -1032,7 +1129,6 @@ func testAccHelmReleaseConfigSetNull(resource, ns, name, version string) string // } func TestUseChartVersion(t *testing.T) { - type test struct { chartPath string repositoryURL string @@ -1063,7 +1159,7 @@ func TestUseChartVersion(t *testing.T) { } } -//check for unit test documentation +// check for unit test documentation // func TestGetListValues(t *testing.T) { // ctx := context.Background() @@ -1174,9 +1270,9 @@ func testAccPreCheckHelmRepositoryDestroy(t *testing.T, name string) { settings := testMeta.Settings rc := settings.RepositoryConfig - //settings := testAccProvider.Meta().(*Meta).Settings + // settings := testAccProvider.Meta().(*Meta).Settings - //rc := settings.RepositoryConfig + // rc := settings.RepositoryConfig r, err := repo.LoadFile(rc) @@ -1185,7 +1281,7 @@ func testAccPreCheckHelmRepositoryDestroy(t *testing.T, name string) { return } - if err := r.WriteFile(rc, 0644); err != nil { + if err := r.WriteFile(rc, 0o644); err != nil { t.Fatalf("Failed to write repositories file: %s", err) } @@ -1330,9 +1426,9 @@ func TestAccResourceRelease_LintFailValues(t *testing.T) { }`, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: broken, @@ -1343,6 +1439,7 @@ func TestAccResourceRelease_LintFailValues(t *testing.T) { }, }) } + func TestAccResourceRelease_LintFailChart(t *testing.T) { namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) @@ -1357,9 +1454,9 @@ func TestAccResourceRelease_LintFailChart(t *testing.T) { }`, namespace, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: broken, @@ -1370,6 +1467,7 @@ func TestAccResourceRelease_LintFailChart(t *testing.T) { }, }) } + func TestAccResourceRelease_FailedDeployFailsApply(t *testing.T) { name := randName("test-failed-deploy-fails-apply") namespace := createRandomNamespace(t) @@ -1383,9 +1481,9 @@ func TestAccResourceRelease_FailedDeployFailsApply(t *testing.T) { }`, name, testRepositoryURL) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: failed, @@ -1413,9 +1511,9 @@ func TestAccResourceRelease_dependency(t *testing.T) { } resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigDependency(testResourceName, namespace, name, false), @@ -1459,6 +1557,7 @@ func TestAccResourceRelease_dependency(t *testing.T) { }, }) } + func TestAccResourceRelease_chartURL(t *testing.T) { name := randName("chart-url") namespace := createRandomNamespace(t) @@ -1466,9 +1565,9 @@ func TestAccResourceRelease_chartURL(t *testing.T) { chartURL := fmt.Sprintf("%s/%s", testRepositoryURL, "test-chart-1.2.3.tgz") resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfig_chartURL(testResourceName, namespace, name, chartURL), @@ -1481,6 +1580,7 @@ func TestAccResourceRelease_chartURL(t *testing.T) { }, }) } + func TestAccResourceRelease_helm_repo_add(t *testing.T) { name := randName("helm-repo-add") namespace := createRandomNamespace(t) @@ -1495,9 +1595,9 @@ func TestAccResourceRelease_helm_repo_add(t *testing.T) { } resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfig_helm_repo_add(testResourceName, namespace, name), @@ -1510,15 +1610,16 @@ func TestAccResourceRelease_helm_repo_add(t *testing.T) { }, }) } + func TestAccResourceRelease_delete_regression(t *testing.T) { name := randName("outside-delete") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigBasic(testResourceName, namespace, name, "1.2.3"), @@ -1557,7 +1658,7 @@ func TestAccResourceRelease_manifest(t *testing.T) { //testAccPreCheck(t) //}, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfigManifestExperimentEnabled(testResourceName, namespace, name, "1.2.3"), @@ -1579,6 +1680,7 @@ func TestAccResourceRelease_manifest(t *testing.T) { }, }) } + func getReleaseJSONManifest(ctx context.Context, namespace, name string) (string, error) { // Execute the Helm command to get the release manifest cmd := exec.CommandContext(ctx, "helm", "get", "manifest", "--namespace", namespace, name) @@ -1611,7 +1713,7 @@ func TestAccResourceRelease_manifestUnknownValues(t *testing.T) { Source: "hashicorp/random", }, }, - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ // NOTE this is a regression test to apply a configuration which supplies // unknown values to the release at plan time, we simply expected to test here @@ -1629,9 +1731,9 @@ func TestAccResourceRelease_set_list_chart(t *testing.T) { defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseSetListValues(testResourceName, namespace, name), @@ -1649,15 +1751,16 @@ func TestAccResourceRelease_set_list_chart(t *testing.T) { }, }) } + func TestAccResourceRelease_update_set_list_chart(t *testing.T) { name := randName("helm-setlist-chart") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseSetListValues(testResourceName, namespace, name), @@ -1790,6 +1893,7 @@ func setupOCIRegistry(t *testing.T, usepassword bool) (string, func()) { } } } + func TestAccResourceRelease_OCI_repository(t *testing.T) { name := randName("oci") namespace := createRandomNamespace(t) @@ -1803,7 +1907,7 @@ func TestAccResourceRelease_OCI_repository(t *testing.T) { // testAccPreCheck(t) //}, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfig_OCI(testResourceName, namespace, name, ociRegistryURL, "1.2.3"), @@ -1853,7 +1957,7 @@ func TestAccResourceRelease_OCI_registry_login(t *testing.T) { // testAccPreCheck(t) //}, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfig_OCI_login_provider(os.Getenv("KUBE_CONFIG_PATH"), testResourceName, namespace, name, ociRegistryURL, "1.2.3", "hashicorp", "terraform", "test-chart"), @@ -1889,6 +1993,7 @@ resource "helm_release" "%s" { chart = "%s" }`, kubeconfig, repo, username, password, resource, name, ns, version, repo, chart) } + func TestAccResourceRelease_OCI_login(t *testing.T) { name := randName("oci") namespace := createRandomNamespace(t) @@ -1902,7 +2007,7 @@ func TestAccResourceRelease_OCI_login(t *testing.T) { //testAccPreCheck(t) //}, ProtoV6ProviderFactories: protoV6ProviderFactories(), - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseConfig_OCI_login_multiple(testResourceName, namespace, name, ociRegistryURL, "1.2.3", "hashicorp", "terraform"), @@ -1920,20 +2025,21 @@ func TestAccResourceRelease_OCI_login(t *testing.T) { }, }) } + func TestAccResourceRelease_recomputeMetadata(t *testing.T) { name := randName("basic") namespace := createRandomNamespace(t) defer deleteNamespace(t, namespace) resource.Test(t, resource.TestCase{ - //PreCheck: func() { testAccPreCheck(t) }, + // PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: protoV6ProviderFactories(), ExternalProviders: map[string]resource.ExternalProvider{ "local": { Source: "hashicorp/local", }, }, - //CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), + // CheckDestroy: testAccCheckHelmReleaseDestroy(namespace), Steps: []resource.TestStep{ { Config: testAccHelmReleaseRecomputeMetadata(testResourceName, namespace, name), @@ -1962,6 +2068,7 @@ func TestAccResourceRelease_recomputeMetadata(t *testing.T) { }, }) } + func testAccHelmReleaseConfig_OCI(resource, ns, name, repo, version string) string { return fmt.Sprintf(` resource "helm_release" "%s" { diff --git a/scripts/get-version-matrix.sh b/scripts/get-version-matrix.sh index e07b7fb1b..99ffb08d7 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 "matrix=[$(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)]" >> "$GITHUB_OUTPUT" +echo "matrix=[$(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), $(get_latest_version v1.10), $(get_latest_version v1.11)]" >> "$GITHUB_OUTPUT"