Add additional disks support

This commit is contained in:
flx5 2021-09-27 12:03:55 +02:00
parent ccb8147f31
commit 0df631cda7
3 changed files with 49 additions and 35 deletions

View File

@ -14,12 +14,13 @@ type Config struct {
CommonConfig `mapstructure:",squash"`
Comm communicator.Config `mapstructure:",squash"`
VCPUsMax uint `mapstructure:"vcpus_max"`
VCPUsAtStartup uint `mapstructure:"vcpus_atstartup"`
VMMemory uint `mapstructure:"vm_memory"`
DiskSize uint `mapstructure:"disk_size"`
CloneTemplate string `mapstructure:"clone_template"`
VMOtherConfig map[string]string `mapstructure:"vm_other_config"`
VCPUsMax uint `mapstructure:"vcpus_max"`
VCPUsAtStartup uint `mapstructure:"vcpus_atstartup"`
VMMemory uint `mapstructure:"vm_memory"`
DiskSize uint `mapstructure:"disk_size"`
AdditionalDisks []uint `mapstructure:"additional_disks"`
CloneTemplate string `mapstructure:"clone_template"`
VMOtherConfig map[string]string `mapstructure:"vm_other_config"`
ISOChecksum string `mapstructure:"iso_checksum"`
ISOChecksumType string `mapstructure:"iso_checksum_type"`
@ -32,8 +33,8 @@ type Config struct {
RawInstallTimeout string `mapstructure:"install_timeout"`
InstallTimeout time.Duration ``
SourcePath string `mapstructure:"source_path"`
Firmware string `mapstructure:"firmware"`
Firmware string `mapstructure:"firmware"`
ctx interpolate.Context
}

View File

@ -98,6 +98,7 @@ type FlatConfig struct {
VCPUsAtStartup *uint `mapstructure:"vcpus_atstartup" cty:"vcpus_atstartup" hcl:"vcpus_atstartup"`
VMMemory *uint `mapstructure:"vm_memory" cty:"vm_memory" hcl:"vm_memory"`
DiskSize *uint `mapstructure:"disk_size" cty:"disk_size" hcl:"disk_size"`
AdditionalDisks []uint `mapstructure:"additional_disks" cty:"additional_disks" hcl:"additional_disks"`
CloneTemplate *string `mapstructure:"clone_template" cty:"clone_template" hcl:"clone_template"`
VMOtherConfig map[string]string `mapstructure:"vm_other_config" cty:"vm_other_config" hcl:"vm_other_config"`
ISOChecksum *string `mapstructure:"iso_checksum" cty:"iso_checksum" hcl:"iso_checksum"`
@ -211,6 +212,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec {
"vcpus_atstartup": &hcldec.AttrSpec{Name: "vcpus_atstartup", Type: cty.Number, Required: false},
"vm_memory": &hcldec.AttrSpec{Name: "vm_memory", Type: cty.Number, Required: false},
"disk_size": &hcldec.AttrSpec{Name: "disk_size", Type: cty.Number, Required: false},
"additional_disks": &hcldec.AttrSpec{Name: "additional_disks", Type: cty.List(cty.Number), Required: false},
"clone_template": &hcldec.AttrSpec{Name: "clone_template", Type: cty.String, Required: false},
"vm_other_config": &hcldec.AttrSpec{Name: "vm_other_config", Type: cty.Map(cty.String), Required: false},
"iso_checksum": &hcldec.AttrSpec{Name: "iso_checksum", Type: cty.String, Required: false},

View File

@ -14,7 +14,7 @@ import (
type stepCreateInstance struct {
instance *xsclient.VMRef
vdi *xsclient.VDIRef
vdis []*xsclient.VDIRef
}
func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
@ -101,7 +101,7 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
}
}
// Create VDI for the instance
// Create VDI for the instancearray append
sr, err := config.GetSR(c)
if err != nil {
@ -111,27 +111,36 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
ui.Say(fmt.Sprintf("Using the following SR for the VM: %s", sr))
vdi, err := c.GetClient().VDI.Create(c.GetSessionRef(), xenapi.VDIRecord{
NameLabel: "Packer-disk",
VirtualSize: int(config.DiskSize * 1024 * 1024),
Type: "user",
Sharable: false,
ReadOnly: false,
SR: sr,
OtherConfig: map[string]string{
"temp": "temp",
},
})
if err != nil {
ui.Error(fmt.Sprintf("Unable to create packer disk VDI: %s", err.Error()))
return multistep.ActionHalt
}
self.vdi = &vdi
disk_sizes := make([]uint, len(config.AdditionalDisks)+1)
copy(disk_sizes[1:], config.AdditionalDisks)
disk_sizes[0] = config.DiskSize
err = xscommon.ConnectVdi(c, instance, vdi, xsclient.VbdTypeDisk)
if err != nil {
ui.Error(fmt.Sprintf("Unable to connect packer disk VDI: %s", err.Error()))
return multistep.ActionHalt
self.vdis = make([]*xsclient.VDIRef, len(config.AdditionalDisks)+1)
for i, disk_size := range disk_sizes {
vdi, err := c.GetClient().VDI.Create(c.GetSessionRef(), xenapi.VDIRecord{
NameLabel: fmt.Sprintf("Packer-disk-%d", i),
VirtualSize: int(disk_size * 1024 * 1024),
Type: "user",
Sharable: false,
ReadOnly: false,
SR: sr,
OtherConfig: map[string]string{
"temp": "temp",
},
})
if err != nil {
ui.Error(fmt.Sprintf("Unable to create packer disk VDI: %s", err.Error()))
return multistep.ActionHalt
}
self.vdis[i] = &vdi
err = xscommon.ConnectVdi(c, instance, vdi, xsclient.VbdTypeDisk)
if err != nil {
ui.Error(fmt.Sprintf("Unable to connect packer disk VDI: %s", err.Error()))
return multistep.ActionHalt
}
}
// Connect Network
@ -235,11 +244,13 @@ func (self *stepCreateInstance) Cleanup(state multistep.StateBag) {
}
}
if self.vdi != nil {
ui.Say("Destroying VDI")
err := c.GetClient().VDI.Destroy(c.GetSessionRef(), *self.vdi)
if err != nil {
ui.Error(err.Error())
for i, vdi := range self.vdis {
if vdi != nil {
ui.Say(fmt.Sprintf("Destroying VDI %d", i))
err := c.GetClient().VDI.Destroy(c.GetSessionRef(), *vdi)
if err != nil {
ui.Error(err.Error())
}
}
}
}