From e420afd9162093cfd61b9020b68f6bd526ec5363 Mon Sep 17 00:00:00 2001 From: bob Date: Tue, 8 Oct 2024 20:14:29 -0500 Subject: [PATCH] Task 1: Get it running. --- Cloudless.sln | 9 ++++- Cloudless/Cloudless.csproj | 10 ------ Cloudless/Program.cs | 10 ------ src/Cloudless.csproj | 16 +++++++++ src/Conductor.cs | 71 ++++++++++++++++++++++++++++++++++++++ src/Program.cs | 29 ++++++++++++++++ 6 files changed, 124 insertions(+), 21 deletions(-) delete mode 100644 Cloudless/Cloudless.csproj delete mode 100644 Cloudless/Program.cs create mode 100644 src/Cloudless.csproj create mode 100644 src/Conductor.cs create mode 100644 src/Program.cs diff --git a/Cloudless.sln b/Cloudless.sln index 7ae0ddd..bd31c7d 100644 --- a/Cloudless.sln +++ b/Cloudless.sln @@ -3,7 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.11.35312.102 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cloudless", "Cloudless\Cloudless.csproj", "{F7145F2A-D7D2-44F4-AF02-E2570CB6034B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cloudless", "src\Cloudless.csproj", "{F7145F2A-D7D2-44F4-AF02-E2570CB6034B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Azure", "Azure", "{522CF945-C939-4CB0-8054-BC17BF8DE87C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ResourceGroupResources", "ResourceGroupResources", "{04F7AF6E-2D4B-4087-A687-E02C40D863CD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -19,6 +23,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {04F7AF6E-2D4B-4087-A687-E02C40D863CD} = {522CF945-C939-4CB0-8054-BC17BF8DE87C} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3AC51662-8311-4D51-8632-F352DCD8AF91} EndGlobalSection diff --git a/Cloudless/Cloudless.csproj b/Cloudless/Cloudless.csproj deleted file mode 100644 index 2150e37..0000000 --- a/Cloudless/Cloudless.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - - Exe - net8.0 - enable - enable - - - diff --git a/Cloudless/Program.cs b/Cloudless/Program.cs deleted file mode 100644 index b924e0c..0000000 --- a/Cloudless/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Cloudless -{ - internal class Program - { - static void Main(string[] args) - { - Console.WriteLine("Hello, World!"); - } - } -} diff --git a/src/Cloudless.csproj b/src/Cloudless.csproj new file mode 100644 index 0000000..cc943e9 --- /dev/null +++ b/src/Cloudless.csproj @@ -0,0 +1,16 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + diff --git a/src/Conductor.cs b/src/Conductor.cs new file mode 100644 index 0000000..aa7f42d --- /dev/null +++ b/src/Conductor.cs @@ -0,0 +1,71 @@ +using Azure; +using Azure.Core; +using Azure.Identity; +using Azure.ResourceManager; +using Azure.ResourceManager.Resources; +using Azure.ResourceManager.Resources.Models; +using Microsoft.Extensions.Logging; + +namespace Cloudless +{ + public class Conductor(ILogger _logger) + { + public async Task Run() + { + var armClient = new ArmClient(new DefaultAzureCredential()); + SubscriptionResource sub; + try + { + sub = armClient.GetDefaultSubscription(); + _logger.LogInformation("Sub name: {subname}", sub.Data.DisplayName); + } + catch (Exception ex) + { + _logger.LogError(ex, "Failed to retrieve default subscription"); + throw; + } + + await CreateRG(sub); + } + + public async Task CreateRG(SubscriptionResource sub) + { + var rgName = "robby02-rg"; + var rgData = new ResourceGroupData(AzureLocation.CentralUS) + { + + }; + + ArmOperation operation; + try + { + operation = await sub.GetResourceGroups().CreateOrUpdateAsync(WaitUntil.Completed, rgName, rgData); + } + catch + { + _logger.LogError("Failed to create or update RG {rgName}", rgName); + throw; + } + + var rg = operation.Value; + _logger.LogInformation("RG Name: {name}", rg.Data.Name); + await UpdateResourceGroupTags(rg); + } + + public async Task UpdateResourceGroupTags(ResourceGroupResource rg) + { + var x = new KeyValuePair("CreatedBy", "Cloudless"); + var rgPatch = new ResourceGroupPatch(); + rgPatch.Tags.Add(x); + try + { + await rg.UpdateAsync(rgPatch); + _logger.LogInformation("Added tags with key {key}, value {val}", x.Key, x.Value); + } + catch + { + _logger.LogError("Failed to add tags"); + } + } + } +} diff --git a/src/Program.cs b/src/Program.cs new file mode 100644 index 0000000..269f7f1 --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,29 @@ +using Azure.Identity; +using Azure.ResourceManager; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Cloudless +{ + public class Program + { + static async Task Main(string[] args) + { + var con = Host + .CreateDefaultBuilder(args) + .ConfigureServices(ConfigureServices) + .ConfigureAppConfiguration(conf => conf.AddEnvironmentVariables()) + .Build() + .Services + .GetRequiredService(); + + await con.Run(); + } + + private static void ConfigureServices(HostBuilderContext context, IServiceCollection services) + { + services.AddSingleton(); + } + } +} \ No newline at end of file