diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 7707f0cc..970bfe76 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -8,9 +8,4 @@
Relates OR Closes #0000
-Release note for [CHANGELOG](https://github.com/bpg/terraform-provider-proxmox/blob/main/CHANGELOG.md):
-
-
-```release-note
-
-```
+
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 67991704..fc3bec34 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,14 +1,11 @@
# This GitHub action can publish assets for release when a tag is created.
# Currently its setup to run on any tag that matches the pattern "v*" (ie. v0.1.0).
#
-# This uses an action (hashicorp/ghaction-import-gpg) that assumes you set your
+# This uses an action (crazy-max/ghaction-import-gpg) that assumes you set your
# private key in the `GPG_PRIVATE_KEY` secret and passphrase in the `PASSPHRASE`
# secret. If you would rather own your own GPG handling, please fork this action
# or use an alternative one for key handling.
#
-# You will need to pass the `--batch` flag to `gpg` in your signing step
-# in `goreleaser` to indicate this is being used in a non-interactive mode.
-#
name: release
on:
push:
@@ -27,7 +24,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v3
with:
- go-version: 1.16
+ go-version: 1.18
- name: Import GPG key
id: import_gpg
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index e4709521..2ffaecf4 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -20,7 +20,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v3
with:
- go-version: '1.16'
+ go-version: '1.18'
id: go
- name: Check out code into the Go module directory
@@ -43,15 +43,15 @@ jobs:
matrix:
# list whatever Terraform versions here you would like to support
terraform:
- - '0.14.11'
- - '0.15.5'
- - '1.1.7'
+ - '1.0.1'
+ - '1.1.9'
+ - '1.2.5'
steps:
- name: Set up Go
uses: actions/setup-go@v3
with:
- go-version: '1.16'
+ go-version: '1.18'
id: go
- name: Check out code into the Go module directory
diff --git a/Makefile b/Makefile
index 8dde66fd..9c39a184 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ ifeq ($(OS),Windows_NT)
TERRAFORM_PLUGIN_CACHE_DIRECTORY=$$(cygpath -u "$(shell pwd -P)")/cache/plugins
TERRAFORM_PLUGIN_EXTENSION=.exe
else
- TERRAFORM_PLATFORM=$$(terraform -version | awk 'FNR == 2 {print $2}')
+ TERRAFORM_PLATFORM=$$(terraform -version | awk 'FNR == 2 {print $$2}')
TERRAFORM_PLUGIN_CACHE_DIRECTORY=$(shell pwd -P)/cache/plugins
endif
diff --git a/README.md b/README.md
index 79b19723..61609e3c 100644
--- a/README.md
+++ b/README.md
@@ -18,9 +18,9 @@ VM deployment in Proxmox v7.0, and a few other enhancements.
| 7.x | 0.4.x \> 0.4.4
0.5.x |
## Requirements
-- [Terraform](https://www.terraform.io/downloads.html) 0.14+
-- [Go](https://golang.org/doc/install) 1.16+ (to build the provider plugin)
-- [GoReleaser](https://goreleaser.com/install/) 0.155+ (to build the provider plugin)
+- [Terraform](https://www.terraform.io/downloads.html) 1.0+
+- [Go](https://golang.org/doc/install) 1.18+ (to build the provider plugin)
+- [GoReleaser](https://goreleaser.com/install/) v1.10+ (to build the provider plugin)
## Table of Contents
- [Building the provider](#building-the-provider)
@@ -56,6 +56,25 @@ $ make test
Tests are limited to regression tests, ensuring backwards compatibility.
+## Deploying the example resources
+
+There are number of TF examples in the `examples` directory, which can be used to deploy a Container, VM, or other Proxmox resources on your test Proxmox cluster.
+The following assumptions are made about the test Proxmox cluster:
+- It has one node named `pve`
+- The node has local storages named `local` and `local-lvm`
+
+Create `examples/terraform.tfvars` with the following variables:
+
+```sh
+virtual_environment_username = "root@pam"
+virtual_environment_password = "put-your-password-here"
+virtual_environment_endpoint = "https://:8006/"
+```
+
+Then run `make example` to deploy the example resources.
+
+
+
## Known issues
### Disk images cannot be imported by non-PAM accounts
@@ -78,7 +97,7 @@ resource "proxmox_virtual_environment_file" "vmdk_disk_image" {
}
resource "proxmox_virtual_environment_vm" "example" {
- ...
+ //...
disk {
datastore_id = "datastore-id"
@@ -87,7 +106,7 @@ resource "proxmox_virtual_environment_vm" "example" {
file_id = "${proxmox_virtual_environment_file.vmdk_disk_image.id}"
}
- ...
+ //...
}
```
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index 2c9a1802..597a9727 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -1,7 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
- activesupport (6.0.5)
+ activesupport (6.0.5.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
@@ -14,7 +14,7 @@ GEM
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
- commonmarker (0.23.4)
+ commonmarker (0.23.5)
concurrent-ruby (1.1.10)
dnsruby (1.61.9)
simpleidn (~> 0.1)
@@ -34,7 +34,7 @@ GEM
ffi (1.15.5-x64-mingw32)
forwardable-extended (2.6.0)
gemoji (3.0.1)
- github-pages (226)
+ github-pages (227)
github-pages-health-check (= 1.17.9)
jekyll (= 3.9.2)
jekyll-avatar (= 0.7.0)
@@ -76,7 +76,7 @@ GEM
liquid (= 4.0.3)
mercenary (~> 0.3)
minima (= 2.5.1)
- nokogiri (>= 1.13.4, < 2.0)
+ nokogiri (>= 1.13.6, < 2.0)
rouge (= 3.26.0)
terminal-table (~> 1.4)
github-pages-health-check (1.17.9)
@@ -85,7 +85,7 @@ GEM
octokit (~> 4.0)
public_suffix (>= 3.0, < 5.0)
typhoeus (~> 1.3)
- html-pipeline (2.14.1)
+ html-pipeline (2.14.2)
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
@@ -212,20 +212,16 @@ GEM
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6)
+ mini_portile2 (2.8.0)
minima (2.5.1)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
- minitest (5.15.0)
- nokogiri (1.13.6-arm64-darwin)
+ minitest (5.16.2)
+ nokogiri (1.13.7)
+ mini_portile2 (~> 2.8.0)
racc (~> 1.4)
- nokogiri (1.13.6-x64-mingw32)
- racc (~> 1.4)
- nokogiri (1.13.6-x86_64-darwin)
- racc (~> 1.4)
- nokogiri (1.13.6-x86_64-linux)
- racc (~> 1.4)
- octokit (4.25.0)
+ octokit (4.25.1)
faraday (>= 1, < 3)
sawyer (~> 0.9)
pathutil (0.16.2)
@@ -265,7 +261,7 @@ GEM
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.7.0)
- zeitwerk (2.5.4)
+ zeitwerk (2.6.0)
PLATFORMS
universal-darwin-21
diff --git a/go.mod b/go.mod
index 7edfa6da..c3cc5abb 100644
--- a/go.mod
+++ b/go.mod
@@ -1,47 +1,55 @@
module github.com/bpg/terraform-provider-proxmox
-go 1.16
+go 1.18
require (
- cloud.google.com/go v0.102.0 // indirect
- github.com/Masterminds/sprig/v3 v3.2.2 // indirect
- github.com/agext/levenshtein v1.2.3 // indirect
- github.com/aws/aws-sdk-go v1.44.26 // indirect
- github.com/fatih/color v1.13.0 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/google/go-querystring v1.1.0
- github.com/google/martian/v3 v3.3.2 // indirect
- github.com/google/uuid v1.3.0 // indirect
+ github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
+ github.com/hashicorp/go-multierror v1.1.1
+ github.com/hashicorp/terraform-plugin-log v0.5.0
+ github.com/hashicorp/terraform-plugin-sdk/v2 v2.18.0
+ github.com/pkg/sftp v1.13.5
+ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
+)
+
+require (
+ github.com/agext/levenshtein v1.2.3 // indirect
+ github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
+ github.com/fatih/color v1.13.0 // indirect
+ github.com/golang/protobuf v1.5.2 // indirect
+ github.com/google/go-cmp v0.5.8 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
- github.com/hashicorp/go-getter v1.6.1 // indirect
- github.com/hashicorp/go-hclog v1.2.0 // indirect
- github.com/hashicorp/go-multierror v1.1.1 // indirect
+ github.com/hashicorp/go-hclog v1.2.1 // indirect
github.com/hashicorp/go-plugin v1.4.4 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
- github.com/hashicorp/go-version v1.5.0 // indirect
- github.com/hashicorp/hcl/v2 v2.12.0 // indirect
- github.com/hashicorp/terraform-plugin-sdk v1.17.2
+ github.com/hashicorp/go-version v1.6.0 // indirect
+ github.com/hashicorp/hcl/v2 v2.13.0 // indirect
+ github.com/hashicorp/logutils v1.0.0 // indirect
+ github.com/hashicorp/terraform-plugin-go v0.11.0 // indirect
+ github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c // indirect
+ github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 // indirect
- github.com/klauspost/compress v1.15.5 // indirect
+ github.com/kr/fs v0.1.0 // indirect
+ github.com/kr/pretty v0.2.1 // indirect
+ github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
- github.com/mitchellh/cli v1.1.3 // indirect
+ github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/mitchellh/go-wordwrap v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/oklog/run v1.1.0 // indirect
- github.com/pkg/sftp v1.13.5
- github.com/posener/complete v1.2.3 // indirect
- github.com/shopspring/decimal v1.3.1 // indirect
- github.com/spf13/afero v1.8.2 // indirect
- github.com/spf13/cast v1.4.1 // indirect
- github.com/ulikunitz/xz v0.5.10 // indirect
+ github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
+ github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
github.com/vmihailenco/tagparser v0.1.2 // indirect
github.com/zclconf/go-cty v1.10.0 // indirect
- golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122
- golang.org/x/net v0.0.0-20220531201128-c960675eff93 // indirect
- google.golang.org/api v0.82.0 // indirect
- google.golang.org/genproto v0.0.0-20220601144221-27df5f98adab // indirect
- google.golang.org/grpc v1.47.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
+ golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect
+ golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect
+ golang.org/x/text v0.3.7 // indirect
+ google.golang.org/appengine v1.6.7 // indirect
+ google.golang.org/genproto v0.0.0-20220713161829-9c7dac0a6568 // indirect
+ google.golang.org/grpc v1.48.0 // indirect
+ google.golang.org/protobuf v1.28.0 // indirect
+ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
)
diff --git a/go.sum b/go.sum
index 49c9b3c8..ad816ab1 100644
--- a/go.sum
+++ b/go.sum
@@ -1,127 +1,20 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
-cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
-cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
-cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
-cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
-cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
-cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
-cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
-cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
-cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
-cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
-cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
-cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
-cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
-cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
-cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
-cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
-cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
-cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
-cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
-cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
-cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
-cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
-cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
-cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
-cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
-cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
-cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8=
-cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
-cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
-cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
-cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
-cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
-cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
-cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
-cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
-cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
-cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
-cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
-cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc=
-cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
-cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
-cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc=
-cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
-cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
-cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
-cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
-cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
-cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
-cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
-cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
-cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
-cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
-cloud.google.com/go/storage v1.22.1 h1:F6IlQJZrZM++apn9V5/VfS3gbTUYg98PS3EMQAzqtfg=
-cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
-github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
-github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
-github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
-github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
-github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
-github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
-github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI=
-github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
-github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
-github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
-github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
-github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo=
github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
-github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
-github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
-github.com/andybalholm/crlf v0.0.0-20171020200849-670099aa064f/go.mod h1:k8feO4+kXDxro6ErPXBRTJ/ro2mf0SsFG8s7doP9kJE=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
-github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
-github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
-github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
-github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
-github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
-github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
-github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
-github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
-github.com/aws/aws-sdk-go v1.44.26 h1:fOvltAUcUA3IFe0ddPSlmCBSwPKifsXJf4beI0f8XS0=
-github.com/aws/aws-sdk-go v1.44.26/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
-github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
-github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
-github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
-github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-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/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -129,56 +22,24 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
-github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-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/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
-github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
-github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
-github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
-github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
@@ -188,151 +49,56 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
-github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
-github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
-github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
-github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
-github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
-github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
-github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk=
-github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
-github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA=
-github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
-github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
-github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
-github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
-github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
-github.com/hashicorp/go-getter v1.5.3/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI=
-github.com/hashicorp/go-getter v1.6.1 h1:NASsgP4q6tL94WH6nJxKWj8As2H/2kop/bB1d8JMyRY=
-github.com/hashicorp/go-getter v1.6.1/go.mod h1:IZCrswsZPeWv9IkVnLElzRU/gz/QPi6pZHn4tv6vbwA=
-github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
-github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
-github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM=
-github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
-github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 h1:1/D3zfFHttUKaCaGKZ/dR2roBXv0vKbSCnssIldfQdI=
+github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320/go.mod h1:EiZBMaudVLy8fmjf9Npq1dq9RalhveqZG5w/yz3mHWs=
+github.com/hashicorp/go-hclog v1.2.1 h1:YQsLlGDJgwhXFpucSPyVbCBviQtjlHv3jLTlp8YmtEw=
+github.com/hashicorp/go-hclog v1.2.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
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.3.0/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYtXdgmf1AVNs0=
github.com/hashicorp/go-plugin v1.4.4 h1:NVdrSdFRt3SkZtNckJ6tog7gbpRrcbOjQi/rgF7JYWQ=
github.com/hashicorp/go-plugin v1.4.4/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s=
-github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
-github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
-github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
-github.com/hashicorp/go-uuid v1.0.1/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=
-github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/go-version v1.5.0 h1:O293SZ2Eg+AAYijkVK3jR786Am1bhDEh2GHT0tIVE5E=
-github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f h1:UdxlrJz4JOnY8W+DbLISwf2B8WXEolNRA8BGCwI9jws=
-github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
-github.com/hashicorp/hcl/v2 v2.0.0/go.mod h1:oVVDG71tEinNGYCxinCYadcmKU9bglqW9pV3txagJ90=
-github.com/hashicorp/hcl/v2 v2.8.2/go.mod h1:bQTN5mpo+jewjJgh8jr0JUguIi7qPHUF6yIfAEN3jqY=
-github.com/hashicorp/hcl/v2 v2.12.0 h1:PsYxySWpMD4KPaoJLnsHwtK5Qptvj/4Q6s0t4sUxZf4=
-github.com/hashicorp/hcl/v2 v2.12.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg=
+github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
+github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/hcl/v2 v2.13.0 h1:0Apadu1w6M11dyGFxWnmhhcMjkbAiKCv7G1r/2QgCNc=
+github.com/hashicorp/hcl/v2 v2.13.0/go.mod h1:e4z5nxYlWNPdDSNYX+ph14EvWYMFm3eP0zIUqPc2jr0=
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-config-inspect v0.0.0-20191212124732-c6ae6269b9d7 h1:Pc5TCv9mbxFN6UVX0LH6CpQrdTM5YjbVI2w15237Pjk=
-github.com/hashicorp/terraform-config-inspect v0.0.0-20191212124732-c6ae6269b9d7/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A=
-github.com/hashicorp/terraform-exec v0.13.3/go.mod h1:SSg6lbUsVB3DmFyCPjBPklqf6EYGX0TlQ6QTxOlikDU=
-github.com/hashicorp/terraform-json v0.10.0/go.mod h1:3defM4kkMfttwiE7VakJDwCd4R+umhSQnvJwORXbprE=
-github.com/hashicorp/terraform-plugin-sdk v1.17.2 h1:V7DUR3yBWFrVB9z3ddpY7kiYVSsq4NYR67NiTs93NQo=
-github.com/hashicorp/terraform-plugin-sdk v1.17.2/go.mod h1:wkvldbraEMkz23NxkkAsFS88A1R9eUiooiaUZyS6TLw=
-github.com/hashicorp/terraform-plugin-test/v2 v2.2.1/go.mod h1:eZ9JL3O69Cb71Skn6OhHyj17sLmHRb+H6VrDcJjKrYU=
+github.com/hashicorp/terraform-plugin-go v0.11.0 h1:YXsvSCx7GbQO5jIUQd77FesqmIBxgSvYAtAX1NqErTk=
+github.com/hashicorp/terraform-plugin-go v0.11.0/go.mod h1:aphXBG8qtQH0yF1waMRlaw/3G+ZFlR/6Artnvt1QEDE=
+github.com/hashicorp/terraform-plugin-log v0.5.0 h1:2/5mE8+e0152+cxZ4QqZ2Ai8o0LPvXS9ZPTIPCvsg1g=
+github.com/hashicorp/terraform-plugin-log v0.5.0/go.mod h1:p4R1jWBXRTvL4odmEkFfDdhUjHf9zcs/BCoNHAc7IK4=
+github.com/hashicorp/terraform-plugin-sdk/v2 v2.18.0 h1:/cdI5di5XA+N80gXzXF4YcHq36DprBskubk6Z8i26ZQ=
+github.com/hashicorp/terraform-plugin-sdk/v2 v2.18.0/go.mod h1:L3SHkD/Q8zPVgXviQmpVwy9nKwpXXZscVIpVEnQ/T50=
+github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c h1:D8aRO6+mTqHfLsK/BC3j5OAoogv1WLRWzY1AaTo3rBg=
+github.com/hashicorp/terraform-registry-address v0.0.0-20220623143253-7d51757b572c/go.mod h1:Wn3Na71knbXc1G8Lh+yu/dQWWJeFQEpDeJMtWMtlmNI=
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0=
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg=
-github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
-github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 h1:xixZ2bWeofWV68J+x6AzmKuVM/JWCQwkWm6GW/MUR6I=
github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/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 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
-github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
-github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
-github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
-github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
-github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
-github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
-github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
-github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.15.5 h1:qyCLMz2JCrKADihKOh9FxnW3houKeNsp2h5OEz0QSEA=
-github.com/klauspost/compress v1.15.5/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -344,180 +110,57 @@ 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 v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
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/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
-github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
-github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
-github.com/mitchellh/cli v1.1.3 h1:xrX6lWnp1wgXZ65TGY2SB5URdQYcXu6VILdxDf5NttQ=
-github.com/mitchellh/cli v1.1.3/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ=
-github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
-github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
-github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
-github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
-github.com/mitchellh/go-testing-interface v1.0.4/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU=
github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8=
-github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
-github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0=
github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0=
-github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/nsf/jsondiff v0.0.0-20200515183724-f29ed568f4ce h1:RPclfga2SEJmgMmz2k+Mg7cowZ8yv4Trqw9UsJby758=
github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go=
github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
-github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
-github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-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/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.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
-github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
-github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
-github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
-github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
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/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=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8=
-github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/vmihailenco/msgpack v3.3.3+incompatible h1:wapg9xDUZDzGCNFlwc5SqI1rvcciqcxEHac4CYj89xI=
+github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
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/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc=
github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
-github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
-github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
-github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
-github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
-github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
-github.com/zclconf/go-cty v1.8.2/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
github.com/zclconf/go-cty v1.10.0 h1:mp9ZXQeIcN8kAwuqorjH+Q+njbJKjLrvB2yIh4q7U+0=
github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
-github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
-github.com/zclconf/go-cty-yaml v1.0.2 h1:dNyg4QLTrv2IfJpm7Wtxi55ed5gLGOlPrZ6kMd51hY0=
-github.com/zclconf/go-cty-yaml v1.0.2/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0=
-go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
-go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8=
-golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
-golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
-golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
-golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
-golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
-golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
-golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-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.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -525,391 +168,78 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r
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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
-golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220526153639-5463443f8c37/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA=
-golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0=
+golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
-golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401 h1:zwrSfklXn0gxyLRX/aR+q6cgHbV/ItVyzbPlbA+dkAw=
-golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
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=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew=
+golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
-golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
-golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
-golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
-golang.org/x/tools v0.0.0-20201028111035-eafbe7b904eb/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-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=
-golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
-golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
-google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
-google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
-google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
-google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
-google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
-google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
-google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
-google.golang.org/api v0.34.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
-google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
-google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
-google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
-google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
-google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
-google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
-google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
-google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
-google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
-google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
-google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
-google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
-google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
-google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
-google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
-google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
-google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
-google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
-google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
-google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
-google.golang.org/api v0.82.0 h1:h6EGeZuzhoKSS7BUznzkW+2wHZ+4Ubd6rsVvvh3dRkw=
-google.golang.org/api v0.82.0/go.mod h1:Ld58BeTlL9DIYr2M2ajvoSqmGLei0BMn+kVBmkam1os=
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.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
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/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
-google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
-google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
-google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
-google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
-google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
-google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
-google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
-google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
-google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
-google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
-google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
-google.golang.org/genproto v0.0.0-20220527130721-00d5c0f3be58/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
-google.golang.org/genproto v0.0.0-20220601144221-27df5f98adab h1:YYs5818GyaApJxN5iyBnJxr7FUDrKpcXX+GaPrv0Cms=
-google.golang.org/genproto v0.0.0-20220601144221-27df5f98adab/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
-google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
+google.golang.org/genproto v0.0.0-20220713161829-9c7dac0a6568 h1:iKx0VcikTdB4xj9Ho1Opn9AKzWFknYDE7oW/KBWZf9g=
+google.golang.org/genproto v0.0.0-20220713161829-9c7dac0a6568/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
-google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
-google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
-google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
-google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
-google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
-google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
+google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
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=
@@ -918,7 +248,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
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=
@@ -927,29 +256,12 @@ google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscL
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
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=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
-gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
-honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
-rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
diff --git a/main.go b/main.go
index 5acd877c..d7f39b90 100644
--- a/main.go
+++ b/main.go
@@ -5,15 +5,25 @@
package main
import (
+ "flag"
"github.com/bpg/terraform-provider-proxmox/proxmoxtf"
- "github.com/hashicorp/terraform-plugin-sdk/plugin"
- "github.com/hashicorp/terraform-plugin-sdk/terraform"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/plugin"
)
func main() {
- plugin.Serve(&plugin.ServeOpts{
- ProviderFunc: func() terraform.ResourceProvider {
+ var debug bool
+
+ flag.BoolVar(&debug, "debug", false, "set to true to run the provider with support for debuggers like delve")
+ flag.Parse()
+
+ opts := &plugin.ServeOpts{
+ Debug: debug,
+ ProviderAddr: "registry.terraform.io/example-namespace/example",
+ ProviderFunc: func() *schema.Provider {
return proxmoxtf.Provider()
},
- })
+ }
+
+ plugin.Serve(opts)
}
diff --git a/proxmox/common_types.go b/proxmox/common_types.go
index 7df3c9bd..d2706e06 100644
--- a/proxmox/common_types.go
+++ b/proxmox/common_types.go
@@ -46,7 +46,7 @@ func (r CustomBool) MarshalJSON() ([]byte, error) {
// UnmarshalJSON converts a JSON value to a boolean.
func (r *CustomBool) UnmarshalJSON(b []byte) error {
s := string(b)
- *r = CustomBool(s == "1" || s == "true")
+ *r = s == "1" || s == "true"
return nil
}
diff --git a/proxmox/virtual_environment_acl.go b/proxmox/virtual_environment_acl.go
index f7d21496..f76858e5 100644
--- a/proxmox/virtual_environment_acl.go
+++ b/proxmox/virtual_environment_acl.go
@@ -5,21 +5,22 @@
package proxmox
import (
+ "context"
"errors"
"sort"
)
// GetACL retrieves the access control list.
-func (c *VirtualEnvironmentClient) GetACL() ([]*VirtualEnvironmentACLGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetACL(ctx context.Context) ([]*VirtualEnvironmentACLGetResponseData, error) {
resBody := &VirtualEnvironmentACLGetResponseBody{}
- err := c.DoRequest(hmGET, "access/acl", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "access/acl", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -30,6 +31,6 @@ func (c *VirtualEnvironmentClient) GetACL() ([]*VirtualEnvironmentACLGetResponse
}
// UpdateACL updates the access control list.
-func (c *VirtualEnvironmentClient) UpdateACL(d *VirtualEnvironmentACLUpdateRequestBody) error {
- return c.DoRequest(hmPUT, "access/acl", d, nil)
+func (c *VirtualEnvironmentClient) UpdateACL(ctx context.Context, d *VirtualEnvironmentACLUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, "access/acl", d, nil)
}
diff --git a/proxmox/virtual_environment_authentication.go b/proxmox/virtual_environment_authentication.go
index e6d17de2..099d28cf 100644
--- a/proxmox/virtual_environment_authentication.go
+++ b/proxmox/virtual_environment_authentication.go
@@ -44,7 +44,7 @@ func (c *VirtualEnvironmentClient) Authenticate(reset bool) error {
req, err := http.NewRequest(hmPOST, fmt.Sprintf("%s/%s/access/ticket", c.Endpoint, basePathJSONAPI), reqBody)
if err != nil {
- return errors.New("Failed to create authentication request")
+ return errors.New("failed to create authentication request")
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
@@ -52,7 +52,7 @@ func (c *VirtualEnvironmentClient) Authenticate(reset bool) error {
res, err := c.httpClient.Do(req)
if err != nil {
- return errors.New("Failed to retrieve authentication response")
+ return errors.New("failed to retrieve authentication response")
}
err = c.ValidateResponseCode(res)
@@ -65,23 +65,23 @@ func (c *VirtualEnvironmentClient) Authenticate(reset bool) error {
err = json.NewDecoder(res.Body).Decode(&resBody)
if err != nil {
- return errors.New("Failed to decode authentication response")
+ return errors.New("failed to decode authentication response")
}
if resBody.Data == nil {
- return errors.New("The server did not include a data object in the authentication response")
+ return errors.New("the server did not include a data object in the authentication response")
}
if resBody.Data.CSRFPreventionToken == nil {
- return errors.New("The server did not include a CSRF prevention token in the authentication response")
+ return errors.New("the server did not include a CSRF prevention token in the authentication response")
}
if resBody.Data.Ticket == nil {
- return errors.New("The server did not include a ticket in the authentication response")
+ return errors.New("the server did not include a ticket in the authentication response")
}
if resBody.Data.Username == "" {
- return errors.New("The server did not include the username in the authentication response")
+ return errors.New("the server did not include the username in the authentication response")
}
c.authenticationData = resBody.Data
diff --git a/proxmox/virtual_environment_certificate.go b/proxmox/virtual_environment_certificate.go
index 4e9f6ce2..e5dcbb02 100644
--- a/proxmox/virtual_environment_certificate.go
+++ b/proxmox/virtual_environment_certificate.go
@@ -5,33 +5,34 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
)
// DeleteCertificate deletes the custom certificate for a node.
-func (c *VirtualEnvironmentClient) DeleteCertificate(nodeName string, d *VirtualEnvironmentCertificateDeleteRequestBody) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("nodes/%s/certificates/custom", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) DeleteCertificate(ctx context.Context, nodeName string, d *VirtualEnvironmentCertificateDeleteRequestBody) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("nodes/%s/certificates/custom", url.PathEscape(nodeName)), d, nil)
}
// ListCertificates retrieves the list of certificates for a node.
-func (c *VirtualEnvironmentClient) ListCertificates(nodeName string) (*[]VirtualEnvironmentCertificateListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListCertificates(ctx context.Context, nodeName string) (*[]VirtualEnvironmentCertificateListResponseData, error) {
resBody := &VirtualEnvironmentCertificateListResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/certificates/info", url.PathEscape(nodeName)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/certificates/info", url.PathEscape(nodeName)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// UpdateCertificate updates the custom certificate for a node.
-func (c *VirtualEnvironmentClient) UpdateCertificate(nodeName string, d *VirtualEnvironmentCertificateUpdateRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/certificates/custom", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateCertificate(ctx context.Context, nodeName string, d *VirtualEnvironmentCertificateUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/certificates/custom", url.PathEscape(nodeName)), d, nil)
}
diff --git a/proxmox/virtual_environment_client.go b/proxmox/virtual_environment_client.go
index c6045d39..d1a6b296 100644
--- a/proxmox/virtual_environment_client.go
+++ b/proxmox/virtual_environment_client.go
@@ -6,13 +6,14 @@ package proxmox
import (
"bytes"
+ "context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
"io"
"io/ioutil"
- "log"
"net/http"
"net/url"
"strings"
@@ -22,22 +23,22 @@ import (
// NewVirtualEnvironmentClient creates and initializes a VirtualEnvironmentClient instance.
func NewVirtualEnvironmentClient(endpoint, username, password, otp string, insecure bool) (*VirtualEnvironmentClient, error) {
- url, err := url.ParseRequestURI(endpoint)
+ u, err := url.ParseRequestURI(endpoint)
if err != nil {
- return nil, errors.New("You must specify a valid endpoint for the Proxmox Virtual Environment API (valid: https://host:port/)")
+ return nil, errors.New("you must specify a valid endpoint for the Proxmox Virtual Environment API (valid: https://host:port/)")
}
- if url.Scheme != "https" {
- return nil, errors.New("You must specify a secure endpoint for the Proxmox Virtual Environment API (valid: https://host:port/)")
+ if u.Scheme != "https" {
+ return nil, errors.New("you must specify a secure endpoint for the Proxmox Virtual Environment API (valid: https://host:port/)")
}
if password == "" {
- return nil, errors.New("You must specify a password for the Proxmox Virtual Environment API")
+ return nil, errors.New("you must specify a password for the Proxmox Virtual Environment API")
}
if username == "" {
- return nil, errors.New("You must specify a username for the Proxmox Virtual Environment API")
+ return nil, errors.New("you must specify a username for the Proxmox Virtual Environment API")
}
var pOTP *string
@@ -55,7 +56,7 @@ func NewVirtualEnvironmentClient(endpoint, username, password, otp string, insec
}
return &VirtualEnvironmentClient{
- Endpoint: strings.TrimRight(url.String(), "/"),
+ Endpoint: strings.TrimRight(u.String(), "/"),
Insecure: insecure,
OTP: pOTP,
Password: password,
@@ -65,11 +66,14 @@ func NewVirtualEnvironmentClient(endpoint, username, password, otp string, insec
}
// DoRequest performs a HTTP request against a JSON API endpoint.
-func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody interface{}, responseBody interface{}) error {
+func (c *VirtualEnvironmentClient) DoRequest(ctx context.Context, method, path string, requestBody, responseBody interface{}) error {
var reqBodyReader io.Reader
var reqContentLength *int64
- log.Printf("[DEBUG] Performing HTTP %s request (path: %s)", method, path)
+ tflog.Debug(ctx, "performing HTTP request", map[string]interface{}{
+ "method": method,
+ "path": path,
+ })
modifiedPath := path
reqBodyType := ""
@@ -83,17 +87,24 @@ func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody in
reqBodyType = fmt.Sprintf("multipart/form-data; boundary=%s", multipartData.Boundary)
reqContentLength = multipartData.Size
- log.Printf("[DEBUG] Added multipart request body to HTTP %s request (path: %s)", method, modifiedPath)
+ tflog.Debug(ctx, "added multipart request body to HTTP request", map[string]interface{}{
+ "method": method,
+ "path": modifiedPath,
+ })
+
} else if pipedBody {
reqBodyReader = pipedBodyReader
- log.Printf("[DEBUG] Added piped request body to HTTP %s request (path: %s)", method, modifiedPath)
+ tflog.Debug(ctx, "added piped request body to HTTP request", map[string]interface{}{
+ "method": method,
+ "path": modifiedPath,
+ })
} else {
v, err := query.Values(requestBody)
if err != nil {
- fErr := fmt.Errorf("Failed to encode HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
- log.Printf("[DEBUG] WARNING: %s", fErr.Error())
+ fErr := fmt.Errorf("failed to encode HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
+ tflog.Warn(ctx, fErr.Error())
return fErr
}
@@ -111,7 +122,11 @@ func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody in
reqBodyType = "application/x-www-form-urlencoded"
}
- log.Printf("[DEBUG] Added request body to HTTP %s request (path: %s) - Body: %s", method, modifiedPath, encodedValues)
+ tflog.Debug(ctx, "added request body to HTTP request", map[string]interface{}{
+ "method": method,
+ "path": modifiedPath,
+ "encodedValues": encodedValues,
+ })
}
}
} else {
@@ -121,8 +136,8 @@ func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody in
req, err := http.NewRequest(method, fmt.Sprintf("%s/%s/%s", c.Endpoint, basePathJSONAPI, modifiedPath), reqBodyReader)
if err != nil {
- fErr := fmt.Errorf("Failed to create HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
- log.Printf("[DEBUG] WARNING: %s", fErr.Error())
+ fErr := fmt.Errorf("failed to create HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
+ tflog.Warn(ctx, fErr.Error())
return fErr
}
@@ -139,24 +154,30 @@ func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody in
err = c.AuthenticateRequest(req)
if err != nil {
- log.Printf("[DEBUG] WARNING: %s", err.Error())
+ tflog.Warn(ctx, err.Error())
return err
}
res, err := c.httpClient.Do(req)
if err != nil {
- fErr := fmt.Errorf("Failed to perform HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
- log.Printf("[DEBUG] WARNING: %s", fErr.Error())
+ fErr := fmt.Errorf("failed to perform HTTP %s request (path: %s) - Reason: %s", method, modifiedPath, err.Error())
+ tflog.Warn(ctx, fErr.Error())
return fErr
}
- defer res.Body.Close()
+ defer func(Body io.ReadCloser) {
+ err := Body.Close()
+ if err != nil {
+ tflog.Error(ctx, "failed to close the response body", map[string]interface{}{
+ "error": err.Error(),
+ })
+ }
+ }(res.Body)
err = c.ValidateResponseCode(res)
-
if err != nil {
- log.Printf("[DEBUG] WARNING: %s", err.Error())
+ tflog.Warn(ctx, err.Error())
return err
}
@@ -164,13 +185,15 @@ func (c *VirtualEnvironmentClient) DoRequest(method, path string, requestBody in
err = json.NewDecoder(res.Body).Decode(responseBody)
if err != nil {
- fErr := fmt.Errorf("Failed to decode HTTP %s response (path: %s) - Reason: %s", method, modifiedPath, err.Error())
- log.Printf("[DEBUG] WARNING: %s", fErr.Error())
+ fErr := fmt.Errorf("failed to decode HTTP %s response (path: %s) - Reason: %s", method, modifiedPath, err.Error())
+ tflog.Warn(ctx, fErr.Error())
return fErr
}
} else {
data, _ := ioutil.ReadAll(res.Body)
- log.Printf("[DEBUG] WARNING: Unhandled HTTP response body: %s", string(data))
+ tflog.Warn(ctx, "unhandled HTTP response body", map[string]interface{}{
+ "data": string(data),
+ })
}
return nil
@@ -185,7 +208,7 @@ func (c *VirtualEnvironmentClient) ValidateResponseCode(res *http.Response) erro
err := json.NewDecoder(res.Body).Decode(errRes)
if err == nil && errRes.Errors != nil {
- errList := []string{}
+ var errList []string
for k, v := range *errRes.Errors {
errList = append(errList, fmt.Sprintf("%s: %s", k, strings.TrimRight(v, "\n\r")))
@@ -194,7 +217,7 @@ func (c *VirtualEnvironmentClient) ValidateResponseCode(res *http.Response) erro
status = fmt.Sprintf("%s (%s)", status, strings.Join(errList, " - "))
}
- return fmt.Errorf("Received an HTTP %d response - Reason: %s", res.StatusCode, status)
+ return fmt.Errorf("received an HTTP %d response - Reason: %s", res.StatusCode, status)
}
return nil
diff --git a/proxmox/virtual_environment_cluster.go b/proxmox/virtual_environment_cluster.go
index ec9567b2..939cbc27 100644
--- a/proxmox/virtual_environment_cluster.go
+++ b/proxmox/virtual_environment_cluster.go
@@ -5,24 +5,25 @@
package proxmox
import (
+ "context"
"errors"
)
// GetClusterNextID retrieves the next free VM identifier for the cluster.
-func (c *VirtualEnvironmentClient) GetClusterNextID(vmID *int) (*int, error) {
+func (c *VirtualEnvironmentClient) GetClusterNextID(ctx context.Context, vmID *int) (*int, error) {
reqBody := &VirtualEnvironmentClusterNextIDRequestBody{
VMID: vmID,
}
resBody := &VirtualEnvironmentClusterNextIDResponseBody{}
- err := c.DoRequest(hmGET, "cluster/nextid", reqBody, resBody)
+ err := c.DoRequest(ctx, hmGET, "cluster/nextid", reqBody, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return (*int)(resBody.Data), nil
diff --git a/proxmox/virtual_environment_cluster_alias.go b/proxmox/virtual_environment_cluster_alias.go
index 2565a669..4272b96b 100644
--- a/proxmox/virtual_environment_cluster_alias.go
+++ b/proxmox/virtual_environment_cluster_alias.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -12,42 +13,42 @@ import (
)
// CreateAlias create an alias
-func (c *VirtualEnvironmentClient) CreateAlias(d *VirtualEnvironmentClusterAliasCreateRequestBody) error {
- return c.DoRequest(hmPOST, "cluster/firewall/aliases", d, nil)
+func (c *VirtualEnvironmentClient) CreateAlias(ctx context.Context, d *VirtualEnvironmentClusterAliasCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "cluster/firewall/aliases", d, nil)
}
// DeleteAlias delete an alias
-func (c *VirtualEnvironmentClient) DeleteAlias(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteAlias(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), nil, nil)
}
// GetAlias retrieves an alias
-func (c *VirtualEnvironmentClient) GetAlias(id string) (*VirtualEnvironmentClusterAliasGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetAlias(ctx context.Context, id string) (*VirtualEnvironmentClusterAliasGetResponseData, error) {
resBody := &VirtualEnvironmentClusterAliasGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
-// ListAlias retrieves a list of aliases.
-func (c *VirtualEnvironmentClient) ListAliases() ([]*VirtualEnvironmentClusterAliasGetResponseData, error) {
+// ListAliases retrieves a list of aliases.
+func (c *VirtualEnvironmentClient) ListAliases(ctx context.Context) ([]*VirtualEnvironmentClusterAliasGetResponseData, error) {
resBody := &VirtualEnvironmentClusterAliasListResponseBody{}
- err := c.DoRequest(hmGET, "cluster/firewall/aliases", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "cluster/firewall/aliases", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -58,6 +59,6 @@ func (c *VirtualEnvironmentClient) ListAliases() ([]*VirtualEnvironmentClusterAl
}
// UpdateAlias updates an alias.
-func (c *VirtualEnvironmentClient) UpdateAlias(id string, d *VirtualEnvironmentClusterAliasUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateAlias(ctx context.Context, id string, d *VirtualEnvironmentClusterAliasUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("cluster/firewall/aliases/%s", url.PathEscape(id)), d, nil)
}
diff --git a/proxmox/virtual_environment_cluster_ipset.go b/proxmox/virtual_environment_cluster_ipset.go
index b158329c..9bc77205 100644
--- a/proxmox/virtual_environment_cluster_ipset.go
+++ b/proxmox/virtual_environment_cluster_ipset.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -12,57 +13,57 @@ import (
)
// CreateIPSet create an IPSet
-func (c *VirtualEnvironmentClient) CreateIPSet(d *VirtualEnvironmentClusterIPSetCreateRequestBody) error {
- return c.DoRequest(hmPOST, "cluster/firewall/ipset", d, nil)
+func (c *VirtualEnvironmentClient) CreateIPSet(ctx context.Context, d *VirtualEnvironmentClusterIPSetCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "cluster/firewall/ipset", d, nil)
}
-// Add IP or Network to IPSet
-func (c *VirtualEnvironmentClient) AddCIDRToIPSet(id string, d *VirtualEnvironmentClusterIPSetGetResponseData) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("cluster/firewall/ipset/%s/", url.PathEscape(id)), d, nil)
+// AddCIDRToIPSet adds IP or Network to IPSet
+func (c *VirtualEnvironmentClient) AddCIDRToIPSet(ctx context.Context, id string, d *VirtualEnvironmentClusterIPSetGetResponseData) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("cluster/firewall/ipset/%s/", url.PathEscape(id)), d, nil)
}
// UpdateIPSet updates an IPSet.
-func (c *VirtualEnvironmentClient) UpdateIPSet(d *VirtualEnvironmentClusterIPSetUpdateRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprint("cluster/firewall/ipset/"), d, nil)
+func (c *VirtualEnvironmentClient) UpdateIPSet(ctx context.Context, d *VirtualEnvironmentClusterIPSetUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprint("cluster/firewall/ipset/"), d, nil)
}
// DeleteIPSet delete an IPSet
-func (c *VirtualEnvironmentClient) DeleteIPSet(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("cluster/firewall/ipset/%s", url.PathEscape(id)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteIPSet(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("cluster/firewall/ipset/%s", url.PathEscape(id)), nil, nil)
}
// DeleteIPSetContent remove IP or Network from IPSet.
-func (c *VirtualEnvironmentClient) DeleteIPSetContent(id string, cidr string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("cluster/firewall/ipset/%s/%s", url.PathEscape(id), url.PathEscape(cidr)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteIPSetContent(ctx context.Context, id string, cidr string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("cluster/firewall/ipset/%s/%s", url.PathEscape(id), url.PathEscape(cidr)), nil, nil)
}
// GetListIPSetContent retrieve a list of IPSet content
-func (c *VirtualEnvironmentClient) GetListIPSetContent(id string) ([]*VirtualEnvironmentClusterIPSetGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetListIPSetContent(ctx context.Context, id string) ([]*VirtualEnvironmentClusterIPSetGetResponseData, error) {
resBody := &VirtualEnvironmentClusterIPSetGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("cluster/firewall/ipset/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("cluster/firewall/ipset/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// GetListIPSets retrieves list of IPSets.
-func (c *VirtualEnvironmentClient) GetListIPSets() (*VirtualEnvironmentClusterIPSetListResponseBody, error) {
+func (c *VirtualEnvironmentClient) GetListIPSets(ctx context.Context) (*VirtualEnvironmentClusterIPSetListResponseBody, error) {
resBody := &VirtualEnvironmentClusterIPSetListResponseBody{}
- err := c.DoRequest(hmGET, "cluster/firewall/ipset", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "cluster/firewall/ipset", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
diff --git a/proxmox/virtual_environment_cluster_ipset_types.go b/proxmox/virtual_environment_cluster_ipset_types.go
index 2f79e93a..3dba5ae6 100644
--- a/proxmox/virtual_environment_cluster_ipset_types.go
+++ b/proxmox/virtual_environment_cluster_ipset_types.go
@@ -38,7 +38,7 @@ type VirtualEnvironmentClusterIPSetUpdateRequestBody struct {
Name string `json:"name" url:"name"`
}
-// VirtualEnvironmentClusterIPSetGetResponseData contains list of IPSets from
+// VirtualEnvironmentClusterIPSetListResponseData contains list of IPSets from
type VirtualEnvironmentClusterIPSetListResponseData struct {
Comment *string `json:"comment,omitempty" url:"comment,omitempty"`
Name string `json:"name" url:"name"`
diff --git a/proxmox/virtual_environment_container.go b/proxmox/virtual_environment_container.go
index dd2f729d..6444a7ed 100644
--- a/proxmox/virtual_environment_container.go
+++ b/proxmox/virtual_environment_container.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -13,79 +14,79 @@ import (
)
// CloneContainer clones a container.
-func (c *VirtualEnvironmentClient) CloneContainer(nodeName string, vmID int, d *VirtualEnvironmentContainerCloneRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/clone", url.PathEscape(nodeName), vmID), d, nil)
+func (c *VirtualEnvironmentClient) CloneContainer(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentContainerCloneRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/clone", url.PathEscape(nodeName), vmID), d, nil)
}
// CreateContainer creates a container.
-func (c *VirtualEnvironmentClient) CreateContainer(nodeName string, d *VirtualEnvironmentContainerCreateRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) CreateContainer(ctx context.Context, nodeName string, d *VirtualEnvironmentContainerCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc", url.PathEscape(nodeName)), d, nil)
}
// DeleteContainer deletes a container.
-func (c *VirtualEnvironmentClient) DeleteContainer(nodeName string, vmID int) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("nodes/%s/lxc/%d", url.PathEscape(nodeName), vmID), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteContainer(ctx context.Context, nodeName string, vmID int) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("nodes/%s/lxc/%d", url.PathEscape(nodeName), vmID), nil, nil)
}
// GetContainer retrieves a container.
-func (c *VirtualEnvironmentClient) GetContainer(nodeName string, vmID int) (*VirtualEnvironmentContainerGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetContainer(ctx context.Context, nodeName string, vmID int) (*VirtualEnvironmentContainerGetResponseData, error) {
resBody := &VirtualEnvironmentContainerGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/lxc/%d/config", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/lxc/%d/config", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// GetContainerStatus retrieves the status for a container.
-func (c *VirtualEnvironmentClient) GetContainerStatus(nodeName string, vmID int) (*VirtualEnvironmentContainerGetStatusResponseData, error) {
+func (c *VirtualEnvironmentClient) GetContainerStatus(ctx context.Context, nodeName string, vmID int) (*VirtualEnvironmentContainerGetStatusResponseData, error) {
resBody := &VirtualEnvironmentContainerGetStatusResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/lxc/%d/status/current", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/lxc/%d/status/current", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// RebootContainer reboots a container.
-func (c *VirtualEnvironmentClient) RebootContainer(nodeName string, vmID int, d *VirtualEnvironmentContainerRebootRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/reboot", url.PathEscape(nodeName), vmID), d, nil)
+func (c *VirtualEnvironmentClient) RebootContainer(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentContainerRebootRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/reboot", url.PathEscape(nodeName), vmID), d, nil)
}
// ShutdownContainer shuts down a container.
-func (c *VirtualEnvironmentClient) ShutdownContainer(nodeName string, vmID int, d *VirtualEnvironmentContainerShutdownRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/shutdown", url.PathEscape(nodeName), vmID), d, nil)
+func (c *VirtualEnvironmentClient) ShutdownContainer(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentContainerShutdownRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/shutdown", url.PathEscape(nodeName), vmID), d, nil)
}
// StartContainer starts a container.
-func (c *VirtualEnvironmentClient) StartContainer(nodeName string, vmID int) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/start", url.PathEscape(nodeName), vmID), nil, nil)
+func (c *VirtualEnvironmentClient) StartContainer(ctx context.Context, nodeName string, vmID int) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/start", url.PathEscape(nodeName), vmID), nil, nil)
}
// StopContainer stops a container immediately.
-func (c *VirtualEnvironmentClient) StopContainer(nodeName string, vmID int) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/stop", url.PathEscape(nodeName), vmID), nil, nil)
+func (c *VirtualEnvironmentClient) StopContainer(ctx context.Context, nodeName string, vmID int) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/lxc/%d/status/stop", url.PathEscape(nodeName), vmID), nil, nil)
}
// UpdateContainer updates a container.
-func (c *VirtualEnvironmentClient) UpdateContainer(nodeName string, vmID int, d *VirtualEnvironmentContainerUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/lxc/%d/config", url.PathEscape(nodeName), vmID), d, nil)
+func (c *VirtualEnvironmentClient) UpdateContainer(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentContainerUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("nodes/%s/lxc/%d/config", url.PathEscape(nodeName), vmID), d, nil)
}
// WaitForContainerState waits for a container to reach a specific state.
-func (c *VirtualEnvironmentClient) WaitForContainerState(nodeName string, vmID int, state string, timeout int, delay int) error {
+func (c *VirtualEnvironmentClient) WaitForContainerState(ctx context.Context, nodeName string, vmID int, state string, timeout int, delay int) error {
state = strings.ToLower(state)
timeDelay := int64(delay)
@@ -95,7 +96,7 @@ func (c *VirtualEnvironmentClient) WaitForContainerState(nodeName string, vmID i
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- data, err := c.GetContainerStatus(nodeName, vmID)
+ data, err := c.GetContainerStatus(ctx, nodeName, vmID)
if err != nil {
return err
@@ -111,13 +112,17 @@ func (c *VirtualEnvironmentClient) WaitForContainerState(nodeName string, vmID i
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for container \"%d\" to enter the state \"%s\"", vmID, state)
+ return fmt.Errorf("timeout while waiting for container \"%d\" to enter the state \"%s\"", vmID, state)
}
// WaitForContainerLock waits for a container lock to be released.
-func (c *VirtualEnvironmentClient) WaitForContainerLock(nodeName string, vmID int, timeout int, delay int, ignoreErrorResponse bool) error {
+func (c *VirtualEnvironmentClient) WaitForContainerLock(ctx context.Context, nodeName string, vmID int, timeout int, delay int, ignoreErrorResponse bool) error {
timeDelay := int64(delay)
timeMax := float64(timeout)
timeStart := time.Now()
@@ -125,7 +130,7 @@ func (c *VirtualEnvironmentClient) WaitForContainerLock(nodeName string, vmID in
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- data, err := c.GetContainerStatus(nodeName, vmID)
+ data, err := c.GetContainerStatus(ctx, nodeName, vmID)
if err != nil {
if !ignoreErrorResponse {
@@ -141,7 +146,11 @@ func (c *VirtualEnvironmentClient) WaitForContainerLock(nodeName string, vmID in
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for container \"%d\" to become unlocked", vmID)
+ return fmt.Errorf("timeout while waiting for container \"%d\" to become unlocked", vmID)
}
diff --git a/proxmox/virtual_environment_container_types.go b/proxmox/virtual_environment_container_types.go
index 7bec71e3..bffad131 100644
--- a/proxmox/virtual_environment_container_types.go
+++ b/proxmox/virtual_environment_container_types.go
@@ -219,7 +219,7 @@ type VirtualEnvironmentContainerUpdateRequestBody VirtualEnvironmentContainerCre
// EncodeValues converts a VirtualEnvironmentContainerCustomFeatures struct to a URL vlaue.
func (r VirtualEnvironmentContainerCustomFeatures) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.FUSE != nil {
if *r.FUSE {
@@ -260,7 +260,7 @@ func (r VirtualEnvironmentContainerCustomFeatures) EncodeValues(key string, v *u
// EncodeValues converts a VirtualEnvironmentContainerCustomMountPoint struct to a URL vlaue.
func (r VirtualEnvironmentContainerCustomMountPoint) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.ACL != nil {
if *r.ACL {
@@ -334,7 +334,10 @@ func (r VirtualEnvironmentContainerCustomMountPoint) EncodeValues(key string, v
// EncodeValues converts a VirtualEnvironmentContainerCustomMountPointArray array to multiple URL values.
func (r VirtualEnvironmentContainerCustomMountPointArray) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
return nil
@@ -342,7 +345,7 @@ func (r VirtualEnvironmentContainerCustomMountPointArray) EncodeValues(key strin
// EncodeValues converts a VirtualEnvironmentContainerCustomNetworkInterface struct to a URL vlaue.
func (r VirtualEnvironmentContainerCustomNetworkInterface) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Bridge != nil {
values = append(values, fmt.Sprintf("bridge=%s", *r.Bridge))
@@ -414,7 +417,10 @@ func (r VirtualEnvironmentContainerCustomNetworkInterface) EncodeValues(key stri
// EncodeValues converts a VirtualEnvironmentContainerCustomNetworkInterfaceArray array to multiple URL values.
func (r VirtualEnvironmentContainerCustomNetworkInterfaceArray) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
return nil
@@ -422,7 +428,7 @@ func (r VirtualEnvironmentContainerCustomNetworkInterfaceArray) EncodeValues(key
// EncodeValues converts a VirtualEnvironmentContainerCustomRootFS struct to a URL vlaue.
func (r VirtualEnvironmentContainerCustomRootFS) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.ACL != nil {
if *r.ACL {
@@ -492,7 +498,7 @@ func (r VirtualEnvironmentContainerCustomSSHKeys) EncodeValues(key string, v *ur
// EncodeValues converts a VirtualEnvironmentContainerCustomStartupBehavior struct to a URL vlaue.
func (r VirtualEnvironmentContainerCustomStartupBehavior) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Down != nil {
values = append(values, fmt.Sprintf("down=%d", *r.Down))
@@ -541,7 +547,7 @@ func (r *VirtualEnvironmentContainerCustomFeatures) UnmarshalJSON(b []byte) erro
a := strings.Split(v[1], ";")
r.MountTypes = &a
} else {
- a := []string{}
+ var a []string
r.MountTypes = &a
}
case "nesting":
@@ -584,7 +590,7 @@ func (r *VirtualEnvironmentContainerCustomMountPoint) UnmarshalJSON(b []byte) er
a := strings.Split(v[1], ";")
r.MountOptions = &a
} else {
- a := []string{}
+ var a []string
r.MountOptions = &a
}
case "mp":
@@ -685,7 +691,7 @@ func (r *VirtualEnvironmentContainerCustomNetworkInterface) UnmarshalJSON(b []by
r.Trunks = &a
} else {
- a := []int{}
+ var a []int
r.Trunks = &a
}
case "type":
@@ -724,7 +730,7 @@ func (r *VirtualEnvironmentContainerCustomRootFS) UnmarshalJSON(b []byte) error
a := strings.Split(v[1], ";")
r.MountOptions = &a
} else {
- a := []string{}
+ var a []string
r.MountOptions = &a
}
case "quota":
diff --git a/proxmox/virtual_environment_datastores.go b/proxmox/virtual_environment_datastores.go
index 5bcbf539..9fa15922 100644
--- a/proxmox/virtual_environment_datastores.go
+++ b/proxmox/virtual_environment_datastores.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"io"
@@ -19,8 +20,8 @@ import (
)
// DeleteDatastoreFile deletes a file in a datastore.
-func (c *VirtualEnvironmentClient) DeleteDatastoreFile(nodeName, datastoreID, volumeID string) error {
- err := c.DoRequest(hmDELETE, fmt.Sprintf("nodes/%s/storage/%s/content/%s", url.PathEscape(nodeName), url.PathEscape(datastoreID), url.PathEscape(volumeID)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteDatastoreFile(ctx context.Context, nodeName, datastoreID, volumeID string) error {
+ err := c.DoRequest(ctx, hmDELETE, fmt.Sprintf("nodes/%s/storage/%s/content/%s", url.PathEscape(nodeName), url.PathEscape(datastoreID), url.PathEscape(volumeID)), nil, nil)
if err != nil {
return err
@@ -30,16 +31,16 @@ func (c *VirtualEnvironmentClient) DeleteDatastoreFile(nodeName, datastoreID, vo
}
// ListDatastoreFiles retrieves a list of the files in a datastore.
-func (c *VirtualEnvironmentClient) ListDatastoreFiles(nodeName, datastoreID string) ([]*VirtualEnvironmentDatastoreFileListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListDatastoreFiles(ctx context.Context, nodeName, datastoreID string) ([]*VirtualEnvironmentDatastoreFileListResponseData, error) {
resBody := &VirtualEnvironmentDatastoreFileListResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/storage/%s/content", url.PathEscape(nodeName), url.PathEscape(datastoreID)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/storage/%s/content", url.PathEscape(nodeName), url.PathEscape(datastoreID)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -50,16 +51,16 @@ func (c *VirtualEnvironmentClient) ListDatastoreFiles(nodeName, datastoreID stri
}
// ListDatastores retrieves a list of nodes.
-func (c *VirtualEnvironmentClient) ListDatastores(nodeName string, d *VirtualEnvironmentDatastoreListRequestBody) ([]*VirtualEnvironmentDatastoreListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListDatastores(ctx context.Context, nodeName string, d *VirtualEnvironmentDatastoreListRequestBody) ([]*VirtualEnvironmentDatastoreListResponseData, error) {
resBody := &VirtualEnvironmentDatastoreListResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/storage", url.PathEscape(nodeName)), d, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/storage", url.PathEscape(nodeName)), d, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -70,7 +71,7 @@ func (c *VirtualEnvironmentClient) ListDatastores(nodeName string, d *VirtualEnv
}
// UploadFileToDatastore uploads a file to a datastore.
-func (c *VirtualEnvironmentClient) UploadFileToDatastore(d *VirtualEnvironmentDatastoreUploadRequestBody) (*VirtualEnvironmentDatastoreUploadResponseBody, error) {
+func (c *VirtualEnvironmentClient) UploadFileToDatastore(ctx context.Context, d *VirtualEnvironmentDatastoreUploadRequestBody) (*VirtualEnvironmentDatastoreUploadResponseBody, error) {
switch d.ContentType {
case "iso", "vztmpl":
r, w := io.Pipe()
@@ -142,7 +143,7 @@ func (c *VirtualEnvironmentClient) UploadFileToDatastore(d *VirtualEnvironmentDa
}
resBody := &VirtualEnvironmentDatastoreUploadResponseBody{}
- err = c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/storage/%s/upload", url.PathEscape(d.NodeName), url.PathEscape(d.DatastoreID)), reqBody, resBody)
+ err = c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/storage/%s/upload", url.PathEscape(d.NodeName), url.PathEscape(d.DatastoreID)), reqBody, resBody)
if err != nil {
return nil, err
@@ -152,7 +153,7 @@ func (c *VirtualEnvironmentClient) UploadFileToDatastore(d *VirtualEnvironmentDa
default:
// We need to upload all other files using SFTP due to API limitations.
// Hopefully, this will not be required in future releases of Proxmox VE.
- sshClient, err := c.OpenNodeShell(d.NodeName)
+ sshClient, err := c.OpenNodeShell(ctx, d.NodeName)
if err != nil {
return nil, err
@@ -181,7 +182,7 @@ func (c *VirtualEnvironmentClient) UploadFileToDatastore(d *VirtualEnvironmentDa
datastorePath := strings.Trim(string(buf), "\000")
if datastorePath == "" {
- return nil, errors.New("Failed to determine the datastore path")
+ return nil, errors.New("failed to determine the datastore path")
}
remoteFileDir := datastorePath
diff --git a/proxmox/virtual_environment_dns.go b/proxmox/virtual_environment_dns.go
index 17e65b91..5a2ebd58 100644
--- a/proxmox/virtual_environment_dns.go
+++ b/proxmox/virtual_environment_dns.go
@@ -5,28 +5,29 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
)
// GetDNS retrieves the DNS configuration for a node.
-func (c *VirtualEnvironmentClient) GetDNS(nodeName string) (*VirtualEnvironmentDNSGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetDNS(ctx context.Context, nodeName string) (*VirtualEnvironmentDNSGetResponseData, error) {
resBody := &VirtualEnvironmentDNSGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/dns", url.PathEscape(nodeName)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/dns", url.PathEscape(nodeName)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// UpdateDNS updates the DNS configuration for a node.
-func (c *VirtualEnvironmentClient) UpdateDNS(nodeName string, d *VirtualEnvironmentDNSUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/dns", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateDNS(ctx context.Context, nodeName string, d *VirtualEnvironmentDNSUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("nodes/%s/dns", url.PathEscape(nodeName)), d, nil)
}
diff --git a/proxmox/virtual_environment_groups.go b/proxmox/virtual_environment_groups.go
index cde6fdcc..b7d278f8 100644
--- a/proxmox/virtual_environment_groups.go
+++ b/proxmox/virtual_environment_groups.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -12,26 +13,26 @@ import (
)
// CreateGroup creates an access group.
-func (c *VirtualEnvironmentClient) CreateGroup(d *VirtualEnvironmentGroupCreateRequestBody) error {
- return c.DoRequest(hmPOST, "access/groups", d, nil)
+func (c *VirtualEnvironmentClient) CreateGroup(ctx context.Context, d *VirtualEnvironmentGroupCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "access/groups", d, nil)
}
// DeleteGroup deletes an access group.
-func (c *VirtualEnvironmentClient) DeleteGroup(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteGroup(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), nil, nil)
}
// GetGroup retrieves an access group.
-func (c *VirtualEnvironmentClient) GetGroup(id string) (*VirtualEnvironmentGroupGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetGroup(ctx context.Context, id string) (*VirtualEnvironmentGroupGetResponseData, error) {
resBody := &VirtualEnvironmentGroupGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Strings(resBody.Data.Members)
@@ -40,16 +41,16 @@ func (c *VirtualEnvironmentClient) GetGroup(id string) (*VirtualEnvironmentGroup
}
// ListGroups retrieves a list of access groups.
-func (c *VirtualEnvironmentClient) ListGroups() ([]*VirtualEnvironmentGroupListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListGroups(ctx context.Context) ([]*VirtualEnvironmentGroupListResponseData, error) {
resBody := &VirtualEnvironmentGroupListResponseBody{}
- err := c.DoRequest(hmGET, "access/groups", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "access/groups", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -60,6 +61,6 @@ func (c *VirtualEnvironmentClient) ListGroups() ([]*VirtualEnvironmentGroupListR
}
// UpdateGroup updates an access group.
-func (c *VirtualEnvironmentClient) UpdateGroup(id string, d *VirtualEnvironmentGroupUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateGroup(ctx context.Context, id string, d *VirtualEnvironmentGroupUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("access/groups/%s", url.PathEscape(id)), d, nil)
}
diff --git a/proxmox/virtual_environment_hosts.go b/proxmox/virtual_environment_hosts.go
index d6522f34..a026a285 100644
--- a/proxmox/virtual_environment_hosts.go
+++ b/proxmox/virtual_environment_hosts.go
@@ -5,28 +5,29 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
)
// GetHosts retrieves the Hosts configuration for a node.
-func (c *VirtualEnvironmentClient) GetHosts(nodeName string) (*VirtualEnvironmentHostsGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetHosts(ctx context.Context, nodeName string) (*VirtualEnvironmentHostsGetResponseData, error) {
resBody := &VirtualEnvironmentHostsGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/hosts", url.PathEscape(nodeName)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/hosts", url.PathEscape(nodeName)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// UpdateHosts updates the Hosts configuration for a node.
-func (c *VirtualEnvironmentClient) UpdateHosts(nodeName string, d *VirtualEnvironmentHostsUpdateRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/hosts", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateHosts(ctx context.Context, nodeName string, d *VirtualEnvironmentHostsUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/hosts", url.PathEscape(nodeName)), d, nil)
}
diff --git a/proxmox/virtual_environment_nodes.go b/proxmox/virtual_environment_nodes.go
index b3dd78d6..590a9f26 100644
--- a/proxmox/virtual_environment_nodes.go
+++ b/proxmox/virtual_environment_nodes.go
@@ -5,8 +5,10 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
"net/url"
"sort"
"strings"
@@ -16,14 +18,21 @@ import (
)
// ExecuteNodeCommands executes commands on a given node.
-func (c *VirtualEnvironmentClient) ExecuteNodeCommands(nodeName string, commands []string) error {
- sshClient, err := c.OpenNodeShell(nodeName)
+func (c *VirtualEnvironmentClient) ExecuteNodeCommands(ctx context.Context, nodeName string, commands []string) error {
+ sshClient, err := c.OpenNodeShell(ctx, nodeName)
if err != nil {
return err
}
- defer sshClient.Close()
+ defer func(sshClient *ssh.Client) {
+ err := sshClient.Close()
+ if err != nil {
+ tflog.Error(ctx, "Failed to close ssh client", map[string]interface{}{
+ "error": err,
+ })
+ }
+ }(sshClient)
sshSession, err := sshClient.NewSession()
@@ -31,7 +40,14 @@ func (c *VirtualEnvironmentClient) ExecuteNodeCommands(nodeName string, commands
return err
}
- defer sshSession.Close()
+ defer func(sshSession *ssh.Session) {
+ err := sshSession.Close()
+ if err != nil {
+ tflog.Error(ctx, "Failed to close ssh session", map[string]interface{}{
+ "error": err,
+ })
+ }
+ }(sshSession)
output, err := sshSession.CombinedOutput(
fmt.Sprintf(
@@ -48,8 +64,8 @@ func (c *VirtualEnvironmentClient) ExecuteNodeCommands(nodeName string, commands
}
// GetNodeIP retrieves the IP address of a node.
-func (c *VirtualEnvironmentClient) GetNodeIP(nodeName string) (*string, error) {
- networkDevices, err := c.ListNodeNetworkDevices(nodeName)
+func (c *VirtualEnvironmentClient) GetNodeIP(ctx context.Context, nodeName string) (*string, error) {
+ networkDevices, err := c.ListNodeNetworkDevices(ctx, nodeName)
if err != nil {
return nil, err
@@ -65,7 +81,7 @@ func (c *VirtualEnvironmentClient) GetNodeIP(nodeName string) (*string, error) {
}
if nodeAddress == "" {
- return nil, fmt.Errorf("Failed to determine the IP address of node \"%s\"", nodeName)
+ return nil, fmt.Errorf("failed to determine the IP address of node \"%s\"", nodeName)
}
nodeAddressParts := strings.Split(nodeAddress, "/")
@@ -74,48 +90,48 @@ func (c *VirtualEnvironmentClient) GetNodeIP(nodeName string) (*string, error) {
}
// GetNodeTime retrieves the time information for a node.
-func (c *VirtualEnvironmentClient) GetNodeTime(nodeName string) (*VirtualEnvironmentNodeGetTimeResponseData, error) {
+func (c *VirtualEnvironmentClient) GetNodeTime(ctx context.Context, nodeName string) (*VirtualEnvironmentNodeGetTimeResponseData, error) {
resBody := &VirtualEnvironmentNodeGetTimeResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/time", url.PathEscape(nodeName)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/time", url.PathEscape(nodeName)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// GetNodeTaskStatus retrieves the status of a node task.
-func (c *VirtualEnvironmentClient) GetNodeTaskStatus(nodeName string, upid string) (*VirtualEnvironmentNodeGetTaskStatusResponseData, error) {
+func (c *VirtualEnvironmentClient) GetNodeTaskStatus(ctx context.Context, nodeName string, upid string) (*VirtualEnvironmentNodeGetTaskStatusResponseData, error) {
resBody := &VirtualEnvironmentNodeGetTaskStatusResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/tasks/%s/status", url.PathEscape(nodeName), url.PathEscape(upid)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/tasks/%s/status", url.PathEscape(nodeName), url.PathEscape(upid)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// ListNodeNetworkDevices retrieves a list of network devices for a specific nodes.
-func (c *VirtualEnvironmentClient) ListNodeNetworkDevices(nodeName string) ([]*VirtualEnvironmentNodeNetworkDeviceListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListNodeNetworkDevices(ctx context.Context, nodeName string) ([]*VirtualEnvironmentNodeNetworkDeviceListResponseData, error) {
resBody := &VirtualEnvironmentNodeNetworkDeviceListResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/network", url.PathEscape(nodeName)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/network", url.PathEscape(nodeName)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -126,16 +142,16 @@ func (c *VirtualEnvironmentClient) ListNodeNetworkDevices(nodeName string) ([]*V
}
// ListNodes retrieves a list of nodes.
-func (c *VirtualEnvironmentClient) ListNodes() ([]*VirtualEnvironmentNodeListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListNodes(ctx context.Context) ([]*VirtualEnvironmentNodeListResponseData, error) {
resBody := &VirtualEnvironmentNodeListResponseBody{}
- err := c.DoRequest(hmGET, "nodes", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "nodes", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -146,8 +162,8 @@ func (c *VirtualEnvironmentClient) ListNodes() ([]*VirtualEnvironmentNodeListRes
}
// OpenNodeShell establishes a new SSH connection to a node.
-func (c *VirtualEnvironmentClient) OpenNodeShell(nodeName string) (*ssh.Client, error) {
- nodeAddress, err := c.GetNodeIP(nodeName)
+func (c *VirtualEnvironmentClient) OpenNodeShell(ctx context.Context, nodeName string) (*ssh.Client, error) {
+ nodeAddress, err := c.GetNodeIP(ctx, nodeName)
if err != nil {
return nil, err
@@ -171,12 +187,12 @@ func (c *VirtualEnvironmentClient) OpenNodeShell(nodeName string) (*ssh.Client,
}
// UpdateNodeTime updates the time on a node.
-func (c *VirtualEnvironmentClient) UpdateNodeTime(nodeName string, d *VirtualEnvironmentNodeUpdateTimeRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/time", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateNodeTime(ctx context.Context, nodeName string, d *VirtualEnvironmentNodeUpdateTimeRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("nodes/%s/time", url.PathEscape(nodeName)), d, nil)
}
// WaitForNodeTask waits for a specific node task to complete.
-func (c *VirtualEnvironmentClient) WaitForNodeTask(nodeName string, upid string, timeout int, delay int) error {
+func (c *VirtualEnvironmentClient) WaitForNodeTask(ctx context.Context, nodeName string, upid string, timeout int, delay int) error {
timeDelay := int64(delay)
timeMax := float64(timeout)
timeStart := time.Now()
@@ -184,7 +200,7 @@ func (c *VirtualEnvironmentClient) WaitForNodeTask(nodeName string, upid string,
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- status, err := c.GetNodeTaskStatus(nodeName, upid)
+ status, err := c.GetNodeTaskStatus(ctx, nodeName, upid)
if err != nil {
return err
@@ -192,7 +208,7 @@ func (c *VirtualEnvironmentClient) WaitForNodeTask(nodeName string, upid string,
if status.Status != "running" {
if status.ExitCode != "OK" {
- return fmt.Errorf("Task \"%s\" on node \"%s\" failed to complete with error: %s", upid, nodeName, status.ExitCode)
+ return fmt.Errorf("task \"%s\" on node \"%s\" failed to complete with error: %s", upid, nodeName, status.ExitCode)
}
return nil
}
@@ -203,7 +219,11 @@ func (c *VirtualEnvironmentClient) WaitForNodeTask(nodeName string, upid string,
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for task \"%s\" on node \"%s\" to complete", upid, nodeName)
+ return fmt.Errorf("timeout while waiting for task \"%s\" on node \"%s\" to complete", upid, nodeName)
}
diff --git a/proxmox/virtual_environment_pools.go b/proxmox/virtual_environment_pools.go
index 1050a283..bc42560b 100644
--- a/proxmox/virtual_environment_pools.go
+++ b/proxmox/virtual_environment_pools.go
@@ -5,33 +5,34 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
"sort"
)
-// CreatePool creates an pool.
-func (c *VirtualEnvironmentClient) CreatePool(d *VirtualEnvironmentPoolCreateRequestBody) error {
- return c.DoRequest(hmPOST, "pools", d, nil)
+// CreatePool creates a pool.
+func (c *VirtualEnvironmentClient) CreatePool(ctx context.Context, d *VirtualEnvironmentPoolCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "pools", d, nil)
}
-// DeletePool deletes an pool.
-func (c *VirtualEnvironmentClient) DeletePool(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("pools/%s", url.PathEscape(id)), nil, nil)
+// DeletePool deletes a pool.
+func (c *VirtualEnvironmentClient) DeletePool(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("pools/%s", url.PathEscape(id)), nil, nil)
}
-// GetPool retrieves an pool.
-func (c *VirtualEnvironmentClient) GetPool(id string) (*VirtualEnvironmentPoolGetResponseData, error) {
+// GetPool retrieves a pool.
+func (c *VirtualEnvironmentClient) GetPool(ctx context.Context, id string) (*VirtualEnvironmentPoolGetResponseData, error) {
resBody := &VirtualEnvironmentPoolGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("pools/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("pools/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data.Members, func(i, j int) bool {
@@ -42,16 +43,16 @@ func (c *VirtualEnvironmentClient) GetPool(id string) (*VirtualEnvironmentPoolGe
}
// ListPools retrieves a list of pools.
-func (c *VirtualEnvironmentClient) ListPools() ([]*VirtualEnvironmentPoolListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListPools(ctx context.Context) ([]*VirtualEnvironmentPoolListResponseData, error) {
resBody := &VirtualEnvironmentPoolListResponseBody{}
- err := c.DoRequest(hmGET, "pools", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "pools", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -61,7 +62,7 @@ func (c *VirtualEnvironmentClient) ListPools() ([]*VirtualEnvironmentPoolListRes
return resBody.Data, nil
}
-// UpdatePool updates an pool.
-func (c *VirtualEnvironmentClient) UpdatePool(id string, d *VirtualEnvironmentPoolUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("pools/%s", url.PathEscape(id)), d, nil)
+// UpdatePool updates a pool.
+func (c *VirtualEnvironmentClient) UpdatePool(ctx context.Context, id string, d *VirtualEnvironmentPoolUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("pools/%s", url.PathEscape(id)), d, nil)
}
diff --git a/proxmox/virtual_environment_roles.go b/proxmox/virtual_environment_roles.go
index 902ff9bb..f004a92b 100644
--- a/proxmox/virtual_environment_roles.go
+++ b/proxmox/virtual_environment_roles.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -12,26 +13,26 @@ import (
)
// CreateRole creates an access role.
-func (c *VirtualEnvironmentClient) CreateRole(d *VirtualEnvironmentRoleCreateRequestBody) error {
- return c.DoRequest(hmPOST, "access/roles", d, nil)
+func (c *VirtualEnvironmentClient) CreateRole(ctx context.Context, d *VirtualEnvironmentRoleCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "access/roles", d, nil)
}
// DeleteRole deletes an access role.
-func (c *VirtualEnvironmentClient) DeleteRole(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteRole(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), nil, nil)
}
// GetRole retrieves an access role.
-func (c *VirtualEnvironmentClient) GetRole(id string) (*CustomPrivileges, error) {
+func (c *VirtualEnvironmentClient) GetRole(ctx context.Context, id string) (*CustomPrivileges, error) {
resBody := &VirtualEnvironmentRoleGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Strings(*resBody.Data)
@@ -40,16 +41,16 @@ func (c *VirtualEnvironmentClient) GetRole(id string) (*CustomPrivileges, error)
}
// ListRoles retrieves a list of access roles.
-func (c *VirtualEnvironmentClient) ListRoles() ([]*VirtualEnvironmentRoleListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListRoles(ctx context.Context) ([]*VirtualEnvironmentRoleListResponseData, error) {
resBody := &VirtualEnvironmentRoleListResponseBody{}
- err := c.DoRequest(hmGET, "access/roles", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "access/roles", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -66,6 +67,6 @@ func (c *VirtualEnvironmentClient) ListRoles() ([]*VirtualEnvironmentRoleListRes
}
// UpdateRole updates an access role.
-func (c *VirtualEnvironmentClient) UpdateRole(id string, d *VirtualEnvironmentRoleUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), d, nil)
+func (c *VirtualEnvironmentClient) UpdateRole(ctx context.Context, id string, d *VirtualEnvironmentRoleUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("access/roles/%s", url.PathEscape(id)), d, nil)
}
diff --git a/proxmox/virtual_environment_users.go b/proxmox/virtual_environment_users.go
index 1bce0839..31f09673 100644
--- a/proxmox/virtual_environment_users.go
+++ b/proxmox/virtual_environment_users.go
@@ -5,6 +5,7 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -13,36 +14,36 @@ import (
)
// ChangeUserPassword changes a user's password.
-func (c *VirtualEnvironmentClient) ChangeUserPassword(id, password string) error {
+func (c *VirtualEnvironmentClient) ChangeUserPassword(ctx context.Context, id, password string) error {
d := VirtualEnvironmentUserChangePasswordRequestBody{
ID: id,
Password: password,
}
- return c.DoRequest(hmPUT, "access/password", d, nil)
+ return c.DoRequest(ctx, hmPUT, "access/password", d, nil)
}
-// CreateUser creates an user.
-func (c *VirtualEnvironmentClient) CreateUser(d *VirtualEnvironmentUserCreateRequestBody) error {
- return c.DoRequest(hmPOST, "access/users", d, nil)
+// CreateUser creates a user.
+func (c *VirtualEnvironmentClient) CreateUser(ctx context.Context, d *VirtualEnvironmentUserCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, "access/users", d, nil)
}
-// DeleteUser deletes an user.
-func (c *VirtualEnvironmentClient) DeleteUser(id string) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("access/users/%s", url.PathEscape(id)), nil, nil)
+// DeleteUser deletes an user.
+func (c *VirtualEnvironmentClient) DeleteUser(ctx context.Context, id string) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("access/users/%s", url.PathEscape(id)), nil, nil)
}
-// GetUser retrieves an user.
-func (c *VirtualEnvironmentClient) GetUser(id string) (*VirtualEnvironmentUserGetResponseData, error) {
+// GetUser retrieves a user.
+func (c *VirtualEnvironmentClient) GetUser(ctx context.Context, id string) (*VirtualEnvironmentUserGetResponseData, error) {
resBody := &VirtualEnvironmentUserGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("access/users/%s", url.PathEscape(id)), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("access/users/%s", url.PathEscape(id)), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
if resBody.Data.ExpirationDate != nil {
@@ -58,16 +59,16 @@ func (c *VirtualEnvironmentClient) GetUser(id string) (*VirtualEnvironmentUserGe
}
// ListUsers retrieves a list of users.
-func (c *VirtualEnvironmentClient) ListUsers() ([]*VirtualEnvironmentUserListResponseData, error) {
+func (c *VirtualEnvironmentClient) ListUsers(ctx context.Context) ([]*VirtualEnvironmentUserListResponseData, error) {
resBody := &VirtualEnvironmentUserListResponseBody{}
- err := c.DoRequest(hmGET, "access/users", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "access/users", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
sort.Slice(resBody.Data, func(i, j int) bool {
@@ -88,7 +89,7 @@ func (c *VirtualEnvironmentClient) ListUsers() ([]*VirtualEnvironmentUserListRes
return resBody.Data, nil
}
-// UpdateUser updates an user.
-func (c *VirtualEnvironmentClient) UpdateUser(id string, d *VirtualEnvironmentUserUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("access/users/%s", url.PathEscape(id)), d, nil)
+// UpdateUser updates a user.
+func (c *VirtualEnvironmentClient) UpdateUser(ctx context.Context, id string, d *VirtualEnvironmentUserUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("access/users/%s", url.PathEscape(id)), d, nil)
}
diff --git a/proxmox/virtual_environment_version.go b/proxmox/virtual_environment_version.go
index 35e27300..60330626 100644
--- a/proxmox/virtual_environment_version.go
+++ b/proxmox/virtual_environment_version.go
@@ -5,20 +5,21 @@
package proxmox
import (
+ "context"
"errors"
)
// Version retrieves the version information.
-func (c *VirtualEnvironmentClient) Version() (*VirtualEnvironmentVersionResponseData, error) {
+func (c *VirtualEnvironmentClient) Version(ctx context.Context) (*VirtualEnvironmentVersionResponseData, error) {
resBody := &VirtualEnvironmentVersionResponseBody{}
- err := c.DoRequest(hmGET, "version", nil, resBody)
+ err := c.DoRequest(ctx, hmGET, "version", nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
diff --git a/proxmox/virtual_environment_vm.go b/proxmox/virtual_environment_vm.go
index c8881ad6..bc48c00c 100644
--- a/proxmox/virtual_environment_vm.go
+++ b/proxmox/virtual_environment_vm.go
@@ -5,9 +5,10 @@
package proxmox
import (
+ "context"
"errors"
"fmt"
- "log"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
"net/url"
"strings"
"sync"
@@ -24,7 +25,7 @@ var (
)
// CloneVM clones a virtual machine.
-func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries int, d *VirtualEnvironmentVMCloneRequestBody, timeout int) error {
+func (c *VirtualEnvironmentClient) CloneVM(ctx context.Context, nodeName string, vmID int, retries int, d *VirtualEnvironmentVMCloneRequestBody, timeout int) error {
resBody := &VirtualEnvironmentVMMoveDiskResponseBody{}
var err error
@@ -34,17 +35,17 @@ func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries in
}
for i := 0; i < retries; i++ {
- err = c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/clone", url.PathEscape(nodeName), vmID), d, resBody)
+ err = c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/clone", url.PathEscape(nodeName), vmID), d, resBody)
if err != nil {
return err
}
if resBody.Data == nil {
- return errors.New("The server did not include a data object in the response")
+ return errors.New("the server did not include a data object in the response")
}
- err = c.WaitForNodeTask(nodeName, *resBody.Data, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *resBody.Data, timeout, 5)
if err == nil {
return nil
@@ -56,50 +57,52 @@ func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries in
}
// CreateVM creates a virtual machine.
-func (c *VirtualEnvironmentClient) CreateVM(nodeName string, d *VirtualEnvironmentVMCreateRequestBody) error {
- return c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu", url.PathEscape(nodeName)), d, nil)
+func (c *VirtualEnvironmentClient) CreateVM(ctx context.Context, nodeName string, d *VirtualEnvironmentVMCreateRequestBody) error {
+ return c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu", url.PathEscape(nodeName)), d, nil)
}
// DeleteVM deletes a virtual machine.
-func (c *VirtualEnvironmentClient) DeleteVM(nodeName string, vmID int) error {
- return c.DoRequest(hmDELETE, fmt.Sprintf("nodes/%s/qemu/%d", url.PathEscape(nodeName), vmID), nil, nil)
+func (c *VirtualEnvironmentClient) DeleteVM(ctx context.Context, nodeName string, vmID int) error {
+ return c.DoRequest(ctx, hmDELETE, fmt.Sprintf("nodes/%s/qemu/%d", url.PathEscape(nodeName), vmID), nil, nil)
}
// GetVM retrieves a virtual machine.
-func (c *VirtualEnvironmentClient) GetVM(nodeName string, vmID int) (*VirtualEnvironmentVMGetResponseData, error) {
+func (c *VirtualEnvironmentClient) GetVM(ctx context.Context, nodeName string, vmID int) (*VirtualEnvironmentVMGetResponseData, error) {
resBody := &VirtualEnvironmentVMGetResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// GetVMID retrieves the next available VM identifier.
-func (c *VirtualEnvironmentClient) GetVMID() (*int, error) {
+func (c *VirtualEnvironmentClient) GetVMID(ctx context.Context) (*int, error) {
getVMIDCounterMutex.Lock()
defer getVMIDCounterMutex.Unlock()
if getVMIDCounter < 0 {
- nextVMID, err := c.GetClusterNextID(nil)
+ nextVMID, err := c.GetClusterNextID(ctx, nil)
if err != nil {
return nil, err
}
if nextVMID == nil {
- return nil, errors.New("Unable to retrieve the next available VM identifier")
+ return nil, errors.New("unable to retrieve the next available VM identifier")
}
getVMIDCounter = *nextVMID + getVMIDStep
- log.Printf("[DEBUG] Determined next available VM identifier to be %d", *nextVMID)
+ tflog.Debug(ctx, "next VM identifier", map[string]interface{}{
+ "id": *nextVMID,
+ })
return nextVMID, nil
}
@@ -107,7 +110,7 @@ func (c *VirtualEnvironmentClient) GetVMID() (*int, error) {
vmID := getVMIDCounter
for vmID <= 2147483637 {
- _, err := c.GetClusterNextID(&vmID)
+ _, err := c.GetClusterNextID(ctx, &vmID)
if err != nil {
vmID += getVMIDStep
@@ -117,49 +120,51 @@ func (c *VirtualEnvironmentClient) GetVMID() (*int, error) {
getVMIDCounter = vmID + getVMIDStep
- log.Printf("[DEBUG] Determined next available VM identifier to be %d", vmID)
+ tflog.Debug(ctx, "next VM identifier", map[string]interface{}{
+ "id": vmID,
+ })
return &vmID, nil
}
- return nil, errors.New("Unable to determine the next available VM identifier")
+ return nil, errors.New("unable to determine the next available VM identifier")
}
// GetVMNetworkInterfacesFromAgent retrieves the network interfaces reported by the QEMU agent.
-func (c *VirtualEnvironmentClient) GetVMNetworkInterfacesFromAgent(nodeName string, vmID int) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) {
+func (c *VirtualEnvironmentClient) GetVMNetworkInterfacesFromAgent(ctx context.Context, nodeName string, vmID int) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) {
resBody := &VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/qemu/%d/agent/network-get-interfaces", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/qemu/%d/agent/network-get-interfaces", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// GetVMStatus retrieves the status for a virtual machine.
-func (c *VirtualEnvironmentClient) GetVMStatus(nodeName string, vmID int) (*VirtualEnvironmentVMGetStatusResponseData, error) {
+func (c *VirtualEnvironmentClient) GetVMStatus(ctx context.Context, nodeName string, vmID int) (*VirtualEnvironmentVMGetStatusResponseData, error) {
resBody := &VirtualEnvironmentVMGetStatusResponseBody{}
- err := c.DoRequest(hmGET, fmt.Sprintf("nodes/%s/qemu/%d/status/current", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmGET, fmt.Sprintf("nodes/%s/qemu/%d/status/current", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// MoveVMDisk moves a virtual machine disk.
-func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody, timeout int) error {
- taskID, err := c.MoveVMDiskAsync(nodeName, vmID, d)
+func (c *VirtualEnvironmentClient) MoveVMDisk(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody, timeout int) error {
+ taskID, err := c.MoveVMDiskAsync(ctx, nodeName, vmID, d)
if err != nil {
if strings.Contains(err.Error(), "you can't move to the same storage with same format") {
@@ -170,7 +175,7 @@ func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *Virt
return err
}
- err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 5)
if err != nil {
return err
@@ -180,16 +185,16 @@ func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *Virt
}
// MoveVMDiskAsync moves a virtual machine disk asynchronously.
-func (c *VirtualEnvironmentClient) MoveVMDiskAsync(nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody) (*string, error) {
+func (c *VirtualEnvironmentClient) MoveVMDiskAsync(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody) (*string, error) {
resBody := &VirtualEnvironmentVMMoveDiskResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/move_disk", url.PathEscape(nodeName), vmID), d, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/move_disk", url.PathEscape(nodeName), vmID), d, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
@@ -197,18 +202,18 @@ func (c *VirtualEnvironmentClient) MoveVMDiskAsync(nodeName string, vmID int, d
// ListVMs retrieves a list of virtual machines.
func (c *VirtualEnvironmentClient) ListVMs() ([]*VirtualEnvironmentVMListResponseData, error) {
- return nil, errors.New("Not implemented")
+ return nil, errors.New("not implemented")
}
// RebootVM reboots a virtual machine.
-func (c *VirtualEnvironmentClient) RebootVM(nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody, timeout int) error {
- taskID, err := c.RebootVMAsync(nodeName, vmID, d)
+func (c *VirtualEnvironmentClient) RebootVM(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody, timeout int) error {
+ taskID, err := c.RebootVMAsync(ctx, nodeName, vmID, d)
if err != nil {
return err
}
- err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 5)
if err != nil {
return err
@@ -218,45 +223,54 @@ func (c *VirtualEnvironmentClient) RebootVM(nodeName string, vmID int, d *Virtua
}
// RebootVMAsync reboots a virtual machine asynchronously.
-func (c *VirtualEnvironmentClient) RebootVMAsync(nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody) (*string, error) {
+func (c *VirtualEnvironmentClient) RebootVMAsync(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody) (*string, error) {
resBody := &VirtualEnvironmentVMRebootResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/reboot", url.PathEscape(nodeName), vmID), d, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/reboot", url.PathEscape(nodeName), vmID), d, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// ResizeVMDisk resizes a virtual machine disk.
-func (c *VirtualEnvironmentClient) ResizeVMDisk(nodeName string, vmID int, d *VirtualEnvironmentVMResizeDiskRequestBody) error {
+func (c *VirtualEnvironmentClient) ResizeVMDisk(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMResizeDiskRequestBody) error {
var err error
- log.Printf("[DEBUG] RESIZE size: %s, disk: %s", d.Size, d.Disk)
+ tflog.Debug(ctx, "resize disk", map[string]interface{}{
+ "disk": d.Disk,
+ "size": d.Size,
+ })
for i := 0; i < 5; i++ {
- err = c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/qemu/%d/resize", url.PathEscape(nodeName), vmID), d, nil)
+ err = c.DoRequest(ctx, hmPUT, fmt.Sprintf("nodes/%s/qemu/%d/resize", url.PathEscape(nodeName), vmID), d, nil)
if err == nil {
return nil
}
- log.Printf("[DEBUG] resize disk failed, retry nr: %d", i)
+ tflog.Debug(ctx, "resize disk failed", map[string]interface{}{
+ "retry": i,
+ })
time.Sleep(5 * time.Second)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
return err
}
// ShutdownVM shuts down a virtual machine.
-func (c *VirtualEnvironmentClient) ShutdownVM(nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody, timeout int) error {
- taskID, err := c.ShutdownVMAsync(nodeName, vmID, d)
+func (c *VirtualEnvironmentClient) ShutdownVM(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody, timeout int) error {
+ taskID, err := c.ShutdownVMAsync(ctx, nodeName, vmID, d)
if err != nil {
return err
}
- err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 5)
if err != nil {
return err
@@ -266,30 +280,30 @@ func (c *VirtualEnvironmentClient) ShutdownVM(nodeName string, vmID int, d *Virt
}
// ShutdownVMAsync shuts down a virtual machine asynchronously.
-func (c *VirtualEnvironmentClient) ShutdownVMAsync(nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody) (*string, error) {
+func (c *VirtualEnvironmentClient) ShutdownVMAsync(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody) (*string, error) {
resBody := &VirtualEnvironmentVMShutdownResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/shutdown", url.PathEscape(nodeName), vmID), d, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/shutdown", url.PathEscape(nodeName), vmID), d, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// StartVM starts a virtual machine.
-func (c *VirtualEnvironmentClient) StartVM(nodeName string, vmID int, timeout int) error {
- taskID, err := c.StartVMAsync(nodeName, vmID)
+func (c *VirtualEnvironmentClient) StartVM(ctx context.Context, nodeName string, vmID int, timeout int) error {
+ taskID, err := c.StartVMAsync(ctx, nodeName, vmID)
if err != nil {
return err
}
- err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 5)
if err != nil {
return err
@@ -299,30 +313,30 @@ func (c *VirtualEnvironmentClient) StartVM(nodeName string, vmID int, timeout in
}
// StartVMAsync starts a virtual machine asynchronously.
-func (c *VirtualEnvironmentClient) StartVMAsync(nodeName string, vmID int) (*string, error) {
+func (c *VirtualEnvironmentClient) StartVMAsync(ctx context.Context, nodeName string, vmID int) (*string, error) {
resBody := &VirtualEnvironmentVMStartResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/start", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/start", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// StopVM stops a virtual machine.
-func (c *VirtualEnvironmentClient) StopVM(nodeName string, vmID int, timeout int) error {
- taskID, err := c.StopVMAsync(nodeName, vmID)
+func (c *VirtualEnvironmentClient) StopVM(ctx context.Context, nodeName string, vmID int, timeout int) error {
+ taskID, err := c.StopVMAsync(ctx, nodeName, vmID)
if err != nil {
return err
}
- err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5)
+ err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 5)
if err != nil {
return err
@@ -332,44 +346,44 @@ func (c *VirtualEnvironmentClient) StopVM(nodeName string, vmID int, timeout int
}
// StopVMAsync stops a virtual machine asynchronously.
-func (c *VirtualEnvironmentClient) StopVMAsync(nodeName string, vmID int) (*string, error) {
+func (c *VirtualEnvironmentClient) StopVMAsync(ctx context.Context, nodeName string, vmID int) (*string, error) {
resBody := &VirtualEnvironmentVMStopResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/stop", url.PathEscape(nodeName), vmID), nil, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/status/stop", url.PathEscape(nodeName), vmID), nil, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// UpdateVM updates a virtual machine.
-func (c *VirtualEnvironmentClient) UpdateVM(nodeName string, vmID int, d *VirtualEnvironmentVMUpdateRequestBody) error {
- return c.DoRequest(hmPUT, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), d, nil)
+func (c *VirtualEnvironmentClient) UpdateVM(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMUpdateRequestBody) error {
+ return c.DoRequest(ctx, hmPUT, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), d, nil)
}
// UpdateVMAsync updates a virtual machine asynchronously.
-func (c *VirtualEnvironmentClient) UpdateVMAsync(nodeName string, vmID int, d *VirtualEnvironmentVMUpdateRequestBody) (*string, error) {
+func (c *VirtualEnvironmentClient) UpdateVMAsync(ctx context.Context, nodeName string, vmID int, d *VirtualEnvironmentVMUpdateRequestBody) (*string, error) {
resBody := &VirtualEnvironmentVMUpdateAsyncResponseBody{}
- err := c.DoRequest(hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), d, resBody)
+ err := c.DoRequest(ctx, hmPOST, fmt.Sprintf("nodes/%s/qemu/%d/config", url.PathEscape(nodeName), vmID), d, resBody)
if err != nil {
return nil, err
}
if resBody.Data == nil {
- return nil, errors.New("The server did not include a data object in the response")
+ return nil, errors.New("the server did not include a data object in the response")
}
return resBody.Data, nil
}
// WaitForNetworkInterfacesFromVMAgent waits for a virtual machine's QEMU agent to publish the network interfaces.
-func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName string, vmID int, timeout int, delay int, waitForIP bool) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) {
+func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(ctx context.Context, nodeName string, vmID int, timeout int, delay int, waitForIP bool) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) {
timeDelay := int64(delay)
timeMax := float64(timeout)
timeStart := time.Now()
@@ -377,7 +391,7 @@ func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- data, err := c.GetVMNetworkInterfacesFromAgent(nodeName, vmID)
+ data, err := c.GetVMNetworkInterfacesFromAgent(ctx, nodeName, vmID)
if err == nil && data != nil && data.Result != nil {
missingIP := false
@@ -406,13 +420,17 @@ func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return nil, ctx.Err()
+ }
}
- return nil, fmt.Errorf("Timeout while waiting for the QEMU agent on VM \"%d\" to publish the network interfaces", vmID)
+ return nil, fmt.Errorf("timeout while waiting for the QEMU agent on VM \"%d\" to publish the network interfaces", vmID)
}
// WaitForNoNetworkInterfacesFromVMAgent waits for a virtual machine's QEMU agent to unpublish the network interfaces.
-func (c *VirtualEnvironmentClient) WaitForNoNetworkInterfacesFromVMAgent(nodeName string, vmID int, timeout int, delay int) error {
+func (c *VirtualEnvironmentClient) WaitForNoNetworkInterfacesFromVMAgent(ctx context.Context, nodeName string, vmID int, timeout int, delay int) error {
timeDelay := int64(delay)
timeMax := float64(timeout)
timeStart := time.Now()
@@ -420,7 +438,7 @@ func (c *VirtualEnvironmentClient) WaitForNoNetworkInterfacesFromVMAgent(nodeNam
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- _, err := c.GetVMNetworkInterfacesFromAgent(nodeName, vmID)
+ _, err := c.GetVMNetworkInterfacesFromAgent(ctx, nodeName, vmID)
if err != nil {
return nil
@@ -432,13 +450,17 @@ func (c *VirtualEnvironmentClient) WaitForNoNetworkInterfacesFromVMAgent(nodeNam
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for the QEMU agent on VM \"%d\" to unpublish the network interfaces", vmID)
+ return fmt.Errorf("timeout while waiting for the QEMU agent on VM \"%d\" to unpublish the network interfaces", vmID)
}
// WaitForVMConfigUnlock waits for a virtual machine configuration to become unlocked.
-func (c *VirtualEnvironmentClient) WaitForVMConfigUnlock(nodeName string, vmID int, timeout int, delay int, ignoreErrorResponse bool) error {
+func (c *VirtualEnvironmentClient) WaitForVMConfigUnlock(ctx context.Context, nodeName string, vmID int, timeout int, delay int, ignoreErrorResponse bool) error {
timeDelay := int64(delay)
timeMax := float64(timeout)
timeStart := time.Now()
@@ -446,7 +468,7 @@ func (c *VirtualEnvironmentClient) WaitForVMConfigUnlock(nodeName string, vmID i
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- data, err := c.GetVMStatus(nodeName, vmID)
+ data, err := c.GetVMStatus(ctx, nodeName, vmID)
if err != nil {
if !ignoreErrorResponse {
@@ -462,13 +484,17 @@ func (c *VirtualEnvironmentClient) WaitForVMConfigUnlock(nodeName string, vmID i
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for VM \"%d\" configuration to become unlocked", vmID)
+ return fmt.Errorf("timeout while waiting for VM \"%d\" configuration to become unlocked", vmID)
}
// WaitForVMState waits for a virtual machine to reach a specific state.
-func (c *VirtualEnvironmentClient) WaitForVMState(nodeName string, vmID int, state string, timeout int, delay int) error {
+func (c *VirtualEnvironmentClient) WaitForVMState(ctx context.Context, nodeName string, vmID int, state string, timeout int, delay int) error {
state = strings.ToLower(state)
timeDelay := int64(delay)
@@ -478,8 +504,7 @@ func (c *VirtualEnvironmentClient) WaitForVMState(nodeName string, vmID int, sta
for timeElapsed.Seconds() < timeMax {
if int64(timeElapsed.Seconds())%timeDelay == 0 {
- data, err := c.GetVMStatus(nodeName, vmID)
-
+ data, err := c.GetVMStatus(ctx, nodeName, vmID)
if err != nil {
return err
}
@@ -494,7 +519,11 @@ func (c *VirtualEnvironmentClient) WaitForVMState(nodeName string, vmID int, sta
time.Sleep(200 * time.Millisecond)
timeElapsed = time.Now().Sub(timeStart)
+
+ if ctx.Err() != nil {
+ return ctx.Err()
+ }
}
- return fmt.Errorf("Timeout while waiting for VM \"%d\" to enter the state \"%s\"", vmID, state)
+ return fmt.Errorf("timeout while waiting for VM \"%d\" to enter the state \"%s\"", vmID, state)
}
diff --git a/proxmox/virtual_environment_vm_types.go b/proxmox/virtual_environment_vm_types.go
index a6f81a80..04c3ca52 100644
--- a/proxmox/virtual_environment_vm_types.go
+++ b/proxmox/virtual_environment_vm_types.go
@@ -564,7 +564,7 @@ type VirtualEnvironmentVMUpdateRequestBody VirtualEnvironmentVMCreateRequestBody
// EncodeValues converts a CustomAgent struct to a URL vlaue.
func (r CustomAgent) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Enabled != nil {
if *r.Enabled {
@@ -610,7 +610,10 @@ func (r CustomAudioDevice) EncodeValues(key string, v *url.Values) error {
func (r CustomAudioDevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
if d.Enabled {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
}
@@ -618,9 +621,9 @@ func (r CustomAudioDevices) EncodeValues(key string, v *url.Values) error {
}
// EncodeValues converts a CustomCloudInitConfig struct to multiple URL vlaues.
-func (r CustomCloudInitConfig) EncodeValues(key string, v *url.Values) error {
+func (r CustomCloudInitConfig) EncodeValues(_ string, v *url.Values) error {
if r.Files != nil {
- volumes := []string{}
+ var volumes []string
if r.Files.MetaVolume != nil {
volumes = append(volumes, fmt.Sprintf("meta=%s", *r.Files.MetaVolume))
@@ -640,7 +643,7 @@ func (r CustomCloudInitConfig) EncodeValues(key string, v *url.Values) error {
}
for i, c := range r.IPConfig {
- config := []string{}
+ var config []string
if c.GatewayIPv4 != nil {
config = append(config, fmt.Sprintf("gw=%s", *c.GatewayIPv4))
@@ -797,7 +800,10 @@ func (r CustomNetworkDevice) EncodeValues(key string, v *url.Values) error {
func (r CustomNetworkDevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
if d.Enabled {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
}
@@ -830,7 +836,10 @@ func (r CustomNUMADevice) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomNUMADevices array to multiple URL values.
func (r CustomNUMADevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
return nil
@@ -882,7 +891,10 @@ func (r CustomPCIDevice) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomPCIDevices array to multiple URL values.
func (r CustomPCIDevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
return nil
@@ -914,7 +926,7 @@ func (r CustomSharedMemory) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomSMBIOS struct to a URL vlaue.
func (r CustomSMBIOS) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Base64 != nil {
if *r.Base64 {
@@ -961,7 +973,7 @@ func (r CustomSMBIOS) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomSpiceEnhancements struct to a URL vlaue.
func (r CustomSpiceEnhancements) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.FolderSharing != nil {
if *r.FolderSharing {
@@ -984,7 +996,7 @@ func (r CustomSpiceEnhancements) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomStartupOrder struct to a URL vlaue.
func (r CustomStartupOrder) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Order != nil {
values = append(values, fmt.Sprintf("order=%d", *r.Order))
@@ -1053,10 +1065,13 @@ func (r CustomStorageDevice) EncodeValues(key string, v *url.Values) error {
}
// EncodeValues converts a CustomStorageDevices array to multiple URL values.
-func (r CustomStorageDevices) EncodeValues(key string, v *url.Values) error {
+func (r CustomStorageDevices) EncodeValues(_ string, v *url.Values) error {
for i, d := range r {
if d.Enabled {
- d.EncodeValues(i, v)
+ err := d.EncodeValues(i, v)
+ if err != nil {
+ return err
+ }
}
}
@@ -1085,7 +1100,10 @@ func (r CustomUSBDevice) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomUSBDevices array to multiple URL values.
func (r CustomUSBDevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
return nil
@@ -1093,7 +1111,7 @@ func (r CustomUSBDevices) EncodeValues(key string, v *url.Values) error {
// EncodeValues converts a CustomVGADevice struct to a URL vlaue.
func (r CustomVGADevice) EncodeValues(key string, v *url.Values) error {
- values := []string{}
+ var values []string
if r.Memory != nil {
values = append(values, fmt.Sprintf("memory=%d", *r.Memory))
@@ -1135,7 +1153,10 @@ func (r CustomVirtualIODevice) EncodeValues(key string, v *url.Values) error {
func (r CustomVirtualIODevices) EncodeValues(key string, v *url.Values) error {
for i, d := range r {
if d.Enabled {
- d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ err := d.EncodeValues(fmt.Sprintf("%s%d", key, i), v)
+ if err != nil {
+ return err
+ }
}
}
@@ -1318,7 +1339,7 @@ func (r *CustomCPUEmulation) UnmarshalJSON(b []byte) error {
}
if s == "" {
- return errors.New("Unexpected empty string")
+ return errors.New("unexpected empty string")
}
pairs := strings.Split(s, ",")
@@ -1337,7 +1358,7 @@ func (r *CustomCPUEmulation) UnmarshalJSON(b []byte) error {
f := strings.Split(v[1], ";")
r.Flags = &f
} else {
- f := []string{}
+ var f []string
r.Flags = &f
}
case "hidden":
diff --git a/proxmoxtf/data_source_virtual_environment_cluster_alias.go b/proxmoxtf/data_source_virtual_environment_cluster_alias.go
index ee7045be..473ac534 100644
--- a/proxmoxtf/data_source_virtual_environment_cluster_alias.go
+++ b/proxmoxtf/data_source_virtual_environment_cluster_alias.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -35,34 +37,36 @@ func dataSourceVirtualEnvironmentClusterAlias() *schema.Resource {
Computed: true,
},
},
- Read: dataSourceVirtualEnvironmentAliasRead,
+ ReadContext: dataSourceVirtualEnvironmentAliasRead,
}
}
-func dataSourceVirtualEnvironmentAliasRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentAliasRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
AliasID := d.Get(mkDataSourceVirtualEnvironmentClusterAliasName).(string)
- Alias, err := veClient.GetAlias(AliasID)
-
+ Alias, err := veClient.GetAlias(ctx, AliasID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(AliasID)
- d.Set(mkDataSourceVirtualEnvironmentClusterAliasCIDR, Alias.CIDR)
+ err = d.Set(mkDataSourceVirtualEnvironmentClusterAliasCIDR, Alias.CIDR)
+ diags = append(diags, diag.FromErr(err)...)
if Alias.Comment != nil {
- d.Set(mkDataSourceVirtualEnvironmentClusterAliasComment, Alias.Comment)
+ err = d.Set(mkDataSourceVirtualEnvironmentClusterAliasComment, Alias.Comment)
} else {
- d.Set(mkDataSourceVirtualEnvironmentClusterAliasComment, dvDataVirtualEnvironmentClusterAliasComment)
+ err = d.Set(mkDataSourceVirtualEnvironmentClusterAliasComment, dvDataVirtualEnvironmentClusterAliasComment)
}
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_cluster_alias_test.go b/proxmoxtf/data_source_virtual_environment_cluster_alias_test.go
index 9ed3bbfc..e3bb057c 100644
--- a/proxmoxtf/data_source_virtual_environment_cluster_alias_test.go
+++ b/proxmoxtf/data_source_virtual_environment_cluster_alias_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentAliasInstantiation tests whether the DataSourceVirtualEnvironmentAlias instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_cluster_aliases.go b/proxmoxtf/data_source_virtual_environment_cluster_aliases.go
index 5945e87f..e7953f0f 100644
--- a/proxmoxtf/data_source_virtual_environment_cluster_aliases.go
+++ b/proxmoxtf/data_source_virtual_environment_cluster_aliases.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -22,22 +24,20 @@ func dataSourceVirtualEnvironmentClusterAliases() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentClusterAliasesRead,
+ ReadContext: dataSourceVirtualEnvironmentClusterAliasesRead,
}
}
-func dataSourceVirtualEnvironmentClusterAliasesRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentClusterAliasesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListPools()
-
+ list, err := veClient.ListPools(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
aliasIDs := make([]interface{}, len(list))
@@ -48,7 +48,7 @@ func dataSourceVirtualEnvironmentClusterAliasesRead(d *schema.ResourceData, m in
d.SetId("aliases")
- d.Set(mkDataSourceVirtualEnvironmentClusterAliasesAliasIDs, aliasIDs)
+ err = d.Set(mkDataSourceVirtualEnvironmentClusterAliasesAliasIDs, aliasIDs)
- return nil
+ return diag.FromErr(err)
}
diff --git a/proxmoxtf/data_source_virtual_environment_cluster_aliases_test.go b/proxmoxtf/data_source_virtual_environment_cluster_aliases_test.go
index 2f2331f7..93f5ebcd 100644
--- a/proxmoxtf/data_source_virtual_environment_cluster_aliases_test.go
+++ b/proxmoxtf/data_source_virtual_environment_cluster_aliases_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentAliasesInstantiation tests whether the DataSourceVirtualEnvironmentAliases instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_datastores.go b/proxmoxtf/data_source_virtual_environment_datastores.go
index 4a630772..6fa9895a 100644
--- a/proxmoxtf/data_source_virtual_environment_datastores.go
+++ b/proxmoxtf/data_source_virtual_environment_datastores.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"sort"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -87,26 +89,26 @@ func dataSourceVirtualEnvironmentDatastores() *schema.Resource {
Type: schema.TypeList,
Description: "The storage type",
Computed: true,
- Elem: &schema.Schema{Type: schema.TypeInt},
+ Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentDatastoresRead,
+ ReadContext: dataSourceVirtualEnvironmentDatastoresRead,
}
}
-func dataSourceVirtualEnvironmentDatastoresRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentDatastoresRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkDataSourceVirtualEnvironmentDatastoresNodeName).(string)
- list, err := veClient.ListDatastores(nodeName, nil)
-
+ list, err := veClient.ListDatastores(ctx, nodeName, nil)
if err != nil {
- return err
+ return diag.FromErr(err)
}
active := make([]interface{}, len(list))
@@ -149,19 +151,19 @@ func dataSourceVirtualEnvironmentDatastoresRead(d *schema.ResourceData, m interf
}
if v.SpaceAvailable != nil {
- spaceAvailable[i] = int(*v.SpaceAvailable)
+ spaceAvailable[i] = *v.SpaceAvailable
} else {
spaceAvailable[i] = 0
}
if v.SpaceTotal != nil {
- spaceTotal[i] = int(*v.SpaceTotal)
+ spaceTotal[i] = *v.SpaceTotal
} else {
spaceTotal[i] = 0
}
if v.SpaceUsed != nil {
- spaceUsed[i] = int(*v.SpaceUsed)
+ spaceUsed[i] = *v.SpaceUsed
} else {
spaceUsed[i] = 0
}
@@ -171,15 +173,24 @@ func dataSourceVirtualEnvironmentDatastoresRead(d *schema.ResourceData, m interf
d.SetId(fmt.Sprintf("%s_datastores", nodeName))
- d.Set(mkDataSourceVirtualEnvironmentDatastoresActive, active)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresContentTypes, contentTypes)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresDatastoreIDs, datastoreIDs)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresEnabled, enabled)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresShared, shared)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceAvailable, spaceAvailable)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceTotal, spaceTotal)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceUsed, spaceUsed)
- d.Set(mkDataSourceVirtualEnvironmentDatastoresTypes, types)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresActive, active)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresContentTypes, contentTypes)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresDatastoreIDs, datastoreIDs)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresEnabled, enabled)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresShared, shared)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceAvailable, spaceAvailable)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceTotal, spaceTotal)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresSpaceUsed, spaceUsed)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentDatastoresTypes, types)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_datastores_test.go b/proxmoxtf/data_source_virtual_environment_datastores_test.go
index 401a5c20..ad6743df 100644
--- a/proxmoxtf/data_source_virtual_environment_datastores_test.go
+++ b/proxmoxtf/data_source_virtual_environment_datastores_test.go
@@ -5,7 +5,7 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"testing"
)
diff --git a/proxmoxtf/data_source_virtual_environment_dns.go b/proxmoxtf/data_source_virtual_environment_dns.go
index 945a2756..aec810a5 100644
--- a/proxmoxtf/data_source_virtual_environment_dns.go
+++ b/proxmoxtf/data_source_virtual_environment_dns.go
@@ -5,9 +5,11 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -36,34 +38,35 @@ func dataSourceVirtualEnvironmentDNS() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentDNSRead,
+ ReadContext: dataSourceVirtualEnvironmentDNSRead,
}
}
-func dataSourceVirtualEnvironmentDNSRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentDNSRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkDataSourceVirtualEnvironmentDNSNodeName).(string)
- dns, err := veClient.GetDNS(nodeName)
-
+ dns, err := veClient.GetDNS(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%s_dns", nodeName))
if dns.SearchDomain != nil {
- d.Set(mkDataSourceVirtualEnvironmentDNSDomain, *dns.SearchDomain)
+ err = d.Set(mkDataSourceVirtualEnvironmentDNSDomain, *dns.SearchDomain)
} else {
- d.Set(mkDataSourceVirtualEnvironmentDNSDomain, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentDNSDomain, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- servers := []interface{}{}
+ var servers []interface{}
if dns.Server1 != nil {
servers = append(servers, *dns.Server1)
@@ -77,7 +80,8 @@ func dataSourceVirtualEnvironmentDNSRead(d *schema.ResourceData, m interface{})
servers = append(servers, *dns.Server3)
}
- d.Set(mkDataSourceVirtualEnvironmentDNSServers, servers)
+ err = d.Set(mkDataSourceVirtualEnvironmentDNSServers, servers)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_dns_test.go b/proxmoxtf/data_source_virtual_environment_dns_test.go
index a2793225..245f034e 100644
--- a/proxmoxtf/data_source_virtual_environment_dns_test.go
+++ b/proxmoxtf/data_source_virtual_environment_dns_test.go
@@ -5,7 +5,7 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"testing"
)
diff --git a/proxmoxtf/data_source_virtual_environment_group.go b/proxmoxtf/data_source_virtual_environment_group.go
index 592d70a5..902b384f 100644
--- a/proxmoxtf/data_source_virtual_environment_group.go
+++ b/proxmoxtf/data_source_virtual_environment_group.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -62,34 +64,33 @@ func dataSourceVirtualEnvironmentGroup() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentGroupRead,
+ ReadContext: dataSourceVirtualEnvironmentGroupRead,
}
}
-func dataSourceVirtualEnvironmentGroupRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentGroupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
groupID := d.Get(mkDataSourceVirtualEnvironmentGroupID).(string)
- group, err := veClient.GetGroup(groupID)
-
+ group, err := veClient.GetGroup(ctx, groupID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- acl, err := veClient.GetACL()
-
+ acl, err := veClient.GetACL(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(groupID)
- aclParsed := []interface{}{}
+ var aclParsed []interface{}
for _, v := range acl {
if v.Type == "group" && v.UserOrGroupID == groupID {
@@ -109,15 +110,18 @@ func dataSourceVirtualEnvironmentGroupRead(d *schema.ResourceData, m interface{}
}
}
- d.Set(mkDataSourceVirtualEnvironmentGroupACL, aclParsed)
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupACL, aclParsed)
+ diags = append(diags, diag.FromErr(err)...)
if group.Comment != nil {
- d.Set(mkDataSourceVirtualEnvironmentGroupComment, group.Comment)
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupComment, group.Comment)
} else {
- d.Set(mkDataSourceVirtualEnvironmentGroupComment, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- d.Set(mkDataSourceVirtualEnvironmentGroupMembers, group.Members)
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupMembers, group.Members)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_group_test.go b/proxmoxtf/data_source_virtual_environment_group_test.go
index 8b978480..7391680a 100644
--- a/proxmoxtf/data_source_virtual_environment_group_test.go
+++ b/proxmoxtf/data_source_virtual_environment_group_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentGroupInstantiation tests whether the DataSourceVirtualEnvironmentGroup instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_groups.go b/proxmoxtf/data_source_virtual_environment_groups.go
index 2239345a..01381fe3 100644
--- a/proxmoxtf/data_source_virtual_environment_groups.go
+++ b/proxmoxtf/data_source_virtual_environment_groups.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -29,22 +31,22 @@ func dataSourceVirtualEnvironmentGroups() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentGroupsRead,
+ ReadContext: dataSourceVirtualEnvironmentGroupsRead,
}
}
-func dataSourceVirtualEnvironmentGroupsRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentGroupsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListGroups()
-
+ list, err := veClient.ListGroups(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
comments := make([]interface{}, len(list))
@@ -62,8 +64,10 @@ func dataSourceVirtualEnvironmentGroupsRead(d *schema.ResourceData, m interface{
d.SetId("groups")
- d.Set(mkDataSourceVirtualEnvironmentGroupsComments, comments)
- d.Set(mkDataSourceVirtualEnvironmentGroupsGroupIDs, groupIDs)
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupsComments, comments)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentGroupsGroupIDs, groupIDs)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_groups_test.go b/proxmoxtf/data_source_virtual_environment_groups_test.go
index d98fccc1..8255dea1 100644
--- a/proxmoxtf/data_source_virtual_environment_groups_test.go
+++ b/proxmoxtf/data_source_virtual_environment_groups_test.go
@@ -5,7 +5,7 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"testing"
)
diff --git a/proxmoxtf/data_source_virtual_environment_hosts.go b/proxmoxtf/data_source_virtual_environment_hosts.go
index 5f6927e4..2c315ccd 100644
--- a/proxmoxtf/data_source_virtual_environment_hosts.go
+++ b/proxmoxtf/data_source_virtual_environment_hosts.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -70,31 +72,31 @@ func dataSourceVirtualEnvironmentHosts() *schema.Resource {
Required: true,
},
},
- Read: dataSourceVirtualEnvironmentHostsRead,
+ ReadContext: dataSourceVirtualEnvironmentHostsRead,
}
}
-func dataSourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentHostsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkDataSourceVirtualEnvironmentHostsNodeName).(string)
- hosts, err := veClient.GetHosts(nodeName)
-
+ hosts, err := veClient.GetHosts(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%s_hosts", nodeName))
// Parse the entries in the hosts file.
- addresses := []interface{}{}
- entries := []interface{}{}
- hostnames := []interface{}{}
+ var addresses []interface{}
+ var entries []interface{}
+ var hostnames []interface{}
lines := strings.Split(hosts.Data, "\n")
for _, line := range lines {
@@ -111,7 +113,7 @@ func dataSourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{}
addresses = append(addresses, values[0])
entry := map[string]interface{}{}
- hostnamesForAddress := []interface{}{}
+ var hostnamesForAddress []interface{}
for _, hostname := range values[1:] {
if hostname != "" {
@@ -126,16 +128,20 @@ func dataSourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{}
hostnames = append(hostnames, hostnamesForAddress)
}
- d.Set(mkDataSourceVirtualEnvironmentHostsAddresses, addresses)
+ err = d.Set(mkDataSourceVirtualEnvironmentHostsAddresses, addresses)
+ diags = append(diags, diag.FromErr(err)...)
if hosts.Digest != nil {
- d.Set(mkDataSourceVirtualEnvironmentHostsDigest, *hosts.Digest)
+ err = d.Set(mkDataSourceVirtualEnvironmentHostsDigest, *hosts.Digest)
} else {
- d.Set(mkDataSourceVirtualEnvironmentHostsDigest, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentHostsDigest, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- d.Set(mkDataSourceVirtualEnvironmentHostsEntries, entries)
- d.Set(mkDataSourceVirtualEnvironmentHostsHostnames, hostnames)
+ err = d.Set(mkDataSourceVirtualEnvironmentHostsEntries, entries)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentHostsHostnames, hostnames)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_hosts_test.go b/proxmoxtf/data_source_virtual_environment_hosts_test.go
index 669a7d59..acfa135d 100644
--- a/proxmoxtf/data_source_virtual_environment_hosts_test.go
+++ b/proxmoxtf/data_source_virtual_environment_hosts_test.go
@@ -5,7 +5,7 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"testing"
)
diff --git a/proxmoxtf/data_source_virtual_environment_nodes.go b/proxmoxtf/data_source_virtual_environment_nodes.go
index fc9a5aee..4452770c 100644
--- a/proxmoxtf/data_source_virtual_environment_nodes.go
+++ b/proxmoxtf/data_source_virtual_environment_nodes.go
@@ -5,9 +5,11 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"math"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -80,22 +82,22 @@ func dataSourceVirtualEnvironmentNodes() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentNodesRead,
+ ReadContext: dataSourceVirtualEnvironmentNodesRead,
}
}
-func dataSourceVirtualEnvironmentNodesRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentNodesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListNodes()
-
+ list, err := veClient.ListNodes(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cpuCount := make([]interface{}, len(list))
@@ -162,15 +164,24 @@ func dataSourceVirtualEnvironmentNodesRead(d *schema.ResourceData, m interface{}
d.SetId("nodes")
- d.Set(mkDataSourceVirtualEnvironmentNodesCPUCount, cpuCount)
- d.Set(mkDataSourceVirtualEnvironmentNodesCPUUtilization, cpuUtilization)
- d.Set(mkDataSourceVirtualEnvironmentNodesMemoryAvailable, memoryAvailable)
- d.Set(mkDataSourceVirtualEnvironmentNodesMemoryUsed, memoryUsed)
- d.Set(mkDataSourceVirtualEnvironmentNodesNames, name)
- d.Set(mkDataSourceVirtualEnvironmentNodesOnline, online)
- d.Set(mkDataSourceVirtualEnvironmentNodesSSLFingerprints, sslFingerprints)
- d.Set(mkDataSourceVirtualEnvironmentNodesSupportLevels, supportLevels)
- d.Set(mkDataSourceVirtualEnvironmentNodesUptime, uptime)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesCPUCount, cpuCount)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesCPUUtilization, cpuUtilization)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesMemoryAvailable, memoryAvailable)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesMemoryUsed, memoryUsed)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesNames, name)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesOnline, online)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesSSLFingerprints, sslFingerprints)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesSupportLevels, supportLevels)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentNodesUptime, uptime)
+ diags = append(diags, diag.FromErr(err)...)
return nil
}
diff --git a/proxmoxtf/data_source_virtual_environment_nodes_test.go b/proxmoxtf/data_source_virtual_environment_nodes_test.go
index eb8141e3..c738cdf9 100644
--- a/proxmoxtf/data_source_virtual_environment_nodes_test.go
+++ b/proxmoxtf/data_source_virtual_environment_nodes_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentNodesInstantiation tests whether the DataSourceVirtualEnvironmentNodes instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_pool.go b/proxmoxtf/data_source_virtual_environment_pool.go
index 4059f87a..ee7f9ffd 100644
--- a/proxmoxtf/data_source_virtual_environment_pool.go
+++ b/proxmoxtf/data_source_virtual_environment_pool.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -67,32 +69,33 @@ func dataSourceVirtualEnvironmentPool() *schema.Resource {
Required: true,
},
},
- Read: dataSourceVirtualEnvironmentPoolRead,
+ ReadContext: dataSourceVirtualEnvironmentPoolRead,
}
}
-func dataSourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentPoolRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
poolID := d.Get(mkDataSourceVirtualEnvironmentPoolPoolID).(string)
- pool, err := veClient.GetPool(poolID)
-
+ pool, err := veClient.GetPool(ctx, poolID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(poolID)
if pool.Comment != nil {
- d.Set(mkDataSourceVirtualEnvironmentPoolComment, pool.Comment)
+ err = d.Set(mkDataSourceVirtualEnvironmentPoolComment, pool.Comment)
} else {
- d.Set(mkDataSourceVirtualEnvironmentPoolComment, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentPoolComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
members := make([]interface{}, len(pool.Members))
@@ -119,7 +122,8 @@ func dataSourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{})
members[i] = values
}
- d.Set(mkDataSourceVirtualEnvironmentPoolMembers, members)
+ err = d.Set(mkDataSourceVirtualEnvironmentPoolMembers, members)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_pool_test.go b/proxmoxtf/data_source_virtual_environment_pool_test.go
index 6a9106de..acc828b8 100644
--- a/proxmoxtf/data_source_virtual_environment_pool_test.go
+++ b/proxmoxtf/data_source_virtual_environment_pool_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentPoolInstantiation tests whether the DataSourceVirtualEnvironmentPool instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_pools.go b/proxmoxtf/data_source_virtual_environment_pools.go
index 77f7b60e..365eca7f 100644
--- a/proxmoxtf/data_source_virtual_environment_pools.go
+++ b/proxmoxtf/data_source_virtual_environment_pools.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -22,22 +24,20 @@ func dataSourceVirtualEnvironmentPools() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentPoolsRead,
+ ReadContext: dataSourceVirtualEnvironmentPoolsRead,
}
}
-func dataSourceVirtualEnvironmentPoolsRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentPoolsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListPools()
-
+ list, err := veClient.ListPools(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
poolIDs := make([]interface{}, len(list))
@@ -48,7 +48,7 @@ func dataSourceVirtualEnvironmentPoolsRead(d *schema.ResourceData, m interface{}
d.SetId("pools")
- d.Set(mkDataSourceVirtualEnvironmentPoolsPoolIDs, poolIDs)
+ err = d.Set(mkDataSourceVirtualEnvironmentPoolsPoolIDs, poolIDs)
- return nil
+ return diag.FromErr(err)
}
diff --git a/proxmoxtf/data_source_virtual_environment_pools_test.go b/proxmoxtf/data_source_virtual_environment_pools_test.go
index d2af8194..dd53a2a3 100644
--- a/proxmoxtf/data_source_virtual_environment_pools_test.go
+++ b/proxmoxtf/data_source_virtual_environment_pools_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentPoolsInstantiation tests whether the DataSourceVirtualEnvironmentPools instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_role.go b/proxmoxtf/data_source_virtual_environment_role.go
index 288d81ea..87780cb8 100644
--- a/proxmoxtf/data_source_virtual_environment_role.go
+++ b/proxmoxtf/data_source_virtual_environment_role.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -28,23 +30,21 @@ func dataSourceVirtualEnvironmentRole() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentRoleRead,
+ ReadContext: dataSourceVirtualEnvironmentRoleRead,
}
}
-func dataSourceVirtualEnvironmentRoleRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentRoleRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
roleID := d.Get(mkDataSourceVirtualEnvironmentRoleID).(string)
- accessRole, err := veClient.GetRole(roleID)
-
+ accessRole, err := veClient.GetRole(ctx, roleID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
privileges := schema.NewSet(schema.HashString, []interface{}{})
@@ -57,7 +57,7 @@ func dataSourceVirtualEnvironmentRoleRead(d *schema.ResourceData, m interface{})
d.SetId(roleID)
- d.Set(mkDataSourceVirtualEnvironmentRolePrivileges, privileges)
+ err = d.Set(mkDataSourceVirtualEnvironmentRolePrivileges, privileges)
- return nil
+ return diag.FromErr(err)
}
diff --git a/proxmoxtf/data_source_virtual_environment_role_test.go b/proxmoxtf/data_source_virtual_environment_role_test.go
index ddbac565..260f21cc 100644
--- a/proxmoxtf/data_source_virtual_environment_role_test.go
+++ b/proxmoxtf/data_source_virtual_environment_role_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentRoleInstantiation tests whether the DataSourceVirtualEnvironmentRole instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_roles.go b/proxmoxtf/data_source_virtual_environment_roles.go
index 297f8a94..d9e99e5a 100644
--- a/proxmoxtf/data_source_virtual_environment_roles.go
+++ b/proxmoxtf/data_source_virtual_environment_roles.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -39,22 +41,22 @@ func dataSourceVirtualEnvironmentRoles() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeBool},
},
},
- Read: dataSourceVirtualEnvironmentRolesRead,
+ ReadContext: dataSourceVirtualEnvironmentRolesRead,
}
}
-func dataSourceVirtualEnvironmentRolesRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentRolesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListRoles()
-
+ list, err := veClient.ListRoles(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
privileges := make([]interface{}, len(list))
@@ -85,9 +87,12 @@ func dataSourceVirtualEnvironmentRolesRead(d *schema.ResourceData, m interface{}
d.SetId("roles")
- d.Set(mkDataSourceVirtualEnvironmentRolesPrivileges, privileges)
- d.Set(mkDataSourceVirtualEnvironmentRolesRoleIDs, roleIDs)
- d.Set(mkDataSourceVirtualEnvironmentRolesSpecial, special)
+ err = d.Set(mkDataSourceVirtualEnvironmentRolesPrivileges, privileges)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentRolesRoleIDs, roleIDs)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentRolesSpecial, special)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_roles_test.go b/proxmoxtf/data_source_virtual_environment_roles_test.go
index fa375e96..63fb19d7 100644
--- a/proxmoxtf/data_source_virtual_environment_roles_test.go
+++ b/proxmoxtf/data_source_virtual_environment_roles_test.go
@@ -5,7 +5,7 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"testing"
)
diff --git a/proxmoxtf/data_source_virtual_environment_time.go b/proxmoxtf/data_source_virtual_environment_time.go
index b05a3e9c..2d3ea80f 100644
--- a/proxmoxtf/data_source_virtual_environment_time.go
+++ b/proxmoxtf/data_source_virtual_environment_time.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"time"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -42,29 +44,28 @@ func dataSourceVirtualEnvironmentTime() *schema.Resource {
Computed: true,
},
},
- Read: dataSourceVirtualEnvironmentTimeRead,
+ ReadContext: dataSourceVirtualEnvironmentTimeRead,
}
}
-func dataSourceVirtualEnvironmentTimeRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentTimeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkDataSourceVirtualEnvironmentTimeNodeName).(string)
- nodeTime, err := veClient.GetNodeTime(nodeName)
-
+ nodeTime, err := veClient.GetNodeTime(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
localLocation, err := time.LoadLocation(nodeTime.TimeZone)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%s_time", nodeName))
@@ -72,9 +73,12 @@ func dataSourceVirtualEnvironmentTimeRead(d *schema.ResourceData, m interface{})
localTimeOffset := time.Time(nodeTime.LocalTime).Sub(time.Now().UTC())
localTime := time.Time(nodeTime.LocalTime).Add(-localTimeOffset).In(localLocation)
- d.Set(mkDataSourceVirtualEnvironmentTimeLocalTime, localTime.Format(time.RFC3339))
- d.Set(mkDataSourceVirtualEnvironmentTimeTimeZone, nodeTime.TimeZone)
- d.Set(mkDataSourceVirtualEnvironmentTimeUTCTime, time.Time(nodeTime.UTCTime).Format(time.RFC3339))
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeLocalTime, localTime.Format(time.RFC3339))
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeTimeZone, nodeTime.TimeZone)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeUTCTime, time.Time(nodeTime.UTCTime).Format(time.RFC3339))
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_time_test.go b/proxmoxtf/data_source_virtual_environment_time_test.go
index a45ba030..1451672f 100644
--- a/proxmoxtf/data_source_virtual_environment_time_test.go
+++ b/proxmoxtf/data_source_virtual_environment_time_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentTimeInstantiation tests whether the DataSourceVirtualEnvironmentRoles instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_user.go b/proxmoxtf/data_source_virtual_environment_user.go
index 7755dd82..36d4eb86 100644
--- a/proxmoxtf/data_source_virtual_environment_user.go
+++ b/proxmoxtf/data_source_virtual_environment_user.go
@@ -5,9 +5,11 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"time"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -100,34 +102,33 @@ func dataSourceVirtualEnvironmentUser() *schema.Resource {
Required: true,
},
},
- Read: dataSourceVirtualEnvironmentUserRead,
+ ReadContext: dataSourceVirtualEnvironmentUserRead,
}
}
-func dataSourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentUserRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
userID := d.Get(mkDataSourceVirtualEnvironmentUserUserID).(string)
- v, err := veClient.GetUser(userID)
-
+ v, err := veClient.GetUser(ctx, userID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- acl, err := veClient.GetACL()
-
+ acl, err := veClient.GetACL(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(userID)
- aclParsed := []interface{}{}
+ var aclParsed []interface{}
for _, v := range acl {
if v.Type == "user" && v.UserOrGroupID == userID {
@@ -147,61 +148,69 @@ func dataSourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{})
}
}
- d.Set(mkDataSourceVirtualEnvironmentUserACL, aclParsed)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserACL, aclParsed)
+ diags = append(diags, diag.FromErr(err)...)
if v.Comment != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserComment, v.Comment)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserComment, v.Comment)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserComment, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUserComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if v.Email != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserEmail, v.Email)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserEmail, v.Email)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserEmail, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUserEmail, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if v.Enabled != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserEnabled, v.Enabled)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserEnabled, v.Enabled)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserEnabled, true)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserEnabled, true)
}
+ diags = append(diags, diag.FromErr(err)...)
if v.ExpirationDate != nil {
t := time.Time(*v.ExpirationDate)
-
if t.Unix() > 0 {
- d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, t.UTC().Format(time.RFC3339))
+ err = d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, t.UTC().Format(time.RFC3339))
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
+ err = d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
}
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
+ err = d.Set(mkDataSourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
}
+ diags = append(diags, diag.FromErr(err)...)
if v.FirstName != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserFirstName, v.FirstName)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserFirstName, v.FirstName)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserFirstName, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUserFirstName, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if v.Groups != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserGroups, v.Groups)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserGroups, v.Groups)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserGroups, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUserGroups, []string{})
}
+ diags = append(diags, diag.FromErr(err)...)
if v.Keys != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserGroups, v.Keys)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersKeys, v.Keys)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserGroups, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersKeys, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if v.LastName != nil {
- d.Set(mkDataSourceVirtualEnvironmentUserLastName, v.LastName)
+ err = d.Set(mkDataSourceVirtualEnvironmentUserLastName, v.LastName)
} else {
- d.Set(mkDataSourceVirtualEnvironmentUserLastName, "")
+ err = d.Set(mkDataSourceVirtualEnvironmentUserLastName, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_user_test.go b/proxmoxtf/data_source_virtual_environment_user_test.go
index 9353cfac..4fcd2ffd 100644
--- a/proxmoxtf/data_source_virtual_environment_user_test.go
+++ b/proxmoxtf/data_source_virtual_environment_user_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentUserInstantiation tests whether the DataSourceVirtualEnvironmentUser instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_users.go b/proxmoxtf/data_source_virtual_environment_users.go
index d7b85105..e5282e23 100644
--- a/proxmoxtf/data_source_virtual_environment_users.go
+++ b/proxmoxtf/data_source_virtual_environment_users.go
@@ -5,9 +5,11 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"time"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -83,22 +85,22 @@ func dataSourceVirtualEnvironmentUsers() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Read: dataSourceVirtualEnvironmentUsersRead,
+ ReadContext: dataSourceVirtualEnvironmentUsersRead,
}
}
-func dataSourceVirtualEnvironmentUsersRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentUsersRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- list, err := veClient.ListUsers()
-
+ list, err := veClient.ListUsers(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
comments := make([]interface{}, len(list))
@@ -171,15 +173,24 @@ func dataSourceVirtualEnvironmentUsersRead(d *schema.ResourceData, m interface{}
d.SetId("users")
- d.Set(mkDataSourceVirtualEnvironmentUsersComments, comments)
- d.Set(mkDataSourceVirtualEnvironmentUsersEmails, emails)
- d.Set(mkDataSourceVirtualEnvironmentUsersEnabled, enabled)
- d.Set(mkDataSourceVirtualEnvironmentUsersExpirationDates, expirationDates)
- d.Set(mkDataSourceVirtualEnvironmentUsersFirstNames, firstNames)
- d.Set(mkDataSourceVirtualEnvironmentUsersGroups, groups)
- d.Set(mkDataSourceVirtualEnvironmentUsersKeys, keys)
- d.Set(mkDataSourceVirtualEnvironmentUsersLastNames, lastNames)
- d.Set(mkDataSourceVirtualEnvironmentUsersUserIDs, userIDs)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersComments, comments)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersEmails, emails)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersEnabled, enabled)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersExpirationDates, expirationDates)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersFirstNames, firstNames)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersGroups, groups)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersKeys, keys)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersLastNames, lastNames)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentUsersUserIDs, userIDs)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_users_test.go b/proxmoxtf/data_source_virtual_environment_users_test.go
index 376c36b2..9a25412d 100644
--- a/proxmoxtf/data_source_virtual_environment_users_test.go
+++ b/proxmoxtf/data_source_virtual_environment_users_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentUsersInstantiation tests whether the DataSourceVirtualEnvironmentUsers instance can be instantiated.
diff --git a/proxmoxtf/data_source_virtual_environment_version.go b/proxmoxtf/data_source_virtual_environment_version.go
index be12638b..422b48b1 100644
--- a/proxmoxtf/data_source_virtual_environment_version.go
+++ b/proxmoxtf/data_source_virtual_environment_version.go
@@ -5,7 +5,9 @@
package proxmoxtf
import (
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -43,30 +45,34 @@ func dataSourceVirtualEnvironmentVersion() *schema.Resource {
ForceNew: true,
},
},
- Read: dataSourceVirtualEnvironmentVersionRead,
+ ReadContext: dataSourceVirtualEnvironmentVersionRead,
}
}
-func dataSourceVirtualEnvironmentVersionRead(d *schema.ResourceData, m interface{}) error {
+func dataSourceVirtualEnvironmentVersionRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- version, err := veClient.Version()
-
+ version, err := veClient.Version(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId("version")
- d.Set(mkDataSourceVirtualEnvironmentVersionKeyboardLayout, version.Keyboard)
- d.Set(mkDataSourceVirtualEnvironmentVersionRelease, version.Release)
- d.Set(mkDataSourceVirtualEnvironmentVersionRepositoryID, version.RepositoryID)
- d.Set(mkDataSourceVirtualEnvironmentVersionVersion, version.Version)
+ err = d.Set(mkDataSourceVirtualEnvironmentVersionKeyboardLayout, version.Keyboard)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentVersionRelease, version.Release)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentVersionRepositoryID, version.RepositoryID)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentVersionVersion, version.Version)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
diff --git a/proxmoxtf/data_source_virtual_environment_version_test.go b/proxmoxtf/data_source_virtual_environment_version_test.go
index 30e1fe03..ed176a70 100644
--- a/proxmoxtf/data_source_virtual_environment_version_test.go
+++ b/proxmoxtf/data_source_virtual_environment_version_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestDataSourceVirtualEnvironmentVersionInstantiation tests whether the DataSourceVirtualEnvironmentVersion instance can be instantiated.
diff --git a/proxmoxtf/provider.go b/proxmoxtf/provider.go
index 1c91927e..a0c8c8d8 100644
--- a/proxmoxtf/provider.go
+++ b/proxmoxtf/provider.go
@@ -5,12 +5,14 @@
package proxmoxtf
import (
+ "context"
"errors"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"net/url"
"os"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -34,7 +36,7 @@ type providerConfiguration struct {
// Provider returns the object for this provider.
func Provider() *schema.Provider {
return &schema.Provider{
- ConfigureFunc: providerConfigure,
+ ConfigureContextFunc: providerConfigure,
DataSourcesMap: map[string]*schema.Resource{
"proxmox_virtual_environment_cluster_alias": dataSourceVirtualEnvironmentClusterAlias(),
"proxmox_virtual_environment_cluster_aliases": dataSourceVirtualEnvironmentClusterAliases(),
@@ -87,7 +89,7 @@ func Provider() *schema.Provider {
if value == "" {
return []string{}, []error{
- errors.New("You must specify an endpoint for the Proxmox Virtual Environment API (valid: https://host:port)"),
+ errors.New("you must specify an endpoint for the Proxmox Virtual Environment API (valid: https://host:port)"),
}
}
@@ -95,7 +97,7 @@ func Provider() *schema.Provider {
if err != nil {
return []string{}, []error{
- errors.New("You must specify a valid endpoint for the Proxmox Virtual Environment API (valid: https://host:port)"),
+ errors.New("you must specify a valid endpoint for the Proxmox Virtual Environment API (valid: https://host:port)"),
}
}
@@ -140,7 +142,7 @@ func Provider() *schema.Provider {
if value == "" {
return []string{}, []error{
- errors.New("You must specify a password for the Proxmox Virtual Environment API"),
+ errors.New("you must specify a password for the Proxmox Virtual Environment API"),
}
}
@@ -160,7 +162,7 @@ func Provider() *schema.Provider {
if value == "" {
return []string{}, []error{
- errors.New("You must specify a username for the Proxmox Virtual Environment API (valid: username@realm)"),
+ errors.New("you must specify a username for the Proxmox Virtual Environment API (valid: username@realm)"),
}
}
@@ -175,7 +177,7 @@ func Provider() *schema.Provider {
}
}
-func providerConfigure(d *schema.ResourceData) (interface{}, error) {
+func providerConfigure(_ context.Context, d *schema.ResourceData) (interface{}, diag.Diagnostics) {
var err error
var veClient *proxmox.VirtualEnvironmentClient
@@ -192,9 +194,8 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
veConfig[mkProviderVirtualEnvironmentOTP].(string),
veConfig[mkProviderVirtualEnvironmentInsecure].(bool),
)
-
if err != nil {
- return nil, err
+ return nil, diag.FromErr(err)
}
}
@@ -207,7 +208,7 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
func (c *providerConfiguration) GetVEClient() (*proxmox.VirtualEnvironmentClient, error) {
if c.veClient == nil {
- return nil, errors.New("You must specify the virtual environment details in the provider configuration")
+ return nil, errors.New("you must specify the virtual environment details in the provider configuration")
}
return c.veClient, nil
diff --git a/proxmoxtf/provider_test.go b/proxmoxtf/provider_test.go
index fd994a35..e1064806 100644
--- a/proxmoxtf/provider_test.go
+++ b/proxmoxtf/provider_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestProviderInstantiation() tests whether the Provider instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_certificate.go b/proxmoxtf/resource_virtual_environment_certificate.go
index bfc57af3..d3b50df2 100644
--- a/proxmoxtf/resource_virtual_environment_certificate.go
+++ b/proxmoxtf/resource_virtual_environment_certificate.go
@@ -5,12 +5,14 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"time"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -112,18 +114,17 @@ func resourceVirtualEnvironmentCertificate() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Create: resourceVirtualEnvironmentCertificateCreate,
- Read: resourceVirtualEnvironmentCertificateRead,
- Update: resourceVirtualEnvironmentCertificateUpdate,
- Delete: resourceVirtualEnvironmentCertificateDelete,
+ CreateContext: resourceVirtualEnvironmentCertificateCreate,
+ ReadContext: resourceVirtualEnvironmentCertificateRead,
+ UpdateContext: resourceVirtualEnvironmentCertificateUpdate,
+ DeleteContext: resourceVirtualEnvironmentCertificateDelete,
}
}
-func resourceVirtualEnvironmentCertificateCreate(d *schema.ResourceData, m interface{}) error {
- err := resourceVirtualEnvironmentCertificateUpdate(d, m)
-
- if err != nil {
- return err
+func resourceVirtualEnvironmentCertificateCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ diags := resourceVirtualEnvironmentCertificateUpdate(ctx, d, m)
+ if diags.HasError() {
+ return diags
}
nodeName := d.Get(mkResourceVirtualEnvironmentCertificateNodeName).(string)
@@ -133,7 +134,7 @@ func resourceVirtualEnvironmentCertificateCreate(d *schema.ResourceData, m inter
return nil
}
-func resourceVirtualEnvironmentCertificateGetUpdateBody(d *schema.ResourceData, m interface{}) (*proxmox.VirtualEnvironmentCertificateUpdateRequestBody, error) {
+func resourceVirtualEnvironmentCertificateGetUpdateBody(d *schema.ResourceData) (*proxmox.VirtualEnvironmentCertificateUpdateRequestBody, error) {
certificate := d.Get(mkResourceVirtualEnvironmentCertificateCertificate).(string)
certificateChain := d.Get(mkResourceVirtualEnvironmentCertificateCertificateChain).(string)
overwrite := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentCertificateOverwrite).(bool))
@@ -148,7 +149,7 @@ func resourceVirtualEnvironmentCertificateGetUpdateBody(d *schema.ResourceData,
force := overwrite
if d.Id() != "" {
- force = proxmox.CustomBool(true)
+ force = true
}
restart := proxmox.CustomBool(true)
@@ -163,23 +164,25 @@ func resourceVirtualEnvironmentCertificateGetUpdateBody(d *schema.ResourceData,
return body, nil
}
-func resourceVirtualEnvironmentCertificateRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentCertificateRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentCertificateNodeName).(string)
- list, err := veClient.ListCertificates(nodeName)
-
+ list, err := veClient.ListCertificates(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- d.Set(mkResourceVirtualEnvironmentCertificateCertificate, "")
- d.Set(mkResourceVirtualEnvironmentCertificateCertificateChain, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateCertificate, "")
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateCertificateChain, "")
+ diags = append(diags, diag.FromErr(err)...)
certificateChain := d.Get(mkResourceVirtualEnvironmentCertificateCertificateChain).(string)
@@ -200,125 +203,125 @@ func resourceVirtualEnvironmentCertificateRead(d *schema.ResourceData, m interfa
newCertificate = *c.Certificates
}
- d.Set(mkResourceVirtualEnvironmentCertificateCertificate, newCertificate)
- d.Set(mkResourceVirtualEnvironmentCertificateCertificateChain, newCertificateChain)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateCertificate, newCertificate)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateCertificateChain, newCertificateChain)
+ diags = append(diags, diag.FromErr(err)...)
}
- d.Set(mkResourceVirtualEnvironmentCertificateFileName, *c.FileName)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateFileName, *c.FileName)
+ diags = append(diags, diag.FromErr(err)...)
if c.NotAfter != nil {
t := time.Time(*c.NotAfter)
-
- d.Set(mkResourceVirtualEnvironmentCertificateExpirationDate, t.UTC().Format(time.RFC3339))
+ err = d.Set(mkResourceVirtualEnvironmentCertificateExpirationDate, t.UTC().Format(time.RFC3339))
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateExpirationDate, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateExpirationDate, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.Issuer != nil {
- d.Set(mkResourceVirtualEnvironmentCertificateIssuer, *c.Issuer)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateIssuer, *c.Issuer)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateIssuer, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateIssuer, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.PublicKeyBits != nil {
- d.Set(mkResourceVirtualEnvironmentCertificatePublicKeySize, *c.PublicKeyBits)
+ err = d.Set(mkResourceVirtualEnvironmentCertificatePublicKeySize, *c.PublicKeyBits)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificatePublicKeySize, 0)
+ err = d.Set(mkResourceVirtualEnvironmentCertificatePublicKeySize, 0)
}
+ diags = append(diags, diag.FromErr(err)...)
if c.PublicKeyType != nil {
pkType := *c.PublicKeyType
-
for _, pkt := range []string{"ecdsa", "dsa", "rsa"} {
if strings.Contains(pkType, pkt) {
pkType = pkt
}
}
-
- d.Set(mkResourceVirtualEnvironmentCertificatePublicKeyType, pkType)
+ err = d.Set(mkResourceVirtualEnvironmentCertificatePublicKeyType, pkType)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificatePublicKeyType, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificatePublicKeyType, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.Fingerprint != nil {
- d.Set(mkResourceVirtualEnvironmentCertificateSSLFingerprint, *c.Fingerprint)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSSLFingerprint, *c.Fingerprint)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateSSLFingerprint, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSSLFingerprint, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.NotBefore != nil {
t := time.Time(*c.NotBefore)
-
- d.Set(mkResourceVirtualEnvironmentCertificateStartDate, t.UTC().Format(time.RFC3339))
+ err = d.Set(mkResourceVirtualEnvironmentCertificateStartDate, t.UTC().Format(time.RFC3339))
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateStartDate, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateStartDate, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.Subject != nil {
- d.Set(mkResourceVirtualEnvironmentCertificateSubject, *c.Subject)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSubject, *c.Subject)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateSubject, "")
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSubject, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if c.SubjectAlternativeNames != nil {
sanList := make([]interface{}, len(*c.SubjectAlternativeNames))
-
for i, san := range *c.SubjectAlternativeNames {
sanList[i] = san
}
-
- d.Set(mkResourceVirtualEnvironmentCertificateSubjectAlternativeNames, sanList)
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSubjectAlternativeNames, sanList)
} else {
- d.Set(mkResourceVirtualEnvironmentCertificateSubjectAlternativeNames, []interface{}{})
+ err = d.Set(mkResourceVirtualEnvironmentCertificateSubjectAlternativeNames, []interface{}{})
}
+ diags = append(diags, diag.FromErr(err)...)
}
}
- return nil
+ return diags
}
-func resourceVirtualEnvironmentCertificateUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentCertificateUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentCertificateNodeName).(string)
- body, err := resourceVirtualEnvironmentCertificateGetUpdateBody(d, m)
-
+ body, err := resourceVirtualEnvironmentCertificateGetUpdateBody(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.UpdateCertificate(nodeName, body)
-
+ err = veClient.UpdateCertificate(ctx, nodeName, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentCertificateRead(d, m)
+ return resourceVirtualEnvironmentCertificateRead(ctx, d, m)
}
-func resourceVirtualEnvironmentCertificateDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentCertificateDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentCertificateNodeName).(string)
restart := proxmox.CustomBool(true)
- err = veClient.DeleteCertificate(nodeName, &proxmox.VirtualEnvironmentCertificateDeleteRequestBody{
+ err = veClient.DeleteCertificate(ctx, nodeName, &proxmox.VirtualEnvironmentCertificateDeleteRequestBody{
Restart: &restart,
})
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_certificate_test.go b/proxmoxtf/resource_virtual_environment_certificate_test.go
index 9a5e2140..6fdbac20 100644
--- a/proxmoxtf/resource_virtual_environment_certificate_test.go
+++ b/proxmoxtf/resource_virtual_environment_certificate_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentCertificateInstantiation tests whether the ResourceVirtualEnvironmentCertificate instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_cluster_alias.go b/proxmoxtf/resource_virtual_environment_cluster_alias.go
index 1fcbdc8a..69a569de 100644
--- a/proxmoxtf/resource_virtual_environment_cluster_alias.go
+++ b/proxmoxtf/resource_virtual_environment_cluster_alias.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -41,19 +43,18 @@ func resourceVirtualEnvironmentClusterAlias() *schema.Resource {
Default: dvResourceVirtualEnvironmentClusterAliasComment,
},
},
- Create: resourceVirtualEnvironmentClusterAliasCreate,
- Read: resourceVirtualEnvironmentClusterAliasRead,
- Update: resourceVirtualEnvironmentClusterAliasUpdate,
- Delete: resourceVirtualEnvironmentClusterAliasDelete,
+ CreateContext: resourceVirtualEnvironmentClusterAliasCreate,
+ ReadContext: resourceVirtualEnvironmentClusterAliasRead,
+ UpdateContext: resourceVirtualEnvironmentClusterAliasUpdate,
+ DeleteContext: resourceVirtualEnvironmentClusterAliasDelete,
}
}
-func resourceVirtualEnvironmentClusterAliasCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterAliasCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentClusterAliasComment).(string)
@@ -66,35 +67,32 @@ func resourceVirtualEnvironmentClusterAliasCreate(d *schema.ResourceData, m inte
CIDR: cidr,
}
- err = veClient.CreateAlias(body)
-
+ err = veClient.CreateAlias(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(name)
- return resourceVirtualEnvironmentClusterAliasRead(d, m)
+ return resourceVirtualEnvironmentClusterAliasRead(ctx, d, m)
}
-func resourceVirtualEnvironmentClusterAliasRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterAliasRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
name := d.Id()
- alias, err := veClient.GetAlias(name)
+ alias, err := veClient.GetAlias(ctx, name)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
d.SetId("")
return nil
}
-
- return err
+ return diag.FromErr(err)
}
aliasMap := map[string]interface{}{
@@ -105,21 +103,19 @@ func resourceVirtualEnvironmentClusterAliasRead(d *schema.ResourceData, m interf
for key, val := range aliasMap {
err = d.Set(key, val)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
return nil
}
-func resourceVirtualEnvironmentClusterAliasUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterAliasUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentClusterAliasComment).(string)
@@ -133,35 +129,32 @@ func resourceVirtualEnvironmentClusterAliasUpdate(d *schema.ResourceData, m inte
Comment: &comment,
}
- err = veClient.UpdateAlias(previousName, body)
-
+ err = veClient.UpdateAlias(ctx, previousName, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(newName)
- return resourceVirtualEnvironmentClusterAliasRead(d, m)
+ return resourceVirtualEnvironmentClusterAliasRead(ctx, d, m)
}
-func resourceVirtualEnvironmentClusterAliasDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterAliasDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return nil
+ return diag.FromErr(err)
}
name := d.Id()
- err = veClient.DeleteAlias(name)
+ err = veClient.DeleteAlias(ctx, name)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
d.SetId("")
return nil
}
-
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_cluster_alias_test.go b/proxmoxtf/resource_virtual_environment_cluster_alias_test.go
index bb30ae40..5c0b0eee 100644
--- a/proxmoxtf/resource_virtual_environment_cluster_alias_test.go
+++ b/proxmoxtf/resource_virtual_environment_cluster_alias_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentAliasInstantiation tests whether the ResourceVirtualEnvironmentAlias instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_cluster_ipset.go b/proxmoxtf/resource_virtual_environment_cluster_ipset.go
index f4be044f..4ae743ee 100644
--- a/proxmoxtf/resource_virtual_environment_cluster_ipset.go
+++ b/proxmoxtf/resource_virtual_environment_cluster_ipset.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -63,6 +65,8 @@ func resourceVirtualEnvironmentClusterIPSet() *schema.Resource {
},
},
},
+ MaxItems: 14,
+ MinItems: 0,
},
mkResourceVirtualEnvironmentClusterIPSetCIDRComment: {
Type: schema.TypeString,
@@ -71,19 +75,18 @@ func resourceVirtualEnvironmentClusterIPSet() *schema.Resource {
Default: dvResourceVirtualEnvironmentClusterIPSetCIDRComment,
},
},
- Create: resourceVirtualEnvironmentClusterIPSetCreate,
- Read: resourceVirtualEnvironmentClusterIPSetRead,
- Update: resourceVirtualEnvironmentClusterIPSetUpdate,
- Delete: resourceVirtualEnvironmentClusterIPSetDelete,
+ CreateContext: resourceVirtualEnvironmentClusterIPSetCreate,
+ ReadContext: resourceVirtualEnvironmentClusterIPSetRead,
+ UpdateContext: resourceVirtualEnvironmentClusterIPSetUpdate,
+ DeleteContext: resourceVirtualEnvironmentClusterIPSetDelete,
}
}
-func resourceVirtualEnvironmentClusterIPSetCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterIPSetCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentClusterIPSetCIDRComment).(string)
@@ -116,80 +119,80 @@ func resourceVirtualEnvironmentClusterIPSetCreate(d *schema.ResourceData, m inte
Name: name,
}
- err = veClient.CreateIPSet(body)
-
+ err = veClient.CreateIPSet(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for _, v := range IPSetsArray {
- err = veClient.AddCIDRToIPSet(name, &v)
-
+ err = veClient.AddCIDRToIPSet(ctx, name, &v)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
d.SetId(name)
- return resourceVirtualEnvironmentClusterIPSetRead(d, m)
+ return resourceVirtualEnvironmentClusterIPSetRead(ctx, d, m)
}
-func resourceVirtualEnvironmentClusterIPSetRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterIPSetRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
name := d.Id()
- allIPSets, err := veClient.GetListIPSets()
-
+ allIPSets, err := veClient.GetListIPSets(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for _, v := range allIPSets.Data {
if v.Name == name {
err = d.Set(mkResourceVirtualEnvironmentClusterIPSetName, v.Name)
-
- if err != nil {
- return err
- }
-
+ diags = append(diags, diag.FromErr(err)...)
err = d.Set(mkResourceVirtualEnvironmentClusterIPSetCIDRComment, v.Comment)
-
- if err != nil {
- return err
- }
+ diags = append(diags, diag.FromErr(err)...)
}
}
- IPSet, err := veClient.GetListIPSetContent(name)
+ IPSet, err := veClient.GetListIPSetContent(ctx, name)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
d.SetId("")
return nil
}
-
- return err
+ diags = append(diags, diag.FromErr(err)...)
+ return diags
}
+ var entries []interface{}
+
for key := range IPSet {
- d.Set(mkResourceVirtualEnvironmentClusterIPSetCIDR, IPSet[key])
+ entry := map[string]interface{}{}
+
+ entry[mkResourceVirtualEnvironmentClusterIPSetCIDRName] = IPSet[key].CIDR
+ entry[mkResourceVirtualEnvironmentClusterIPSetCIDRNoMatch] = IPSet[key].NoMatch
+ entry[mkResourceVirtualEnvironmentClusterIPSetCIDRComment] = IPSet[key].Comment
+
+ entries = append(entries, entry)
}
- return nil
+ err = d.Set(mkResourceVirtualEnvironmentClusterIPSetCIDR, entries)
+ diags = append(diags, diag.FromErr(err)...)
+ return diags
}
-func resourceVirtualEnvironmentClusterIPSetUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterIPSetUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentClusterIPSetCIDRComment).(string)
@@ -202,44 +205,44 @@ func resourceVirtualEnvironmentClusterIPSetUpdate(d *schema.ResourceData, m inte
Comment: &comment,
}
- err = veClient.UpdateIPSet(body)
-
+ err = veClient.UpdateIPSet(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(newName)
- return resourceVirtualEnvironmentClusterIPSetRead(d, m)
+ return resourceVirtualEnvironmentClusterIPSetRead(ctx, d, m)
}
-func resourceVirtualEnvironmentClusterIPSetDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentClusterIPSetDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return nil
+ return diag.FromErr(err)
}
name := d.Id()
- IPSetContent, err := veClient.GetListIPSetContent(name)
-
+ IPSetContent, err := veClient.GetListIPSetContent(ctx, name)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// PVE requires content of IPSet be cleared before removal
if len(IPSetContent) > 0 {
for _, IPSet := range IPSetContent {
- err = veClient.DeleteIPSetContent(name, IPSet.CIDR)
- if err != nil {
- return err
- }
+ err = veClient.DeleteIPSetContent(ctx, name, IPSet.CIDR)
+ diags = append(diags, diag.FromErr(err)...)
}
}
- err = veClient.DeleteIPSet(name)
+ if diags.HasError() {
+ return diags
+ }
+
+ err = veClient.DeleteIPSet(ctx, name)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -247,7 +250,7 @@ func resourceVirtualEnvironmentClusterIPSetDelete(d *schema.ResourceData, m inte
return nil
}
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_cluster_ipset_test.go b/proxmoxtf/resource_virtual_environment_cluster_ipset_test.go
index 56edb678..0a5497cd 100644
--- a/proxmoxtf/resource_virtual_environment_cluster_ipset_test.go
+++ b/proxmoxtf/resource_virtual_environment_cluster_ipset_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentIPSetInstantiation tests whether the resourceVirtualEnvironmentClusterIPSet
diff --git a/proxmoxtf/resource_virtual_environment_container.go b/proxmoxtf/resource_virtual_environment_container.go
index 67a1096c..5121426c 100644
--- a/proxmoxtf/resource_virtual_environment_container.go
+++ b/proxmoxtf/resource_virtual_environment_container.go
@@ -5,13 +5,15 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strconv"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
- "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
const (
@@ -126,11 +128,11 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Default: dvResourceVirtualEnvironmentContainerCloneNodeName,
},
mkResourceVirtualEnvironmentContainerCloneVMID: {
- Type: schema.TypeInt,
- Description: "The ID of the source container",
- Required: true,
- ForceNew: true,
- ValidateFunc: getVMIDValidator(),
+ Type: schema.TypeInt,
+ Description: "The ID of the source container",
+ Required: true,
+ ForceNew: true,
+ ValidateDiagFunc: getVMIDValidator(),
},
},
},
@@ -159,18 +161,18 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Default: dvResourceVirtualEnvironmentContainerConsoleEnabled,
},
mkResourceVirtualEnvironmentContainerConsoleMode: {
- Type: schema.TypeString,
- Description: "The console mode",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerConsoleMode,
- ValidateFunc: resourceVirtualEnvironmentContainerGetConsoleModeValidator(),
+ Type: schema.TypeString,
+ Description: "The console mode",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerConsoleMode,
+ ValidateDiagFunc: resourceVirtualEnvironmentContainerGetConsoleModeValidator(),
},
mkResourceVirtualEnvironmentContainerConsoleTTYCount: {
- Type: schema.TypeInt,
- Description: "The number of available TTY",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerConsoleTTYCount,
- ValidateFunc: validation.IntBetween(0, 6),
+ Type: schema.TypeInt,
+ Description: "The number of available TTY",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerConsoleTTYCount,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 6)),
},
},
},
@@ -193,25 +195,25 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentContainerCPUArchitecture: {
- Type: schema.TypeString,
- Description: "The CPU architecture",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerCPUArchitecture,
- ValidateFunc: resourceVirtualEnvironmentContainerGetCPUArchitectureValidator(),
+ Type: schema.TypeString,
+ Description: "The CPU architecture",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerCPUArchitecture,
+ ValidateDiagFunc: resourceVirtualEnvironmentContainerGetCPUArchitectureValidator(),
},
mkResourceVirtualEnvironmentContainerCPUCores: {
- Type: schema.TypeInt,
- Description: "The number of CPU cores",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerCPUCores,
- ValidateFunc: validation.IntBetween(1, 128),
+ Type: schema.TypeInt,
+ Description: "The number of CPU cores",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerCPUCores,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(1, 128)),
},
mkResourceVirtualEnvironmentContainerCPUUnits: {
- Type: schema.TypeInt,
- Description: "The CPU units",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerCPUUnits,
- ValidateFunc: validation.IntBetween(0, 500000),
+ Type: schema.TypeInt,
+ Description: "The CPU units",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerCPUUnits,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 500000)),
},
},
},
@@ -413,18 +415,18 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentContainerMemoryDedicated: {
- Type: schema.TypeInt,
- Description: "The dedicated memory in megabytes",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerMemoryDedicated,
- ValidateFunc: validation.IntBetween(16, 268435456),
+ Type: schema.TypeInt,
+ Description: "The dedicated memory in megabytes",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerMemoryDedicated,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(16, 268435456)),
},
mkResourceVirtualEnvironmentContainerMemorySwap: {
- Type: schema.TypeInt,
- Description: "The swap size in megabytes",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerMemorySwap,
- ValidateFunc: validation.IntBetween(0, 268435456),
+ Type: schema.TypeInt,
+ Description: "The swap size in megabytes",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerMemorySwap,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 268435456)),
},
},
},
@@ -460,7 +462,7 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
return new == ""
},
- ValidateFunc: getMACAddressValidator(),
+ ValidateDiagFunc: getMACAddressValidator(),
},
mkResourceVirtualEnvironmentContainerNetworkInterfaceName: {
Type: schema.TypeString,
@@ -498,18 +500,18 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentContainerOperatingSystemTemplateFileID: {
- Type: schema.TypeString,
- Description: "The ID of an OS template file",
- Required: true,
- ForceNew: true,
- ValidateFunc: getFileIDValidator(),
+ Type: schema.TypeString,
+ Description: "The ID of an OS template file",
+ Required: true,
+ ForceNew: true,
+ ValidateDiagFunc: getFileIDValidator(),
},
mkResourceVirtualEnvironmentContainerOperatingSystemType: {
- Type: schema.TypeString,
- Description: "The type",
- Optional: true,
- Default: dvResourceVirtualEnvironmentContainerOperatingSystemType,
- ValidateFunc: resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The type",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentContainerOperatingSystemType,
+ ValidateDiagFunc: resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator(),
},
},
},
@@ -540,37 +542,36 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
Default: dvResourceVirtualEnvironmentContainerTemplate,
},
mkResourceVirtualEnvironmentContainerVMID: {
- Type: schema.TypeInt,
- Description: "The VM identifier",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentContainerVMID,
- ValidateFunc: getVMIDValidator(),
+ Type: schema.TypeInt,
+ Description: "The VM identifier",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentContainerVMID,
+ ValidateDiagFunc: getVMIDValidator(),
},
},
- Create: resourceVirtualEnvironmentContainerCreate,
- Read: resourceVirtualEnvironmentContainerRead,
- Update: resourceVirtualEnvironmentContainerUpdate,
- Delete: resourceVirtualEnvironmentContainerDelete,
+ CreateContext: resourceVirtualEnvironmentContainerCreate,
+ ReadContext: resourceVirtualEnvironmentContainerRead,
+ UpdateContext: resourceVirtualEnvironmentContainerUpdate,
+ DeleteContext: resourceVirtualEnvironmentContainerDelete,
}
}
-func resourceVirtualEnvironmentContainerCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
clone := d.Get(mkResourceVirtualEnvironmentContainerClone).([]interface{})
if len(clone) > 0 {
- return resourceVirtualEnvironmentContainerCreateClone(d, m)
+ return resourceVirtualEnvironmentContainerCreateClone(ctx, d, m)
}
- return resourceVirtualEnvironmentContainerCreateCustom(d, m)
+ return resourceVirtualEnvironmentContainerCreateCustom(ctx, d, m)
}
-func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
clone := d.Get(mkResourceVirtualEnvironmentContainerClone).([]interface{})
@@ -594,10 +595,9 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
vmID := d.Get(mkResourceVirtualEnvironmentContainerVMID).(int)
if vmID == -1 {
- vmIDNew, err := veClient.GetVMID()
-
+ vmIDNew, err := veClient.GetVMID(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
vmID = *vmIDNew
@@ -629,22 +629,21 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
if cloneNodeName != "" && cloneNodeName != nodeName {
cloneBody.TargetNodeName = &nodeName
- err = veClient.CloneContainer(cloneNodeName, cloneVMID, cloneBody)
+ err = veClient.CloneContainer(ctx, cloneNodeName, cloneVMID, cloneBody)
} else {
- err = veClient.CloneContainer(nodeName, cloneVMID, cloneBody)
+ err = veClient.CloneContainer(ctx, nodeName, cloneVMID, cloneBody)
}
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(strconv.Itoa(vmID))
// Wait for the container to be created and its configuration lock to be released.
- err = veClient.WaitForContainerLock(nodeName, vmID, 600, 5, true)
-
+ err = veClient.WaitForContainerLock(ctx, nodeName, vmID, 600, 5, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Now that the virtual machine has been cloned, we need to perform some modifications.
@@ -678,10 +677,10 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
updateBody.CPUUnits = &cpuUnits
}
- initializationIPConfigIPv4Address := []string{}
- initializationIPConfigIPv4Gateway := []string{}
- initializationIPConfigIPv6Address := []string{}
- initializationIPConfigIPv6Gateway := []string{}
+ var initializationIPConfigIPv4Address []string
+ var initializationIPConfigIPv4Gateway []string
+ var initializationIPConfigIPv6Address []string
+ var initializationIPConfigIPv6Gateway []string
if len(initialization) > 0 {
initializationBlock := initialization[0].(map[string]interface{})
@@ -774,10 +773,9 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
if len(networkInterface) == 0 {
- networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)
-
+ networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(ctx, veClient, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -865,47 +863,42 @@ func resourceVirtualEnvironmentContainerCreateClone(d *schema.ResourceData, m in
updateBody.Template = &template
}
- err = veClient.UpdateContainer(nodeName, vmID, updateBody)
-
+ err = veClient.UpdateContainer(ctx, nodeName, vmID, updateBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Wait for the container's lock to be released.
- err = veClient.WaitForContainerLock(nodeName, vmID, 600, 5, true)
-
+ err = veClient.WaitForContainerLock(ctx, nodeName, vmID, 600, 5, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentContainerCreateStart(d, m)
+ return resourceVirtualEnvironmentContainerCreateStart(ctx, d, m)
}
-func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentContainerNodeName).(string)
resource := resourceVirtualEnvironmentContainer()
- consoleBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerConsole}, 0, true)
-
+ consoleBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerConsole}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
consoleEnabled := proxmox.CustomBool(consoleBlock[mkResourceVirtualEnvironmentContainerConsoleEnabled].(bool))
consoleMode := consoleBlock[mkResourceVirtualEnvironmentContainerConsoleMode].(string)
consoleTTYCount := consoleBlock[mkResourceVirtualEnvironmentContainerConsoleTTYCount].(int)
- cpuBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerCPU}, 0, true)
-
+ cpuBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerCPU}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cpuArchitecture := cpuBlock[mkResourceVirtualEnvironmentContainerCPUArchitecture].(string)
@@ -914,10 +907,9 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
description := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
- diskBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerDisk}, 0, true)
-
+ diskBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerDisk}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
diskDatastoreID := diskBlock[mkResourceVirtualEnvironmentContainerDiskDatastoreID].(string)
@@ -926,10 +918,10 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain
initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer
initializationHostname := dvResourceVirtualEnvironmentContainerInitializationHostname
- initializationIPConfigIPv4Address := []string{}
- initializationIPConfigIPv4Gateway := []string{}
- initializationIPConfigIPv6Address := []string{}
- initializationIPConfigIPv6Gateway := []string{}
+ var initializationIPConfigIPv4Address []string
+ var initializationIPConfigIPv4Gateway []string
+ var initializationIPConfigIPv6Address []string
+ var initializationIPConfigIPv6Gateway []string
initializationUserAccountKeys := proxmox.VirtualEnvironmentContainerCustomSSHKeys{}
initializationUserAccountPassword := dvResourceVirtualEnvironmentContainerInitializationUserAccountPassword
@@ -989,10 +981,9 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
}
}
- memoryBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerMemory}, 0, true)
-
+ memoryBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerMemory}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
memoryDedicated := memoryBlock[mkResourceVirtualEnvironmentContainerMemoryDedicated].(int)
@@ -1056,7 +1047,7 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
operatingSystem := d.Get(mkResourceVirtualEnvironmentContainerOperatingSystem).([]interface{})
if len(operatingSystem) == 0 {
- return fmt.Errorf("\"%s\": required field is not set", mkResourceVirtualEnvironmentContainerOperatingSystem)
+ return diag.Errorf("\"%s\": required field is not set", mkResourceVirtualEnvironmentContainerOperatingSystem)
}
operatingSystemBlock := operatingSystem[0].(map[string]interface{})
@@ -1069,10 +1060,9 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
vmID := d.Get(mkResourceVirtualEnvironmentContainerVMID).(int)
if vmID == -1 {
- vmIDNew, err := veClient.GetVMID()
-
+ vmIDNew, err := veClient.GetVMID(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
vmID = *vmIDNew
@@ -1125,87 +1115,81 @@ func resourceVirtualEnvironmentContainerCreateCustom(d *schema.ResourceData, m i
createBody.PoolID = &poolID
}
- err = veClient.CreateContainer(nodeName, &createBody)
-
+ err = veClient.CreateContainer(ctx, nodeName, &createBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(strconv.Itoa(vmID))
// Wait for the container's lock to be released.
- err = veClient.WaitForContainerLock(nodeName, vmID, 600, 5, true)
-
+ err = veClient.WaitForContainerLock(ctx, nodeName, vmID, 600, 5, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentContainerCreateStart(d, m)
+ return resourceVirtualEnvironmentContainerCreateStart(ctx, d, m)
}
-func resourceVirtualEnvironmentContainerCreateStart(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerCreateStart(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
started := d.Get(mkResourceVirtualEnvironmentContainerStarted).(bool)
template := d.Get(mkResourceVirtualEnvironmentContainerTemplate).(bool)
if !started || template {
- return resourceVirtualEnvironmentContainerRead(d, m)
+ return resourceVirtualEnvironmentContainerRead(ctx, d, m)
}
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentContainerNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Start the container and wait for it to reach a running state before continuing.
- err = veClient.StartContainer(nodeName, vmID)
-
+ err = veClient.StartContainer(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.WaitForContainerState(nodeName, vmID, "running", 120, 5)
-
+ err = veClient.WaitForContainerState(ctx, nodeName, vmID, "running", 120, 5)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentContainerRead(d, m)
+ return resourceVirtualEnvironmentContainerRead(ctx, d, m)
}
-func resourceVirtualEnvironmentContainerGetConsoleModeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentContainerGetConsoleModeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"console",
"shell",
"tty",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentContainerGetCPUArchitectureValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentContainerGetCPUArchitectureValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"amd64",
"arm64",
"armhf",
"i386",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentContainerGetExistingNetworkInterface(client *proxmox.VirtualEnvironmentClient, nodeName string, vmID int) ([]interface{}, error) {
- containerInfo, err := client.GetContainer(nodeName, vmID)
+func resourceVirtualEnvironmentContainerGetExistingNetworkInterface(ctx context.Context, client *proxmox.VirtualEnvironmentClient, nodeName string, vmID int) ([]interface{}, error) {
+ containerInfo, err := client.GetContainer(ctx, nodeName, vmID)
if err != nil {
return []interface{}{}, err
}
- networkInterfaces := []interface{}{}
+ var networkInterfaces []interface{}
networkInterfaceArray := []*proxmox.VirtualEnvironmentContainerCustomNetworkInterface{
containerInfo.NetworkInterface0,
containerInfo.NetworkInterface1,
@@ -1258,8 +1242,8 @@ func resourceVirtualEnvironmentContainerGetExistingNetworkInterface(client *prox
return networkInterfaces, nil
}
-func resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"alpine",
"archlinux",
"centos",
@@ -1269,26 +1253,26 @@ func resourceVirtualEnvironmentContainerGetOperatingSystemTypeValidator() schema
"opensuse",
"ubuntu",
"unmanaged",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentContainerNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Retrieve the entire configuration in order to compare it to the state.
- containerConfig, err := veClient.GetContainer(nodeName, vmID)
+ containerConfig, err := veClient.GetContainer(ctx, nodeName, vmID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") ||
@@ -1297,8 +1281,7 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
return nil
}
-
- return err
+ return diag.FromErr(err)
}
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
@@ -1308,10 +1291,11 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) == 0 || currentDescription != dvResourceVirtualEnvironmentContainerDescription {
if containerConfig.Description != nil {
- d.Set(mkResourceVirtualEnvironmentContainerDescription, strings.TrimSpace(*containerConfig.Description))
+ err = d.Set(mkResourceVirtualEnvironmentContainerDescription, strings.TrimSpace(*containerConfig.Description))
} else {
- d.Set(mkResourceVirtualEnvironmentContainerDescription, "")
+ err = d.Set(mkResourceVirtualEnvironmentContainerDescription, "")
}
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the console configuration to the one stored in the state.
@@ -1342,13 +1326,15 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) > 0 {
if len(currentConsole) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerConsole, []interface{}{console})
+ err := d.Set(mkResourceVirtualEnvironmentContainerConsole, []interface{}{console})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentConsole) > 0 ||
console[mkResourceVirtualEnvironmentContainerConsoleEnabled] != proxmox.CustomBool(dvResourceVirtualEnvironmentContainerConsoleEnabled) ||
console[mkResourceVirtualEnvironmentContainerConsoleMode] != dvResourceVirtualEnvironmentContainerConsoleMode ||
console[mkResourceVirtualEnvironmentContainerConsoleTTYCount] != dvResourceVirtualEnvironmentContainerConsoleTTYCount {
- d.Set(mkResourceVirtualEnvironmentContainerConsole, []interface{}{console})
+ err := d.Set(mkResourceVirtualEnvironmentContainerConsole, []interface{}{console})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the CPU configuration to the one stored in the state.
@@ -1379,13 +1365,15 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) > 0 {
if len(currentCPU) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerCPU, []interface{}{cpu})
+ err := d.Set(mkResourceVirtualEnvironmentContainerCPU, []interface{}{cpu})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentCPU) > 0 ||
cpu[mkResourceVirtualEnvironmentContainerCPUArchitecture] != dvResourceVirtualEnvironmentContainerCPUArchitecture ||
cpu[mkResourceVirtualEnvironmentContainerCPUCores] != dvResourceVirtualEnvironmentContainerCPUCores ||
cpu[mkResourceVirtualEnvironmentContainerCPUUnits] != dvResourceVirtualEnvironmentContainerCPUUnits {
- d.Set(mkResourceVirtualEnvironmentContainerCPU, []interface{}{cpu})
+ err := d.Set(mkResourceVirtualEnvironmentContainerCPU, []interface{}{cpu})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the disk configuration to the one stored in the state.
@@ -1404,11 +1392,13 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) > 0 {
if len(currentDisk) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerDiskDatastoreID, []interface{}{disk})
+ err := d.Set(mkResourceVirtualEnvironmentContainerDiskDatastoreID, []interface{}{disk})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentDisk) > 0 ||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID {
- d.Set(mkResourceVirtualEnvironmentContainerDiskDatastoreID, []interface{}{disk})
+ err := d.Set(mkResourceVirtualEnvironmentContainerDiskDatastoreID, []interface{}{disk})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the memory configuration to the one stored in the state.
@@ -1430,12 +1420,14 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) > 0 {
if len(currentMemory) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerMemory, []interface{}{memory})
+ err := d.Set(mkResourceVirtualEnvironmentContainerMemory, []interface{}{memory})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentMemory) > 0 ||
memory[mkResourceVirtualEnvironmentContainerMemoryDedicated] != dvResourceVirtualEnvironmentContainerMemoryDedicated ||
memory[mkResourceVirtualEnvironmentContainerMemorySwap] != dvResourceVirtualEnvironmentContainerMemorySwap {
- d.Set(mkResourceVirtualEnvironmentContainerMemory, []interface{}{memory})
+ err := d.Set(mkResourceVirtualEnvironmentContainerMemory, []interface{}{memory})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the initialization and network interface configuration to the one stored in the state.
@@ -1465,7 +1457,7 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
initialization[mkResourceVirtualEnvironmentContainerInitializationHostname] = ""
}
- ipConfigList := []interface{}{}
+ var ipConfigList []interface{}
networkInterfaceArray := []*proxmox.VirtualEnvironmentContainerCustomNetworkInterface{
containerConfig.NetworkInterface0,
containerConfig.NetworkInterface1,
@@ -1476,7 +1468,7 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
containerConfig.NetworkInterface6,
containerConfig.NetworkInterface7,
}
- networkInterfaceList := []interface{}{}
+ var networkInterfaceList []interface{}
for _, nv := range networkInterfaceArray {
if nv == nil {
@@ -1594,25 +1586,29 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
}
if len(initialization) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{initialization})
+ err = d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{initialization})
} else {
- d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{})
+ err = d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{})
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentNetworkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
if len(currentNetworkInterface) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerNetworkInterface, networkInterfaceList)
+ err := d.Set(mkResourceVirtualEnvironmentContainerNetworkInterface, networkInterfaceList)
+ diags = append(diags, diag.FromErr(err)...)
}
} else {
if len(initialization) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{initialization})
+ err = d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{initialization})
} else {
- d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{})
+ err = d.Set(mkResourceVirtualEnvironmentContainerInitialization, []interface{}{})
}
+ diags = append(diags, diag.FromErr(err)...)
- d.Set(mkResourceVirtualEnvironmentContainerNetworkInterface, networkInterfaceList)
+ err := d.Set(mkResourceVirtualEnvironmentContainerNetworkInterface, networkInterfaceList)
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the operating system configuration to the one stored in the state.
@@ -1635,48 +1631,49 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface
if len(clone) > 0 {
if len(currentMemory) > 0 {
- d.Set(mkResourceVirtualEnvironmentContainerOperatingSystem, []interface{}{operatingSystem})
+ err := d.Set(mkResourceVirtualEnvironmentContainerOperatingSystem, []interface{}{operatingSystem})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentOperatingSystem) > 0 ||
operatingSystem[mkResourceVirtualEnvironmentContainerOperatingSystemType] != dvResourceVirtualEnvironmentContainerOperatingSystemType {
- d.Set(mkResourceVirtualEnvironmentContainerOperatingSystem, []interface{}{operatingSystem})
+ err := d.Set(mkResourceVirtualEnvironmentContainerOperatingSystem, []interface{}{operatingSystem})
+ diags = append(diags, diag.FromErr(err)...)
}
currentTemplate := d.Get(mkResourceVirtualEnvironmentContainerTemplate).(bool)
if len(clone) == 0 || currentTemplate != dvResourceVirtualEnvironmentContainerTemplate {
if containerConfig.Template != nil {
- d.Set(mkResourceVirtualEnvironmentContainerTemplate, bool(*containerConfig.Template))
+ err = d.Set(mkResourceVirtualEnvironmentContainerTemplate, bool(*containerConfig.Template))
} else {
- d.Set(mkResourceVirtualEnvironmentContainerTemplate, false)
+ err = d.Set(mkResourceVirtualEnvironmentContainerTemplate, false)
}
+ diags = append(diags, diag.FromErr(err)...)
}
// Determine the state of the container in order to update the "started" argument.
- status, err := veClient.GetContainerStatus(nodeName, vmID)
-
+ status, err := veClient.GetContainerStatus(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- d.Set(mkResourceVirtualEnvironmentContainerStarted, status.Status == "running")
+ err = d.Set(mkResourceVirtualEnvironmentContainerStarted, status.Status == "running")
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentContainerNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Prepare the new request object.
@@ -1702,10 +1699,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
// Prepare the new console configuration.
if d.HasChange(mkResourceVirtualEnvironmentContainerConsole) {
- consoleBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerConsole}, 0, true)
-
+ consoleBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerConsole}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
consoleEnabled := proxmox.CustomBool(consoleBlock[mkResourceVirtualEnvironmentContainerConsoleEnabled].(bool))
@@ -1721,10 +1717,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
// Prepare the new CPU configuration.
if d.HasChange(mkResourceVirtualEnvironmentContainerCPU) {
- cpuBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerCPU}, 0, true)
-
+ cpuBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerCPU}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cpuArchitecture := cpuBlock[mkResourceVirtualEnvironmentContainerCPUArchitecture].(string)
@@ -1743,10 +1738,10 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain
initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer
initializationHostname := dvResourceVirtualEnvironmentContainerInitializationHostname
- initializationIPConfigIPv4Address := []string{}
- initializationIPConfigIPv4Gateway := []string{}
- initializationIPConfigIPv6Address := []string{}
- initializationIPConfigIPv6Gateway := []string{}
+ var initializationIPConfigIPv4Address []string
+ var initializationIPConfigIPv4Gateway []string
+ var initializationIPConfigIPv6Address []string
+ var initializationIPConfigIPv6Gateway []string
if len(initialization) > 0 {
initializationBlock := initialization[0].(map[string]interface{})
@@ -1799,10 +1794,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
// Prepare the new memory configuration.
if d.HasChange(mkResourceVirtualEnvironmentContainerMemory) {
- memoryBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerMemory}, 0, true)
-
+ memoryBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerMemory}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
memoryDedicated := memoryBlock[mkResourceVirtualEnvironmentContainerMemoryDedicated].(int)
@@ -1818,10 +1812,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
networkInterface := d.Get(mkResourceVirtualEnvironmentContainerNetworkInterface).([]interface{})
if len(networkInterface) == 0 && len(clone) > 0 {
- networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(veClient, nodeName, vmID)
-
+ networkInterface, err = resourceVirtualEnvironmentContainerGetExistingNetworkInterface(ctx, veClient, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -1897,10 +1890,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
// Prepare the new operating system configuration.
if d.HasChange(mkResourceVirtualEnvironmentContainerOperatingSystem) {
- operatingSystem, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerOperatingSystem}, 0, true)
-
+ operatingSystem, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentContainerOperatingSystem}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
operatingSystemType := operatingSystem[mkResourceVirtualEnvironmentContainerOperatingSystemType].(string)
@@ -1911,10 +1903,9 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
}
// Update the configuration now that everything has been prepared.
- err = veClient.UpdateContainer(nodeName, vmID, &updateBody)
-
+ err = veClient.UpdateContainer(ctx, nodeName, vmID, &updateBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Determine if the state of the container needs to be changed.
@@ -1922,34 +1913,30 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
if d.HasChange(mkResourceVirtualEnvironmentContainerStarted) && !bool(template) {
if started {
- err = veClient.StartContainer(nodeName, vmID)
-
+ err = veClient.StartContainer(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.WaitForContainerState(nodeName, vmID, "running", 300, 5)
-
+ err = veClient.WaitForContainerState(ctx, nodeName, vmID, "running", 300, 5)
if err != nil {
- return err
+ return diag.FromErr(err)
}
} else {
forceStop := proxmox.CustomBool(true)
shutdownTimeout := 300
- err = veClient.ShutdownContainer(nodeName, vmID, &proxmox.VirtualEnvironmentContainerShutdownRequestBody{
+ err = veClient.ShutdownContainer(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentContainerShutdownRequestBody{
ForceStop: &forceStop,
Timeout: &shutdownTimeout,
})
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.WaitForContainerState(nodeName, vmID, "stopped", 300, 5)
-
+ err = veClient.WaitForContainerState(ctx, nodeName, vmID, "stopped", 300, 5)
if err != nil {
- return err
+ return diag.FromErr(err)
}
rebootRequired = false
@@ -1960,61 +1947,55 @@ func resourceVirtualEnvironmentContainerUpdate(d *schema.ResourceData, m interfa
if !bool(template) && rebootRequired {
rebootTimeout := 300
- err = veClient.RebootContainer(nodeName, vmID, &proxmox.VirtualEnvironmentContainerRebootRequestBody{
+ err = veClient.RebootContainer(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentContainerRebootRequestBody{
Timeout: &rebootTimeout,
})
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentContainerRead(d, m)
+ return resourceVirtualEnvironmentContainerRead(ctx, d, m)
}
-func resourceVirtualEnvironmentContainerDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentContainerDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentContainerNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Shut down the container before deleting it.
- status, err := veClient.GetContainerStatus(nodeName, vmID)
-
+ status, err := veClient.GetContainerStatus(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if status.Status != "stopped" {
forceStop := proxmox.CustomBool(true)
shutdownTimeout := 300
- err = veClient.ShutdownContainer(nodeName, vmID, &proxmox.VirtualEnvironmentContainerShutdownRequestBody{
+ err = veClient.ShutdownContainer(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentContainerShutdownRequestBody{
ForceStop: &forceStop,
Timeout: &shutdownTimeout,
})
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.WaitForContainerState(nodeName, vmID, "stopped", 30, 5)
-
+ err = veClient.WaitForContainerState(ctx, nodeName, vmID, "stopped", 30, 5)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- err = veClient.DeleteContainer(nodeName, vmID)
+ err = veClient.DeleteContainer(ctx, nodeName, vmID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -2022,15 +2003,13 @@ func resourceVirtualEnvironmentContainerDelete(d *schema.ResourceData, m interfa
return nil
}
-
- return err
+ return diag.FromErr(err)
}
// Wait for the state to become unavailable as that clearly indicates the destruction of the container.
- err = veClient.WaitForContainerState(nodeName, vmID, "", 60, 2)
-
+ err = veClient.WaitForContainerState(ctx, nodeName, vmID, "", 60, 2)
if err == nil {
- return fmt.Errorf("Failed to delete container \"%d\"", vmID)
+ return diag.Errorf("failed to delete container \"%d\"", vmID)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_container_test.go b/proxmoxtf/resource_virtual_environment_container_test.go
index e29bc367..6350fcb3 100644
--- a/proxmoxtf/resource_virtual_environment_container_test.go
+++ b/proxmoxtf/resource_virtual_environment_container_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentContainerInstantiation tests whether the ResourceVirtualEnvironmentContainer instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_dns.go b/proxmoxtf/resource_virtual_environment_dns.go
index 2cf923dc..703758bc 100644
--- a/proxmoxtf/resource_virtual_environment_dns.go
+++ b/proxmoxtf/resource_virtual_environment_dns.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -43,18 +45,17 @@ func resourceVirtualEnvironmentDNS() *schema.Resource {
MaxItems: 3,
},
},
- Create: resourceVirtualEnvironmentDNSCreate,
- Read: resourceVirtualEnvironmentDNSRead,
- Update: resourceVirtualEnvironmentDNSUpdate,
- Delete: resourceVirtualEnvironmentDNSDelete,
+ CreateContext: resourceVirtualEnvironmentDNSCreate,
+ ReadContext: resourceVirtualEnvironmentDNSRead,
+ UpdateContext: resourceVirtualEnvironmentDNSUpdate,
+ DeleteContext: resourceVirtualEnvironmentDNSDelete,
}
}
-func resourceVirtualEnvironmentDNSCreate(d *schema.ResourceData, m interface{}) error {
- err := resourceVirtualEnvironmentDNSUpdate(d, m)
-
- if err != nil {
- return err
+func resourceVirtualEnvironmentDNSCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ diags := resourceVirtualEnvironmentDNSUpdate(ctx, d, m)
+ if diags.HasError() {
+ return diags
}
nodeName := d.Get(mkResourceVirtualEnvironmentDNSNodeName).(string)
@@ -64,7 +65,7 @@ func resourceVirtualEnvironmentDNSCreate(d *schema.ResourceData, m interface{})
return nil
}
-func resourceVirtualEnvironmentDNSGetUpdateBody(d *schema.ResourceData, m interface{}) (*proxmox.VirtualEnvironmentDNSUpdateRequestBody, error) {
+func resourceVirtualEnvironmentDNSGetUpdateBody(d *schema.ResourceData) (*proxmox.VirtualEnvironmentDNSUpdateRequestBody, error) {
domain := d.Get(mkResourceVirtualEnvironmentDNSDomain).(string)
servers := d.Get(mkResourceVirtualEnvironmentDNSServers).([]interface{})
@@ -88,28 +89,29 @@ func resourceVirtualEnvironmentDNSGetUpdateBody(d *schema.ResourceData, m interf
return body, nil
}
-func resourceVirtualEnvironmentDNSRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentDNSRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentDNSNodeName).(string)
- dns, err := veClient.GetDNS(nodeName)
-
+ dns, err := veClient.GetDNS(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if dns.SearchDomain != nil {
- d.Set(mkResourceVirtualEnvironmentDNSDomain, *dns.SearchDomain)
+ err = d.Set(mkResourceVirtualEnvironmentDNSDomain, *dns.SearchDomain)
} else {
- d.Set(mkResourceVirtualEnvironmentDNSDomain, "")
+ err = d.Set(mkResourceVirtualEnvironmentDNSDomain, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- servers := []interface{}{}
+ var servers []interface{}
if dns.Server1 != nil {
servers = append(servers, *dns.Server1)
@@ -123,37 +125,35 @@ func resourceVirtualEnvironmentDNSRead(d *schema.ResourceData, m interface{}) er
servers = append(servers, *dns.Server3)
}
- d.Set(mkResourceVirtualEnvironmentDNSServers, servers)
+ err = d.Set(mkResourceVirtualEnvironmentDNSServers, servers)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentDNSUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentDNSUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentDNSNodeName).(string)
- body, err := resourceVirtualEnvironmentDNSGetUpdateBody(d, m)
-
+ body, err := resourceVirtualEnvironmentDNSGetUpdateBody(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = veClient.UpdateDNS(nodeName, body)
-
+ err = veClient.UpdateDNS(ctx, nodeName, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentDNSRead(d, m)
+ return resourceVirtualEnvironmentDNSRead(ctx, d, m)
}
-func resourceVirtualEnvironmentDNSDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentDNSDelete(_ context.Context, d *schema.ResourceData, _ interface{}) diag.Diagnostics {
d.SetId("")
return nil
diff --git a/proxmoxtf/resource_virtual_environment_dns_test.go b/proxmoxtf/resource_virtual_environment_dns_test.go
index b7ea37a1..3d2e69d9 100644
--- a/proxmoxtf/resource_virtual_environment_dns_test.go
+++ b/proxmoxtf/resource_virtual_environment_dns_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentDNSInstantiation tests whether the ResourceVirtualEnvironmentDNS instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_file.go b/proxmoxtf/resource_virtual_environment_file.go
index 22c2491e..acf46367 100644
--- a/proxmoxtf/resource_virtual_environment_file.go
+++ b/proxmoxtf/resource_virtual_environment_file.go
@@ -6,12 +6,15 @@ package proxmoxtf
import (
"bytes"
+ "context"
"crypto/sha256"
"crypto/tls"
"fmt"
+ "github.com/hashicorp/go-cty/cty"
+ "github.com/hashicorp/terraform-plugin-log/tflog"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"io"
"io/ioutil"
- "log"
"net/http"
"net/url"
"os"
@@ -20,7 +23,7 @@ import (
"time"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -55,12 +58,12 @@ func resourceVirtualEnvironmentFile() *schema.Resource {
return &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentFileContentType: {
- Type: schema.TypeString,
- Description: "The content type",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentFileContentType,
- ValidateFunc: getContentTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The content type",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentFileContentType,
+ ValidateDiagFunc: getContentTypeValidator(),
},
mkResourceVirtualEnvironmentFileDatastoreID: {
Type: schema.TypeString,
@@ -181,32 +184,27 @@ func resourceVirtualEnvironmentFile() *schema.Resource {
MinItems: 0,
},
},
- Create: resourceVirtualEnvironmentFileCreate,
- Read: resourceVirtualEnvironmentFileRead,
- Delete: resourceVirtualEnvironmentFileDelete,
+ CreateContext: resourceVirtualEnvironmentFileCreate,
+ ReadContext: resourceVirtualEnvironmentFileRead,
+ DeleteContext: resourceVirtualEnvironmentFileDelete,
}
}
-func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentFileCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- contentType, err := resourceVirtualEnvironmentFileGetContentType(d, m)
-
- if err != nil {
- return err
- }
+ contentType, dg := resourceVirtualEnvironmentFileGetContentType(d)
+ diags = append(diags, dg...)
datastoreID := d.Get(mkResourceVirtualEnvironmentFileDatastoreID).(string)
- fileName, err := resourceVirtualEnvironmentFileGetFileName(d, m)
-
- if err != nil {
- return err
- }
+ fileName, err := resourceVirtualEnvironmentFileGetFileName(d)
+ diags = append(diags, diag.FromErr(err)...)
nodeName := d.Get(mkResourceVirtualEnvironmentFileNodeName).(string)
sourceFile := d.Get(mkResourceVirtualEnvironmentFileSourceFile).([]interface{})
@@ -216,12 +214,16 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
// Determine if both source_data and source_file is specified as this is not supported.
if len(sourceFile) > 0 && len(sourceRaw) > 0 {
- return fmt.Errorf(
- "Please specify \"%s.%s\" or \"%s\" - not both",
+ diags = append(diags, diag.Errorf(
+ "please specify \"%s.%s\" or \"%s\" - not both",
mkResourceVirtualEnvironmentFileSourceFile,
mkResourceVirtualEnvironmentFileSourceFilePath,
mkResourceVirtualEnvironmentFileSourceRaw,
- )
+ )...)
+ }
+
+ if diags.HasError() {
+ return diags
}
// Determine if we're dealing with raw file data or a reference to a file or URL.
@@ -233,8 +235,10 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
sourceFileChecksum := sourceFileBlock[mkResourceVirtualEnvironmentFileSourceFileChecksum].(string)
sourceFileInsecure := sourceFileBlock[mkResourceVirtualEnvironmentFileSourceFileInsecure].(bool)
- if resourceVirtualEnvironmentFileIsURL(d, m) {
- log.Printf("[DEBUG] Downloading file from '%s'", sourceFilePath)
+ if resourceVirtualEnvironmentFileIsURL(d) {
+ tflog.Debug(ctx, "Downloading file from URL", map[string]interface{}{
+ "url": sourceFilePath,
+ })
httpClient := http.Client{
Transport: &http.Transport{
@@ -245,32 +249,43 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
}
res, err := httpClient.Get(sourceFilePath)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
-
- defer res.Body.Close()
+ defer func(Body io.ReadCloser) {
+ err := Body.Close()
+ if err != nil {
+ tflog.Error(ctx, "Failed to close body", map[string]interface{}{
+ "error": err,
+ })
+ }
+ }(res.Body)
tempDownloadedFile, err := ioutil.TempFile("", "download")
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
tempDownloadedFileName := tempDownloadedFile.Name()
+ defer func(name string) {
+ err := os.Remove(name)
+ if err != nil {
+ tflog.Error(ctx, "Failed to remove temporary file", map[string]interface{}{
+ "error": err,
+ "file": name,
+ })
+ }
+ }(tempDownloadedFileName)
+
_, err = io.Copy(tempDownloadedFile, res.Body)
+ diags = append(diags, diag.FromErr(err)...)
+ err = tempDownloadedFile.Close()
+ diags = append(diags, diag.FromErr(err)...)
- if err != nil {
- tempDownloadedFile.Close()
-
- return err
+ if diags.HasError() {
+ return diags
}
- tempDownloadedFile.Close()
-
- defer os.Remove(tempDownloadedFileName)
-
sourceFilePathLocal = tempDownloadedFileName
} else {
sourceFilePathLocal = sourceFilePath
@@ -279,28 +294,27 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
// Calculate the checksum of the source file now that it's available locally.
if sourceFileChecksum != "" {
file, err := os.Open(sourceFilePathLocal)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
h := sha256.New()
_, err = io.Copy(h, file)
-
- if err != nil {
- file.Close()
-
- return err
+ diags = append(diags, diag.FromErr(err)...)
+ err = file.Close()
+ diags = append(diags, diag.FromErr(err)...)
+ if diags.HasError() {
+ return diags
}
- file.Close()
-
calculatedChecksum := fmt.Sprintf("%x", h.Sum(nil))
-
- log.Printf("[DEBUG] The calculated SHA256 checksum for source \"%s\" is \"%s\"", sourceFilePath, calculatedChecksum)
+ tflog.Debug(ctx, "Calculated checksum", map[string]interface{}{
+ "source": sourceFilePath,
+ "sha256": calculatedChecksum,
+ })
if sourceFileChecksum != calculatedChecksum {
- return fmt.Errorf("The calculated SHA256 checksum \"%s\" does not match source checksum \"%s\"", calculatedChecksum, sourceFileChecksum)
+ return diag.Errorf("the calculated SHA256 checksum \"%s\" does not match source checksum \"%s\"", calculatedChecksum, sourceFileChecksum)
}
}
} else if len(sourceRaw) > 0 {
@@ -312,33 +326,38 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
if len(sourceRawData) <= sourceRawResize {
sourceRawData = fmt.Sprintf(fmt.Sprintf("%%-%dv", sourceRawResize), sourceRawData)
} else {
- return fmt.Errorf("Cannot resize %d bytes to %d bytes", len(sourceRawData), sourceRawResize)
+ return diag.Errorf("cannot resize %d bytes to %d bytes", len(sourceRawData), sourceRawResize)
}
}
tempRawFile, err := ioutil.TempFile("", "raw")
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
tempRawFileName := tempRawFile.Name()
_, err = io.Copy(tempRawFile, bytes.NewBufferString(sourceRawData))
-
- if err != nil {
- tempRawFile.Close()
-
- return err
+ diags = append(diags, diag.FromErr(err)...)
+ err = tempRawFile.Close()
+ diags = append(diags, diag.FromErr(err)...)
+ if diags.HasError() {
+ return diags
}
- tempRawFile.Close()
-
- defer os.Remove(tempRawFileName)
+ defer func(name string) {
+ err := os.Remove(name)
+ if err != nil {
+ tflog.Error(ctx, "Failed to remove temporary file", map[string]interface{}{
+ "error": err,
+ "file": name,
+ })
+ }
+ }(tempRawFileName)
sourceFilePathLocal = tempRawFileName
} else {
- return fmt.Errorf(
- "Please specify either \"%s.%s\" or \"%s\"",
+ return diag.Errorf(
+ "please specify either \"%s.%s\" or \"%s\"",
mkResourceVirtualEnvironmentFileSourceFile,
mkResourceVirtualEnvironmentFileSourceFilePath,
mkResourceVirtualEnvironmentFileSourceRaw,
@@ -347,12 +366,18 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
// Open the source file for reading in order to upload it.
file, err := os.Open(sourceFilePathLocal)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- defer file.Close()
+ defer func(file *os.File) {
+ err := file.Close()
+ if err != nil {
+ tflog.Error(ctx, "Failed to close file", map[string]interface{}{
+ "error": err,
+ })
+ }
+ }(file)
body := &proxmox.VirtualEnvironmentDatastoreUploadRequestBody{
ContentType: *contentType,
@@ -362,24 +387,22 @@ func resourceVirtualEnvironmentFileCreate(d *schema.ResourceData, m interface{})
NodeName: nodeName,
}
- _, err = veClient.UploadFileToDatastore(body)
-
+ _, err = veClient.UploadFileToDatastore(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- volumeID, err := resourceVirtualEnvironmentFileGetVolumeID(d, m)
-
- if err != nil {
- return err
+ volumeID, diags := resourceVirtualEnvironmentFileGetVolumeID(d)
+ if diags.HasError() {
+ return diags
}
d.SetId(*volumeID)
- return resourceVirtualEnvironmentFileRead(d, m)
+ return resourceVirtualEnvironmentFileRead(ctx, d, m)
}
-func resourceVirtualEnvironmentFileGetContentType(d *schema.ResourceData, m interface{}) (*string, error) {
+func resourceVirtualEnvironmentFileGetContentType(d *schema.ResourceData) (*string, diag.Diagnostics) {
contentType := d.Get(mkResourceVirtualEnvironmentFileContentType).(string)
sourceFile := d.Get(mkResourceVirtualEnvironmentFileSourceFile).([]interface{})
sourceRaw := d.Get(mkResourceVirtualEnvironmentFileSourceRaw).([]interface{})
@@ -393,8 +416,8 @@ func resourceVirtualEnvironmentFileGetContentType(d *schema.ResourceData, m inte
sourceRawBlock := sourceRaw[0].(map[string]interface{})
sourceFilePath = sourceRawBlock[mkResourceVirtualEnvironmentFileSourceRawFileName].(string)
} else {
- return nil, fmt.Errorf(
- "Missing argument \"%s.%s\" or \"%s\"",
+ return nil, diag.Errorf(
+ "missing argument \"%s.%s\" or \"%s\"",
mkResourceVirtualEnvironmentFileSourceFile,
mkResourceVirtualEnvironmentFileSourceFilePath,
mkResourceVirtualEnvironmentFileSourceRaw,
@@ -417,8 +440,8 @@ func resourceVirtualEnvironmentFileGetContentType(d *schema.ResourceData, m inte
}
if contentType == "" {
- return nil, fmt.Errorf(
- "Cannot determine the content type of source \"%s\" - Please manually define the \"%s\" argument",
+ return nil, diag.Errorf(
+ "cannot determine the content type of source \"%s\" - Please manually define the \"%s\" argument",
sourceFilePath,
mkResourceVirtualEnvironmentFileContentType,
)
@@ -426,16 +449,12 @@ func resourceVirtualEnvironmentFileGetContentType(d *schema.ResourceData, m inte
}
ctValidator := getContentTypeValidator()
- _, errs := ctValidator(contentType, mkResourceVirtualEnvironmentFileContentType)
+ diags := ctValidator(contentType, cty.GetAttrPath(mkResourceVirtualEnvironmentFileContentType))
- if len(errs) > 0 {
- return nil, errs[0]
- }
-
- return &contentType, nil
+ return &contentType, diags
}
-func resourceVirtualEnvironmentFileGetFileName(d *schema.ResourceData, m interface{}) (*string, error) {
+func resourceVirtualEnvironmentFileGetFileName(d *schema.ResourceData) (*string, error) {
sourceFile := d.Get(mkResourceVirtualEnvironmentFileSourceFile).([]interface{})
sourceRaw := d.Get(mkResourceVirtualEnvironmentFileSourceRaw).([]interface{})
@@ -451,14 +470,14 @@ func resourceVirtualEnvironmentFileGetFileName(d *schema.ResourceData, m interfa
sourceFileFileName = sourceRawBlock[mkResourceVirtualEnvironmentFileSourceRawFileName].(string)
} else {
return nil, fmt.Errorf(
- "Missing argument \"%s.%s\"",
+ "missing argument \"%s.%s\"",
mkResourceVirtualEnvironmentFileSourceFile,
mkResourceVirtualEnvironmentFileSourceFilePath,
)
}
if sourceFileFileName == "" {
- if resourceVirtualEnvironmentFileIsURL(d, m) {
+ if resourceVirtualEnvironmentFileIsURL(d) {
downloadURL, err := url.ParseRequestURI(sourceFilePath)
if err != nil {
@@ -469,7 +488,7 @@ func resourceVirtualEnvironmentFileGetFileName(d *schema.ResourceData, m interfa
sourceFileFileName = path[len(path)-1]
if sourceFileFileName == "" {
- return nil, fmt.Errorf("Failed to determine file name from the URL \"%s\"", sourceFilePath)
+ return nil, fmt.Errorf("failed to determine file name from the URL \"%s\"", sourceFilePath)
}
} else {
sourceFileFileName = filepath.Base(sourceFilePath)
@@ -479,26 +498,21 @@ func resourceVirtualEnvironmentFileGetFileName(d *schema.ResourceData, m interfa
return &sourceFileFileName, nil
}
-func resourceVirtualEnvironmentFileGetVolumeID(d *schema.ResourceData, m interface{}) (*string, error) {
- fileName, err := resourceVirtualEnvironmentFileGetFileName(d, m)
-
+func resourceVirtualEnvironmentFileGetVolumeID(d *schema.ResourceData) (*string, diag.Diagnostics) {
+ fileName, err := resourceVirtualEnvironmentFileGetFileName(d)
if err != nil {
- return nil, err
+ return nil, diag.FromErr(err)
}
datastoreID := d.Get(mkResourceVirtualEnvironmentFileDatastoreID).(string)
- contentType, err := resourceVirtualEnvironmentFileGetContentType(d, m)
-
- if err != nil {
- return nil, err
- }
+ contentType, diags := resourceVirtualEnvironmentFileGetContentType(d)
volumeID := fmt.Sprintf("%s:%s/%s", datastoreID, *contentType, *fileName)
- return &volumeID, nil
+ return &volumeID, diags
}
-func resourceVirtualEnvironmentFileIsURL(d *schema.ResourceData, m interface{}) bool {
+func resourceVirtualEnvironmentFileIsURL(d *schema.ResourceData) bool {
sourceFile := d.Get(mkResourceVirtualEnvironmentFileSourceFile).([]interface{})
sourceFilePath := ""
@@ -512,12 +526,11 @@ func resourceVirtualEnvironmentFileIsURL(d *schema.ResourceData, m interface{})
return strings.HasPrefix(sourceFilePath, "http://") || strings.HasPrefix(sourceFilePath, "https://")
}
-func resourceVirtualEnvironmentFileRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentFileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
datastoreID := d.Get(mkResourceVirtualEnvironmentFileDatastoreID).(string)
@@ -532,19 +545,19 @@ func resourceVirtualEnvironmentFileRead(d *schema.ResourceData, m interface{}) e
sourceFileBlock := sourceFile[0].(map[string]interface{})
sourceFilePath = sourceFileBlock[mkResourceVirtualEnvironmentFileSourceFilePath].(string)
- list, err := veClient.ListDatastoreFiles(nodeName, datastoreID)
-
+ list, err := veClient.ListDatastoreFiles(ctx, nodeName, datastoreID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- fileIsURL := resourceVirtualEnvironmentFileIsURL(d, m)
- fileName, err := resourceVirtualEnvironmentFileGetFileName(d, m)
-
+ fileIsURL := resourceVirtualEnvironmentFileIsURL(d)
+ fileName, err := resourceVirtualEnvironmentFileGetFileName(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
+ var diags diag.Diagnostics
+
for _, v := range list {
if v.VolumeID == d.Id() {
var fileModificationDate string
@@ -552,76 +565,32 @@ func resourceVirtualEnvironmentFileRead(d *schema.ResourceData, m interface{}) e
var fileTag string
if fileIsURL {
- res, err := http.Head(sourceFilePath)
-
- if err != nil {
- return err
- }
-
- defer res.Body.Close()
-
- fileSize = res.ContentLength
- httpLastModified := res.Header.Get("Last-Modified")
-
- if httpLastModified != "" {
- timeParsed, err := time.Parse(time.RFC1123, httpLastModified)
-
- if err != nil {
- timeParsed, err = time.Parse(time.RFC1123Z, httpLastModified)
-
- if err != nil {
- return err
- }
- }
-
- fileModificationDate = timeParsed.UTC().Format(time.RFC3339)
- } else {
- d.Set(mkResourceVirtualEnvironmentFileFileModificationDate, "")
- }
-
- httpTag := res.Header.Get("ETag")
-
- if httpTag != "" {
- httpTagParts := strings.Split(httpTag, "\"")
-
- if len(httpTagParts) > 1 {
- fileTag = httpTagParts[1]
- } else {
- fileTag = ""
- }
- } else {
- fileTag = ""
- }
+ fileSize, fileModificationDate, fileTag, err = readURL(ctx, d, sourceFilePath)
} else {
- f, err := os.Open(sourceFilePath)
-
- if err != nil {
- return err
- }
-
- defer f.Close()
-
- fileInfo, err := f.Stat()
-
- if err != nil {
- return err
- }
-
- fileModificationDate = fileInfo.ModTime().UTC().Format(time.RFC3339)
- fileSize = fileInfo.Size()
- fileTag = fmt.Sprintf("%x-%x", fileInfo.ModTime().UTC().Unix(), fileInfo.Size())
+ fileModificationDate, fileSize, fileTag, err = readFile(ctx, sourceFilePath)
}
+ diags = append(diags, diag.FromErr(err)...)
lastFileModificationDate := d.Get(mkResourceVirtualEnvironmentFileFileModificationDate).(string)
lastFileSize := int64(d.Get(mkResourceVirtualEnvironmentFileFileSize).(int))
lastFileTag := d.Get(mkResourceVirtualEnvironmentFileFileTag).(string)
- d.Set(mkResourceVirtualEnvironmentFileFileModificationDate, fileModificationDate)
- d.Set(mkResourceVirtualEnvironmentFileFileName, *fileName)
- d.Set(mkResourceVirtualEnvironmentFileFileSize, fileSize)
- d.Set(mkResourceVirtualEnvironmentFileFileTag, fileTag)
- d.Set(mkResourceVirtualEnvironmentFileSourceFileChanged, lastFileModificationDate != fileModificationDate || lastFileSize != fileSize || lastFileTag != fileTag)
+ err = d.Set(mkResourceVirtualEnvironmentFileFileModificationDate, fileModificationDate)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentFileFileName, *fileName)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentFileFileSize, fileSize)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentFileFileTag, fileTag)
+ diags = append(diags, diag.FromErr(err)...)
+ sourceFileBlock[mkResourceVirtualEnvironmentFileSourceFileChanged] = lastFileModificationDate != fileModificationDate || lastFileSize != fileSize || lastFileTag != fileTag
+ err = d.Set(mkResourceVirtualEnvironmentFileSourceFile, sourceFile)
+ diags = append(diags, diag.FromErr(err)...)
+
+ if diags.HasError() {
+ return diags
+ }
return nil
}
}
@@ -631,27 +600,106 @@ func resourceVirtualEnvironmentFileRead(d *schema.ResourceData, m interface{}) e
return nil
}
-func resourceVirtualEnvironmentFileDelete(d *schema.ResourceData, m interface{}) error {
+func readFile(ctx context.Context, sourceFilePath string) (fileModificationDate string, fileSize int64, fileTag string, err error) {
+ f, err := os.Open(sourceFilePath)
+ if err != nil {
+ return
+ }
+
+ defer func(f *os.File) {
+ var err = f.Close()
+ if err != nil {
+ tflog.Error(ctx, "failed to close the file", map[string]interface{}{
+ "error": err.Error(),
+ })
+ }
+ }(f)
+
+ fileInfo, err := f.Stat()
+ if err != nil {
+ return
+ }
+
+ fileModificationDate = fileInfo.ModTime().UTC().Format(time.RFC3339)
+ fileSize = fileInfo.Size()
+ fileTag = fmt.Sprintf("%x-%x", fileInfo.ModTime().UTC().Unix(), fileInfo.Size())
+
+ return fileModificationDate, fileSize, fileTag, nil
+}
+
+func readURL(ctx context.Context, d *schema.ResourceData, sourceFilePath string) (fileSize int64, fileModificationDate string, fileTag string, err error) {
+ res, err := http.Head(sourceFilePath)
+ if err != nil {
+ return
+ }
+
+ defer func(Body io.ReadCloser) {
+ var err = Body.Close()
+ if err != nil {
+ tflog.Error(ctx, "failed to close the response body", map[string]interface{}{
+ "error": err.Error(),
+ })
+ }
+ }(res.Body)
+
+ fileSize = res.ContentLength
+ httpLastModified := res.Header.Get("Last-Modified")
+
+ if httpLastModified != "" {
+ var timeParsed time.Time
+ timeParsed, err = time.Parse(time.RFC1123, httpLastModified)
+
+ if err != nil {
+ timeParsed, err = time.Parse(time.RFC1123Z, httpLastModified)
+ if err != nil {
+ return
+ }
+ }
+
+ fileModificationDate = timeParsed.UTC().Format(time.RFC3339)
+ } else {
+ err = d.Set(mkResourceVirtualEnvironmentFileFileModificationDate, "")
+ if err != nil {
+ return
+ }
+ }
+
+ httpTag := res.Header.Get("ETag")
+
+ if httpTag != "" {
+ httpTagParts := strings.Split(httpTag, "\"")
+
+ if len(httpTagParts) > 1 {
+ fileTag = httpTagParts[1]
+ } else {
+ fileTag = ""
+ }
+ } else {
+ fileTag = ""
+ }
+
+ return
+}
+
+func resourceVirtualEnvironmentFileDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
datastoreID := d.Get(mkResourceVirtualEnvironmentFileDatastoreID).(string)
nodeName := d.Get(mkResourceVirtualEnvironmentFileNodeName).(string)
- err = veClient.DeleteDatastoreFile(nodeName, datastoreID, d.Id())
+ err = veClient.DeleteDatastoreFile(ctx, nodeName, datastoreID, d.Id())
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
d.SetId("")
-
return nil
}
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_file_test.go b/proxmoxtf/resource_virtual_environment_file_test.go
index 23e7534b..c96c9001 100644
--- a/proxmoxtf/resource_virtual_environment_file_test.go
+++ b/proxmoxtf/resource_virtual_environment_file_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentFileInstantiation tests whether the ResourceVirtualEnvironmentFile instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_group.go b/proxmoxtf/resource_virtual_environment_group.go
index 8ae9ff5f..8e52acd0 100644
--- a/proxmoxtf/resource_virtual_environment_group.go
+++ b/proxmoxtf/resource_virtual_environment_group.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -73,19 +75,18 @@ func resourceVirtualEnvironmentGroup() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
},
- Create: resourceVirtualEnvironmentGroupCreate,
- Read: resourceVirtualEnvironmentGroupRead,
- Update: resourceVirtualEnvironmentGroupUpdate,
- Delete: resourceVirtualEnvironmentGroupDelete,
+ CreateContext: resourceVirtualEnvironmentGroupCreate,
+ ReadContext: resourceVirtualEnvironmentGroupRead,
+ UpdateContext: resourceVirtualEnvironmentGroupUpdate,
+ DeleteContext: resourceVirtualEnvironmentGroupDelete,
}
}
-func resourceVirtualEnvironmentGroupCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentGroupCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentGroupComment).(string)
@@ -96,10 +97,9 @@ func resourceVirtualEnvironmentGroupCreate(d *schema.ResourceData, m interface{}
ID: groupID,
}
- err = veClient.CreateGroup(body)
-
+ err = veClient.CreateGroup(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(groupID)
@@ -119,26 +119,26 @@ func resourceVirtualEnvironmentGroupCreate(d *schema.ResourceData, m interface{}
Roles: []string{aclEntry[mkResourceVirtualEnvironmentGroupACLRoleID].(string)},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentGroupRead(d, m)
+ return resourceVirtualEnvironmentGroupRead(ctx, d, m)
}
-func resourceVirtualEnvironmentGroupRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentGroupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
groupID := d.Id()
- group, err := veClient.GetGroup(groupID)
+ group, err := veClient.GetGroup(ctx, groupID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -146,17 +146,15 @@ func resourceVirtualEnvironmentGroupRead(d *schema.ResourceData, m interface{})
return nil
}
-
- return err
+ return diag.FromErr(err)
}
- acl, err := veClient.GetACL()
-
+ acl, err := veClient.GetACL(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- aclParsed := []interface{}{}
+ var aclParsed []interface{}
for _, v := range acl {
if v.Type == "group" && v.UserOrGroupID == groupID {
@@ -176,25 +174,27 @@ func resourceVirtualEnvironmentGroupRead(d *schema.ResourceData, m interface{})
}
}
- d.Set(mkResourceVirtualEnvironmentGroupACL, aclParsed)
+ err = d.Set(mkResourceVirtualEnvironmentGroupACL, aclParsed)
+ diags = append(diags, diag.FromErr(err)...)
if group.Comment != nil {
- d.Set(mkResourceVirtualEnvironmentGroupComment, group.Comment)
+ err = d.Set(mkResourceVirtualEnvironmentGroupComment, group.Comment)
} else {
- d.Set(mkResourceVirtualEnvironmentGroupComment, "")
+ err = d.Set(mkResourceVirtualEnvironmentGroupComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- d.Set(mkResourceVirtualEnvironmentGroupMembers, group.Members)
+ err = d.Set(mkResourceVirtualEnvironmentGroupMembers, group.Members)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentGroupUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentGroupUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentGroupComment).(string)
@@ -204,10 +204,9 @@ func resourceVirtualEnvironmentGroupUpdate(d *schema.ResourceData, m interface{}
Comment: &comment,
}
- err = veClient.UpdateGroup(groupID, body)
-
+ err = veClient.UpdateGroup(ctx, groupID, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
aclArgOld, aclArg := d.GetChange(mkResourceVirtualEnvironmentGroupACL)
@@ -226,10 +225,9 @@ func resourceVirtualEnvironmentGroupUpdate(d *schema.ResourceData, m interface{}
Roles: []string{aclEntry[mkResourceVirtualEnvironmentGroupACLRoleID].(string)},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -248,22 +246,20 @@ func resourceVirtualEnvironmentGroupUpdate(d *schema.ResourceData, m interface{}
Roles: []string{aclEntry[mkResourceVirtualEnvironmentGroupACLRoleID].(string)},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentGroupRead(d, m)
+ return resourceVirtualEnvironmentGroupRead(ctx, d, m)
}
-func resourceVirtualEnvironmentGroupDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentGroupDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
aclParsed := d.Get(mkResourceVirtualEnvironmentGroupACL).(*schema.Set).List()
@@ -282,14 +278,13 @@ func resourceVirtualEnvironmentGroupDelete(d *schema.ResourceData, m interface{}
Roles: []string{aclEntry[mkResourceVirtualEnvironmentGroupACLRoleID].(string)},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- err = veClient.DeleteGroup(groupID)
+ err = veClient.DeleteGroup(ctx, groupID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -297,8 +292,7 @@ func resourceVirtualEnvironmentGroupDelete(d *schema.ResourceData, m interface{}
return nil
}
-
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_group_test.go b/proxmoxtf/resource_virtual_environment_group_test.go
index 028710e9..d44b1ff2 100644
--- a/proxmoxtf/resource_virtual_environment_group_test.go
+++ b/proxmoxtf/resource_virtual_environment_group_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentGroupInstantiation tests whether the ResourceVirtualEnvironmentGroup instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_hosts.go b/proxmoxtf/resource_virtual_environment_hosts.go
index 35b01486..b0b34b87 100644
--- a/proxmoxtf/resource_virtual_environment_hosts.go
+++ b/proxmoxtf/resource_virtual_environment_hosts.go
@@ -5,11 +5,13 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -96,46 +98,45 @@ func resourceVirtualEnvironmentHosts() *schema.Resource {
Required: true,
},
},
- Create: resourceVirtualEnvironmentHostsCreate,
- Read: resourceVirtualEnvironmentHostsRead,
- Update: resourceVirtualEnvironmentHostsUpdate,
- Delete: resourceVirtualEnvironmentHostsDelete,
+ CreateContext: resourceVirtualEnvironmentHostsCreate,
+ ReadContext: resourceVirtualEnvironmentHostsRead,
+ UpdateContext: resourceVirtualEnvironmentHostsUpdate,
+ DeleteContext: resourceVirtualEnvironmentHostsDelete,
}
}
-func resourceVirtualEnvironmentHostsCreate(d *schema.ResourceData, m interface{}) error {
- err := resourceVirtualEnvironmentHostsUpdate(d, m)
-
- if err != nil {
- return err
+func resourceVirtualEnvironmentHostsCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ diags := resourceVirtualEnvironmentHostsUpdate(ctx, d, m)
+ if diags.HasError() {
+ return diags
}
nodeName := d.Get(mkResourceVirtualEnvironmentHostsNodeName).(string)
d.SetId(fmt.Sprintf("%s_hosts", nodeName))
- return nil
+ return diags
}
-func resourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentHostsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentHostsNodeName).(string)
- hosts, err := veClient.GetHosts(nodeName)
-
+ hosts, err := veClient.GetHosts(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Parse the entries in the hosts file.
- addresses := []interface{}{}
- entries := []interface{}{}
- hostnames := []interface{}{}
+ var addresses []interface{}
+ var entries []interface{}
+ var hostnames []interface{}
lines := strings.Split(hosts.Data, "\n")
for _, line := range lines {
@@ -152,7 +153,7 @@ func resourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{})
addresses = append(addresses, values[0])
entry := map[string]interface{}{}
- hostnamesForAddress := []interface{}{}
+ var hostnamesForAddress []interface{}
for _, hostname := range values[1:] {
if hostname != "" {
@@ -167,27 +168,31 @@ func resourceVirtualEnvironmentHostsRead(d *schema.ResourceData, m interface{})
hostnames = append(hostnames, hostnamesForAddress)
}
- d.Set(mkResourceVirtualEnvironmentHostsAddresses, addresses)
+ err = d.Set(mkResourceVirtualEnvironmentHostsAddresses, addresses)
+ diags = append(diags, diag.FromErr(err)...)
if hosts.Digest != nil {
- d.Set(mkResourceVirtualEnvironmentHostsDigest, *hosts.Digest)
+ err = d.Set(mkResourceVirtualEnvironmentHostsDigest, *hosts.Digest)
} else {
- d.Set(mkResourceVirtualEnvironmentHostsDigest, "")
+ err = d.Set(mkResourceVirtualEnvironmentHostsDigest, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- d.Set(mkResourceVirtualEnvironmentHostsEntries, entries)
- d.Set(mkResourceVirtualEnvironmentHostsEntry, entries)
- d.Set(mkResourceVirtualEnvironmentHostsHostnames, hostnames)
+ err = d.Set(mkResourceVirtualEnvironmentHostsEntries, entries)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentHostsEntry, entries)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentHostsHostnames, hostnames)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentHostsUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentHostsUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
entry := d.Get(mkResourceVirtualEnvironmentHostsEntry).([]interface{})
@@ -214,16 +219,15 @@ func resourceVirtualEnvironmentHostsUpdate(d *schema.ResourceData, m interface{}
body.Data += "\n"
}
- err = veClient.UpdateHosts(nodeName, &body)
-
+ err = veClient.UpdateHosts(ctx, nodeName, &body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentHostsRead(d, m)
+ return resourceVirtualEnvironmentHostsRead(ctx, d, m)
}
-func resourceVirtualEnvironmentHostsDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentHostsDelete(_ context.Context, d *schema.ResourceData, _ interface{}) diag.Diagnostics {
d.SetId("")
return nil
diff --git a/proxmoxtf/resource_virtual_environment_hosts_test.go b/proxmoxtf/resource_virtual_environment_hosts_test.go
index 9cc2b9a7..4a98d1dd 100644
--- a/proxmoxtf/resource_virtual_environment_hosts_test.go
+++ b/proxmoxtf/resource_virtual_environment_hosts_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentHostsInstantiation tests whether the ResourceVirtualEnvironmentHosts instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_pool.go b/proxmoxtf/resource_virtual_environment_pool.go
index 08160466..62047ae0 100644
--- a/proxmoxtf/resource_virtual_environment_pool.go
+++ b/proxmoxtf/resource_virtual_environment_pool.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -74,19 +76,18 @@ func resourceVirtualEnvironmentPool() *schema.Resource {
ForceNew: true,
},
},
- Create: resourceVirtualEnvironmentPoolCreate,
- Read: resourceVirtualEnvironmentPoolRead,
- Update: resourceVirtualEnvironmentPoolUpdate,
- Delete: resourceVirtualEnvironmentPoolDelete,
+ CreateContext: resourceVirtualEnvironmentPoolCreate,
+ ReadContext: resourceVirtualEnvironmentPoolRead,
+ UpdateContext: resourceVirtualEnvironmentPoolUpdate,
+ DeleteContext: resourceVirtualEnvironmentPoolDelete,
}
}
-func resourceVirtualEnvironmentPoolCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentPoolCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentPoolComment).(string)
@@ -97,43 +98,42 @@ func resourceVirtualEnvironmentPoolCreate(d *schema.ResourceData, m interface{})
ID: poolID,
}
- err = veClient.CreatePool(body)
-
+ err = veClient.CreatePool(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(poolID)
- return resourceVirtualEnvironmentPoolRead(d, m)
+ return resourceVirtualEnvironmentPoolRead(ctx, d, m)
}
-func resourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentPoolRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
poolID := d.Id()
- pool, err := veClient.GetPool(poolID)
+ pool, err := veClient.GetPool(ctx, poolID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
d.SetId("")
-
return nil
}
-
- return err
+ return diag.FromErr(err)
}
if pool.Comment != nil {
- d.Set(mkResourceVirtualEnvironmentPoolComment, pool.Comment)
+ err = d.Set(mkResourceVirtualEnvironmentPoolComment, pool.Comment)
} else {
- d.Set(mkResourceVirtualEnvironmentPoolComment, "")
+ err = d.Set(mkResourceVirtualEnvironmentPoolComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
members := make([]interface{}, len(pool.Members))
@@ -160,17 +160,17 @@ func resourceVirtualEnvironmentPoolRead(d *schema.ResourceData, m interface{}) e
members[i] = values
}
- d.Set(mkResourceVirtualEnvironmentPoolMembers, members)
+ err = d.Set(mkResourceVirtualEnvironmentPoolMembers, members)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diag.FromErr(err)
}
-func resourceVirtualEnvironmentPoolUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentPoolUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentPoolComment).(string)
@@ -180,25 +180,23 @@ func resourceVirtualEnvironmentPoolUpdate(d *schema.ResourceData, m interface{})
Comment: &comment,
}
- err = veClient.UpdatePool(poolID, body)
-
+ err = veClient.UpdatePool(ctx, poolID, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentPoolRead(d, m)
+ return resourceVirtualEnvironmentPoolRead(ctx, d, m)
}
-func resourceVirtualEnvironmentPoolDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentPoolDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
poolID := d.Id()
- err = veClient.DeletePool(poolID)
+ err = veClient.DeletePool(ctx, poolID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -207,7 +205,7 @@ func resourceVirtualEnvironmentPoolDelete(d *schema.ResourceData, m interface{})
return nil
}
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_pool_test.go b/proxmoxtf/resource_virtual_environment_pool_test.go
index 138c4122..07e3c27f 100644
--- a/proxmoxtf/resource_virtual_environment_pool_test.go
+++ b/proxmoxtf/resource_virtual_environment_pool_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentPoolInstantiation tests whether the ResourceVirtualEnvironmentPool instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_role.go b/proxmoxtf/resource_virtual_environment_role.go
index 39efd2ec..62c7750c 100644
--- a/proxmoxtf/resource_virtual_environment_role.go
+++ b/proxmoxtf/resource_virtual_environment_role.go
@@ -5,10 +5,12 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -32,19 +34,18 @@ func resourceVirtualEnvironmentRole() *schema.Resource {
ForceNew: true,
},
},
- Create: resourceVirtualEnvironmentRoleCreate,
- Read: resourceVirtualEnvironmentRoleRead,
- Update: resourceVirtualEnvironmentRoleUpdate,
- Delete: resourceVirtualEnvironmentRoleDelete,
+ CreateContext: resourceVirtualEnvironmentRoleCreate,
+ ReadContext: resourceVirtualEnvironmentRoleRead,
+ UpdateContext: resourceVirtualEnvironmentRoleUpdate,
+ DeleteContext: resourceVirtualEnvironmentRoleDelete,
}
}
-func resourceVirtualEnvironmentRoleCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentRoleCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
privileges := d.Get(mkResourceVirtualEnvironmentRolePrivileges).(*schema.Set).List()
@@ -60,27 +61,25 @@ func resourceVirtualEnvironmentRoleCreate(d *schema.ResourceData, m interface{})
Privileges: customPrivileges,
}
- err = veClient.CreateRole(body)
-
+ err = veClient.CreateRole(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(roleID)
- return resourceVirtualEnvironmentRoleRead(d, m)
+ return resourceVirtualEnvironmentRoleRead(ctx, d, m)
}
-func resourceVirtualEnvironmentRoleRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentRoleRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
roleID := d.Id()
- role, err := veClient.GetRole(roleID)
+ role, err := veClient.GetRole(ctx, roleID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -88,8 +87,7 @@ func resourceVirtualEnvironmentRoleRead(d *schema.ResourceData, m interface{}) e
return nil
}
-
- return err
+ return diag.FromErr(err)
}
privileges := schema.NewSet(schema.HashString, []interface{}{})
@@ -100,17 +98,15 @@ func resourceVirtualEnvironmentRoleRead(d *schema.ResourceData, m interface{}) e
}
}
- d.Set(mkResourceVirtualEnvironmentRolePrivileges, privileges)
-
- return nil
+ err = d.Set(mkResourceVirtualEnvironmentRolePrivileges, privileges)
+ return diag.FromErr(err)
}
-func resourceVirtualEnvironmentRoleUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentRoleUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
privileges := d.Get(mkResourceVirtualEnvironmentRolePrivileges).(*schema.Set).List()
@@ -125,25 +121,23 @@ func resourceVirtualEnvironmentRoleUpdate(d *schema.ResourceData, m interface{})
Privileges: customPrivileges,
}
- err = veClient.UpdateRole(roleID, body)
-
+ err = veClient.UpdateRole(ctx, roleID, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentRoleRead(d, m)
+ return resourceVirtualEnvironmentRoleRead(ctx, d, m)
}
-func resourceVirtualEnvironmentRoleDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentRoleDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
roleID := d.Id()
- err = veClient.DeleteRole(roleID)
+ err = veClient.DeleteRole(ctx, roleID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -151,8 +145,7 @@ func resourceVirtualEnvironmentRoleDelete(d *schema.ResourceData, m interface{})
return nil
}
-
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_role_test.go b/proxmoxtf/resource_virtual_environment_role_test.go
index 9331cdb6..a014cd97 100644
--- a/proxmoxtf/resource_virtual_environment_role_test.go
+++ b/proxmoxtf/resource_virtual_environment_role_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentRoleInstantiation tests whether the ResourceVirtualEnvironmentRole instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_time.go b/proxmoxtf/resource_virtual_environment_time.go
index e2eca85d..2a1fca3f 100644
--- a/proxmoxtf/resource_virtual_environment_time.go
+++ b/proxmoxtf/resource_virtual_environment_time.go
@@ -5,11 +5,13 @@
package proxmoxtf
import (
+ "context"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"time"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
@@ -43,18 +45,17 @@ func resourceVirtualEnvironmentTime() *schema.Resource {
Computed: true,
},
},
- Create: resourceVirtualEnvironmentTimeCreate,
- Read: resourceVirtualEnvironmentTimeRead,
- Update: resourceVirtualEnvironmentTimeUpdate,
- Delete: resourceVirtualEnvironmentTimeDelete,
+ CreateContext: resourceVirtualEnvironmentTimeCreate,
+ ReadContext: resourceVirtualEnvironmentTimeRead,
+ UpdateContext: resourceVirtualEnvironmentTimeUpdate,
+ DeleteContext: resourceVirtualEnvironmentTimeDelete,
}
}
-func resourceVirtualEnvironmentTimeCreate(d *schema.ResourceData, m interface{}) error {
- err := resourceVirtualEnvironmentTimeUpdate(d, m)
-
- if err != nil {
- return err
+func resourceVirtualEnvironmentTimeCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ diags := resourceVirtualEnvironmentTimeUpdate(ctx, d, m)
+ if diags.HasError() {
+ return diags
}
nodeName := d.Get(mkResourceVirtualEnvironmentTimeNodeName).(string)
@@ -64,25 +65,24 @@ func resourceVirtualEnvironmentTimeCreate(d *schema.ResourceData, m interface{})
return nil
}
-func resourceVirtualEnvironmentTimeRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentTimeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentTimeNodeName).(string)
- nodeTime, err := veClient.GetNodeTime(nodeName)
-
+ nodeTime, err := veClient.GetNodeTime(ctx, nodeName)
if err != nil {
- return err
+ return diag.FromErr(err)
}
localLocation, err := time.LoadLocation(nodeTime.TimeZone)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(fmt.Sprintf("%s_time", nodeName))
@@ -90,36 +90,37 @@ func resourceVirtualEnvironmentTimeRead(d *schema.ResourceData, m interface{}) e
localTimeOffset := time.Time(nodeTime.LocalTime).Sub(time.Now().UTC())
localTime := time.Time(nodeTime.LocalTime).Add(-localTimeOffset).In(localLocation)
- d.Set(mkDataSourceVirtualEnvironmentTimeLocalTime, localTime.Format(time.RFC3339))
- d.Set(mkDataSourceVirtualEnvironmentTimeTimeZone, nodeTime.TimeZone)
- d.Set(mkDataSourceVirtualEnvironmentTimeUTCTime, time.Time(nodeTime.UTCTime).Format(time.RFC3339))
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeLocalTime, localTime.Format(time.RFC3339))
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeTimeZone, nodeTime.TimeZone)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkDataSourceVirtualEnvironmentTimeUTCTime, time.Time(nodeTime.UTCTime).Format(time.RFC3339))
+ diags = append(diags, diag.FromErr(err)...)
return nil
}
-func resourceVirtualEnvironmentTimeUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentTimeUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentTimeNodeName).(string)
timeZone := d.Get(mkResourceVirtualEnvironmentTimeTimeZone).(string)
- err = veClient.UpdateNodeTime(nodeName, &proxmox.VirtualEnvironmentNodeUpdateTimeRequestBody{
+ err = veClient.UpdateNodeTime(ctx, nodeName, &proxmox.VirtualEnvironmentNodeUpdateTimeRequestBody{
TimeZone: timeZone,
})
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentTimeRead(d, m)
+ return resourceVirtualEnvironmentTimeRead(ctx, d, m)
}
-func resourceVirtualEnvironmentTimeDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentTimeDelete(_ context.Context, d *schema.ResourceData, _ interface{}) diag.Diagnostics {
d.SetId("")
return nil
diff --git a/proxmoxtf/resource_virtual_environment_time_test.go b/proxmoxtf/resource_virtual_environment_time_test.go
index 0e0fda82..f69a1eef 100644
--- a/proxmoxtf/resource_virtual_environment_time_test.go
+++ b/proxmoxtf/resource_virtual_environment_time_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentTimeInstantiation tests whether the ResourceVirtualEnvironmentTime instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_user.go b/proxmoxtf/resource_virtual_environment_user.go
index 7968ff72..74928f6c 100644
--- a/proxmoxtf/resource_virtual_environment_user.go
+++ b/proxmoxtf/resource_virtual_environment_user.go
@@ -5,12 +5,14 @@
package proxmoxtf
import (
+ "context"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"strings"
"time"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
- "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
const (
@@ -91,7 +93,7 @@ func resourceVirtualEnvironmentUser() *schema.Resource {
Description: "The user account's expiration date",
Optional: true,
Default: time.Unix(0, 0).UTC().Format(time.RFC3339),
- ValidateFunc: validation.ValidateRFC3339TimeString,
+ ValidateFunc: validation.IsRFC3339Time,
},
mkResourceVirtualEnvironmentUserFirstName: {
Type: schema.TypeString,
@@ -132,28 +134,26 @@ func resourceVirtualEnvironmentUser() *schema.Resource {
ForceNew: true,
},
},
- Create: resourceVirtualEnvironmentUserCreate,
- Read: resourceVirtualEnvironmentUserRead,
- Update: resourceVirtualEnvironmentUserUpdate,
- Delete: resourceVirtualEnvironmentUserDelete,
+ CreateContext: resourceVirtualEnvironmentUserCreate,
+ ReadContext: resourceVirtualEnvironmentUserRead,
+ UpdateContext: resourceVirtualEnvironmentUserUpdate,
+ DeleteContext: resourceVirtualEnvironmentUserDelete,
}
}
-func resourceVirtualEnvironmentUserCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentUserCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentUserComment).(string)
email := d.Get(mkResourceVirtualEnvironmentUserEmail).(string)
enabled := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentUserEnabled).(bool))
expirationDate, err := time.Parse(time.RFC3339, d.Get(mkResourceVirtualEnvironmentUserExpirationDate).(string))
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
expirationDateCustom := proxmox.CustomTimestamp(expirationDate)
@@ -183,10 +183,9 @@ func resourceVirtualEnvironmentUserCreate(d *schema.ResourceData, m interface{})
Password: password,
}
- err = veClient.CreateUser(body)
-
+ err = veClient.CreateUser(ctx, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(userID)
@@ -206,26 +205,24 @@ func resourceVirtualEnvironmentUserCreate(d *schema.ResourceData, m interface{})
Users: []string{userID},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentUserRead(d, m)
+ return resourceVirtualEnvironmentUserRead(ctx, d, m)
}
-func resourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentUserRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
userID := d.Id()
- user, err := veClient.GetUser(userID)
+ user, err := veClient.GetUser(ctx, userID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -233,17 +230,15 @@ func resourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{}) e
return nil
}
-
- return err
+ return diag.FromErr(err)
}
- acl, err := veClient.GetACL()
-
+ acl, err := veClient.GetACL(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- aclParsed := []interface{}{}
+ var aclParsed []interface{}
for _, v := range acl {
if v.Type == "user" && v.UserOrGroupID == userID {
@@ -263,37 +258,45 @@ func resourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{}) e
}
}
- d.Set(mkResourceVirtualEnvironmentUserACL, aclParsed)
+ var diags diag.Diagnostics
+
+ err = d.Set(mkResourceVirtualEnvironmentUserACL, aclParsed)
+ diags = append(diags, diag.FromErr(err)...)
if user.Comment != nil {
- d.Set(mkResourceVirtualEnvironmentUserComment, user.Comment)
+ err = d.Set(mkResourceVirtualEnvironmentUserComment, user.Comment)
} else {
- d.Set(mkResourceVirtualEnvironmentUserComment, "")
+ err = d.Set(mkResourceVirtualEnvironmentUserComment, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if user.Email != nil {
- d.Set(mkResourceVirtualEnvironmentUserEmail, user.Email)
+ err = d.Set(mkResourceVirtualEnvironmentUserEmail, user.Email)
} else {
- d.Set(mkResourceVirtualEnvironmentUserEmail, "")
+ err = d.Set(mkResourceVirtualEnvironmentUserEmail, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if user.Enabled != nil {
- d.Set(mkResourceVirtualEnvironmentUserEnabled, user.Enabled)
+ err = d.Set(mkResourceVirtualEnvironmentUserEnabled, user.Enabled)
} else {
- d.Set(mkResourceVirtualEnvironmentUserEnabled, true)
+ err = d.Set(mkResourceVirtualEnvironmentUserEnabled, true)
}
+ diags = append(diags, diag.FromErr(err)...)
if user.ExpirationDate != nil {
- d.Set(mkResourceVirtualEnvironmentUserExpirationDate, time.Time(*user.ExpirationDate).Format(time.RFC3339))
+ err = d.Set(mkResourceVirtualEnvironmentUserExpirationDate, time.Time(*user.ExpirationDate).Format(time.RFC3339))
} else {
- d.Set(mkResourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
+ err = d.Set(mkResourceVirtualEnvironmentUserExpirationDate, time.Unix(0, 0).UTC().Format(time.RFC3339))
}
+ diags = append(diags, diag.FromErr(err)...)
if user.FirstName != nil {
- d.Set(mkResourceVirtualEnvironmentUserFirstName, user.FirstName)
+ err = d.Set(mkResourceVirtualEnvironmentUserFirstName, user.FirstName)
} else {
- d.Set(mkResourceVirtualEnvironmentUserFirstName, "")
+ err = d.Set(mkResourceVirtualEnvironmentUserFirstName, "")
}
+ diags = append(diags, diag.FromErr(err)...)
groups := schema.NewSet(schema.HashString, []interface{}{})
@@ -303,38 +306,39 @@ func resourceVirtualEnvironmentUserRead(d *schema.ResourceData, m interface{}) e
}
}
- d.Set(mkResourceVirtualEnvironmentUserGroups, groups)
+ err = d.Set(mkResourceVirtualEnvironmentUserGroups, groups)
+ diags = append(diags, diag.FromErr(err)...)
if user.Keys != nil {
- d.Set(mkResourceVirtualEnvironmentUserKeys, user.Keys)
+ err = d.Set(mkResourceVirtualEnvironmentUserKeys, user.Keys)
} else {
- d.Set(mkResourceVirtualEnvironmentUserKeys, "")
+ err = d.Set(mkResourceVirtualEnvironmentUserKeys, "")
}
+ diags = append(diags, diag.FromErr(err)...)
if user.LastName != nil {
- d.Set(mkResourceVirtualEnvironmentUserLastName, user.LastName)
+ err = d.Set(mkResourceVirtualEnvironmentUserLastName, user.LastName)
} else {
- d.Set(mkResourceVirtualEnvironmentUserLastName, "")
+ err = d.Set(mkResourceVirtualEnvironmentUserLastName, "")
}
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentUserUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentUserUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
comment := d.Get(mkResourceVirtualEnvironmentUserComment).(string)
email := d.Get(mkResourceVirtualEnvironmentUserEmail).(string)
enabled := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentUserEnabled).(bool))
expirationDate, err := time.Parse(time.RFC3339, d.Get(mkResourceVirtualEnvironmentUserExpirationDate).(string))
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
expirationDateCustom := proxmox.CustomTimestamp(expirationDate)
@@ -361,18 +365,16 @@ func resourceVirtualEnvironmentUserUpdate(d *schema.ResourceData, m interface{})
}
userID := d.Id()
- err = veClient.UpdateUser(userID, body)
-
+ err = veClient.UpdateUser(ctx, userID, body)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if d.HasChange(mkResourceVirtualEnvironmentUserPassword) {
password := d.Get(mkResourceVirtualEnvironmentUserPassword).(string)
- err = veClient.ChangeUserPassword(userID, password)
-
+ err = veClient.ChangeUserPassword(ctx, userID, password)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -392,10 +394,9 @@ func resourceVirtualEnvironmentUserUpdate(d *schema.ResourceData, m interface{})
Users: []string{userID},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -414,22 +415,21 @@ func resourceVirtualEnvironmentUserUpdate(d *schema.ResourceData, m interface{})
Users: []string{userID},
}
- err := veClient.UpdateACL(aclBody)
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentUserRead(d, m)
+ return resourceVirtualEnvironmentUserRead(ctx, d, m)
}
-func resourceVirtualEnvironmentUserDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentUserDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
aclParsed := d.Get(mkResourceVirtualEnvironmentUserACL).(*schema.Set).List()
@@ -448,14 +448,13 @@ func resourceVirtualEnvironmentUserDelete(d *schema.ResourceData, m interface{})
Users: []string{userID},
}
- err := veClient.UpdateACL(aclBody)
-
+ err := veClient.UpdateACL(ctx, aclBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- err = veClient.DeleteUser(userID)
+ err = veClient.DeleteUser(ctx, userID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") {
@@ -463,8 +462,7 @@ func resourceVirtualEnvironmentUserDelete(d *schema.ResourceData, m interface{})
return nil
}
-
- return err
+ return diag.FromErr(err)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_user_test.go b/proxmoxtf/resource_virtual_environment_user_test.go
index 68b3bdf0..1f14ad3b 100644
--- a/proxmoxtf/resource_virtual_environment_user_test.go
+++ b/proxmoxtf/resource_virtual_environment_user_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentUserInstantiation tests whether the ResourceVirtualEnvironmentUser instance can be instantiated.
diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go
index 565cba3e..4a0f6688 100644
--- a/proxmoxtf/resource_virtual_environment_vm.go
+++ b/proxmoxtf/resource_virtual_environment_vm.go
@@ -5,16 +5,18 @@
package proxmoxtf
import (
+ "context"
"errors"
"fmt"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"sort"
"strconv"
"strings"
"time"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
- "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
const (
@@ -42,7 +44,7 @@ const (
dvResourceVirtualEnvironmentVMCPUType = "qemu64"
dvResourceVirtualEnvironmentVMCPUUnits = 1024
dvResourceVirtualEnvironmentVMDescription = ""
- dvResourcevirtualEnvironmentVMDiskInterface = "scsi0"
+ dvResourceVirtualEnvironmentVMDiskInterface = "scsi0"
dvResourceVirtualEnvironmentVMDiskDatastoreID = "local-lvm"
dvResourceVirtualEnvironmentVMDiskFileFormat = "qcow2"
dvResourceVirtualEnvironmentVMDiskFileID = ""
@@ -125,7 +127,7 @@ const (
mkResourceVirtualEnvironmentVMCPUUnits = "units"
mkResourceVirtualEnvironmentVMDescription = "description"
mkResourceVirtualEnvironmentVMDisk = "disk"
- mkResourcevirtualEnvironmentVMDiskInterface = "interface"
+ mkResourceVirtualEnvironmentVMDiskInterface = "interface"
mkResourceVirtualEnvironmentVMDiskDatastoreID = "datastore_id"
mkResourceVirtualEnvironmentVMDiskFileFormat = "file_format"
mkResourceVirtualEnvironmentVMDiskFileID = "file_id"
@@ -197,7 +199,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMRebootAfterCreation: {
Type: schema.TypeBool,
- Description: "Wether to reboot vm after creation",
+ Description: "Whether to reboot vm after creation",
Optional: true,
Default: dvResourceVirtualEnvironmentVMRebootAfterCreation,
},
@@ -236,11 +238,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMAgentEnabled,
},
mkResourceVirtualEnvironmentVMAgentTimeout: {
- Type: schema.TypeString,
- Description: "The maximum amount of time to wait for data from the QEMU agent to become available",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMAgentTimeout,
- ValidateFunc: getTimeoutValidator(),
+ Type: schema.TypeString,
+ Description: "The maximum amount of time to wait for data from the QEMU agent to become available",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMAgentTimeout,
+ ValidateDiagFunc: getTimeoutValidator(),
},
mkResourceVirtualEnvironmentVMAgentTrim: {
Type: schema.TypeBool,
@@ -249,11 +251,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMAgentTrim,
},
mkResourceVirtualEnvironmentVMAgentType: {
- Type: schema.TypeString,
- Description: "The QEMU agent interface type",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMAgentType,
- ValidateFunc: getQEMUAgentTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The QEMU agent interface type",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMAgentType,
+ ValidateDiagFunc: getQEMUAgentTypeValidator(),
},
},
},
@@ -270,18 +272,18 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMAudioDeviceDevice: {
- Type: schema.TypeString,
- Description: "The device",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMAudioDeviceDevice,
- ValidateFunc: resourceVirtualEnvironmentVMGetAudioDeviceValidator(),
+ Type: schema.TypeString,
+ Description: "The device",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMAudioDeviceDevice,
+ ValidateDiagFunc: resourceVirtualEnvironmentVMGetAudioDeviceValidator(),
},
mkResourceVirtualEnvironmentVMAudioDeviceDriver: {
- Type: schema.TypeString,
- Description: "The driver",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMAudioDeviceDriver,
- ValidateFunc: resourceVirtualEnvironmentVMGetAudioDriverValidator(),
+ Type: schema.TypeString,
+ Description: "The driver",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMAudioDeviceDriver,
+ ValidateDiagFunc: resourceVirtualEnvironmentVMGetAudioDriverValidator(),
},
mkResourceVirtualEnvironmentVMAudioDeviceEnabled: {
Type: schema.TypeBool,
@@ -295,11 +297,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
MinItems: 0,
},
mkResourceVirtualEnvironmentVMBIOS: {
- Type: schema.TypeString,
- Description: "The BIOS implementation",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMBIOS,
- ValidateFunc: getBIOSValidator(),
+ Type: schema.TypeString,
+ Description: "The BIOS implementation",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMBIOS,
+ ValidateDiagFunc: getBIOSValidator(),
},
mkResourceVirtualEnvironmentVMCDROM: {
Type: schema.TypeList,
@@ -322,11 +324,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMCDROMEnabled,
},
mkResourceVirtualEnvironmentVMCDROMFileID: {
- Type: schema.TypeString,
- Description: "The file id",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCDROMFileID,
- ValidateFunc: getFileIDValidator(),
+ Type: schema.TypeString,
+ Description: "The file id",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCDROMFileID,
+ ValidateDiagFunc: getFileIDValidator(),
},
},
},
@@ -364,11 +366,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMCloneNodeName,
},
mkResourceVirtualEnvironmentVMCloneVMID: {
- Type: schema.TypeInt,
- Description: "The ID of the source VM",
- Required: true,
- ForceNew: true,
- ValidateFunc: getVMIDValidator(),
+ Type: schema.TypeInt,
+ Description: "The ID of the source VM",
+ Required: true,
+ ForceNew: true,
+ ValidateDiagFunc: getVMIDValidator(),
},
mkResourceVirtualEnvironmentVMCloneFull: {
Type: schema.TypeBool,
@@ -402,18 +404,18 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMCPUArchitecture: {
- Type: schema.TypeString,
- Description: "The CPU architecture",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUArchitecture,
- ValidateFunc: resourceVirtualEnvironmentVMGetCPUArchitectureValidator(),
+ Type: schema.TypeString,
+ Description: "The CPU architecture",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUArchitecture,
+ ValidateDiagFunc: resourceVirtualEnvironmentVMGetCPUArchitectureValidator(),
},
mkResourceVirtualEnvironmentVMCPUCores: {
- Type: schema.TypeInt,
- Description: "The number of CPU cores",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUCores,
- ValidateFunc: validation.IntBetween(1, 2304),
+ Type: schema.TypeInt,
+ Description: "The number of CPU cores",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUCores,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(1, 2304)),
},
mkResourceVirtualEnvironmentVMCPUFlags: {
Type: schema.TypeList,
@@ -425,32 +427,32 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},
mkResourceVirtualEnvironmentVMCPUHotplugged: {
- Type: schema.TypeInt,
- Description: "The number of hotplugged vCPUs",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUHotplugged,
- ValidateFunc: validation.IntBetween(0, 2304),
+ Type: schema.TypeInt,
+ Description: "The number of hotplugged vCPUs",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUHotplugged,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 2304)),
},
mkResourceVirtualEnvironmentVMCPUSockets: {
- Type: schema.TypeInt,
- Description: "The number of CPU sockets",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUSockets,
- ValidateFunc: validation.IntBetween(1, 16),
+ Type: schema.TypeInt,
+ Description: "The number of CPU sockets",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUSockets,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(1, 16)),
},
mkResourceVirtualEnvironmentVMCPUType: {
- Type: schema.TypeString,
- Description: "The emulated CPU type",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUType,
- ValidateFunc: getCPUTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The emulated CPU type",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUType,
+ ValidateDiagFunc: getCPUTypeValidator(),
},
mkResourceVirtualEnvironmentVMCPUUnits: {
- Type: schema.TypeInt,
- Description: "The CPU units",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMCPUUnits,
- ValidateFunc: validation.IntBetween(2, 262144),
+ Type: schema.TypeInt,
+ Description: "The CPU units",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMCPUUnits,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(2, 262144)),
},
},
},
@@ -474,14 +476,14 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentVMDiskDatastoreID,
mkResourceVirtualEnvironmentVMDiskFileFormat: dvResourceVirtualEnvironmentVMDiskFileFormat,
mkResourceVirtualEnvironmentVMDiskFileID: dvResourceVirtualEnvironmentVMDiskFileID,
- mkResourcevirtualEnvironmentVMDiskInterface: dvResourcevirtualEnvironmentVMDiskInterface,
+ mkResourceVirtualEnvironmentVMDiskInterface: dvResourceVirtualEnvironmentVMDiskInterface,
mkResourceVirtualEnvironmentVMDiskSize: dvResourceVirtualEnvironmentVMDiskSize,
},
}, nil
},
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
- mkResourcevirtualEnvironmentVMDiskInterface: {
+ mkResourceVirtualEnvironmentVMDiskInterface: {
Type: schema.TypeString,
Description: "The datastore name",
Required: true,
@@ -493,27 +495,27 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMDiskDatastoreID,
},
mkResourceVirtualEnvironmentVMDiskFileFormat: {
- Type: schema.TypeString,
- Description: "The file format",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentVMDiskFileFormat,
- ValidateFunc: getFileFormatValidator(),
+ Type: schema.TypeString,
+ Description: "The file format",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentVMDiskFileFormat,
+ ValidateDiagFunc: getFileFormatValidator(),
},
mkResourceVirtualEnvironmentVMDiskFileID: {
- Type: schema.TypeString,
- Description: "The file id for a disk image",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentVMDiskFileID,
- ValidateFunc: getFileIDValidator(),
+ Type: schema.TypeString,
+ Description: "The file id for a disk image",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentVMDiskFileID,
+ ValidateDiagFunc: getFileIDValidator(),
},
mkResourceVirtualEnvironmentVMDiskSize: {
- Type: schema.TypeInt,
- Description: "The disk size in gigabytes",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMDiskSize,
- ValidateFunc: validation.IntAtLeast(1),
+ Type: schema.TypeInt,
+ Description: "The disk size in gigabytes",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMDiskSize,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntAtLeast(1)),
},
mkResourceVirtualEnvironmentVMDiskSpeed: {
Type: schema.TypeList,
@@ -713,20 +715,20 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
MinItems: 0,
},
mkResourceVirtualEnvironmentVMInitializationUserDataFileID: {
- Type: schema.TypeString,
- Description: "The ID of a file containing custom user data",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentVMInitializationUserDataFileID,
- ValidateFunc: getFileIDValidator(),
+ Type: schema.TypeString,
+ Description: "The ID of a file containing custom user data",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentVMInitializationUserDataFileID,
+ ValidateDiagFunc: getFileIDValidator(),
},
mkResourceVirtualEnvironmentVMInitializationType: {
- Type: schema.TypeString,
- Description: "The cloud-init configuration format",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentVMInitializationType,
- ValidateFunc: getCloudInitTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The cloud-init configuration format",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentVMInitializationType,
+ ValidateDiagFunc: getCloudInitTypeValidator(),
},
},
},
@@ -752,11 +754,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
},
},
mkResourceVirtualEnvironmentVMKeyboardLayout: {
- Type: schema.TypeString,
- Description: "The keyboard layout",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMKeyboardLayout,
- ValidateFunc: getKeyboardLayoutValidator(),
+ Type: schema.TypeString,
+ Description: "The keyboard layout",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMKeyboardLayout,
+ ValidateDiagFunc: getKeyboardLayoutValidator(),
},
mkResourceVirtualEnvironmentVMMACAddresses: {
Type: schema.TypeList,
@@ -780,25 +782,25 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMMemoryDedicated: {
- Type: schema.TypeInt,
- Description: "The dedicated memory in megabytes",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMMemoryDedicated,
- ValidateFunc: validation.IntBetween(64, 268435456),
+ Type: schema.TypeInt,
+ Description: "The dedicated memory in megabytes",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMMemoryDedicated,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(64, 268435456)),
},
mkResourceVirtualEnvironmentVMMemoryFloating: {
- Type: schema.TypeInt,
- Description: "The floating memory in megabytes (balloon)",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMMemoryFloating,
- ValidateFunc: validation.IntBetween(0, 268435456),
+ Type: schema.TypeInt,
+ Description: "The floating memory in megabytes (balloon)",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMMemoryFloating,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 268435456)),
},
mkResourceVirtualEnvironmentVMMemoryShared: {
- Type: schema.TypeInt,
- Description: "The shared memory in megabytes",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMMemoryShared,
- ValidateFunc: validation.IntBetween(0, 268435456),
+ Type: schema.TypeInt,
+ Description: "The shared memory in megabytes",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMMemoryShared,
+ ValidateDiagFunc: validation.ToDiagFunc(validation.IntBetween(0, 268435456)),
},
},
},
@@ -840,14 +842,14 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
return new == ""
},
- ValidateFunc: getMACAddressValidator(),
+ ValidateDiagFunc: getMACAddressValidator(),
},
mkResourceVirtualEnvironmentVMNetworkDeviceModel: {
- Type: schema.TypeString,
- Description: "The model",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMNetworkDeviceModel,
- ValidateFunc: getNetworkDeviceModelValidator(),
+ Type: schema.TypeString,
+ Description: "The model",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMNetworkDeviceModel,
+ ValidateDiagFunc: getNetworkDeviceModelValidator(),
},
mkResourceVirtualEnvironmentVMNetworkDeviceRateLimit: {
Type: schema.TypeFloat,
@@ -892,11 +894,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMOperatingSystemType: {
- Type: schema.TypeString,
- Description: "The type",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMOperatingSystemType,
- ValidateFunc: resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator(),
+ Type: schema.TypeString,
+ Description: "The type",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMOperatingSystemType,
+ ValidateDiagFunc: resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator(),
},
},
},
@@ -924,11 +926,11 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
mkResourceVirtualEnvironmentVMSerialDeviceDevice: {
- Type: schema.TypeString,
- Description: "The device",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMSerialDeviceDevice,
- ValidateFunc: resourceVirtualEnvironmentVMGetSerialDeviceValidator(),
+ Type: schema.TypeString,
+ Description: "The device",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMSerialDeviceDevice,
+ ValidateDiagFunc: resourceVirtualEnvironmentVMGetSerialDeviceValidator(),
},
},
},
@@ -1015,18 +1017,18 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
Default: dvResourceVirtualEnvironmentVMVGAEnabled,
},
mkResourceVirtualEnvironmentVMVGAMemory: {
- Type: schema.TypeInt,
- Description: "The VGA memory in megabytes (4-512 MB)",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMVGAMemory,
- ValidateFunc: getVGAMemoryValidator(),
+ Type: schema.TypeInt,
+ Description: "The VGA memory in megabytes (4-512 MB)",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMVGAMemory,
+ ValidateDiagFunc: getVGAMemoryValidator(),
},
mkResourceVirtualEnvironmentVMVGAType: {
- Type: schema.TypeString,
- Description: "The VGA type",
- Optional: true,
- Default: dvResourceVirtualEnvironmentVMVGAType,
- ValidateFunc: getVGATypeValidator(),
+ Type: schema.TypeString,
+ Description: "The VGA type",
+ Optional: true,
+ Default: dvResourceVirtualEnvironmentVMVGAType,
+ ValidateDiagFunc: getVGATypeValidator(),
},
},
},
@@ -1034,37 +1036,36 @@ func resourceVirtualEnvironmentVM() *schema.Resource {
MinItems: 0,
},
mkResourceVirtualEnvironmentVMVMID: {
- Type: schema.TypeInt,
- Description: "The VM identifier",
- Optional: true,
- ForceNew: true,
- Default: dvResourceVirtualEnvironmentVMVMID,
- ValidateFunc: getVMIDValidator(),
+ Type: schema.TypeInt,
+ Description: "The VM identifier",
+ Optional: true,
+ ForceNew: true,
+ Default: dvResourceVirtualEnvironmentVMVMID,
+ ValidateDiagFunc: getVMIDValidator(),
},
},
- Create: resourceVirtualEnvironmentVMCreate,
- Read: resourceVirtualEnvironmentVMRead,
- Update: resourceVirtualEnvironmentVMUpdate,
- Delete: resourceVirtualEnvironmentVMDelete,
+ CreateContext: resourceVirtualEnvironmentVMCreate,
+ ReadContext: resourceVirtualEnvironmentVMRead,
+ UpdateContext: resourceVirtualEnvironmentVMUpdate,
+ DeleteContext: resourceVirtualEnvironmentVMDelete,
}
}
-func resourceVirtualEnvironmentVMCreate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
if len(clone) > 0 {
- return resourceVirtualEnvironmentVMCreateClone(d, m)
+ return resourceVirtualEnvironmentVMCreateClone(ctx, d, m)
}
- return resourceVirtualEnvironmentVMCreateCustom(d, m)
+ return resourceVirtualEnvironmentVMCreateCustom(ctx, d, m)
}
-func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
@@ -1082,12 +1083,10 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
vmID := d.Get(mkResourceVirtualEnvironmentVMVMID).(int)
if vmID == -1 {
- vmIDNew, err := veClient.GetVMID()
-
+ vmIDNew, err := veClient.GetVMID(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
-
vmID = *vmIDNew
}
@@ -1119,31 +1118,28 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
if cloneNodeName != "" && cloneNodeName != nodeName {
cloneBody.TargetNodeName = &nodeName
- err = veClient.CloneVM(cloneNodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout)
+ err = veClient.CloneVM(ctx, cloneNodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout)
} else {
- err = veClient.CloneVM(nodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout)
+ err = veClient.CloneVM(ctx, nodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout)
}
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(strconv.Itoa(vmID))
// Wait for the virtual machine to be created and its configuration lock to be released.
- err = veClient.WaitForVMConfigUnlock(nodeName, vmID, 600, 5, true)
-
+ err = veClient.WaitForVMConfigUnlock(ctx, nodeName, vmID, 600, 5, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Now that the virtual machine has been cloned, we need to perform some modifications.
acpi := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMACPI).(bool))
agent := d.Get(mkResourceVirtualEnvironmentVMAgent).([]interface{})
- audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d, m)
-
+ audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
@@ -1166,7 +1162,7 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
ideDevices := proxmox.CustomStorageDevices{}
- delete := []string{}
+ var del []string
if acpi != dvResourceVirtualEnvironmentVMACPI {
updateBody.ACPI = &acpi
@@ -1267,7 +1263,7 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
initializationBlock := initialization[0].(map[string]interface{})
initializationDatastoreID := initializationBlock[mkResourceVirtualEnvironmentVMInitializationDatastoreID].(string)
- cdromCloudInitEnabled := true
+ const cdromCloudInitEnabled = true
cdromCloudInitFileID := fmt.Sprintf("%s:cloudinit", initializationDatastoreID)
cdromCloudInitMedia := "cdrom"
@@ -1279,10 +1275,9 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
},
}
- initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d, m)
-
+ initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
updateBody.CloudInitConfig = initializationConfig
@@ -1317,20 +1312,19 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
}
if len(networkDevice) > 0 {
- updateBody.NetworkDevices, err = resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d, m)
-
+ updateBody.NetworkDevices, err = resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := 0; i < len(updateBody.NetworkDevices); i++ {
if !updateBody.NetworkDevices[i].Enabled {
- delete = append(delete, fmt.Sprintf("net%d", i))
+ del = append(del, fmt.Sprintf("net%d", i))
}
}
for i := len(updateBody.NetworkDevices); i < maxResourceVirtualEnvironmentVMNetworkDevices; i++ {
- delete = append(delete, fmt.Sprintf("net%d", i))
+ del = append(del, fmt.Sprintf("net%d", i))
}
}
@@ -1342,14 +1336,13 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
}
if len(serialDevice) > 0 {
- updateBody.SerialDevices, err = resourceVirtualEnvironmentVMGetSerialDeviceList(d, m)
-
+ updateBody.SerialDevices, err = resourceVirtualEnvironmentVMGetSerialDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := len(updateBody.SerialDevices); i < maxResourceVirtualEnvironmentVMSerialDevices; i++ {
- delete = append(delete, fmt.Sprintf("serial%d", i))
+ del = append(del, fmt.Sprintf("serial%d", i))
}
}
@@ -1364,25 +1357,24 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
}
if len(vga) > 0 {
- vgaDevice, err := resourceVirtualEnvironmentVMGetVGADeviceObject(d, m)
-
+ vgaDevice, err := resourceVirtualEnvironmentVMGetVGADeviceObject(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
updateBody.VGADevice = vgaDevice
}
- updateBody.Delete = delete
+ updateBody.Delete = del
- err = veClient.UpdateVM(nodeName, vmID, updateBody)
+ err = veClient.UpdateVM(ctx, nodeName, vmID, updateBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
disk := d.Get(mkResourceVirtualEnvironmentVMDisk).([]interface{})
- vmConfig, err := veClient.GetVM(nodeName, vmID)
+ vmConfig, err := veClient.GetVM(ctx, nodeName, vmID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") ||
@@ -1391,20 +1383,18 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
return nil
}
-
- return err
+ return diag.FromErr(err)
}
allDiskInfo := getDiskInfo(vmConfig, d)
- diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m, nil)
-
+ diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, nil)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := range disk {
diskBlock := disk[i].(map[string]interface{})
- diskInterface := diskBlock[mkResourcevirtualEnvironmentVMDiskInterface].(string)
+ diskInterface := diskBlock[mkResourceVirtualEnvironmentVMDiskInterface].(string)
dataStoreID := diskBlock[mkResourceVirtualEnvironmentVMDiskDatastoreID].(string)
diskSize := diskBlock[mkResourceVirtualEnvironmentVMDiskSize].(int)
@@ -1432,23 +1422,21 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
diskUpdateBody.SCSIDevices[diskInterface] = diskDeviceObjects[prefix][diskInterface]
}
- err = veClient.UpdateVM(nodeName, vmID, diskUpdateBody)
-
+ err = veClient.UpdateVM(ctx, nodeName, vmID, diskUpdateBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
continue
}
compareNumber, err := parseDiskSize(currentDiskInfo.Size)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
if diskSize < compareNumber {
- return fmt.Errorf("Disk resize fails requests size (%dG) is lower than current size (%s)", diskSize, *currentDiskInfo.Size)
+ return diag.Errorf("disk resize fails requests size (%dG) is lower than current size (%s)", diskSize, *currentDiskInfo.Size)
}
deleteOriginalDisk := proxmox.CustomBool(true)
@@ -1477,59 +1465,53 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface
if moveDisk {
moveDiskTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutMoveDisk).(int)
- err = veClient.MoveVMDisk(nodeName, vmID, diskMoveBody, moveDiskTimeout)
-
+ err = veClient.MoveVMDisk(ctx, nodeName, vmID, diskMoveBody, moveDiskTimeout)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
if diskSize > compareNumber {
- err = veClient.ResizeVMDisk(nodeName, vmID, diskResizeBody)
-
+ err = veClient.ResizeVMDisk(ctx, nodeName, vmID, diskResizeBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
}
- return resourceVirtualEnvironmentVMCreateStart(d, m)
+ return resourceVirtualEnvironmentVMCreateStart(ctx, d, m)
}
-func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
resource := resourceVirtualEnvironmentVM()
acpi := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMACPI).(bool))
- agentBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
-
+ agentBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
agentEnabled := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentEnabled].(bool))
agentTrim := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentTrim].(bool))
agentType := agentBlock[mkResourceVirtualEnvironmentVMAgentType].(string)
- audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d, m)
-
+ audioDevices, err := resourceVirtualEnvironmentVMGetAudioDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
bios := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
- cdromBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true)
-
+ cdromBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool)
@@ -1542,10 +1524,9 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
cdromFileID = "cdrom"
}
- cpuBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCPU}, 0, true)
-
+ cpuBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMCPU}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cpuArchitecture := cpuBlock[mkResourceVirtualEnvironmentVMCPUArchitecture].(string)
@@ -1557,10 +1538,9 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
cpuUnits := cpuBlock[mkResourceVirtualEnvironmentVMCPUUnits].(int)
description := d.Get(mkResourceVirtualEnvironmentVMDescription).(string)
- diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m, nil)
-
+ diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, nil)
if err != nil {
- return err
+ return diag.FromErr(err)
}
virtioDeviceObjects := diskDeviceObjects["virtio"]
@@ -1568,10 +1548,9 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
//ideDeviceObjects := getOrderedDiskDeviceList(diskDeviceObjects, "ide")
sataDeviceObjects := diskDeviceObjects["sata"]
- initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d, m)
-
+ initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if initializationConfig != nil {
@@ -1584,10 +1563,9 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
}
keyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string)
- memoryBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMMemory}, 0, true)
-
+ memoryBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMMemory}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
memoryDedicated := memoryBlock[mkResourceVirtualEnvironmentVMMemoryDedicated].(int)
@@ -1596,47 +1574,42 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
name := d.Get(mkResourceVirtualEnvironmentVMName).(string)
- networkDeviceObjects, err := resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d, m)
-
+ networkDeviceObjects, err := resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
- operatingSystem, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMOperatingSystem}, 0, true)
-
+ operatingSystem, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMOperatingSystem}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
operatingSystemType := operatingSystem[mkResourceVirtualEnvironmentVMOperatingSystemType].(string)
poolID := d.Get(mkResourceVirtualEnvironmentVMPoolID).(string)
- serialDevices, err := resourceVirtualEnvironmentVMGetSerialDeviceList(d, m)
-
+ serialDevices, err := resourceVirtualEnvironmentVMGetSerialDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
onBoot := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMOnBoot).(bool))
tabletDevice := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMTabletDevice).(bool))
template := proxmox.CustomBool(d.Get(mkResourceVirtualEnvironmentVMTemplate).(bool))
- vgaDevice, err := resourceVirtualEnvironmentVMGetVGADeviceObject(d, m)
-
+ vgaDevice, err := resourceVirtualEnvironmentVMGetVGADeviceObject(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
vmID := d.Get(mkResourceVirtualEnvironmentVMVMID).(int)
if vmID == -1 {
- vmIDNew, err := veClient.GetVMID()
-
+ vmIDNew, err := veClient.GetVMID(ctx)
if err != nil {
- return err
+ return diag.FromErr(err)
}
vmID = *vmIDNew
@@ -1749,33 +1722,30 @@ func resourceVirtualEnvironmentVMCreateCustom(d *schema.ResourceData, m interfac
createBody.PoolID = &poolID
}
- err = veClient.CreateVM(nodeName, createBody)
-
+ err = veClient.CreateVM(ctx, nodeName, createBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
d.SetId(strconv.Itoa(vmID))
- return resourceVirtualEnvironmentVMCreateCustomDisks(d, m)
+ return resourceVirtualEnvironmentVMCreateCustomDisks(ctx, d, m)
}
-func resourceVirtualEnvironmentVMCreateCustomDisks(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMCreateCustomDisks(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- commands := []string{}
+ var commands []string
// Determine the ID of the next disk.
disk := d.Get(mkResourceVirtualEnvironmentVMDisk).([]interface{})
@@ -1812,15 +1782,13 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(d *schema.ResourceData, m int
fileFormat, _ := block[mkResourceVirtualEnvironmentVMDiskFileFormat].(string)
size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int)
speed := block[mkResourceVirtualEnvironmentVMDiskSpeed].([]interface{})
- diskInterface, _ := block[mkResourcevirtualEnvironmentVMDiskInterface].(string)
+ diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string)
if len(speed) == 0 {
diskSpeedDefault, err := diskSpeedResource.DefaultValue()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
-
speed = diskSpeedDefault.([]interface{})
}
@@ -1893,63 +1861,58 @@ func resourceVirtualEnvironmentVMCreateCustomDisks(d *schema.ResourceData, m int
// Execute the commands on the node and wait for the result.
// This is a highly experimental approach to disk imports and is not recommended by Proxmox.
if len(commands) > 0 {
- err = veClient.ExecuteNodeCommands(nodeName, commands)
-
+ err = veClient.ExecuteNodeCommands(ctx, nodeName, commands)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentVMCreateStart(d, m)
+ return resourceVirtualEnvironmentVMCreateStart(ctx, d, m)
}
-func resourceVirtualEnvironmentVMCreateStart(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMCreateStart(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
started := d.Get(mkResourceVirtualEnvironmentVMStarted).(bool)
template := d.Get(mkResourceVirtualEnvironmentVMTemplate).(bool)
reboot := d.Get(mkResourceVirtualEnvironmentVMRebootAfterCreation).(bool)
if !started || template {
- return resourceVirtualEnvironmentVMRead(d, m)
+ return resourceVirtualEnvironmentVMRead(ctx, d, m)
}
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Start the virtual machine and wait for it to reach a running state before continuing.
startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int)
- err = veClient.StartVM(nodeName, vmID, startVMTimeout)
-
+ err = veClient.StartVM(ctx, nodeName, vmID, startVMTimeout)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if reboot {
rebootTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutReboot).(int)
- err := veClient.RebootVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{
+ err := veClient.RebootVM(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{
Timeout: &rebootTimeout,
- }, (rebootTimeout + 30))
-
+ }, rebootTimeout+30)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentVMRead(d, m)
+ return resourceVirtualEnvironmentVMRead(ctx, d, m)
}
-func resourceVirtualEnvironmentVMGetAudioDeviceList(d *schema.ResourceData, m interface{}) (proxmox.CustomAudioDevices, error) {
+func resourceVirtualEnvironmentVMGetAudioDeviceList(d *schema.ResourceData) (proxmox.CustomAudioDevices, error) {
devices := d.Get(mkResourceVirtualEnvironmentVMAudioDevice).([]interface{})
list := make(proxmox.CustomAudioDevices, len(devices))
@@ -1968,21 +1931,21 @@ func resourceVirtualEnvironmentVMGetAudioDeviceList(d *schema.ResourceData, m in
return list, nil
}
-func resourceVirtualEnvironmentVMGetAudioDeviceValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentVMGetAudioDeviceValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"AC97",
"ich9-intel-hda",
"intel-hda",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentVMGetAudioDriverValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentVMGetAudioDriverValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"spice",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentVMGetCloudInitConfig(d *schema.ResourceData, m interface{}) (*proxmox.CustomCloudInitConfig, error) {
+func resourceVirtualEnvironmentVMGetCloudInitConfig(d *schema.ResourceData) (*proxmox.CustomCloudInitConfig, error) {
var initializationConfig *proxmox.CustomCloudInitConfig
initialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{})
@@ -2092,14 +2055,14 @@ func resourceVirtualEnvironmentVMGetCloudInitConfig(d *schema.ResourceData, m in
return initializationConfig, nil
}
-func resourceVirtualEnvironmentVMGetCPUArchitectureValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentVMGetCPUArchitectureValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"aarch64",
"x86_64",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, m interface{}, disks []interface{}) (map[string]map[string]proxmox.CustomStorageDevice, error) {
+func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, disks []interface{}) (map[string]map[string]proxmox.CustomStorageDevice, error) {
var diskDevice []interface{}
if disks != nil {
@@ -2120,9 +2083,9 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, m
datastoreID, _ := block[mkResourceVirtualEnvironmentVMDiskDatastoreID].(string)
fileID, _ := block[mkResourceVirtualEnvironmentVMDiskFileID].(string)
size, _ := block[mkResourceVirtualEnvironmentVMDiskSize].(int)
- diskInterface, _ := block[mkResourcevirtualEnvironmentVMDiskInterface].(string)
+ diskInterface, _ := block[mkResourceVirtualEnvironmentVMDiskInterface].(string)
- speedBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false)
+ speedBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMDisk, mkResourceVirtualEnvironmentVMDiskSpeed}, 0, false)
if err != nil {
return diskDeviceObjects, err
@@ -2181,7 +2144,7 @@ func resourceVirtualEnvironmentVMGetDiskDeviceObjects(d *schema.ResourceData, m
return diskDeviceObjects, nil
}
-func resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d *schema.ResourceData, m interface{}) (proxmox.CustomNetworkDevices, error) {
+func resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d *schema.ResourceData) (proxmox.CustomNetworkDevices, error) {
networkDevice := d.Get(mkResourceVirtualEnvironmentVMNetworkDevice).([]interface{})
networkDeviceObjects := make(proxmox.CustomNetworkDevices, len(networkDevice))
@@ -2222,8 +2185,8 @@ func resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d *schema.ResourceData,
return networkDeviceObjects, nil
}
-func resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"l24",
"l26",
"other",
@@ -2236,10 +2199,10 @@ func resourceVirtualEnvironmentVMGetOperatingSystemTypeValidator() schema.Schema
"win10",
"wvista",
"wxp",
- }, false)
+ }, false))
}
-func resourceVirtualEnvironmentVMGetSerialDeviceList(d *schema.ResourceData, m interface{}) (proxmox.CustomSerialDevices, error) {
+func resourceVirtualEnvironmentVMGetSerialDeviceList(d *schema.ResourceData) (proxmox.CustomSerialDevices, error) {
device := d.Get(mkResourceVirtualEnvironmentVMSerialDevice).([]interface{})
list := make(proxmox.CustomSerialDevices, len(device))
@@ -2254,8 +2217,8 @@ func resourceVirtualEnvironmentVMGetSerialDeviceList(d *schema.ResourceData, m i
return list, nil
}
-func resourceVirtualEnvironmentVMGetSerialDeviceValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (s []string, es []error) {
+func resourceVirtualEnvironmentVMGetSerialDeviceValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (s []string, es []error) {
v, ok := i.(string)
if !ok {
@@ -2269,13 +2232,13 @@ func resourceVirtualEnvironmentVMGetSerialDeviceValidator() schema.SchemaValidat
}
return
- }
+ })
}
-func resourceVirtualEnvironmentVMGetVGADeviceObject(d *schema.ResourceData, m interface{}) (*proxmox.CustomVGADevice, error) {
+func resourceVirtualEnvironmentVMGetVGADeviceObject(d *schema.ResourceData) (*proxmox.CustomVGADevice, error) {
resource := resourceVirtualEnvironmentVM()
- vgaBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMVGA}, 0, true)
+ vgaBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMVGA}, 0, true)
if err != nil {
return nil, err
@@ -2304,23 +2267,21 @@ func resourceVirtualEnvironmentVMGetVGADeviceObject(d *schema.ResourceData, m in
return vgaDevice, nil
}
-func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Retrieve the entire configuration in order to compare it to the state.
- vmConfig, err := veClient.GetVM(nodeName, vmID)
+ vmConfig, err := veClient.GetVM(ctx, nodeName, vmID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") ||
@@ -2330,30 +2291,27 @@ func resourceVirtualEnvironmentVMRead(d *schema.ResourceData, m interface{}) err
return nil
}
- return err
+ return diag.FromErr(err)
}
- vmStatus, err := veClient.GetVMStatus(nodeName, vmID)
-
+ vmStatus, err := veClient.GetVMStatus(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
- return resourceVirtualEnvironmentVMReadCustom(d, m, vmID, vmConfig, vmStatus)
+ return resourceVirtualEnvironmentVMReadCustom(ctx, d, m, vmID, vmConfig, vmStatus)
}
-func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{}, vmID int, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData, vmStatus *proxmox.VirtualEnvironmentVMGetStatusResponseData) error {
+func resourceVirtualEnvironmentVMReadCustom(ctx context.Context, d *schema.ResourceData, m interface{}, vmID int, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData, vmStatus *proxmox.VirtualEnvironmentVMGetStatusResponseData) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- err = resourceVirtualEnvironmentVMReadPrimitiveValues(d, m, vmID, vmConfig, vmStatus)
-
- if err != nil {
- return err
+ diags := resourceVirtualEnvironmentVMReadPrimitiveValues(d, vmConfig, vmStatus)
+ if diags.HasError() {
+ return diags
}
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
@@ -2398,21 +2356,25 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentAgent) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent})
+ err := d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentAgent) > 0 ||
agent[mkResourceVirtualEnvironmentVMAgentEnabled] != dvResourceVirtualEnvironmentVMAgentEnabled ||
agent[mkResourceVirtualEnvironmentVMAgentTimeout] != dvResourceVirtualEnvironmentVMAgentTimeout ||
agent[mkResourceVirtualEnvironmentVMAgentTrim] != dvResourceVirtualEnvironmentVMAgentTrim ||
agent[mkResourceVirtualEnvironmentVMAgentType] != dvResourceVirtualEnvironmentVMAgentType {
- d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent})
+ err := d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(clone) > 0 {
if len(currentAgent) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
} else {
- d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
}
@@ -2450,7 +2412,8 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
}
if len(clone) == 0 || len(currentAudioDevice) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMAudioDevice, audioDevices[:audioDevicesCount])
+ err := d.Set(mkResourceVirtualEnvironmentVMAudioDevice, audioDevices[:audioDevicesCount])
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the IDE devices to the CDROM and cloud-init configurations stored in the state.
@@ -2477,11 +2440,13 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
cdrom[0] = cdromBlock
- d.Set(mkResourceVirtualEnvironmentVMCDROM, cdrom)
+ err := d.Set(mkResourceVirtualEnvironmentVMCDROM, cdrom)
+ diags = append(diags, diag.FromErr(err)...)
}
} else {
- d.Set(mkResourceVirtualEnvironmentVMCDROM, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMCDROM, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the CPU configuration to the one stored in the state.
@@ -2551,7 +2516,8 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentCPU) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMCPU, []interface{}{cpu})
+ err := d.Set(mkResourceVirtualEnvironmentVMCPU, []interface{}{cpu})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentCPU) > 0 ||
cpu[mkResourceVirtualEnvironmentVMCPUArchitecture] != dvResourceVirtualEnvironmentVMCPUArchitecture ||
@@ -2561,13 +2527,14 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
cpu[mkResourceVirtualEnvironmentVMCPUSockets] != dvResourceVirtualEnvironmentVMCPUSockets ||
cpu[mkResourceVirtualEnvironmentVMCPUType] != dvResourceVirtualEnvironmentVMCPUType ||
cpu[mkResourceVirtualEnvironmentVMCPUUnits] != dvResourceVirtualEnvironmentVMCPUUnits {
- d.Set(mkResourceVirtualEnvironmentVMCPU, []interface{}{cpu})
+ err := d.Set(mkResourceVirtualEnvironmentVMCPU, []interface{}{cpu})
+ diags = append(diags, diag.FromErr(err)...)
}
currentDiskList := d.Get(mkResourceVirtualEnvironmentVMDisk).([]interface{})
diskMap := map[string]interface{}{}
diskObjects := getDiskInfo(vmConfig, d)
- orderedDiskList := []interface{}{}
+ var orderedDiskList []interface{}
for di, dd := range diskObjects {
disk := map[string]interface{}{}
@@ -2590,15 +2557,14 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
disk[mkResourceVirtualEnvironmentVMDiskFileID] = dd.FileID
}
- disk[mkResourcevirtualEnvironmentVMDiskInterface] = di
+ disk[mkResourceVirtualEnvironmentVMDiskInterface] = di
diskSize := 0
var err error
diskSize, err = parseDiskSize(dd.Size)
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
disk[mkResourceVirtualEnvironmentVMDiskSize] = diskSize
@@ -2641,7 +2607,7 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
diskMap[di] = disk
}
- keyList := []string{}
+ var keyList []string
for key := range diskMap {
keyList = append(keyList, key)
@@ -2655,10 +2621,12 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentDiskList) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMDisk, orderedDiskList)
+ err := d.Set(mkResourceVirtualEnvironmentVMDisk, orderedDiskList)
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentDiskList) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMDisk, orderedDiskList)
+ err := d.Set(mkResourceVirtualEnvironmentVMDisk, orderedDiskList)
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the initialization configuration to the one stored in the state.
@@ -2806,15 +2774,19 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentInitialization) > 0 {
if len(initialization) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{initialization})
+ err := d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{initialization})
+ diags = append(diags, diag.FromErr(err)...)
} else {
- d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
}
} else if len(initialization) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{initialization})
+ err := d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{initialization})
+ diags = append(diags, diag.FromErr(err)...)
} else {
- d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMInitialization, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the memory configuration to the one stored in the state.
@@ -2842,13 +2814,15 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentMemory) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMMemory, []interface{}{memory})
+ err := d.Set(mkResourceVirtualEnvironmentVMMemory, []interface{}{memory})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentMemory) > 0 ||
memory[mkResourceVirtualEnvironmentVMMemoryDedicated] != dvResourceVirtualEnvironmentVMMemoryDedicated ||
memory[mkResourceVirtualEnvironmentVMMemoryFloating] != dvResourceVirtualEnvironmentVMMemoryFloating ||
memory[mkResourceVirtualEnvironmentVMMemoryShared] != dvResourceVirtualEnvironmentVMMemoryShared {
- d.Set(mkResourceVirtualEnvironmentVMMemory, []interface{}{memory})
+ err := d.Set(mkResourceVirtualEnvironmentVMMemory, []interface{}{memory})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the network devices to those stored in the state.
@@ -2912,14 +2886,18 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentNetworkDeviceList) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses[0:len(currentNetworkDeviceList)])
- d.Set(mkResourceVirtualEnvironmentVMNetworkDevice, networkDeviceList[:networkDeviceLast+1])
+ err := d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses[0:len(currentNetworkDeviceList)])
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentVMNetworkDevice, networkDeviceList[:networkDeviceLast+1])
+ diags = append(diags, diag.FromErr(err)...)
}
} else {
- d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses[0:len(currentNetworkDeviceList)])
+ err := d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses[0:len(currentNetworkDeviceList)])
+ diags = append(diags, diag.FromErr(err)...)
if len(currentNetworkDeviceList) > 0 || networkDeviceLast > -1 {
- d.Set(mkResourceVirtualEnvironmentVMNetworkDevice, networkDeviceList[:networkDeviceLast+1])
+ err := d.Set(mkResourceVirtualEnvironmentVMNetworkDevice, networkDeviceList[:networkDeviceLast+1])
+ diags = append(diags, diag.FromErr(err)...)
}
}
@@ -2936,13 +2914,16 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentOperatingSystem) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{operatingSystem})
+ err := d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{operatingSystem})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentOperatingSystem) > 0 ||
operatingSystem[mkResourceVirtualEnvironmentVMOperatingSystemType] != dvResourceVirtualEnvironmentVMOperatingSystemType {
- d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{operatingSystem})
+ err := d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{operatingSystem})
+ diags = append(diags, diag.FromErr(err)...)
} else {
- d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMOperatingSystem, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the pool ID to the value stored in the state.
@@ -2950,7 +2931,8 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) == 0 || currentPoolID != dvResourceVirtualEnvironmentVMPoolID {
if vmConfig.PoolID != nil {
- d.Set(mkResourceVirtualEnvironmentVMPoolID, *vmConfig.PoolID)
+ err := d.Set(mkResourceVirtualEnvironmentVMPoolID, *vmConfig.PoolID)
+ diags = append(diags, diag.FromErr(err)...)
}
}
@@ -2980,7 +2962,8 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
currentSerialDevice := d.Get(mkResourceVirtualEnvironmentVMSerialDevice).([]interface{})
if len(clone) == 0 || len(currentSerialDevice) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMSerialDevice, serialDevices[:serialDevicesCount])
+ err := d.Set(mkResourceVirtualEnvironmentVMSerialDevice, serialDevices[:serialDevicesCount])
+ diags = append(diags, diag.FromErr(err)...)
}
// Compare the VGA configuration to the one stored in the state.
@@ -3018,52 +3001,56 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{
if len(clone) > 0 {
if len(currentVGA) > 0 {
- d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{vga})
+ err := d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{vga})
+ diags = append(diags, diag.FromErr(err)...)
}
} else if len(currentVGA) > 0 ||
vga[mkResourceVirtualEnvironmentVMVGAEnabled] != dvResourceVirtualEnvironmentVMVGAEnabled ||
vga[mkResourceVirtualEnvironmentVMVGAMemory] != dvResourceVirtualEnvironmentVMVGAMemory ||
vga[mkResourceVirtualEnvironmentVMVGAType] != dvResourceVirtualEnvironmentVMVGAType {
- d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{vga})
+ err := d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{vga})
+ diags = append(diags, diag.FromErr(err)...)
} else {
- d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{})
+ err := d.Set(mkResourceVirtualEnvironmentVMVGA, []interface{}{})
+ diags = append(diags, diag.FromErr(err)...)
}
- return resourceVirtualEnvironmentVMReadNetworkValues(d, m, vmID, vmConfig)
+ diags = append(diags, resourceVirtualEnvironmentVMReadNetworkValues(ctx, d, m, vmID, vmConfig)...)
+
+ return diags
}
-func resourceVirtualEnvironmentVMReadNetworkValues(d *schema.ResourceData, m interface{}, vmID int, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData) error {
+func resourceVirtualEnvironmentVMReadNetworkValues(ctx context.Context, d *schema.ResourceData, m interface{}, vmID int, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData) diag.Diagnostics {
+ var diags diag.Diagnostics
+
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
started := d.Get(mkResourceVirtualEnvironmentVMStarted).(bool)
- ipv4Addresses := []interface{}{}
- ipv6Addresses := []interface{}{}
- networkInterfaceNames := []interface{}{}
+ var ipv4Addresses []interface{}
+ var ipv6Addresses []interface{}
+ var networkInterfaceNames []interface{}
if started {
if vmConfig.Agent != nil && vmConfig.Agent.Enabled != nil && *vmConfig.Agent.Enabled {
resource := resourceVirtualEnvironmentVM()
- agentBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
-
+ agentBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
agentTimeout, err := time.ParseDuration(agentBlock[mkResourceVirtualEnvironmentVMAgentTimeout].(string))
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
- macAddresses := []interface{}{}
- networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(nodeName, vmID, int(agentTimeout.Seconds()), 5, true)
+ var macAddresses []interface{}
+ networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(ctx, nodeName, vmID, int(agentTimeout.Seconds()), 5, true)
if err == nil && networkInterfaces.Result != nil {
ipv4Addresses = make([]interface{}, len(*networkInterfaces.Result))
@@ -3072,8 +3059,8 @@ func resourceVirtualEnvironmentVMReadNetworkValues(d *schema.ResourceData, m int
networkInterfaceNames = make([]interface{}, len(*networkInterfaces.Result))
for ri, rv := range *networkInterfaces.Result {
- rvIPv4Addresses := []interface{}{}
- rvIPv6Addresses := []interface{}{}
+ var rvIPv4Addresses []interface{}
+ var rvIPv6Addresses []interface{}
if rv.IPAddresses != nil {
for _, ip := range *rv.IPAddresses {
@@ -3093,118 +3080,131 @@ func resourceVirtualEnvironmentVMReadNetworkValues(d *schema.ResourceData, m int
}
}
- d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses)
+ err = d.Set(mkResourceVirtualEnvironmentVMMACAddresses, macAddresses)
+ diags = append(diags, diag.FromErr(err)...)
}
}
- d.Set(mkResourceVirtualEnvironmentVMIPv4Addresses, ipv4Addresses)
- d.Set(mkResourceVirtualEnvironmentVMIPv6Addresses, ipv6Addresses)
- d.Set(mkResourceVirtualEnvironmentVMNetworkInterfaceNames, networkInterfaceNames)
+ err = d.Set(mkResourceVirtualEnvironmentVMIPv4Addresses, ipv4Addresses)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentVMIPv6Addresses, ipv6Addresses)
+ diags = append(diags, diag.FromErr(err)...)
+ err = d.Set(mkResourceVirtualEnvironmentVMNetworkInterfaceNames, networkInterfaceNames)
+ diags = append(diags, diag.FromErr(err)...)
- return nil
+ return diags
}
-func resourceVirtualEnvironmentVMReadPrimitiveValues(d *schema.ResourceData, m interface{}, vmID int, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData, vmStatus *proxmox.VirtualEnvironmentVMGetStatusResponseData) error {
+func resourceVirtualEnvironmentVMReadPrimitiveValues(d *schema.ResourceData, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData, vmStatus *proxmox.VirtualEnvironmentVMGetStatusResponseData) diag.Diagnostics {
+ var diags diag.Diagnostics
+ var err error
+
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
currentACPI := d.Get(mkResourceVirtualEnvironmentVMACPI).(bool)
if len(clone) == 0 || currentACPI != dvResourceVirtualEnvironmentVMACPI {
if vmConfig.ACPI != nil {
- d.Set(mkResourceVirtualEnvironmentVMACPI, bool(*vmConfig.ACPI))
+ err = d.Set(mkResourceVirtualEnvironmentVMACPI, bool(*vmConfig.ACPI))
} else {
// Default value of "acpi" is "1" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMACPI, true)
+ err = d.Set(mkResourceVirtualEnvironmentVMACPI, true)
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentBIOS := d.Get(mkResourceVirtualEnvironmentVMBIOS).(string)
if len(clone) == 0 || currentBIOS != dvResourceVirtualEnvironmentVMBIOS {
if vmConfig.BIOS != nil {
- d.Set(mkResourceVirtualEnvironmentVMBIOS, *vmConfig.BIOS)
+ err = d.Set(mkResourceVirtualEnvironmentVMBIOS, *vmConfig.BIOS)
} else {
// Default value of "bios" is "seabios" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMBIOS, "seabios")
+ err = d.Set(mkResourceVirtualEnvironmentVMBIOS, "seabios")
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentDescription := d.Get(mkResourceVirtualEnvironmentVMDescription).(string)
if len(clone) == 0 || currentDescription != dvResourceVirtualEnvironmentVMDescription {
if vmConfig.Description != nil {
- d.Set(mkResourceVirtualEnvironmentVMDescription, *vmConfig.Description)
+ err = d.Set(mkResourceVirtualEnvironmentVMDescription, *vmConfig.Description)
} else {
// Default value of "description" is "" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMDescription, "")
+ err = d.Set(mkResourceVirtualEnvironmentVMDescription, "")
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentKeyboardLayout := d.Get(mkResourceVirtualEnvironmentVMKeyboardLayout).(string)
if len(clone) == 0 || currentKeyboardLayout != dvResourceVirtualEnvironmentVMKeyboardLayout {
if vmConfig.KeyboardLayout != nil {
- d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, *vmConfig.KeyboardLayout)
+ err = d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, *vmConfig.KeyboardLayout)
} else {
// Default value of "keyboard" is "" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, "")
+ err = d.Set(mkResourceVirtualEnvironmentVMKeyboardLayout, "")
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentName := d.Get(mkResourceVirtualEnvironmentVMName).(string)
if len(clone) == 0 || currentName != dvResourceVirtualEnvironmentVMName {
if vmConfig.Name != nil {
- d.Set(mkResourceVirtualEnvironmentVMName, *vmConfig.Name)
+ err = d.Set(mkResourceVirtualEnvironmentVMName, *vmConfig.Name)
} else {
// Default value of "name" is "" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMName, "")
+ err = d.Set(mkResourceVirtualEnvironmentVMName, "")
}
+ diags = append(diags, diag.FromErr(err)...)
}
if d.Get(mkResourceVirtualEnvironmentVMTemplate).(bool) != true {
- d.Set(mkResourceVirtualEnvironmentVMStarted, vmStatus.Status == "running")
+ err = d.Set(mkResourceVirtualEnvironmentVMStarted, vmStatus.Status == "running")
+ diags = append(diags, diag.FromErr(err)...)
}
currentTabletDevice := d.Get(mkResourceVirtualEnvironmentVMTabletDevice).(bool)
if len(clone) == 0 || currentTabletDevice != dvResourceVirtualEnvironmentVMTabletDevice {
if vmConfig.TabletDeviceEnabled != nil {
- d.Set(mkResourceVirtualEnvironmentVMTabletDevice, bool(*vmConfig.TabletDeviceEnabled))
+ err = d.Set(mkResourceVirtualEnvironmentVMTabletDevice, bool(*vmConfig.TabletDeviceEnabled))
} else {
// Default value of "tablet" is "1" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMTabletDevice, true)
+ err = d.Set(mkResourceVirtualEnvironmentVMTabletDevice, true)
}
+ diags = append(diags, diag.FromErr(err)...)
}
currentTemplate := d.Get(mkResourceVirtualEnvironmentVMTemplate).(bool)
if len(clone) == 0 || currentTemplate != dvResourceVirtualEnvironmentVMTemplate {
if vmConfig.Template != nil {
- d.Set(mkResourceVirtualEnvironmentVMTemplate, bool(*vmConfig.Template))
+ err = d.Set(mkResourceVirtualEnvironmentVMTemplate, bool(*vmConfig.Template))
} else {
// Default value of "template" is "0" according to the API documentation.
- d.Set(mkResourceVirtualEnvironmentVMTemplate, false)
+ err = d.Set(mkResourceVirtualEnvironmentVMTemplate, false)
}
+ diags = append(diags, diag.FromErr(err)...)
}
- return nil
+ return diags
}
-func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
rebootRequired := false
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
updateBody := &proxmox.VirtualEnvironmentVMUpdateRequestBody{
@@ -3224,14 +3224,13 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
},
}
- delete := []string{}
+ var del []string
resource := resourceVirtualEnvironmentVM()
// Retrieve the entire configuration as we need to process certain values.
- vmConfig, err := veClient.GetVM(nodeName, vmID)
-
+ vmConfig, err := veClient.GetVM(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Prepare the new primitive configuration values.
@@ -3261,7 +3260,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
name := d.Get(mkResourceVirtualEnvironmentVMName).(string)
if name == "" {
- delete = append(delete, "name")
+ del = append(del, "name")
} else {
updateBody.Name = &name
}
@@ -3281,10 +3280,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new agent configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMAgent) {
- agentBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
-
+ agentBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
agentEnabled := proxmox.CustomBool(agentBlock[mkResourceVirtualEnvironmentVMAgentEnabled].(bool))
@@ -3302,20 +3300,19 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new audio devices.
if d.HasChange(mkResourceVirtualEnvironmentVMAudioDevice) {
- updateBody.AudioDevices, err = resourceVirtualEnvironmentVMGetAudioDeviceList(d, m)
-
+ updateBody.AudioDevices, err = resourceVirtualEnvironmentVMGetAudioDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := 0; i < len(updateBody.AudioDevices); i++ {
if !updateBody.AudioDevices[i].Enabled {
- delete = append(delete, fmt.Sprintf("audio%d", i))
+ del = append(del, fmt.Sprintf("audio%d", i))
}
}
for i := len(updateBody.AudioDevices); i < maxResourceVirtualEnvironmentVMAudioDevices; i++ {
- delete = append(delete, fmt.Sprintf("audio%d", i))
+ del = append(del, fmt.Sprintf("audio%d", i))
}
rebootRequired = true
@@ -3323,17 +3320,16 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new CDROM configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMCDROM) {
- cdromBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true)
-
+ cdromBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMCDROM}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cdromEnabled := cdromBlock[mkResourceVirtualEnvironmentVMCDROMEnabled].(bool)
cdromFileID := cdromBlock[mkResourceVirtualEnvironmentVMCDROMFileID].(string)
if cdromEnabled == false && cdromFileID == "" {
- delete = append(delete, "ide3")
+ del = append(del, "ide3")
}
if cdromFileID == "" {
@@ -3351,10 +3347,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new CPU configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMCPU) {
- cpuBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMCPU}, 0, true)
-
+ cpuBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMCPU}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
cpuArchitecture := cpuBlock[mkResourceVirtualEnvironmentVMCPUArchitecture].(string)
@@ -3377,7 +3372,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
if cpuHotplugged > 0 {
updateBody.VirtualCPUCount = &cpuHotplugged
} else {
- delete = append(delete, "vcpus")
+ del = append(del, "vcpus")
}
cpuFlagsConverted := make([]string, len(cpuFlags))
@@ -3396,10 +3391,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new disk device configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMDisk) {
- diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m, nil)
-
+ diskDeviceObjects, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, nil)
if err != nil {
- return err
+ return diag.FromErr(err)
}
diskDeviceInfo := getDiskInfo(vmConfig, d)
@@ -3411,7 +3405,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
for key, value := range diskMap {
if diskDeviceInfo[key] == nil {
- return fmt.Errorf("Missing %s device %s", prefix, key)
+ return diag.Errorf("missing %s device %s", prefix, key)
}
tmp := *diskDeviceInfo[key]
@@ -3450,7 +3444,7 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Investigate whether to support IDE mapping.
}
default:
- return fmt.Errorf("Device prefix %s not supported", prefix)
+ return diag.Errorf("device prefix %s not supported", prefix)
}
}
}
@@ -3460,10 +3454,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new cloud-init configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMInitialization) {
- initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d, m)
-
+ initializationConfig, err := resourceVirtualEnvironmentVMGetCloudInitConfig(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
updateBody.CloudInitConfig = initializationConfig
@@ -3495,10 +3488,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new memory configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMMemory) {
- memoryBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMMemory}, 0, true)
-
+ memoryBlock, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMMemory}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
memoryDedicated := memoryBlock[mkResourceVirtualEnvironmentVMMemoryDedicated].(int)
@@ -3522,20 +3514,19 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new network device configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMNetworkDevice) {
- updateBody.NetworkDevices, err = resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d, m)
-
+ updateBody.NetworkDevices, err = resourceVirtualEnvironmentVMGetNetworkDeviceObjects(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := 0; i < len(updateBody.NetworkDevices); i++ {
if !updateBody.NetworkDevices[i].Enabled {
- delete = append(delete, fmt.Sprintf("net%d", i))
+ del = append(del, fmt.Sprintf("net%d", i))
}
}
for i := len(updateBody.NetworkDevices); i < maxResourceVirtualEnvironmentVMNetworkDevices; i++ {
- delete = append(delete, fmt.Sprintf("net%d", i))
+ del = append(del, fmt.Sprintf("net%d", i))
}
rebootRequired = true
@@ -3543,10 +3534,9 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new operating system configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMOperatingSystem) {
- operatingSystem, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMOperatingSystem}, 0, true)
-
+ operatingSystem, err := getSchemaBlock(resource, d, []string{mkResourceVirtualEnvironmentVMOperatingSystem}, 0, true)
if err != nil {
- return err
+ return diag.FromErr(err)
}
operatingSystemType := operatingSystem[mkResourceVirtualEnvironmentVMOperatingSystemType].(string)
@@ -3558,14 +3548,13 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new serial devices.
if d.HasChange(mkResourceVirtualEnvironmentVMSerialDevice) {
- updateBody.SerialDevices, err = resourceVirtualEnvironmentVMGetSerialDeviceList(d, m)
-
+ updateBody.SerialDevices, err = resourceVirtualEnvironmentVMGetSerialDeviceList(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
for i := len(updateBody.SerialDevices); i < maxResourceVirtualEnvironmentVMSerialDevices; i++ {
- delete = append(delete, fmt.Sprintf("serial%d", i))
+ del = append(del, fmt.Sprintf("serial%d", i))
}
rebootRequired = true
@@ -3573,22 +3562,20 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
// Prepare the new VGA configuration.
if d.HasChange(mkResourceVirtualEnvironmentVMVGA) {
- updateBody.VGADevice, err = resourceVirtualEnvironmentVMGetVGADeviceObject(d, m)
-
+ updateBody.VGADevice, err = resourceVirtualEnvironmentVMGetVGADeviceObject(d)
if err != nil {
- return err
+ return diag.FromErr(err)
}
rebootRequired = true
}
// Update the configuration now that everything has been prepared.
- updateBody.Delete = delete
-
- err = veClient.UpdateVM(nodeName, vmID, updateBody)
+ updateBody.Delete = del
+ err = veClient.UpdateVM(ctx, nodeName, vmID, updateBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Determine if the state of the virtual machine state needs to be changed.
@@ -3597,22 +3584,20 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
if d.HasChange(mkResourceVirtualEnvironmentVMStarted) && !bool(template) {
if started {
startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int)
- err = veClient.StartVM(nodeName, vmID, startVMTimeout)
-
+ err = veClient.StartVM(ctx, nodeName, vmID, startVMTimeout)
if err != nil {
- return err
+ return diag.FromErr(err)
}
} else {
forceStop := proxmox.CustomBool(true)
shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int)
- err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
+ err = veClient.ShutdownVM(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
ForceStop: &forceStop,
Timeout: &shutdownTimeout,
- }, (shutdownTimeout + 30))
-
+ }, shutdownTimeout+30)
if err != nil {
- return err
+ return diag.FromErr(err)
}
rebootRequired = false
@@ -3620,49 +3605,45 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e
}
// Change the disk locations and/or sizes, if necessary.
- return resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d, m, vmConfig, !bool(template) && rebootRequired)
+ return resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(ctx, d, m, !bool(template) && rebootRequired)
}
-func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceData, m interface{}, vmConfig *proxmox.VirtualEnvironmentVMGetResponseData, reboot bool) error {
+func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(ctx context.Context, d *schema.ResourceData, m interface{}, reboot bool) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
started := d.Get(mkResourceVirtualEnvironmentVMStarted).(bool)
template := d.Get(mkResourceVirtualEnvironmentVMTemplate).(bool)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Determine if any of the disks are changing location and/or size, and initiate the necessary actions.
if d.HasChange(mkResourceVirtualEnvironmentVMDisk) {
diskOld, diskNew := d.GetChange(mkResourceVirtualEnvironmentVMDisk)
- diskOldEntries, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m, diskOld.([]interface{}))
-
+ diskOldEntries, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, diskOld.([]interface{}))
if err != nil {
- return err
+ return diag.FromErr(err)
}
- diskNewEntries, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, m, diskNew.([]interface{}))
-
+ diskNewEntries, err := resourceVirtualEnvironmentVMGetDiskDeviceObjects(d, diskNew.([]interface{}))
if err != nil {
- return err
+ return diag.FromErr(err)
}
- diskMoveBodies := []*proxmox.VirtualEnvironmentVMMoveDiskRequestBody{}
- diskResizeBodies := []*proxmox.VirtualEnvironmentVMResizeDiskRequestBody{}
+ var diskMoveBodies []*proxmox.VirtualEnvironmentVMMoveDiskRequestBody
+ var diskResizeBodies []*proxmox.VirtualEnvironmentVMResizeDiskRequestBody
for prefix, diskMap := range diskOldEntries {
for oldKey, oldDisk := range diskMap {
if _, present := diskNewEntries[prefix][oldKey]; !present {
- return fmt.Errorf("Deletion of disks not supported. Please delete disk by hand. Old Interface was %s", *oldDisk.Interface)
+ return diag.Errorf("deletion of disks not supported. Please delete disk by hand. Old Interface was %s", *oldDisk.Interface)
}
if *oldDisk.ID != *diskNewEntries[prefix][oldKey].ID {
@@ -3689,13 +3670,12 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat
forceStop := proxmox.CustomBool(true)
shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int)
- err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
+ err = veClient.ShutdownVM(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
ForceStop: &forceStop,
Timeout: &shutdownTimeout,
- }, (shutdownTimeout + 30))
-
+ }, shutdownTimeout+30)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
@@ -3704,27 +3684,24 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat
for _, reqBody := range diskMoveBodies {
moveDiskTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutMoveDisk).(int)
- err = veClient.MoveVMDisk(nodeName, vmID, reqBody, moveDiskTimeout)
-
+ err = veClient.MoveVMDisk(ctx, nodeName, vmID, reqBody, moveDiskTimeout)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
for _, reqBody := range diskResizeBodies {
- err = veClient.ResizeVMDisk(nodeName, vmID, reqBody)
-
+ err = veClient.ResizeVMDisk(ctx, nodeName, vmID, reqBody)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
if (len(diskMoveBodies) > 0 || len(diskResizeBodies) > 0) && started && !template {
startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int)
- err = veClient.StartVM(nodeName, vmID, startVMTimeout)
-
+ err = veClient.StartVM(ctx, nodeName, vmID, startVMTimeout)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
}
@@ -3733,55 +3710,50 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat
if reboot {
rebootTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutReboot).(int)
- err := veClient.RebootVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{
+ err := veClient.RebootVM(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{
Timeout: &rebootTimeout,
- }, (rebootTimeout + 30))
-
+ }, rebootTimeout+30)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- return resourceVirtualEnvironmentVMRead(d, m)
+ return resourceVirtualEnvironmentVMRead(ctx, d, m)
}
-func resourceVirtualEnvironmentVMDelete(d *schema.ResourceData, m interface{}) error {
+func resourceVirtualEnvironmentVMDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
config := m.(providerConfiguration)
veClient, err := config.GetVEClient()
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
-
if err != nil {
- return err
+ return diag.FromErr(err)
}
// Shut down the virtual machine before deleting it.
- status, err := veClient.GetVMStatus(nodeName, vmID)
-
+ status, err := veClient.GetVMStatus(ctx, nodeName, vmID)
if err != nil {
- return err
+ return diag.FromErr(err)
}
if status.Status != "stopped" {
forceStop := proxmox.CustomBool(true)
shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int)
- err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
+ err = veClient.ShutdownVM(ctx, nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{
ForceStop: &forceStop,
Timeout: &shutdownTimeout,
- }, (shutdownTimeout + 30))
-
+ }, shutdownTimeout+30)
if err != nil {
- return err
+ return diag.FromErr(err)
}
}
- err = veClient.DeleteVM(nodeName, vmID)
+ err = veClient.DeleteVM(ctx, nodeName, vmID)
if err != nil {
if strings.Contains(err.Error(), "HTTP 404") ||
@@ -3790,15 +3762,13 @@ func resourceVirtualEnvironmentVMDelete(d *schema.ResourceData, m interface{}) e
return nil
}
-
- return err
+ return diag.FromErr(err)
}
// Wait for the state to become unavailable as that clearly indicates the destruction of the VM.
- err = veClient.WaitForVMState(nodeName, vmID, "", 60, 2)
-
+ err = veClient.WaitForVMState(ctx, nodeName, vmID, "", 60, 2)
if err == nil {
- return fmt.Errorf("Failed to delete VM \"%d\"", vmID)
+ return diag.Errorf("failed to delete VM \"%d\"", vmID)
}
d.SetId("")
diff --git a/proxmoxtf/resource_virtual_environment_vm_test.go b/proxmoxtf/resource_virtual_environment_vm_test.go
index ddb5a5a5..a4e95818 100644
--- a/proxmoxtf/resource_virtual_environment_vm_test.go
+++ b/proxmoxtf/resource_virtual_environment_vm_test.go
@@ -7,7 +7,7 @@ package proxmoxtf
import (
"testing"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// TestResourceVirtualEnvironmentVMInstantiation tests whether the ResourceVirtualEnvironmentVM instance can be instantiated.
diff --git a/proxmoxtf/utils.go b/proxmoxtf/utils.go
index de5951bc..c9eecf6b 100644
--- a/proxmoxtf/utils.go
+++ b/proxmoxtf/utils.go
@@ -5,7 +5,10 @@
package proxmoxtf
import (
+ "errors"
"fmt"
+ "github.com/hashicorp/go-multierror"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"math"
"regexp"
"strconv"
@@ -15,28 +18,28 @@ import (
"unicode"
"github.com/bpg/terraform-provider-proxmox/proxmox"
- "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
- "github.com/hashicorp/terraform-plugin-sdk/helper/validation"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
-func getBIOSValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getBIOSValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"ovmf",
"seabios",
- }, false)
+ }, false))
}
-func getContentTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getContentTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"backup",
"iso",
"snippets",
"vztmpl",
- }, false)
+ }, false))
}
-func getCPUFlagsValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getCPUFlagsValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
list, ok := i.([]interface{})
if !ok {
@@ -90,11 +93,11 @@ func getCPUFlagsValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
-func getCPUTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getCPUTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"486",
"Broadwell",
"Broadwell-IBRS",
@@ -140,19 +143,19 @@ func getCPUTypeValidator() schema.SchemaValidateFunc {
"phenom",
"qemu32",
"qemu64",
- }, false)
+ }, false))
}
-func getFileFormatValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getFileFormatValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"qcow2",
"raw",
"vmdk",
- }, false)
+ }, false))
}
-func getFileIDValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getFileIDValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
v, ok := i.(string)
if !ok {
@@ -161,7 +164,7 @@ func getFileIDValidator() schema.SchemaValidateFunc {
}
if v != "" {
- r := regexp.MustCompile(`^(?i)[a-z0-9\-_]+:([a-z0-9\-_]+/)?.+$`)
+ r := regexp.MustCompile(`^(?i)[a-z\d\-_]+:([a-z\d\-_]+/)?.+$`)
ok := r.MatchString(v)
if !ok {
@@ -171,11 +174,11 @@ func getFileIDValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
-func getKeyboardLayoutValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getKeyboardLayoutValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"da",
"de",
"de-ch",
@@ -201,7 +204,7 @@ func getKeyboardLayoutValidator() schema.SchemaValidateFunc {
"sl",
"sv",
"tr",
- }, false)
+ }, false))
}
func diskDigitPrefix(s string) string {
@@ -213,8 +216,8 @@ func diskDigitPrefix(s string) string {
return s
}
-func getMACAddressValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getMACAddressValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
v, ok := i.(string)
if !ok {
@@ -223,7 +226,7 @@ func getMACAddressValidator() schema.SchemaValidateFunc {
}
if v != "" {
- r := regexp.MustCompile(`^[A-Z0-9]{2}(:[A-Z0-9]{2}){5}$`)
+ r := regexp.MustCompile(`^[A-Z\d]{2}(:[A-Z\d]{2}){5}$`)
ok := r.MatchString(v)
if !ok {
@@ -233,18 +236,18 @@ func getMACAddressValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
-func getNetworkDeviceModelValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{"e1000", "rtl8139", "virtio", "vmxnet3"}, false)
+func getNetworkDeviceModelValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{"e1000", "rtl8139", "virtio", "vmxnet3"}, false))
}
-func getQEMUAgentTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{"isa", "virtio"}, false)
+func getQEMUAgentTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{"isa", "virtio"}, false))
}
-func getSchemaBlock(r *schema.Resource, d *schema.ResourceData, m interface{}, k []string, i int, allowDefault bool) (map[string]interface{}, error) {
+func getSchemaBlock(r *schema.Resource, d *schema.ResourceData, k []string, i int, allowDefault bool) (map[string]interface{}, error) {
var resourceBlock map[string]interface{}
var resourceData interface{}
var resourceSchema *schema.Schema
@@ -257,7 +260,7 @@ func getSchemaBlock(r *schema.Resource, d *schema.ResourceData, m interface{}, k
mapValues := resourceData.([]interface{})
if len(mapValues) <= i {
- return resourceBlock, fmt.Errorf("Index out of bounds %d", i)
+ return resourceBlock, fmt.Errorf("index out of bounds %d", i)
}
mapValue := mapValues[i].(map[string]interface{})
@@ -288,8 +291,8 @@ func getSchemaBlock(r *schema.Resource, d *schema.ResourceData, m interface{}, k
return resourceBlock, nil
}
-func getTimeoutValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getTimeoutValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
v, ok := i.(string)
if !ok {
@@ -305,15 +308,15 @@ func getTimeoutValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
-func getVGAMemoryValidator() schema.SchemaValidateFunc {
- return validation.IntBetween(4, 512)
+func getVGAMemoryValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.IntBetween(4, 512))
}
-func getVGATypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getVGATypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"cirrus",
"qxl",
"qxl2",
@@ -326,11 +329,11 @@ func getVGATypeValidator() schema.SchemaValidateFunc {
"std",
"virtio",
"vmware",
- }, false)
+ }, false))
}
-func getVLANIDsValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getVLANIDsValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
min := 1
max := 4094
@@ -358,11 +361,11 @@ func getVLANIDsValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
-func getVMIDValidator() schema.SchemaValidateFunc {
- return func(i interface{}, k string) (ws []string, es []error) {
+func getVMIDValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(func(i interface{}, k string) (ws []string, es []error) {
min := 100
max := 2147483647
@@ -381,7 +384,7 @@ func getVMIDValidator() schema.SchemaValidateFunc {
}
return
- }
+ })
}
func getDiskInfo(vm *proxmox.VirtualEnvironmentVMGetResponseData, d *schema.ResourceData) map[string]*proxmox.CustomStorageDevice {
@@ -392,7 +395,7 @@ func getDiskInfo(vm *proxmox.VirtualEnvironmentVMGetResponseData, d *schema.Reso
for _, v := range currentDiskList {
diskMap := v.(map[string]interface{})
- diskInterface := diskMap[mkResourcevirtualEnvironmentVMDiskInterface].(string)
+ diskInterface := diskMap[mkResourceVirtualEnvironmentVMDiskInterface].(string)
currentDiskMap[diskInterface] = diskMap
}
@@ -485,17 +488,17 @@ func parseDiskSize(size *string) (int, error) {
diskSize = int(math.Ceil(float64(diskSize) / 1024))
} else {
- return -1, fmt.Errorf("Cannot parse storage size \"%s\"", *size)
+ return -1, fmt.Errorf("cannot parse storage size \"%s\"", *size)
}
}
return diskSize, err
}
-func getCloudInitTypeValidator() schema.SchemaValidateFunc {
- return validation.StringInSlice([]string{
+func getCloudInitTypeValidator() schema.SchemaValidateDiagFunc {
+ return validation.ToDiagFunc(validation.StringInSlice([]string{
"configdrive2",
"nocloud",
- }, false)
+ }, false))
}
func testComputedAttributes(t *testing.T, s *schema.Resource, keys []string) {
@@ -511,7 +514,7 @@ func testComputedAttributes(t *testing.T, s *schema.Resource, keys []string) {
}
func testNestedSchemaExistence(t *testing.T, s *schema.Resource, key string) *schema.Resource {
- schema, ok := s.Schema[key].Elem.(*schema.Resource)
+ sh, ok := s.Schema[key].Elem.(*schema.Resource)
if !ok {
t.Fatalf("Error in Schema: Missing nested schema for \"%s\"", key)
@@ -519,7 +522,7 @@ func testNestedSchemaExistence(t *testing.T, s *schema.Resource, key string) *sc
return nil
}
- return schema
+ return sh
}
func testOptionalArguments(t *testing.T, s *schema.Resource, keys []string) {
@@ -557,3 +560,23 @@ func testValueTypes(t *testing.T, s *schema.Resource, f map[string]schema.ValueT
}
}
}
+
+type ErrorDiags diag.Diagnostics
+
+func (diags ErrorDiags) Errors() []error {
+ var es []error
+ for i := range diags {
+ if diags[i].Severity == diag.Error {
+ s := fmt.Sprintf("Error: %s", diags[i].Summary)
+ if diags[i].Detail != "" {
+ s = fmt.Sprintf("%s: %s", s, diags[i].Detail)
+ }
+ es = append(es, errors.New(s))
+ }
+ }
+ return es
+}
+
+func (diags ErrorDiags) Error() string {
+ return multierror.ListFormatFunc(diags.Errors())
+}
diff --git a/proxmoxtf/version.go b/proxmoxtf/version.go
index 7ef9a0ee..115fd753 100644
--- a/proxmoxtf/version.go
+++ b/proxmoxtf/version.go
@@ -4,10 +4,11 @@
package proxmoxtf
+//goland:noinspection ALL
const (
// TerraformProviderName specifies the full name of this provider.
TerraformProviderName = "terraform-provider-proxmox"
// TerraformProviderVersion specifies the version number.
- TerraformProviderVersion = "0.5.1"
+ TerraformProviderVersion = "0.6.0"
)
diff --git a/tools/tools.go b/tools/tools.go
index 38d41bf4..1ccae15d 100644
--- a/tools/tools.go
+++ b/tools/tools.go
@@ -1,3 +1,4 @@
+//go:build tools
// +build tools
package tools