mirror of
https://github.com/letic/terraform-provider-proxmox.git
synced 2024-10-05 02:01:04 +00:00
support recovering partially created VM nodes
This commit is contained in:
parent
39a47f793f
commit
e8b2551eb9
@ -5,6 +5,7 @@ import (
|
|||||||
pxapi "github.com/Telmate/proxmox-api-go/proxmox"
|
pxapi "github.com/Telmate/proxmox-api-go/proxmox"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
"log"
|
"log"
|
||||||
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -100,6 +101,11 @@ func resourceVmQemu() *schema.Resource {
|
|||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Sensitive: true,
|
Sensitive: true,
|
||||||
},
|
},
|
||||||
|
"force_create": {
|
||||||
|
Type: schema.TypeBool,
|
||||||
|
Optional: true,
|
||||||
|
Default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -123,18 +129,27 @@ func resourceVmQemuCreate(d *schema.ResourceData, meta interface{}) error {
|
|||||||
}
|
}
|
||||||
log.Print("[DEBUG] checking for duplicate name")
|
log.Print("[DEBUG] checking for duplicate name")
|
||||||
dupVmr, _ := client.GetVmRefByName(vmName)
|
dupVmr, _ := client.GetVmRefByName(vmName)
|
||||||
if dupVmr != nil {
|
|
||||||
return fmt.Errorf("Duplicate VM name (%s) with vmId: %d", vmName, dupVmr.VmId())
|
forceCreate := d.Get("force_create").(bool)
|
||||||
|
targetNode := d.Get("target_node").(string)
|
||||||
|
|
||||||
|
if dupVmr != nil && forceCreate {
|
||||||
|
return fmt.Errorf("Duplicate VM name (%s) with vmId: %d. Set force_create=false to recycle", vmName, dupVmr.VmId())
|
||||||
|
} else if dupVmr != nil && dupVmr.Node() != targetNode {
|
||||||
|
return fmt.Errorf("Duplicate VM name (%s) with vmId: %d on different target_node=%s", vmName, dupVmr.VmId(), dupVmr.Node())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vmr := dupVmr
|
||||||
|
|
||||||
|
if vmr == nil {
|
||||||
// get unique id
|
// get unique id
|
||||||
nextid, err := nextVmId(client)
|
nextid, err := nextVmId(client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
vmr := pxapi.NewVmRef(nextid)
|
vmr = pxapi.NewVmRef(nextid)
|
||||||
vmr.SetNode(d.Get("target_node").(string))
|
|
||||||
|
|
||||||
|
vmr.SetNode(targetNode)
|
||||||
// check if ISO or clone
|
// check if ISO or clone
|
||||||
if d.Get("clone").(string) != "" {
|
if d.Get("clone").(string) != "" {
|
||||||
sourceVmr, err := client.GetVmRefByName(d.Get("clone").(string))
|
sourceVmr, err := client.GetVmRefByName(d.Get("clone").(string))
|
||||||
@ -147,15 +162,11 @@ func resourceVmQemuCreate(d *schema.ResourceData, meta interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
clonedConfig, err := pxapi.NewConfigQemuFromApi(vmr, client)
|
err = prepareDiskSize(client, vmr, disk_gb)
|
||||||
|
|
||||||
if disk_gb > clonedConfig.DiskSize {
|
|
||||||
log.Print("[DEBUG] resizing disk")
|
|
||||||
_, err = client.ResizeQemuDisk(vmr, "virtio0", int(disk_gb-clonedConfig.DiskSize))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if d.Get("iso").(string) != "" {
|
} else if d.Get("iso").(string) != "" {
|
||||||
config.QemuIso = d.Get("iso").(string)
|
config.QemuIso = d.Get("iso").(string)
|
||||||
err := config.CreateVm(vmr, client)
|
err := config.CreateVm(vmr, client)
|
||||||
@ -163,11 +174,17 @@ func resourceVmQemuCreate(d *schema.ResourceData, meta interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
d.SetId(strconv.Itoa(vmr.VmId()))
|
log.Printf("[DEBUG] recycling VM vmId: %d", vmr.VmId())
|
||||||
|
err := prepareDiskSize(client, vmr, disk_gb)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d.SetId(resourceId(targetNode, vmr.VmId()))
|
||||||
|
|
||||||
log.Print("[DEBUG] starting VM")
|
log.Print("[DEBUG] starting VM")
|
||||||
_, err = client.StartVm(vmr)
|
_, err := client.StartVm(vmr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -225,7 +242,7 @@ func resourceVmQemuUpdate(d *schema.ResourceData, meta interface{}) error {
|
|||||||
|
|
||||||
config.UpdateConfig(vmr, client)
|
config.UpdateConfig(vmr, client)
|
||||||
|
|
||||||
// TODO - resize disk
|
prepareDiskSize(client, vmr, disk_gb)
|
||||||
|
|
||||||
sshPort, err := pxapi.SshForwardUsernet(vmr, client)
|
sshPort, err := pxapi.SshForwardUsernet(vmr, client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -251,7 +268,7 @@ func resourceVmQemuRead(d *schema.ResourceData, meta interface{}) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
d.SetId(strconv.Itoa(vmr.VmId()))
|
d.SetId(resourceId(vmr.Node(), vmr.VmId()))
|
||||||
d.Set("target_node", vmr.Node())
|
d.Set("target_node", vmr.Node())
|
||||||
d.Set("name", config.Name)
|
d.Set("name", config.Name)
|
||||||
d.Set("desc", config.Description)
|
d.Set("desc", config.Description)
|
||||||
@ -269,7 +286,7 @@ func resourceVmQemuRead(d *schema.ResourceData, meta interface{}) error {
|
|||||||
|
|
||||||
func resourceVmQemuDelete(d *schema.ResourceData, meta interface{}) error {
|
func resourceVmQemuDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
client := meta.(*providerConfiguration).Client
|
client := meta.(*providerConfiguration).Client
|
||||||
vmId, _ := strconv.Atoi(d.Id())
|
vmId, _ := strconv.Atoi(path.Base(d.Id()))
|
||||||
vmr := pxapi.NewVmRef(vmId)
|
vmr := pxapi.NewVmRef(vmId)
|
||||||
_, err := client.StopVm(vmr)
|
_, err := client.StopVm(vmr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -278,3 +295,20 @@ func resourceVmQemuDelete(d *schema.ResourceData, meta interface{}) error {
|
|||||||
_, err = client.DeleteVm(vmr)
|
_, err = client.DeleteVm(vmr)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resourceId(targetNode string, vmId int) string {
|
||||||
|
return fmt.Sprintf("%s/qemu/%d", targetNode, vmId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func prepareDiskSize(client *pxapi.Client, vmr *pxapi.VmRef, disk_gb float64) error {
|
||||||
|
clonedConfig, err := pxapi.NewConfigQemuFromApi(vmr, client)
|
||||||
|
|
||||||
|
if disk_gb > clonedConfig.DiskSize {
|
||||||
|
log.Print("[DEBUG] resizing disk")
|
||||||
|
_, err = client.ResizeQemuDisk(vmr, "virtio0", int(disk_gb-clonedConfig.DiskSize))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user