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