Completed
Pull Request — master (#460)
by Manas
02:10
created

VMDiskAdd   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 36
Duplicated Lines 0 %
Metric Value
dl 0
loc 36
rs 10
wmc 6

2 Methods

Rating   Name   Duplication   Size   Complexity  
A run() 0 23 2
A get_next_unit_number() 0 10 4
1
from pyVmomi import vim
2
3
from vmwarelib import inventory
4
from vmwarelib.actions import BaseAction
5
6
7
class VMDiskAdd(BaseAction):
8
9
    def run(self, vm_id, disk_size, disk_type):
10
        vm = inventory.get_virtualmachine(self.si_content, vm_id)
11
        spec = vim.vm.ConfigSpec()
12
13
        # disk spec
14
        disk_spec = vim.vm.device.VirtualDeviceSpec()
15
        disk_spec.fileOperation = "create"
16
        disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add
17
        disk_spec.device = vim.vm.device.VirtualDisk()
18
        disk_spec.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo()
19
        if disk_type == 'thin':
20
            disk_spec.device.backing.thinProvisioned = True
21
        disk_spec.device.backing.diskMode = 'persistent'
22
        disk_spec.device.unitNumber = self.get_next_unit_number(vm)
23
        disk_spec.device.capacityInKB = disk_size * 1024 * 1024
24
        disk_spec.device.controllerKey = 1000
25
26
        spec.deviceChange = [disk_spec]
27
28
        # add disk and wait for task to complete
29
        add_disk_task = vm.ReconfigVM_Task(spec)
30
        successfully_added_disk = self._wait_for_task(add_disk_task)
31
        return {'state': successfully_added_disk}
32
33
    def get_next_unit_number(self, vm):
34
        # See https://github.com/whereismyjetpack/pyvmomi-community-samples/blob/add-disk/samples/add_disk_to_vm.py
35
        unit_number = 0
36
        for dev in vm.config.hardware.device:
37
            if hasattr(dev.backing, 'fileName'):
38
                unit_number = int(dev.unitNumber) + 1
39
                # unit_number 7 reserved for scsi controller
40
                if unit_number == 7:
41
                    unit_number += 1
42
        return unit_number
43