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); } }