#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2017, Marc Tschapek <marc.tschapek@itelligence.de>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = r'''
---
module: win_disk_facts
short_description: Show the attached disks and disk information of the target host
description:
   - With the module you can retrieve and output detailed information about the attached disks of the target and
     its volumes and partitions if existent.
requirements:
   - Windows 8.1 / Windows 2012 (NT 6.2)
notes:
  - In order to understand all the returned properties and values please visit the following site and open the respective MSFT class
    U(https://msdn.microsoft.com/en-us/library/windows/desktop/hh830612.aspx)
author:
  - Marc Tschapek (@marqelme)
options:
  filter:
    description:
      - Allows to filter returned facts by type of disk information.
      - If volumes are selected partitions will be returned as well.
    type: list
    elements: str
    choices: [ physical_disk, virtual_disk, win32_disk_drive, partitions, volumes ]
    default: [ physical_disk, virtual_disk, win32_disk_drive, partitions, volumes ]
    version_added: 1.9.0
'''

EXAMPLES = r'''
- name: Get disk facts
  community.windows.win_disk_facts:

- name: Output first disk size
  debug:
    var: ansible_facts.disks[0].size

- name: Convert first system disk into various formats
  debug:
    msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
  vars:
    # Get first system disk
    disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'

    # Show disk size in Gibibytes
    disksize_gib_human: '{{ disk.size|filesizeformat(true) }}'   # returns "223.6 GiB" (human readable)
    disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'  # returns "224 GiB" (value in GiB)

    # Show disk size in Gigabytes
    disksize_gb_human: '{{ disk.size|filesizeformat }}'        # returns "240.1 GB" (human readable)
    disksize_gb: '{{ (disk.size/1000|pow(3))|round|int }} GB'  # returns "240 GB" (value in GB)

- name: Output second disk serial number
  debug:
    var: ansible_facts.disks[1].serial_number

- name: get disk physical_disk and partition facts on the target
  win_disk_facts:
    filter:
      - physical_disk
      - partitions
'''

RETURN = r'''
ansible_facts:
    description: Dictionary containing all the detailed information about the disks of the target.
    returned: always
    type: complex
    contains:
        ansible_disks:
            description: Detailed information about one particular disk.
            returned: if disks were found
            type: list
            contains:
                number:
                    description: Disk number of the particular disk.
                    returned: always
                    type: int
                    sample: 0
                size:
                    description: Size in bytes of the particular disk.
                    returned: always
                    type: int
                    sample: 227727638528
                bus_type:
                    description: Bus type of the particular disk.
                    returned: always
                    type: str
                    sample: "SCSI"
                friendly_name:
                    description: Friendly name of the particular disk.
                    returned: always
                    type: str
                    sample: "Red Hat VirtIO SCSI Disk Device"
                partition_style:
                    description: Partition style of the particular disk.
                    returned: always
                    type: str
                    sample: "MBR"
                partition_count:
                    description: Number of partitions on the particular disk.
                    returned: always
                    type: int
                    sample: 4
                operational_status:
                    description: Operational status of the particular disk.
                    returned: always
                    type: str
                    sample: "Online"
                sector_size:
                    description: Sector size in bytes of the particular disk.
                    returned: always
                    type: int
                    sample: 4096
                read_only:
                    description: Read only status of the particular disk.
                    returned: always
                    type: bool
                    sample: true
                bootable:
                    description: Information whether the particular disk is a bootable disk.
                    returned: always
                    type: bool
                    sample: false
                system_disk:
                    description: Information whether the particular disk is a system disk.
                    returned: always
                    type: bool
                    sample: true
                clustered:
                    description: Information whether the particular disk is clustered (part of a failover cluster).
                    returned: always
                    type: bool
                    sample: false
                manufacturer:
                    description: Manufacturer of the particular disk.
                    returned: always
                    type: str
                    sample: "Red Hat"
                model:
                    description: Model specification of the particular disk.
                    returned: always
                    type: str
                    sample: "VirtIO"
                firmware_version:
                    description: Firmware version of the particular disk.
                    returned: always
                    type: str
                    sample: "0001"
                location:
                    description: Location of the particular disk on the target.
                    returned: always
                    type: str
                    sample: "PCIROOT(0)#PCI(0400)#SCSI(P00T00L00)"
                serial_number:
                    description: Serial number of the particular disk on the target.
                    returned: always
                    type: str
                    sample: "b62beac80c3645e5877f"
                unique_id:
                    description: Unique ID of the particular disk on the target.
                    returned: always
                    type: str
                    sample: "3141463431303031"
                guid:
                    description: GUID of the particular disk on the target.
                    returned: if existent
                    type: str
                    sample: "{efa5f928-57b9-47fc-ae3e-902e85fbe77f}"
                path:
                    description: Path of the particular disk on the target.
                    returned: always
                    type: str
                    sample: "\\\\?\\scsi#disk&ven_red_hat&prod_virtio#4&23208fd0&1&000000#{<id>}"
                partitions:
                    description: Detailed information about one particular partition on the specified disk.
                    returned: if existent
                    type: list
                    contains:
                        number:
                            description: Number of the particular partition.
                            returned: always
                            type: int
                            sample: 1
                        size:
                            description:
                              - Size in bytes of the particular partition.
                            returned: always
                            type: int
                            sample: 838860800
                        type:
                            description: Type of the particular partition.
                            returned: always
                            type: str
                            sample: "IFS"
                        gpt_type:
                            description: gpt type of the particular partition.
                            returned: if partition_style property of the particular disk has value "GPT"
                            type: str
                            sample: "{e3c9e316-0b5c-4db8-817d-f92df00215ae}"
                        no_default_driveletter:
                            description: Information whether the particular partition has a default drive letter or not.
                            returned: if partition_style property of the particular disk has value "GPT"
                            type: bool
                            sample: true
                        mbr_type:
                            description: mbr type of the particular partition.
                            returned: if partition_style property of the particular disk has value "MBR"
                            type: int
                            sample: 7
                        active:
                            description: Information whether the particular partition is an active partition or not.
                            returned: if partition_style property of the particular disk has value "MBR"
                            type: bool
                            sample: true
                        drive_letter:
                            description: Drive letter of the particular partition.
                            returned: if existent
                            type: str
                            sample: "C"
                        transition_state:
                            description: Transition state of the particular partition.
                            returned: always
                            type: int
                            sample: 1
                        offset:
                            description: Offset of the particular partition.
                            returned: always
                            type: int
                            sample: 368050176
                        hidden:
                            description: Information whether the particular partition is hidden or not.
                            returned: always
                            type: bool
                            sample: true
                        shadow_copy:
                            description: Information whether the particular partition is a shadow copy of another partition.
                            returned: always
                            type: bool
                            sample: false
                        guid:
                            description: GUID of the particular partition.
                            returned: if existent
                            type: str
                            sample: "{302e475c-6e64-4674-a8e2-2f1c7018bf97}"
                        access_paths:
                            description: Access paths of the particular partition.
                            returned: if existent
                            type: str
                            sample: "\\\\?\\Volume{85bdc4a8-f8eb-11e6-80fa-806e6f6e6963}\\"
                        volumes:
                            description: Detailed information about one particular volume on the specified partition.
                            returned: if existent
                            type: list
                            contains:
                                size:
                                    description:
                                      - Size in bytes of the particular volume.
                                    returned: always
                                    type: int
                                    sample: 838856704
                                size_remaining:
                                    description:
                                      - Remaining size in bytes of the particular volume.
                                    returned: always
                                    type: int
                                    sample: 395620352
                                type:
                                    description: File system type of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "NTFS"
                                label:
                                    description: File system label of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "System Reserved"
                                health_status:
                                    description: Health status of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "Healthy"
                                drive_type:
                                    description: Drive type of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "Fixed"
                                allocation_unit_size:
                                    description: Allocation unit size in bytes of the particular volume.
                                    returned: always
                                    type: int
                                    sample: 4096
                                object_id:
                                    description: Object ID of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "\\\\?\\Volume{85bdc4a9-f8eb-11e6-80fa-806e6f6e6963}\\"
                                path:
                                    description: Path of the particular volume.
                                    returned: always
                                    type: str
                                    sample: "\\\\?\\Volume{85bdc4a9-f8eb-11e6-80fa-806e6f6e6963}\\"
                physical_disk:
                    description: Detailed information about physical disk properties of the particular disk.
                    returned: if existent
                    type: complex
                    contains:
                        media_type:
                            description: Media type of the particular physical disk.
                            returned: always
                            type: str
                            sample: "UnSpecified"
                        size:
                            description:
                              - Size in bytes of the particular physical disk.
                            returned: always
                            type: int
                            sample: 240057409536
                        allocated_size:
                            description:
                              - Allocated size in bytes of the particular physical disk.
                            returned: always
                            type: int
                            sample: 240057409536
                        device_id:
                            description: Device ID of the particular physical disk.
                            returned: always
                            type: str
                            sample: "0"
                        friendly_name:
                            description: Friendly name of the particular physical disk.
                            returned: always
                            type: str
                            sample: "PhysicalDisk0"
                        operational_status:
                            description: Operational status of the particular physical disk.
                            returned: always
                            type: str
                            sample: "OK"
                        health_status:
                            description: Health status of the particular physical disk.
                            returned: always
                            type: str
                            sample: "Healthy"
                        bus_type:
                            description: Bus type of the particular physical disk.
                            returned: always
                            type: str
                            sample: "SCSI"
                        usage_type:
                            description: Usage type of the particular physical disk.
                            returned: always
                            type: str
                            sample: "Auto-Select"
                        supported_usages:
                            description: Supported usage types of the particular physical disk.
                            returned: always
                            type: complex
                            contains:
                                Count:
                                    description: Count of supported usage types.
                                    returned: always
                                    type: int
                                    sample: 5
                                value:
                                    description: List of supported usage types.
                                    returned: always
                                    type: str
                                    sample: "Auto-Select, Hot Spare"
                        spindle_speed:
                            description: Spindle speed in rpm of the particular physical disk.
                            returned: always
                            type: int
                            sample: 4294967295
                        physical_location:
                            description: Physical location of the particular physical disk.
                            returned: always
                            type: str
                            sample: "Integrated : Adapter 3 : Port 0 : Target 0 : LUN 0"
                        manufacturer:
                            description: Manufacturer of the particular physical disk.
                            returned: always
                            type: str
                            sample: "SUSE"
                        model:
                            description: Model of the particular physical disk.
                            returned: always
                            type: str
                            sample: "Xen Block"
                        can_pool:
                            description: Information whether the particular physical disk can be added to a storage pool.
                            returned: always
                            type: bool
                            sample: false
                        cannot_pool_reason:
                            description: Information why the particular physical disk can not be added to a storage pool.
                            returned: if can_pool property has value false
                            type: str
                            sample: "Insufficient Capacity"
                        indication_enabled:
                            description: Information whether indication is enabled for the particular physical disk.
                            returned: always
                            type: bool
                            sample: true
                        partial:
                            description: Information whether the particular physical disk is partial.
                            returned: always
                            type: bool
                            sample: false
                        serial_number:
                            description: Serial number of the particular physical disk.
                            returned: always
                            type: str
                            sample: "b62beac80c3645e5877f"
                        object_id:
                            description: Object ID of the particular physical disk.
                            returned: always
                            type: str
                            sample: '{1}\\\\HOST\\root/Microsoft/Windows/Storage/Providers_v2\\SPACES_PhysicalDisk.ObjectId=\"{<object_id>}:PD:{<pd>}\"'
                        unique_id:
                            description: Unique ID of the particular physical disk.
                            returned: always
                            type: str
                            sample: "3141463431303031"
                virtual_disk:
                    description: Detailed information about virtual disk properties of the particular disk.
                    returned: if existent
                    type: complex
                    contains:
                        size:
                            description:
                              - Size in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 240057409536
                        allocated_size:
                            description:
                              - Allocated size in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 240057409536
                        footprint_on_pool:
                            description:
                              - Footprint on pool in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 240057409536
                        name:
                            description: Name of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "vDisk1"
                        friendly_name:
                            description: Friendly name of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Prod2 Virtual Disk"
                        operational_status:
                            description: Operational status of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "OK"
                        health_status:
                            description: Health status of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Healthy"
                        provisioning_type:
                            description: Provisioning type of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Thin"
                        allocation_unit_size:
                            description: Allocation unit size in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 4096
                        media_type:
                            description: Media type of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Unspecified"
                        parity_layout:
                            description: Parity layout of the particular virtual disk.
                            returned: if existent
                            type: int
                            sample: 1
                        access:
                            description: Access of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Read/Write"
                        detached_reason:
                            description: Detached reason of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "None"
                        write_cache_size:
                            description: Write cache size in byte of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 100
                        fault_domain_awareness:
                            description: Fault domain awareness of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "PhysicalDisk"
                        inter_leave:
                            description:
                              - Inter leave in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 102400
                        deduplication_enabled:
                            description: Information whether deduplication is enabled for the particular virtual disk.
                            returned: always
                            type: bool
                            sample: true
                        enclosure_aware:
                            description: Information whether the particular virtual disk is enclosure aware.
                            returned: always
                            type: bool
                            sample: false
                        manual_attach:
                            description: Information whether the particular virtual disk is manual attached.
                            returned: always
                            type: bool
                            sample: true
                        snapshot:
                            description: Information whether the particular virtual disk is a snapshot.
                            returned: always
                            type: bool
                            sample: false
                        tiered:
                            description: Information whether the particular virtual disk is tiered.
                            returned: always
                            type: bool
                            sample: true
                        physical_sector_size:
                            description: Physical sector size in bytes of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 4096
                        logical_sector_size:
                            description: Logical sector size in byte of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 512
                        available_copies:
                            description: Number of the available copies of the particular virtual disk.
                            returned: if existent
                            type: int
                            sample: 1
                        columns:
                            description: Number of the columns of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 2
                        groups:
                            description: Number of the groups of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 1
                        physical_disk_redundancy:
                            description: Type of the physical disk redundancy of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 1
                        read_cache_size:
                            description: Read cache size in byte of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 0
                        request_no_spof:
                            description: Information whether the particular virtual disk requests no single point of failure.
                            returned: always
                            type: bool
                            sample: true
                        resiliency_setting_name:
                            description: Type of the physical disk redundancy of the particular virtual disk.
                            returned: always
                            type: int
                            sample: 1
                        object_id:
                            description: Object ID of the particular virtual disk.
                            returned: always
                            type: str
                            sample: '{1}\\\\HOST\\root/Microsoft/Windows/Storage/Providers_v2\\SPACES_VirtualDisk.ObjectId=\"{<object_id>}:VD:{<vd>}\"'
                        unique_id:
                            description: Unique ID of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "260542E4C6B01D47A8FA7630FD90FFDE"
                        unique_id_format:
                            description: Unique ID format of the particular virtual disk.
                            returned: always
                            type: str
                            sample: "Vendor Specific"
                win32_disk_drive:
                    description: Representation of the Win32_DiskDrive class.
                    returned: if existent
                    type: complex
                    contains:
                        availability:
                            description: Availability and status of the device.
                            returned: always
                            type: int
                        bytes_per_sector:
                            description: Number of bytes in each sector for the physical disk drive.
                            returned: always
                            type: int
                            sample: 512
                        capabilities:
                            description:
                            - Array of capabilities of the media access device.
                            - For example, the device may support random access (3), removable media (7), and automatic cleaning (9).
                            returned: always
                            type: list
                            sample:
                                - 3
                                - 4
                        capability_descriptions:
                            description:
                            - List of more detailed explanations for any of the access device features indicated in the Capabilities array.
                            - Note, each entry of this array is related to the entry in the Capabilities array that is located at the same index.
                            returned: always
                            type: list
                            sample:
                                - Random Access
                                - Supports Writing
                        caption:
                            description: Short description of the object.
                            returned: always
                            type: str
                            sample: VMware Virtual disk SCSI Disk Device
                        compression_method:
                            description: Algorithm or tool used by the device to support compression.
                            returned: always
                            type: str
                            sample: Compressed
                        config_manager_error_code:
                            description: Windows Configuration Manager error code.
                            returned: always
                            type: int
                            sample: 0
                        config_manager_user_config:
                            description: If True, the device is using a user-defined configuration.
                            returned: always
                            type: bool
                            sample: true
                        creation_class_name:
                            description:
                            - Name of the first concrete class to appear in the inheritance chain used in the creation of an instance.
                            - When used with the other key properties of the class, the property allows all instances of this class
                            - and its subclasses to be uniquely identified.
                            returned: always
                            type: str
                            sample: Win32_DiskDrive
                        default_block_size:
                            description: Default block size, in bytes, for this device.
                            returned: always
                            type: int
                            sample: 512
                        description:
                            description: Description of the object.
                            returned: always
                            type: str
                            sample: Disk drive
                        device_id:
                            description: Unique identifier of the disk drive with other devices on the system.
                            returned: always
                            type: str
                            sample: "\\\\.\\PHYSICALDRIVE0"
                        error_cleared:
                            description: If True, the error reported in LastErrorCode is now cleared.
                            returned: always
                            type: bool
                            sample: true
                        error_description:
                            description:
                            - More information about the error recorded in LastErrorCode,
                            - and information on any corrective actions that may be taken.
                            returned: always
                            type: str
                        error_methodology:
                            description: Type of error detection and correction supported by this device.
                            returned: always
                            type: str
                        firmware_revision:
                            description: Revision for the disk drive firmware that is assigned by the manufacturer.
                            returned: always
                            type: str
                            sample: 1.0
                        index:
                            description:
                            - Physical drive number of the given drive.
                            - This property is filled by the STORAGE_DEVICE_NUMBER structure returned from the IOCTL_STORAGE_GET_DEVICE_NUMBER control code
                            - A value of 0xffffffff indicates that the given drive does not map to a physical drive.
                            returned: always
                            type: int
                            sample: 0
                        install_date:
                            description: Date and time the object was installed. This property does not need a value to indicate that the object is installed.
                            returned: always
                            type: str
                        interface_type:
                            description: Interface type of physical disk drive.
                            returned: always
                            type: str
                            sample: SCSI
                        last_error_code:
                            description: Last error code reported by the logical device.
                            returned: always
                            type: int
                        manufacturer:
                            description: Name of the disk drive manufacturer.
                            returned: always
                            type: str
                            sample: Seagate
                        max_block_size:
                            description: Maximum block size, in bytes, for media accessed by this device.
                            returned: always
                            type: int
                        max_media_size:
                            description: Maximum media size, in kilobytes, of media supported by this device.
                            returned: always
                            type: int
                        media_loaded:
                            description:
                            - If True, the media for a disk drive is loaded, which means that the device has a readable file system and is accessible.
                            - For fixed disk drives, this property will always be TRUE.
                            returned: always
                            type: bool
                            sample: true
                        media_type:
                            description: Type of media used or accessed by this device.
                            returned: always
                            type: str
                            sample: Fixed hard disk media
                        min_block_size:
                            description: Minimum block size, in bytes, for media accessed by this device.
                            returned: always
                            type: int
                        model:
                            description: Manufacturer's model number of the disk drive.
                            returned: always
                            type: str
                            sample: ST32171W
                        name:
                            description: Label by which the object is known. When subclassed, the property can be overridden to be a key property.
                            returned: always
                            type: str
                            sample: \\\\.\\PHYSICALDRIVE0
                        needs_cleaning:
                            description:
                            - If True, the media access device needs cleaning.
                            - Whether manual or automatic cleaning is possible is indicated in the Capabilities property.
                            returned: always
                            type: bool
                        number_of_media_supported:
                            description:
                            - Maximum number of media which can be supported or inserted
                            - (when the media access device supports multiple individual media).
                            returned: always
                            type: int
                        partitions:
                            description: Number of partitions on this physical disk drive that are recognized by the operating system.
                            returned: always
                            type: int
                            sample: 3
                        pnp_device_id:
                            description: Windows Plug and Play device identifier of the logical device.
                            returned: always
                            type: str
                            sample: "SCSI\\DISK&VEN_VMWARE&PROD_VIRTUAL_DISK\\5&1982005&0&000000"
                        power_management_capabilities:
                            description: Array of the specific power-related capabilities of a logical device.
                            returned: always
                            type: list
                        power_management_supported:
                            description:
                            - If True, the device can be power-managed (can be put into suspend mode, and so on).
                            - The property does not indicate that power management features are currently enabled,
                            - only that the logical device is capable of power management.
                            returned: always
                            type: bool
                        scsi_bus:
                            description: SCSI bus number of the disk drive.
                            returned: always
                            type: int
                            sample: 0
                        scsi_logical_unit:
                            description: SCSI logical unit number (LUN) of the disk drive.
                            returned: always
                            type: int
                            sample: 0
                        scsi_port:
                            description: SCSI port number of the disk drive.
                            returned: always
                            type: int
                            sample: 0
                        scsi_target_id:
                            description: SCSI identifier number of the disk drive.
                            returned: always
                            type: int
                            sample: 0
                        sectors_per_track:
                            description: Number of sectors in each track for this physical disk drive.
                            returned: always
                            type: int
                            sample: 63
                        serial_number:
                            description: Number allocated by the manufacturer to identify the physical media.
                            returned: always
                            type: str
                            sample: 6000c298f34101b38cb2b2508926b9de
                        signature:
                            description: Disk identification. This property can be used to identify a shared resource.
                            returned: always
                            type: int
                        size:
                            description:
                            - Size of the disk drive. It is calculated by multiplying the total number of cylinders, tracks in each cylinder,
                            - sectors in each track, and bytes in each sector.
                            returned: always
                            type: int
                            sample: 53686402560
                        status:
                            description:
                            - Current status of the object. Various operational and nonoperational statuses can be defined.
                            - 'Operational statuses include: "OK", "Degraded", and "Pred Fail"'
                            - (an element, such as a SMART-enabled hard disk drive, may be functioning properly but predicting a failure in the near future).
                            - 'Nonoperational statuses include: "Error", "Starting", "Stopping", and "Service".'
                            - '"Service", could apply during mirror-resilvering of a disk, reload of a user permissions list, or other administrative work.'
                            - Not all such work is online, yet the managed element is neither "OK" nor in one of the other states.
                            returned: always
                            type: str
                            sample: OK
                        status_info:
                            description:
                            - State of the logical device. If this property does not apply to the logical device, the value 5 (Not Applicable) should be used.
                            returned: always
                            type: int
                        system_creation_class_name:
                            description: Value of the scoping computer's CreationClassName property.
                            returned: always
                            type: str
                            sample: Win32_ComputerSystem
                        system_name:
                            description: Name of the scoping system.
                            returned: always
                            type: str
                            sample: WILMAR-TEST-123
                        total_cylinders:
                            description:
                            - Total number of cylinders on the physical disk drive.
                            - 'Note: the value for this property is obtained through extended functions of BIOS interrupt 13h.'
                            - The value may be inaccurate if the drive uses a translation scheme to support high-capacity disk sizes.
                            - Consult the manufacturer for accurate drive specifications.
                            returned: always
                            type: int
                            sample: 6527
                        total_heads:
                            description:
                            - Total number of heads on the disk drive.
                            - 'Note: the value for this property is obtained through extended functions of BIOS interrupt 13h.'
                            - The value may be inaccurate if the drive uses a translation scheme to support high-capacity disk sizes.
                            - Consult the manufacturer for accurate drive specifications.
                            returned: always
                            type: int
                            sample: 255
                        total_sectors:
                            description:
                            - Total number of sectors on the physical disk drive.
                            - 'Note: the value for this property is obtained through extended functions of BIOS interrupt 13h.'
                            - The value may be inaccurate if the drive uses a translation scheme to support high-capacity disk sizes.
                            - Consult the manufacturer for accurate drive specifications.
                            returned: always
                            type: int
                            sample: 104856255
                        total_tracks:
                            description:
                            - Total number of tracks on the physical disk drive.
                            - 'Note: the value for this property is obtained through extended functions of BIOS interrupt 13h.'
                            - The value may be inaccurate if the drive uses a translation scheme to support high-capacity disk sizes.
                            - Consult the manufacturer for accurate drive specifications.
                            returned: always
                            type: int
                            sample: 1664385
                        tracks_per_cylinder:
                            description:
                            - Number of tracks in each cylinder on the physical disk drive.
                            - 'Note: the value for this property is obtained through extended functions of BIOS interrupt 13h.'
                            - The value may be inaccurate if the drive uses a translation scheme to support high-capacity disk sizes.
                            - Consult the manufacturer for accurate drive specifications.
                            returned: always
                            type: int
                            sample: 255
'''
