diff --git a/builtin/providers/azurerm/resource_arm_template_deployment.go b/builtin/providers/azurerm/resource_arm_template_deployment.go index 474d722d190e..daceaa1e3b8d 100644 --- a/builtin/providers/azurerm/resource_arm_template_deployment.go +++ b/builtin/providers/azurerm/resource_arm_template_deployment.go @@ -44,6 +44,11 @@ func resourceArmTemplateDeployment() *schema.Resource { Optional: true, }, + "outputs": &schema.Schema{ + Type: schema.TypeMap, + Computed: true, + }, + "deployment_mode": &schema.Schema{ Type: schema.TypeString, Required: true, @@ -60,14 +65,24 @@ func resourceArmTemplateDeploymentCreate(d *schema.ResourceData, meta interface{ resGroup := d.Get("resource_group_name").(string) deployment_mode := d.Get("deployment_mode").(string) - log.Printf("[INFO] preparing arguments for Azure ARM Virtual Machine creation.") + log.Printf("[INFO] preparing arguments for Azure ARM Template Deployment creation.") properties := resources.DeploymentProperties{ Mode: resources.DeploymentMode(deployment_mode), } if v, ok := d.GetOk("parameters"); ok { params := v.(map[string]interface{}) - properties.Parameters = ¶ms + + newParams := make(map[string]interface{}, len(params)) + for key, val := range params { + newParams[key] = struct { + Value interface{} + }{ + Value: val, + } + } + + properties.Parameters = &newParams } if v, ok := d.GetOk("template_body"); ok { @@ -89,7 +104,7 @@ func resourceArmTemplateDeploymentCreate(d *schema.ResourceData, meta interface{ d.SetId(*resp.ID) - log.Printf("[DEBUG] Waiting for Template Deploymnet (%s) to become available", name) + log.Printf("[DEBUG] Waiting for Template Deployment (%s) to become available", name) stateConf := &resource.StateChangeConf{ Pending: []string{"Creating", "Updating", "Accepted", "Running"}, Target: []string{"Succeeded"}, @@ -123,7 +138,51 @@ func resourceArmTemplateDeploymentRead(d *schema.ResourceData, meta interface{}) return nil } if err != nil { - return fmt.Errorf("Error making Read request on Azure Template Deployment %s: %s", name, err) + return fmt.Errorf("Error making Read request on Azure RM Template Deployment %s: %s", name, err) + } + + if resp.Properties.Outputs != nil { + outputs := make(map[string]string, len(*resp.Properties.Outputs)) + for key, output := range *resp.Properties.Outputs { + outputMap, ok := output.(map[string]interface{}) + if !ok { + // Not a map + continue + } + + outputType, ok := outputMap["type"] + if !ok { + // No type + continue + } + + outputTypeString, ok := outputType.(string) + if !ok { + // Type description not a string + continue + } + + if outputTypeString != "string" { + // Type instance is not "string" + continue + } + + outputValue, ok := outputMap["value"] + if !ok { + // No value + continue + } + + outputValueString, ok := outputValue.(string) + if !ok { + // Value isn't a string + continue + } + + outputs[key] = outputValueString + } + + d.Set("outputs", outputs) } return nil @@ -151,7 +210,7 @@ func expandTemplateBody(template string) (map[string]interface{}, error) { var templateBody map[string]interface{} err := json.Unmarshal([]byte(template), &templateBody) if err != nil { - return nil, fmt.Errorf("dont be a dumb fuck") + return nil, fmt.Errorf("Error Expanding the template_body for Azure RM Template Deployment") } return templateBody, nil } diff --git a/builtin/providers/azurerm/resource_arm_template_deployment_test.go b/builtin/providers/azurerm/resource_arm_template_deployment_test.go index 5e4f05247de4..188f33da92c5 100644 --- a/builtin/providers/azurerm/resource_arm_template_deployment_test.go +++ b/builtin/providers/azurerm/resource_arm_template_deployment_test.go @@ -28,6 +28,25 @@ func TestAccAzureRMTemplateDeployment_basic(t *testing.T) { }) } +func TestAccAzureRMTemplateDeployment_withParams(t *testing.T) { + ri := acctest.RandInt() + config := fmt.Sprintf(testAccAzureRMTemplateDeployment_withParams, ri, ri, ri) + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testCheckAzureRMTemplateDeploymentDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: config, + Check: resource.ComposeTestCheckFunc( + testCheckAzureRMTemplateDeploymentExists("azurerm_template_deployment.test"), + resource.TestCheckResourceAttr("azurerm_template_deployment.test", "outputs.testOutput", "Output Value"), + ), + }, + }, + }) +} + func testCheckAzureRMTemplateDeploymentExists(name string) resource.TestCheckFunc { return func(s *terraform.State) error { // Ensure we have enough information in state to look up in API @@ -146,3 +165,87 @@ DEPLOY } ` + +var testAccAzureRMTemplateDeployment_withParams = ` + resource "azurerm_resource_group" "test" { + name = "acctestrg-%d" + location = "West US" + } + + output "test" { + value = "${azurerm_template_deployment.test.outputs.testOutput}" + } + + resource "azurerm_template_deployment" "test" { + name = "acctesttemplate-%d" + resource_group_name = "${azurerm_resource_group.test.name}" + template_body = < + > + azurerm_template_deployment + + > Virtual Machine Resources