From a3cc31ce628fb3807f7deb17d572a975306ce97b Mon Sep 17 00:00:00 2001 From: Anshul Verma Date: Thu, 6 Jun 2024 04:02:52 +0530 Subject: [PATCH] added arm templates for cosmosdb triggers --- pkg/deploy/assets/databases-development.json | 114 ++++++++++++++++++ pkg/deploy/assets/rp-production.json | 120 +++++++++++++++++++ pkg/deploy/generator/const.go | 5 + pkg/deploy/generator/resources_rp.go | 39 ++++++ 4 files changed, 278 insertions(+) diff --git a/pkg/deploy/assets/databases-development.json b/pkg/deploy/assets/databases-development.json index 04ae1697451..7eb5e647bae 100644 --- a/pkg/deploy/assets/databases-development.json +++ b/pkg/deploy/assets/databases-development.json @@ -260,6 +260,120 @@ } }, "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers" + }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/Subscriptions/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "retryLater", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 600;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/Subscriptions/retryLater')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "setCreationBillingTimeStamp", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "Create", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/Billing/setCreationBillingTimeStamp')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "setDeletionBillingTimeStamp", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "Replace", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/Billing/setDeletionBillingTimeStamp')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/OpenShiftClusters/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', parameters('databaseName'), '/Monitors/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), parameters('databaseName'))]" + ] } ] } diff --git a/pkg/deploy/assets/rp-production.json b/pkg/deploy/assets/rp-production.json index cd9d98f0f59..3ba1546d674 100644 --- a/pkg/deploy/assets/rp-production.json +++ b/pkg/deploy/assets/rp-production.json @@ -941,6 +941,126 @@ }, "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers" }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/Subscriptions/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "retryLater", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 600;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/Subscriptions/retryLater')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "setCreationBillingTimeStamp", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "Create", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/Billing/setCreationBillingTimeStamp')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "setDeletionBillingTimeStamp", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "Replace", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/Billing/setDeletionBillingTimeStamp')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/OpenShiftClusters/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, + { + "Properties": { + "Resource": { + "ID": "renewLease", + "Body": "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}", + "TriggerOperation": "All", + "TriggerType": "Pre" + }, + "Options": null + }, + "location": "[resourceGroup().location]", + "ID": null, + "name": "[concat(parameters('databaseAccountName'), '/', 'ARO', '/Monitors/renewLease')]", + "type": "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + "apiVersion": "2023-04-15", + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), 'ARO')]", + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('databaseAccountName'))]" + ] + }, { "properties": { "severity": 3, diff --git a/pkg/deploy/generator/const.go b/pkg/deploy/generator/const.go index c11b7bed547..caa6546a805 100644 --- a/pkg/deploy/generator/const.go +++ b/pkg/deploy/generator/const.go @@ -31,4 +31,9 @@ const ( // Tag constants tagKeyExemptPublicBlob = "Az.Sec.AnonymousBlobAccessEnforcement::Skip" tagValueExemptPublicBlob = "PublicRelease" + + renewLeaseTriggerFunction = "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 60;\n\t\t\t\trequest.setBody(body);\n\t\t\t}" + retryLaterTriggerFunction = "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tbody[\"leaseExpires\"] = Math.floor(date.getTime() / 1000) + 600;\n\t\t\t\trequest.setBody(body);\n\t\t\t}" + setCreationBillingTimeStampTriggerFunction = "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}" + setDeletionBillingTimeStampTriggerFunction = "function trigger() {\n\t\t\t\tvar request = getContext().getRequest();\n\t\t\t\tvar body = request.getBody();\n\t\t\t\tvar date = new Date();\n\t\t\t\tvar now = Math.floor(date.getTime() / 1000);\n\t\t\t\tvar billingBody = body[\"billing\"];\n\t\t\t\tif (!billingBody[\"creationTime\"]) {\n\t\t\t\t\tbillingBody[\"creationTime\"] = now;\n\t\t\t\t}\n\t\t\t\trequest.setBody(body);\n\t\t\t}" ) diff --git a/pkg/deploy/generator/resources_rp.go b/pkg/deploy/generator/resources_rp.go index cf183352bdf..c6f165f82cd 100644 --- a/pkg/deploy/generator/resources_rp.go +++ b/pkg/deploy/generator/resources_rp.go @@ -1207,6 +1207,20 @@ func (g *generator) database(databaseName string, addDependsOn bool) []*arm.Reso }, } + // Adding Triggers + rs = append(rs, + // Subscription + g.rpCosmosDBTriggers(databaseName, "Subscriptions", "renewLease", renewLeaseTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationAll), + g.rpCosmosDBTriggers(databaseName, "Subscriptions", "retryLater", retryLaterTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationAll), + // Billing + g.rpCosmosDBTriggers(databaseName, "Billing", "setCreationBillingTimeStamp", setCreationBillingTimeStampTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationCreate), + g.rpCosmosDBTriggers(databaseName, "Billing", "setDeletionBillingTimeStamp", setDeletionBillingTimeStampTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationReplace), + // OpenShiftClusters + g.rpCosmosDBTriggers(databaseName, "OpenShiftClusters", "renewLease", renewLeaseTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationAll), + // Monitors + g.rpCosmosDBTriggers(databaseName, "Monitors", "renewLease", renewLeaseTriggerFunction, sdkcosmos.TriggerTypePre, sdkcosmos.TriggerOperationAll), + ) + if addDependsOn { for i := range rs { rs[i].DependsOn = append(rs[i].DependsOn, @@ -1218,6 +1232,31 @@ func (g *generator) database(databaseName string, addDependsOn bool) []*arm.Reso return rs } +func (g *generator) rpCosmosDBTriggers(databaseName, containerName, triggerID, triggerFunction string, triggerType sdkcosmos.TriggerType, triggerOperation sdkcosmos.TriggerOperation) *arm.Resource { + return &arm.Resource{ + Resource: &sdkcosmos.SQLTriggerCreateUpdateParameters{ + Properties: &sdkcosmos.SQLTriggerCreateUpdateProperties{ + Resource: &sdkcosmos.SQLTriggerResource{ + ID: to.StringPtr(triggerID), + Body: to.StringPtr(triggerFunction), + TriggerOperation: &triggerOperation, + TriggerType: &triggerType, + }, + // Options: &sdkcosmos.CreateUpdateOptions{}, + }, + Name: to.StringPtr("[concat(parameters('databaseAccountName'), '/', " + databaseName + ", '/" + containerName + "/" + triggerID + "')]"), + Type: to.StringPtr("Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers"), + Location: to.StringPtr("[resourceGroup().location]"), + }, + APIVersion: azureclient.APIVersion("Microsoft.DocumentDB"), + DependsOn: []string{ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), " + databaseName + ")]", + // "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases', parameters('databaseAccountName'), concat(" + databaseName + ", '/" + containerName + "'))]", + }, + Type: "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/triggers", + } +} + func (g *generator) rpCosmosDBAlert(throttledRequestThreshold float64, ruConsumptionThreshold float64, severity int32, name string, evalFreq string, windowSize string) *arm.Resource { throttledRequestMetricCriteria := mgmtinsights.MetricCriteria{ CriterionType: mgmtinsights.CriterionTypeStaticThresholdCriterion,