Returns a list of disk specs representing the disks to be created for a
    virtual machine

    service_instance
        Service instance (vim.ServiceInstance) of the vCenter.
        Default is None.

    disks
        List of disks with properties

    scsi_controllers
        List of SCSI controllers

    parent
        Parent object reference

    .. code-block: bash

        disk:
          adapter: 'Hard disk 1'
          size: 16
          unit: GB
          address: '0:0'
          controller: 'SCSI controller 0'
          thin_provision: False
          eagerly_scrub: False
          datastore: 'myshare'
          filename: 'vm/mydisk.vmdk'

def _create_disks(service_instance, disks, scsi_controllers=None, parent=None):
    '''
    Returns a list of disk specs representing the disks to be created for a
    virtual machine

    service_instance
        Service instance (vim.ServiceInstance) of the vCenter.
        Default is None.

    disks
        List of disks with properties

    scsi_controllers
        List of SCSI controllers

    parent
        Parent object reference

    .. code-block: bash

        disk:
          adapter: 'Hard disk 1'
          size: 16
          unit: GB
          address: '0:0'
          controller: 'SCSI controller 0'
          thin_provision: False
          eagerly_scrub: False
          datastore: 'myshare'
          filename: 'vm/mydisk.vmdk'
    '''
    disk_specs = []
    keys = range(-2000, -2050, -1)
    if disks:
        devs = [disk['adapter'] for disk in disks]
        log.trace('Creating disks %s', devs)
    for disk, key in zip(disks, keys):
        # create the disk
        filename, datastore, datastore_ref = None, None, None
        size = float(disk['size'])
        # when creating both SCSI controller and Hard disk at the same time
        # we need the randomly assigned (temporary) key of the newly created
        # SCSI controller
        controller_key = 1000  # Default is the first SCSI controller
        if 'address' in disk:  # 0:0
            controller_bus_number, unit_number = disk['address'].split(':')
            controller_bus_number = int(controller_bus_number)
            unit_number = int(unit_number)
            controller_key = _get_scsi_controller_key(
                controller_bus_number,
                scsi_ctrls=scsi_controllers)
        elif 'controller' in disk:
            for contr in scsi_controllers:
                if contr['label'] == disk['controller']:
                    controller_key = contr['key']
                    break
            else:
                raise salt.exceptions.VMwareObjectNotFoundError(
                    'The given controller does not exist: '
                    '{0}'.format(disk['controller']))
        if 'datastore' in disk:
            datastore_ref = \
                salt.utils.vmware.get_datastores(
                    service_instance, parent,
                    datastore_names=[disk['datastore']])[0]
            datastore = disk['datastore']
        if 'filename' in disk:
            filename = disk['filename']
        # XOR filename, datastore
        if (not filename and datastore) or (filename and not datastore):
            raise salt.exceptions.ArgumentValueError(
                'You must specify both filename and datastore attributes'
                ' to place your disk to a specific datastore '
                '{0}, {1}'.format(datastore, filename))
        disk_spec = _apply_hard_disk(
            unit_number,
            key,
            disk_label=disk['adapter'],
            size=size,
            unit=disk['unit'],
            controller_key=controller_key,
            operation='add',
            thin_provision=disk['thin_provision'],
            eagerly_scrub=disk['eagerly_scrub'] if 'eagerly_scrub' in disk else None,
            datastore=datastore_ref,
            filename=filename)
        disk_specs.append(disk_spec)
        unit_number += 1
    return disk_specs