Exemplo n.º 1
0
        public async Task SetRedisMaintenanceScheduleAsync()
        {
            LoadApplicationKey().ThrowIfFailure();

            var logger = TestGlobal.Logger;

            var tracingContext = new Context(logger);
            var context        = new OperationContext(tracingContext);

            var environmentResources = await App.Monitor.CreateEnvironmentResourcesAsync(context, Constants.DefaultEnvironments);

            var watchlist = await Watchlist.CreateAsync(
                logger,
                Constants.DefaultEnvironments,
                environmentResources.ToDictionary(
                    kvp => kvp.Key,
                    kvp => kvp.Value.KustoQueryClient));


            var rings = (new string[] { "Ring_0", "Ring_1", "Ring_2", "Ring_3" }).Reverse().ToArray();
            var primaryInstancesPerRing   = rings.ToDictionary(r => r, r => new List <IRedisCache>());
            var secondaryInstancesPerRing = rings.ToDictionary(r => r, r => new List <IRedisCache>());

            var resources = environmentResources[MonitorEnvironment.CloudBuildProduction];

            foreach (var stamp in watchlist.EnvStamps[MonitorEnvironment.CloudBuildProduction])
            {
                var metadata = watchlist.TryGetProperties(stamp).GetValueOrThrow();

                if (resources.RedisCaches.TryGetValue(stamp.PrimaryRedisName, out var primary))
                {
                    primaryInstancesPerRing[metadata.Ring].Add(primary);
                }

                if (resources.RedisCaches.TryGetValue(stamp.SecondaryRedisName, out var secondary))
                {
                    secondaryInstancesPerRing[metadata.Ring].Add(secondary);
                }
            }

            var primaryDayByRing   = new[] { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday };
            var secondaryDayByRing = new[] { DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday };
            var startHourUtc       = 17;
            var maintenanceWindow  = TimeSpan.FromHours(6);

            var exceptions = new List <Exception>();

            foreach (var(ring, position) in rings.Select((x, i) => (x, i)))
            {
                foreach (var instance in primaryInstancesPerRing[ring])
                {
                    try
                    {
                        await SetMaintenanceScheduleAsync(instance, primaryDayByRing[position], startHourUtc, maintenanceWindow);
                    }
                    catch (Exception e)
                    {
                        tracingContext.Error(e, $"Failed to set maintenance schedule for instance {instance.Name}", nameof(RedisMaintenanceSchedule));
                        exceptions.Add(e);
                    }
                }

                foreach (var instance in secondaryInstancesPerRing[ring])
                {
                    try
                    {
                        await SetMaintenanceScheduleAsync(instance, secondaryDayByRing[position], startHourUtc, maintenanceWindow);
                    }
                    catch (Exception e)
                    {
                        tracingContext.Error(e, $"Failed to set maintenance schedule for instance {instance.Name}", nameof(RedisMaintenanceSchedule));
                        exceptions.Add(e);
                    }
                }
            }

            if (exceptions.Count > 0)
            {
                throw new AggregateException(innerExceptions: exceptions);
            }
        }