# 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.03-sp1
    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 CreateVpsa(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 = {
        'kind': 'str',
        'name': 'str',
        'description': 'str',
        'provider': 'str',
        'allocation_zone': 'str',
        'drives': 'VpsasJsonDrives',
        'custom_network_id': 'int',
        'vlan_id': 'int',
        'engine': 'str',
        'app_engine': 'str',
        'flash_cache_capacity': 'int',
        'enterprise_suite': 'str',
        'fibre_channel': 'str',
        'flc_enabled': 'str',
        'iscsi_dual_target_mode_enabled': 'str',
        'create_raid_10_pools': 'bool',
        'data_reduction_bundle': 'bool',
        'vpsa_zone_group_storage_policy_type_id': 'int',
        'storage_profile': 'str',
        'moderate': 'bool'
    }

    attribute_map = {
        'kind': 'kind',
        'name': 'name',
        'description': 'description',
        'provider': 'provider',
        'allocation_zone': 'allocation_zone',
        'drives': 'drives',
        'custom_network_id': 'custom_network_id',
        'vlan_id': 'vlan_id',
        'engine': 'engine',
        'app_engine': 'app_engine',
        'flash_cache_capacity': 'flash_cache_capacity',
        'enterprise_suite': 'enterprise_suite',
        'fibre_channel': 'fibre_channel',
        'flc_enabled': 'flc_enabled',
        'iscsi_dual_target_mode_enabled': 'iscsi_dual_target_mode_enabled',
        'create_raid_10_pools': 'create_raid_10_pools',
        'data_reduction_bundle': 'data_reduction_bundle',
        'vpsa_zone_group_storage_policy_type_id': 'vpsa_zone_group_storage_policy_type_id',
        'storage_profile': 'storage_profile',
        'moderate': 'moderate'
    }

    def __init__(self, kind=None, name=None, description=None, provider=None, allocation_zone=None, drives=None, custom_network_id=None, vlan_id=None, engine=None, app_engine=None, flash_cache_capacity=None, enterprise_suite=None, fibre_channel=None, flc_enabled=None, iscsi_dual_target_mode_enabled=None, create_raid_10_pools=None, data_reduction_bundle=None, vpsa_zone_group_storage_policy_type_id=None, storage_profile=None, moderate=None, _configuration=None):  # noqa: E501
        """CreateVpsa - a model defined in Swagger"""  # noqa: E501
        if _configuration is None:
            _configuration = Configuration()
        self._configuration = _configuration

        self._kind = None
        self._name = None
        self._description = None
        self._provider = None
        self._allocation_zone = None
        self._drives = None
        self._custom_network_id = None
        self._vlan_id = None
        self._engine = None
        self._app_engine = None
        self._flash_cache_capacity = None
        self._enterprise_suite = None
        self._fibre_channel = None
        self._flc_enabled = None
        self._iscsi_dual_target_mode_enabled = None
        self._create_raid_10_pools = None
        self._data_reduction_bundle = None
        self._vpsa_zone_group_storage_policy_type_id = None
        self._storage_profile = None
        self._moderate = None
        self.discriminator = None

        self.kind = kind
        self.name = name
        if description is not None:
            self.description = description
        self.provider = provider
        if allocation_zone is not None:
            self.allocation_zone = allocation_zone
        self.drives = drives
        if custom_network_id is not None:
            self.custom_network_id = custom_network_id
        if vlan_id is not None:
            self.vlan_id = vlan_id
        self.engine = engine
        if app_engine is not None:
            self.app_engine = app_engine
        if flash_cache_capacity is not None:
            self.flash_cache_capacity = flash_cache_capacity
        if enterprise_suite is not None:
            self.enterprise_suite = enterprise_suite
        if fibre_channel is not None:
            self.fibre_channel = fibre_channel
        if flc_enabled is not None:
            self.flc_enabled = flc_enabled
        if iscsi_dual_target_mode_enabled is not None:
            self.iscsi_dual_target_mode_enabled = iscsi_dual_target_mode_enabled
        if create_raid_10_pools is not None:
            self.create_raid_10_pools = create_raid_10_pools
        if data_reduction_bundle is not None:
            self.data_reduction_bundle = data_reduction_bundle
        if vpsa_zone_group_storage_policy_type_id is not None:
            self.vpsa_zone_group_storage_policy_type_id = vpsa_zone_group_storage_policy_type_id
        if storage_profile is not None:
            self.storage_profile = storage_profile
        self.moderate = moderate

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

        VPSA kind  # noqa: E501

        :return: The kind of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._kind

    @kind.setter
    def kind(self, kind):
        """Sets the kind of this CreateVpsa.

        VPSA kind  # noqa: E501

        :param kind: The kind of this CreateVpsa.  # noqa: E501
        :type: str
        """
        if self._configuration.client_side_validation and kind is None:
            raise ValueError("Invalid value for `kind`, must not be `None`")  # noqa: E501
        allowed_values = ["storage_array", "object_storage"]  # noqa: E501
        if (self._configuration.client_side_validation and
                kind not in allowed_values):
            raise ValueError(
                "Invalid value for `kind` ({0}), must be one of {1}"  # noqa: E501
                .format(kind, allowed_values)
            )

        self._kind = kind

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

        Your VPSA's name.  # noqa: E501

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

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

        Your VPSA's name.  # noqa: E501

        :param name: The name of this CreateVpsa.  # noqa: E501
        :type: str
        """
        if self._configuration.client_side_validation and name is None:
            raise ValueError("Invalid value for `name`, must not be `None`")  # noqa: E501

        self._name = name

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

        Your VPSA's description.  # noqa: E501

        :return: The description of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._description

    @description.setter
    def description(self, description):
        """Sets the description of this CreateVpsa.

        Your VPSA's description.  # noqa: E501

        :param description: The description of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._description = description

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

        The key for your desired site.  # noqa: E501

        :return: The provider of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._provider

    @provider.setter
    def provider(self, provider):
        """Sets the provider of this CreateVpsa.

        The key for your desired site.  # noqa: E501

        :param provider: The provider of this CreateVpsa.  # noqa: E501
        :type: str
        """
        if self._configuration.client_side_validation and provider is None:
            raise ValueError("Invalid value for `provider`, must not be `None`")  # noqa: E501

        self._provider = provider

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

        Use this parameter to create vcs in a specific allocation zone. Use /providers API to get allocation zones. If using multiple zones, don't pass this parameter  # noqa: E501

        :return: The allocation_zone of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._allocation_zone

    @allocation_zone.setter
    def allocation_zone(self, allocation_zone):
        """Sets the allocation_zone of this CreateVpsa.

        Use this parameter to create vcs in a specific allocation zone. Use /providers API to get allocation zones. If using multiple zones, don't pass this parameter  # noqa: E501

        :param allocation_zone: The allocation_zone of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._allocation_zone = allocation_zone

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


        :return: The drives of this CreateVpsa.  # noqa: E501
        :rtype: VpsasJsonDrives
        """
        return self._drives

    @drives.setter
    def drives(self, drives):
        """Sets the drives of this CreateVpsa.


        :param drives: The drives of this CreateVpsa.  # noqa: E501
        :type: VpsasJsonDrives
        """
        if self._configuration.client_side_validation and drives is None:
            raise ValueError("Invalid value for `drives`, must not be `None`")  # noqa: E501

        self._drives = drives

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

        Specify a custom network according. If not specified and user has only one Custom Network, it will be automatically used.  # noqa: E501

        :return: The custom_network_id of this CreateVpsa.  # noqa: E501
        :rtype: int
        """
        return self._custom_network_id

    @custom_network_id.setter
    def custom_network_id(self, custom_network_id):
        """Sets the custom_network_id of this CreateVpsa.

        Specify a custom network according. If not specified and user has only one Custom Network, it will be automatically used.  # noqa: E501

        :param custom_network_id: The custom_network_id of this CreateVpsa.  # noqa: E501
        :type: int
        """

        self._custom_network_id = custom_network_id

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

        Specify a vlan ID  # noqa: E501

        :return: The vlan_id of this CreateVpsa.  # noqa: E501
        :rtype: int
        """
        return self._vlan_id

    @vlan_id.setter
    def vlan_id(self, vlan_id):
        """Sets the vlan_id of this CreateVpsa.

        Specify a vlan ID  # noqa: E501

        :param vlan_id: The vlan_id of this CreateVpsa.  # noqa: E501
        :type: int
        """

        self._vlan_id = vlan_id

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

        The Engine Type key for your desired Engine Type.  # noqa: E501

        :return: The engine of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._engine

    @engine.setter
    def engine(self, engine):
        """Sets the engine of this CreateVpsa.

        The Engine Type key for your desired Engine Type.  # noqa: E501

        :param engine: The engine of this CreateVpsa.  # noqa: E501
        :type: str
        """
        if self._configuration.client_side_validation and engine is None:
            raise ValueError("Invalid value for `engine`, must not be `None`")  # noqa: E501

        self._engine = engine

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

        The APP Engine Type key for your desired APP Engine Type.  # noqa: E501

        :return: The app_engine of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._app_engine

    @app_engine.setter
    def app_engine(self, app_engine):
        """Sets the app_engine of this CreateVpsa.

        The APP Engine Type key for your desired APP Engine Type.  # noqa: E501

        :param app_engine: The app_engine of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._app_engine = app_engine

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

        The amount of extended Flash Cache you would like your VPSA to be created with, if your Cloud supports extended Flash Cache.  Cannot exceed the maximum extended Flash Cache value for your VPSA's Engine Type, and must be in increments of `increment_gb`, as specified by the Cloud's `flash_cache` properties.  # noqa: E501

        :return: The flash_cache_capacity of this CreateVpsa.  # noqa: E501
        :rtype: int
        """
        return self._flash_cache_capacity

    @flash_cache_capacity.setter
    def flash_cache_capacity(self, flash_cache_capacity):
        """Sets the flash_cache_capacity of this CreateVpsa.

        The amount of extended Flash Cache you would like your VPSA to be created with, if your Cloud supports extended Flash Cache.  Cannot exceed the maximum extended Flash Cache value for your VPSA's Engine Type, and must be in increments of `increment_gb`, as specified by the Cloud's `flash_cache` properties.  # noqa: E501

        :param flash_cache_capacity: The flash_cache_capacity of this CreateVpsa.  # noqa: E501
        :type: int
        """

        self._flash_cache_capacity = flash_cache_capacity

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

        Any value for this parameter will enable Enterprise Suite features.  Omit the parameter to disable Enterprise Suite.  # noqa: E501

        :return: The enterprise_suite of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._enterprise_suite

    @enterprise_suite.setter
    def enterprise_suite(self, enterprise_suite):
        """Sets the enterprise_suite of this CreateVpsa.

        Any value for this parameter will enable Enterprise Suite features.  Omit the parameter to disable Enterprise Suite.  # noqa: E501

        :param enterprise_suite: The enterprise_suite of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._enterprise_suite = enterprise_suite

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

        Any value for this parameter will enable Fibre Channel, if the Cloud supports it.  Omit this parameter to disable Fibre Channel.  # noqa: E501

        :return: The fibre_channel of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._fibre_channel

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

        Any value for this parameter will enable Fibre Channel, if the Cloud supports it.  Omit this parameter to disable Fibre Channel.  # noqa: E501

        :param fibre_channel: The fibre_channel of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._fibre_channel = fibre_channel

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

        Any value for this parameter will enable File Lifecycle, if the Cloud supports it.  Omit this parameter to disable File Lifecycle.  # noqa: E501

        :return: The flc_enabled of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._flc_enabled

    @flc_enabled.setter
    def flc_enabled(self, flc_enabled):
        """Sets the flc_enabled of this CreateVpsa.

        Any value for this parameter will enable File Lifecycle, if the Cloud supports it.  Omit this parameter to disable File Lifecycle.  # noqa: E501

        :param flc_enabled: The flc_enabled of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._flc_enabled = flc_enabled

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

        Any value for this parameter will enable iSCSI Dual Target, if the Cloud supports it.  Omit this parameter to disable iSCSI Dual Target.  # noqa: E501

        :return: The iscsi_dual_target_mode_enabled of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._iscsi_dual_target_mode_enabled

    @iscsi_dual_target_mode_enabled.setter
    def iscsi_dual_target_mode_enabled(self, iscsi_dual_target_mode_enabled):
        """Sets the iscsi_dual_target_mode_enabled of this CreateVpsa.

        Any value for this parameter will enable iSCSI Dual Target, if the Cloud supports it.  Omit this parameter to disable iSCSI Dual Target.  # noqa: E501

        :param iscsi_dual_target_mode_enabled: The iscsi_dual_target_mode_enabled of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._iscsi_dual_target_mode_enabled = iscsi_dual_target_mode_enabled

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

        VPSA will automatically create a Pool consisting of RAID10 from requested disks. Default - true.  # noqa: E501

        :return: The create_raid_10_pools of this CreateVpsa.  # noqa: E501
        :rtype: bool
        """
        return self._create_raid_10_pools

    @create_raid_10_pools.setter
    def create_raid_10_pools(self, create_raid_10_pools):
        """Sets the create_raid_10_pools of this CreateVpsa.

        VPSA will automatically create a Pool consisting of RAID10 from requested disks. Default - true.  # noqa: E501

        :param create_raid_10_pools: The create_raid_10_pools of this CreateVpsa.  # noqa: E501
        :type: bool
        """

        self._create_raid_10_pools = create_raid_10_pools

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

        Sets Data Reduction Bundle for Flash VPSAs (relevant only to vpsa flash array). Default - true.  # noqa: E501

        :return: The data_reduction_bundle of this CreateVpsa.  # noqa: E501
        :rtype: bool
        """
        return self._data_reduction_bundle

    @data_reduction_bundle.setter
    def data_reduction_bundle(self, data_reduction_bundle):
        """Sets the data_reduction_bundle of this CreateVpsa.

        Sets Data Reduction Bundle for Flash VPSAs (relevant only to vpsa flash array). Default - true.  # noqa: E501

        :param data_reduction_bundle: The data_reduction_bundle of this CreateVpsa.  # noqa: E501
        :type: bool
        """

        self._data_reduction_bundle = data_reduction_bundle

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


        :return: The vpsa_zone_group_storage_policy_type_id of this CreateVpsa.  # noqa: E501
        :rtype: int
        """
        return self._vpsa_zone_group_storage_policy_type_id

    @vpsa_zone_group_storage_policy_type_id.setter
    def vpsa_zone_group_storage_policy_type_id(self, vpsa_zone_group_storage_policy_type_id):
        """Sets the vpsa_zone_group_storage_policy_type_id of this CreateVpsa.


        :param vpsa_zone_group_storage_policy_type_id: The vpsa_zone_group_storage_policy_type_id of this CreateVpsa.  # noqa: E501
        :type: int
        """

        self._vpsa_zone_group_storage_policy_type_id = vpsa_zone_group_storage_policy_type_id

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


        :return: The storage_profile of this CreateVpsa.  # noqa: E501
        :rtype: str
        """
        return self._storage_profile

    @storage_profile.setter
    def storage_profile(self, storage_profile):
        """Sets the storage_profile of this CreateVpsa.


        :param storage_profile: The storage_profile of this CreateVpsa.  # noqa: E501
        :type: str
        """

        self._storage_profile = storage_profile

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

        Create vpsa request.  # noqa: E501

        :return: The moderate of this CreateVpsa.  # noqa: E501
        :rtype: bool
        """
        return self._moderate

    @moderate.setter
    def moderate(self, moderate):
        """Sets the moderate of this CreateVpsa.

        Create vpsa request.  # noqa: E501

        :param moderate: The moderate of this CreateVpsa.  # noqa: E501
        :type: bool
        """
        if self._configuration.client_side_validation and moderate is None:
            raise ValueError("Invalid value for `moderate`, must not be `None`")  # noqa: E501

        self._moderate = moderate

    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(CreateVpsa, 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, CreateVpsa):
            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, CreateVpsa):
            return True

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