Esempio n. 1
0
        public void TestApplcationWithNullDeltaHealthPolicy()
        {
            CommandParameterGenerator generator = new CommandParameterGenerator(new TestFabricClientWrapper());

            PaasClusterUpgradePolicy clusterUpgradePolicy = CreateDefaultPaasClusterUpgradePolicy();

            clusterUpgradePolicy.DeltaHealthPolicy = null;

            ClusterHealth defaultClusterHealth = CreateDefaultClusterHealth(
                totalApplicationCount: 6,
                totalNodeCount: 5,
                unhealthyApplicationsCount: 0,
                unhealthyNodeCount: 0);

            CommandProcessorClusterUpgradeDescription result = generator.GetClusterUpgradeDescriptionAsync(
                clusterUpgradePolicy,
                defaultClusterHealth,
                CancellationToken.None).Result;

            VerifyCommandProcessorClusterUpgradeDescription(
                clusterUpgradePolicy,
                result,
                maxPercentageUnhealthyApplication: 100,
                expectedtMaxPercentUnhealthyPerServicesType: null);
        }
Esempio n. 2
0
        private static PaasClusterUpgradePolicy CreateDefaultPaasClusterUpgradePolicyWithSystemServicesPolicies()
        {
            PaasApplicationHealthPolicy systemServiceHealthPolicy = new PaasApplicationHealthPolicy();

            systemServiceHealthPolicy.DefaultServiceTypeHealthPolicy = new PaasServiceTypeHealthPolicy()
            {
                MaxPercentUnhealthyServices = 100
            };

            PaasApplicationDeltaHealthPolicy systemServiceDeltaHealthPolicy = new PaasApplicationDeltaHealthPolicy();

            systemServiceDeltaHealthPolicy.DefaultServiceTypeDeltaHealthPolicy = new PaasServiceTypeDeltaHealthPolicy()
            {
                MaxPercentDeltaUnhealthyServices = 0
            };

            PaasClusterUpgradePolicy policy = CreateDefaultPaasClusterUpgradePolicy();

            policy.HealthPolicy.ApplicationHealthPolicies = new Dictionary <string, PaasApplicationHealthPolicy>();
            policy.HealthPolicy.ApplicationHealthPolicies.Add("fabric:/System", systemServiceHealthPolicy);

            policy.DeltaHealthPolicy.ApplicationDeltaHealthPolicies = new Dictionary <string, PaasApplicationDeltaHealthPolicy>();
            policy.DeltaHealthPolicy.ApplicationDeltaHealthPolicies.Add("fabric:/System", systemServiceDeltaHealthPolicy);

            return(policy);
        }
Esempio n. 3
0
        private static PaasClusterUpgradePolicy CreateDefaultPaasClusterUpgradePolicy()
        {
            PaasClusterUpgradePolicy policy = new PaasClusterUpgradePolicy()
            {
                ForceRestart = false,
                UpgradeReplicaSetCheckTimeout = TimeSpan.MaxValue,
                HealthCheckWaitDuration       = TimeSpan.FromMinutes(5),
                HealthCheckStableDuration     = TimeSpan.FromMinutes(5),
                HealthCheckRetryTimeout       = TimeSpan.FromMinutes(30),
                UpgradeTimeout       = TimeSpan.FromHours(12),
                UpgradeDomainTimeout = TimeSpan.FromHours(2)
            };

            policy.HealthPolicy = new PaasClusterUpgradeHealthPolicy()
            {
                MaxPercentUnhealthyApplications = 100,
                MaxPercentUnhealthyNodes        = 100,
                ApplicationHealthPolicies       = null
            };

            policy.DeltaHealthPolicy = new PaasClusterUpgradeDeltaHealthPolicy()
            {
                MaxPercentDeltaUnhealthyApplications       = 0,
                MaxPercentDeltaUnhealthyNodes              = 0,
                MaxPercentUpgradeDomainDeltaUnhealthyNodes = 0,
                ApplicationDeltaHealthPolicies             = null
            };

            return(policy);
        }
