provider/azurerm: arm_virtual_machine diagnostics_profile was causing a

panic on the Read func

Fixes #8995

The Diagnostics profile was a badly laid out resource. All we needed to
set was whether it was enabled and the storage account to save the logs
to. The old schema parameter was deprecated and replaced with a much
simplier structure

```
% make testacc TEST=./builtin/providers/azurerm TESTARGS='-run=TestAccAzureRMVirtualMachine_diagnosticsProfile'
==> Checking that code complies with gofmt requirements...
go generate $(go list ./... | grep -v /terraform/vendor/)
2016/09/29 12:21:04 Generated command/internal_plugin_list.go
TF_ACC=1 go test ./builtin/providers/azurerm -v
-run=TestAccAzureRMVirtualMachine_diagnosticsProfile -timeout 120m
=== RUN   TestAccAzureRMVirtualMachine_diagnosticsProfile
--- PASS: TestAccAzureRMVirtualMachine_diagnosticsProfile (1066.76s)
PASS
ok
github.com/hashicorp/terraform/builtin/providers/azurerm1066.776s
```
This commit is contained in:
stack72 2016-09-29 12:32:19 +01:00
parent 88c3554dda
commit dcfdc6ab30
No known key found for this signature in database
GPG Key ID: 8619A619B085CB16
3 changed files with 58 additions and 30 deletions

View File

