Public/IaaS/networking/New-CmAzIaasNetworking.json

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "NetworkingArrayObject": {
            "type": "Array"
        }
    },
    "resources": [
        {
            "type": "Microsoft.Resources/Deployments",
            "apiVersion": "2019-10-01",
            "name": "[concat('Cm_network_deployment_',copyIndex('NetworkingArrayObjectCopy'))]",
            "resourceGroup": "[parameters('NetworkingArrayObject')[copyIndex('NetworkingArrayObjectCopy')].resourceGroup.Name]",
            "copy": {
                "name": "NetworkingArrayObjectCopy",
                "count": "[length(parameters('NetworkingArrayObject'))]"
            },
            "properties": {
                "mode": "Incremental",
                "expressionEvaluationOptions": {
                    "scope": "Inner"
                },
                "parameters": {
                    "VnetArmObject": {
                        "value": "[parameters('NetworkingArrayObject')[copyIndex('NetworkingArrayObjectCopy')].vnets]"
                    },
                    "RouteTableArmObject": {
                        "value": "[parameters('NetworkingArrayObject')[copyIndex('NetworkingArrayObjectCopy')].routeTables]"
                    }
                },
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {
                        "VnetArmObject": {
                            "type": "Array",
                            "metadata": {
                                "description": "vnet object with all required parameters"
                            }
                        },
                        "RouteTableArmObject": {
                            "type": "Array",
                            "metadata": {
                                "description": "route table object with all required parameters"
                            }
                        }
                    },
                    "resources": [
                        {
                            "condition": "[not(equals(parameters('VnetArmObject')[copyIndex('vnetCopy')].vnetName, 'none'))]",
                            "type": "Microsoft.Network/virtualNetworks",
                            "dependsOn": [
                                "routeTableCopy"
                            ],
                            "apiVersion": "2019-12-01",
                            "name": "[parameters('VnetArmObject')[copyIndex('vnetCopy')].vnetName]",
                            "location": "[if(not(empty(parameters('VnetArmObject')[copyIndex('vnetCopy')].location)), parameters('VnetArmObject')[copyIndex('vnetCopy')].location, resourceGroup().location)]",
                            "tags": {
                                "cm-service": "[parameters('VnetArmObject')[copyIndex('vnetCopy')]['service']['publish']['vnet']]"
                            },
                            "copy": {
                                "name": "vnetCopy",
                                "count": "[length(parameters('VnetArmObject'))]"
                            },
                            "properties": {
                                "addressSpace": {
                                    "addressPrefixes": "[parameters('VnetArmObject')[copyIndex('vnetCopy')].addressSpace]"
                                },
                                "dhcpOptions": "[if(not(empty(parameters('VnetArmObject')[copyIndex('vnetCopy')].dnsServers)), json(concat('{\"dnsServers\": [', replace(replace(string(parameters('VnetArmObject')[copyIndex('vnetCopy')].dnsServers), '[', ''), ']', ''), ']}')), json('null'))]",
                                "copy": [
                                    {
                                        "name": "subnets",
                                        "count": "[length( parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets)]",
                                        "input": {
                                            "name": "[parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].subnetName]",
                                            "properties": {
                                                "addressPrefix": "[parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].cidr]",
                                                "networkSecurityGroup": "[if(not(empty(parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].networkSecurityGroup)), json(concat('{\"id\": \"', resourceId('Microsoft.Network/networkSecurityGroups', parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].networkSecurityGroup), '\"}')), json('null'))]",
                                                "routeTable": "[if(not(empty(parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].routeTable)), json(concat('{\"id\": \"', resourceId('Microsoft.Network/routeTables', parameters('VnetArmObject')[copyIndex('vnetCopy')].subnets[copyIndex('subnets')].routeTable), '\"}')), json('null'))]"
                                            }
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "condition": "[not(equals(parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].tableName, 'none'))]",
                            "name": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].tableName]",
                            "type": "Microsoft.Network/routeTables",
                            "apiVersion": "2019-12-01",
                            "location": "[if(not(empty(parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].location)), parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].location, resourceGroup().location)]",
                            "tags": {
                                "cm-service": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')]['service']['publish']['routeTable']]"
                            },
                            "copy": {
                                "name": "routeTableCopy",
                                "count": "[length( parameters('RouteTableArmObject'))]"
                            },
                            "properties": {
                                "disableBgpRoutePropagation": "[not(parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routePropagation)]",
                                "copy": [
                                    {
                                        "name": "routes",
                                        "count": "[length(parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routes)]",
                                        "input": {
                                            "name": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routes[copyIndex('routes')].routeName]",
                                            "properties": {
                                                "addressPrefix": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routes[copyIndex('routes')].cidr]",
                                                "nextHopType": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routes[copyIndex('routes')].nextHopType]",
                                                "nextHopIpAddress": "[parameters('RouteTableArmObject')[copyIndex('routeTableCopy')].routes[copyIndex('routes')].nextHopIpAddress]"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ]
}