Esempio n. 4
0
        public void TestDefaultHealthPolicy()
        {
            CommandParameterGenerator generator = new CommandParameterGenerator(new TestFabricClientWrapper());

            PaasClusterUpgradePolicy defaultPaasClusterUpgradePolicy = CreateDefaultPaasClusterUpgradePolicy();
            ClusterHealth            defaultClusterHealth            = CreateDefaultClusterHealth(5, 5);

            CommandProcessorClusterUpgradeDescription result = generator.GetClusterUpgradeDescriptionAsync(
                defaultPaasClusterUpgradePolicy,
                defaultClusterHealth,
                CancellationToken.None).Result;

            VerifyCommandProcessorClusterUpgradeDescription(
                defaultPaasClusterUpgradePolicy,
                result,
                maxPercentageUnhealthyApplication: 0,
                expectedtMaxPercentUnhealthyPerServicesType: null);
        }
Esempio n. 5
0
        public void TestApplcationWithUnhealthySystemServiceHealthPolicy()
        {
            var testFabricClientWrapper         = new TestFabricClientWrapper();
            CommandParameterGenerator generator = new CommandParameterGenerator(testFabricClientWrapper);

            PaasClusterUpgradePolicy clusterUpgradePolicy = CreateDefaultPaasClusterUpgradePolicyWithSystemServicesPolicies();

            ClusterHealth defaultClusterHealth = CreateDefaultClusterHealth(
                totalApplicationCount: 6,
                totalNodeCount: 5,
                unhealthyApplicationsCount: 0,
                unhealthyNodeCount: 0,
                isSystemServicesUnhealthy: true);

            Service fssService = new StatefulService(new Uri("fabric:/System/ImageStoreService"), "FileStoreService", "1.0", true, HealthState.Error, ServiceStatus.Active);
            Service cmService  = new StatefulService(new Uri("fabric:/System/ClusterManagerService"), "ClusterManager", "1.0", true, HealthState.Ok, ServiceStatus.Active);
            Service hmService  = new StatefulService(new Uri("fabric:/System/HealthManagerService"), "HealthManager", "1.0", true, HealthState.Ok, ServiceStatus.Active);

            testFabricClientWrapper.GetServicesResult = new ServiceList(new List <Service>()
            {
                fssService, cmService, hmService
            });

            CommandProcessorClusterUpgradeDescription result = generator.GetClusterUpgradeDescriptionAsync(
                clusterUpgradePolicy,
                defaultClusterHealth,
                CancellationToken.None).Result;

            var expectedtMaxPercentUnhealthyPerServicesType = new Dictionary <string, byte>();

            expectedtMaxPercentUnhealthyPerServicesType.Add("FileStoreService", 100);
            expectedtMaxPercentUnhealthyPerServicesType.Add("ClusterManager", 0);
            expectedtMaxPercentUnhealthyPerServicesType.Add("HealthManager", 0);

            VerifyCommandProcessorClusterUpgradeDescription(
                clusterUpgradePolicy,
                result,
                0,
                expectedtMaxPercentUnhealthyPerServicesType);
        }
        public async Task <CommandProcessorClusterUpgradeDescription> GetClusterUpgradeDescriptionAsync(PaasClusterUpgradePolicy paasUpgradePolicy, ClusterHealth currentClusterHealth, CancellationToken token)
        {
            if (paasUpgradePolicy == null)
            {
                return(null);
            }

            CommandProcessorClusterUpgradeDescription upgradeDescription = new CommandProcessorClusterUpgradeDescription()
            {
                ForceRestart                  = paasUpgradePolicy.ForceRestart,
                HealthCheckRetryTimeout       = paasUpgradePolicy.HealthCheckRetryTimeout,
                HealthCheckStableDuration     = paasUpgradePolicy.HealthCheckStableDuration,
                HealthCheckWaitDuration       = paasUpgradePolicy.HealthCheckWaitDuration,
                UpgradeDomainTimeout          = paasUpgradePolicy.UpgradeDomainTimeout,
                UpgradeReplicaSetCheckTimeout = paasUpgradePolicy.UpgradeReplicaSetCheckTimeout,
                UpgradeTimeout                = paasUpgradePolicy.UpgradeTimeout,
            };

            if (paasUpgradePolicy.HealthPolicy == null && paasUpgradePolicy.DeltaHealthPolicy == null)
            {
                return(upgradeDescription);
            }

            upgradeDescription.HealthPolicy = new CommandProcessorClusterUpgradeHealthPolicy();

            var paasHealthPolicy = paasUpgradePolicy.HealthPolicy;

            if (paasHealthPolicy != null)
            {
                upgradeDescription.HealthPolicy.MaxPercentUnhealthyApplications = paasHealthPolicy.MaxPercentUnhealthyApplications;
                upgradeDescription.HealthPolicy.MaxPercentUnhealthyNodes        = paasHealthPolicy.MaxPercentUnhealthyNodes;

                if (paasHealthPolicy.ApplicationHealthPolicies != null)
                {
                    upgradeDescription.HealthPolicy.ApplicationHealthPolicies = paasHealthPolicy.ApplicationHealthPolicies.ToDictionary(
                        keyValuePair => keyValuePair.Key,
                        KeyValuePair => KeyValuePair.Value.ToCommondProcessorServiceTypeHealthPolicy());
                }
            }

            var paasDeltaHealthPolicy = paasUpgradePolicy.DeltaHealthPolicy;

            if (paasDeltaHealthPolicy != null)
            {
                upgradeDescription.DeltaHealthPolicy = new CommandProcessorClusterUpgradeDeltaHealthPolicy()
                {
                    MaxPercentDeltaUnhealthyNodes = paasDeltaHealthPolicy.MaxPercentDeltaUnhealthyNodes,
                    MaxPercentUpgradeDomainDeltaUnhealthyNodes = paasDeltaHealthPolicy.MaxPercentUpgradeDomainDeltaUnhealthyNodes
                };

                if (paasDeltaHealthPolicy.MaxPercentDeltaUnhealthyApplications == 100)
                {
                    upgradeDescription.HealthPolicy.MaxPercentUnhealthyApplications = paasDeltaHealthPolicy.MaxPercentDeltaUnhealthyApplications;
                }
                else
                {
                    int totalAppCount = 0, unhealthyAppCount = 0;

                    if (currentClusterHealth == null)
                    {
                        upgradeDescription.HealthPolicy.MaxPercentUnhealthyApplications = 0;
                        Trace.WriteWarning(
                            TraceType,
                            "currentClusterHealth is null. Setting MaxPercentUnhealthyApplications conservatively to 0");
                    }
                    else if (currentClusterHealth.ApplicationHealthStates != null)
                    {
                        var filteredAppHealthStates = currentClusterHealth.ApplicationHealthStates.Where(
                            appHealthState =>
                        {
                            if (appHealthState.ApplicationName.OriginalString.Equals("fabric:/System", StringComparison.OrdinalIgnoreCase))
                            {
                                return(false);
                            }

                            if (paasHealthPolicy != null && paasHealthPolicy.ApplicationHealthPolicies != null &&
                                paasHealthPolicy.ApplicationHealthPolicies.ContainsKey(appHealthState.ApplicationName.OriginalString))
                            {
                                return(false);
                            }

                            if (paasDeltaHealthPolicy.ApplicationDeltaHealthPolicies != null &&
                                paasDeltaHealthPolicy.ApplicationDeltaHealthPolicies.ContainsKey(appHealthState.ApplicationName.OriginalString))
                            {
                                return(false);
                            }

                            return(true);
                        });

                        unhealthyAppCount = filteredAppHealthStates.Count(health => health.AggregatedHealthState == HealthState.Error);
                        totalAppCount     = filteredAppHealthStates.Count();

                        upgradeDescription.HealthPolicy.MaxPercentUnhealthyApplications = CommandParameterGenerator.GetMaxUnhealthyPercentage(
                            unhealthyAppCount,
                            totalAppCount,
                            paasDeltaHealthPolicy.MaxPercentDeltaUnhealthyApplications);
                    }

                    Trace.WriteInfo(
                        TraceType,
                        "Delta health policy is specified. MaxPercentUnhealthyApplications is overwritten to {0}. TotalApps={1}, UnhealthyApps={2}, MaxPercentDeltaUnhealthyApplications={3}.",
                        upgradeDescription.HealthPolicy.MaxPercentUnhealthyApplications,
                        totalAppCount,
                        unhealthyAppCount,
                        paasDeltaHealthPolicy.MaxPercentDeltaUnhealthyApplications);
                }

                if (paasDeltaHealthPolicy.ApplicationDeltaHealthPolicies != null)
                {
                    foreach (var applicationDeltaHealthPolicy in paasDeltaHealthPolicy.ApplicationDeltaHealthPolicies)
                    {
                        var applicationName = applicationDeltaHealthPolicy.Key;
                        var paasApplicationDeltaHealthPolicy = applicationDeltaHealthPolicy.Value;

                        if (paasApplicationDeltaHealthPolicy.DefaultServiceTypeDeltaHealthPolicy == null && paasApplicationDeltaHealthPolicy.SerivceTypeDeltaHealthPolicies == null)
                        {
                            // no policy provided
                            continue;
                        }

                        ApplicationHealthState matchingHealthState = null;
                        if (currentClusterHealth != null)
                        {
                            matchingHealthState = currentClusterHealth.ApplicationHealthStates.FirstOrDefault(
                                appHealthState => appHealthState.ApplicationName.OriginalString.Equals(applicationName, StringComparison.OrdinalIgnoreCase));
                        }

                        if (matchingHealthState == null)
                        {
                            Trace.WriteWarning(
                                TraceType,
                                "Application {0} is not found in the current cluster health. Ignoring the application since delta policy cannot be computed.",
                                applicationName);

                            // the application is not found in the cluster
                            continue;
                        }

                        Dictionary <string, CommandProcessorServiceTypeHealthPolicy> commandProcessorServiceTypeHealthPolicies = new Dictionary <string, CommandProcessorServiceTypeHealthPolicy>();

                        var serviceList = await this.fabricClientWrapper.GetServicesAsync(matchingHealthState.ApplicationName, Constants.MaxOperationTimeout, token);

                        // Compute the total and unhealthy services by ServiceType for this application
                        Dictionary <string, HealthStats> serviceTypeHealthStatsDictionary = new Dictionary <string, HealthStats>();
                        foreach (var service in serviceList)
                        {
                            HealthStats serviceTypeHealthstats;
                            if (!serviceTypeHealthStatsDictionary.TryGetValue(service.ServiceTypeName, out serviceTypeHealthstats))
                            {
                                serviceTypeHealthstats = new HealthStats();
                                serviceTypeHealthStatsDictionary.Add(service.ServiceTypeName, serviceTypeHealthstats);
                            }

                            if (service.HealthState == HealthState.Error)
                            {
                                serviceTypeHealthstats.UnhealthyCount++;
                            }

                            serviceTypeHealthstats.TotalCount++;
                        }

                        // For each service type specific healthy policy provided, compute the delta health policy
                        if (paasApplicationDeltaHealthPolicy.SerivceTypeDeltaHealthPolicies != null)
                        {
                            foreach (var serviceTypeHealthPolicyKeyValue in paasApplicationDeltaHealthPolicy.SerivceTypeDeltaHealthPolicies)
                            {
                                var serviceTypeName        = serviceTypeHealthPolicyKeyValue.Key;
                                var serviceTypeDeltaPolicy = serviceTypeHealthPolicyKeyValue.Value;

                                HealthStats stats;
                                if (serviceTypeHealthStatsDictionary.TryGetValue(serviceTypeName, out stats))
                                {
                                    byte maxUnhealthyPercentage =
                                        CommandParameterGenerator.GetMaxUnhealthyPercentage(stats.UnhealthyCount,
                                                                                            stats.TotalCount, serviceTypeDeltaPolicy.MaxPercentDeltaUnhealthyServices);

                                    commandProcessorServiceTypeHealthPolicies.Add(
                                        serviceTypeName,
                                        new CommandProcessorServiceTypeHealthPolicy()
                                    {
                                        MaxPercentUnhealthyServices = maxUnhealthyPercentage
                                    });

                                    Trace.WriteInfo(
                                        TraceType,
                                        "Delta health policy is specified for ServiceType {0} in Application {1}. MaxPercentUnhealthyServices is overwritten to {2}. TotalCount={3}, UnhealthyCount={4}, MaxPercentDeltaUnhealthyServices={5}.",
                                        serviceTypeName,
                                        applicationName,
                                        maxUnhealthyPercentage,
                                        stats.TotalCount,
                                        stats.UnhealthyCount,
                                        serviceTypeDeltaPolicy.MaxPercentDeltaUnhealthyServices);
                                }
                                else
                                {
                                    Trace.WriteWarning(
                                        TraceType,
                                        "ServiceType {0} in Application {1} is not found in the current application. Ignoring the ServiceType since delta policy cannot be computed.",
                                        serviceTypeName,
                                        applicationName);

                                    continue;
                                }
                            }
                        }

                        // If default service type delta policy is specified, compute the delta health policy for ServiceType
                        // which does not have an explicit policy
                        if (paasApplicationDeltaHealthPolicy.DefaultServiceTypeDeltaHealthPolicy != null)
                        {
                            foreach (var serviceTypeHealthStatsKeyValue in serviceTypeHealthStatsDictionary)
                            {
                                var serviceTypeName        = serviceTypeHealthStatsKeyValue.Key;
                                var serviceTypeHealthStats = serviceTypeHealthStatsKeyValue.Value;

                                if (commandProcessorServiceTypeHealthPolicies.ContainsKey(serviceTypeName))
                                {
                                    // Explicit policy has been specified
                                    continue;
                                }

                                byte maxUnhealthyPercentage = CommandParameterGenerator.GetMaxUnhealthyPercentage(
                                    serviceTypeHealthStats.UnhealthyCount,
                                    serviceTypeHealthStats.TotalCount,
                                    paasApplicationDeltaHealthPolicy.DefaultServiceTypeDeltaHealthPolicy.MaxPercentDeltaUnhealthyServices);

                                commandProcessorServiceTypeHealthPolicies.Add(
                                    serviceTypeName,
                                    new CommandProcessorServiceTypeHealthPolicy()
                                {
                                    MaxPercentUnhealthyServices = maxUnhealthyPercentage
                                });

                                Trace.WriteInfo(
                                    TraceType,
                                    "Using default delta health policy for ServiceType {0} in Application {1}. MaxPercentUnhealthyServices is overwritten to {2}. TotalCount={3}, UnhealthyCount={4}, MaxPercentDeltaUnhealthyServices={5}.",
                                    serviceTypeName,
                                    applicationName,
                                    maxUnhealthyPercentage,
                                    serviceTypeHealthStats.UnhealthyCount,
                                    serviceTypeHealthStats.UnhealthyCount,
                                    paasApplicationDeltaHealthPolicy.DefaultServiceTypeDeltaHealthPolicy.MaxPercentDeltaUnhealthyServices);
                            }
                        }

                        if (commandProcessorServiceTypeHealthPolicies.Any())
                        {
                            if (upgradeDescription.HealthPolicy.ApplicationHealthPolicies == null)
                            {
                                upgradeDescription.HealthPolicy.ApplicationHealthPolicies = new Dictionary <string, CommandProcessorApplicationHealthPolicy>();
                            }

                            CommandProcessorApplicationHealthPolicy applicationHealthPolicy;
                            if (!upgradeDescription.HealthPolicy.ApplicationHealthPolicies.TryGetValue(applicationName, out applicationHealthPolicy))
                            {
                                applicationHealthPolicy = new CommandProcessorApplicationHealthPolicy()
                                {
                                    SerivceTypeHealthPolicies = new Dictionary <string, CommandProcessorServiceTypeHealthPolicy>()
                                };
                                upgradeDescription.HealthPolicy.ApplicationHealthPolicies.Add(
                                    applicationName,
                                    applicationHealthPolicy);
                            }

                            foreach (var commandProcessorServiceTypeHealthPolicy in commandProcessorServiceTypeHealthPolicies)
                            {
                                if (applicationHealthPolicy.SerivceTypeHealthPolicies == null)
                                {
                                    applicationHealthPolicy.SerivceTypeHealthPolicies = new Dictionary <string, CommandProcessorServiceTypeHealthPolicy>();
                                }

                                applicationHealthPolicy.SerivceTypeHealthPolicies[commandProcessorServiceTypeHealthPolicy.Key] = commandProcessorServiceTypeHealthPolicy.Value;
                            }
                        }
                    }
                }
            }

            return(upgradeDescription);
        }
