/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is
 * regenerated.
 */

'use strict';

/**
 * Parameters for updating a cluster upgrade.
 *
 */
class UpdateClusterUpgradeDescription {
  /**
   * Create a UpdateClusterUpgradeDescription.
   * @property {string} [upgradeKind] The type of upgrade out of the following
   * possible values. Possible values include: 'Invalid', 'Rolling',
   * 'Rolling_ForceRestart'. Default value: 'Rolling' .
   * @property {object} [updateDescription] Describes the parameters for
   * updating a rolling upgrade of application or cluster.
   * @property {string} [updateDescription.rollingUpgradeMode] The mode used to
   * monitor health during a rolling upgrade. The values are UnmonitoredAuto,
   * UnmonitoredManual, and Monitored. Possible values include: 'Invalid',
   * 'UnmonitoredAuto', 'UnmonitoredManual', 'Monitored'
   * @property {boolean} [updateDescription.forceRestart] If true, then
   * processes are forcefully restarted during upgrade even when the code
   * version has not changed (the upgrade only changes configuration or data).
   * @property {number}
   * [updateDescription.replicaSetCheckTimeoutInMilliseconds] The maximum
   * amount of time to block processing of an upgrade domain and prevent loss
   * of availability when there are unexpected issues. When this timeout
   * expires, processing of the upgrade domain will proceed regardless of
   * availability loss issues. The timeout is reset at the start of each
   * upgrade domain. Valid values are between 0 and 42949672925 inclusive.
   * (unsigned 32-bit integer).
   * @property {string} [updateDescription.failureAction] The compensating
   * action to perform when a Monitored upgrade encounters monitoring policy or
   * health policy violations.
   * Invalid indicates the failure action is invalid. Rollback specifies that
   * the upgrade will start rolling back automatically.
   * Manual indicates that the upgrade will switch to UnmonitoredManual upgrade
   * mode. Possible values include: 'Invalid', 'Rollback', 'Manual'
   * @property {string}
   * [updateDescription.healthCheckWaitDurationInMilliseconds] The amount of
   * time to wait after completing an upgrade domain before applying health
   * policies. It is first interpreted as a string representing an ISO 8601
   * duration. If that fails, then it is interpreted as a number representing
   * the total number of milliseconds.
   * @property {string}
   * [updateDescription.healthCheckStableDurationInMilliseconds] The amount of
   * time that the application or cluster must remain healthy before the
   * upgrade proceeds to the next upgrade domain. It is first interpreted as a
   * string representing an ISO 8601 duration. If that fails, then it is
   * interpreted as a number representing the total number of milliseconds.
   * @property {string}
   * [updateDescription.healthCheckRetryTimeoutInMilliseconds] The amount of
   * time to retry health evaluation when the application or cluster is
   * unhealthy before FailureAction is executed. It is first interpreted as a
   * string representing an ISO 8601 duration. If that fails, then it is
   * interpreted as a number representing the total number of milliseconds.
   * @property {string} [updateDescription.upgradeTimeoutInMilliseconds] The
   * amount of time the overall upgrade has to complete before FailureAction is
   * executed. It is first interpreted as a string representing an ISO 8601
   * duration. If that fails, then it is interpreted as a number representing
   * the total number of milliseconds.
   * @property {string} [updateDescription.upgradeDomainTimeoutInMilliseconds]
   * The amount of time each upgrade domain has to complete before
   * FailureAction is executed. It is first interpreted as a string
   * representing an ISO 8601 duration. If that fails, then it is interpreted
   * as a number representing the total number of milliseconds.
   * @property {object} [clusterHealthPolicy] Defines a health policy used to
   * evaluate the health of the cluster or of a cluster node.
   * @property {boolean} [clusterHealthPolicy.considerWarningAsError] Indicates
   * whether warnings are treated with the same severity as errors.
   * @property {number} [clusterHealthPolicy.maxPercentUnhealthyNodes] The
   * maximum allowed percentage of unhealthy nodes before reporting an error.
   * For example, to allow 10% of nodes to be unhealthy, this value would be
   * 10.
   *
   * The percentage represents the maximum tolerated percentage of nodes that
   * can be unhealthy before the cluster is considered in error.
   * If the percentage is respected but there is at least one unhealthy node,
   * the health is evaluated as Warning.
   * The percentage is calculated by dividing the number of unhealthy nodes
   * over the total number of nodes in the cluster.
   * The computation rounds up to tolerate one failure on small numbers of
   * nodes. Default percentage is zero.
   *
   * In large clusters, some nodes will always be down or out for repairs, so
   * this percentage should be configured to tolerate that.
   * @property {number} [clusterHealthPolicy.maxPercentUnhealthyApplications]
   * The maximum allowed percentage of unhealthy applications before reporting
   * an error. For example, to allow 10% of applications to be unhealthy, this
   * value would be 10.
   *
   * The percentage represents the maximum tolerated percentage of applications
   * that can be unhealthy before the cluster is considered in error.
   * If the percentage is respected but there is at least one unhealthy
   * application, the health is evaluated as Warning.
   * This is calculated by dividing the number of unhealthy applications over
   * the total number of application instances in the cluster, excluding
   * applications of application types that are included in the
   * ApplicationTypeHealthPolicyMap.
   * The computation rounds up to tolerate one failure on small numbers of
   * applications. Default percentage is zero.
   * @property {array} [clusterHealthPolicy.applicationTypeHealthPolicyMap]
   * Defines a map with max percentage unhealthy applications for specific
   * application types.
   * Each entry specifies as key the application type name and as value an
   * integer that represents the MaxPercentUnhealthyApplications percentage
   * used to evaluate the applications of the specified application type.
   *
   * The application type health policy map can be used during cluster health
   * evaluation to describe special application types.
   * The application types included in the map are evaluated against the
   * percentage specified in the map, and not with the global
   * MaxPercentUnhealthyApplications defined in the cluster health policy.
   * The applications of application types specified in the map are not counted
   * against the global pool of applications.
   * For example, if some applications of a type are critical, the cluster
   * administrator can add an entry to the map for that application type
   * and assign it a value of 0% (that is, do not tolerate any failures).
   * All other applications can be evaluated with
   * MaxPercentUnhealthyApplications set to 20% to tolerate some failures out
   * of the thousands of application instances.
   * The application type health policy map is used only if the cluster
   * manifest enables application type health evaluation using the
   * configuration entry for
   * HealthManager/EnableApplicationTypeHealthEvaluation.
   * @property {boolean} [enableDeltaHealthEvaluation] When true, enables delta
   * health evaluation rather than absolute health evaluation after completion
   * of each upgrade domain.
   * @property {object} [clusterUpgradeHealthPolicy] Defines a health policy
   * used to evaluate the health of the cluster during a cluster upgrade.
   * @property {number}
   * [clusterUpgradeHealthPolicy.maxPercentDeltaUnhealthyNodes] The maximum
   * allowed percentage of nodes health degradation allowed during cluster
   * upgrades. The delta is measured between the state of the nodes at the
   * beginning of upgrade and the state of the nodes at the time of the health
   * evaluation. The check is performed after every upgrade domain upgrade
   * completion to make sure the global state of the cluster is within
   * tolerated limits. The default value is 10%.
   * @property {number}
   * [clusterUpgradeHealthPolicy.maxPercentUpgradeDomainDeltaUnhealthyNodes]
   * The maximum allowed percentage of upgrade domain nodes health degradation
   * allowed during cluster upgrades. The delta is measured between the state
   * of the upgrade domain nodes at the beginning of upgrade and the state of
   * the upgrade domain nodes at the time of the health evaluation. The check
   * is performed after every upgrade domain upgrade completion for all
   * completed upgrade domains to make sure the state of the upgrade domains is
   * within tolerated limits. The default value is 15%.
   * @property {object} [applicationHealthPolicyMap] Defines the application
   * health policy map used to evaluate the health of an application or one of
   * its children entities.
   * @property {array} [applicationHealthPolicyMap.applicationHealthPolicyMap]
   * The wrapper that contains the map with application health policies used to
   * evaluate specific applications in the cluster.
   */
  constructor() {
  }

