# Copyright (C) 2016 Red Hat, Inc.
# (C) Copyright 2017 Hewlett Packard Enterprise Development LP
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; If not, see .
#
# Author: Gris Ge
import six
from lsm import LsmError, ErrorNumber
from lsm._clib import (_local_disk_vpd83_search, _local_disk_vpd83_get,
_local_disk_health_status_get,
_local_disk_rpm_get, _local_disk_list,
_local_disk_link_type_get, _local_disk_ident_led_on,
_local_disk_ident_led_off, _local_disk_fault_led_on,
_local_disk_fault_led_off, _local_disk_serial_num_get,
_local_disk_led_status_get, _local_disk_link_speed_get)
def _use_c_lib_function(func_ref, arg):
(data, err_no, err_msg) = func_ref(arg)
if err_no != ErrorNumber.OK:
raise LsmError(err_no, err_msg)
return data
class LocalDisk(object):
@staticmethod
def vpd83_search(vpd83):
"""
lsm.LocalDisk.vpd83_search(vpd83)
Version:
1.3
Usage:
Find out the disk paths for given SCSI VPD page 0x83 NAA type
ID. Considering multipath, certain VPD83 might have multiple disks
associated.
Parameters:
vpd83 (string)
The VPD83 NAA type ID.
Returns:
[disk_path]
List of string. Empty list if not disk found.
The disk_path string format is '/dev/sd[a-z]+' for SCSI and
ATA disks.
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_vpd83_search, vpd83)
@staticmethod
def serial_num_get(disk_path):
"""
lsm.LocalDisk.serial_num_get(disk_path)
Version:
1.4
Usage:
Query the SCSI VPD80 serial number of given disk path.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
serial_num (string)
String of VPD80 serial number. Empty string if not supported.
The string format regex is:
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_serial_num_get, disk_path)
@staticmethod
def vpd83_get(disk_path):
"""
lsm.LocalDisk.vpd83_get(disk_path)
Version:
1.3
Usage:
Query the SCSI VPD83 NAA ID of given disk path.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
vpd83 (string)
String of VPD83 NAA ID. Empty string if not supported.
The string format regex is:
(?:^6[0-9a-f]{31})|(?:^[235][0-9a-f]{15})$
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_vpd83_get, disk_path)
@staticmethod
def health_status_get(disk_path):
"""
lsm.LocalDisk.health_status_get(disk_path)
Version:
1.5
Usage:
Retrieve the health status of given disk path.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
health_status (integer)
Disk health status:
-1 (lsm.Disk.HEALTH_STATUS_UNKNOWN):
Unknown health status
0 (lsm.Disk.HEALTH_STATUS_FAIL):
health status indicates failure
1 (lsm.Disk.HEALTH_STATUS_WARN):
health status warns of near failure
2 (lsm.Disk.HEALTH_STATUS_GOOD):
health status indicates good health
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Not supported.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_health_status_get, disk_path)
@staticmethod
def rpm_get(disk_path):
"""
Version:
1.3
Usage:
Query the disk rotation speed - revolutions per minute (RPM) of
given disk path.
Require permission to open disk path as read-only and non-block,
normally it's root or disk group privilege.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb', '/dev/nvme0n1'.
Returns:
rpm (integer)
Disk rotation speed:
-1 (lsm.Disk.RPM_UNKNOWN):
Unknown RPM
0 (lsm.Disk.RPM_NON_ROTATING_MEDIUM):
Non-rotating medium (e.g., SSD)
1 (lsm.Disk.RPM_ROTATING_UNKNOWN_SPEED):
Rotational disk with unknown speed
>1:
Normal rotational disk (e.g., HDD)
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Not supported.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_rpm_get, disk_path)
@staticmethod
def list():
"""
Version:
1.3
Usage:
Query local disk paths. Currently, only SCSI, ATA and NVMe disks
will be included.
Parameters:
N/A
Returns:
[disk_path]
List of string. Empty list if not disk found.
The disk_path string format is '/dev/sd[a-z]+' for SCSI and
ATA disks, '/dev/nvme[0-9]+n[0-9]+' for NVMe disks.
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
Capability:
N/A
No capability required as this is a library level method.
"""
(disk_paths, err_no, err_msg) = _local_disk_list()
if err_no != ErrorNumber.OK:
raise LsmError(err_no, err_msg)
return disk_paths
@staticmethod
def link_type_get(disk_path):
"""
Version:
1.3
Usage:
Query the disk link type of given disk path.
For SATA disks connected to SAS enclosure, will return
lsm.Disk.LINK_TYPE_ATA.
Require permission to open disk_path(root user or disk group).
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
link_type (integer)
Link type, possible values are:
lsm.Disk.LINK_TYPE_UNKNOWN
Failed to detect link type
lsm.Disk.LINK_TYPE_FC
Fibre Channel
lsm.Disk.LINK_TYPE_SSA
Serial Storage Architecture, Old IBM tech.
lsm.Disk.LINK_TYPE_SBP
Serial Bus Protocol, used by IEEE 1394.
lsm.Disk.LINK_TYPE_SRP
SCSI RDMA Protocol
lsm.Disk.LINK_TYPE_ISCSI
Internet Small Computer System Interface
lsm.Disk.LINK_TYPE_SAS
Serial Attached SCSI
lsm.Disk.LINK_TYPE_ADT
Automation/Drive Interface Transport
Protocol, often used by Tape.
lsm.Disk.LINK_TYPE_ATA
PATA/IDE or SATA.
lsm.Disk.LINK_TYPE_USB
USB disk.
lsm.Disk.LINK_TYPE_SOP
SCSI over PCI-E
lsm.Disk.LINK_TYPE_PCIE
PCI-E, e.g. NVMe
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
Insufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_link_type_get, disk_path)
@staticmethod
def ident_led_on(disk_path):
"""
Version:
1.3
Usage:
Turn on the identification LED for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
None
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_ident_led_on, disk_path)
@staticmethod
def ident_led_off(disk_path):
"""
Version:
1.3
Usage:
Turn off the identification LED for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
None
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_ident_led_off, disk_path)
@staticmethod
def fault_led_on(disk_path):
"""
Version:
1.3
Usage:
Turn on the fault LED for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
None
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_fault_led_on, disk_path)
@staticmethod
def fault_led_off(disk_path):
"""
Version:
1.3
Usage:
Turn off the fault LED for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
None
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_fault_led_off, disk_path)
@staticmethod
def led_status_get(disk_path):
"""
Version:
1.3
Usage:
Get LED status for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
led_status (integer, bit map)
Could be combination of these values:
lsm.Disk.LED_STATUS_UNKNOWN
lsm.Disk.LED_STATUS_IDENT_ON
lsm.Disk.LED_STATUS_IDENT_OFF
lsm.Disk.LED_STATUS_IDENT_UNKNOWN
Has identification LED, but status is unknown.
If certain disk has no identification LED,
'led_status' should not contain
'lsm.Disk.LED_STATUS_IDENT_ON' or
'lsm.Disk.LED_STATUS_IDENT_OFF' or
'lsm.Disk.LED_STATUS_IDENT_UNKNOWN'
lsm.Disk.LED_STATUS_FAULT_ON
lsm.Disk.LED_STATUS_FAULT_OFF
lsm.Disk.LED_STATUS_FAULT_UNKNOWN
Has fault LED, but status is unknown.
If certain disk has no fault LED,
'led_status' should not contain
'lsm.Disk.LED_STATUS_FAULT_ON' or
'lsm.Disk.LED_STATUS_FAULT_OFF' or
'lsm.Disk.LED_STATUS_FAULT_UNKNOWN'
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk does not support SCSI SPC.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_led_status_get, disk_path)
@staticmethod
def link_speed_get(disk_path):
"""
Version:
1.4
Usage:
Get current negotiated logical link speed for specified disk.
Parameters:
disk_path (string)
The disk path, example '/dev/sdb'.
Returns:
link_speed
Integer for link speed in Mbps. For example, '3.0 Gbps' will
get 3000.
SpecialExceptions:
LsmError
ErrorNumber.LIB_BUG
Internal bug.
ErrorNumber.INVALID_ARGUMENT
Invalid disk_path. Should be like '/dev/sdb'.
ErrorNumber.NOT_FOUND_DISK
Provided disk is not found.
ErrorNumber.NO_SUPPORT
Provided disk is not supported yet.
ErrorNumber.PERMISSION_DENIED
No sufficient permission to access provided disk path.
Capability:
N/A
No capability required as this is a library level method.
"""
return _use_c_lib_function(_local_disk_link_speed_get, disk_path)