# coding: utf-8

"""
Drive.py

 The Clear BSD License

 Copyright (c) – 2016, NetApp, Inc. All rights reserved.

 Redistribution and use in source and binary forms, with or without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

 * Neither the name of NetApp, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

 NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""

from pprint import pformat
from six import iteritems


class Drive(object):
    """
    NOTE: This class is auto generated by the swagger code generator program.
    Do not edit the class manually.
    """
    def __init__(self):
        """
        Drive - a model defined in Swagger

        :param dict swaggerTypes: The key is attribute name
                                  and the value is attribute type.
        :param dict attributeMap: The key is attribute name
                                  and the value is json key in definition.
        """
        self.swagger_types = {
            'offline': 'bool',  # (required parameter)
            'hot_spare': 'bool',  # (required parameter)
            'invalid_drive_data': 'bool',  # (required parameter)
            'available': 'bool',  # (required parameter)
            'pfa': 'bool',  # (required parameter)
            'drive_ref': 'str',  # (required parameter)
            'status': 'str',  # (required parameter)
            'cause': 'str',  # (required parameter)
            'interface_type': 'DriveTypeData',  # (required parameter)
            'physical_location': 'Location',  # (required parameter)
            'manufacturer': 'str',  # (required parameter)
            'manufacturer_date': 'int',  # (required parameter)
            'product_id': 'str',  # (required parameter)
            'serial_number': 'str',  # (required parameter)
            'software_version': 'str',  # (required parameter)
            'blk_size': 'int',  # (required parameter)
            'usable_capacity': 'int',  # (required parameter)
            'raw_capacity': 'int',  # (required parameter)
            'world_wide_name': 'str',  # (required parameter)
            'current_volume_group_ref': 'str',  # (required parameter)
            'spared_for_drive_ref': 'str',  # (required parameter)
            'mirror_drive': 'str',  # (required parameter)
            'non_redundant_access': 'bool',  # (required parameter)
            'working_channel': 'int',  # (required parameter)
            'volume_group_index': 'int',  # (required parameter)
            'current_speed': 'str',  # (required parameter)
            'max_speed': 'str',  # (required parameter)
            'uncertified': 'bool',  # (required parameter)
            'has_degraded_channel': 'bool',  # (required parameter)
            'degraded_channels': 'list[int]',  # (required parameter)
            'phy_drive_type': 'str',  # (required parameter)
            'spindle_speed': 'int',  # (required parameter)
            'rtr_attributes': 'RTRAttributes',  # (required parameter)
            'reserved': 'str',  # (required parameter)
            'phy_drive_type_data': 'PhysicalDriveTypeData',  # (required parameter)
            'pfa_reason': 'str',  # (required parameter)
            'bypass_source': 'list[ObjectReference]',  # (required parameter)
            'repair_policy': 'RepairPolicy',  # (required parameter)
            'fde_capable': 'bool',  # (required parameter)
            'fde_enabled': 'bool',  # (required parameter)
            'fde_locked': 'bool',  # (required parameter)
            'lock_key_id': 'str',  # (required parameter)
            'ssd_wear_life': 'SSDWearLife',  # (required parameter)
            'drive_media_type': 'str',  # (required parameter)
            'fpga_version': 'str',  # (required parameter)
            'protection_information_capabilities': 'ProtectionInformationCapabilities',  # (required parameter)
            'protection_information_capable': 'bool',  # (required parameter)
            'protection_type': 'str',  # (required parameter)
            'interposer_present': 'bool',  # (required parameter)
            'interposer_ref': 'str',  # (required parameter)
            'current_command_aging_timeout': 'int',  # (required parameter)
            'default_command_aging_timeout': 'int',  # (required parameter)
            'drive_temperature': 'DriveTemperature',  # (required parameter)
            'blk_size_physical': 'int',  # (required parameter)
            'lowest_aligned_lba': 'int',  # (required parameter)
            'removed': 'bool',  # (required parameter)
            'locate_in_progress': 'bool',  # (required parameter)
            'fips_capable': 'bool',  # (required parameter)
            'id': 'str'
        }

        self.attribute_map = {
            'offline': 'offline',  # (required parameter)
            'hot_spare': 'hotSpare',  # (required parameter)
            'invalid_drive_data': 'invalidDriveData',  # (required parameter)
            'available': 'available',  # (required parameter)
            'pfa': 'pfa',  # (required parameter)
            'drive_ref': 'driveRef',  # (required parameter)
            'status': 'status',  # (required parameter)
            'cause': 'cause',  # (required parameter)
            'interface_type': 'interfaceType',  # (required parameter)
            'physical_location': 'physicalLocation',  # (required parameter)
            'manufacturer': 'manufacturer',  # (required parameter)
            'manufacturer_date': 'manufacturerDate',  # (required parameter)
            'product_id': 'productID',  # (required parameter)
            'serial_number': 'serialNumber',  # (required parameter)
            'software_version': 'softwareVersion',  # (required parameter)
            'blk_size': 'blkSize',  # (required parameter)
            'usable_capacity': 'usableCapacity',  # (required parameter)
            'raw_capacity': 'rawCapacity',  # (required parameter)
            'world_wide_name': 'worldWideName',  # (required parameter)
            'current_volume_group_ref': 'currentVolumeGroupRef',  # (required parameter)
            'spared_for_drive_ref': 'sparedForDriveRef',  # (required parameter)
            'mirror_drive': 'mirrorDrive',  # (required parameter)
            'non_redundant_access': 'nonRedundantAccess',  # (required parameter)
            'working_channel': 'workingChannel',  # (required parameter)
            'volume_group_index': 'volumeGroupIndex',  # (required parameter)
            'current_speed': 'currentSpeed',  # (required parameter)
            'max_speed': 'maxSpeed',  # (required parameter)
            'uncertified': 'uncertified',  # (required parameter)
            'has_degraded_channel': 'hasDegradedChannel',  # (required parameter)
            'degraded_channels': 'degradedChannels',  # (required parameter)
            'phy_drive_type': 'phyDriveType',  # (required parameter)
            'spindle_speed': 'spindleSpeed',  # (required parameter)
            'rtr_attributes': 'rtrAttributes',  # (required parameter)
            'reserved': 'reserved',  # (required parameter)
            'phy_drive_type_data': 'phyDriveTypeData',  # (required parameter)
            'pfa_reason': 'pfaReason',  # (required parameter)
            'bypass_source': 'bypassSource',  # (required parameter)
            'repair_policy': 'repairPolicy',  # (required parameter)
            'fde_capable': 'fdeCapable',  # (required parameter)
            'fde_enabled': 'fdeEnabled',  # (required parameter)
            'fde_locked': 'fdeLocked',  # (required parameter)
            'lock_key_id': 'lockKeyID',  # (required parameter)
            'ssd_wear_life': 'ssdWearLife',  # (required parameter)
            'drive_media_type': 'driveMediaType',  # (required parameter)
            'fpga_version': 'fpgaVersion',  # (required parameter)
            'protection_information_capabilities': 'protectionInformationCapabilities',  # (required parameter)
            'protection_information_capable': 'protectionInformationCapable',  # (required parameter)
            'protection_type': 'protectionType',  # (required parameter)
            'interposer_present': 'interposerPresent',  # (required parameter)
            'interposer_ref': 'interposerRef',  # (required parameter)
            'current_command_aging_timeout': 'currentCommandAgingTimeout',  # (required parameter)
            'default_command_aging_timeout': 'defaultCommandAgingTimeout',  # (required parameter)
            'drive_temperature': 'driveTemperature',  # (required parameter)
            'blk_size_physical': 'blkSizePhysical',  # (required parameter)
            'lowest_aligned_lba': 'lowestAlignedLBA',  # (required parameter)
            'removed': 'removed',  # (required parameter)
            'locate_in_progress': 'locateInProgress',  # (required parameter)
            'fips_capable': 'fipsCapable',  # (required parameter)
            'id': 'id'
        }

        self._offline = None
        self._hot_spare = None
        self._invalid_drive_data = None
        self._available = None
        self._pfa = None
        self._drive_ref = None
        self._status = None
        self._cause = None
        self._interface_type = None
        self._physical_location = None
        self._manufacturer = None
        self._manufacturer_date = None
        self._product_id = None
        self._serial_number = None
        self._software_version = None
        self._blk_size = None
        self._usable_capacity = None
        self._raw_capacity = None
        self._world_wide_name = None
        self._current_volume_group_ref = None
        self._spared_for_drive_ref = None
        self._mirror_drive = None
        self._non_redundant_access = None
        self._working_channel = None
        self._volume_group_index = None
        self._current_speed = None
        self._max_speed = None
        self._uncertified = None
        self._has_degraded_channel = None
        self._degraded_channels = None
        self._phy_drive_type = None
        self._spindle_speed = None
        self._rtr_attributes = None
        self._reserved = None
        self._phy_drive_type_data = None
        self._pfa_reason = None
        self._bypass_source = None
        self._repair_policy = None
        self._fde_capable = None
        self._fde_enabled = None
        self._fde_locked = None
        self._lock_key_id = None
        self._ssd_wear_life = None
        self._drive_media_type = None
        self._fpga_version = None
        self._protection_information_capabilities = None
        self._protection_information_capable = None
        self._protection_type = None
        self._interposer_present = None
        self._interposer_ref = None
        self._current_command_aging_timeout = None
        self._default_command_aging_timeout = None
        self._drive_temperature = None
        self._blk_size_physical = None
        self._lowest_aligned_lba = None
        self._removed = None
        self._locate_in_progress = None
        self._fips_capable = None
        self._id = None

    @property
    def offline(self):
        """
        Gets the offline of this Drive.
        True if the drive is in the offline state, false otherwise. This field is valid for missing drives.

        :return: The offline of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._offline

    @offline.setter
    def offline(self, offline):
        """
        Sets the offline of this Drive.
        True if the drive is in the offline state, false otherwise. This field is valid for missing drives.

        :param offline: The offline of this Drive.
        :type: bool
        """
        self._offline = offline

    @property
    def hot_spare(self):
        """
        Gets the hot_spare of this Drive.
        True if the drive has been designated as a hot spare; false otherwise. This field is valid for missing drives.

        :return: The hot_spare of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._hot_spare

    @hot_spare.setter
    def hot_spare(self, hot_spare):
        """
        Sets the hot_spare of this Drive.
        True if the drive has been designated as a hot spare; false otherwise. This field is valid for missing drives.

        :param hot_spare: The hot_spare of this Drive.
        :type: bool
        """
        self._hot_spare = hot_spare

    @property
    def invalid_drive_data(self):
        """
        Gets the invalid_drive_data of this Drive.
        True if no drive information (serial #, capacity, etc.) can be obtained. This field is always true for missing drives.

        :return: The invalid_drive_data of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._invalid_drive_data

    @invalid_drive_data.setter
    def invalid_drive_data(self, invalid_drive_data):
        """
        Sets the invalid_drive_data of this Drive.
        True if no drive information (serial #, capacity, etc.) can be obtained. This field is always true for missing drives.

        :param invalid_drive_data: The invalid_drive_data of this Drive.
        :type: bool
        """
        self._invalid_drive_data = invalid_drive_data

    @property
    def available(self):
        """
        Gets the available of this Drive.
        True if the drive is available for use in creating a new volume group; false otherwise. This field is valid for missing drives.

        :return: The available of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._available

    @available.setter
    def available(self, available):
        """
        Sets the available of this Drive.
        True if the drive is available for use in creating a new volume group; false otherwise. This field is valid for missing drives.

        :param available: The available of this Drive.
        :type: bool
        """
        self._available = available

    @property
    def pfa(self):
        """
        Gets the pfa of this Drive.
        True if the drive is drive Predicted Failure analysis predicts a drive failure. This field is valid for missing drives.

        :return: The pfa of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._pfa

    @pfa.setter
    def pfa(self, pfa):
        """
        Sets the pfa of this Drive.
        True if the drive is drive Predicted Failure analysis predicts a drive failure. This field is valid for missing drives.

        :param pfa: The pfa of this Drive.
        :type: bool
        """
        self._pfa = pfa

    @property
    def drive_ref(self):
        """
        Gets the drive_ref of this Drive.
        The identifier value for this drive. Other objects may use this reference value to refer to the drive. This field is valid for missing drives.

        :return: The drive_ref of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._drive_ref

    @drive_ref.setter
    def drive_ref(self, drive_ref):
        """
        Sets the drive_ref of this Drive.
        The identifier value for this drive. Other objects may use this reference value to refer to the drive. This field is valid for missing drives.

        :param drive_ref: The drive_ref of this Drive.
        :type: str
        """
        self._drive_ref = drive_ref

    @property
    def status(self):
        """
        Gets the status of this Drive.
        An indication of the current status of the drive. This field is valid for missing drives.

        :return: The status of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._status

    @status.setter
    def status(self, status):
        """
        Sets the status of this Drive.
        An indication of the current status of the drive. This field is valid for missing drives.

        :param status: The status of this Drive.
        :type: str
        """
        allowed_values = ["optimal", "failed", "replaced", "bypassed", "unresponsive", "removed", "incompatible", "dataRelocation", "preFailCopy", "preFailCopyPending", "__UNDEFINED"]
        if status not in allowed_values:
            raise ValueError(
                "Invalid value for `status`, must be one of {0}"
                .format(allowed_values)
            )
        self._status = status

    @property
    def cause(self):
        """
        Gets the cause of this Drive.
        An indication of the reason for the current status of the drive. This field is most useful when the current status is something other than optimal; it identifies the event that caused the status to change to its current value. This field is valid for missing drives.

        :return: The cause of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._cause

    @cause.setter
    def cause(self, cause):
        """
        Sets the cause of this Drive.
        An indication of the reason for the current status of the drive. This field is most useful when the current status is something other than optimal; it identifies the event that caused the status to change to its current value. This field is valid for missing drives.

        :param cause: The cause of this Drive.
        :type: str
        """
        allowed_values = ["none", "userOp", "writeOp", "uncertified", "speedMismatch", "bypassUnknown", "wrongDriveType", "incompatibleUprevDacstore", "incompatibleDownrevDacstore", "incompatibleInternalError", "incompatibleSectorSizeMismatch", "incompatibleNativeVgRefersToForeignDrive", "incompatibleForeignVgRefersToNativeDrive", "incompatibleNativeVgForeignDriveMutualRef", "incompatibleVgCloned", "incompatibleForeignDriveInconsistent", "incompatibleVgHasDrivePartOfMultipleVgs", "incompatibleForeignDriveHasInconsistentRole", "incompatibleVgDrivePartOfMultipleVgs", "incompatibleFailedLegacyDrive", "incompatibleDdfOtherVendor", "incompatibleDbAdoptionFailure", "locked", "insufficientDriveCapacity", "supercapacitorFailure", "unsupportedProtocolConnection", "unsupportedCapacity", "invalidLockKeyPresented", "incompatiblePiType", "incompatibleDatabaseValidationFailure", "incompatibleUnsupportedInterposerFwVersion", "incompatibleSataDriveSctUnsupported", "incompatibleModelNumberUnsupported", "incompatibleAlignmentForEmulationDrive", "srcRelocation", "dstRelocation", "incompatibleDriveMetadataUnusable", "pfa", "spfa", "__UNDEFINED"]
        if cause not in allowed_values:
            raise ValueError(
                "Invalid value for `cause`, must be one of {0}"
                .format(allowed_values)
            )
        self._cause = cause

    @property
    def interface_type(self):
        """
        Gets the interface_type of this Drive.
        Information about the I/O interface between the controller and the drive. For example, for a SCSI-attached drive, this field will contain information about the drive's channel and SCSI ID values. For other interface types, different data will be available in this field.

        :return: The interface_type of this Drive.
        :rtype: DriveTypeData
        :required/optional: required
        """
        return self._interface_type

    @interface_type.setter
    def interface_type(self, interface_type):
        """
        Sets the interface_type of this Drive.
        Information about the I/O interface between the controller and the drive. For example, for a SCSI-attached drive, this field will contain information about the drive's channel and SCSI ID values. For other interface types, different data will be available in this field.

        :param interface_type: The interface_type of this Drive.
        :type: DriveTypeData
        """
        self._interface_type = interface_type

    @property
    def physical_location(self):
        """
        Gets the physical_location of this Drive.
        The physical location of the drive. Beginning with the Allegheny release, the parent reference in Location identifies the tray or drawer containing the drive, and the position field is the parent-relative/like-component relative slot number of the drive, starting at 1. For missing drives this field contains the last known location.

        :return: The physical_location of this Drive.
        :rtype: Location
        :required/optional: required
        """
        return self._physical_location

    @physical_location.setter
    def physical_location(self, physical_location):
        """
        Sets the physical_location of this Drive.
        The physical location of the drive. Beginning with the Allegheny release, the parent reference in Location identifies the tray or drawer containing the drive, and the position field is the parent-relative/like-component relative slot number of the drive, starting at 1. For missing drives this field contains the last known location.

        :param physical_location: The physical_location of this Drive.
        :type: Location
        """
        self._physical_location = physical_location

    @property
    def manufacturer(self):
        """
        Gets the manufacturer of this Drive.
        The variable-length ASCII text string that identifies the drive manufacturer. Note that this information is not returned for most Serial ATA (SATA) drives.

        :return: The manufacturer of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._manufacturer

    @manufacturer.setter
    def manufacturer(self, manufacturer):
        """
        Sets the manufacturer of this Drive.
        The variable-length ASCII text string that identifies the drive manufacturer. Note that this information is not returned for most Serial ATA (SATA) drives.

        :param manufacturer: The manufacturer of this Drive.
        :type: str
        """
        self._manufacturer = manufacturer

    @property
    def manufacturer_date(self):
        """
        Gets the manufacturer_date of this Drive.
        The date of manufacture of the drive, represented in seconds since midnight GMT on January 1, 1970. Note that this information is not returned for most Serial ATA (SATA) drives.

        :return: The manufacturer_date of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._manufacturer_date

    @manufacturer_date.setter
    def manufacturer_date(self, manufacturer_date):
        """
        Sets the manufacturer_date of this Drive.
        The date of manufacture of the drive, represented in seconds since midnight GMT on January 1, 1970. Note that this information is not returned for most Serial ATA (SATA) drives.

        :param manufacturer_date: The manufacturer_date of this Drive.
        :type: int
        """
        self._manufacturer_date = manufacturer_date

    @property
    def product_id(self):
        """
        Gets the product_id of this Drive.
        The variable-length ASCII text string that identifies the product by name, as assigned by the manufacturer.

        :return: The product_id of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._product_id

    @product_id.setter
    def product_id(self, product_id):
        """
        Sets the product_id of this Drive.
        The variable-length ASCII text string that identifies the product by name, as assigned by the manufacturer.

        :param product_id: The product_id of this Drive.
        :type: str
        """
        self._product_id = product_id

    @property
    def serial_number(self):
        """
        Gets the serial_number of this Drive.
        The variable-length ASCII text string for the serial number of the drive.

        :return: The serial_number of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._serial_number

    @serial_number.setter
    def serial_number(self, serial_number):
        """
        Sets the serial_number of this Drive.
        The variable-length ASCII text string for the serial number of the drive.

        :param serial_number: The serial_number of this Drive.
        :type: str
        """
        self._serial_number = serial_number

    @property
    def software_version(self):
        """
        Gets the software_version of this Drive.
        This data is a variable-length ASCII text string. If an interposer is present in front of SATA drives, the string identifies the version of the interposer package. In this case, the SATA drive firmware version can be found in the physicalDriveTypeData field. If an interposer is not present (always the case for Fibre Channel drives) this field describes the drive firmware version.

        :return: The software_version of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._software_version

    @software_version.setter
    def software_version(self, software_version):
        """
        Sets the software_version of this Drive.
        This data is a variable-length ASCII text string. If an interposer is present in front of SATA drives, the string identifies the version of the interposer package. In this case, the SATA drive firmware version can be found in the physicalDriveTypeData field. If an interposer is not present (always the case for Fibre Channel drives) this field describes the drive firmware version.

        :param software_version: The software_version of this Drive.
        :type: str
        """
        self._software_version = software_version

    @property
    def blk_size(self):
        """
        Gets the blk_size of this Drive.
        The block (i.e. sector) size used by the drive, represented in bytes. This field is valid for missing drives.

        :return: The blk_size of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._blk_size

    @blk_size.setter
    def blk_size(self, blk_size):
        """
        Sets the blk_size of this Drive.
        The block (i.e. sector) size used by the drive, represented in bytes. This field is valid for missing drives.

        :param blk_size: The blk_size of this Drive.
        :type: int
        """
        self._blk_size = blk_size

    @property
    def usable_capacity(self):
        """
        Gets the usable_capacity of this Drive.
        The usable capacity of the drive, in bytes, after accounting for any space that is reserved for use by the array controller for overhead information. This field is valid for missing drives.

        :return: The usable_capacity of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._usable_capacity

    @usable_capacity.setter
    def usable_capacity(self, usable_capacity):
        """
        Sets the usable_capacity of this Drive.
        The usable capacity of the drive, in bytes, after accounting for any space that is reserved for use by the array controller for overhead information. This field is valid for missing drives.

        :param usable_capacity: The usable_capacity of this Drive.
        :type: int
        """
        self._usable_capacity = usable_capacity

    @property
    def raw_capacity(self):
        """
        Gets the raw_capacity of this Drive.
        The raw capacity of the drive, in bytes. This field is valid for missing drives.

        :return: The raw_capacity of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._raw_capacity

    @raw_capacity.setter
    def raw_capacity(self, raw_capacity):
        """
        Sets the raw_capacity of this Drive.
        The raw capacity of the drive, in bytes. This field is valid for missing drives.

        :param raw_capacity: The raw_capacity of this Drive.
        :type: int
        """
        self._raw_capacity = raw_capacity

    @property
    def world_wide_name(self):
        """
        Gets the world_wide_name of this Drive.
        A variable-length, opaque field that contains the drive's world-wide name, or globally unique identifier value. This field is valid for missing drives.

        :return: The world_wide_name of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._world_wide_name

    @world_wide_name.setter
    def world_wide_name(self, world_wide_name):
        """
        Sets the world_wide_name of this Drive.
        A variable-length, opaque field that contains the drive's world-wide name, or globally unique identifier value. This field is valid for missing drives.

        :param world_wide_name: The world_wide_name of this Drive.
        :type: str
        """
        self._world_wide_name = world_wide_name

    @property
    def current_volume_group_ref(self):
        """
        Gets the current_volume_group_ref of this Drive.
        The reference value of the volume group, disk pool, or flash cache to which this drive is currently assigned. If a hot spare drive is actively sparing for a failed drive, this field will identify the volume group, disk pool, or flash cache that is using the hot spare drive. If the drive is not currently assigned, or is an idle hot spare, the reference value will be null. This field is valid for missing drives.

        :return: The current_volume_group_ref of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._current_volume_group_ref

    @current_volume_group_ref.setter
    def current_volume_group_ref(self, current_volume_group_ref):
        """
        Sets the current_volume_group_ref of this Drive.
        The reference value of the volume group, disk pool, or flash cache to which this drive is currently assigned. If a hot spare drive is actively sparing for a failed drive, this field will identify the volume group, disk pool, or flash cache that is using the hot spare drive. If the drive is not currently assigned, or is an idle hot spare, the reference value will be null. This field is valid for missing drives.

        :param current_volume_group_ref: The current_volume_group_ref of this Drive.
        :type: str
        """
        self._current_volume_group_ref = current_volume_group_ref

    @property
    def spared_for_drive_ref(self):
        """
        Gets the spared_for_drive_ref of this Drive.
        The reference value of the drive for which this drive is acting as a hot spare. This field is only used if the Drive object represents a global hot spare that is actively sparing for a failed drive. This field is valid for missing drives.

        :return: The spared_for_drive_ref of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._spared_for_drive_ref

    @spared_for_drive_ref.setter
    def spared_for_drive_ref(self, spared_for_drive_ref):
        """
        Sets the spared_for_drive_ref of this Drive.
        The reference value of the drive for which this drive is acting as a hot spare. This field is only used if the Drive object represents a global hot spare that is actively sparing for a failed drive. This field is valid for missing drives.

        :param spared_for_drive_ref: The spared_for_drive_ref of this Drive.
        :type: str
        """
        self._spared_for_drive_ref = spared_for_drive_ref

    @property
    def mirror_drive(self):
        """
        Gets the mirror_drive of this Drive.
        This field is only used if the Drive object represents a drive that is part of a RAID-1 volume group. It identifies the drive that is tied to this one for RAID-1 mirroring operations. This field is valid for missing drives.

        :return: The mirror_drive of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._mirror_drive

    @mirror_drive.setter
    def mirror_drive(self, mirror_drive):
        """
        Sets the mirror_drive of this Drive.
        This field is only used if the Drive object represents a drive that is part of a RAID-1 volume group. It identifies the drive that is tied to this one for RAID-1 mirroring operations. This field is valid for missing drives.

        :param mirror_drive: The mirror_drive of this Drive.
        :type: str
        """
        self._mirror_drive = mirror_drive

    @property
    def non_redundant_access(self):
        """
        Gets the non_redundant_access of this Drive.
        True if the drive does not have redundant access.

        :return: The non_redundant_access of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._non_redundant_access

    @non_redundant_access.setter
    def non_redundant_access(self, non_redundant_access):
        """
        Sets the non_redundant_access of this Drive.
        True if the drive does not have redundant access.

        :param non_redundant_access: The non_redundant_access of this Drive.
        :type: bool
        """
        self._non_redundant_access = non_redundant_access

    @property
    def working_channel(self):
        """
        Gets the working_channel of this Drive.
        The channel to the tray that is still operational (if nonRedundantAccess is True).

        :return: The working_channel of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._working_channel

    @working_channel.setter
    def working_channel(self, working_channel):
        """
        Sets the working_channel of this Drive.
        The channel to the tray that is still operational (if nonRedundantAccess is True).

        :param working_channel: The working_channel of this Drive.
        :type: int
        """
        self._working_channel = working_channel

    @property
    def volume_group_index(self):
        """
        Gets the volume_group_index of this Drive.
        The volume group index. This is the zero-relative position of the drive with respect to the stripe-ordering for the volume group. A value of -1 indicates that the drive does not belong to any group. This field is valid for missing drives.

        :return: The volume_group_index of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._volume_group_index

    @volume_group_index.setter
    def volume_group_index(self, volume_group_index):
        """
        Sets the volume_group_index of this Drive.
        The volume group index. This is the zero-relative position of the drive with respect to the stripe-ordering for the volume group. A value of -1 indicates that the drive does not belong to any group. This field is valid for missing drives.

        :param volume_group_index: The volume_group_index of this Drive.
        :type: int
        """
        self._volume_group_index = volume_group_index

    @property
    def current_speed(self):
        """
        Gets the current_speed of this Drive.
        The speed of the drive. Will be unknown for a SCSI drive.

        :return: The current_speed of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._current_speed

    @current_speed.setter
    def current_speed(self, current_speed):
        """
        Sets the current_speed of this Drive.
        The speed of the drive. Will be unknown for a SCSI drive.

        :param current_speed: The current_speed of this Drive.
        :type: str
        """
        allowed_values = ["speedUnknown", "speed1gig", "speed2gig", "speed4gig", "speed10gig", "speed15gig", "speed3gig", "speed10meg", "speed100meg", "speed2pt5Gig", "speed5gig", "speed20gig", "speed30gig", "speed60gig", "speed8gig", "speed6gig", "speed40gig", "speed16gig", "speed56gig", "speed12gig", "__UNDEFINED"]
        if current_speed not in allowed_values:
            raise ValueError(
                "Invalid value for `current_speed`, must be one of {0}"
                .format(allowed_values)
            )
        self._current_speed = current_speed

    @property
    def max_speed(self):
        """
        Gets the max_speed of this Drive.
        The maximum speed of the drive. Currently not used.

        :return: The max_speed of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._max_speed

    @max_speed.setter
    def max_speed(self, max_speed):
        """
        Sets the max_speed of this Drive.
        The maximum speed of the drive. Currently not used.

        :param max_speed: The max_speed of this Drive.
        :type: str
        """
        allowed_values = ["speedUnknown", "speed1gig", "speed2gig", "speed4gig", "speed10gig", "speed15gig", "speed3gig", "speed10meg", "speed100meg", "speed2pt5Gig", "speed5gig", "speed20gig", "speed30gig", "speed60gig", "speed8gig", "speed6gig", "speed40gig", "speed16gig", "speed56gig", "speed12gig", "__UNDEFINED"]
        if max_speed not in allowed_values:
            raise ValueError(
                "Invalid value for `max_speed`, must be one of {0}"
                .format(allowed_values)
            )
        self._max_speed = max_speed

    @property
    def uncertified(self):
        """
        Gets the uncertified of this Drive.
        True, if the drive has the DR_UNCERTIFIED flag set. This field is valid for missing drives.

        :return: The uncertified of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._uncertified

    @uncertified.setter
    def uncertified(self, uncertified):
        """
        Sets the uncertified of this Drive.
        True, if the drive has the DR_UNCERTIFIED flag set. This field is valid for missing drives.

        :param uncertified: The uncertified of this Drive.
        :type: bool
        """
        self._uncertified = uncertified

    @property
    def has_degraded_channel(self):
        """
        Gets the has_degraded_channel of this Drive.
        True, if a path to this drive is degraded.

        :return: The has_degraded_channel of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._has_degraded_channel

    @has_degraded_channel.setter
    def has_degraded_channel(self, has_degraded_channel):
        """
        Sets the has_degraded_channel of this Drive.
        True, if a path to this drive is degraded.

        :param has_degraded_channel: The has_degraded_channel of this Drive.
        :type: bool
        """
        self._has_degraded_channel = has_degraded_channel

    @property
    def degraded_channels(self):
        """
        Gets the degraded_channels of this Drive.
        The IDs of degraded channels.

        :return: The degraded_channels of this Drive.
        :rtype: list[int]
        :required/optional: required
        """
        return self._degraded_channels

    @degraded_channels.setter
    def degraded_channels(self, degraded_channels):
        """
        Sets the degraded_channels of this Drive.
        The IDs of degraded channels.

        :param degraded_channels: The degraded_channels of this Drive.
        :type: list[int]
        """
        self._degraded_channels = degraded_channels

    @property
    def phy_drive_type(self):
        """
        Gets the phy_drive_type of this Drive.
        The physical drive type.

        :return: The phy_drive_type of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._phy_drive_type

    @phy_drive_type.setter
    def phy_drive_type(self, phy_drive_type):
        """
        Sets the phy_drive_type of this Drive.
        The physical drive type.

        :param phy_drive_type: The phy_drive_type of this Drive.
        :type: str
        """
        allowed_values = ["all", "scsi", "fibre", "sata", "pata", "fibre520b", "sas", "unknown", "sas4k", "__UNDEFINED"]
        if phy_drive_type not in allowed_values:
            raise ValueError(
                "Invalid value for `phy_drive_type`, must be one of {0}"
                .format(allowed_values)
            )
        self._phy_drive_type = phy_drive_type

    @property
    def spindle_speed(self):
        """
        Gets the spindle_speed of this Drive.
        The drive reported spindle speed. Solid State Disk (SSD) drives report zero.

        :return: The spindle_speed of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._spindle_speed

    @spindle_speed.setter
    def spindle_speed(self, spindle_speed):
        """
        Sets the spindle_speed of this Drive.
        The drive reported spindle speed. Solid State Disk (SSD) drives report zero.

        :param spindle_speed: The spindle_speed of this Drive.
        :type: int
        """
        self._spindle_speed = spindle_speed

    @property
    def rtr_attributes(self):
        """
        Gets the rtr_attributes of this Drive.
        The CRU type of the drive plus its ready-to-remove attributes, which are based on the CRU type.

        :return: The rtr_attributes of this Drive.
        :rtype: RTRAttributes
        :required/optional: required
        """
        return self._rtr_attributes

    @rtr_attributes.setter
    def rtr_attributes(self, rtr_attributes):
        """
        Sets the rtr_attributes of this Drive.
        The CRU type of the drive plus its ready-to-remove attributes, which are based on the CRU type.

        :param rtr_attributes: The rtr_attributes of this Drive.
        :type: RTRAttributes
        """
        self._rtr_attributes = rtr_attributes

    @property
    def reserved(self):
        """
        Gets the reserved of this Drive.
        reserved.

        :return: The reserved of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._reserved

    @reserved.setter
    def reserved(self, reserved):
        """
        Sets the reserved of this Drive.
        reserved.

        :param reserved: The reserved of this Drive.
        :type: str
        """
        self._reserved = reserved

    @property
    def phy_drive_type_data(self):
        """
        Gets the phy_drive_type_data of this Drive.
        Information specific to a physical drive type.

        :return: The phy_drive_type_data of this Drive.
        :rtype: PhysicalDriveTypeData
        :required/optional: required
        """
        return self._phy_drive_type_data

    @phy_drive_type_data.setter
    def phy_drive_type_data(self, phy_drive_type_data):
        """
        Sets the phy_drive_type_data of this Drive.
        Information specific to a physical drive type.

        :param phy_drive_type_data: The phy_drive_type_data of this Drive.
        :type: PhysicalDriveTypeData
        """
        self._phy_drive_type_data = phy_drive_type_data

    @property
    def pfa_reason(self):
        """
        Gets the pfa_reason of this Drive.
        The reason a PFA condition has been raised for this drive.

        :return: The pfa_reason of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._pfa_reason

    @pfa_reason.setter
    def pfa_reason(self, pfa_reason):
        """
        Sets the pfa_reason of this Drive.
        The reason a PFA condition has been raised for this drive.

        :param pfa_reason: The pfa_reason of this Drive.
        :type: str
        """
        allowed_values = ["unknown", "none", "driveReported", "synthesized", "ssdEndOfLife", "__UNDEFINED"]
        if pfa_reason not in allowed_values:
            raise ValueError(
                "Invalid value for `pfa_reason`, must be one of {0}"
                .format(allowed_values)
            )
        self._pfa_reason = pfa_reason

    @property
    def bypass_source(self):
        """
        Gets the bypass_source of this Drive.
        A list of object references where each reference identifies the source of a drive bypass condition. Possible referenced objects include the drive itself, a controller, or the ESM(s). When the bypass source is a controller or the drive, the list will typically hold just one reference; when the bypass source is the ESM(s), the list can hold up to two references, indicating either one or both ESMs. The list normally holds valid data whenever the drive is in the bypassed state (DRIVE_STAT_BYPASSED) , however it may be empty if the source of the bypass is unknown. It is also possible for the list to hold valid data when the drive is optimal, if only one ESM has bypassed the drive.

        :return: The bypass_source of this Drive.
        :rtype: list[ObjectReference]
        :required/optional: required
        """
        return self._bypass_source

    @bypass_source.setter
    def bypass_source(self, bypass_source):
        """
        Sets the bypass_source of this Drive.
        A list of object references where each reference identifies the source of a drive bypass condition. Possible referenced objects include the drive itself, a controller, or the ESM(s). When the bypass source is a controller or the drive, the list will typically hold just one reference; when the bypass source is the ESM(s), the list can hold up to two references, indicating either one or both ESMs. The list normally holds valid data whenever the drive is in the bypassed state (DRIVE_STAT_BYPASSED) , however it may be empty if the source of the bypass is unknown. It is also possible for the list to hold valid data when the drive is optimal, if only one ESM has bypassed the drive.

        :param bypass_source: The bypass_source of this Drive.
        :type: list[ObjectReference]
        """
        self._bypass_source = bypass_source

    @property
    def repair_policy(self):
        """
        Gets the repair_policy of this Drive.
        This field contains the repair policy for the Drive.

        :return: The repair_policy of this Drive.
        :rtype: RepairPolicy
        :required/optional: required
        """
        return self._repair_policy

    @repair_policy.setter
    def repair_policy(self, repair_policy):
        """
        Sets the repair_policy of this Drive.
        This field contains the repair policy for the Drive.

        :param repair_policy: The repair_policy of this Drive.
        :type: RepairPolicy
        """
        self._repair_policy = repair_policy

    @property
    def fde_capable(self):
        """
        Gets the fde_capable of this Drive.
        True if the drive supports FDE, false otherwise

        :return: The fde_capable of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._fde_capable

    @fde_capable.setter
    def fde_capable(self, fde_capable):
        """
        Sets the fde_capable of this Drive.
        True if the drive supports FDE, false otherwise

        :param fde_capable: The fde_capable of this Drive.
        :type: bool
        """
        self._fde_capable = fde_capable

    @property
    def fde_enabled(self):
        """
        Gets the fde_enabled of this Drive.
        true if drive security is enabled; false if disabled

        :return: The fde_enabled of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._fde_enabled

    @fde_enabled.setter
    def fde_enabled(self, fde_enabled):
        """
        Sets the fde_enabled of this Drive.
        true if drive security is enabled; false if disabled

        :param fde_enabled: The fde_enabled of this Drive.
        :type: bool
        """
        self._fde_enabled = fde_enabled

    @property
    def fde_locked(self):
        """
        Gets the fde_locked of this Drive.
        True if the drive is locked, false if the drive is unlocked

        :return: The fde_locked of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._fde_locked

    @fde_locked.setter
    def fde_locked(self, fde_locked):
        """
        Sets the fde_locked of this Drive.
        True if the drive is locked, false if the drive is unlocked

        :param fde_locked: The fde_locked of this Drive.
        :type: bool
        """
        self._fde_locked = fde_locked

    @property
    def lock_key_id(self):
        """
        Gets the lock_key_id of this Drive.
        The lock key ID as read from the drive.

        :return: The lock_key_id of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._lock_key_id

    @lock_key_id.setter
    def lock_key_id(self, lock_key_id):
        """
        Sets the lock_key_id of this Drive.
        The lock key ID as read from the drive.

        :param lock_key_id: The lock_key_id of this Drive.
        :type: str
        """
        self._lock_key_id = lock_key_id

    @property
    def ssd_wear_life(self):
        """
        Gets the ssd_wear_life of this Drive.
        Contains wear life data for the SSD drive.

        :return: The ssd_wear_life of this Drive.
        :rtype: SSDWearLife
        :required/optional: required
        """
        return self._ssd_wear_life

    @ssd_wear_life.setter
    def ssd_wear_life(self, ssd_wear_life):
        """
        Sets the ssd_wear_life of this Drive.
        Contains wear life data for the SSD drive.

        :param ssd_wear_life: The ssd_wear_life of this Drive.
        :type: SSDWearLife
        """
        self._ssd_wear_life = ssd_wear_life

    @property
    def drive_media_type(self):
        """
        Gets the drive_media_type of this Drive.
        This field is set to the drive media type of the drive.

        :return: The drive_media_type of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._drive_media_type

    @drive_media_type.setter
    def drive_media_type(self, drive_media_type):
        """
        Sets the drive_media_type of this Drive.
        This field is set to the drive media type of the drive.

        :param drive_media_type: The drive_media_type of this Drive.
        :type: str
        """
        allowed_values = ["all", "unknown", "hdd", "ssd", "__UNDEFINED"]
        if drive_media_type not in allowed_values:
            raise ValueError(
                "Invalid value for `drive_media_type`, must be one of {0}"
                .format(allowed_values)
            )
        self._drive_media_type = drive_media_type

    @property
    def fpga_version(self):
        """
        Gets the fpga_version of this Drive.
        This data is a variable-length ASCII text string that identifies the version of the FPGA package.

        :return: The fpga_version of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._fpga_version

    @fpga_version.setter
    def fpga_version(self, fpga_version):
        """
        Sets the fpga_version of this Drive.
        This data is a variable-length ASCII text string that identifies the version of the FPGA package.

        :param fpga_version: The fpga_version of this Drive.
        :type: str
        """
        self._fpga_version = fpga_version

    @property
    def protection_information_capabilities(self):
        """
        Gets the protection_information_capabilities of this Drive.
        This structure contains a protectionInformationCapable field which is set to true when the drive is formatted to support type 2 protection with a 512-byte logical block size, or if the drive is a type 0 drive formatted with a 520-byte logical block size. It also contains a field that is set to the protection type provided for the drive.

        :return: The protection_information_capabilities of this Drive.
        :rtype: ProtectionInformationCapabilities
        :required/optional: required
        """
        return self._protection_information_capabilities

    @protection_information_capabilities.setter
    def protection_information_capabilities(self, protection_information_capabilities):
        """
        Sets the protection_information_capabilities of this Drive.
        This structure contains a protectionInformationCapable field which is set to true when the drive is formatted to support type 2 protection with a 512-byte logical block size, or if the drive is a type 0 drive formatted with a 520-byte logical block size. It also contains a field that is set to the protection type provided for the drive.

        :param protection_information_capabilities: The protection_information_capabilities of this Drive.
        :type: ProtectionInformationCapabilities
        """
        self._protection_information_capabilities = protection_information_capabilities

    @property
    def protection_information_capable(self):
        """
        Gets the protection_information_capable of this Drive.
        Field is no longer used.

        :return: The protection_information_capable of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._protection_information_capable

    @protection_information_capable.setter
    def protection_information_capable(self, protection_information_capable):
        """
        Sets the protection_information_capable of this Drive.
        Field is no longer used.

        :param protection_information_capable: The protection_information_capable of this Drive.
        :type: bool
        """
        self._protection_information_capable = protection_information_capable

    @property
    def protection_type(self):
        """
        Gets the protection_type of this Drive.
        Field is no longer used.

        :return: The protection_type of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._protection_type

    @protection_type.setter
    def protection_type(self, protection_type):
        """
        Sets the protection_type of this Drive.
        Field is no longer used.

        :param protection_type: The protection_type of this Drive.
        :type: str
        """
        allowed_values = ["type0Protection", "type1Protection", "type2Protection", "type3Protection", "__UNDEFINED"]
        if protection_type not in allowed_values:
            raise ValueError(
                "Invalid value for `protection_type`, must be one of {0}"
                .format(allowed_values)
            )
        self._protection_type = protection_type

    @property
    def interposer_present(self):
        """
        Gets the interposer_present of this Drive.
        A value of true for this property means the drive is behind an interposer.

        :return: The interposer_present of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._interposer_present

    @interposer_present.setter
    def interposer_present(self, interposer_present):
        """
        Sets the interposer_present of this Drive.
        A value of true for this property means the drive is behind an interposer.

        :param interposer_present: The interposer_present of this Drive.
        :type: bool
        """
        self._interposer_present = interposer_present

    @property
    def interposer_ref(self):
        """
        Gets the interposer_ref of this Drive.
        The drive interposer identifier. This field is valid only if the interposerPresent field is set to True.

        :return: The interposer_ref of this Drive.
        :rtype: str
        :required/optional: required
        """
        return self._interposer_ref

    @interposer_ref.setter
    def interposer_ref(self, interposer_ref):
        """
        Sets the interposer_ref of this Drive.
        The drive interposer identifier. This field is valid only if the interposerPresent field is set to True.

        :param interposer_ref: The interposer_ref of this Drive.
        :type: str
        """
        self._interposer_ref = interposer_ref

    @property
    def current_command_aging_timeout(self):
        """
        Gets the current_command_aging_timeout of this Drive.
        The current command aging timeout value in hundreds of milliseconds. If this value is 0 the default command aging timeout value will be used, otherwise this value overrides the default value.

        :return: The current_command_aging_timeout of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._current_command_aging_timeout

    @current_command_aging_timeout.setter
    def current_command_aging_timeout(self, current_command_aging_timeout):
        """
        Sets the current_command_aging_timeout of this Drive.
        The current command aging timeout value in hundreds of milliseconds. If this value is 0 the default command aging timeout value will be used, otherwise this value overrides the default value.

        :param current_command_aging_timeout: The current_command_aging_timeout of this Drive.
        :type: int
        """
        self._current_command_aging_timeout = current_command_aging_timeout

    @property
    def default_command_aging_timeout(self):
        """
        Gets the default_command_aging_timeout of this Drive.
        The default command aging timeout value in hundreds of milliseconds as specified by the drive. If this value is 0, the drive command aging timeout cannot be changed.

        :return: The default_command_aging_timeout of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._default_command_aging_timeout

    @default_command_aging_timeout.setter
    def default_command_aging_timeout(self, default_command_aging_timeout):
        """
        Sets the default_command_aging_timeout of this Drive.
        The default command aging timeout value in hundreds of milliseconds as specified by the drive. If this value is 0, the drive command aging timeout cannot be changed.

        :param default_command_aging_timeout: The default_command_aging_timeout of this Drive.
        :type: int
        """
        self._default_command_aging_timeout = default_command_aging_timeout

    @property
    def drive_temperature(self):
        """
        Gets the drive_temperature of this Drive.
        Drive temperature data.

        :return: The drive_temperature of this Drive.
        :rtype: DriveTemperature
        :required/optional: required
        """
        return self._drive_temperature

    @drive_temperature.setter
    def drive_temperature(self, drive_temperature):
        """
        Sets the drive_temperature of this Drive.
        Drive temperature data.

        :param drive_temperature: The drive_temperature of this Drive.
        :type: DriveTemperature
        """
        self._drive_temperature = drive_temperature

    @property
    def blk_size_physical(self):
        """
        Gets the blk_size_physical of this Drive.
        The physical block (i.e., sector) size for the drive, represented in bytes. This field is valid for missing drives.

        :return: The blk_size_physical of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._blk_size_physical

    @blk_size_physical.setter
    def blk_size_physical(self, blk_size_physical):
        """
        Sets the blk_size_physical of this Drive.
        The physical block (i.e., sector) size for the drive, represented in bytes. This field is valid for missing drives.

        :param blk_size_physical: The blk_size_physical of this Drive.
        :type: int
        """
        self._blk_size_physical = blk_size_physical

    @property
    def lowest_aligned_lba(self):
        """
        Gets the lowest_aligned_lba of this Drive.
        The lowest aligned LBA for the physical sector. Typically this will be 0, but could be non-zero for emulation drives where LBA 0 starts at some logical sector offset within the physical sector.

        :return: The lowest_aligned_lba of this Drive.
        :rtype: int
        :required/optional: required
        """
        return self._lowest_aligned_lba

    @lowest_aligned_lba.setter
    def lowest_aligned_lba(self, lowest_aligned_lba):
        """
        Sets the lowest_aligned_lba of this Drive.
        The lowest aligned LBA for the physical sector. Typically this will be 0, but could be non-zero for emulation drives where LBA 0 starts at some logical sector offset within the physical sector.

        :param lowest_aligned_lba: The lowest_aligned_lba of this Drive.
        :type: int
        """
        self._lowest_aligned_lba = lowest_aligned_lba

    @property
    def removed(self):
        """
        Gets the removed of this Drive.
        True if the drive is in the process of being removed from the volume group. Only applies to Disk Pools

        :return: The removed of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._removed

    @removed.setter
    def removed(self, removed):
        """
        Sets the removed of this Drive.
        True if the drive is in the process of being removed from the volume group. Only applies to Disk Pools

        :param removed: The removed of this Drive.
        :type: bool
        """
        self._removed = removed

    @property
    def locate_in_progress(self):
        """
        Gets the locate_in_progress of this Drive.
        Indicates that a locate operation for the device is currently active. The device will show a visual indication to aid an operator in locating the drive.

        :return: The locate_in_progress of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._locate_in_progress

    @locate_in_progress.setter
    def locate_in_progress(self, locate_in_progress):
        """
        Sets the locate_in_progress of this Drive.
        Indicates that a locate operation for the device is currently active. The device will show a visual indication to aid an operator in locating the drive.

        :param locate_in_progress: The locate_in_progress of this Drive.
        :type: bool
        """
        self._locate_in_progress = locate_in_progress

    @property
    def fips_capable(self):
        """
        Gets the fips_capable of this Drive.
        This flag is true if the drive supports FIPS (Federal Information Processing Standard). FIPS 140-2 specification.

        :return: The fips_capable of this Drive.
        :rtype: bool
        :required/optional: required
        """
        return self._fips_capable

    @fips_capable.setter
    def fips_capable(self, fips_capable):
        """
        Sets the fips_capable of this Drive.
        This flag is true if the drive supports FIPS (Federal Information Processing Standard). FIPS 140-2 specification.

        :param fips_capable: The fips_capable of this Drive.
        :type: bool
        """
        self._fips_capable = fips_capable

    @property
    def id(self):
        """
        Gets the id of this Drive.


        :return: The id of this Drive.
        :rtype: str
        :required/optional: optional
        """
        return self._id

    @id.setter
    def id(self, id):
        """
        Sets the id of this Drive.


        :param id: The id of this Drive.
        :type: str
        """
        self._id = id

    def to_dict(self):
        """
        Returns the model properties as a dict
        """
        result = {}

        for attr, _ in iteritems(self.swagger_types):
            value = getattr(self, attr)
            if isinstance(value, list):
                result[attr] = list(map(
                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
                    value
                ))
            elif hasattr(value, "to_dict"):
                result[attr] = value.to_dict()
            elif isinstance(value, dict):
                result[attr] = dict(map(
                    lambda item: (item[0], item[1].to_dict())
                    if hasattr(item[1], "to_dict") else item,
                    value.items()
                ))
            else:
                result[attr] = value

        return result

    def to_str(self):
        """
        Returns the string representation of the model
        """
        return pformat(self.to_dict())

    def __repr__(self):
        """
        For `print` and `pprint`
        """
        if self is None:
           return None
        return self.to_str()

    def __eq__(self, other):
        """
        Returns true if both objects are equal
        """
        if self is None or other is None:
            return None
        return self.__dict__ == other.__dict__

    def __ne__(self, other):
        """
        Returns true if both objects are not equal
        """
        return not self == other

