mirror of
https://github.com/bpg/terraform-provider-proxmox.git
synced 2025-07-02 03:22:59 +00:00
feat(vm): Wait for the VM creation task to complete (#305)
feat(vm): Add sync wait in VM create operation
This commit is contained in:
parent
d24f60aaa2
commit
8addb1d1d5
@ -77,8 +77,45 @@ func (c *VirtualEnvironmentClient) CreateVM(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
nodeName string,
|
nodeName string,
|
||||||
d *VirtualEnvironmentVMCreateRequestBody,
|
d *VirtualEnvironmentVMCreateRequestBody,
|
||||||
|
timeout int,
|
||||||
) error {
|
) error {
|
||||||
return c.DoRequest(ctx, http.MethodPost, fmt.Sprintf("nodes/%s/qemu", url.PathEscape(nodeName)), d, nil)
|
taskID, err := c.CreateVMAsync(ctx, nodeName, d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = c.WaitForNodeTask(ctx, nodeName, *taskID, timeout, 1)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error waiting for VM creation: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateVMAsync creates a virtual machine asynchronously.
|
||||||
|
func (c *VirtualEnvironmentClient) CreateVMAsync(
|
||||||
|
ctx context.Context,
|
||||||
|
nodeName string,
|
||||||
|
d *VirtualEnvironmentVMCreateRequestBody,
|
||||||
|
) (*string, error) {
|
||||||
|
resBody := &VirtualEnvironmentVMCreateResponseBody{}
|
||||||
|
err := c.DoRequest(
|
||||||
|
ctx,
|
||||||
|
http.MethodPost,
|
||||||
|
fmt.Sprintf("nodes/%s/qemu", 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 resBody.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteVM deletes a virtual machine.
|
// DeleteVM deletes a virtual machine.
|
||||||
|
@ -303,6 +303,10 @@ type VirtualEnvironmentVMCreateRequestBody struct {
|
|||||||
WatchdogDevice *CustomWatchdogDevice `json:"watchdog,omitempty" url:"watchdog,omitempty"`
|
WatchdogDevice *CustomWatchdogDevice `json:"watchdog,omitempty" url:"watchdog,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type VirtualEnvironmentVMCreateResponseBody struct {
|
||||||
|
Data *string `json:"data,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
// VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseBody contains the body from a QEMU get network interfaces response.
|
// VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseBody contains the body from a QEMU get network interfaces response.
|
||||||
type VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseBody struct {
|
type VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseBody struct {
|
||||||
Data *VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData `json:"data,omitempty"`
|
Data *VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData `json:"data,omitempty"`
|
||||||
|
@ -228,6 +228,8 @@ const (
|
|||||||
mkResourceVirtualEnvironmentVMVGAType = "type"
|
mkResourceVirtualEnvironmentVMVGAType = "type"
|
||||||
mkResourceVirtualEnvironmentVMVMID = "vm_id"
|
mkResourceVirtualEnvironmentVMVMID = "vm_id"
|
||||||
mkResourceVirtualEnvironmentVMSCSIHardware = "scsi_hardware"
|
mkResourceVirtualEnvironmentVMSCSIHardware = "scsi_hardware"
|
||||||
|
|
||||||
|
vmCreateTimeoutSeconds = 10
|
||||||
)
|
)
|
||||||
|
|
||||||
func VM() *schema.Resource {
|
func VM() *schema.Resource {
|
||||||
@ -2072,21 +2074,13 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
|
|||||||
createBody.PoolID = &poolID
|
createBody.PoolID = &poolID
|
||||||
}
|
}
|
||||||
|
|
||||||
err = veClient.CreateVM(ctx, nodeName, createBody)
|
err = veClient.CreateVM(ctx, nodeName, createBody, vmCreateTimeoutSeconds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return diag.FromErr(err)
|
return diag.FromErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.SetId(strconv.Itoa(vmID))
|
d.SetId(strconv.Itoa(vmID))
|
||||||
|
|
||||||
// NOTE: The VM creation is not atomic, and not synchronous. This means that the VM might not be
|
|
||||||
// available immediately after the creation, or its state reported by the API might not be
|
|
||||||
// up to date. This is a problem for the following operations, which rely on the VM information
|
|
||||||
// returned by API calls, particularly read-back to populate the Terraform state.
|
|
||||||
// Would it be possible to wait for the VM to be fully available, or to wait for the API to report
|
|
||||||
// the correct state?
|
|
||||||
// time.Sleep(5 * time.Second)
|
|
||||||
|
|
||||||
return vmCreateCustomDisks(ctx, d, m)
|
return vmCreateCustomDisks(ctx, d, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user