@ -11,6 +11,7 @@ import (
"github.com/Azure/azure-sdk-for-go/arm/compute" "github.com/Azure/azure-sdk-for-go/arm/compute"
"github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/hashcode"
"github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/schema"
riviera "github.com/jen20/riviera/azure"
) )
func resourceArmVirtualMachine() *schema.Resource { func resourceArmVirtualMachine() *schema.Resource {
@ -217,6 +218,8 @@ func resourceArmVirtualMachine() *schema.Resource {
Type: schema.TypeSet, Type: schema.TypeSet,
Optional: true, Optional: true,
MaxItems: 1, MaxItems: 1,
ConflictsWith: []string{"boot_diagnostics"},
Deprecated: "Use field boot_diagnostics instead",
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"boot_diagnostics": { "boot_diagnostics": {
@ -241,6 +244,25 @@ func resourceArmVirtualMachine() *schema.Resource {
}, },
}, },
"boot_diagnostics": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"enabled": {
Type: schema.TypeBool,
Required: true,
},
"storage_uri": {
Type: schema.TypeString,
Required: true,
},
},
},
},
"os_profile": { "os_profile": {
Type: schema.TypeSet, Type: schema.TypeSet,
Required: true, Required: true,
@ -453,9 +475,11 @@ func resourceArmVirtualMachineCreate(d *schema.ResourceData, meta interface{}) e
StorageProfile: &storageProfile, StorageProfile: &storageProfile,
} }
if _, ok := d.GetOk("diagnostics_profile"); ok { if _, ok := d.GetOk("boot_diagnostics"); ok {
diagnosticsProfile := expandAzureRmVirtualMachineDiagnosticsProfile(d) diagnosticsProfile := expandAzureRmVirtualMachineDiagnosticsProfile(d)
properties.DiagnosticsProfile = &diagnosticsProfile if diagnosticsProfile != nil {
properties.DiagnosticsProfile = diagnosticsProfile
}
} }
osProfile, err := expandAzureRmVirtualMachineOsProfile(d) osProfile, err := expandAzureRmVirtualMachineOsProfile(d)
@ -577,8 +601,8 @@ func resourceArmVirtualMachineRead(d *schema.ResourceData, meta interface{}) err
} }
} }
if resp.Properties.DiagnosticsProfile != nil { if resp.Properties.DiagnosticsProfile != nil && resp.Properties.DiagnosticsProfile.BootDiagnostics != nil {
if err := d.Set("diagnostics_profile", flattenAzureRmVirtualMachineDiagnosticsProfile(resp.Properties.DiagnosticsProfile)); err != nil { if err := d.Set("boot_diagnostics", flattenAzureRmVirtualMachineDiagnosticsProfile(resp.Properties.DiagnosticsProfile.BootDiagnostics)); err != nil {
return fmt.Errorf("[DEBUG] Error setting Virtual Machine Diagnostics Profile: %#v", err) return fmt.Errorf("[DEBUG] Error setting Virtual Machine Diagnostics Profile: %#v", err)
} }
} }
@ -751,14 +775,13 @@ func flattenAzureRmVirtualMachineImageReference(image *compute.ImageReference) [
return []interface{}{result} return []interface{}{result}
} }
func flattenAzureRmVirtualMachineDiagnosticsProfile(profile *compute.DiagnosticsProfile) map[string]interface{} { func flattenAzureRmVirtualMachineDiagnosticsProfile(profile *compute.BootDiagnostics) []interface{} {
result := make(map[string]interface{}) result := make(map[string]interface{})
bootDiagnostics := make(map[string]interface{})
bootDiagnostics["enabled"] = *profile.BootDiagnostics.Enabled
bootDiagnostics["storage_uri"] = *profile.BootDiagnostics.StorageURI
result["boot_diagnostics"] = bootDiagnostics
return result result["enabled"] = *profile.Enabled
result["storage_uri"] = *profile.StorageURI
return []interface{}{result}
} }
func flattenAzureRmVirtualMachineNetworkInterfaces(profile *compute.NetworkProfile) []string { func flattenAzureRmVirtualMachineNetworkInterfaces(profile *compute.NetworkProfile) []string {
@ -1140,20 +1163,24 @@ func expandAzureRmVirtualMachineDataDisk(d *schema.ResourceData) ([]compute.Data
return data_disks, nil return data_disks, nil
} }
func expandAzureRmVirtualMachineDiagnosticsProfile(d *schema.ResourceData) compute.DiagnosticsProfile { func expandAzureRmVirtualMachineDiagnosticsProfile(d *schema.ResourceData) *compute.DiagnosticsProfile {
diagnosticsProfiles := d.Get("diagnostics_profile").(*schema.Set).List() bootDiagnostics := d.Get("boot_diagnostics").([]interface{})
diagnosticsProfile := diagnosticsProfiles[0].(map[string]interface{})
bootDiagnosticses := diagnosticsProfile["boot_diagnostics"].(*schema.Set).List()
bootDiagnostics := bootDiagnosticses[0].(map[string]interface{})
enabled := bootDiagnostics["enabled"].(bool)
storageURI := bootDiagnostics["storage_uri"].(string)
return compute.DiagnosticsProfile{ diagnosticsProfile := &compute.DiagnosticsProfile{}
BootDiagnostics: &compute.BootDiagnostics{ if len(bootDiagnostics) > 0 {
Enabled: &enabled, bootDiagnostic := bootDiagnostics[0].(map[string]interface{})
StorageURI: &storageURI,
}, diagnostic := &compute.BootDiagnostics{
Enabled: riviera.Bool(bootDiagnostic["enabled"].(bool)),
StorageURI: riviera.String(bootDiagnostic["storage_uri"].(string)),
} }
diagnosticsProfile.BootDiagnostics = diagnostic
return diagnosticsProfile
}
return nil
} }
func expandAzureRmVirtualMachineImageReference(d *schema.ResourceData) (*compute.ImageReference, error) { func expandAzureRmVirtualMachineImageReference(d *schema.ResourceData) (*compute.ImageReference, error) {

View File

@ -1254,6 +1254,11 @@ resource "azurerm_virtual_machine" "test" {
admin_password = "Password1234!" admin_password = "Password1234!"
} }
boot_diagnostics {
enabled = true
storage_uri = "${azurerm_storage_account.test.primary_blob_endpoint}"
}
os_profile_windows_config { os_profile_windows_config {
winrm { winrm {
protocol = "http" protocol = "http"

View File

@ -207,7 +207,7 @@ The following arguments are supported:
* `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created. * `location` - (Required) Specifies the supported Azure location where the resource exists. Changing this forces a new resource to be created.
* `plan` - (Optional) A plan block as documented below. * `plan` - (Optional) A plan block as documented below.
* `availability_set_id` - (Optional) The Id of the Availability Set in which to create the virtual machine * `availability_set_id` - (Optional) The Id of the Availability Set in which to create the virtual machine
* `diagnostics_profile` - (Optional) A Diagnostics Profile block as referenced below. * `boot_diagnostics` - (Optional) A boot diagnostics profile block as referenced below.
* `vm_size` - (Required) Specifies the [size of the virtual machine](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-size-specs/). * `vm_size` - (Required) Specifies the [size of the virtual machine](https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-size-specs/).
* `storage_image_reference` - (Optional) A Storage Image Reference block as documented below. * `storage_image_reference` - (Optional) A Storage Image Reference block as documented below.
* `storage_os_disk` - (Required) A Storage OS Disk block as referenced below. * `storage_os_disk` - (Required) A Storage OS Disk block as referenced below.
@ -229,10 +229,6 @@ For more information on the different example configurations, please check out t
* `publisher` - (Optional) Specifies the publisher of the image. * `publisher` - (Optional) Specifies the publisher of the image.
* `product` - (Optional) Specifies the product of the image from the marketplace. * `product` - (Optional) Specifies the product of the image from the marketplace.
`diagnostics_profile` supports the following:
* `boot_diagnostics`: (Required) A Boot Diagnostics block as documented below.
`boot_diagnostics` supports the following: `boot_diagnostics` supports the following:
* `enabled`: (Required) Whether to enable boot diagnostics for the virtual machine. * `enabled`: (Required) Whether to enable boot diagnostics for the virtual machine.