From 6a8f367c46937873da638da6bc3a9c1261b7dd46 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 17:56:38 -0400 Subject: [PATCH] =?UTF-8?q?chore(deps):=20update=20golangci/golangci-lint?= =?UTF-8?q?=20(v2.1.6=20=E2=86=92=20v2.2.1)=20(#2013)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): update golangci/golangci-lint (v2.1.6 → v2.2.1) | datasource | package | from | to | | --------------- | ---------------------- | ------ | ------ | | github-releases | golangci/golangci-lint | v2.1.6 | v2.2.1 | * chore: update rules & run linter Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --------- Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- .github/workflows/golangci-lint.yml | 2 +- .golangci.yml | 6 ++++++ Makefile | 2 +- fwprovider/access/resource_user_token.go | 1 + fwprovider/cluster/acme/plugin_model.go | 2 ++ fwprovider/cluster/options/resource_options.go | 3 +++ fwprovider/nodes/network/resource_linux_bridge.go | 3 +++ fwprovider/nodes/network/resource_linux_vlan.go | 3 +++ fwprovider/nodes/resource_download_file.go | 3 ++- fwprovider/nodes/vm/cdrom/resource.go | 2 ++ fwprovider/provider.go | 1 + fwprovider/test/test_environment.go | 1 + fwprovider/types/hardwaremapping/path.go | 1 + fwprovider/types/hardwaremapping/path_test.go | 2 +- fwprovider/types/ip_addr_test.go | 2 +- fwprovider/types/ip_cidr_test.go | 2 +- fwprovider/types/nodes/apt/standard_repo_handle.go | 1 + fwprovider/types/nodes/apt/standard_repo_handle_test.go | 2 +- proxmox/api/client.go | 2 +- proxmox/cluster/acme/plugins/acme_plugins_types.go | 4 ++++ proxmox/cluster/firewall/client.go | 1 + proxmox/cluster/ha/groups/hagroups_types.go | 3 +++ proxmox/cluster/ha/resources/resources_types.go | 3 +++ proxmox/cluster/id_generator.go | 1 + proxmox/cluster/metrics/server_types.go | 1 + proxmox/cluster/options_types.go | 2 ++ proxmox/nodes/client.go | 1 + proxmox/nodes/containers/client.go | 1 + proxmox/nodes/containers/containers.go | 2 -- proxmox/nodes/containers/containers_types.go | 4 ++++ proxmox/nodes/storage/client.go | 1 + proxmox/nodes/tasks/tasks.go | 1 - proxmox/nodes/vms/client.go | 1 + proxmox/nodes/vms/custom_cpu_emulation.go | 1 + proxmox/nodes/vms/custom_virtiofs_share.go | 1 + proxmox/nodes/vms/vms.go | 2 -- proxmox/nodes/vms/vms_types_test.go | 1 + proxmox/ssh/client.go | 1 + proxmox/types/disk_size_test.go | 1 - proxmoxtf/datasource/dns.go | 1 + proxmoxtf/datasource/group.go | 2 ++ proxmoxtf/datasource/groups.go | 1 + proxmoxtf/datasource/hosts.go | 1 + proxmoxtf/datasource/nodes.go | 1 + proxmoxtf/datasource/pool.go | 2 ++ proxmoxtf/datasource/pools.go | 1 + proxmoxtf/datasource/role.go | 2 ++ proxmoxtf/datasource/roles.go | 1 + proxmoxtf/datasource/time.go | 2 ++ proxmoxtf/datasource/user.go | 2 ++ proxmoxtf/datasource/users.go | 1 + proxmoxtf/resource/certificate.go | 3 +++ proxmoxtf/resource/dns.go | 2 ++ proxmoxtf/resource/file.go | 4 ++++ proxmoxtf/resource/firewall/rules.go | 1 + proxmoxtf/resource/group.go | 5 +++++ proxmoxtf/resource/hosts.go | 2 ++ proxmoxtf/resource/pool.go | 5 +++++ proxmoxtf/resource/time.go | 3 +++ proxmoxtf/resource/user.go | 9 +++++++++ proxmoxtf/resource/validators/file.go | 1 + proxmoxtf/resource/vm/vm.go | 2 +- utils/io_test.go | 1 + utils/maps.go | 2 +- 65 files changed, 116 insertions(+), 17 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 84a70419..3ca9b512 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,6 +1,6 @@ FROM golang:1.24.4@sha256:20a022e5112a144aa7b7aeb3f22ebf2cdaefcc4aac0d64e8deeee8cdc18b9c0f -ARG GOLANGCI_LINT_VERSION=2.1.6 # renovate: depName=golangci/golangci-lint datasource=github-releases +ARG GOLANGCI_LINT_VERSION=2.2.1 # renovate: depName=golangci/golangci-lint datasource=github-releases RUN apt update && apt upgrade -y && \ apt-get install --no-install-recommends -y ca-certificates curl gnupg lsb-release jq zsh neovim gh && \ diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 05ec5e1d..e21e6224 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -42,6 +42,6 @@ jobs: if: ${{ steps.filter.outputs.go == 'true' || steps.filter.outputs.linter == 'true'}} uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8 with: - version: v2.1.6 # renovate: depName=golangci/golangci-lint datasource=github-releases + version: v2.2.1 # renovate: depName=golangci/golangci-lint datasource=github-releases skip-cache: true args: -v --timeout=10m diff --git a/.golangci.yml b/.golangci.yml index 6c21625d..3c6d3ae1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -17,6 +17,7 @@ linters: - mnd - nestif - nlreturn + - noinlineerr - perfsprint - rowserrcheck - tagliatelle @@ -24,6 +25,7 @@ linters: - tparallel - varnamelen - wastedassign + - wsl settings: cyclop: max-complexity: 25 @@ -49,6 +51,10 @@ linters: wrapcheck: ignore-package-globs: - github.com/bpg/terraform-provider-proxmox/* + wsl_v5: + allow-first-in-block: true + allow-whole-block: false + branch-max-lines: 2 exclusions: generated: lax presets: diff --git a/Makefile b/Makefile index 3342605d..27ca4009 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TARGETS=darwin linux windows TERRAFORM_PLUGIN_EXTENSION= VERSION=0.78.2# x-release-please-version -GOLANGCI_LINT_VERSION=2.1.6# renovate: depName=golangci/golangci-lint datasource=github-releases +GOLANGCI_LINT_VERSION=2.2.1# renovate: depName=golangci/golangci-lint datasource=github-releases # check if opentofu is installed and use it if it is, # otherwise use terraform diff --git a/fwprovider/access/resource_user_token.go b/fwprovider/access/resource_user_token.go index 2d97b4e2..0e4ba93c 100644 --- a/fwprovider/access/resource_user_token.go +++ b/fwprovider/access/resource_user_token.go @@ -190,6 +190,7 @@ func (r *userTokenResource) Create(ctx context.Context, req resource.CreateReque func (r *userTokenResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { var state userTokenModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/cluster/acme/plugin_model.go b/fwprovider/cluster/acme/plugin_model.go index 2f2a39f4..586b27bc 100644 --- a/fwprovider/cluster/acme/plugin_model.go +++ b/fwprovider/cluster/acme/plugin_model.go @@ -32,12 +32,14 @@ type baseACMEPluginModel struct { // acmePluginModel maps the schema data for an ACME plugin. type acmePluginModel struct { baseACMEPluginModel + Type types.String `tfsdk:"type"` } // acmePluginCreateModel maps the schema data for an ACME plugin. type acmePluginCreateModel struct { baseACMEPluginModel + // Flag to disable the config Disable types.Bool `tfsdk:"disable"` } diff --git a/fwprovider/cluster/options/resource_options.go b/fwprovider/cluster/options/resource_options.go index b703de41..db96a75d 100644 --- a/fwprovider/cluster/options/resource_options.go +++ b/fwprovider/cluster/options/resource_options.go @@ -719,6 +719,7 @@ func (r *clusterOptionsResource) Create( resp *resource.CreateResponse, ) { var plan clusterOptionsModel + diags := req.Plan.Get(ctx, &plan) resp.Diagnostics.Append(diags...) @@ -776,6 +777,7 @@ func (r *clusterOptionsResource) read(ctx context.Context, model *clusterOptions func (r *clusterOptionsResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // Get current state var state clusterOptionsModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) @@ -899,6 +901,7 @@ func (r *clusterOptionsResource) Delete( resp *resource.DeleteResponse, ) { var state clusterOptionsModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/nodes/network/resource_linux_bridge.go b/fwprovider/nodes/network/resource_linux_bridge.go index 0bec8954..b6334e67 100644 --- a/fwprovider/nodes/network/resource_linux_bridge.go +++ b/fwprovider/nodes/network/resource_linux_bridge.go @@ -268,6 +268,7 @@ func (r *linuxBridgeResource) Configure( //nolint:dupl func (r *linuxBridgeResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { var plan linuxBridgeResourceModel + diags := req.Plan.Get(ctx, &plan) resp.Diagnostics.Append(diags...) @@ -355,6 +356,7 @@ func (r *linuxBridgeResource) read(ctx context.Context, model *linuxBridgeResour func (r *linuxBridgeResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // Get current state var state linuxBridgeResourceModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) @@ -461,6 +463,7 @@ func (r *linuxBridgeResource) Update(ctx context.Context, req resource.UpdateReq //nolint:dupl func (r *linuxBridgeResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { var state linuxBridgeResourceModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/nodes/network/resource_linux_vlan.go b/fwprovider/nodes/network/resource_linux_vlan.go index bf9c6f98..f39426bc 100644 --- a/fwprovider/nodes/network/resource_linux_vlan.go +++ b/fwprovider/nodes/network/resource_linux_vlan.go @@ -240,6 +240,7 @@ func (r *linuxVLANResource) Configure( //nolint:dupl func (r *linuxVLANResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { var plan linuxVLANResourceModel + diags := req.Plan.Get(ctx, &plan) resp.Diagnostics.Append(diags...) @@ -319,6 +320,7 @@ func (r *linuxVLANResource) read(ctx context.Context, model *linuxVLANResourceMo func (r *linuxVLANResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { // Get current state var state linuxVLANResourceModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) @@ -409,6 +411,7 @@ func (r *linuxVLANResource) Update(ctx context.Context, req resource.UpdateReque //nolint:dupl func (r *linuxVLANResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { var state linuxVLANResourceModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/nodes/resource_download_file.go b/fwprovider/nodes/resource_download_file.go index c121d1dc..9d78a660 100644 --- a/fwprovider/nodes/resource_download_file.go +++ b/fwprovider/nodes/resource_download_file.go @@ -323,6 +323,7 @@ func (r *downloadFileResource) Create( resp *resource.CreateResponse, ) { var plan downloadFileModel + diags := req.Plan.Get(ctx, &plan) resp.Diagnostics.Append(diags...) @@ -370,7 +371,6 @@ func (r *downloadFileResource) Create( storageClient := nodesClient.Storage(plan.Storage.ValueString()) err = storageClient.DownloadFileByURL(ctx, &downloadFileReq) - if isErrFileAlreadyExists(err) && plan.OverwriteUnmanaged.ValueBool() { fileID := plan.Content.ValueString() + "/" + plan.FileName.ValueString() @@ -481,6 +481,7 @@ func (r *downloadFileResource) Read( resp *resource.ReadResponse, ) { var state downloadFileModel + diags := req.State.Get(ctx, &state) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/nodes/vm/cdrom/resource.go b/fwprovider/nodes/vm/cdrom/resource.go index 2198e650..e9a6ac41 100644 --- a/fwprovider/nodes/vm/cdrom/resource.go +++ b/fwprovider/nodes/vm/cdrom/resource.go @@ -49,6 +49,7 @@ func FillCreateBody(ctx context.Context, planValue Value, body *vms.CreateReques } var plan map[string]Model + d := planValue.ElementsAs(ctx, &plan, false) diags.Append(d...) @@ -76,6 +77,7 @@ func FillUpdateBody( } var plan, state map[string]Model + d := planValue.ElementsAs(ctx, &plan, false) diags.Append(d...) d = stateValue.ElementsAs(ctx, &state, false) diff --git a/fwprovider/provider.go b/fwprovider/provider.go index 4304e53e..fd5ee21c 100644 --- a/fwprovider/provider.go +++ b/fwprovider/provider.go @@ -265,6 +265,7 @@ func (p *proxmoxProvider) Configure( // Retrieve provider data from configuration var cfg proxmoxProviderModel + diags := req.Config.Get(ctx, &cfg) resp.Diagnostics.Append(diags...) diff --git a/fwprovider/test/test_environment.go b/fwprovider/test/test_environment.go index 6e0b7d8e..f1e5a8c1 100644 --- a/fwprovider/test/test_environment.go +++ b/fwprovider/test/test_environment.go @@ -195,6 +195,7 @@ func (e *Environment) RenderConfig(cfg string, opt ...RenderConfigOption) string require.NoError(e.t, err) var buf bytes.Buffer + err = tmpl.Execute(&buf, e.templateVars) require.NoError(e.t, err) diff --git a/fwprovider/types/hardwaremapping/path.go b/fwprovider/types/hardwaremapping/path.go index b7bbadd5..d4eac351 100644 --- a/fwprovider/types/hardwaremapping/path.go +++ b/fwprovider/types/hardwaremapping/path.go @@ -50,6 +50,7 @@ var ( // PathType is a type that represents a path of a hardware mapping. type PathType struct { basetypes.StringType + Type proxmoxtypes.Type } diff --git a/fwprovider/types/hardwaremapping/path_test.go b/fwprovider/types/hardwaremapping/path_test.go index db646452..f32b8fbb 100644 --- a/fwprovider/types/hardwaremapping/path_test.go +++ b/fwprovider/types/hardwaremapping/path_test.go @@ -52,8 +52,8 @@ func TestPathValueFromTerraform(t *testing.T) { t.Parallel() ctx := t.Context() - val, err := PathType{}.ValueFromTerraform(ctx, test.val) + val, err := PathType{}.ValueFromTerraform(ctx, test.val) if err == nil && test.expectError { t.Fatal("expected error, got no error") } diff --git a/fwprovider/types/ip_addr_test.go b/fwprovider/types/ip_addr_test.go index a81546e4..1b4893ab 100644 --- a/fwprovider/types/ip_addr_test.go +++ b/fwprovider/types/ip_addr_test.go @@ -52,8 +52,8 @@ func Test_IPAddrTypeValueFromTerraform(t *testing.T) { t.Parallel() ctx := t.Context() - val, err := IPAddrType{}.ValueFromTerraform(ctx, test.val) + val, err := IPAddrType{}.ValueFromTerraform(ctx, test.val) if err == nil && test.expectError { t.Fatal("expected error, got no error") } diff --git a/fwprovider/types/ip_cidr_test.go b/fwprovider/types/ip_cidr_test.go index 4d037473..3137cea3 100644 --- a/fwprovider/types/ip_cidr_test.go +++ b/fwprovider/types/ip_cidr_test.go @@ -52,8 +52,8 @@ func Test_IPCIDRTypeValueFromTerraform(t *testing.T) { t.Parallel() ctx := t.Context() - val, err := IPCIDRType{}.ValueFromTerraform(ctx, test.val) + val, err := IPCIDRType{}.ValueFromTerraform(ctx, test.val) if err == nil && test.expectError { t.Fatal("expected error, got no error") } diff --git a/fwprovider/types/nodes/apt/standard_repo_handle.go b/fwprovider/types/nodes/apt/standard_repo_handle.go index de5ea433..e260face 100644 --- a/fwprovider/types/nodes/apt/standard_repo_handle.go +++ b/fwprovider/types/nodes/apt/standard_repo_handle.go @@ -34,6 +34,7 @@ type StandardRepoHandleType struct { // StandardRepoHandleValue is a type that represents the value of an APT standard repository handle. type StandardRepoHandleValue struct { basetypes.StringValue + cvn apitypes.CephVersionName kind apitypes.StandardRepoHandleKind } diff --git a/fwprovider/types/nodes/apt/standard_repo_handle_test.go b/fwprovider/types/nodes/apt/standard_repo_handle_test.go index ec4f89e9..d99ac347 100644 --- a/fwprovider/types/nodes/apt/standard_repo_handle_test.go +++ b/fwprovider/types/nodes/apt/standard_repo_handle_test.go @@ -103,8 +103,8 @@ func TestStandardRepoHandleValueFromTerraform(t *testing.T) { t.Parallel() ctx := t.Context() - val, err := StandardRepoHandleType{}.ValueFromTerraform(ctx, test.val) + val, err := StandardRepoHandleType{}.ValueFromTerraform(ctx, test.val) if err == nil && test.expectError { t.Fatal("expected error, got no error") } diff --git a/proxmox/api/client.go b/proxmox/api/client.go index ee763d18..18bd0261 100644 --- a/proxmox/api/client.go +++ b/proxmox/api/client.go @@ -332,8 +332,8 @@ func validateResponseCode(res *http.Response) error { msg := strings.TrimPrefix(res.Status, fmt.Sprintf("%d ", res.StatusCode)) errRes := &ErrorResponseBody{} - err := json.NewDecoder(res.Body).Decode(errRes) + err := json.NewDecoder(res.Body).Decode(errRes) if err == nil && errRes.Errors != nil { var errList []string diff --git a/proxmox/cluster/acme/plugins/acme_plugins_types.go b/proxmox/cluster/acme/plugins/acme_plugins_types.go index d3660b9d..058a7b61 100644 --- a/proxmox/cluster/acme/plugins/acme_plugins_types.go +++ b/proxmox/cluster/acme/plugins/acme_plugins_types.go @@ -35,6 +35,7 @@ type ACMEPluginsListResponseBody struct { // ACMEPluginsListResponseData contains the data from an ACME plugins list response. type ACMEPluginsListResponseData struct { BaseACMEPluginData + // ACME Plugin ID name Plugin string `json:"plugin" url:"plugin"` // DNS plugin data. @@ -49,6 +50,7 @@ type ACMEPluginsGetResponseBody struct { // ACMEPluginsGetResponseData contains the data from an ACME plugins get response. type ACMEPluginsGetResponseData struct { BaseACMEPluginData + // ACME Plugin ID name Plugin string `json:"plugin" url:"plugin"` // DNS plugin data. @@ -58,6 +60,7 @@ type ACMEPluginsGetResponseData struct { // ACMEPluginsCreateRequestBody contains the body for creating a new ACME plugin. type ACMEPluginsCreateRequestBody struct { BaseACMEPluginData + // ACME Plugin ID name Plugin string `json:"id" url:"id"` // DNS plugin data. (base64 encoded) @@ -69,6 +72,7 @@ type ACMEPluginsCreateRequestBody struct { // ACMEPluginsUpdateRequestBody contains the body for updating an existing ACME plugin. type ACMEPluginsUpdateRequestBody struct { BaseACMEPluginData + // DNS plugin data. (base64 encoded) Data *DNSPluginData `url:"data,omitempty"` // A list of settings you want to delete. diff --git a/proxmox/cluster/firewall/client.go b/proxmox/cluster/firewall/client.go index a5b67f2b..6a1d9543 100644 --- a/proxmox/cluster/firewall/client.go +++ b/proxmox/cluster/firewall/client.go @@ -27,6 +27,7 @@ type Client struct { type groupClient struct { firewall.Client + Group string } diff --git a/proxmox/cluster/ha/groups/hagroups_types.go b/proxmox/cluster/ha/groups/hagroups_types.go index e1aba65a..f358dc6e 100644 --- a/proxmox/cluster/ha/groups/hagroups_types.go +++ b/proxmox/cluster/ha/groups/hagroups_types.go @@ -44,6 +44,7 @@ type HAGroupDataBase struct { type HAGroupGetResponseData struct { // The group's data HAGroupDataBase + // The group's identifier ID string `json:"group"` // The type. Always set to `group`. @@ -54,6 +55,7 @@ type HAGroupGetResponseData struct { type HAGroupCreateRequestBody struct { // The group's data HAGroupDataBase + // The group's identifier ID string `url:"group"` // The type. Always set to `group`. @@ -64,6 +66,7 @@ type HAGroupCreateRequestBody struct { type HAGroupUpdateRequestBody struct { // The group's data HAGroupDataBase + // A list of settings to delete Delete string `url:"delete"` } diff --git a/proxmox/cluster/ha/resources/resources_types.go b/proxmox/cluster/ha/resources/resources_types.go index 3baef672..cc567513 100644 --- a/proxmox/cluster/ha/resources/resources_types.go +++ b/proxmox/cluster/ha/resources/resources_types.go @@ -43,6 +43,7 @@ type HAResourceDataBase struct { // HA resource. type HAResourceGetResponseData struct { HAResourceDataBase + // Identifier of this resource ID types.HAResourceID `json:"sid"` // Type of this resource @@ -54,6 +55,7 @@ type HAResourceGetResponseData struct { // HAResourceCreateRequestBody contains data received from the HA resource API when creating a new HA resource. type HAResourceCreateRequestBody struct { HAResourceDataBase + // Identifier of this resource ID types.HAResourceID `url:"sid"` // Type of this resource @@ -65,6 +67,7 @@ type HAResourceCreateRequestBody struct { // HAResourceUpdateRequestBody contains data received from the HA resource API when updating an existing HA resource. type HAResourceUpdateRequestBody struct { HAResourceDataBase + // Settings that must be deleted from the resource's configuration Delete []string `url:"delete,omitempty,comma"` } diff --git a/proxmox/cluster/id_generator.go b/proxmox/cluster/id_generator.go index 7fbe9001..f137f639 100644 --- a/proxmox/cluster/id_generator.go +++ b/proxmox/cluster/id_generator.go @@ -127,6 +127,7 @@ func (g IDGenerator) NextID(ctx context.Context) (int, error) { if !g.config.RandomIDs { var b bytes.Buffer + _, _ = fmt.Fprintf(&b, "%d", *id) if err := lockedfile.Write(g.config.seqFName, &b, 0o666); err != nil { diff --git a/proxmox/cluster/metrics/server_types.go b/proxmox/cluster/metrics/server_types.go index 9f295b3f..b825588b 100644 --- a/proxmox/cluster/metrics/server_types.go +++ b/proxmox/cluster/metrics/server_types.go @@ -43,5 +43,6 @@ type ServersResponseBody struct { // ServerRequestData contains the data for a metric server post/put request. type ServerRequestData struct { ServerData + Delete *[]string `url:"delete,omitempty"` } diff --git a/proxmox/cluster/options_types.go b/proxmox/cluster/options_types.go index 2dcb428f..0921e53b 100644 --- a/proxmox/cluster/options_types.go +++ b/proxmox/cluster/options_types.go @@ -68,6 +68,7 @@ type OptionsResponseBody struct { // OptionsResponseData contains the data from a cluster options response. type OptionsResponseData struct { optionsBaseData + MaxWorkers *types.CustomInt64 `json:"max_workers,omitempty"` ClusterResourceScheduling *crs `json:"crs,omitempty"` HASettings *haSettings `json:"ha,omitempty"` @@ -83,6 +84,7 @@ type OptionsResponseData struct { // OptionsRequestData contains the body for cluster options request. type OptionsRequestData struct { optionsBaseData + MaxWorkers *int64 `json:"max_workers,omitempty" url:"max_workers,omitempty"` Delete *string `json:"delete,omitempty" url:"delete,omitempty"` ClusterResourceScheduling *string `json:"crs,omitempty" url:"crs,omitempty"` diff --git a/proxmox/nodes/client.go b/proxmox/nodes/client.go index 24be4769..e8b91c7a 100644 --- a/proxmox/nodes/client.go +++ b/proxmox/nodes/client.go @@ -21,6 +21,7 @@ import ( // Client is an interface for accessing the Proxmox node API. type Client struct { api.Client + NodeName string } diff --git a/proxmox/nodes/containers/client.go b/proxmox/nodes/containers/client.go index 67c11646..42d69cba 100644 --- a/proxmox/nodes/containers/client.go +++ b/proxmox/nodes/containers/client.go @@ -18,6 +18,7 @@ import ( // Client is an interface for accessing the Proxmox container API. type Client struct { api.Client + VMID int } diff --git a/proxmox/nodes/containers/containers.go b/proxmox/nodes/containers/containers.go index c80375ef..06e57b0e 100644 --- a/proxmox/nodes/containers/containers.go +++ b/proxmox/nodes/containers/containers.go @@ -236,7 +236,6 @@ func (c *Client) WaitForContainerStatus(ctx context.Context, status string) erro retry.Delay(1*time.Second), retry.LastErrorOnly(true), ) - if errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("timeout while waiting for container %d to enter the status %q", c.VMID, status) } @@ -273,7 +272,6 @@ func (c *Client) WaitForContainerConfigUnlock(ctx context.Context, ignoreErrorRe retry.Delay(1*time.Second), retry.LastErrorOnly(true), ) - if errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("timeout while waiting for container %d configuration to become unlocked", c.VMID) } diff --git a/proxmox/nodes/containers/containers_types.go b/proxmox/nodes/containers/containers_types.go index da13cd53..e4b37710 100644 --- a/proxmox/nodes/containers/containers_types.go +++ b/proxmox/nodes/containers/containers_types.go @@ -636,6 +636,7 @@ func (r *CustomFeatures) UnmarshalJSON(b []byte) error { r.MountTypes = &a } else { var a []string + r.MountTypes = &a } case "nesting": @@ -728,6 +729,7 @@ func (r *CustomMountPoint) UnmarshalJSON(b []byte) error { r.MountOptions = &a } else { var a []string + r.MountOptions = &a } case "mp": @@ -827,6 +829,7 @@ func (r *CustomNetworkInterface) UnmarshalJSON(b []byte) error { r.Trunks = &a } else { var a []int + r.Trunks = &a } case "type": @@ -865,6 +868,7 @@ func (r *CustomRootFS) UnmarshalJSON(b []byte) error { r.MountOptions = &a } else { var a []string + r.MountOptions = &a } case "quota": diff --git a/proxmox/nodes/storage/client.go b/proxmox/nodes/storage/client.go index deba9dc2..f87968a7 100644 --- a/proxmox/nodes/storage/client.go +++ b/proxmox/nodes/storage/client.go @@ -16,6 +16,7 @@ import ( // Client is an interface for accessing the Proxmox node storage API. type Client struct { api.Client + StorageName string } diff --git a/proxmox/nodes/tasks/tasks.go b/proxmox/nodes/tasks/tasks.go index eeba2270..b71a5525 100644 --- a/proxmox/nodes/tasks/tasks.go +++ b/proxmox/nodes/tasks/tasks.go @@ -168,7 +168,6 @@ func (c *Client) WaitForTask(ctx context.Context, upid string, opts ...TaskWaitO retry.DelayType(retry.FixedDelay), retry.Delay(time.Second), ) - if errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("timeout while waiting for task %q to complete", upid) } diff --git a/proxmox/nodes/vms/client.go b/proxmox/nodes/vms/client.go index ff45ce23..f68aec1c 100644 --- a/proxmox/nodes/vms/client.go +++ b/proxmox/nodes/vms/client.go @@ -18,6 +18,7 @@ import ( // Client is an interface for accessing the Proxmox VM API. type Client struct { api.Client + VMID int } diff --git a/proxmox/nodes/vms/custom_cpu_emulation.go b/proxmox/nodes/vms/custom_cpu_emulation.go index 9222a3c9..283e813b 100644 --- a/proxmox/nodes/vms/custom_cpu_emulation.go +++ b/proxmox/nodes/vms/custom_cpu_emulation.go @@ -80,6 +80,7 @@ func (r *CustomCPUEmulation) UnmarshalJSON(b []byte) error { r.Flags = &f } else { var f []string + r.Flags = &f } case "hidden": diff --git a/proxmox/nodes/vms/custom_virtiofs_share.go b/proxmox/nodes/vms/custom_virtiofs_share.go index c22ff3e1..13a984b9 100644 --- a/proxmox/nodes/vms/custom_virtiofs_share.go +++ b/proxmox/nodes/vms/custom_virtiofs_share.go @@ -36,6 +36,7 @@ func (r *CustomVirtiofsShare) EncodeValues(key string, v *url.Values) error { } var values []string + values = append(values, fmt.Sprintf("dirid=%s", r.DirId)) if r.Cache != nil { diff --git a/proxmox/nodes/vms/vms.go b/proxmox/nodes/vms/vms.go index 41f2d9e1..8303e41e 100644 --- a/proxmox/nodes/vms/vms.go +++ b/proxmox/nodes/vms/vms.go @@ -675,7 +675,6 @@ func (c *Client) WaitForVMConfigUnlock(ctx context.Context, ignoreErrorResponse return errors.Is(err, stillLocked) || ignoreErrorResponse }), ) - if errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("timeout while waiting for VM %d configuration to become unlocked", c.VMID) } @@ -714,7 +713,6 @@ func (c *Client) WaitForVMStatus(ctx context.Context, status string) error { return errors.Is(err, unexpectedStatus) }), ) - if errors.Is(err, context.DeadlineExceeded) { return fmt.Errorf("timeout while waiting for VM %d to enter the status %q", c.VMID, status) } diff --git a/proxmox/nodes/vms/vms_types_test.go b/proxmox/nodes/vms/vms_types_test.go index 7343bc10..8f356caf 100644 --- a/proxmox/nodes/vms/vms_types_test.go +++ b/proxmox/nodes/vms/vms_types_test.go @@ -33,6 +33,7 @@ func TestUnmarshalGetResponseData(t *testing.T) { }`, "local-lvm:vm-100-disk-0,aio=io_uring,backup=1,cache=none,discard=ignore,replicate=1,size=8G,ssd=1") var data GetResponseData + err := json.Unmarshal([]byte(jsonData), &data) require.NoError(t, err) diff --git a/proxmox/ssh/client.go b/proxmox/ssh/client.go index 6e99a342..70dc4140 100644 --- a/proxmox/ssh/client.go +++ b/proxmox/ssh/client.go @@ -515,6 +515,7 @@ func (c *client) openNodeShell(ctx context.Context, node ProxmoxNode) (*ssh.Clie f, fErr := os.OpenFile(khPath, os.O_APPEND|os.O_WRONLY, 0o600) if fErr == nil { defer utils.CloseOrLogError(ctx)(f) + fErr = knownhosts.WriteKnownHost(f, hostname, remote, key) } diff --git a/proxmox/types/disk_size_test.go b/proxmox/types/disk_size_test.go index db04c017..091c83c5 100644 --- a/proxmox/types/disk_size_test.go +++ b/proxmox/types/disk_size_test.go @@ -42,7 +42,6 @@ func TestParseDiskSize(t *testing.T) { t.Parallel() got, err := ParseDiskSize(tt.size) - if (err != nil) != tt.wantErr { t.Errorf("parseDiskSize() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/proxmoxtf/datasource/dns.go b/proxmoxtf/datasource/dns.go index ec9c4e3c..be2b24e7 100644 --- a/proxmoxtf/datasource/dns.go +++ b/proxmoxtf/datasource/dns.go @@ -51,6 +51,7 @@ func dnsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Di var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/group.go b/proxmoxtf/datasource/group.go index 9ebd637e..52c298a3 100644 --- a/proxmoxtf/datasource/group.go +++ b/proxmoxtf/datasource/group.go @@ -78,12 +78,14 @@ func groupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } groupID := d.Get(mkDataSourceVirtualEnvironmentGroupID).(string) + group, err := api.Access().GetGroup(ctx, groupID) if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/groups.go b/proxmoxtf/datasource/groups.go index 1b5418d4..d9b00015 100644 --- a/proxmoxtf/datasource/groups.go +++ b/proxmoxtf/datasource/groups.go @@ -45,6 +45,7 @@ func groupsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/hosts.go b/proxmoxtf/datasource/hosts.go index 16088e80..2604732a 100644 --- a/proxmoxtf/datasource/hosts.go +++ b/proxmoxtf/datasource/hosts.go @@ -85,6 +85,7 @@ func hostsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/nodes.go b/proxmoxtf/datasource/nodes.go index 3337f5dc..14ffa494 100644 --- a/proxmoxtf/datasource/nodes.go +++ b/proxmoxtf/datasource/nodes.go @@ -95,6 +95,7 @@ func nodesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/pool.go b/proxmoxtf/datasource/pool.go index b9697a74..1ac6193d 100644 --- a/proxmoxtf/datasource/pool.go +++ b/proxmoxtf/datasource/pool.go @@ -83,12 +83,14 @@ func poolRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } poolID := d.Get(mkDataSourceVirtualEnvironmentPoolPoolID).(string) + pool, err := api.Pool().GetPool(ctx, poolID) if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/pools.go b/proxmoxtf/datasource/pools.go index 834675d0..7501f37d 100644 --- a/proxmoxtf/datasource/pools.go +++ b/proxmoxtf/datasource/pools.go @@ -36,6 +36,7 @@ func Pools() *schema.Resource { func poolsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/role.go b/proxmoxtf/datasource/role.go index b84a2592..a6e293cf 100644 --- a/proxmoxtf/datasource/role.go +++ b/proxmoxtf/datasource/role.go @@ -42,12 +42,14 @@ func Role() *schema.Resource { func roleRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } roleID := d.Get(mkDataSourceVirtualEnvironmentRoleID).(string) + accessRole, err := api.Access().GetRole(ctx, roleID) if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/roles.go b/proxmoxtf/datasource/roles.go index 78b1f0e2..6e959135 100644 --- a/proxmoxtf/datasource/roles.go +++ b/proxmoxtf/datasource/roles.go @@ -55,6 +55,7 @@ func rolesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/time.go b/proxmoxtf/datasource/time.go index 3a6918dd..be411c03 100644 --- a/proxmoxtf/datasource/time.go +++ b/proxmoxtf/datasource/time.go @@ -57,12 +57,14 @@ func timeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } nodeName := d.Get(mkDataSourceVirtualEnvironmentTimeNodeName).(string) + nodeTime, err := api.Node(nodeName).GetTime(ctx) if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/user.go b/proxmoxtf/datasource/user.go index f3be9028..2176396b 100644 --- a/proxmoxtf/datasource/user.go +++ b/proxmoxtf/datasource/user.go @@ -115,12 +115,14 @@ func userRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } userID := d.Get(mkDataSourceVirtualEnvironmentUserUserID).(string) + v, err := api.Access().GetUser(ctx, userID) if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/datasource/users.go b/proxmoxtf/datasource/users.go index 3e901191..cfcf0a72 100644 --- a/proxmoxtf/datasource/users.go +++ b/proxmoxtf/datasource/users.go @@ -98,6 +98,7 @@ func usersRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/certificate.go b/proxmoxtf/resource/certificate.go index 927d45d0..08d4a8ce 100644 --- a/proxmoxtf/resource/certificate.go +++ b/proxmoxtf/resource/certificate.go @@ -174,6 +174,7 @@ func certificateRead(ctx context.Context, d *schema.ResourceData, m interface{}) var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -303,6 +304,7 @@ func certificateRead(ctx context.Context, d *schema.ResourceData, m interface{}) func certificateUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -322,6 +324,7 @@ func certificateUpdate(ctx context.Context, d *schema.ResourceData, m interface{ func certificateDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/dns.go b/proxmoxtf/resource/dns.go index c17bbd0d..c7577c06 100644 --- a/proxmoxtf/resource/dns.go +++ b/proxmoxtf/resource/dns.go @@ -112,6 +112,7 @@ func dnsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Di var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -153,6 +154,7 @@ func dnsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Di func dnsUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/file.go b/proxmoxtf/resource/file.go index 617482b8..4b5649e0 100644 --- a/proxmoxtf/resource/file.go +++ b/proxmoxtf/resource/file.go @@ -603,6 +603,7 @@ func fileCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag } volID, di := fileGetVolumeID(ctx, d, capi) + diags = append(diags, di...) if diags.HasError() { return diags @@ -763,6 +764,7 @@ func fileIsURL(d *schema.ResourceData) bool { func fileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + capi, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -912,6 +914,7 @@ func readURL( if httpLastModified != "" { var timeParsed time.Time + timeParsed, err = time.Parse(time.RFC1123, httpLastModified) if err != nil { timeParsed, err = time.Parse(time.RFC1123Z, httpLastModified) @@ -939,6 +942,7 @@ func readURL( func fileDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + capi, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/firewall/rules.go b/proxmoxtf/resource/firewall/rules.go index 98707c43..894f5c64 100644 --- a/proxmoxtf/resource/firewall/rules.go +++ b/proxmoxtf/resource/firewall/rules.go @@ -204,6 +204,7 @@ func RulesCreate(ctx context.Context, api firewall.Rule, d *schema.ResourceData) if a == "" || t == "" { diags = append(diags, diag.Errorf("Either '%s' OR both '%s' and '%s' must be defined for the rule #%d", mkSecurityGroup, mkRuleAction, mkRuleType, i)...) + continue } diff --git a/proxmoxtf/resource/group.go b/proxmoxtf/resource/group.go index dc44f767..a67c2c11 100644 --- a/proxmoxtf/resource/group.go +++ b/proxmoxtf/resource/group.go @@ -94,6 +94,7 @@ func Group() *schema.Resource { func groupCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -144,12 +145,14 @@ func groupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) } groupID := d.Id() + group, err := client.Access().GetGroup(ctx, groupID) if err != nil { if errors.Is(err, api.ErrResourceDoesNotExist) { @@ -203,6 +206,7 @@ func groupRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. func groupUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -272,6 +276,7 @@ func groupUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) dia func groupDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/hosts.go b/proxmoxtf/resource/hosts.go index c86f4e95..d49269a3 100644 --- a/proxmoxtf/resource/hosts.go +++ b/proxmoxtf/resource/hosts.go @@ -141,6 +141,7 @@ func hostsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -210,6 +211,7 @@ func hostsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag. func hostsUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/pool.go b/proxmoxtf/resource/pool.go index fad6afe7..a2d1f8db 100644 --- a/proxmoxtf/resource/pool.go +++ b/proxmoxtf/resource/pool.go @@ -103,6 +103,7 @@ func Pool() *schema.Resource { func poolCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -130,12 +131,14 @@ func poolRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) } poolID := d.Id() + pool, err := client.Pool().GetPool(ctx, poolID) if err != nil { if errors.Is(err, api.ErrResourceDoesNotExist) { @@ -185,6 +188,7 @@ func poolRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D func poolUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -207,6 +211,7 @@ func poolUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag func poolDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/time.go b/proxmoxtf/resource/time.go index 5865064d..940d8e30 100644 --- a/proxmoxtf/resource/time.go +++ b/proxmoxtf/resource/time.go @@ -89,12 +89,14 @@ func timeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D var diags diag.Diagnostics config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) } nodeName := d.Get(mkResourceVirtualEnvironmentTimeNodeName).(string) + nodeTime, err := api.Node(nodeName).GetTime(ctx) if err != nil { return diag.FromErr(err) @@ -125,6 +127,7 @@ func timeRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D func timeUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + api, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/user.go b/proxmoxtf/resource/user.go index 4315d7c9..d8a5e5d2 100644 --- a/proxmoxtf/resource/user.go +++ b/proxmoxtf/resource/user.go @@ -164,6 +164,7 @@ func User() *schema.Resource { func userCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -172,6 +173,7 @@ func userCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag comment := d.Get(mkResourceVirtualEnvironmentUserComment).(string) email := d.Get(mkResourceVirtualEnvironmentUserEmail).(string) enabled := types.CustomBool(d.Get(mkResourceVirtualEnvironmentUserEnabled).(bool)) + expirationDate, err := time.Parse( time.RFC3339, d.Get(mkResourceVirtualEnvironmentUserExpirationDate).(string), @@ -242,12 +244,14 @@ func userCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag func userRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) } userID := d.Id() + user, err := client.Access().GetUser(ctx, userID) if err != nil { if errors.Is(err, api.ErrResourceDoesNotExist) { @@ -359,6 +363,7 @@ func userRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D func userUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) @@ -367,6 +372,7 @@ func userUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag comment := d.Get(mkResourceVirtualEnvironmentUserComment).(string) email := d.Get(mkResourceVirtualEnvironmentUserEmail).(string) enabled := types.CustomBool(d.Get(mkResourceVirtualEnvironmentUserEnabled).(bool)) + expirationDate, err := time.Parse( time.RFC3339, d.Get(mkResourceVirtualEnvironmentUserExpirationDate).(string), @@ -399,6 +405,7 @@ func userUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag } userID := d.Id() + err = client.Access().UpdateUser(ctx, userID, body) if err != nil { return diag.FromErr(err) @@ -406,6 +413,7 @@ func userUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag if d.HasChange(mkResourceVirtualEnvironmentUserPassword) { password := d.Get(mkResourceVirtualEnvironmentUserPassword).(string) + err = client.Access().ChangeUserPassword(ctx, userID, password) if err != nil { return diag.FromErr(err) @@ -464,6 +472,7 @@ func userUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag func userDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { config := m.(proxmoxtf.ProviderConfiguration) + client, err := config.GetClient() if err != nil { return diag.FromErr(err) diff --git a/proxmoxtf/resource/validators/file.go b/proxmoxtf/resource/validators/file.go index 0c8e5908..606c6f7a 100644 --- a/proxmoxtf/resource/validators/file.go +++ b/proxmoxtf/resource/validators/file.go @@ -78,6 +78,7 @@ func FileMode() schema.SchemaValidateDiagFunc { if !ok { errs = append(errs, fmt.Errorf( `expected string in octal format (e.g. "0o700" or "0700"") for %q, but got %v of type %T`, k, v, i)) + return nil, errs } diff --git a/proxmoxtf/resource/vm/vm.go b/proxmoxtf/resource/vm/vm.go index 93257ebd..66daa563 100644 --- a/proxmoxtf/resource/vm/vm.go +++ b/proxmoxtf/resource/vm/vm.go @@ -2693,8 +2693,8 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{}) } vmID = vmIDNew - e = d.Set(mkVMID, vmID) + e = d.Set(mkVMID, vmID) if e != nil { return diag.FromErr(e) } diff --git a/utils/io_test.go b/utils/io_test.go index 57f9ec67..83f73c3a 100644 --- a/utils/io_test.go +++ b/utils/io_test.go @@ -24,6 +24,7 @@ func TestCloseOrLogError(t *testing.T) { func() { defer f(c) defer f(b) + assert.False(t, c.isClosed) }() diff --git a/utils/maps.go b/utils/maps.go index f94dcf5f..0ddccd90 100644 --- a/utils/maps.go +++ b/utils/maps.go @@ -44,8 +44,8 @@ func compareWithPrefix(a, b string) int { bRest := strings.TrimPrefix(b, prefix) aNum, aErr := strconv.Atoi(aRest) - bNum, bErr := strconv.Atoi(bRest) + bNum, bErr := strconv.Atoi(bRest) if aErr == nil && bErr == nil { if aNum != bNum { if aNum < bNum {