We're trying to create templates using objects for parameters so there's the option of having multiple values in different resources, i.e. deploy an Event Hub namespace that could have multiple authorization rules and eventhubs, but another object in the parameters for a second Event Hub namespace that may only have one of each.
The template is like below:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"eventhubs": {
"type": "object",
"metadata": {
"description": "JSON object that describes the deployment. see example parameters file"
}
}
},
"variables": {
"resourceNamePrefix": "[substring(resourceGroup().name, 0, 8)]",
"datacenterCode": "[substring(resourceGroup().name, 0, 3)]",
"productCode": "[substring(resourceGroup().name, 3, 3)]",
"environmentLevel": "[substring(resourceGroup().name, 6, 2)]"
},
"resources": [
{
"type": "Microsoft.EventHub/namespaces",
"name": "[concat(variables('resourceNamePrefix'), parameters('eventhubs').instances[copyIndex()].name)]",
"apiVersion": "2015-08-01",
"location": "[resourceGroup().location]",
"sku": {
"name": "[concat(variables('resourceNamePrefix'), parameters('eventhubs').instances[copyIndex()].sku.name)]",
"tier": "[parameters('eventhubs').instances[copyIndex()].sku.tier]",
"capacity": "[parameters('eventhubs').instances[copyIndex()].sku.capacity]"
},
"copy": {
"name": "eventHubCopy",
"count": "[length(parameters('eventhubs').instances)]"
},
"properties": {
"serviceBusEndpoint": "[concat('https://',variables('resourceNamePrefix'), parameters('eventhubs').instances[copyIndex()].name,'.servicebus.windows.net:443/')]",
"enabled": "[parameters('eventhubs').instances[copyIndex()].properties.enabled]"
},
"resources": [
*** PARAMETER OBJECT ***
]
"dependsOn": []
}
],
"outputs": {}
}
And the parameters file:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"eventhubs": {
"value": {
"instances": [
{
"name": "EVT001",
"sku": {
"name": "Standard",
"tier": "Standard",
"capacity": 4
},
"scale": null,
"properties": {
"enabled": "true"
},
"resources": [
{
"type": "AuthorizationRules",
"name": "SendKey",
"apiVersion": "2015-08-01",
"properties": {
"rights": [
"Send"
]
}
},
{
"type": "AuthorizationRules",
"name": "ListenKey",
"apiVersion": "2015-08-01",
"properties": {
"rights": [
"Listen"
]
}
},
{
"type": "EventHub",
"name": "TestHub",
"apiVersion": "2015-08-01",
"properties": {
"messageRetentionInDays": 7,
"status": "Active",
"partitionCount": 4
}
}
]
},
{
"name": "EVT002",
"sku": {
"name": "Standard",
"tier": "Standard",
"capacity": 4
},
"scale": null,
"properties": {
"enabled": "true"
},
"resources": [
{
"type": "AuthorizationRules",
"name": "SendKey",
"apiVersion": "2015-08-01",
"properties": {
"rights": [
"Send"
]
}
},
{
"type": "EventHub",
"name": "TestHub",
"apiVersion": "2015-08-01",
"properties": {
"messageRetentionInDays": 7,
"status": "Active",
"partitionCount": 4
}
},
{
"type": "EventHub",
"name": "SecondHub",
"apiVersion": "2015-08-01",
"properties": {
"messageRetentionInDays": 7,
"status": "Active",
"partitionCount": 4
}
}
]
}
]
}
}
}
}
What I'm attempting to do is move the content of the resources array in the parameters file into the nested resources array in the template file. This is possible when moving an array into an object, but I'm facing the following problems with an array into an array:
"resources": "[parameters('eventhubs').instances[copyIndex()].properties]", <--- value must be of type array
"resources": [ { "[parameters('eventhubs').instances[copyIndex()].properties]" } ], <--- expecting a name and value as it's in an object
"resources": [ "[parameters('eventhubs').instances[copyIndex()].properties]" ], <--- value must be of the following types: object
Adding another set of square brackets around the object in the array in the parameters file doesn't help either.
Same errors when using the createArray function.
The workaround I have is to do
"resources": [
{
"type": "AuthorizationRules",
"name": "[parameters('eventhubs').instances[copyIndex()].resources[0].name]",
"apiversion": "[parameters('eventhubs').instances[copyIndex()].resources[0].apiversion]",
"properties": "[parameters('eventhubs').instances[copyIndex()].resources[0].properties]",
"dependsOn": [ "[concat(variables('resourceNamePrefix'), parameters('eventhubs').instances[copyIndex()].name)]" ]
}
],
But the type property cannot be an expression so won't work for the way our templates will be consumed and used.
Is it possible to do what I'm attempting?