Esempio n. 7
0
        private void VerifyCommandProcessorClusterUpgradeDescription(
            PaasClusterUpgradePolicy source,
            CommandProcessorClusterUpgradeDescription result,
            byte maxPercentageUnhealthyApplication,
            Dictionary <string, byte> expectedtMaxPercentUnhealthyPerServicesType)
        {
            Assert.AreEqual(source.ForceRestart, result.ForceRestart);
            Assert.AreEqual(source.HealthCheckRetryTimeout, result.HealthCheckRetryTimeout);
            Assert.AreEqual(source.HealthCheckStableDuration, result.HealthCheckStableDuration);
            Assert.AreEqual(source.HealthCheckWaitDuration, result.HealthCheckWaitDuration);
            Assert.AreEqual(source.UpgradeDomainTimeout, result.UpgradeDomainTimeout);
            Assert.AreEqual(source.UpgradeTimeout, result.UpgradeTimeout);
            Assert.AreEqual(source.UpgradeReplicaSetCheckTimeout, result.UpgradeReplicaSetCheckTimeout);

            if (source.HealthPolicy == null)
            {
                Assert.IsNull(result.HealthPolicy);
            }
            else
            {
                Assert.IsNotNull(result.HealthPolicy);

                Assert.AreEqual(source.HealthPolicy.MaxPercentUnhealthyNodes, result.HealthPolicy.MaxPercentUnhealthyNodes);

                Assert.AreEqual(maxPercentageUnhealthyApplication, result.HealthPolicy.MaxPercentUnhealthyApplications);

                if (source.HealthPolicy.ApplicationHealthPolicies == null)
                {
                    Assert.IsNull(result.HealthPolicy.ApplicationHealthPolicies);
                }
                else
                {
                    Assert.IsNotNull(result.HealthPolicy.ApplicationHealthPolicies);

                    Assert.AreEqual(source.HealthPolicy.ApplicationHealthPolicies.Count(), result.HealthPolicy.ApplicationHealthPolicies.Count());

                    foreach (var keyVaulePair in result.HealthPolicy.ApplicationHealthPolicies)
                    {
                        Assert.AreEqual(
                            source.HealthPolicy.ApplicationHealthPolicies[keyVaulePair.Key].DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyServices,
                            keyVaulePair.Value.DefaultServiceTypeHealthPolicy.MaxPercentUnhealthyServices);

                        if (keyVaulePair.Value.SerivceTypeHealthPolicies != null)
                        {
                            foreach (var serviceTypeHealthPolicyKeyValue in keyVaulePair.Value.SerivceTypeHealthPolicies)
                            {
                                string serviceTypeName = serviceTypeHealthPolicyKeyValue.Key;
                                byte   expectedtMaxPercentUnhealthy;
                                if (expectedtMaxPercentUnhealthyPerServicesType.TryGetValue(
                                        serviceTypeName, out expectedtMaxPercentUnhealthy))
                                {
                                    Assert.AreEqual(expectedtMaxPercentUnhealthy, serviceTypeHealthPolicyKeyValue.Value.MaxPercentUnhealthyServices);
                                }
                                else
                                {
                                    Assert.AreEqual(
                                        source.HealthPolicy.ApplicationHealthPolicies[keyVaulePair.Key].SerivceTypeHealthPolicies[serviceTypeName].MaxPercentUnhealthyServices,
                                        serviceTypeHealthPolicyKeyValue.Value);
                                }
                            }
                        }
                    }
                }
            }

            if (source.DeltaHealthPolicy == null)
            {
                Assert.IsNull(result.DeltaHealthPolicy);
            }
            else
            {
                Assert.IsNotNull(result.DeltaHealthPolicy);

                Assert.AreEqual(source.DeltaHealthPolicy.MaxPercentDeltaUnhealthyNodes,
                                result.DeltaHealthPolicy.MaxPercentDeltaUnhealthyNodes);

                Assert.AreEqual(source.DeltaHealthPolicy.MaxPercentUpgradeDomainDeltaUnhealthyNodes,
                                result.DeltaHealthPolicy.MaxPercentUpgradeDomainDeltaUnhealthyNodes);
            }
        }