# coding: utf-8

"""
FeatureParams.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 FeatureParams(object):
    """
    NOTE: This class is auto generated by the swagger code generator program.
    Do not edit the class manually.
    """
    def __init__(self):
        """
        FeatureParams - 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 = {
            'max_hot_spares': 'int',  # (required parameter)
            'cache_block_sizes': 'list[int]',  # (required parameter)
            'max_dce_drives': 'int',  # (required parameter)
            'max_read_ahead_multiplier': 'int',  # (required parameter)
            'min_media_scan_period': 'int',  # (required parameter)
            'max_media_scan_period': 'int',  # (required parameter)
            'supported_seg_sizes': 'list[int]',  # (required parameter)
            'num_standard_seg_sizes': 'int',  # (required parameter)
            'seg_transitions': 'list[str]',  # (required parameter)
            'mappable_lun_count': 'int',  # (required parameter)
            'max_partition_count': 'int',  # (required parameter)
            'max_mappings_per_volume': 'int',  # (required parameter)
            'max_volumes': 'int',  # (required parameter)
            'max_snapshots': 'int',  # (required parameter)
            'max_snapshots_per_base': 'int',  # (required parameter)
            'min_repository_size': 'int',  # (required parameter)
            'max_mirrors': 'int',  # (required parameter)
            'max_vol_copys': 'int',  # (required parameter)
            'max_concurrent_background_copys': 'int',  # (required parameter)
            'max_utm_lun_value': 'int',  # (required parameter)
            'reserved1': 'str',  
            'reserved2': 'str',  
            'battery_not_in_configuration': 'bool',  # (required parameter)
            'supported_drive_types': 'list[str]',  # (required parameter)
            'current_max_mirrors': 'int',  # (required parameter)
            'max_volumes_per_group': 'int',  # (required parameter)
            'max_drive_download_files': 'int',  # (required parameter)
            'max_mgmt_client_records': 'int',  # (required parameter)
            'max_mgmt_client_record_size': 'int',  # (required parameter)
            'redundancy_mode': 'str',  # (required parameter)
            'max_expansion_drive_trays': 'int',  # (required parameter)
            'supported_auth_methods': 'list[str]',  # (required parameter)
            'max_iscsi_ipv6_local_addresses_per_port': 'int',  # (required parameter)
            'max_iscsi_ipv6_routable_addresses_per_port': 'int',  # (required parameter)
            'absolute_max_dss_segment_size': 'int',  # (required parameter)
            'smart_battery_technology': 'bool',  # (required parameter)
            'write_caching_enabled_during_learn_cycle': 'bool',  # (required parameter)
            'max_ss_ds_supported': 'int',  # (required parameter)
            'ssd_interface_type_mixing_supported': 'bool',  # (required parameter)
            'max_drive_slots': 'int',  # (required parameter)
            'supported_protection_types': 'list[str]',  # (required parameter)
            'supported_event_priorities': 'list[str]',  # (required parameter)
            'max_flash_cache_size': 'int',  # (required parameter)
            'default_media_scan_period': 'int'
        }

        self.attribute_map = {
            'max_hot_spares': 'maxHotSpares',  # (required parameter)
            'cache_block_sizes': 'cacheBlockSizes',  # (required parameter)
            'max_dce_drives': 'maxDCEDrives',  # (required parameter)
            'max_read_ahead_multiplier': 'maxReadAheadMultiplier',  # (required parameter)
            'min_media_scan_period': 'minMediaScanPeriod',  # (required parameter)
            'max_media_scan_period': 'maxMediaScanPeriod',  # (required parameter)
            'supported_seg_sizes': 'supportedSegSizes',  # (required parameter)
            'num_standard_seg_sizes': 'numStandardSegSizes',  # (required parameter)
            'seg_transitions': 'segTransitions',  # (required parameter)
            'mappable_lun_count': 'mappableLUNCount',  # (required parameter)
            'max_partition_count': 'maxPartitionCount',  # (required parameter)
            'max_mappings_per_volume': 'maxMappingsPerVolume',  # (required parameter)
            'max_volumes': 'maxVolumes',  # (required parameter)
            'max_snapshots': 'maxSnapshots',  # (required parameter)
            'max_snapshots_per_base': 'maxSnapshotsPerBase',  # (required parameter)
            'min_repository_size': 'minRepositorySize',  # (required parameter)
            'max_mirrors': 'maxMirrors',  # (required parameter)
            'max_vol_copys': 'maxVolCopys',  # (required parameter)
            'max_concurrent_background_copys': 'maxConcurrentBackgroundCopys',  # (required parameter)
            'max_utm_lun_value': 'maxUtmLunValue',  # (required parameter)
            'reserved1': 'reserved1',  
            'reserved2': 'reserved2',  
            'battery_not_in_configuration': 'battery_not_in_configuration',  # (required parameter)
            'supported_drive_types': 'supportedDriveTypes',  # (required parameter)
            'current_max_mirrors': 'currentMaxMirrors',  # (required parameter)
            'max_volumes_per_group': 'maxVolumesPerGroup',  # (required parameter)
            'max_drive_download_files': 'maxDriveDownloadFiles',  # (required parameter)
            'max_mgmt_client_records': 'maxMgmtClientRecords',  # (required parameter)
            'max_mgmt_client_record_size': 'maxMgmtClientRecordSize',  # (required parameter)
            'redundancy_mode': 'redundancyMode',  # (required parameter)
            'max_expansion_drive_trays': 'maxExpansionDriveTrays',  # (required parameter)
            'supported_auth_methods': 'supportedAuthMethods',  # (required parameter)
            'max_iscsi_ipv6_local_addresses_per_port': 'maxIscsiIpv6LocalAddressesPerPort',  # (required parameter)
            'max_iscsi_ipv6_routable_addresses_per_port': 'maxIscsiIpv6RoutableAddressesPerPort',  # (required parameter)
            'absolute_max_dss_segment_size': 'absoluteMaxDssSegmentSize',  # (required parameter)
            'smart_battery_technology': 'smartBatteryTechnology',  # (required parameter)
            'write_caching_enabled_during_learn_cycle': 'writeCachingEnabledDuringLearnCycle',  # (required parameter)
            'max_ss_ds_supported': 'maxSSDsSupported',  # (required parameter)
            'ssd_interface_type_mixing_supported': 'ssdInterfaceTypeMixingSupported',  # (required parameter)
            'max_drive_slots': 'maxDriveSlots',  # (required parameter)
            'supported_protection_types': 'supportedProtectionTypes',  # (required parameter)
            'supported_event_priorities': 'supportedEventPriorities',  # (required parameter)
            'max_flash_cache_size': 'maxFlashCacheSize',  # (required parameter)
            'default_media_scan_period': 'defaultMediaScanPeriod'
        }

        self._max_hot_spares = None
        self._cache_block_sizes = None
        self._max_dce_drives = None
        self._max_read_ahead_multiplier = None
        self._min_media_scan_period = None
        self._max_media_scan_period = None
        self._supported_seg_sizes = None
        self._num_standard_seg_sizes = None
        self._seg_transitions = None
        self._mappable_lun_count = None
        self._max_partition_count = None
        self._max_mappings_per_volume = None
        self._max_volumes = None
        self._max_snapshots = None
        self._max_snapshots_per_base = None
        self._min_repository_size = None
        self._max_mirrors = None
        self._max_vol_copys = None
        self._max_concurrent_background_copys = None
        self._max_utm_lun_value = None
        self._reserved1 = None
        self._reserved2 = None
        self._battery_not_in_configuration = None
        self._supported_drive_types = None
        self._current_max_mirrors = None
        self._max_volumes_per_group = None
        self._max_drive_download_files = None
        self._max_mgmt_client_records = None
        self._max_mgmt_client_record_size = None
        self._redundancy_mode = None
        self._max_expansion_drive_trays = None
        self._supported_auth_methods = None
        self._max_iscsi_ipv6_local_addresses_per_port = None
        self._max_iscsi_ipv6_routable_addresses_per_port = None
        self._absolute_max_dss_segment_size = None
        self._smart_battery_technology = None
        self._write_caching_enabled_during_learn_cycle = None
        self._max_ss_ds_supported = None
        self._ssd_interface_type_mixing_supported = None
        self._max_drive_slots = None
        self._supported_protection_types = None
        self._supported_event_priorities = None
        self._max_flash_cache_size = None
        self._default_media_scan_period = None

    @property
    def max_hot_spares(self):
        """
        Gets the max_hot_spares of this FeatureParams.
        The maximum number of hot spare drives that can be assigned. If the value in this field is '0xFFFFFFFF' it means there is no limit to the number of hot spares.

        :return: The max_hot_spares of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_hot_spares

    @max_hot_spares.setter
    def max_hot_spares(self, max_hot_spares):
        """
        Sets the max_hot_spares of this FeatureParams.
        The maximum number of hot spare drives that can be assigned. If the value in this field is '0xFFFFFFFF' it means there is no limit to the number of hot spares.

        :param max_hot_spares: The max_hot_spares of this FeatureParams.
        :type: int
        """
        self._max_hot_spares = max_hot_spares

    @property
    def cache_block_sizes(self):
        """
        Gets the cache_block_sizes of this FeatureParams.
        A variable-length array in which each element specifies one of the supported cache block sizes that can be set on the controller. Cache block sizes are reported in bytes.

        :return: The cache_block_sizes of this FeatureParams.
        :rtype: list[int]
        :required/optional: required
        """
        return self._cache_block_sizes

    @cache_block_sizes.setter
    def cache_block_sizes(self, cache_block_sizes):
        """
        Sets the cache_block_sizes of this FeatureParams.
        A variable-length array in which each element specifies one of the supported cache block sizes that can be set on the controller. Cache block sizes are reported in bytes.

        :param cache_block_sizes: The cache_block_sizes of this FeatureParams.
        :type: list[int]
        """
        self._cache_block_sizes = cache_block_sizes

    @property
    def max_dce_drives(self):
        """
        Gets the max_dce_drives of this FeatureParams.
        The maximum number of drives that can be added, in a given operation, to an existing volume group to expand the capacity of the volume group.

        :return: The max_dce_drives of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_dce_drives

    @max_dce_drives.setter
    def max_dce_drives(self, max_dce_drives):
        """
        Sets the max_dce_drives of this FeatureParams.
        The maximum number of drives that can be added, in a given operation, to an existing volume group to expand the capacity of the volume group.

        :param max_dce_drives: The max_dce_drives of this FeatureParams.
        :type: int
        """
        self._max_dce_drives = max_dce_drives

    @property
    def max_read_ahead_multiplier(self):
        """
        Gets the max_read_ahead_multiplier of this FeatureParams.
        The maximum multiplier value that can be specified when configuring cache the read-ahead parameter for a volume. (Realize, however, that the volume read-ahead parameter is no longer treated as a quantify, but as a simple on (non-zero) / off (zero) indicator.

        :return: The max_read_ahead_multiplier of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_read_ahead_multiplier

    @max_read_ahead_multiplier.setter
    def max_read_ahead_multiplier(self, max_read_ahead_multiplier):
        """
        Sets the max_read_ahead_multiplier of this FeatureParams.
        The maximum multiplier value that can be specified when configuring cache the read-ahead parameter for a volume. (Realize, however, that the volume read-ahead parameter is no longer treated as a quantify, but as a simple on (non-zero) / off (zero) indicator.

        :param max_read_ahead_multiplier: The max_read_ahead_multiplier of this FeatureParams.
        :type: int
        """
        self._max_read_ahead_multiplier = max_read_ahead_multiplier

    @property
    def min_media_scan_period(self):
        """
        Gets the min_media_scan_period of this FeatureParams.
        The minimum supported period over which a complete media scan can be set to occur (measured in days).

        :return: The min_media_scan_period of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._min_media_scan_period

    @min_media_scan_period.setter
    def min_media_scan_period(self, min_media_scan_period):
        """
        Sets the min_media_scan_period of this FeatureParams.
        The minimum supported period over which a complete media scan can be set to occur (measured in days).

        :param min_media_scan_period: The min_media_scan_period of this FeatureParams.
        :type: int
        """
        self._min_media_scan_period = min_media_scan_period

    @property
    def max_media_scan_period(self):
        """
        Gets the max_media_scan_period of this FeatureParams.
        The maximum supported period over which a complete media scan can be set to occur (measured in days).

        :return: The max_media_scan_period of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_media_scan_period

    @max_media_scan_period.setter
    def max_media_scan_period(self, max_media_scan_period):
        """
        Sets the max_media_scan_period of this FeatureParams.
        The maximum supported period over which a complete media scan can be set to occur (measured in days).

        :param max_media_scan_period: The max_media_scan_period of this FeatureParams.
        :type: int
        """
        self._max_media_scan_period = max_media_scan_period

    @property
    def supported_seg_sizes(self):
        """
        Gets the supported_seg_sizes of this FeatureParams.
        A variable-length array in which each element specifies one of the supported segment size values, in bytes. This array should be consulted prior to attempting to create a volume modify a volume's segment size via the startVolumeSegmentSizing procedure.

        :return: The supported_seg_sizes of this FeatureParams.
        :rtype: list[int]
        :required/optional: required
        """
        return self._supported_seg_sizes

    @supported_seg_sizes.setter
    def supported_seg_sizes(self, supported_seg_sizes):
        """
        Sets the supported_seg_sizes of this FeatureParams.
        A variable-length array in which each element specifies one of the supported segment size values, in bytes. This array should be consulted prior to attempting to create a volume modify a volume's segment size via the startVolumeSegmentSizing procedure.

        :param supported_seg_sizes: The supported_seg_sizes of this FeatureParams.
        :type: list[int]
        """
        self._supported_seg_sizes = supported_seg_sizes

    @property
    def num_standard_seg_sizes(self):
        """
        Gets the num_standard_seg_sizes of this FeatureParams.
        The number of standard segment size values (at beginning of list).

        :return: The num_standard_seg_sizes of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._num_standard_seg_sizes

    @num_standard_seg_sizes.setter
    def num_standard_seg_sizes(self, num_standard_seg_sizes):
        """
        Sets the num_standard_seg_sizes of this FeatureParams.
        The number of standard segment size values (at beginning of list).

        :param num_standard_seg_sizes: The num_standard_seg_sizes of this FeatureParams.
        :type: int
        """
        self._num_standard_seg_sizes = num_standard_seg_sizes

    @property
    def seg_transitions(self):
        """
        Gets the seg_transitions of this FeatureParams.
        A variable-length array in which each element specifies one of the supported segment size transition options. The user of the SYMbol interface should consult this list to determine a valid new segment size for a volume before attempting to use the startVolumeSegmentSizing procedure.

        :return: The seg_transitions of this FeatureParams.
        :rtype: list[str]
        :required/optional: required
        """
        return self._seg_transitions

    @seg_transitions.setter
    def seg_transitions(self, seg_transitions):
        """
        Sets the seg_transitions of this FeatureParams.
        A variable-length array in which each element specifies one of the supported segment size transition options. The user of the SYMbol interface should consult this list to determine a valid new segment size for a volume before attempting to use the startVolumeSegmentSizing procedure.

        :param seg_transitions: The seg_transitions of this FeatureParams.
        :type: list[str]
        """
        self._seg_transitions = seg_transitions

    @property
    def mappable_lun_count(self):
        """
        Gets the mappable_lun_count of this FeatureParams.
        The maximum number of LUN addresses that are available for volume mapping operations. The range of supported LUN values is thus 0 through mappableLUNCoun-1.

        :return: The mappable_lun_count of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._mappable_lun_count

    @mappable_lun_count.setter
    def mappable_lun_count(self, mappable_lun_count):
        """
        Sets the mappable_lun_count of this FeatureParams.
        The maximum number of LUN addresses that are available for volume mapping operations. The range of supported LUN values is thus 0 through mappableLUNCoun-1.

        :param mappable_lun_count: The mappable_lun_count of this FeatureParams.
        :type: int
        """
        self._mappable_lun_count = mappable_lun_count

    @property
    def max_partition_count(self):
        """
        Gets the max_partition_count of this FeatureParams.
        The number of partitions supported by the controller.

        :return: The max_partition_count of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_partition_count

    @max_partition_count.setter
    def max_partition_count(self, max_partition_count):
        """
        Sets the max_partition_count of this FeatureParams.
        The number of partitions supported by the controller.

        :param max_partition_count: The max_partition_count of this FeatureParams.
        :type: int
        """
        self._max_partition_count = max_partition_count

    @property
    def max_mappings_per_volume(self):
        """
        Gets the max_mappings_per_volume of this FeatureParams.
        The number of mappings allowed per volume.

        :return: The max_mappings_per_volume of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_mappings_per_volume

    @max_mappings_per_volume.setter
    def max_mappings_per_volume(self, max_mappings_per_volume):
        """
        Sets the max_mappings_per_volume of this FeatureParams.
        The number of mappings allowed per volume.

        :param max_mappings_per_volume: The max_mappings_per_volume of this FeatureParams.
        :type: int
        """
        self._max_mappings_per_volume = max_mappings_per_volume

    @property
    def max_volumes(self):
        """
        Gets the max_volumes of this FeatureParams.
        The maximum number of standard volumes allowed per array.

        :return: The max_volumes of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_volumes

    @max_volumes.setter
    def max_volumes(self, max_volumes):
        """
        Sets the max_volumes of this FeatureParams.
        The maximum number of standard volumes allowed per array.

        :param max_volumes: The max_volumes of this FeatureParams.
        :type: int
        """
        self._max_volumes = max_volumes

    @property
    def max_snapshots(self):
        """
        Gets the max_snapshots of this FeatureParams.
        The maximum number of snapshot volumes allowed per array.

        :return: The max_snapshots of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_snapshots

    @max_snapshots.setter
    def max_snapshots(self, max_snapshots):
        """
        Sets the max_snapshots of this FeatureParams.
        The maximum number of snapshot volumes allowed per array.

        :param max_snapshots: The max_snapshots of this FeatureParams.
        :type: int
        """
        self._max_snapshots = max_snapshots

    @property
    def max_snapshots_per_base(self):
        """
        Gets the max_snapshots_per_base of this FeatureParams.
        The maximum number of snapshots allowed on any given base volume.

        :return: The max_snapshots_per_base of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_snapshots_per_base

    @max_snapshots_per_base.setter
    def max_snapshots_per_base(self, max_snapshots_per_base):
        """
        Sets the max_snapshots_per_base of this FeatureParams.
        The maximum number of snapshots allowed on any given base volume.

        :param max_snapshots_per_base: The max_snapshots_per_base of this FeatureParams.
        :type: int
        """
        self._max_snapshots_per_base = max_snapshots_per_base

    @property
    def min_repository_size(self):
        """
        Gets the min_repository_size of this FeatureParams.
        The minimum size of a repository volume in bytes.

        :return: The min_repository_size of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._min_repository_size

    @min_repository_size.setter
    def min_repository_size(self, min_repository_size):
        """
        Sets the min_repository_size of this FeatureParams.
        The minimum size of a repository volume in bytes.

        :param min_repository_size: The min_repository_size of this FeatureParams.
        :type: int
        """
        self._min_repository_size = min_repository_size

    @property
    def max_mirrors(self):
        """
        Gets the max_mirrors of this FeatureParams.
        The maximum number of mirrored volumes allowed per array assuming full size repositories.

        :return: The max_mirrors of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_mirrors

    @max_mirrors.setter
    def max_mirrors(self, max_mirrors):
        """
        Sets the max_mirrors of this FeatureParams.
        The maximum number of mirrored volumes allowed per array assuming full size repositories.

        :param max_mirrors: The max_mirrors of this FeatureParams.
        :type: int
        """
        self._max_mirrors = max_mirrors

    @property
    def max_vol_copys(self):
        """
        Gets the max_vol_copys of this FeatureParams.
        The maximum number of volume copies allowed per array.

        :return: The max_vol_copys of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_vol_copys

    @max_vol_copys.setter
    def max_vol_copys(self, max_vol_copys):
        """
        Sets the max_vol_copys of this FeatureParams.
        The maximum number of volume copies allowed per array.

        :param max_vol_copys: The max_vol_copys of this FeatureParams.
        :type: int
        """
        self._max_vol_copys = max_vol_copys

    @property
    def max_concurrent_background_copys(self):
        """
        Gets the max_concurrent_background_copys of this FeatureParams.
        The maximum number of background copies that can be active at any one time. This maximum number applies to the entire array, not just one controller.

        :return: The max_concurrent_background_copys of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_concurrent_background_copys

    @max_concurrent_background_copys.setter
    def max_concurrent_background_copys(self, max_concurrent_background_copys):
        """
        Sets the max_concurrent_background_copys of this FeatureParams.
        The maximum number of background copies that can be active at any one time. This maximum number applies to the entire array, not just one controller.

        :param max_concurrent_background_copys: The max_concurrent_background_copys of this FeatureParams.
        :type: int
        """
        self._max_concurrent_background_copys = max_concurrent_background_copys

    @property
    def max_utm_lun_value(self):
        """
        Gets the max_utm_lun_value of this FeatureParams.
        The maximum value a UTM LUN can be set to.

        :return: The max_utm_lun_value of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_utm_lun_value

    @max_utm_lun_value.setter
    def max_utm_lun_value(self, max_utm_lun_value):
        """
        Sets the max_utm_lun_value of this FeatureParams.
        The maximum value a UTM LUN can be set to.

        :param max_utm_lun_value: The max_utm_lun_value of this FeatureParams.
        :type: int
        """
        self._max_utm_lun_value = max_utm_lun_value

    @property
    def reserved1(self):
        """
        Gets the reserved1 of this FeatureParams.


        :return: The reserved1 of this FeatureParams.
        :rtype: str
        :required/optional: optional
        """
        return self._reserved1

    @reserved1.setter
    def reserved1(self, reserved1):
        """
        Sets the reserved1 of this FeatureParams.


        :param reserved1: The reserved1 of this FeatureParams.
        :type: str
        """
        self._reserved1 = reserved1

    @property
    def reserved2(self):
        """
        Gets the reserved2 of this FeatureParams.


        :return: The reserved2 of this FeatureParams.
        :rtype: str
        :required/optional: optional
        """
        return self._reserved2

    @reserved2.setter
    def reserved2(self, reserved2):
        """
        Sets the reserved2 of this FeatureParams.


        :param reserved2: The reserved2 of this FeatureParams.
        :type: str
        """
        self._reserved2 = reserved2

    @property
    def battery_not_in_configuration(self):
        """
        Gets the battery_not_in_configuration of this FeatureParams.
        The NVSRAM setting for optional controller battery.

        :return: The battery_not_in_configuration of this FeatureParams.
        :rtype: bool
        :required/optional: required
        """
        return self._battery_not_in_configuration

    @battery_not_in_configuration.setter
    def battery_not_in_configuration(self, battery_not_in_configuration):
        """
        Sets the battery_not_in_configuration of this FeatureParams.
        The NVSRAM setting for optional controller battery.

        :param battery_not_in_configuration: The battery_not_in_configuration of this FeatureParams.
        :type: bool
        """
        self._battery_not_in_configuration = battery_not_in_configuration

    @property
    def supported_drive_types(self):
        """
        Gets the supported_drive_types of this FeatureParams.
        A list of supported drive types.

        :return: The supported_drive_types of this FeatureParams.
        :rtype: list[str]
        :required/optional: required
        """
        return self._supported_drive_types

    @supported_drive_types.setter
    def supported_drive_types(self, supported_drive_types):
        """
        Sets the supported_drive_types of this FeatureParams.
        A list of supported drive types.

        :param supported_drive_types: The supported_drive_types of this FeatureParams.
        :type: list[str]
        """
        self._supported_drive_types = supported_drive_types

    @property
    def current_max_mirrors(self):
        """
        Gets the current_max_mirrors of this FeatureParams.
        The maximum number of mirrored volumes allowed per array for existing repositories.

        :return: The current_max_mirrors of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._current_max_mirrors

    @current_max_mirrors.setter
    def current_max_mirrors(self, current_max_mirrors):
        """
        Sets the current_max_mirrors of this FeatureParams.
        The maximum number of mirrored volumes allowed per array for existing repositories.

        :param current_max_mirrors: The current_max_mirrors of this FeatureParams.
        :type: int
        """
        self._current_max_mirrors = current_max_mirrors

    @property
    def max_volumes_per_group(self):
        """
        Gets the max_volumes_per_group of this FeatureParams.
        The maximum number of volumes allowed per volume group.

        :return: The max_volumes_per_group of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_volumes_per_group

    @max_volumes_per_group.setter
    def max_volumes_per_group(self, max_volumes_per_group):
        """
        Sets the max_volumes_per_group of this FeatureParams.
        The maximum number of volumes allowed per volume group.

        :param max_volumes_per_group: The max_volumes_per_group of this FeatureParams.
        :type: int
        """
        self._max_volumes_per_group = max_volumes_per_group

    @property
    def max_drive_download_files(self):
        """
        Gets the max_drive_download_files of this FeatureParams.
        The maximum number of drive download files permitted.

        :return: The max_drive_download_files of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_drive_download_files

    @max_drive_download_files.setter
    def max_drive_download_files(self, max_drive_download_files):
        """
        Sets the max_drive_download_files of this FeatureParams.
        The maximum number of drive download files permitted.

        :param max_drive_download_files: The max_drive_download_files of this FeatureParams.
        :type: int
        """
        self._max_drive_download_files = max_drive_download_files

    @property
    def max_mgmt_client_records(self):
        """
        Gets the max_mgmt_client_records of this FeatureParams.
        The maximum number of records allowed in the client data storage area.

        :return: The max_mgmt_client_records of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_mgmt_client_records

    @max_mgmt_client_records.setter
    def max_mgmt_client_records(self, max_mgmt_client_records):
        """
        Sets the max_mgmt_client_records of this FeatureParams.
        The maximum number of records allowed in the client data storage area.

        :param max_mgmt_client_records: The max_mgmt_client_records of this FeatureParams.
        :type: int
        """
        self._max_mgmt_client_records = max_mgmt_client_records

    @property
    def max_mgmt_client_record_size(self):
        """
        Gets the max_mgmt_client_record_size of this FeatureParams.
        The maximum record size of a client data record.

        :return: The max_mgmt_client_record_size of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_mgmt_client_record_size

    @max_mgmt_client_record_size.setter
    def max_mgmt_client_record_size(self, max_mgmt_client_record_size):
        """
        Sets the max_mgmt_client_record_size of this FeatureParams.
        The maximum record size of a client data record.

        :param max_mgmt_client_record_size: The max_mgmt_client_record_size of this FeatureParams.
        :type: int
        """
        self._max_mgmt_client_record_size = max_mgmt_client_record_size

    @property
    def redundancy_mode(self):
        """
        Gets the redundancy_mode of this FeatureParams.
        Indicates whether the system is Simplex or Duplex.

        :return: The redundancy_mode of this FeatureParams.
        :rtype: str
        :required/optional: required
        """
        return self._redundancy_mode

    @redundancy_mode.setter
    def redundancy_mode(self, redundancy_mode):
        """
        Sets the redundancy_mode of this FeatureParams.
        Indicates whether the system is Simplex or Duplex.

        :param redundancy_mode: The redundancy_mode of this FeatureParams.
        :type: str
        """
        allowed_values = ["unknown", "duplex", "simplex", "__UNDEFINED"]
        if redundancy_mode not in allowed_values:
            raise ValueError(
                "Invalid value for `redundancy_mode`, must be one of {0}"
                .format(allowed_values)
            )
        self._redundancy_mode = redundancy_mode

    @property
    def max_expansion_drive_trays(self):
        """
        Gets the max_expansion_drive_trays of this FeatureParams.
        The maximum number of expansion drive trays allowed for this storage array.

        :return: The max_expansion_drive_trays of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_expansion_drive_trays

    @max_expansion_drive_trays.setter
    def max_expansion_drive_trays(self, max_expansion_drive_trays):
        """
        Sets the max_expansion_drive_trays of this FeatureParams.
        The maximum number of expansion drive trays allowed for this storage array.

        :param max_expansion_drive_trays: The max_expansion_drive_trays of this FeatureParams.
        :type: int
        """
        self._max_expansion_drive_trays = max_expansion_drive_trays

    @property
    def supported_auth_methods(self):
        """
        Gets the supported_auth_methods of this FeatureParams.
        The iSCSI authentication methods supported by the storage array.

        :return: The supported_auth_methods of this FeatureParams.
        :rtype: list[str]
        :required/optional: required
        """
        return self._supported_auth_methods

    @supported_auth_methods.setter
    def supported_auth_methods(self, supported_auth_methods):
        """
        Sets the supported_auth_methods of this FeatureParams.
        The iSCSI authentication methods supported by the storage array.

        :param supported_auth_methods: The supported_auth_methods of this FeatureParams.
        :type: list[str]
        """
        self._supported_auth_methods = supported_auth_methods

    @property
    def max_iscsi_ipv6_local_addresses_per_port(self):
        """
        Gets the max_iscsi_ipv6_local_addresses_per_port of this FeatureParams.
        Max number of iSCSI IPV6 local addresses

        :return: The max_iscsi_ipv6_local_addresses_per_port of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_iscsi_ipv6_local_addresses_per_port

    @max_iscsi_ipv6_local_addresses_per_port.setter
    def max_iscsi_ipv6_local_addresses_per_port(self, max_iscsi_ipv6_local_addresses_per_port):
        """
        Sets the max_iscsi_ipv6_local_addresses_per_port of this FeatureParams.
        Max number of iSCSI IPV6 local addresses

        :param max_iscsi_ipv6_local_addresses_per_port: The max_iscsi_ipv6_local_addresses_per_port of this FeatureParams.
        :type: int
        """
        self._max_iscsi_ipv6_local_addresses_per_port = max_iscsi_ipv6_local_addresses_per_port

    @property
    def max_iscsi_ipv6_routable_addresses_per_port(self):
        """
        Gets the max_iscsi_ipv6_routable_addresses_per_port of this FeatureParams.
        Max number of iSCSI IPV6 routable addresses

        :return: The max_iscsi_ipv6_routable_addresses_per_port of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_iscsi_ipv6_routable_addresses_per_port

    @max_iscsi_ipv6_routable_addresses_per_port.setter
    def max_iscsi_ipv6_routable_addresses_per_port(self, max_iscsi_ipv6_routable_addresses_per_port):
        """
        Sets the max_iscsi_ipv6_routable_addresses_per_port of this FeatureParams.
        Max number of iSCSI IPV6 routable addresses

        :param max_iscsi_ipv6_routable_addresses_per_port: The max_iscsi_ipv6_routable_addresses_per_port of this FeatureParams.
        :type: int
        """
        self._max_iscsi_ipv6_routable_addresses_per_port = max_iscsi_ipv6_routable_addresses_per_port

    @property
    def absolute_max_dss_segment_size(self):
        """
        Gets the absolute_max_dss_segment_size of this FeatureParams.
        The global upper bound, expressed in bytes, on the new segment size that may be requested on the startVolumeSegmentSizing procedure.

        :return: The absolute_max_dss_segment_size of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._absolute_max_dss_segment_size

    @absolute_max_dss_segment_size.setter
    def absolute_max_dss_segment_size(self, absolute_max_dss_segment_size):
        """
        Sets the absolute_max_dss_segment_size of this FeatureParams.
        The global upper bound, expressed in bytes, on the new segment size that may be requested on the startVolumeSegmentSizing procedure.

        :param absolute_max_dss_segment_size: The absolute_max_dss_segment_size of this FeatureParams.
        :type: int
        """
        self._absolute_max_dss_segment_size = absolute_max_dss_segment_size

    @property
    def smart_battery_technology(self):
        """
        Gets the smart_battery_technology of this FeatureParams.
        This field is set to true if the storage array uses smart battery technology, and false otherwise.

        :return: The smart_battery_technology of this FeatureParams.
        :rtype: bool
        :required/optional: required
        """
        return self._smart_battery_technology

    @smart_battery_technology.setter
    def smart_battery_technology(self, smart_battery_technology):
        """
        Sets the smart_battery_technology of this FeatureParams.
        This field is set to true if the storage array uses smart battery technology, and false otherwise.

        :param smart_battery_technology: The smart_battery_technology of this FeatureParams.
        :type: bool
        """
        self._smart_battery_technology = smart_battery_technology

    @property
    def write_caching_enabled_during_learn_cycle(self):
        """
        Gets the write_caching_enabled_during_learn_cycle of this FeatureParams.
        This field, which is only applicable if smartBatteryTechnology is true, is set to true if the charge level on a smart battery unit is expected to remain above the minimum level needed to support write caching.

        :return: The write_caching_enabled_during_learn_cycle of this FeatureParams.
        :rtype: bool
        :required/optional: required
        """
        return self._write_caching_enabled_during_learn_cycle

    @write_caching_enabled_during_learn_cycle.setter
    def write_caching_enabled_during_learn_cycle(self, write_caching_enabled_during_learn_cycle):
        """
        Sets the write_caching_enabled_during_learn_cycle of this FeatureParams.
        This field, which is only applicable if smartBatteryTechnology is true, is set to true if the charge level on a smart battery unit is expected to remain above the minimum level needed to support write caching.

        :param write_caching_enabled_during_learn_cycle: The write_caching_enabled_during_learn_cycle of this FeatureParams.
        :type: bool
        """
        self._write_caching_enabled_during_learn_cycle = write_caching_enabled_during_learn_cycle

    @property
    def max_ss_ds_supported(self):
        """
        Gets the max_ss_ds_supported of this FeatureParams.
        The maximum number of SSDs supported on the array. If SSDs are not supported this value is 0.

        :return: The max_ss_ds_supported of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_ss_ds_supported

    @max_ss_ds_supported.setter
    def max_ss_ds_supported(self, max_ss_ds_supported):
        """
        Sets the max_ss_ds_supported of this FeatureParams.
        The maximum number of SSDs supported on the array. If SSDs are not supported this value is 0.

        :param max_ss_ds_supported: The max_ss_ds_supported of this FeatureParams.
        :type: int
        """
        self._max_ss_ds_supported = max_ss_ds_supported

    @property
    def ssd_interface_type_mixing_supported(self):
        """
        Gets the ssd_interface_type_mixing_supported of this FeatureParams.
        True if different SSD interface types (e.g. Fibre Channel, SAS) can be used in the same volume group.

        :return: The ssd_interface_type_mixing_supported of this FeatureParams.
        :rtype: bool
        :required/optional: required
        """
        return self._ssd_interface_type_mixing_supported

    @ssd_interface_type_mixing_supported.setter
    def ssd_interface_type_mixing_supported(self, ssd_interface_type_mixing_supported):
        """
        Sets the ssd_interface_type_mixing_supported of this FeatureParams.
        True if different SSD interface types (e.g. Fibre Channel, SAS) can be used in the same volume group.

        :param ssd_interface_type_mixing_supported: The ssd_interface_type_mixing_supported of this FeatureParams.
        :type: bool
        """
        self._ssd_interface_type_mixing_supported = ssd_interface_type_mixing_supported

    @property
    def max_drive_slots(self):
        """
        Gets the max_drive_slots of this FeatureParams.
        The maximum number of drive slots supported on the array.

        :return: The max_drive_slots of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_drive_slots

    @max_drive_slots.setter
    def max_drive_slots(self, max_drive_slots):
        """
        Sets the max_drive_slots of this FeatureParams.
        The maximum number of drive slots supported on the array.

        :param max_drive_slots: The max_drive_slots of this FeatureParams.
        :type: int
        """
        self._max_drive_slots = max_drive_slots

    @property
    def supported_protection_types(self):
        """
        Gets the supported_protection_types of this FeatureParams.
        The protection types supported by the storage array.

        :return: The supported_protection_types of this FeatureParams.
        :rtype: list[str]
        :required/optional: required
        """
        return self._supported_protection_types

    @supported_protection_types.setter
    def supported_protection_types(self, supported_protection_types):
        """
        Sets the supported_protection_types of this FeatureParams.
        The protection types supported by the storage array.

        :param supported_protection_types: The supported_protection_types of this FeatureParams.
        :type: list[str]
        """
        self._supported_protection_types = supported_protection_types

    @property
    def supported_event_priorities(self):
        """
        Gets the supported_event_priorities of this FeatureParams.
        An array listing the MEL event priorities that are configured for use in the current controller firmware build.

        :return: The supported_event_priorities of this FeatureParams.
        :rtype: list[str]
        :required/optional: required
        """
        return self._supported_event_priorities

    @supported_event_priorities.setter
    def supported_event_priorities(self, supported_event_priorities):
        """
        Sets the supported_event_priorities of this FeatureParams.
        An array listing the MEL event priorities that are configured for use in the current controller firmware build.

        :param supported_event_priorities: The supported_event_priorities of this FeatureParams.
        :type: list[str]
        """
        self._supported_event_priorities = supported_event_priorities

    @property
    def max_flash_cache_size(self):
        """
        Gets the max_flash_cache_size of this FeatureParams.
        The maximum flash cache repository size measured in bytes.

        :return: The max_flash_cache_size of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._max_flash_cache_size

    @max_flash_cache_size.setter
    def max_flash_cache_size(self, max_flash_cache_size):
        """
        Sets the max_flash_cache_size of this FeatureParams.
        The maximum flash cache repository size measured in bytes.

        :param max_flash_cache_size: The max_flash_cache_size of this FeatureParams.
        :type: int
        """
        self._max_flash_cache_size = max_flash_cache_size

    @property
    def default_media_scan_period(self):
        """
        Gets the default_media_scan_period of this FeatureParams.
        The default media scan period stored in the controller's NVSRAM. Units are days.

        :return: The default_media_scan_period of this FeatureParams.
        :rtype: int
        :required/optional: required
        """
        return self._default_media_scan_period

    @default_media_scan_period.setter
    def default_media_scan_period(self, default_media_scan_period):
        """
        Sets the default_media_scan_period of this FeatureParams.
        The default media scan period stored in the controller's NVSRAM. Units are days.

        :param default_media_scan_period: The default_media_scan_period of this FeatureParams.
        :type: int
        """
        self._default_media_scan_period = default_media_scan_period

    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