  /**
   * Defines the metadata of UpdateClusterUpgradeDescription
   *
   * @returns {object} metadata of UpdateClusterUpgradeDescription
   *
   */
  mapper() {
    return {
      required: false,
      serializedName: 'UpdateClusterUpgradeDescription',
      type: {
        name: 'Composite',
        className: 'UpdateClusterUpgradeDescription',
        modelProperties: {
          upgradeKind: {
            required: false,
            serializedName: 'UpgradeKind',
            defaultValue: 'Rolling',
            type: {
              name: 'String'
            }
          },
          updateDescription: {
            required: false,
            serializedName: 'UpdateDescription',
            type: {
              name: 'Composite',
              className: 'RollingUpgradeUpdateDescription'
            }
          },
          clusterHealthPolicy: {
            required: false,
            serializedName: 'ClusterHealthPolicy',
            type: {
              name: 'Composite',
              className: 'ClusterHealthPolicy'
            }
          },
          enableDeltaHealthEvaluation: {
            required: false,
            serializedName: 'EnableDeltaHealthEvaluation',
            type: {
              name: 'Boolean'
            }
          },
          clusterUpgradeHealthPolicy: {
            required: false,
            serializedName: 'ClusterUpgradeHealthPolicy',
            type: {
              name: 'Composite',
              className: 'ClusterUpgradeHealthPolicyObject'
            }
          },
          applicationHealthPolicyMap: {
            required: false,
            serializedName: 'ApplicationHealthPolicyMap',
            type: {
              name: 'Composite',
              className: 'ApplicationHealthPolicies'
            }
          }
        }
      }
    };
  }
}

module.exports = UpdateClusterUpgradeDescription;
