# coding: utf-8

"""
Controller.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 Controller(object):
    """
    NOTE: This class is auto generated by the swagger code generator program.
    Do not edit the class manually.
    """
    def __init__(self):
        """
        Controller - 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 = {
            'active': 'bool',  # (required parameter)
            'quiesced': 'bool',  # (required parameter)
            'status': 'str',  # (required parameter)
            'controller_ref': 'str',  # (required parameter)
            'physical_location': 'Location',  # (required parameter)
            'manufacturer': 'str',  # (required parameter)
            'manufacturer_date': 'int',  # (required parameter)
            'app_version': 'str',  # (required parameter)
            'boot_version': 'str',  # (required parameter)
            'product_id': 'str',  # (required parameter)
            'product_rev_level': 'str',  # (required parameter)
            'serial_number': 'str',  # (required parameter)
            'board_id': 'str',  # (required parameter)
            'cache_memory_size': 'int',  # (required parameter)
            'processor_memory_size': 'int',  # (required parameter)
            'host_interfaces': 'list[IOInterfaceTypeData]',  # (required parameter)
            'drive_interfaces': 'list[IOInterfaceTypeData]',  # (required parameter)
            'net_interfaces': 'list[NetInterfaceTypeData]',  # (required parameter)
            'inventory': 'list[InventoryItem]',  # (required parameter)
            'reserved1': 'str',  
            'reserved2': 'str',  
            'host_board_id': 'str',  # (required parameter)
            'physical_cache_memory_size': 'int',  # (required parameter)
            'ready_to_remove': 'bool',  # (required parameter)
            'board_submodel_id': 'str',  # (required parameter)
            'submodel_supported': 'bool',  # (required parameter)
            'oem_part_number': 'str',  # (required parameter)
            'part_number': 'str',  # (required parameter)
            'rtr_attributes': 'RTRAttributes',  # (required parameter)
            'boot_time': 'int',  # (required parameter)
            'model_name': 'str',  # (required parameter)
            'network_settings': 'ControllerNetworkSettings',  # (required parameter)
            'repair_policy': 'RepairPolicy',  # (required parameter)
            'flash_cache_memory_size': 'int',  # (required parameter)
            'ctrl_ioc_dump_data': 'CtrlIOCDumpData',  # (required parameter)
            'locate_in_progress': 'bool',  # (required parameter)
            'has_tray_identity_indicator': 'bool',  # (required parameter)
            'controller_error_mode': 'str',  # (required parameter)
            'code_versions': 'list[VersionDescriptor]',  # (required parameter)
            'id': 'str'
        }

        self.attribute_map = {
            'active': 'active',  # (required parameter)
            'quiesced': 'quiesced',  # (required parameter)
            'status': 'status',  # (required parameter)
            'controller_ref': 'controllerRef',  # (required parameter)
            'physical_location': 'physicalLocation',  # (required parameter)
            'manufacturer': 'manufacturer',  # (required parameter)
            'manufacturer_date': 'manufacturerDate',  # (required parameter)
            'app_version': 'appVersion',  # (required parameter)
            'boot_version': 'bootVersion',  # (required parameter)
            'product_id': 'productID',  # (required parameter)
            'product_rev_level': 'productRevLevel',  # (required parameter)
            'serial_number': 'serialNumber',  # (required parameter)
            'board_id': 'boardID',  # (required parameter)
            'cache_memory_size': 'cacheMemorySize',  # (required parameter)
            'processor_memory_size': 'processorMemorySize',  # (required parameter)
            'host_interfaces': 'hostInterfaces',  # (required parameter)
            'drive_interfaces': 'driveInterfaces',  # (required parameter)
            'net_interfaces': 'netInterfaces',  # (required parameter)
            'inventory': 'inventory',  # (required parameter)
            'reserved1': 'reserved1',  
            'reserved2': 'reserved2',  
            'host_board_id': 'hostBoardID',  # (required parameter)
            'physical_cache_memory_size': 'physicalCacheMemorySize',  # (required parameter)
            'ready_to_remove': 'readyToRemove',  # (required parameter)
            'board_submodel_id': 'boardSubmodelID',  # (required parameter)
            'submodel_supported': 'submodelSupported',  # (required parameter)
            'oem_part_number': 'oemPartNumber',  # (required parameter)
            'part_number': 'partNumber',  # (required parameter)
            'rtr_attributes': 'rtrAttributes',  # (required parameter)
            'boot_time': 'bootTime',  # (required parameter)
            'model_name': 'modelName',  # (required parameter)
            'network_settings': 'networkSettings',  # (required parameter)
            'repair_policy': 'repairPolicy',  # (required parameter)
            'flash_cache_memory_size': 'flashCacheMemorySize',  # (required parameter)
            'ctrl_ioc_dump_data': 'ctrlIocDumpData',  # (required parameter)
            'locate_in_progress': 'locateInProgress',  # (required parameter)
            'has_tray_identity_indicator': 'hasTrayIdentityIndicator',  # (required parameter)
            'controller_error_mode': 'controllerErrorMode',  # (required parameter)
            'code_versions': 'codeVersions',  # (required parameter)
            'id': 'id'
        }

        self._active = None
        self._quiesced = None
        self._status = None
        self._controller_ref = None
        self._physical_location = None
        self._manufacturer = None
        self._manufacturer_date = None
        self._app_version = None
        self._boot_version = None
        self._product_id = None
        self._product_rev_level = None
        self._serial_number = None
        self._board_id = None
        self._cache_memory_size = None
        self._processor_memory_size = None
        self._host_interfaces = None
        self._drive_interfaces = None
        self._net_interfaces = None
        self._inventory = None
        self._reserved1 = None
        self._reserved2 = None
        self._host_board_id = None
        self._physical_cache_memory_size = None
        self._ready_to_remove = None
        self._board_submodel_id = None
        self._submodel_supported = None
        self._oem_part_number = None
        self._part_number = None
        self._rtr_attributes = None
        self._boot_time = None
        self._model_name = None
        self._network_settings = None
        self._repair_policy = None
        self._flash_cache_memory_size = None
        self._ctrl_ioc_dump_data = None
        self._locate_in_progress = None
        self._has_tray_identity_indicator = None
        self._controller_error_mode = None
        self._code_versions = None
        self._id = None

    @property
    def active(self):
        """
        Gets the active of this Controller.
        True if the controller is in active mode; false otherwise.

        :return: The active of this Controller.
        :rtype: bool
        :required/optional: required
        """
        return self._active

    @active.setter
    def active(self, active):
        """
        Sets the active of this Controller.
        True if the controller is in active mode; false otherwise.

        :param active: The active of this Controller.
        :type: bool
        """
        self._active = active

    @property
    def quiesced(self):
        """
        Gets the quiesced of this Controller.
        True if the controller is quiesced.

        :return: The quiesced of this Controller.
        :rtype: bool
        :required/optional: required
        """
        return self._quiesced

    @quiesced.setter
    def quiesced(self, quiesced):
        """
        Sets the quiesced of this Controller.
        True if the controller is quiesced.

        :param quiesced: The quiesced of this Controller.
        :type: bool
        """
        self._quiesced = quiesced

    @property
    def status(self):
        """
        Gets the status of this Controller.
        An indication of the current status of the controller.

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

    @status.setter
    def status(self, status):
        """
        Sets the status of this Controller.
        An indication of the current status of the controller.

        :param status: The status of this Controller.
        :type: str
        """
        allowed_values = ["unknown", "optimal", "failed", "removed", "rpaParErr", "serviceMode", "suspended", "degraded", "__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 controller_ref(self):
        """
        Gets the controller_ref of this Controller.
        The identifier value for this controller. Other objects may use this reference value to refer to the controller.

        :return: The controller_ref of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._controller_ref

    @controller_ref.setter
    def controller_ref(self, controller_ref):
        """
        Sets the controller_ref of this Controller.
        The identifier value for this controller. Other objects may use this reference value to refer to the controller.

        :param controller_ref: The controller_ref of this Controller.
        :type: str
        """
        self._controller_ref = controller_ref

    @property
    def physical_location(self):
        """
        Gets the physical_location of this Controller.
        The physical location of the controller. The parent reference in Location identifies the tray that physically houses the controller, and the position field is the parent-relative/like-component relative slot number of the controller, starting at one.

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

    @physical_location.setter
    def physical_location(self, physical_location):
        """
        Sets the physical_location of this Controller.
        The physical location of the controller. The parent reference in Location identifies the tray that physically houses the controller, and the position field is the parent-relative/like-component relative slot number of the controller, starting at one.

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

    @property
    def manufacturer(self):
        """
        Gets the manufacturer of this Controller.
        The variable-length ASCII text string that identifies the controller manufacturer.

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

    @manufacturer.setter
    def manufacturer(self, manufacturer):
        """
        Sets the manufacturer of this Controller.
        The variable-length ASCII text string that identifies the controller manufacturer.

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

    @property
    def manufacturer_date(self):
        """
        Gets the manufacturer_date of this Controller.
        The date of manufacture of the controller, represented in seconds since midnight GMT on January 1, 1970.

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

    @manufacturer_date.setter
    def manufacturer_date(self, manufacturer_date):
        """
        Sets the manufacturer_date of this Controller.
        The date of manufacture of the controller, represented in seconds since midnight GMT on January 1, 1970.

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

    @property
    def app_version(self):
        """
        Gets the app_version of this Controller.
        The version identification string for the application code that is running on the controller.

        :return: The app_version of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._app_version

    @app_version.setter
    def app_version(self, app_version):
        """
        Sets the app_version of this Controller.
        The version identification string for the application code that is running on the controller.

        :param app_version: The app_version of this Controller.
        :type: str
        """
        self._app_version = app_version

    @property
    def boot_version(self):
        """
        Gets the boot_version of this Controller.
        The version identification string for the boot code that is running on the controller.

        :return: The boot_version of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._boot_version

    @boot_version.setter
    def boot_version(self, boot_version):
        """
        Sets the boot_version of this Controller.
        The version identification string for the boot code that is running on the controller.

        :param boot_version: The boot_version of this Controller.
        :type: str
        """
        self._boot_version = boot_version

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

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

    @product_id.setter
    def product_id(self, product_id):
        """
        Sets the product_id of this Controller.
        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 Controller.
        :type: str
        """
        self._product_id = product_id

    @property
    def product_rev_level(self):
        """
        Gets the product_rev_level of this Controller.
        The product revision level.

        :return: The product_rev_level of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._product_rev_level

    @product_rev_level.setter
    def product_rev_level(self, product_rev_level):
        """
        Sets the product_rev_level of this Controller.
        The product revision level.

        :param product_rev_level: The product_rev_level of this Controller.
        :type: str
        """
        self._product_rev_level = product_rev_level

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

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

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

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

    @property
    def board_id(self):
        """
        Gets the board_id of this Controller.
        The variable-length ASCII text string that represents the board identifier (i.e. board type) of the controller.

        :return: The board_id of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._board_id

    @board_id.setter
    def board_id(self, board_id):
        """
        Sets the board_id of this Controller.
        The variable-length ASCII text string that represents the board identifier (i.e. board type) of the controller.

        :param board_id: The board_id of this Controller.
        :type: str
        """
        self._board_id = board_id

    @property
    def cache_memory_size(self):
        """
        Gets the cache_memory_size of this Controller.
        The memory size, in MB, that will be used by the controller as cache memory.

        :return: The cache_memory_size of this Controller.
        :rtype: int
        :required/optional: required
        """
        return self._cache_memory_size

    @cache_memory_size.setter
    def cache_memory_size(self, cache_memory_size):
        """
        Sets the cache_memory_size of this Controller.
        The memory size, in MB, that will be used by the controller as cache memory.

        :param cache_memory_size: The cache_memory_size of this Controller.
        :type: int
        """
        self._cache_memory_size = cache_memory_size

    @property
    def processor_memory_size(self):
        """
        Gets the processor_memory_size of this Controller.
        The size of the controller's CPU memory, in MB.

        :return: The processor_memory_size of this Controller.
        :rtype: int
        :required/optional: required
        """
        return self._processor_memory_size

    @processor_memory_size.setter
    def processor_memory_size(self, processor_memory_size):
        """
        Sets the processor_memory_size of this Controller.
        The size of the controller's CPU memory, in MB.

        :param processor_memory_size: The processor_memory_size of this Controller.
        :type: int
        """
        self._processor_memory_size = processor_memory_size

    @property
    def host_interfaces(self):
        """
        Gets the host_interfaces of this Controller.
        An array containing one entry for each host-side I/O interface that is present on the controller. A \"host interface\" is the controller's means of accessing the host I/O channel; each host interface has a one-to-one relationship to a host channel. Although this array is indexed starting at zero, host channels in SYMbol are numbered starting at one. Host channels are numbered one through n per controller, without regard to different channel I/O protocols. Note that an interface may be physically present, but disabled for the particular controller model - in such a case, the corresponding channel is skipped over in the channel numbering.

        :return: The host_interfaces of this Controller.
        :rtype: list[IOInterfaceTypeData]
        :required/optional: required
        """
        return self._host_interfaces

    @host_interfaces.setter
    def host_interfaces(self, host_interfaces):
        """
        Sets the host_interfaces of this Controller.
        An array containing one entry for each host-side I/O interface that is present on the controller. A \"host interface\" is the controller's means of accessing the host I/O channel; each host interface has a one-to-one relationship to a host channel. Although this array is indexed starting at zero, host channels in SYMbol are numbered starting at one. Host channels are numbered one through n per controller, without regard to different channel I/O protocols. Note that an interface may be physically present, but disabled for the particular controller model - in such a case, the corresponding channel is skipped over in the channel numbering.

        :param host_interfaces: The host_interfaces of this Controller.
        :type: list[IOInterfaceTypeData]
        """
        self._host_interfaces = host_interfaces

    @property
    def drive_interfaces(self):
        """
        Gets the drive_interfaces of this Controller.
        An array containing one entry for each drive-side I/O interface that is present on the controller. A \"drive interface\" is the controller's means of accessing the drive I/O channel. On the drive side, each channel is associated with two interfaces, one on each controller, giving each controller access to the same set of drive channels. Although this array is indexed starting at zero, drive channels can be numbered one through n, per storage array (not per controller).

        :return: The drive_interfaces of this Controller.
        :rtype: list[IOInterfaceTypeData]
        :required/optional: required
        """
        return self._drive_interfaces

    @drive_interfaces.setter
    def drive_interfaces(self, drive_interfaces):
        """
        Sets the drive_interfaces of this Controller.
        An array containing one entry for each drive-side I/O interface that is present on the controller. A \"drive interface\" is the controller's means of accessing the drive I/O channel. On the drive side, each channel is associated with two interfaces, one on each controller, giving each controller access to the same set of drive channels. Although this array is indexed starting at zero, drive channels can be numbered one through n, per storage array (not per controller).

        :param drive_interfaces: The drive_interfaces of this Controller.
        :type: list[IOInterfaceTypeData]
        """
        self._drive_interfaces = drive_interfaces

    @property
    def net_interfaces(self):
        """
        Gets the net_interfaces of this Controller.
        An array containing one entry for each network interface that is present on the controller.

        :return: The net_interfaces of this Controller.
        :rtype: list[NetInterfaceTypeData]
        :required/optional: required
        """
        return self._net_interfaces

    @net_interfaces.setter
    def net_interfaces(self, net_interfaces):
        """
        Sets the net_interfaces of this Controller.
        An array containing one entry for each network interface that is present on the controller.

        :param net_interfaces: The net_interfaces of this Controller.
        :type: list[NetInterfaceTypeData]
        """
        self._net_interfaces = net_interfaces

    @property
    def inventory(self):
        """
        Gets the inventory of this Controller.
        This array of structures is deprecated.

        :return: The inventory of this Controller.
        :rtype: list[InventoryItem]
        :required/optional: required
        """
        return self._inventory

    @inventory.setter
    def inventory(self, inventory):
        """
        Sets the inventory of this Controller.
        This array of structures is deprecated.

        :param inventory: The inventory of this Controller.
        :type: list[InventoryItem]
        """
        self._inventory = inventory

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


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

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


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

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


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

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


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

    @property
    def host_board_id(self):
        """
        Gets the host_board_id of this Controller.
        The board ID of the controller's host card. This field is deprecated. The hostBoardId field in the HostBoard structure should be used instead.

        :return: The host_board_id of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._host_board_id

    @host_board_id.setter
    def host_board_id(self, host_board_id):
        """
        Sets the host_board_id of this Controller.
        The board ID of the controller's host card. This field is deprecated. The hostBoardId field in the HostBoard structure should be used instead.

        :param host_board_id: The host_board_id of this Controller.
        :type: str
        """
        self._host_board_id = host_board_id

    @property
    def physical_cache_memory_size(self):
        """
        Gets the physical_cache_memory_size of this Controller.
        The physical cache memory size in MB

        :return: The physical_cache_memory_size of this Controller.
        :rtype: int
        :required/optional: required
        """
        return self._physical_cache_memory_size

    @physical_cache_memory_size.setter
    def physical_cache_memory_size(self, physical_cache_memory_size):
        """
        Sets the physical_cache_memory_size of this Controller.
        The physical cache memory size in MB

        :param physical_cache_memory_size: The physical_cache_memory_size of this Controller.
        :type: int
        """
        self._physical_cache_memory_size = physical_cache_memory_size

    @property
    def ready_to_remove(self):
        """
        Gets the ready_to_remove of this Controller.
        This is set to True if the component is ready to remove (and the Ready To Remove LED is on). This field is deprecated. The rtrAttributes field should be used instead.

        :return: The ready_to_remove of this Controller.
        :rtype: bool
        :required/optional: required
        """
        return self._ready_to_remove

    @ready_to_remove.setter
    def ready_to_remove(self, ready_to_remove):
        """
        Sets the ready_to_remove of this Controller.
        This is set to True if the component is ready to remove (and the Ready To Remove LED is on). This field is deprecated. The rtrAttributes field should be used instead.

        :param ready_to_remove: The ready_to_remove of this Controller.
        :type: bool
        """
        self._ready_to_remove = ready_to_remove

    @property
    def board_submodel_id(self):
        """
        Gets the board_submodel_id of this Controller.
        The board sub-model ID of the controller card

        :return: The board_submodel_id of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._board_submodel_id

    @board_submodel_id.setter
    def board_submodel_id(self, board_submodel_id):
        """
        Sets the board_submodel_id of this Controller.
        The board sub-model ID of the controller card

        :param board_submodel_id: The board_submodel_id of this Controller.
        :type: str
        """
        self._board_submodel_id = board_submodel_id

    @property
    def submodel_supported(self):
        """
        Gets the submodel_supported of this Controller.
        Set to true if the sub-model feature is supported

        :return: The submodel_supported of this Controller.
        :rtype: bool
        :required/optional: required
        """
        return self._submodel_supported

    @submodel_supported.setter
    def submodel_supported(self, submodel_supported):
        """
        Sets the submodel_supported of this Controller.
        Set to true if the sub-model feature is supported

        :param submodel_supported: The submodel_supported of this Controller.
        :type: bool
        """
        self._submodel_supported = submodel_supported

    @property
    def oem_part_number(self):
        """
        Gets the oem_part_number of this Controller.
        The OEM-specified part number of the controller canister

        :return: The oem_part_number of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._oem_part_number

    @oem_part_number.setter
    def oem_part_number(self, oem_part_number):
        """
        Sets the oem_part_number of this Controller.
        The OEM-specified part number of the controller canister

        :param oem_part_number: The oem_part_number of this Controller.
        :type: str
        """
        self._oem_part_number = oem_part_number

    @property
    def part_number(self):
        """
        Gets the part_number of this Controller.
        The part number of the controller board itself.

        :return: The part_number of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._part_number

    @part_number.setter
    def part_number(self, part_number):
        """
        Sets the part_number of this Controller.
        The part number of the controller board itself.

        :param part_number: The part_number of this Controller.
        :type: str
        """
        self._part_number = part_number

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

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

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

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

    @property
    def boot_time(self):
        """
        Gets the boot_time of this Controller.
        The timestamp value for the time at which the controller last booted. Note that this value may be different for the other controller in the storage array. This value is defined as the number of seconds since midnight GMT on January 1, 1970.

        :return: The boot_time of this Controller.
        :rtype: int
        :required/optional: required
        """
        return self._boot_time

    @boot_time.setter
    def boot_time(self, boot_time):
        """
        Sets the boot_time of this Controller.
        The timestamp value for the time at which the controller last booted. Note that this value may be different for the other controller in the storage array. This value is defined as the number of seconds since midnight GMT on January 1, 1970.

        :param boot_time: The boot_time of this Controller.
        :type: int
        """
        self._boot_time = boot_time

    @property
    def model_name(self):
        """
        Gets the model_name of this Controller.
        The model name associated with the controller. A model name is an identifier that is associated with each unique combination of base controller board and host interface card(s).

        :return: The model_name of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._model_name

    @model_name.setter
    def model_name(self, model_name):
        """
        Sets the model_name of this Controller.
        The model name associated with the controller. A model name is an identifier that is associated with each unique combination of base controller board and host interface card(s).

        :param model_name: The model_name of this Controller.
        :type: str
        """
        self._model_name = model_name

    @property
    def network_settings(self):
        """
        Gets the network_settings of this Controller.
        A collection of network-related settings that apply to this controller.

        :return: The network_settings of this Controller.
        :rtype: ControllerNetworkSettings
        :required/optional: required
        """
        return self._network_settings

    @network_settings.setter
    def network_settings(self, network_settings):
        """
        Sets the network_settings of this Controller.
        A collection of network-related settings that apply to this controller.

        :param network_settings: The network_settings of this Controller.
        :type: ControllerNetworkSettings
        """
        self._network_settings = network_settings

    @property
    def repair_policy(self):
        """
        Gets the repair_policy of this Controller.
        The repair policy for the controller.

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

    @repair_policy.setter
    def repair_policy(self, repair_policy):
        """
        Sets the repair_policy of this Controller.
        The repair policy for the controller.

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

    @property
    def flash_cache_memory_size(self):
        """
        Gets the flash_cache_memory_size of this Controller.
        The total flash cache memory size (in GB) currently in use on the controller.

        :return: The flash_cache_memory_size of this Controller.
        :rtype: int
        :required/optional: required
        """
        return self._flash_cache_memory_size

    @flash_cache_memory_size.setter
    def flash_cache_memory_size(self, flash_cache_memory_size):
        """
        Sets the flash_cache_memory_size of this Controller.
        The total flash cache memory size (in GB) currently in use on the controller.

        :param flash_cache_memory_size: The flash_cache_memory_size of this Controller.
        :type: int
        """
        self._flash_cache_memory_size = flash_cache_memory_size

    @property
    def ctrl_ioc_dump_data(self):
        """
        Gets the ctrl_ioc_dump_data of this Controller.
        This structure contains information regarding the state of an IOC data dump -- if it needs to be retrieved, and the tag and timestamp of the dump.

        :return: The ctrl_ioc_dump_data of this Controller.
        :rtype: CtrlIOCDumpData
        :required/optional: required
        """
        return self._ctrl_ioc_dump_data

    @ctrl_ioc_dump_data.setter
    def ctrl_ioc_dump_data(self, ctrl_ioc_dump_data):
        """
        Sets the ctrl_ioc_dump_data of this Controller.
        This structure contains information regarding the state of an IOC data dump -- if it needs to be retrieved, and the tag and timestamp of the dump.

        :param ctrl_ioc_dump_data: The ctrl_ioc_dump_data of this Controller.
        :type: CtrlIOCDumpData
        """
        self._ctrl_ioc_dump_data = ctrl_ioc_dump_data

    @property
    def locate_in_progress(self):
        """
        Gets the locate_in_progress of this Controller.
        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 tray.

        :return: The locate_in_progress of this Controller.
        :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 Controller.
        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 tray.

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

    @property
    def has_tray_identity_indicator(self):
        """
        Gets the has_tray_identity_indicator of this Controller.
        The device contains 7-segment indicators used to display the Tray Identity.

        :return: The has_tray_identity_indicator of this Controller.
        :rtype: bool
        :required/optional: required
        """
        return self._has_tray_identity_indicator

    @has_tray_identity_indicator.setter
    def has_tray_identity_indicator(self, has_tray_identity_indicator):
        """
        Sets the has_tray_identity_indicator of this Controller.
        The device contains 7-segment indicators used to display the Tray Identity.

        :param has_tray_identity_indicator: The has_tray_identity_indicator of this Controller.
        :type: bool
        """
        self._has_tray_identity_indicator = has_tray_identity_indicator

    @property
    def controller_error_mode(self):
        """
        Gets the controller_error_mode of this Controller.
        Indicates the error mode in which the controller is operating. A value of 0 indicates the controller is not operating in an error mode.

        :return: The controller_error_mode of this Controller.
        :rtype: str
        :required/optional: required
        """
        return self._controller_error_mode

    @controller_error_mode.setter
    def controller_error_mode(self, controller_error_mode):
        """
        Sets the controller_error_mode of this Controller.
        Indicates the error mode in which the controller is operating. A value of 0 indicates the controller is not operating in an error mode.

        :param controller_error_mode: The controller_error_mode of this Controller.
        :type: str
        """
        allowed_values = ["notInErrorMode", "unknown", "t10PiServiceMode", "t10PiLockdown", "__UNDEFINED"]
        if controller_error_mode not in allowed_values:
            raise ValueError(
                "Invalid value for `controller_error_mode`, must be one of {0}"
                .format(allowed_values)
            )
        self._controller_error_mode = controller_error_mode

    @property
    def code_versions(self):
        """
        Gets the code_versions of this Controller.
        Version descriptors for loaded code modules

        :return: The code_versions of this Controller.
        :rtype: list[VersionDescriptor]
        :required/optional: required
        """
        return self._code_versions

    @code_versions.setter
    def code_versions(self, code_versions):
        """
        Sets the code_versions of this Controller.
        Version descriptors for loaded code modules

        :param code_versions: The code_versions of this Controller.
        :type: list[VersionDescriptor]
        """
        self._code_versions = code_versions

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


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

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


        :param id: The id of this Controller.
        :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

