From 05afc492d3ba8f708be94d5f634373d2e41a8080 Mon Sep 17 00:00:00 2001 From: Jonathan Moss Date: Wed, 23 Sep 2026 10:26:52 -0400 Subject: [PATCH 1/2] RELOPS-2583: Add production ARM template 3.0 --- terraform/azure_fxci/template_specs.tf | 15 + .../taskcluster-arm-template-3.0.json | 276 ++++++++++++++++++ .../azure_trusted_fxci/template_specs.tf | 15 + .../taskcluster-arm-template-3.0.json | 276 ++++++++++++++++++ 4 files changed, 582 insertions(+) create mode 100644 terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json create mode 100644 terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json diff --git a/terraform/azure_fxci/template_specs.tf b/terraform/azure_fxci/template_specs.tf index 4d62ed08..464bc2da 100644 --- a/terraform/azure_fxci/template_specs.tf +++ b/terraform/azure_fxci/template_specs.tf @@ -83,6 +83,21 @@ resource "azapi_resource" "template_spec_version_taskcluster_arm_template_2_0" { depends_on = [azapi_resource.template_spec_taskcluster_arm_template] } +resource "azapi_resource" "template_spec_version_taskcluster_arm_template_3_0" { + type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" + name = "3.0" + parent_id = local.fxci_template_spec_ids.taskcluster_arm_template + location = "eastus" + + body = { + properties = { + mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-3.0.json")) + } + } + + depends_on = [azapi_resource.template_spec_taskcluster_arm_template] +} + resource "azapi_resource" "template_spec_version_taskcluster_arm_template_dedicated_host_1_0" { type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" name = "1.0" diff --git a/terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json b/terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json new file mode 100644 index 00000000..16e911a8 --- /dev/null +++ b/terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json @@ -0,0 +1,276 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "3.0.0.0", + "outputs": { + "resourceIds": { + "type": "object", + "value": { + "nic": "[variables('nicId')]", + "osDisk": "[resourceId('Microsoft.Compute/disks', variables('osDiskName'))]", + "privateIp": "[reference(resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))).ipConfigurations[0].properties.privateIPAddress]", + "publicIp": "[if(parameters('createPublicIp'), variables('publicIpId'), '')]", + "vm": "[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]" + } + } + }, + "parameters": { + "adminPassword": { + "metadata": { + "description": "Admin password (provided by worker-manager)" + }, + "type": "securestring" + }, + "adminUsername": { + "metadata": { + "description": "Admin username (provided by worker-manager)" + }, + "type": "string" + }, + "computerName": { + "metadata": { + "description": "Name of the computer name (osProfile, provided by worker-manager)" + }, + "type": "string" + }, + "createPublicIp": { + "defaultValue": false, + "metadata": { + "description": "Create a public IP for the VM" + }, + "type": "bool" + }, + "customData": { + "metadata": { + "description": "Custom data attached to osProfile (provided by worker-manager)" + }, + "type": "string" + }, + "diffDiskOption": { + "allowedValues": [ + "Local" + ], + "defaultValue": "Local", + "metadata": { + "description": "Ephemeral OS disk option" + }, + "type": "string" + }, + "diffDiskPlacement": { + "allowedValues": [ + "", + "CacheDisk", + "ResourceDisk", + "NvmeDisk" + ], + "defaultValue": "", + "metadata": { + "description": "Ephemeral OS disk placement. Leave this value empty to let Azure select the placement." + }, + "type": "string" + }, + "enableFullCaching": { + "defaultValue": false, + "metadata": { + "description": "Enable full caching for the ephemeral OS disk" + }, + "type": "bool" + }, + "evictionPolicy": { + "allowedValues": [ + "Deallocate", + "Delete" + ], + "defaultValue": "Delete", + "metadata": { + "description": "Eviction policy for Spot VMs" + }, + "type": "string" + }, + "imageId": { + "metadata": { + "description": "Full resource ID of the VM image" + }, + "type": "string" + }, + "location": { + "defaultValue": "eastus", + "metadata": { + "description": "Azure region for the VM" + }, + "type": "string" + }, + "osDiskCaching": { + "allowedValues": [ + "None", + "ReadOnly", + "ReadWrite" + ], + "defaultValue": "ReadOnly", + "metadata": { + "description": "OS disk caching mode" + }, + "type": "string" + }, + "priority": { + "allowedValues": [ + "Regular", + "Spot" + ], + "defaultValue": "Spot", + "metadata": { + "description": "VM priority (Spot or Regular)" + }, + "type": "string" + }, + "subnetId": { + "metadata": { + "description": "Full resource ID of the subnet" + }, + "type": "string" + }, + "tags": { + "defaultValue": {}, + "metadata": { + "description": "Tags to apply to all resources" + }, + "type": "object" + }, + "vmName": { + "metadata": { + "description": "Name of the virtual machine (provided by worker-manager)" + }, + "type": "string" + }, + "vmSize": { + "defaultValue": "Standard_F16s_v2", + "metadata": { + "description": "VM size" + }, + "type": "string" + }, + "osDiskStorageAccountType": { + "type": "string", + "defaultValue": "Standard_LRS", + "allowedValues": [ + "Standard_LRS", + "StandardSSD_LRS", + "Premium_LRS" + ], + "metadata": { + "description": "Base disk storage type for the ephemeral OS disk" + } + } + }, + "resources": [ + { + "apiVersion": "2026-03-01", + "condition": "[parameters('createPublicIp')]", + "location": "[parameters('location')]", + "name": "[variables('publicIpName')]", + "properties": { + "publicIPAddressVersion": "IPv4", + "publicIPAllocationMethod": "Static" + }, + "sku": { + "name": "Standard" + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Network/publicIPAddresses" + }, + { + "apiVersion": "2026-03-01", + "dependsOn": [ + "[variables('publicIpId')]" + ], + "location": "[parameters('location')]", + "name": "[variables('nicName')]", + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig1", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "publicIPAddress": "[if(parameters('createPublicIp'), variables('publicIPConfig'), json('null'))]", + "subnet": { + "id": "[parameters('subnetId')]" + } + } + } + ] + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Network/networkInterfaces" + }, + { + "apiVersion": "2026-04-01", + "dependsOn": [ + "[variables('nicId')]" + ], + "location": "[parameters('location')]", + "name": "[parameters('vmName')]", + "properties": { + "billingProfile": "[if(equals(parameters('priority'), 'Spot'), createObject('maxPrice', -1), json('null'))]", + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": false + } + }, + "evictionPolicy": "[if(equals(parameters('priority'), 'Spot'), parameters('evictionPolicy'), json('null'))]", + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[variables('nicId')]", + "properties": { + "deleteOption": "Delete" + } + } + ] + }, + "osProfile": { + "adminPassword": "[parameters('adminPassword')]", + "adminUsername": "[parameters('adminUsername')]", + "computerName": "[parameters('computerName')]", + "windowsConfiguration": { + "enableAutomaticUpdates": false, + "timeZone": "UTC" + } + }, + "priority": "[parameters('priority')]", + "storageProfile": { + "imageReference": { + "id": "[parameters('imageId')]" + }, + "osDisk": { + "caching": "[parameters('osDiskCaching')]", + "createOption": "FromImage", + "deleteOption": "Delete", + "diffDiskSettings": "[union(createObject('option', parameters('diffDiskOption')), if(empty(parameters('diffDiskPlacement')), createObject(), createObject('placement', parameters('diffDiskPlacement'))), if(parameters('enableFullCaching'), createObject('enableFullCaching', parameters('enableFullCaching')), createObject()))]", + "managedDisk": { + "storageAccountType": "[parameters('osDiskStorageAccountType')]" + }, + "name": "[variables('osDiskName')]", + "osType": "Windows" + } + } + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Compute/virtualMachines" + } + ], + "variables": { + "nicId": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]", + "nicName": "[concat(parameters('vmName'), '-nic')]", + "osDiskName": "[concat(parameters('vmName'), '-osdisk')]", + "publicIPConfig": { + "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpName'))]", + "properties": { + "deleteOption": "Delete" + } + }, + "publicIpId": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpName'))]", + "publicIpName": "[concat(parameters('vmName'), '-ip')]" + } +} diff --git a/terraform/azure_trusted_fxci/template_specs.tf b/terraform/azure_trusted_fxci/template_specs.tf index 55591fbd..3a16bab7 100644 --- a/terraform/azure_trusted_fxci/template_specs.tf +++ b/terraform/azure_trusted_fxci/template_specs.tf @@ -59,6 +59,21 @@ resource "azapi_resource" "template_spec_version_taskcluster_arm_template_2_0" { depends_on = [azapi_resource.template_spec_taskcluster_arm_template] } +resource "azapi_resource" "template_spec_version_taskcluster_arm_template_3_0" { + type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" + name = "3.0" + parent_id = local.trusted_fxci_template_spec_ids.taskcluster_arm_template + location = "eastus" + + body = { + properties = { + mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-3.0.json")) + } + } + + depends_on = [azapi_resource.template_spec_taskcluster_arm_template] +} + resource "azapi_resource" "template_spec_version_taskcluster_arm_template_relops_1_0" { type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" name = "1.0" diff --git a/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json b/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json new file mode 100644 index 00000000..16e911a8 --- /dev/null +++ b/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json @@ -0,0 +1,276 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "3.0.0.0", + "outputs": { + "resourceIds": { + "type": "object", + "value": { + "nic": "[variables('nicId')]", + "osDisk": "[resourceId('Microsoft.Compute/disks', variables('osDiskName'))]", + "privateIp": "[reference(resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))).ipConfigurations[0].properties.privateIPAddress]", + "publicIp": "[if(parameters('createPublicIp'), variables('publicIpId'), '')]", + "vm": "[resourceId('Microsoft.Compute/virtualMachines', parameters('vmName'))]" + } + } + }, + "parameters": { + "adminPassword": { + "metadata": { + "description": "Admin password (provided by worker-manager)" + }, + "type": "securestring" + }, + "adminUsername": { + "metadata": { + "description": "Admin username (provided by worker-manager)" + }, + "type": "string" + }, + "computerName": { + "metadata": { + "description": "Name of the computer name (osProfile, provided by worker-manager)" + }, + "type": "string" + }, + "createPublicIp": { + "defaultValue": false, + "metadata": { + "description": "Create a public IP for the VM" + }, + "type": "bool" + }, + "customData": { + "metadata": { + "description": "Custom data attached to osProfile (provided by worker-manager)" + }, + "type": "string" + }, + "diffDiskOption": { + "allowedValues": [ + "Local" + ], + "defaultValue": "Local", + "metadata": { + "description": "Ephemeral OS disk option" + }, + "type": "string" + }, + "diffDiskPlacement": { + "allowedValues": [ + "", + "CacheDisk", + "ResourceDisk", + "NvmeDisk" + ], + "defaultValue": "", + "metadata": { + "description": "Ephemeral OS disk placement. Leave this value empty to let Azure select the placement." + }, + "type": "string" + }, + "enableFullCaching": { + "defaultValue": false, + "metadata": { + "description": "Enable full caching for the ephemeral OS disk" + }, + "type": "bool" + }, + "evictionPolicy": { + "allowedValues": [ + "Deallocate", + "Delete" + ], + "defaultValue": "Delete", + "metadata": { + "description": "Eviction policy for Spot VMs" + }, + "type": "string" + }, + "imageId": { + "metadata": { + "description": "Full resource ID of the VM image" + }, + "type": "string" + }, + "location": { + "defaultValue": "eastus", + "metadata": { + "description": "Azure region for the VM" + }, + "type": "string" + }, + "osDiskCaching": { + "allowedValues": [ + "None", + "ReadOnly", + "ReadWrite" + ], + "defaultValue": "ReadOnly", + "metadata": { + "description": "OS disk caching mode" + }, + "type": "string" + }, + "priority": { + "allowedValues": [ + "Regular", + "Spot" + ], + "defaultValue": "Spot", + "metadata": { + "description": "VM priority (Spot or Regular)" + }, + "type": "string" + }, + "subnetId": { + "metadata": { + "description": "Full resource ID of the subnet" + }, + "type": "string" + }, + "tags": { + "defaultValue": {}, + "metadata": { + "description": "Tags to apply to all resources" + }, + "type": "object" + }, + "vmName": { + "metadata": { + "description": "Name of the virtual machine (provided by worker-manager)" + }, + "type": "string" + }, + "vmSize": { + "defaultValue": "Standard_F16s_v2", + "metadata": { + "description": "VM size" + }, + "type": "string" + }, + "osDiskStorageAccountType": { + "type": "string", + "defaultValue": "Standard_LRS", + "allowedValues": [ + "Standard_LRS", + "StandardSSD_LRS", + "Premium_LRS" + ], + "metadata": { + "description": "Base disk storage type for the ephemeral OS disk" + } + } + }, + "resources": [ + { + "apiVersion": "2026-03-01", + "condition": "[parameters('createPublicIp')]", + "location": "[parameters('location')]", + "name": "[variables('publicIpName')]", + "properties": { + "publicIPAddressVersion": "IPv4", + "publicIPAllocationMethod": "Static" + }, + "sku": { + "name": "Standard" + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Network/publicIPAddresses" + }, + { + "apiVersion": "2026-03-01", + "dependsOn": [ + "[variables('publicIpId')]" + ], + "location": "[parameters('location')]", + "name": "[variables('nicName')]", + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig1", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "publicIPAddress": "[if(parameters('createPublicIp'), variables('publicIPConfig'), json('null'))]", + "subnet": { + "id": "[parameters('subnetId')]" + } + } + } + ] + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Network/networkInterfaces" + }, + { + "apiVersion": "2026-04-01", + "dependsOn": [ + "[variables('nicId')]" + ], + "location": "[parameters('location')]", + "name": "[parameters('vmName')]", + "properties": { + "billingProfile": "[if(equals(parameters('priority'), 'Spot'), createObject('maxPrice', -1), json('null'))]", + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": false + } + }, + "evictionPolicy": "[if(equals(parameters('priority'), 'Spot'), parameters('evictionPolicy'), json('null'))]", + "hardwareProfile": { + "vmSize": "[parameters('vmSize')]" + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[variables('nicId')]", + "properties": { + "deleteOption": "Delete" + } + } + ] + }, + "osProfile": { + "adminPassword": "[parameters('adminPassword')]", + "adminUsername": "[parameters('adminUsername')]", + "computerName": "[parameters('computerName')]", + "windowsConfiguration": { + "enableAutomaticUpdates": false, + "timeZone": "UTC" + } + }, + "priority": "[parameters('priority')]", + "storageProfile": { + "imageReference": { + "id": "[parameters('imageId')]" + }, + "osDisk": { + "caching": "[parameters('osDiskCaching')]", + "createOption": "FromImage", + "deleteOption": "Delete", + "diffDiskSettings": "[union(createObject('option', parameters('diffDiskOption')), if(empty(parameters('diffDiskPlacement')), createObject(), createObject('placement', parameters('diffDiskPlacement'))), if(parameters('enableFullCaching'), createObject('enableFullCaching', parameters('enableFullCaching')), createObject()))]", + "managedDisk": { + "storageAccountType": "[parameters('osDiskStorageAccountType')]" + }, + "name": "[variables('osDiskName')]", + "osType": "Windows" + } + } + }, + "tags": "[parameters('tags')]", + "type": "Microsoft.Compute/virtualMachines" + } + ], + "variables": { + "nicId": "[resourceId('Microsoft.Network/networkInterfaces', variables('nicName'))]", + "nicName": "[concat(parameters('vmName'), '-nic')]", + "osDiskName": "[concat(parameters('vmName'), '-osdisk')]", + "publicIPConfig": { + "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpName'))]", + "properties": { + "deleteOption": "Delete" + } + }, + "publicIpId": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIpName'))]", + "publicIpName": "[concat(parameters('vmName'), '-ip')]" + } +} From c977e4558e05a62554c4d28b71cd805a684a7d2d Mon Sep 17 00:00:00 2001 From: Jonathan Moss Date: Wed, 23 Sep 2026 10:31:42 -0400 Subject: [PATCH 2/2] Simplify template resources and use version 2.1 --- terraform/azure_fxci/template_specs.tf | 183 +++--------------- ...json => taskcluster-arm-template-2.1.json} | 2 +- terraform/azure_fxci/template_specs_moved.tf | 59 ++++++ .../azure_trusted_fxci/template_specs.tf | 89 +++------ ...json => taskcluster-arm-template-2.1.json} | 2 +- .../template_specs_moved.tf | 24 +++ 6 files changed, 131 insertions(+), 228 deletions(-) rename terraform/azure_fxci/template_specs/{taskcluster-arm-template-3.0.json => taskcluster-arm-template-2.1.json} (99%) create mode 100644 terraform/azure_fxci/template_specs_moved.tf rename terraform/azure_trusted_fxci/template_specs/{taskcluster-arm-template-3.0.json => taskcluster-arm-template-2.1.json} (99%) create mode 100644 terraform/azure_trusted_fxci/template_specs_moved.tf diff --git a/terraform/azure_fxci/template_specs.tf b/terraform/azure_fxci/template_specs.tf index 464bc2da..8f403da3 100644 --- a/terraform/azure_fxci/template_specs.tf +++ b/terraform/azure_fxci/template_specs.tf @@ -1,167 +1,30 @@ locals { - fxci_template_spec_resource_group_id = "/subscriptions/108d46d5-fe9b-4850-9a7d-8c914aa6c1f0/resourceGroups/template-spec" + template_spec_resource_group_id = "/subscriptions/108d46d5-fe9b-4850-9a7d-8c914aa6c1f0/resourceGroups/template-spec" - fxci_template_spec_ids = { - taskcluster_arm_template = "${local.fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template" - taskcluster_arm_template_dedicated_host = "${local.fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template-dedicated-host" - taskcluster_arm_template_relops = "${local.fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template-relops" - taskcluster_arm_template_v6_nvme = "${local.fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template-v6-nvme" + template_specs = { + "taskcluster-arm-template" = ["1.0", "2.0", "2.1"] + "taskcluster-arm-template-dedicated-host" = ["1.0"] + "taskcluster-arm-template-relops" = ["1.0", "2.0"] + "taskcluster-arm-template-v6-nvme" = ["1.0"] + "taskcluster-arm-template-alpha" = ["1.0"] } -} - -resource "azapi_resource" "template_spec_taskcluster_arm_template" { - type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template" - parent_id = local.fxci_template_spec_resource_group_id - location = "eastus" - - body = { - properties = {} - } -} - -resource "azapi_resource" "template_spec_taskcluster_arm_template_dedicated_host" { - type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template-dedicated-host" - parent_id = local.fxci_template_spec_resource_group_id - location = "eastus" - - body = { - properties = {} - } -} - -resource "azapi_resource" "template_spec_taskcluster_arm_template_relops" { - type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template-relops" - parent_id = local.fxci_template_spec_resource_group_id - location = "eastus" - - body = { - properties = {} - } -} - -resource "azapi_resource" "template_spec_taskcluster_arm_template_v6_nvme" { - type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template-v6-nvme" - parent_id = local.fxci_template_spec_resource_group_id - location = "eastus" - - body = { - properties = {} - } -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-1.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_2_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "2.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-2.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_3_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "3.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-3.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_dedicated_host_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template_dedicated_host - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-dedicated-host-1.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template_dedicated_host] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_relops_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template_relops - location = "eastus" - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-relops-1.0.json")) + template_spec_versions = merge([ + for name, versions in local.template_specs : { + for version in versions : "${name}-${version}" => { + name = name + version = version + } } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template_relops] + ]...) } -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_relops_2_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "2.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template_relops - location = "eastus" +resource "azapi_resource" "template_spec" { + for_each = local.template_specs - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-relops-2.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template_relops] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_v6_nvme_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.fxci_template_spec_ids.taskcluster_arm_template_v6_nvme - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-v6-nvme-1.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template_v6_nvme] -} - -resource "azapi_resource" "template_spec_taskcluster_arm_template_alpha" { type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template-alpha" - parent_id = local.fxci_template_spec_resource_group_id + name = each.key + parent_id = local.template_spec_resource_group_id location = "eastus" body = { @@ -169,15 +32,17 @@ resource "azapi_resource" "template_spec_taskcluster_arm_template_alpha" { } } -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_alpha_1_0" { +resource "azapi_resource" "template_spec_version" { + for_each = local.template_spec_versions + type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = azapi_resource.template_spec_taskcluster_arm_template_alpha.id + name = each.value.version + parent_id = azapi_resource.template_spec[each.value.name].id location = "eastus" body = { properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-alpha-1.0.json")) + mainTemplate = jsondecode(file("${path.module}/template_specs/${each.key}.json")) } } } diff --git a/terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json b/terraform/azure_fxci/template_specs/taskcluster-arm-template-2.1.json similarity index 99% rename from terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json rename to terraform/azure_fxci/template_specs/taskcluster-arm-template-2.1.json index 16e911a8..2633432f 100644 --- a/terraform/azure_fxci/template_specs/taskcluster-arm-template-3.0.json +++ b/terraform/azure_fxci/template_specs/taskcluster-arm-template-2.1.json @@ -1,6 +1,6 @@ { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "3.0.0.0", + "contentVersion": "2.1.0.0", "outputs": { "resourceIds": { "type": "object", diff --git a/terraform/azure_fxci/template_specs_moved.tf b/terraform/azure_fxci/template_specs_moved.tf new file mode 100644 index 00000000..94d395e2 --- /dev/null +++ b/terraform/azure_fxci/template_specs_moved.tf @@ -0,0 +1,59 @@ +moved { + from = azapi_resource.template_spec_taskcluster_arm_template + to = azapi_resource.template_spec["taskcluster-arm-template"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-1.0"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_2_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-2.0"] +} + +moved { + from = azapi_resource.template_spec_taskcluster_arm_template_dedicated_host + to = azapi_resource.template_spec["taskcluster-arm-template-dedicated-host"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_dedicated_host_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-dedicated-host-1.0"] +} + +moved { + from = azapi_resource.template_spec_taskcluster_arm_template_relops + to = azapi_resource.template_spec["taskcluster-arm-template-relops"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_relops_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-relops-1.0"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_relops_2_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-relops-2.0"] +} + +moved { + from = azapi_resource.template_spec_taskcluster_arm_template_v6_nvme + to = azapi_resource.template_spec["taskcluster-arm-template-v6-nvme"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_v6_nvme_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-v6-nvme-1.0"] +} + +moved { + from = azapi_resource.template_spec_taskcluster_arm_template_alpha + to = azapi_resource.template_spec["taskcluster-arm-template-alpha"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_alpha_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-alpha-1.0"] +} diff --git a/terraform/azure_trusted_fxci/template_specs.tf b/terraform/azure_trusted_fxci/template_specs.tf index 3a16bab7..6197a5a7 100644 --- a/terraform/azure_trusted_fxci/template_specs.tf +++ b/terraform/azure_trusted_fxci/template_specs.tf @@ -1,27 +1,27 @@ locals { - trusted_fxci_template_spec_resource_group_id = "/subscriptions/a30e97ab-734a-4f3b-a0e4-c51c0bff0701/resourceGroups/template-spec" + template_spec_resource_group_id = "/subscriptions/a30e97ab-734a-4f3b-a0e4-c51c0bff0701/resourceGroups/template-spec" - trusted_fxci_template_spec_ids = { - taskcluster_arm_template = "${local.trusted_fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template" - taskcluster_arm_template_relops = "${local.trusted_fxci_template_spec_resource_group_id}/providers/Microsoft.Resources/templateSpecs/taskcluster-arm-template-relops" + template_specs = { + "taskcluster-arm-template" = ["1.0", "2.0", "2.1"] + "taskcluster-arm-template-relops" = ["1.0"] } -} -resource "azapi_resource" "template_spec_taskcluster_arm_template" { - type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template" - parent_id = local.trusted_fxci_template_spec_resource_group_id - location = "eastus" - - body = { - properties = {} - } + template_spec_versions = merge([ + for name, versions in local.template_specs : { + for version in versions : "${name}-${version}" => { + name = name + version = version + } + } + ]...) } -resource "azapi_resource" "template_spec_taskcluster_arm_template_relops" { +resource "azapi_resource" "template_spec" { + for_each = local.template_specs + type = "Microsoft.Resources/templateSpecs@2022-02-01" - name = "taskcluster-arm-template-relops" - parent_id = local.trusted_fxci_template_spec_resource_group_id + name = each.key + parent_id = local.template_spec_resource_group_id location = "eastus" body = { @@ -29,62 +29,17 @@ resource "azapi_resource" "template_spec_taskcluster_arm_template_relops" { } } -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.trusted_fxci_template_spec_ids.taskcluster_arm_template - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-1.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} +resource "azapi_resource" "template_spec_version" { + for_each = local.template_spec_versions -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_2_0" { type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "2.0" - parent_id = local.trusted_fxci_template_spec_ids.taskcluster_arm_template + name = each.value.version + parent_id = azapi_resource.template_spec[each.value.name].id location = "eastus" body = { properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-2.0.json")) + mainTemplate = jsondecode(file("${path.module}/template_specs/${each.key}.json")) } } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_3_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "3.0" - parent_id = local.trusted_fxci_template_spec_ids.taskcluster_arm_template - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-3.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template] -} - -resource "azapi_resource" "template_spec_version_taskcluster_arm_template_relops_1_0" { - type = "Microsoft.Resources/templateSpecs/versions@2022-02-01" - name = "1.0" - parent_id = local.trusted_fxci_template_spec_ids.taskcluster_arm_template_relops - location = "eastus" - - body = { - properties = { - mainTemplate = jsondecode(file("${path.module}/template_specs/taskcluster-arm-template-relops-1.0.json")) - } - } - - depends_on = [azapi_resource.template_spec_taskcluster_arm_template_relops] } diff --git a/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json b/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-2.1.json similarity index 99% rename from terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json rename to terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-2.1.json index 16e911a8..2633432f 100644 --- a/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-3.0.json +++ b/terraform/azure_trusted_fxci/template_specs/taskcluster-arm-template-2.1.json @@ -1,6 +1,6 @@ { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "3.0.0.0", + "contentVersion": "2.1.0.0", "outputs": { "resourceIds": { "type": "object", diff --git a/terraform/azure_trusted_fxci/template_specs_moved.tf b/terraform/azure_trusted_fxci/template_specs_moved.tf new file mode 100644 index 00000000..76c6f424 --- /dev/null +++ b/terraform/azure_trusted_fxci/template_specs_moved.tf @@ -0,0 +1,24 @@ +moved { + from = azapi_resource.template_spec_taskcluster_arm_template + to = azapi_resource.template_spec["taskcluster-arm-template"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-1.0"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_2_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-2.0"] +} + +moved { + from = azapi_resource.template_spec_taskcluster_arm_template_relops + to = azapi_resource.template_spec["taskcluster-arm-template-relops"] +} + +moved { + from = azapi_resource.template_spec_version_taskcluster_arm_template_relops_1_0 + to = azapi_resource.template_spec_version["taskcluster-arm-template-relops-1.0"] +}