Fix crash for outputs of type Object (#7353), and support bool and int outputs

Included in this fix:
1) No crash
2) Debug log indicates problem, otherwise unsupported outputs are ignored
3) String, bool and int outputs are supported
4) Documentation indicates these limitations
What is not included:
5) Array, object, securestring, secureobject still not supported
This commit is contained in:
Stephen Weatherford 2017-04-04 20:14:58 +00:00
parent 280b9cf74d
commit d378e30b1d
3 changed files with 172 additions and 4 deletions

View File

@ -155,20 +155,44 @@ func resourceArmTemplateDeploymentRead(d *schema.ResourceData, meta interface{})
if resp.Properties.Outputs != nil && len(*resp.Properties.Outputs) > 0 {
outputs = make(map[string]string)
for key, output := range *resp.Properties.Outputs {
log.Printf("[DEBUG] Processing deployment output %s", key)
outputMap := output.(map[string]interface{})
outputValue, ok := outputMap["value"]
if !ok {
// No value
continue
}
outputType := outputMap["type"]
var outputStringValue string
outputs[key] = outputValue.(string)
switch outputType {
case "Bool":
if outputValue == false {
outputStringValue = "0"
} else if outputValue == true {
outputStringValue = "1"
} else {
return fmt.Errorf("Invalid value %s for boolean output %s", outputValue, key)
}
case "String": // Nothing to do
fallthrough
case "Int":
outputStringValue = fmt.Sprint(outputValue)
case "SecureString", "Object", "SecureObject", "Array":
fallthrough
default:
log.Printf("[WARNING] Ignoring output %s: Outputs of type %s are not currently supported in azurerm_deployment_template.",
key, outputType)
continue
}
outputs[key] = outputStringValue
}
}
d.Set("outputs", outputs)
return nil
return d.Set("outputs", outputs)
}
func resourceArmTemplateDeploymentDelete(d *schema.ResourceData, meta interface{}) error {

View File

@ -68,6 +68,29 @@ func TestAccAzureRMTemplateDeployment_withParams(t *testing.T) {
})
}
func TestAccAzureRMTemplateDeployment_withOutputs(t *testing.T) {
ri := acctest.RandInt()
config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withOutputs, ri, ri, ri)
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy,
Steps: []resource.TestStep{
{
Config: config,
Check: resource.ComposeTestCheckFunc(
testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"),
resource.TestCheckOutput("tfIntOutput", "-123"),
resource.TestCheckOutput("tfStringOutput", "Standard_GRS"),
resource.TestCheckOutput("tfFalseOutput", "0"),
resource.TestCheckOutput("tfTrueOutput", "1"),
resource.TestCheckResourceAttr("azurerm_template_deployment.test", "outputs.stringOutput", "Standard_GRS"),
),
},
},
})
}
func TestAccAzureRMTemplateDeployment_withError(t *testing.T) {
ri := acctest.RandInt()
config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withError, ri, ri)
@ -352,6 +375,126 @@ DEPLOY
`
var testAccAzureRMTemplateDeployment_withOutputs = `
resource "azurerm_resource_group" "test" {
name = "acctestRG-%d"
location = "West US"
}
output "tfStringOutput" {
value = "${azurerm_template_deployment.test.outputs.stringOutput}"
}
output "tfIntOutput" {
value = "${azurerm_template_deployment.test.outputs.intOutput}"
}
output "tfFalseOutput" {
value = "${azurerm_template_deployment.test.outputs.falseOutput}"
}
output "tfTrueOutput" {
value = "${azurerm_template_deployment.test.outputs.trueOutput}"
}
resource "azurerm_template_deployment" "test" {
name = "acctesttemplate-%d"
resource_group_name = "${azurerm_resource_group.test.name}"
template_body = <<DEPLOY
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountType": {
"type": "string",
"defaultValue": "Standard_LRS",
"allowedValues": [
"Standard_LRS",
"Standard_GRS",
"Standard_ZRS"
],
"metadata": {
"description": "Storage Account type"
}
},
"dnsLabelPrefix": {
"type": "string",
"metadata": {
"description": "DNS Label for the Public IP. Must be lowercase. It should match with the following regular expression: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ or it will raise an error."
}
},
"intParameter": {
"type": "int",
"defaultValue": -123
},
"falseParameter": {
"type": "bool",
"defaultValue": false
},
"trueParameter": {
"type": "bool",
"defaultValue": true
}
},
"variables": {
"location": "[resourceGroup().location]",
"storageAccountName": "[concat(uniquestring(resourceGroup().id), 'storage')]",
"publicIPAddressName": "[concat('myPublicIp', uniquestring(resourceGroup().id))]",
"publicIPAddressType": "Dynamic",
"apiVersion": "2015-06-15"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"name": "[variables('storageAccountName')]",
"apiVersion": "[variables('apiVersion')]",
"location": "[variables('location')]",
"properties": {
"accountType": "[parameters('storageAccountType')]"
}
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "[variables('apiVersion')]",
"name": "[variables('publicIPAddressName')]",
"location": "[variables('location')]",
"properties": {
"publicIPAllocationMethod": "[variables('publicIPAddressType')]",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
}
],
"outputs": {
"stringOutput": {
"type": "string",
"value": "[parameters('storageAccountType')]"
},
"intOutput": {
"type": "int",
"value": "[parameters('intParameter')]"
},
"falseOutput": {
"type": "bool",
"value": "[parameters('falseParameter')]"
},
"trueOutput": {
"type": "bool",
"value": "[parameters('trueParameter')]"
}
}
}
DEPLOY
parameters {
dnsLabelPrefix = "terraform-test-%d"
storageAccountType = "Standard_GRS"
}
deployment_mode = "Incremental"
}
`
// StorageAccount name is too long, forces error
var testAccAzureRMTemplateDeployment_withError = `
resource "azurerm_resource_group" "test" {

View File

@ -98,6 +98,7 @@ The following arguments are supported:
The following attributes are exported:
* `id` - The Template Deployment ID.
* `outputs` - A map of supported scalar output types returned from the deployment (currently, Azure template outputs of type String, Int and Bool are supported, and are converted to strings - others will be ignored).
## Note