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"
        }
    },
    "variables": {
    },
    "resources": [
        {
            "condition": "[parameters('networkingArrayObject')[copyIndex('resourceGroupCopy')].resourceGroup.createRG]",
            "type": "Microsoft.Resources/resourceGroups",
            "apiVersion": "2019-10-01",
            "name": "[parameters('networkingArrayObject')[copyIndex('resourceGroupCopy')].resourceGroup.Name]",
            "location": "[parameters('networkingArrayObject')[copyIndex('resourceGroupCopy')].resourceGroup.location]",
            "copy": {
                "name": "resourceGroupCopy",
                "count": "[length(parameters('networkingArrayObject'))]"
            },
            "tags": {
                "cm-service": "[parameters('networkingArrayObject')[copyIndex('resourceGroupCopy')].resourceGroup.service.publish.resourceGroup]"
            }
        },
        {
            "type": "Microsoft.Resources/Deployments",
            "apiVersion": "2019-10-01",
            "name": "[concat('Cm_network_deployment', '_',copyIndex('networkingArrayObjectCopy'))]",
            "resourceGroup": "[parameters('networkingArrayObject')[copyIndex('networkingArrayObjectCopy')].resourceGroup.Name]",
            "dependsOn": [
                "resourceGroupCopy"
            ],
            "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]"
                    },
                    "NsgArmObject": {
                        "value": "[parameters('networkingArrayObject')[copyIndex('networkingArrayObjectCopy')].networkSecurityGroups]"
                    }
                },
                "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"
                            }
                        },
                        "NsgArmObject": {
                            "type": "Array",
                            "metadata": {
                                "description": "nsg object with all required parameters"
                            }
                        }
                    },
                    "resources": [
                        {
                            "condition": "[not(equals(parameters('VnetArmObject')[copyIndex('vnetCopy')].vnetName, 'none'))]",
                            "type": "Microsoft.Network/virtualNetworks",
                            "dependsOn": [
                                "routeTableCopy",
                                "nsgCopy"
                            ],
                            "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]"
                                },
                                "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": {
                                "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]"
                                            }
                                        }
                                    }
                                ]
                            }
                        },
                        {
                            "condition": "[not(equals(parameters('NsgArmObject')[copyIndex('nsgCopy')].nsgName, 'none'))]",
                            "apiVersion": "2019-12-01",
                            "type": "Microsoft.Network/networkSecurityGroups",
                            "name": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].nsgName]",
                            "location": "[if(not(empty(parameters('NsgArmObject')[copyIndex('nsgCopy')].location)), parameters('NsgArmObject')[copyIndex('nsgCopy')].location, resourceGroup().location)]",
                            "copy": {
                                "name": "nsgCopy",
                                "count": "[length( parameters('NsgArmObject'))]"
                            },
                            "tags": {
                                "cm-service": "[parameters('NsgArmObject')[copyIndex('nsgCopy')]['service']['publish']['networkSecurityGroup']]"
                            },
                            "properties": {
                                "copy": [
                                    {
                                        "name": "securityRules",
                                        "count": "[length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules)]",
                                        "input": {
                                            "name": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].ruleName]",
                                            "properties": {
                                                "description": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].description]",
                                                "priority": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].priority]",
                                                "direction": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].direction]",
                                                "sourceAddressPrefix": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourceIp), 1)), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourceIp[0], json('null'))]",
                                                "sourcePortRange": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourcePort), 1)), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourcePort[0], json('null'))]",
                                                "destinationAddressPrefix": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationIp), 1)), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationIp[0], json('null'))]",
                                                "destinationPortRange": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationPort), 1)), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationPort[0], json('null'))]",
                                                "SourceAddressPrefixes": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourceIp), 1)), json('null'), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourceIp)]",
                                                "sourcePortRanges": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourcePort), 1)), json('null'), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].sourcePort)]",
                                                "destinationAddressPrefixes": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationIp), 1)), json('null'), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationIp)]",
                                                "destinationPortRanges": "[if(not(greater(length(parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationPort),1)), json('null'), parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].destinationPort)]",
                                                "protocol": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].protocol]",
                                                "Access": "[parameters('NsgArmObject')[copyIndex('nsgCopy')].rules[copyIndex('securityRules')].Access]"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ],
    "outputs": {
    }
}