diff --git a/libs/wingsdk/src/target-tf-azure/app.ts b/libs/wingsdk/src/target-tf-azure/app.ts index 89ee81b3a4b..d6ca7640686 100644 --- a/libs/wingsdk/src/target-tf-azure/app.ts +++ b/libs/wingsdk/src/target-tf-azure/app.ts @@ -3,6 +3,7 @@ import { Function } from "./function"; import { APP_AZURE_TF_SYMBOL } from "./internal"; import { TestRunner } from "./test-runner"; import { ApplicationInsights } from "../.gen/providers/azurerm/application-insights"; +import { LogAnalyticsWorkspace } from "../.gen/providers/azurerm/log-analytics-workspace"; import { AzurermProvider } from "../.gen/providers/azurerm/provider"; import { ResourceGroup } from "../.gen/providers/azurerm/resource-group"; import { ServicePlan } from "../.gen/providers/azurerm/service-plan"; @@ -35,6 +36,18 @@ const RESOURCEGROUP_NAME_OPTS: NameOptions = { disallowedRegex: /([^a-zA-Z0-9\-\_\(\)\.]+)/g, }; +/** + * Configuration options for generating a name for Azure Log Analytics Workspace. + * + * - The workspace name must be between 4 and 63 characters. + * - The workspace name can contain only letters, numbers, and hyphens (`"-"`). + * - The hyphen (`"-"`) should not be the first or the last character in the name. + */ +const LOG_ANALYTICS_WORKSPACE_NAME_OPTS: NameOptions = { + maxLen: 63, + disallowedRegex: /([^a-zA-Z0-9\-]+)/g, +}; + /** * StorageAccount names are limited to 24 characters. * You can only use alphanumeric characters. @@ -66,6 +79,7 @@ export class App extends CdktfApp { private _storageAccount?: StorageAccount; private _servicePlan?: ServicePlan; private _applicationInsights?: ApplicationInsights; + private _logAnalyticsWorkspace?: LogAnalyticsWorkspace; protected readonly testRunner: TestRunner; constructor(props: AzureAppProps) { @@ -110,6 +124,24 @@ export class App extends CdktfApp { } } + public get logAnalyticsWorkspace() { + if (!this._logAnalyticsWorkspace) { + this._logAnalyticsWorkspace = new LogAnalyticsWorkspace( + this, + "LogAnalyticsWorkspace", + { + location: this.location, + resourceGroupName: this.resourceGroup.name, + name: ResourceNames.generateName( + this, + LOG_ANALYTICS_WORKSPACE_NAME_OPTS + ), + } + ); + } + return this._logAnalyticsWorkspace; + } + public get applicationInsights() { if (!this._applicationInsights) { this._applicationInsights = new ApplicationInsights( @@ -120,6 +152,7 @@ export class App extends CdktfApp { resourceGroupName: this.resourceGroup.name, location: this.resourceGroup.location, applicationType: "web", + workspaceId: this.logAnalyticsWorkspace.id, } ); } diff --git a/libs/wingsdk/test/target-tf-azure/__snapshots__/captures.test.ts.snap b/libs/wingsdk/test/target-tf-azure/__snapshots__/captures.test.ts.snap index 2fd4f633201..237fc5ce15d 100644 --- a/libs/wingsdk/test/target-tf-azure/__snapshots__/captures.test.ts.snap +++ b/libs/wingsdk/test/target-tf-azure/__snapshots__/captures.test.ts.snap @@ -29,6 +29,7 @@ exports[`function with a bucket binding requiring only read 2`] = ` "location": "\${azurerm_resource_group.ResourceGroup.location}", "name": "application-insights", "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + "workspace_id": "\${azurerm_log_analytics_workspace.LogAnalyticsWorkspace.id}", }, }, "azurerm_linux_function_app": { @@ -59,6 +60,13 @@ exports[`function with a bucket binding requiring only read 2`] = ` "storage_account_name": "\${azurerm_storage_account.StorageAccount.name}", }, }, + "azurerm_log_analytics_workspace": { + "LogAnalyticsWorkspace": { + "location": "East US", + "name": "Default-c82bf964", + "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + }, + }, "azurerm_resource_group": { "ResourceGroup": { "location": "East US", @@ -144,6 +152,7 @@ exports[`function with a bucket binding requiring read_write 2`] = ` "location": "\${azurerm_resource_group.ResourceGroup.location}", "name": "application-insights", "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + "workspace_id": "\${azurerm_log_analytics_workspace.LogAnalyticsWorkspace.id}", }, }, "azurerm_linux_function_app": { @@ -174,6 +183,13 @@ exports[`function with a bucket binding requiring read_write 2`] = ` "storage_account_name": "\${azurerm_storage_account.StorageAccount.name}", }, }, + "azurerm_log_analytics_workspace": { + "LogAnalyticsWorkspace": { + "location": "East US", + "name": "Default-c82bf964", + "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + }, + }, "azurerm_resource_group": { "ResourceGroup": { "location": "East US", diff --git a/libs/wingsdk/test/target-tf-azure/__snapshots__/function.test.ts.snap b/libs/wingsdk/test/target-tf-azure/__snapshots__/function.test.ts.snap index 335e8e0fff0..c1326c1b368 100644 --- a/libs/wingsdk/test/target-tf-azure/__snapshots__/function.test.ts.snap +++ b/libs/wingsdk/test/target-tf-azure/__snapshots__/function.test.ts.snap @@ -14,6 +14,7 @@ exports[`basic function 1`] = ` "location": "\${azurerm_resource_group.ResourceGroup.location}", "name": "application-insights", "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + "workspace_id": "\${azurerm_log_analytics_workspace.LogAnalyticsWorkspace.id}", }, }, "azurerm_linux_function_app": { @@ -41,6 +42,13 @@ exports[`basic function 1`] = ` "storage_account_name": "\${azurerm_storage_account.StorageAccount.name}", }, }, + "azurerm_log_analytics_workspace": { + "LogAnalyticsWorkspace": { + "location": "East US", + "name": "Default-c82bf964", + "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + }, + }, "azurerm_resource_group": { "ResourceGroup": { "location": "East US", @@ -189,6 +197,14 @@ exports[`basic function 2`] = ` "id": "Handler", "path": "root/Default/Handler", }, + "LogAnalyticsWorkspace": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.17.0", + }, + "id": "LogAnalyticsWorkspace", + "path": "root/Default/LogAnalyticsWorkspace", + }, "ResourceGroup": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -294,6 +310,7 @@ exports[`basic function with environment variables 1`] = ` "location": "\${azurerm_resource_group.ResourceGroup.location}", "name": "application-insights", "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + "workspace_id": "\${azurerm_log_analytics_workspace.LogAnalyticsWorkspace.id}", }, }, "azurerm_linux_function_app": { @@ -323,6 +340,13 @@ exports[`basic function with environment variables 1`] = ` "storage_account_name": "\${azurerm_storage_account.StorageAccount.name}", }, }, + "azurerm_log_analytics_workspace": { + "LogAnalyticsWorkspace": { + "location": "East US", + "name": "Default-c82bf964", + "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + }, + }, "azurerm_resource_group": { "ResourceGroup": { "location": "East US", @@ -471,6 +495,14 @@ exports[`basic function with environment variables 2`] = ` "id": "Handler", "path": "root/Default/Handler", }, + "LogAnalyticsWorkspace": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.17.0", + }, + "id": "LogAnalyticsWorkspace", + "path": "root/Default/LogAnalyticsWorkspace", + }, "ResourceGroup": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -576,6 +608,7 @@ exports[`replace invalid character from function name 1`] = ` "location": "\${azurerm_resource_group.ResourceGroup.location}", "name": "application-insights", "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + "workspace_id": "\${azurerm_log_analytics_workspace.LogAnalyticsWorkspace.id}", }, }, "azurerm_linux_function_app": { @@ -603,6 +636,13 @@ exports[`replace invalid character from function name 1`] = ` "storage_account_name": "\${azurerm_storage_account.StorageAccount.name}", }, }, + "azurerm_log_analytics_workspace": { + "LogAnalyticsWorkspace": { + "location": "East US", + "name": "Default-c82bf964", + "resource_group_name": "\${azurerm_resource_group.ResourceGroup.name}", + }, + }, "azurerm_resource_group": { "ResourceGroup": { "location": "East US", @@ -683,6 +723,14 @@ exports[`replace invalid character from function name 2`] = ` "id": "Handler", "path": "root/Default/Handler", }, + "LogAnalyticsWorkspace": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.17.0", + }, + "id": "LogAnalyticsWorkspace", + "path": "root/Default/LogAnalyticsWorkspace", + }, "ResourceGroup": { "constructInfo": { "fqn": "cdktf.TerraformResource", diff --git a/libs/wingsdk/test/target-tf-azure/captures.test.ts b/libs/wingsdk/test/target-tf-azure/captures.test.ts index 838035d7f42..0f7e3473a01 100644 --- a/libs/wingsdk/test/target-tf-azure/captures.test.ts +++ b/libs/wingsdk/test/target-tf-azure/captures.test.ts @@ -43,6 +43,7 @@ test("function with a bucket binding requiring read_write", () => { expect(tfResourcesOf(output)).toEqual([ "azurerm_application_insights", "azurerm_linux_function_app", + "azurerm_log_analytics_workspace", "azurerm_resource_group", "azurerm_role_assignment", "azurerm_service_plan", @@ -97,11 +98,11 @@ test("function with a bucket binding requiring only read", () => { } ) ).toEqual(false); - expect(sanitizeCode(inflight._toInflight())).toMatchSnapshot(); expect(tfResourcesOf(output)).toEqual([ "azurerm_application_insights", "azurerm_linux_function_app", + "azurerm_log_analytics_workspace", "azurerm_resource_group", "azurerm_role_assignment", "azurerm_service_plan", diff --git a/libs/wingsdk/test/target-tf-azure/function.test.ts b/libs/wingsdk/test/target-tf-azure/function.test.ts index 775c90afed5..85f1180580a 100644 --- a/libs/wingsdk/test/target-tf-azure/function.test.ts +++ b/libs/wingsdk/test/target-tf-azure/function.test.ts @@ -24,6 +24,7 @@ test("basic function", () => { expect(tfResourcesOf(output)).toEqual([ "azurerm_application_insights", "azurerm_linux_function_app", // function app + "azurerm_log_analytics_workspace", "azurerm_resource_group", // resource group "azurerm_role_assignment", // role assignment for function app "azurerm_service_plan", // service plan for function app