0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-04 21:14:05 +00:00

fix(provider): "context deadline exceeded" error when retrieving the next available VM identifier (#1647)

* fix(provider): "context deadline exceeded" error when retrieving the next available VM identifier

---------

Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com>
This commit is contained in:
Pavel Boldyrev 2024-11-20 23:02:03 -05:00 committed by GitHub
parent 43a9438971
commit 23859750b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 58 additions and 22 deletions

View File

@ -8,8 +8,10 @@ package fwprovider_test
import ( import (
"context" "context"
"sync"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/bpg/terraform-provider-proxmox/fwprovider/test" "github.com/bpg/terraform-provider-proxmox/fwprovider/test"
@ -22,7 +24,10 @@ import (
func TestIDGenerator_Sequence(t *testing.T) { func TestIDGenerator_Sequence(t *testing.T) {
t.Parallel() t.Parallel()
const numIDs = 10 const (
numIDs = 10
numBusyIDs = 30
)
if utils.GetAnyStringEnv("TF_ACC") == "" { if utils.GetAnyStringEnv("TF_ACC") == "" {
t.Skip("Acceptance tests are disabled") t.Skip("Acceptance tests are disabled")
@ -36,42 +41,73 @@ func TestIDGenerator_Sequence(t *testing.T) {
firstID, err := gen.NextID(ctx) firstID, err := gen.NextID(ctx)
require.NoError(t, err) require.NoError(t, err)
busyID := firstID + 5 firstBusyID := firstID + 5
_, err = te.ClusterClient().GetNextID(ctx, ptr.Ptr(busyID)) _, err = te.ClusterClient().GetNextID(ctx, ptr.Ptr(firstBusyID))
require.NoError(t, err, "the VM ID %d should be available", busyID) require.NoError(t, err, "the VM ID %d should be available", firstBusyID)
err = te.NodeClient().VM(0).CreateVM(ctx, &vms.CreateRequestBody{VMID: busyID}) for i := range numBusyIDs {
require.NoError(t, err, "failed to create VM %d", busyID) busyID := firstBusyID + i
err = te.NodeClient().VM(0).CreateVM(ctx, &vms.CreateRequestBody{VMID: busyID})
require.NoError(t, err, "failed to create VM %d", busyID)
}
t.Cleanup(func() { t.Cleanup(func() {
err = te.NodeClient().VM(busyID).DeleteVM(ctx) var wg sync.WaitGroup
require.NoError(t, err, "failed to delete VM %d", busyID)
for i := range numBusyIDs {
wg.Add(1)
go func() {
defer wg.Done()
busyID := firstBusyID + i
err = te.NodeClient().VM(busyID).DeleteVM(ctx)
assert.NoError(t, err, "failed to delete VM %d", busyID)
}()
}
wg.Wait()
}) })
ids := make([]int, numIDs) ids := make([]int, numIDs)
t.Cleanup(func() { t.Cleanup(func() {
var wg sync.WaitGroup
for _, id := range ids { for _, id := range ids {
if id > 100 { wg.Add(1)
_ = te.NodeClient().VM(id).DeleteVM(ctx) //nolint:errcheck
} go func() {
defer wg.Done()
if id > 100 {
_ = te.NodeClient().VM(id).DeleteVM(ctx) //nolint:errcheck
}
}()
} }
wg.Wait()
}) })
prevID := firstID var wg sync.WaitGroup
for i := range numIDs { for i := range numIDs {
id, err := gen.NextID(ctx) wg.Add(1)
require.NoError(t, err)
err = te.NodeClient().VM(0).CreateVM(ctx, &vms.CreateRequestBody{VMID: id})
ids[i] = id
require.NoError(t, err) go func() {
require.Greater(t, id, prevID, "the generated ID should be greater than the previous one") defer wg.Done()
prevID = id id, err := gen.NextID(ctx)
if err == nil {
err = te.NodeClient().VM(0).CreateVM(ctx, &vms.CreateRequestBody{VMID: id})
ids[i] = id
}
assert.NoError(t, err)
}()
} }
wg.Wait()
} }
func TestIDGenerator_Random(t *testing.T) { func TestIDGenerator_Random(t *testing.T) {

View File

@ -110,10 +110,10 @@ func (g IDGenerator) NextID(ctx context.Context) (int, error) {
}, },
retry.OnRetry(func(_ uint, err error) { retry.OnRetry(func(_ uint, err error) {
if strings.Contains(err.Error(), "already exists") && newID != nil { if strings.Contains(err.Error(), "already exists") && newID != nil {
newID = ptr.Ptr(*newID + 1) newID, err = g.client.GetNextID(ctx, nil)
} else {
errs = append(errs, err)
} }
errs = append(errs, err)
}), }),
retry.Context(ctx), retry.Context(ctx),
retry.UntilSucceeded(), retry.UntilSucceeded(),