// ARM private async Task LoadAzureResources() { // Load all subscriptions var csmSubscriptions = await CsmManager.GetSubscriptionNamesToIdMap(); var subscriptions = SimpleSettings.Subscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) //It can be either a displayName or a subscriptionId .Select(s => s.Trim()) .Where(n => { Guid temp; return(csmSubscriptions.ContainsKey(n) || Guid.TryParse(n, out temp)); }) .Select(sn => { Guid temp; if (Guid.TryParse(sn, out temp)) { return(sn); } else { return(csmSubscriptions[sn]); } }); HostingEnvironment.QueueBackgroundWorkItem(_ => { foreach (var subscription in subscriptions) { _backgroundQueueManager.LoadSubscription(subscription); } }); }
public static async Task MainAsync() { var subscriptionNames = System.Environment.GetEnvironmentVariable("Subscriptions").Split(','); var csmSubscriptions = await CsmManager.GetSubscriptionNamesToIdMap(); var subscriptionsIds = SimpleSettings.Subscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) //It can be either a displayName or a subscriptionId .Select(s => s.Trim()) .Where(n => { Guid temp; return(csmSubscriptions.ContainsKey(n) || Guid.TryParse(n, out temp)); }) .Select(sn => { Guid temp; if (Guid.TryParse(sn, out temp)) { return(sn); } else { return(csmSubscriptions[sn]); } }); //var subscriptionNames = new[] { "bd5cf6af-4d44-449e-adaf-20626ae5013e" }; var startTime = DateTime.UtcNow; Action <object> console = (s) => System.Console.WriteLine("[" + (DateTime.UtcNow - startTime).TotalMilliseconds + "] " + s); Action <Subscription> printSub = (sub) => sub.ResourceGroups.ToList().ForEach(e => console(string.Format("RG: {0} has {1} sites, named: {2}", e.ResourceGroupName, e.Sites.Count(), e.Sites.Count() > 0 ? e.Sites.Select(s => s.SiteName).Aggregate((a, b) => string.Join(",", a, b)) : "No sites") )); console("start loading subscriptions"); console("We have " + subscriptionsIds.Count() + " subscriptions"); var subscriptions = await subscriptionsIds.Select(s => new Subscription(s).Load()).WhenAll(); console("done loading subscriptions"); console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); //foreach (var resourcegroup in subscriptions.SelectMany(subscription => subscription.ResourceGroups)) // { // try // { // if (!resourcegroup.IsSimpleWAWS) // { // console($" Replacing Resource Group : {resourcegroup.CsmId}"); // await resourcegroup.DeleteAndCreateReplacement(true); // console($" Replaced"); // } // } // catch (Exception ex) // { // console(ex.ToString()); // } //} console("calling MakeTrialSubscription on all subscriptions"); await subscriptions.Select(async s => { var result = s.MakeTrialSubscription(); foreach (var resourceGroup in result.Ready) { try { await resourceGroup.PutInDesiredState(); } catch (Exception ex) { console( $"RG PIDS Exception:{ex.ToString()}-{ex.StackTrace}-{ex.InnerException?.StackTrace.ToString() ?? String.Empty}"); } } foreach (var geoRegion in result.ToCreateInRegions) { try { await CsmManager.CreateResourceGroup(s.SubscriptionId, geoRegion).Result.PutInDesiredState(); } catch (Exception ex) { console($"GR Create Exception:{ex.ToString()}-{ex.StackTrace}-{ex.InnerException?.StackTrace.ToString() ?? String.Empty}"); } } foreach (var resourceGroup in result.ToDelete) { try { await resourceGroup.Delete(true); } catch (Exception ex) { console($"RG Delete Exception:{ex.ToString()}-{ex.StackTrace}-{ex.InnerException?.StackTrace.ToString() ?? String.Empty}"); } } }).WhenAll(); console("done calling make trial subscription"); ////console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); ////console(subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count())); ////console("make free trial"); //////Parallel.ForEach( ////// subscriptions.SelectMany(subscription => subscription.ResourceGroups), async (resourcegroup) => ////// { ////// console($"Deleting resourcegroup:{resourcegroup.ResourceGroupName} from \tsubscription:{resourcegroup.SubscriptionId}"); ////// await resourcegroup.Delete(true); ////// }); console("Re-start loading subscriptions"); console("We have " + subscriptionsIds.Count() + " subscriptions"); subscriptions = await subscriptionsIds.Select(s => new Subscription(s).Load()).WhenAll(); console("done loading subscriptions"); //Parallel.ForEach( // subscriptions.SelectMany(subscription => subscription.ResourceGroups), async (resourcegroup) => // { ////foreach (var resourcegroup in subscriptions.SelectMany(subscription => subscription.ResourceGroups)) ////{ //// try //// { //// console($" Replacing Resource Group : {resourcegroup.CsmId}"); //// await resourcegroup.Delete(true);//DeleteAndCreateReplacement(true); //// console($" Replaced"); //// } //// catch (Exception ex) //// { //// console(ex.ToString()); //// } ////} //} //); //subscriptions.ToList().ForEach(printSub); console("Done"); }
public static async Task MainAsync() { var subscriptionNames = System.Environment.GetEnvironmentVariable("Subscriptions").Split(','); var csmSubscriptions = await CsmManager.GetSubscriptionNamesToIdMap(); var subscriptionsIds = SimpleSettings.Subscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) //It can be either a displayName or a subscriptionId .Select(s => s.Trim()) .Where(n => { Guid temp; return(csmSubscriptions.ContainsKey(n) || Guid.TryParse(n, out temp)); }) .Select(sn => { Guid temp; if (Guid.TryParse(sn, out temp)) { return(sn); } else { return(csmSubscriptions[sn]); } }); //var subscriptionNames = new[] { "bd5cf6af-4d44-449e-adaf-20626ae5013e" }; var startTime = DateTime.UtcNow; Action <object> console = (s) => System.Console.WriteLine("[" + (DateTime.UtcNow - startTime).TotalMilliseconds + "] " + s); Action <Subscription> printSub = (sub) => sub.ResourceGroups.ToList().ForEach(e => console(string.Format("RG: {0} has {1} sites, named: {2}", e.ResourceGroupName, e.Sites.Count(), e.Sites.Count() > 0 ? e.Sites.Select(s => s.SiteName).Aggregate((a, b) => string.Join(",", a, b)) : "No sites") )); console("start loading subscriptions"); console("We have " + subscriptionsIds.Count() + " subscriptions"); var subscriptions = await subscriptionsIds.Select(s => new Subscription(s).Load()).WhenAll(); console("done loading subscriptions"); console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Where(r => !r.Tags.ContainsKey("CommonApiAppsDeployed")).Count()) + " bad resourceGroups"); //console("calling MakeTrialSubscription on all subscriptions"); //subscriptions = await subscriptions.Select(s => s.MakeTrialSubscription()).WhenAll(); //console("done calling make trial subscription"); console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); console(subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count())); console("make free trial"); foreach (var subscription in subscriptions) { var freeTrial = subscription.MakeTrialSubscription(); console(subscription.SubscriptionId + "\thas\t" + freeTrial.Ready.Count() + "\twill delete\t" + freeTrial.ToDelete.Count() + "\tcreate\t" + freeTrial.ToCreateInRegions.Count()); } //await Task.WhenAll(subscriptions.Select(subscription => subscription.ResourceGroups.Where(r => !r.Tags.ContainsKey("CommonApiAppsDeployed")).Select(rg => rg.Delete(false))).SelectMany(i => i)); //subscriptions.ToList().ForEach(printSub); console("Done"); }
public static async Task FixFunctionsSetting() { var startTime = DateTime.UtcNow; Action <object> console = (s) => System.Console.WriteLine("[" + (DateTime.UtcNow - startTime).TotalMilliseconds + "] " + s); console("start"); var csmSubscriptions = await CsmManager.GetSubscriptionNamesToIdMap(); var subscriptionsIds = SimpleSettings.Subscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) //It can be either a displayName or a subscriptionId .Select(s => s.Trim()) .Where(n => { Guid temp; return(csmSubscriptions.ContainsKey(n) || Guid.TryParse(n, out temp)); }) .Select(sn => { Guid temp; if (Guid.TryParse(sn, out temp)) { return(sn); } else { return(csmSubscriptions[sn]); } }); console("start loading subscriptions"); console("We have " + subscriptionsIds.Count() + " subscriptions"); var subscriptions = await subscriptionsIds.Select(s => new Subscription(s).Load()).WhenAll(); console("done loading subscriptions"); console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); foreach (var resourcegroup in subscriptions.SelectMany(subscription => subscription.ResourceGroups)) { try { console($" Updating Resource Group : {resourcegroup.CsmId}"); await resourcegroup.Load(); var site = resourcegroup.Sites.First(s => s.IsSimpleWAWSOriginalSite); if (site != null && site.AppSettings.ContainsKey("FUNCTIONS_EXTENSION_VERSION")) { site.AppSettings.Remove("FUNCTIONS_EXTENSION_VERSION"); } await site.UpdateAppSettings(); site = resourcegroup.Sites.First(s => !s.IsSimpleWAWSOriginalSite); if (site != null && site.AppSettings.ContainsKey("FUNCTIONS_EXTENSION_VERSION") && !string.Equals(site.AppSettings["FUNCTIONS_EXTENSION_VERSION"], SimpleSettings.FunctionsExtensionVersion)) { site.AppSettings["FUNCTIONS_EXTENSION_VERSION"] = SimpleSettings.FunctionsExtensionVersion; } await site.UpdateAppSettings(); console($" Updated"); } catch (Exception ex) { console(ex.ToString()); } } }
public static async Task MainAsync() { foreach (var a in SimpleSettings.GeoRegions.Split(',')) { georegionHashMap.Add(a.ToLowerInvariant().Replace(" ", ""), a); } //var subscriptionNames = System.Environment.GetEnvironmentVariable("Subscriptions").Split(','); var csmSubscriptions = await CsmManager.GetSubscriptionNamesToIdMap(); var subscriptionsIds = SimpleSettings.Subscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) //.Union(SimpleSettings.LinuxSubscriptions.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) //.Union(SimpleSettings.MonitoringToolsSubscription.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) //It can be either a displayName or a subscriptionId .Select(s => s.Trim()) .Where(n => { Guid temp; return(csmSubscriptions.ContainsKey(n) || Guid.TryParse(n, out temp)); }) .Select(sn => { Guid temp; if (Guid.TryParse(sn, out temp)) { return(sn); } else { return(csmSubscriptions[sn]); } }).OrderByDescending(s => s); //var subscriptionNames = new[] { "bd5cf6af-4d44-449e-adaf-20626ae5013e" }; var startTime = DateTime.UtcNow; Action <object> console = (s) => System.Console.WriteLine("[" + (DateTime.UtcNow - startTime).TotalMilliseconds + "] " + s); Action <Subscription> printSub = (sub) => sub.ResourceGroups.ToList().ForEach(e => console(string.Format("RG: {0} has {1} sites, named: {2}", e.ResourceGroupName, e.Sites.Count(), e.Sites.Count() > 0 ? e.Sites.Select(s => s.SiteName).Aggregate((a, b) => string.Join(",", a, b)) : "No sites") )); console("start loading subscriptions"); console("We have " + subscriptionsIds.Count() + " subscriptions"); //var subscriptions = await subscriptionsIds.Select(s => new Subscription(s).Load(false)).WhenAll(); //console("done loading subscriptions"); //console("subscriptions have: " + subscriptions.Aggregate(0, (count, sub) => count += sub.ResourceGroups.Count()) + " resourceGroups"); //var resources = await CsmManager.GetLoadedResources(); console("calling MakeTrialSubscription on all subscriptions"); foreach (var sub in subscriptionsIds) { var s = await new Subscription(sub).Load(false); console($"Deleting resources in {s.Type} subscription {s.SubscriptionId}"); var csmResourceGroups = await s.LoadResourceGroupsForSubscription(); //var deleteExtras = csmResourceGroups.value // .GroupBy(rg => rg.location) // .Select(g => new { Region = g.Key, ResourceGroups = g.Select(r => r), Count = g.Count() }) // .Where(g => g.Count > s.ResourceGroupsPerGeoRegion) // .Select(g => g.ResourceGroups.Where(rg => rg.tags!=null && !rg.tags.ContainsKey("UserId") ).Skip((s.ResourceGroupsPerGeoRegion))) // .SelectMany(i => i); Parallel.ForEach(csmResourceGroups.value, async(resourceGroup) => { try { var georegion = getGeoRegionfromLocation(resourceGroup.location); console($"Deleting leaked {georegion} resource {resourceGroup.name}"); await new ResourceGroup(s.SubscriptionId, resourceGroup.name, georegion).Delete(false); } catch (Exception ex) { console($"Extra RG Delete Exception:{ex.ToString()}-{ex.StackTrace}-{ex.InnerException?.StackTrace.ToString() ?? String.Empty}"); } }); //var result = s.MakeTrialSubscription(); //Parallel.ForEach(result.ToDelete, async (resourceGroup) => //{ // try // { // console($"Deleting {resourceGroup.ResourceGroupName} resource in {s.Type} subscription {s.SubscriptionId}"); // await resourceGroup.Delete(false); // } // catch (Exception ex) // { // console($"RG Delete Exception:{ex.ToString()}-{ex.StackTrace}-{ex.InnerException?.StackTrace.ToString() ?? String.Empty}"); // } //}); } //subscriptions.ToList().ForEach(printSub); console("Done"); }