From 0e5f811294e47ad6a40b91b8160c55e85b618478 Mon Sep 17 00:00:00 2001 From: Hemal Shah Date: Mon, 22 Sep 2025 16:43:42 +0100 Subject: [PATCH] feat(azure-events): add eventgrid system topic and subscriptions --- src/lib/azure/services/eventgrid/main.ts | 88 ++++++++++++++++++- src/lib/azure/services/eventgrid/types.ts | 6 ++ .../azure/common/cdkConfig/eventgrid.json | 7 ++ .../azure/services/eventgrid-manager.test.ts | 42 +++++++++ 4 files changed, 142 insertions(+), 1 deletion(-) diff --git a/src/lib/azure/services/eventgrid/main.ts b/src/lib/azure/services/eventgrid/main.ts index f2f4e68b..c7e101c0 100644 --- a/src/lib/azure/services/eventgrid/main.ts +++ b/src/lib/azure/services/eventgrid/main.ts @@ -5,9 +5,16 @@ import { } from '@cdktf/provider-azurerm/lib/data-azurerm-eventgrid-topic' import { EventgridTopic } from '@cdktf/provider-azurerm/lib/eventgrid-topic' import { EventgridEventSubscription } from '@cdktf/provider-azurerm/lib/eventgrid-event-subscription' +import { EventgridSystemTopic } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic' +import { EventgridSystemTopicEventSubscription } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic-event-subscription/index.js' import { CommonAzureConstruct } from '../../common' import { createAzureTfOutput } from '../../utils' -import { EventgridTopicProps, EventgridEventSubscriptionProps } from './types' +import { + EventgridTopicProps, + EventgridEventSubscriptionProps, + EventgridSystemTopicProps, + EventgridSystemTopicEventSubscriptionProps, +} from './types' /** * @classdesc Provides operations on Azure Event Grid @@ -122,4 +129,83 @@ export class AzureEventgridManager { return eventgridSubscription } + + /** + * @summary Method to create a new eventgrid system topic + * @param id scoped id of the resource + * @param scope scope in which this resource is defined + * @param props eventgrid system topic properties + * @see [CDKTF Eventgrid System Topic Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/eventgridSystemTopic.typescript.md} + */ + public createEventgridSystemTopic(id: string, scope: CommonAzureConstruct, props: EventgridSystemTopicProps) { + if (!props) throw `Props undefined for ${id}` + + const resourceGroup = new DataAzurermResourceGroup(scope, `${id}-est-rg`, { + name: scope.props.resourceGroupName + ? scope.resourceNameFormatter.format(scope.props.resourceGroupName) + : `${props.resourceGroupName}`, + }) + + if (!resourceGroup) throw `Resource group undefined for ${id}` + + const eventgridSystemTopic = new EventgridSystemTopic(scope, `${id}-est`, { + ...props, + name: scope.resourceNameFormatter.format(props.name, scope.props.resourceNameOptions?.eventGridSystemTopic), + location: resourceGroup.location, + resourceGroupName: resourceGroup.name, + tags: props.tags ?? { + environment: scope.props.stage, + }, + }) + + createAzureTfOutput(`${id}-eventgridSystemTopicName`, scope, eventgridSystemTopic.name) + createAzureTfOutput(`${id}-eventgridSystemTopicFriendlyUniqueId`, scope, eventgridSystemTopic.friendlyUniqueId) + createAzureTfOutput(`${id}-eventgridSystemTopicId`, scope, eventgridSystemTopic.id) + + return eventgridSystemTopic + } + + /** + * @summary Method to create a new eventgrid system topic subscription + * @param id scoped id of the resource + * @param scope scope in which this resource is defined + * @param props eventgrid system topic subscription properties + * @see [CDKTF Eventgrid System Topic Subscription Module]{@link https://github.com/cdktf/cdktf-provider-azurerm/blob/main/docs/eventgridSystemTopicEventSubscription.typescript.md} + */ + public createEventgridSystemTopicEventSubscription( + id: string, + scope: CommonAzureConstruct, + props: EventgridSystemTopicEventSubscriptionProps, + systemTopic: EventgridSystemTopic + ) { + if (!props) throw `Props undefined for ${id}` + + const resourceGroup = new DataAzurermResourceGroup(scope, `${id}-ests-rg`, { + name: scope.props.resourceGroupName + ? scope.resourceNameFormatter.format(scope.props.resourceGroupName) + : `${props.resourceGroupName}`, + }) + + if (!resourceGroup) throw `Resource group undefined for ${id}` + + const eventgridSystemTopicSubscription = new EventgridSystemTopicEventSubscription(scope, `${id}-ests`, { + ...props, + name: scope.resourceNameFormatter.format( + props.name, + scope.props.resourceNameOptions?.eventGridSystemTopicEventSubscription + ), + systemTopic: systemTopic.name, + resourceGroupName: resourceGroup.name, + }) + + createAzureTfOutput(`${id}-eventgridSystemTopicEventSubscriptionName`, scope, eventgridSystemTopicSubscription.name) + createAzureTfOutput( + `${id}-eventgridSystemTopicEventSubscriptionFriendlyUniqueId`, + scope, + eventgridSystemTopicSubscription.friendlyUniqueId + ) + createAzureTfOutput(`${id}-eventgridSystemTopicEventSubscriptionId`, scope, eventgridSystemTopicSubscription.id) + + return eventgridSystemTopicSubscription + } } diff --git a/src/lib/azure/services/eventgrid/types.ts b/src/lib/azure/services/eventgrid/types.ts index 46d89a70..e4ba69d7 100644 --- a/src/lib/azure/services/eventgrid/types.ts +++ b/src/lib/azure/services/eventgrid/types.ts @@ -1,6 +1,12 @@ import { EventgridTopicConfig } from '@cdktf/provider-azurerm/lib/eventgrid-topic' import { EventgridEventSubscriptionConfig } from '@cdktf/provider-azurerm/lib/eventgrid-event-subscription' +import { EventgridSystemTopicConfig } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic' +import { EventgridSystemTopicEventSubscriptionConfig } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic-event-subscription/index.js' export interface EventgridTopicProps extends EventgridTopicConfig {} export interface EventgridEventSubscriptionProps extends EventgridEventSubscriptionConfig {} + +export interface EventgridSystemTopicProps extends EventgridSystemTopicConfig {} + +export interface EventgridSystemTopicEventSubscriptionProps extends EventgridSystemTopicEventSubscriptionConfig {} diff --git a/src/test/azure/common/cdkConfig/eventgrid.json b/src/test/azure/common/cdkConfig/eventgrid.json index c824b7ec..f98e1d9c 100644 --- a/src/test/azure/common/cdkConfig/eventgrid.json +++ b/src/test/azure/common/cdkConfig/eventgrid.json @@ -4,5 +4,12 @@ }, "testEventgridEventSubscription": { "name": "test-eventgrid-subscription" + }, + "testEventgridSystemTopic": { + "name": "test-eventgrid-system-topic", + "topicType": "Microsoft.Storage.StorageAccounts" + }, + "testEventgridSystemEventSubscription": { + "name": "test-eventgrid-system-subscription" } } diff --git a/src/test/azure/services/eventgrid-manager.test.ts b/src/test/azure/services/eventgrid-manager.test.ts index 6ff264c0..354fc06f 100644 --- a/src/test/azure/services/eventgrid-manager.test.ts +++ b/src/test/azure/services/eventgrid-manager.test.ts @@ -1,5 +1,7 @@ import { EventgridTopic } from '@cdktf/provider-azurerm/lib/eventgrid-topic' import { EventgridEventSubscription } from '@cdktf/provider-azurerm/lib/eventgrid-event-subscription' +import { EventgridSystemTopic } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic' +import { EventgridSystemTopicEventSubscription } from '@cdktf/provider-azurerm/lib/eventgrid-system-topic-event-subscription/index.js' import { App, Testing } from 'cdktf' import 'cdktf/lib/testing/adapters/jest' import { Construct } from 'constructs' @@ -9,11 +11,15 @@ import { CommonAzureStackProps, EventgridTopicProps, EventgridEventSubscriptionProps, + EventgridSystemTopicProps, + EventgridSystemTopicEventSubscriptionProps, } from '../../../lib' interface TestAzureStackProps extends CommonAzureStackProps { testEventgridTopic: EventgridTopicProps testEventgridEventSubscription: EventgridEventSubscriptionProps + testEventgridSystemTopic: EventgridSystemTopicProps + testEventgridSystemEventSubscription: EventgridSystemTopicEventSubscriptionProps testAttribute?: string } @@ -42,6 +48,8 @@ class TestCommonStack extends CommonAzureStack { testAttribute: this.node.tryGetContext('testAttribute'), testEventgridTopic: this.node.tryGetContext('testEventgridTopic'), testEventgridEventSubscription: this.node.tryGetContext('testEventgridEventSubscription'), + testEventgridSystemTopic: this.node.tryGetContext('testEventgridSystemTopic'), + testEventgridSystemEventSubscription: this.node.tryGetContext('testEventgridSystemEventSubscription'), } } } @@ -72,6 +80,19 @@ class TestCommonConstruct extends CommonAzureConstruct { this, this.props.testEventgridEventSubscription ) + + const eventgridSystemTopic = this.eventgridManager.createEventgridSystemTopic( + `test-eventgrid-system-topic-${this.props.stage}`, + this, + this.props.testEventgridSystemTopic + ) + + this.eventgridManager.createEventgridSystemTopicEventSubscription( + `test-eventgrid-subscription-${this.props.stage}`, + this, + this.props.testEventgridSystemEventSubscription, + eventgridSystemTopic + ) } } @@ -152,3 +173,24 @@ describe('TestAzureEventgridConstruct', () => { }) }) }) + +describe('TestAzureEventgridConstruct', () => { + test('provisions eventgrid topic as expected', () => { + expect(construct).toHaveResourceWithProperties(EventgridSystemTopic, { + location: '${data.azurerm_resource_group.test-eventgrid-system-topic-dev-est-rg.location}', + name: 'test-eventgrid-system-topic-dev', + resource_group_name: '${data.azurerm_resource_group.test-eventgrid-system-topic-dev-est-rg.name}', + tags: { + environment: 'dev', + }, + }) + }) +}) + +describe('TestAzureEventgridConstruct', () => { + test('provisions eventgrid subscription as expected', () => { + expect(construct).toHaveResourceWithProperties(EventgridSystemTopicEventSubscription, { + name: 'test-eventgrid-system-subscription-dev', + }) + }) +})