# coding: utf-8

"""
    Zadara Provisioning Portal API

     # Overview  This document outlines the methods available for creation and high-level administration of Zadara Storage VPSAs via a Zadara Storage Provisioning Portal. This API supports form-encoded requests, and can return either JSON or XML responses.  ## Endpoint  The base URL for the requests is the Provisioning Portal URL you created your VPSA through - for example: https://manage.zadarastorage.com/, and all APIs will be prefixed with /api as noted in the documentation below.  ## Authentication  To use this API, an authentication token is required. The API for retrieving this token can be found below in the Authentication section. You may pass this token in requests either via the the X-Token header or via basic authentication (base64 encoded) in Authorization header.  ## Questions  If you have any questions or need support involving the REST API, please contact for assistance.   # noqa: E501

    OpenAPI spec version: 23.09-sp2
    Contact: support@zadarastorage.com
    Generated by: https://github.com/swagger-api/swagger-codegen.git
"""


import pprint
import re  # noqa: F401

import six

from ProvisioningPortal.configuration import Configuration


class Cloud(object):
    """NOTE: This class is auto generated by the swagger code generator program.

    Do not edit the class manually.
    """

    """
    Attributes:
      swagger_types (dict): The key is attribute name
                            and the value is attribute type.
      attribute_map (dict): The key is attribute name
                            and the value is json key in definition.
    """
    swagger_types = {
        'id': 'str',
        'name': 'str',
        'uuid': 'str',
        'enabled': 'str',
        'app_engines': 'list[CloudAppEngines]',
        'nova_url': 'str',
        'auth_url': 'str',
        'keystone_url': 'str',
        'glance_url': 'str',
        'drive_types': 'list[CloudDriveTypes]',
        'engine_types': 'list[CloudEngineTypes]',
        'fibre_channel': 'CloudFibreChannel',
        'flash_cache': 'CloudFlashCache',
        'minimum_drives': 'int',
        'supports_app_engines': 'bool',
        'zios': 'CloudFibreChannel',
        'zones': 'list[CloudZones]',
        'vpsa_zone_group_storage_policy_types': 'CloudVpsazoneGroupStoragePolicyTypes',
        'recommended_storage_array_image_id': 'int',
        'last_synced': 'str',
        'sync_status': 'CloudSyncStatus'
    }

    attribute_map = {
        'id': 'id',
        'name': 'name',
        'uuid': 'uuid',
        'enabled': 'enabled',
        'app_engines': 'app_engines',
        'nova_url': 'nova_url',
        'auth_url': 'auth_url',
        'keystone_url': 'keystone_url',
        'glance_url': 'glance_url',
        'drive_types': 'drive_types',
        'engine_types': 'engine_types',
        'fibre_channel': 'fibre_channel',
        'flash_cache': 'flash_cache',
        'minimum_drives': 'minimum_drives',
        'supports_app_engines': 'supports_app_engines',
        'zios': 'zios',
        'zones': 'zones',
        'vpsa_zone_group_storage_policy_types': 'vpsa-zone_group_storage_policy_types',
        'recommended_storage_array_image_id': 'recommended_storage_array_image_id',
        'last_synced': 'last_synced',
        'sync_status': 'sync_status'
    }

    def __init__(self, id=None, name=None, uuid=None, enabled=None, app_engines=None, nova_url=None, auth_url=None, keystone_url=None, glance_url=None, drive_types=None, engine_types=None, fibre_channel=None, flash_cache=None, minimum_drives=None, supports_app_engines=None, zios=None, zones=None, vpsa_zone_group_storage_policy_types=None, recommended_storage_array_image_id=None, last_synced=None, sync_status=None, _configuration=None):  # noqa: E501
        """Cloud - a model defined in Swagger"""  # noqa: E501
        if _configuration is None:
            _configuration = Configuration()
        self._configuration = _configuration

        self._id = None
        self._name = None
        self._uuid = None
        self._enabled = None
        self._app_engines = None
        self._nova_url = None
        self._auth_url = None
        self._keystone_url = None
        self._glance_url = None
        self._drive_types = None
        self._engine_types = None
        self._fibre_channel = None
        self._flash_cache = None
        self._minimum_drives = None
        self._supports_app_engines = None
        self._zios = None
        self._zones = None
        self._vpsa_zone_group_storage_policy_types = None
        self._recommended_storage_array_image_id = None
        self._last_synced = None
        self._sync_status = None
        self.discriminator = None

        if id is not None:
            self.id = id
        if name is not None:
            self.name = name
        if uuid is not None:
            self.uuid = uuid
        if enabled is not None:
            self.enabled = enabled
        if app_engines is not None:
            self.app_engines = app_engines
        if nova_url is not None:
            self.nova_url = nova_url
        if auth_url is not None:
            self.auth_url = auth_url
        if keystone_url is not None:
            self.keystone_url = keystone_url
        if glance_url is not None:
            self.glance_url = glance_url
        if drive_types is not None:
            self.drive_types = drive_types
        if engine_types is not None:
            self.engine_types = engine_types
        if fibre_channel is not None:
            self.fibre_channel = fibre_channel
        if flash_cache is not None:
            self.flash_cache = flash_cache
        if minimum_drives is not None:
            self.minimum_drives = minimum_drives
        if supports_app_engines is not None:
            self.supports_app_engines = supports_app_engines
        if zios is not None:
            self.zios = zios
        if zones is not None:
            self.zones = zones
        if vpsa_zone_group_storage_policy_types is not None:
            self.vpsa_zone_group_storage_policy_types = vpsa_zone_group_storage_policy_types
        if recommended_storage_array_image_id is not None:
            self.recommended_storage_array_image_id = recommended_storage_array_image_id
        if last_synced is not None:
            self.last_synced = last_synced
        if sync_status is not None:
            self.sync_status = sync_status

    @property
    def id(self):
        """Gets the id of this Cloud.  # noqa: E501


        :return: The id of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._id

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


        :param id: The id of this Cloud.  # noqa: E501
        :type: str
        """

        self._id = id

    @property
    def name(self):
        """Gets the name of this Cloud.  # noqa: E501


        :return: The name of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._name

    @name.setter
    def name(self, name):
        """Sets the name of this Cloud.


        :param name: The name of this Cloud.  # noqa: E501
        :type: str
        """

        self._name = name

    @property
    def uuid(self):
        """Gets the uuid of this Cloud.  # noqa: E501


        :return: The uuid of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._uuid

    @uuid.setter
    def uuid(self, uuid):
        """Sets the uuid of this Cloud.


        :param uuid: The uuid of this Cloud.  # noqa: E501
        :type: str
        """

        self._uuid = uuid

    @property
    def enabled(self):
        """Gets the enabled of this Cloud.  # noqa: E501


        :return: The enabled of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._enabled

    @enabled.setter
    def enabled(self, enabled):
        """Sets the enabled of this Cloud.


        :param enabled: The enabled of this Cloud.  # noqa: E501
        :type: str
        """

        self._enabled = enabled

    @property
    def app_engines(self):
        """Gets the app_engines of this Cloud.  # noqa: E501


        :return: The app_engines of this Cloud.  # noqa: E501
        :rtype: list[CloudAppEngines]
        """
        return self._app_engines

    @app_engines.setter
    def app_engines(self, app_engines):
        """Sets the app_engines of this Cloud.


        :param app_engines: The app_engines of this Cloud.  # noqa: E501
        :type: list[CloudAppEngines]
        """

        self._app_engines = app_engines

    @property
    def nova_url(self):
        """Gets the nova_url of this Cloud.  # noqa: E501


        :return: The nova_url of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._nova_url

    @nova_url.setter
    def nova_url(self, nova_url):
        """Sets the nova_url of this Cloud.


        :param nova_url: The nova_url of this Cloud.  # noqa: E501
        :type: str
        """

        self._nova_url = nova_url

    @property
    def auth_url(self):
        """Gets the auth_url of this Cloud.  # noqa: E501


        :return: The auth_url of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._auth_url

    @auth_url.setter
    def auth_url(self, auth_url):
        """Sets the auth_url of this Cloud.


        :param auth_url: The auth_url of this Cloud.  # noqa: E501
        :type: str
        """

        self._auth_url = auth_url

    @property
    def keystone_url(self):
        """Gets the keystone_url of this Cloud.  # noqa: E501


        :return: The keystone_url of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._keystone_url

    @keystone_url.setter
    def keystone_url(self, keystone_url):
        """Sets the keystone_url of this Cloud.


        :param keystone_url: The keystone_url of this Cloud.  # noqa: E501
        :type: str
        """

        self._keystone_url = keystone_url

    @property
    def glance_url(self):
        """Gets the glance_url of this Cloud.  # noqa: E501


        :return: The glance_url of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._glance_url

    @glance_url.setter
    def glance_url(self, glance_url):
        """Sets the glance_url of this Cloud.


        :param glance_url: The glance_url of this Cloud.  # noqa: E501
        :type: str
        """

        self._glance_url = glance_url

    @property
    def drive_types(self):
        """Gets the drive_types of this Cloud.  # noqa: E501


        :return: The drive_types of this Cloud.  # noqa: E501
        :rtype: list[CloudDriveTypes]
        """
        return self._drive_types

    @drive_types.setter
    def drive_types(self, drive_types):
        """Sets the drive_types of this Cloud.


        :param drive_types: The drive_types of this Cloud.  # noqa: E501
        :type: list[CloudDriveTypes]
        """

        self._drive_types = drive_types

    @property
    def engine_types(self):
        """Gets the engine_types of this Cloud.  # noqa: E501


        :return: The engine_types of this Cloud.  # noqa: E501
        :rtype: list[CloudEngineTypes]
        """
        return self._engine_types

    @engine_types.setter
    def engine_types(self, engine_types):
        """Sets the engine_types of this Cloud.


        :param engine_types: The engine_types of this Cloud.  # noqa: E501
        :type: list[CloudEngineTypes]
        """

        self._engine_types = engine_types

    @property
    def fibre_channel(self):
        """Gets the fibre_channel of this Cloud.  # noqa: E501


        :return: The fibre_channel of this Cloud.  # noqa: E501
        :rtype: CloudFibreChannel
        """
        return self._fibre_channel

    @fibre_channel.setter
    def fibre_channel(self, fibre_channel):
        """Sets the fibre_channel of this Cloud.


        :param fibre_channel: The fibre_channel of this Cloud.  # noqa: E501
        :type: CloudFibreChannel
        """

        self._fibre_channel = fibre_channel

    @property
    def flash_cache(self):
        """Gets the flash_cache of this Cloud.  # noqa: E501


        :return: The flash_cache of this Cloud.  # noqa: E501
        :rtype: CloudFlashCache
        """
        return self._flash_cache

    @flash_cache.setter
    def flash_cache(self, flash_cache):
        """Sets the flash_cache of this Cloud.


        :param flash_cache: The flash_cache of this Cloud.  # noqa: E501
        :type: CloudFlashCache
        """

        self._flash_cache = flash_cache

    @property
    def minimum_drives(self):
        """Gets the minimum_drives of this Cloud.  # noqa: E501


        :return: The minimum_drives of this Cloud.  # noqa: E501
        :rtype: int
        """
        return self._minimum_drives

    @minimum_drives.setter
    def minimum_drives(self, minimum_drives):
        """Sets the minimum_drives of this Cloud.


        :param minimum_drives: The minimum_drives of this Cloud.  # noqa: E501
        :type: int
        """

        self._minimum_drives = minimum_drives

    @property
    def supports_app_engines(self):
        """Gets the supports_app_engines of this Cloud.  # noqa: E501


        :return: The supports_app_engines of this Cloud.  # noqa: E501
        :rtype: bool
        """
        return self._supports_app_engines

    @supports_app_engines.setter
    def supports_app_engines(self, supports_app_engines):
        """Sets the supports_app_engines of this Cloud.


        :param supports_app_engines: The supports_app_engines of this Cloud.  # noqa: E501
        :type: bool
        """

        self._supports_app_engines = supports_app_engines

    @property
    def zios(self):
        """Gets the zios of this Cloud.  # noqa: E501


        :return: The zios of this Cloud.  # noqa: E501
        :rtype: CloudFibreChannel
        """
        return self._zios

    @zios.setter
    def zios(self, zios):
        """Sets the zios of this Cloud.


        :param zios: The zios of this Cloud.  # noqa: E501
        :type: CloudFibreChannel
        """

        self._zios = zios

    @property
    def zones(self):
        """Gets the zones of this Cloud.  # noqa: E501


        :return: The zones of this Cloud.  # noqa: E501
        :rtype: list[CloudZones]
        """
        return self._zones

    @zones.setter
    def zones(self, zones):
        """Sets the zones of this Cloud.


        :param zones: The zones of this Cloud.  # noqa: E501
        :type: list[CloudZones]
        """

        self._zones = zones

    @property
    def vpsa_zone_group_storage_policy_types(self):
        """Gets the vpsa_zone_group_storage_policy_types of this Cloud.  # noqa: E501


        :return: The vpsa_zone_group_storage_policy_types of this Cloud.  # noqa: E501
        :rtype: CloudVpsazoneGroupStoragePolicyTypes
        """
        return self._vpsa_zone_group_storage_policy_types

    @vpsa_zone_group_storage_policy_types.setter
    def vpsa_zone_group_storage_policy_types(self, vpsa_zone_group_storage_policy_types):
        """Sets the vpsa_zone_group_storage_policy_types of this Cloud.


        :param vpsa_zone_group_storage_policy_types: The vpsa_zone_group_storage_policy_types of this Cloud.  # noqa: E501
        :type: CloudVpsazoneGroupStoragePolicyTypes
        """

        self._vpsa_zone_group_storage_policy_types = vpsa_zone_group_storage_policy_types

    @property
    def recommended_storage_array_image_id(self):
        """Gets the recommended_storage_array_image_id of this Cloud.  # noqa: E501


        :return: The recommended_storage_array_image_id of this Cloud.  # noqa: E501
        :rtype: int
        """
        return self._recommended_storage_array_image_id

    @recommended_storage_array_image_id.setter
    def recommended_storage_array_image_id(self, recommended_storage_array_image_id):
        """Sets the recommended_storage_array_image_id of this Cloud.


        :param recommended_storage_array_image_id: The recommended_storage_array_image_id of this Cloud.  # noqa: E501
        :type: int
        """

        self._recommended_storage_array_image_id = recommended_storage_array_image_id

    @property
    def last_synced(self):
        """Gets the last_synced of this Cloud.  # noqa: E501


        :return: The last_synced of this Cloud.  # noqa: E501
        :rtype: str
        """
        return self._last_synced

    @last_synced.setter
    def last_synced(self, last_synced):
        """Sets the last_synced of this Cloud.


        :param last_synced: The last_synced of this Cloud.  # noqa: E501
        :type: str
        """

        self._last_synced = last_synced

    @property
    def sync_status(self):
        """Gets the sync_status of this Cloud.  # noqa: E501


        :return: The sync_status of this Cloud.  # noqa: E501
        :rtype: CloudSyncStatus
        """
        return self._sync_status

    @sync_status.setter
    def sync_status(self, sync_status):
        """Sets the sync_status of this Cloud.


        :param sync_status: The sync_status of this Cloud.  # noqa: E501
        :type: CloudSyncStatus
        """

        self._sync_status = sync_status

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

        for attr, _ in six.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
        if issubclass(Cloud, dict):
            for key, value in self.items():
                result[key] = value

        return result

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

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

    def __eq__(self, other):
        """Returns true if both objects are equal"""
        if not isinstance(other, Cloud):
            return False

        return self.to_dict() == other.to_dict()

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

        return self.to_dict() != other.to_dict()
