From 40071e5db3d325236c91f56888e5f555d8391e5d Mon Sep 17 00:00:00 2001 From: Wilmar den Ouden Date: Fri, 15 Nov 2019 06:45:18 +0100 Subject: [PATCH] win_disk_facts: Adds Win32_DiskDrive object to facts (#51595) * Adds win32_disk_drive object to win_disk_facts * Names class parameter for Get-CimInstance as requested in the devdocs * Maps whole class and adds docs * Improve matching of disks when UniqueID is different format * Improve logic for PNPDeviceID mapping * Adds test for win32_disk_drive --- ...32_diskdrive-object-to-win_disk_facts.yaml | 3 + .../modules/windows/win_disk_facts.ps1 | 62 ++++ lib/ansible/modules/windows/win_disk_facts.py | 300 ++++++++++++++++++ .../targets/win_disk_facts/tasks/tests.yml | 1 + 4 files changed, 366 insertions(+) create mode 100644 changelogs/fragments/51595-adds-win32_diskdrive-object-to-win_disk_facts.yaml diff --git a/changelogs/fragments/51595-adds-win32_diskdrive-object-to-win_disk_facts.yaml b/changelogs/fragments/51595-adds-win32_diskdrive-object-to-win_disk_facts.yaml new file mode 100644 index 0000000000..b1a67659b1 --- /dev/null +++ b/changelogs/fragments/51595-adds-win32_diskdrive-object-to-win_disk_facts.yaml @@ -0,0 +1,3 @@ +--- +minor_changes: + - win_disk_facts - Adds Win32_DiskDrive class object as `win32_disk_drive` key to return of the module diff --git a/lib/ansible/modules/windows/win_disk_facts.ps1 b/lib/ansible/modules/windows/win_disk_facts.ps1 index 204b66d47a..efa5be5687 100644 --- a/lib/ansible/modules/windows/win_disk_facts.ps1 +++ b/lib/ansible/modules/windows/win_disk_facts.ps1 @@ -109,6 +109,68 @@ foreach ($disk in $disks) { } } } + $win32_disk_drive = Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction SilentlyContinue | Where-Object { + if ($_.SerialNumber) { + $_.SerialNumber -eq $disk.SerialNumber + } elseif ($disk.UniqueIdFormat -eq 'Vendor Specific') { + $_.PNPDeviceID -eq $disk.UniqueId.split(':')[0] + } + } + if ($win32_disk_drive) { + $disk_info["win32_disk_drive"] += @{ + availability=$win32_disk_drive.Availability + bytes_per_sector=$win32_disk_drive.BytesPerSector + capabilities=$win32_disk_drive.Capabilities + capability_descriptions=$win32_disk_drive.CapabilityDescriptions + caption=$win32_disk_drive.Caption + compression_method=$win32_disk_drive.CompressionMethod + config_manager_error_code=$win32_disk_drive.ConfigManagerErrorCode + config_manager_user_config=$win32_disk_drive.ConfigManagerUserConfig + creation_class_name=$win32_disk_drive.CreationClassName + default_block_size=$win32_disk_drive.DefaultBlockSize + description=$win32_disk_drive.Description + device_id=$win32_disk_drive.DeviceID + error_cleared=$win32_disk_drive.ErrorCleared + error_description=$win32_disk_drive.ErrorDescription + error_methodology=$win32_disk_drive.ErrorMethodology + firmware_revision=$win32_disk_drive.FirmwareRevision + index=$win32_disk_drive.Index + install_date=$win32_disk_drive.InstallDate + interface_type=$win32_disk_drive.InterfaceType + last_error_code=$win32_disk_drive.LastErrorCode + manufacturer=$win32_disk_drive.Manufacturer + max_block_size=$win32_disk_drive.MaxBlockSize + max_media_size=$win32_disk_drive.MaxMediaSize + media_loaded=$win32_disk_drive.MediaLoaded + media_type=$win32_disk_drive.MediaType + min_block_size=$win32_disk_drive.MinBlockSize + model=$win32_disk_drive.Model + name=$win32_disk_drive.Name + needs_cleaning=$win32_disk_drive.NeedsCleaning + number_of_media_supported=$win32_disk_drive.NumberOfMediaSupported + partitions=$win32_disk_drive.Partitions + pnp_device_id=$win32_disk_drive.PNPDeviceID + power_management_capabilities=$win32_disk_drive.PowerManagementCapabilities + power_management_supported=$win32_disk_drive.PowerManagementSupported + scsi_bus=$win32_disk_drive.SCSIBus + scsi_logical_unit=$win32_disk_drive.SCSILogicalUnit + scsi_port=$win32_disk_drive.SCSIPort + scsi_target_id=$win32_disk_drive.SCSITargetId + sectors_per_track=$win32_disk_drive.SectorsPerTrack + serial_number=$win32_disk_drive.SerialNumber + signature=$win32_disk_drive.Signature + size=$win32_disk_drive.Size + status=$win32_disk_drive.status + status_info=$win32_disk_drive.StatusInfo + system_creation_class_name=$win32_disk_drive.SystemCreationClassName + system_name=$win32_disk_drive.SystemName + total_cylinders=$win32_disk_drive.TotalCylinders + total_heads=$win32_disk_drive.TotalHeads + total_sectors=$win32_disk_drive.TotalSectors + total_tracks=$win32_disk_drive.TotalTracks + tracks_per_cylinder=$win32_disk_drive.TracksPerCylinder + } + } $disk_info.number = $disk.Number $disk_info.size = $disk.Size $disk_info.bus_type = $disk.BusType diff --git a/lib/ansible/modules/windows/win_disk_facts.py b/lib/ansible/modules/windows/win_disk_facts.py index a9a77a29c5..b203d79002 100644 --- a/lib/ansible/modules/windows/win_disk_facts.py +++ b/lib/ansible/modules/windows/win_disk_facts.py @@ -588,4 +588,304 @@ ansible_facts: 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 ''' diff --git a/test/integration/targets/win_disk_facts/tasks/tests.yml b/test/integration/targets/win_disk_facts/tasks/tests.yml index 3b12d46210..ca3fda82cb 100644 --- a/test/integration/targets/win_disk_facts/tasks/tests.yml +++ b/test/integration/targets/win_disk_facts/tasks/tests.yml @@ -15,3 +15,4 @@ - disks_found.ansible_facts.ansible_disks[0].bootable is defined - disks_found.ansible_facts.ansible_disks[0].physical_disk.size is defined - disks_found.ansible_facts.ansible_disks[0].physical_disk.operational_status is defined + - disks_found.ansible_facts.ansible_disks[0].win32_disk_drive is defined