<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def get_disk_partition_info(host_ref, disk_id, storage_system=None):
    '''
    Returns all partitions on a disk

    host_ref
        The reference of the ESXi host containing the disk

    disk_id
        The canonical name of the disk whose partitions are to be removed

    storage_system
        The ESXi host's storage system. Default is None.
    '''
    hostname = get_managed_object_name(host_ref)
    service_instance = get_service_instance_from_managed_object(host_ref)
    if not storage_system:
        storage_system = get_storage_system(service_instance, host_ref,
                                            hostname)

    props = get_properties_of_managed_object(storage_system,
                                             ['storageDeviceInfo.scsiLun'])
    if not props.get('storageDeviceInfo.scsiLun'):
        raise salt.exceptions.VMwareObjectRetrievalError(
            'No devices were retrieved in host \'{0}\''.format(hostname))
    log.trace(
        '[%s] Retrieved %s devices: %s',
        hostname,
        len(props['storageDeviceInfo.scsiLun']),
        ', '.join([l.canonicalName
                   for l in props['storageDeviceInfo.scsiLun']])
    )
    disks = [l for l in props['storageDeviceInfo.scsiLun']
             if isinstance(l, vim.HostScsiDisk) and
             l.canonicalName == disk_id]
    if not disks:
        raise salt.exceptions.VMwareObjectRetrievalError(
            'Disk \'{0}\' was not found in host \'{1}\''
            ''.format(disk_id, hostname))
    log.trace('[%s] device_path = %s', hostname, disks[0].devicePath)
    partition_info = _get_partition_info(storage_system, disks[0].devicePath)
    log.trace('[%s] Retrieved %s partition(s) on disk \'%s\'',
              hostname, len(partition_info.spec.partition), disk_id)
    return partition_info