Skip to content

Commit a8e0174

Browse files
committed
Added pulumi code to deploy feedback api
1 parent 9303e23 commit a8e0174

13 files changed

+591
-4
lines changed

build/build/ApplicationBuildConfigs.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public static AzureFunctionsProjectPaths LoadSettings(string projectName, string
108108
var csprojFile = projectDir + $"/{projectName}/{projectName}.csproj";
109109
var outDir = projectDir + $"/bin/{buildConfiguration}/cake-build-output";
110110
var zipOutDir = buildArtifactsPath;
111-
var zipOutFilePath = zipOutDir + $"/{projectName}.zip";
111+
var zipOutFilePath = zipOutDir + $"/feedback-api.zip";
112112

113113
return new AzureFunctionsProjectPaths(
114114
pathToSln,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Pulumi;
2+
using Pulumi.AzureNative.Authorization;
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Diagnostics.CodeAnalysis;
7+
using System.Linq;
8+
using System.Text;
9+
using System.Threading.Tasks;
10+
11+
namespace ProgrammerAl.Site.IaC.Config;
12+
public record AzureConfig(
13+
GetClientConfigResult ClientConfig,
14+
string Location,
15+
string ResourceGroupName);
16+
17+
public class AzureConfigDto : ConfigDtoBase<AzureConfig>
18+
{
19+
public GetClientConfigResult? ClientConfig { get; set; }
20+
public string? Location { get; set; }
21+
public string? ResourceGroupName { get; set; }
22+
23+
public override AzureConfig GenerateValidConfigObject()
24+
{
25+
if (ClientConfig != null
26+
&& !string.IsNullOrWhiteSpace(Location)
27+
&& !string.IsNullOrWhiteSpace(ResourceGroupName))
28+
{
29+
return new(ClientConfig, Location, ResourceGroupName);
30+
}
31+
32+
throw new Exception($"{GetType().Name} has invalid config");
33+
}
34+
}

infra/pulumi-infra-deploy/Config/DeploymentPackagesConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public record DeploymentPackagesConfig(string UnzippedArtifactsDir)
1212
public string WebsitePath => $"{UnzippedArtifactsDir}/programmer-al-site";
1313
public string StorageApiWorkerFilePath => $"{UnzippedArtifactsDir}/cloudflare-workers/public-storage-api.js";
1414
public string RouteFilterWorkerFilePath => $"{UnzippedArtifactsDir}/cloudflare-workers/route-filter-worker.js";
15+
public string FeedbackApiFunctionsZipFilePath => $"{UnzippedArtifactsDir}/feedback-api/feedback-api.zip";
1516
}
1617

infra/pulumi-infra-deploy/Config/GlobalConfigs/GlobalConfig.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public record GlobalConfig(
1515
WebClientInfrastructureConfig WebClientInfraConfig,
1616
CloudflareConfig CloudflareConfig,
1717
StorageApiConfig StorageApiConfig,
18-
RouteFilterWorkerConfig RouteFilterWorkerConfig
18+
RouteFilterWorkerConfig RouteFilterWorkerConfig,
19+
AzureConfig AzureConfig
1920
)
2021
{
2122
public static async Task<GlobalConfig> LoadAsync(Pulumi.Config config)
@@ -25,6 +26,17 @@ public static async Task<GlobalConfig> LoadAsync(Pulumi.Config config)
2526

2627
string unzippedArtifactsDir = config.Require("unzipped-artifacts-dir");
2728

29+
var azureClientConfig = await Pulumi.AzureNative.Authorization.GetClientConfig.InvokeAsync();
30+
string azLocation = config.Require("az-location");
31+
string resourceGroupName = config.Require("resource-group-name");
32+
33+
var azureConfig = new AzureConfigDto
34+
{
35+
ClientConfig = azureClientConfig,
36+
Location = azLocation,
37+
ResourceGroupName = resourceGroupName
38+
}.GenerateValidConfigObject();
39+
2840
var cloudflareConfig = new CloudflareConfigDto
2941
{
3042
ApiToken = keyVaultSecrets.CloudflareProviderToken,
@@ -37,7 +49,8 @@ public static async Task<GlobalConfig> LoadAsync(Pulumi.Config config)
3749
WebClientInfraConfig: config.RequireObject<WebClientInfrastructureConfigDto>("web-client-infra").GenerateValidConfigObject(),
3850
CloudflareConfig: cloudflareConfig,
3951
StorageApiConfig: config.RequireObject<StorageApiConfigDto>("storage-api-config").GenerateValidConfigObject(),
40-
RouteFilterWorkerConfig: config.RequireObject<RouteFilterWorkerConfigDto>("route-filter-worker-config").GenerateValidConfigObject()
52+
RouteFilterWorkerConfig: config.RequireObject<RouteFilterWorkerConfigDto>("route-filter-worker-config").GenerateValidConfigObject(),
53+
AzureConfig: azureConfig
4154
);
4255
}
4356

infra/pulumi-infra-deploy/Program.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
return await Pulumi.Deployment.RunAsync(async () =>
1414
{
15+
var clientConfig = await Pulumi.AzureNative.Authorization.GetClientConfig.InvokeAsync();
16+
1517
var config = new Config();
1618
var globalConfig = await GlobalConfig.LoadAsync(config);
1719

@@ -24,6 +26,12 @@
2426
var routeFilterWorkerBuilder = new RouteFilterStackBuilder(globalConfig, storageApiInfra);
2527
var routeFilterWorkerInfra = routeFilterWorkerBuilder.GenerateResources();
2628

29+
var azureRgBuilder = new AzureResourceGroupStackBuilder(globalConfig);
30+
var azureRgInfra = azureRgBuilder.GenerateResources();
31+
32+
var feedbackFunctionsBuilder = new FeedbackApiStackBuilder(globalConfig, azureRgInfra, clientConfig);
33+
var feedbackFunctionsInfra = feedbackFunctionsBuilder.GenerateResources();
34+
2735
return GenerateOutputs(websiteInfra, storageApiInfra, globalConfig);
2836
});
2937

infra/pulumi-infra-deploy/Pulumi.prod.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ config:
1414
RoutePattern: programmeral.com/*
1515
ServiceName: programmeral-site-route-filter-worker
1616
CloudflareZoneId: cb6b4ef0a57ef72147e4c9bf3c16b532
17+
programmeral-site:resource-group-name: prod-programmeral-site-
18+
programmeral-site:az-location: eastus
1719
pulumi:template: azure-csharp
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Pulumi.AzureAD;
2+
using Pulumi.AzureNative.Resources;
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Collections.Immutable;
7+
using System.Linq;
8+
using System.Text;
9+
using System.Threading.Tasks;
10+
11+
using static ProgrammerAl.Site.IaC.StackBuilders.AzureResourceGroup.AzureResourceGroupInfrasatructure;
12+
13+
namespace ProgrammerAl.Site.IaC.StackBuilders.AzureResourceGroup;
14+
15+
public record AzureResourceGroupInfrasatructure(
16+
ResourceGroupInfrastructure ResourceGroupInfra)
17+
{
18+
public record ResourceGroupInfrastructure(ResourceGroup ResourceGroup);
19+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Pulumi;
2+
using Pulumi.AzureNative.Resources;
3+
4+
using ProgrammerAl.Site.IaC.StackBuilders.AzureResourceGroup;
5+
using ProgrammerAl.Site.IaC.Config.GlobalConfigs;
6+
7+
using static ProgrammerAl.Site.IaC.StackBuilders.AzureResourceGroup.AzureResourceGroupInfrasatructure;
8+
9+
public record AzureResourceGroupStackBuilder(
10+
GlobalConfig GlobalConfig)
11+
{
12+
public AzureResourceGroupInfrasatructure GenerateResources()
13+
{
14+
var resourceGroupInfra = GenerateResourceGroup();
15+
16+
return new AzureResourceGroupInfrasatructure(resourceGroupInfra);
17+
}
18+
19+
private ResourceGroupInfrastructure GenerateResourceGroup()
20+
{
21+
var resourceGroup = new ResourceGroup(GlobalConfig.AzureConfig.ResourceGroupName, new ResourceGroupArgs
22+
{
23+
Location = GlobalConfig.AzureConfig.Location
24+
});
25+
26+
return new ResourceGroupInfrastructure(resourceGroup);
27+
}
28+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Pulumi;
2+
using Pulumi.AzureNative.Storage;
3+
using Pulumi.AzureNative.Web;
4+
using Pulumi.AzureNative.Web.Inputs;
5+
6+
using static ProgrammerAl.Site.IaC.StackBuilders.FeedbackApi.FeedbackApiInfrastructure;
7+
8+
namespace ProgrammerAl.Site.IaC.StackBuilders.FeedbackApi;
9+
10+
public record FeedbackApiInfrastructure(
11+
ServiceStorageInfrastructure ServiceStorageInfra,
12+
FunctionsInfrastructure FeedbackApiFunctionsInfra)
13+
{
14+
public record FunctionsInfrastructure(
15+
WebApp WebApp,
16+
SiteConfigArgs AppSiteConfig,
17+
AppServicePlan AppServicePlan,
18+
Output<string> HttpsEndpoint);
19+
20+
public record ServiceStorageInfrastructure(
21+
StorageAccount StorageAccount,
22+
BlobContainer FunctionsDeploymentBlobContainer,
23+
Blob FeedbackApiFunctionsBlob,
24+
Table FeedbackTableStorage);
25+
}

0 commit comments

Comments
 (0)