private ApplicationUpgradePolicy SetUpgradePolicy(ApplicationUpgradePolicy currentPolicy)
        {
            if (currentPolicy == null)
            {
                currentPolicy = new ApplicationUpgradePolicy();
            }

            if (ForceRestart.IsPresent)
            {
                currentPolicy.ForceRestart = true;
            }

            if (this.IsParameterBound(c => c.UpgradeReplicaSetCheckTimeoutSec))
            {
                currentPolicy.UpgradeReplicaSetCheckTimeout = TimeSpan.FromSeconds(UpgradeReplicaSetCheckTimeoutSec).ToString("");
            }

            //RollingUpgradeMonitoringPolicy
            if (currentPolicy.RollingUpgradeMonitoringPolicy == null)
            {
                //initialize with defaults
                currentPolicy.RollingUpgradeMonitoringPolicy = new ArmRollingUpgradeMonitoringPolicy(
                    failureAction: "Manual",
                    healthCheckStableDuration: TimeSpan.FromSeconds(120).ToString("c"),
                    healthCheckRetryTimeout: TimeSpan.FromSeconds(600).ToString("c"),
                    healthCheckWaitDuration: TimeSpan.FromSeconds(0).ToString("c"),
                    upgradeTimeout: TimeSpan.MaxValue.ToString("c"),
                    upgradeDomainTimeout: TimeSpan.MaxValue.ToString("c"));
            }

            if (this.IsParameterBound(c => c.FailureAction))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.FailureAction = FailureAction.ToString();
            }

            if (this.IsParameterBound(c => c.HealthCheckRetryTimeoutSec))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckRetryTimeout = TimeSpan.FromSeconds(HealthCheckRetryTimeoutSec).ToString("c");
            }

            if (this.IsParameterBound(c => c.HealthCheckWaitDurationSec))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckWaitDuration = TimeSpan.FromSeconds(HealthCheckWaitDurationSec).ToString("c");
            }

            if (this.IsParameterBound(c => c.HealthCheckStableDurationSec))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckStableDuration = TimeSpan.FromSeconds(HealthCheckStableDurationSec).ToString("c");
            }

            if (this.IsParameterBound(c => c.UpgradeDomainTimeoutSec))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.UpgradeDomainTimeout = TimeSpan.FromSeconds(UpgradeDomainTimeoutSec).ToString("c");
            }

            if (this.IsParameterBound(c => c.UpgradeTimeoutSec))
            {
                currentPolicy.RollingUpgradeMonitoringPolicy.UpgradeTimeout = TimeSpan.FromSeconds(UpgradeTimeoutSec).ToString("c");
            }

            //ApplicationHealthPolicy
            if (currentPolicy.ApplicationHealthPolicy == null)
            {
                currentPolicy.ApplicationHealthPolicy = new ArmApplicationHealthPolicy();
            }

            if (ConsiderWarningAsError.IsPresent)
            {
                currentPolicy.ApplicationHealthPolicy.ConsiderWarningAsError = true;
            }

            if (currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy == null)
            {
                currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy = new ArmServiceTypeHealthPolicy(
                    maxPercentUnhealthyPartitionsPerService: DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService,
                    maxPercentUnhealthyReplicasPerPartition: DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition,
                    maxPercentUnhealthyServices: DefaultServiceTypeUnhealthyServicesMaxPercent);
            }
            else
            {
                if (this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyPartitionsPerService = DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService;
                }

                if (this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyReplicasPerPartition = DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition;
                }

                if (this.IsParameterBound(c => c.DefaultServiceTypeUnhealthyServicesMaxPercent))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyServices = DefaultServiceTypeUnhealthyServicesMaxPercent;
                }

                if (this.IsParameterBound(c => c.UnhealthyDeployedApplicationsMaxPercent))
                {
                    currentPolicy.ApplicationHealthPolicy.MaxPercentUnhealthyDeployedApplications = UnhealthyDeployedApplicationsMaxPercent;
                }
            }

            if (ServiceTypeHealthPolicyMap != null)
            {
                foreach (DictionaryEntry entry in this.ServiceTypeHealthPolicyMap)
                {
                    currentPolicy.ApplicationHealthPolicy.ServiceTypeHealthPolicyMap.Add(entry.Key as string, this.ParseServiceTypeHealthPolicy(entry.Value as string));
                }
            }

            return(currentPolicy);
        }
        private ApplicationUpgradePolicy SetUpgradePolicy(ApplicationUpgradePolicy currentPolicy)
        {
            if (currentPolicy == null)
            {
                currentPolicy = new ApplicationUpgradePolicy();
            }

            if (this.IsParameterBound(c => c.ForceRestart))
            {
                currentPolicy.ForceRestart = this.ForceRestart.ToBool();
            }

            if (this.IsParameterBound(c => c.RecreateApplication))
            {
                currentPolicy.RecreateApplication = this.RecreateApplication.ToBool();
            }

            if (this.IsParameterBound(c => c.UpgradeReplicaSetCheckTimeoutSec))
            {
                currentPolicy.UpgradeReplicaSetCheckTimeout = this.UpgradeReplicaSetCheckTimeoutSec;
            }

            if (this.IsParameterBound(c => c.InstanceCloseDelayDurationSec))
            {
                currentPolicy.InstanceCloseDelayDuration = this.InstanceCloseDelayDurationSec;
            }

            if (this.IsParameterBound(c => c.UpgradeMode))
            {
                currentPolicy.UpgradeMode = this.UpgradeMode.ToString();
            }

            if (this.RecreateApplication.ToBool())
            {
                if (
                    this.IsParameterBound(c => c.UpgradeReplicaSetCheckTimeoutSec) || this.IsParameterBound(c => c.InstanceCloseDelayDurationSec) ||
                    this.IsParameterBound(c => c.UpgradeMode) || this.IsParameterBound(c => c.ForceRestart) ||
                    // RollingUpgradeMonitoringPolicy
                    this.IsParameterBound(c => c.UpgradeDomainTimeoutSec) || this.IsParameterBound(c => c.UpgradeTimeoutSec) ||
                    this.IsParameterBound(c => c.HealthCheckWaitDurationSec) || this.IsParameterBound(c => c.HealthCheckRetryTimeoutSec) ||
                    this.IsParameterBound(c => c.HealthCheckStableDurationSec) || this.IsParameterBound(c => c.FailureAction) ||
                    // ApplicationHealthPolicy
                    this.IsParameterBound(c => c.ServiceTypeHealthPolicyMap) || this.IsParameterBound(c => c.UnhealthyDeployedApplicationsMaxPercent) ||
                    this.IsParameterBound(c => c.DefaultServiceTypeUnhealthyServicesMaxPercent) ||
                    this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition) ||
                    this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService) ||
                    this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService)
                    )
                {
                    throw new InvalidOperationException("If RecreateApplication=True, no other parameters are accepted.");
                }
            }
            else
            {
                // RollingUpgradeMonitoringPolicy
                if (currentPolicy.RollingUpgradeMonitoringPolicy == null)
                {
                    // initialize with defaults
                    currentPolicy.RollingUpgradeMonitoringPolicy = new RollingUpgradeMonitoringPolicy(
                        failureAction: FailureActionDefault.ToString(),
                        healthCheckStableDuration: HealthCheckStableDurationDefault,
                        healthCheckRetryTimeout: HealthCheckRetryTimeoutDefault,
                        healthCheckWaitDuration: HealthCheckWaitDurationDefault,
                        upgradeTimeout: UpgradeTimeoutDefault,
                        upgradeDomainTimeout: UpgradeDomainTimeoutDefault);
                }

                if (this.IsParameterBound(c => c.FailureAction))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.FailureAction = this.FailureAction.ToString();
                }

                if (this.IsParameterBound(c => c.HealthCheckRetryTimeoutSec))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckRetryTimeout = TimeSpan.FromSeconds(this.HealthCheckRetryTimeoutSec).ToString("c");
                }

                if (this.IsParameterBound(c => c.HealthCheckWaitDurationSec))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckWaitDuration = TimeSpan.FromSeconds(this.HealthCheckWaitDurationSec).ToString("c");
                }

                if (this.IsParameterBound(c => c.HealthCheckStableDurationSec))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.HealthCheckStableDuration = TimeSpan.FromSeconds(this.HealthCheckStableDurationSec).ToString("c");
                }

                if (this.IsParameterBound(c => c.UpgradeDomainTimeoutSec))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.UpgradeDomainTimeout = TimeSpan.FromSeconds(this.UpgradeDomainTimeoutSec).ToString("c");
                }

                if (this.IsParameterBound(c => c.UpgradeTimeoutSec))
                {
                    currentPolicy.RollingUpgradeMonitoringPolicy.UpgradeTimeout = TimeSpan.FromSeconds(this.UpgradeTimeoutSec).ToString("c");
                }

                //ApplicationHealthPolicy
                if (currentPolicy.ApplicationHealthPolicy == null)
                {
                    currentPolicy.ApplicationHealthPolicy = new ApplicationHealthPolicy();
                }

                if (this.IsParameterBound(c => c.ConsiderWarningAsError))
                {
                    currentPolicy.ApplicationHealthPolicy.ConsiderWarningAsError = this.ConsiderWarningAsError.ToBool();
                }

                if (currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy == null)
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy = new ServiceTypeHealthPolicy(
                        maxPercentUnhealthyPartitionsPerService: ServiceTypeMaxPercentUnhealthyPartitionsPerServiceDefault,
                        maxPercentUnhealthyReplicasPerPartition: ServiceTypeMaxPercentUnhealthyReplicasPerPartitionDefault,
                        maxPercentUnhealthyServices: ServiceTypeUnhealthyServicesMaxPercentDefault);
                }

                if (this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyPartitionsPerService =
                        this.DefaultServiceTypeMaxPercentUnhealthyPartitionsPerService;
                }

                if (this.IsParameterBound(c => c.DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyReplicasPerPartition =
                        this.DefaultServiceTypeMaxPercentUnhealthyReplicasPerPartition;
                }

                if (this.IsParameterBound(c => c.DefaultServiceTypeUnhealthyServicesMaxPercent))
                {
                    currentPolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyServices = this.DefaultServiceTypeUnhealthyServicesMaxPercent;
                }

                if (this.IsParameterBound(c => c.UnhealthyDeployedApplicationsMaxPercent))
                {
                    currentPolicy.ApplicationHealthPolicy.MaxPercentUnhealthyDeployedApplications = this.UnhealthyDeployedApplicationsMaxPercent;
                }

                if (this.IsParameterBound(c => c.ServiceTypeHealthPolicyMap))
                {
                    if (this.ServiceTypeHealthPolicyMap == null)
                    {
                        currentPolicy.ApplicationHealthPolicy.ServiceTypeHealthPolicyMap = null;
                    }
                    else
                    {
                        if (currentPolicy.ApplicationHealthPolicy.ServiceTypeHealthPolicyMap == null)
                        {
                            currentPolicy.ApplicationHealthPolicy.ServiceTypeHealthPolicyMap = new Dictionary <string, ServiceTypeHealthPolicy>();
                        }

                        foreach (DictionaryEntry entry in this.ServiceTypeHealthPolicyMap)
                        {
                            currentPolicy.ApplicationHealthPolicy.ServiceTypeHealthPolicyMap.Add(entry.Key as string, this.ParseServiceTypeHealthPolicy(entry.Value as string));
                        }
                    }
                }
            }

            return(currentPolicy);
        }