diff --git a/README.md b/README.md index ab029b391..64b93dd49 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Hardware customization: * `RAM` - Amount of RAM in megabytes. Inherited from source VM by default. * `RAM_reservation` - Amount of reserved RAM in MB. Inherited from source VM by default. * `RAM_reserve_all` - Reserve all available RAM (bool). `false` by default. Cannot be used together with `RAM_reservation`. +* `disk_size` - Change the disk size (in GB). VM should have a single disk. Cannot be used together with `linked_clone`. Provisioning: * `ssh_username` - [**mandatory**] username in guest OS. diff --git a/driver/vm.go b/driver/vm.go index 0457690df..01eab2cd0 100644 --- a/driver/vm.go +++ b/driver/vm.go @@ -30,6 +30,7 @@ type HardwareConfig struct { RAM int64 RAMReservation int64 RAMReserveAll bool + DiskSize int64 } func (d *Driver) NewVM(ref *types.ManagedObjectReference) *VirtualMachine { @@ -165,6 +166,27 @@ func (vm *VirtualMachine) Configure(config *HardwareConfig) error { confSpec.MemoryReservationLockedToMax = &config.RAMReserveAll + if config.DiskSize > 0 { + devices, err := vm.vm.Device(vm.driver.ctx) + if err != nil { + return err + } + + disk, err := findDisk(devices) + if err != nil { + return err + } + + disk.CapacityInKB = config.DiskSize * 1024 * 1024 // Gb + + confSpec.DeviceChange = []types.BaseVirtualDeviceConfigSpec{ + &types.VirtualDeviceConfigSpec{ + Device: disk, + Operation: types.VirtualDeviceConfigSpecOperationEdit, + }, + } + } + task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec) if err != nil { return err @@ -173,6 +195,24 @@ func (vm *VirtualMachine) Configure(config *HardwareConfig) error { return err } +func findDisk(devices object.VirtualDeviceList) (*types.VirtualDisk, error) { + var disks []*types.VirtualDisk + for _, device := range devices { + switch d := device.(type) { + case *types.VirtualDisk: + disks = append(disks, d) + } + } + + switch len(disks) { + case 0: + return nil, errors.New("VM has no disks") + case 1: + return disks[0], nil + } + return nil, errors.New("VM has multiple disks") +} + func (vm *VirtualMachine) PowerOn() error { task, err := vm.vm.PowerOn(vm.driver.ctx) if err != nil { diff --git a/step_hardware.go b/step_hardware.go index f62651045..aaf620b50 100644 --- a/step_hardware.go +++ b/step_hardware.go @@ -14,6 +14,7 @@ type HardwareConfig struct { RAM int64 `mapstructure:"RAM"` RAMReservation int64 `mapstructure:"RAM_reservation"` RAMReserveAll bool `mapstructure:"RAM_reserve_all"` + DiskSize int64 `mapstructure:"disk_size"` } func (c *HardwareConfig) Prepare() []error { @@ -44,6 +45,7 @@ func (s *StepConfigureHardware) Run(state multistep.StateBag) multistep.StepActi RAM: s.config.RAM, RAMReservation: s.config.RAMReservation, RAMReserveAll: s.config.RAMReserveAll, + DiskSize: s.config.DiskSize, }) if err != nil { state.Put("error", err)