mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-07-05 05:24:01 +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:
parent
43a9438971
commit
23859750b1
@ -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) {
|
||||||
|
@ -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(),
|
||||||
|
Loading…
Reference in New Issue
Block a user