github.com/ves/terraform@v0.8.0-beta2/builtin/providers/azurerm/resource_arm_virtual_machine_extension.go (about) 1 package azurerm 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "reflect" 8 9 "github.com/Azure/azure-sdk-for-go/arm/compute" 10 "github.com/hashicorp/terraform/helper/schema" 11 ) 12 13 func resourceArmVirtualMachineExtensions() *schema.Resource { 14 return &schema.Resource{ 15 Create: resourceArmVirtualMachineExtensionsCreate, 16 Read: resourceArmVirtualMachineExtensionsRead, 17 Update: resourceArmVirtualMachineExtensionsCreate, 18 Delete: resourceArmVirtualMachineExtensionsDelete, 19 Importer: &schema.ResourceImporter{ 20 State: schema.ImportStatePassthrough, 21 }, 22 23 Schema: map[string]*schema.Schema{ 24 "name": &schema.Schema{ 25 Type: schema.TypeString, 26 Required: true, 27 ForceNew: true, 28 }, 29 30 "location": &schema.Schema{ 31 Type: schema.TypeString, 32 Required: true, 33 ForceNew: true, 34 StateFunc: azureRMNormalizeLocation, 35 }, 36 37 "resource_group_name": &schema.Schema{ 38 Type: schema.TypeString, 39 Required: true, 40 ForceNew: true, 41 }, 42 43 "virtual_machine_name": &schema.Schema{ 44 Type: schema.TypeString, 45 Required: true, 46 ForceNew: true, 47 }, 48 49 "publisher": &schema.Schema{ 50 Type: schema.TypeString, 51 Required: true, 52 }, 53 54 "type": &schema.Schema{ 55 Type: schema.TypeString, 56 Required: true, 57 }, 58 59 "type_handler_version": &schema.Schema{ 60 Type: schema.TypeString, 61 Required: true, 62 }, 63 64 "auto_upgrade_minor_version": { 65 Type: schema.TypeBool, 66 Optional: true, 67 }, 68 69 "settings": &schema.Schema{ 70 Type: schema.TypeString, 71 Optional: true, 72 ValidateFunc: validateJsonString, 73 DiffSuppressFunc: suppressDiffVirtualMachineExtensionSettings, 74 }, 75 76 // due to the sensitive nature, these are not returned by the API 77 "protected_settings": &schema.Schema{ 78 Type: schema.TypeString, 79 Optional: true, 80 Sensitive: true, 81 ValidateFunc: validateJsonString, 82 DiffSuppressFunc: suppressDiffVirtualMachineExtensionSettings, 83 }, 84 85 "tags": tagsSchema(), 86 }, 87 } 88 } 89 90 func resourceArmVirtualMachineExtensionsCreate(d *schema.ResourceData, meta interface{}) error { 91 client := meta.(*ArmClient).vmExtensionClient 92 93 name := d.Get("name").(string) 94 location := d.Get("location").(string) 95 vmName := d.Get("virtual_machine_name").(string) 96 resGroup := d.Get("resource_group_name").(string) 97 publisher := d.Get("publisher").(string) 98 extensionType := d.Get("type").(string) 99 typeHandlerVersion := d.Get("type_handler_version").(string) 100 autoUpgradeMinor := d.Get("auto_upgrade_minor_version").(bool) 101 tags := d.Get("tags").(map[string]interface{}) 102 103 extension := compute.VirtualMachineExtension{ 104 Location: &location, 105 Properties: &compute.VirtualMachineExtensionProperties{ 106 Publisher: &publisher, 107 Type: &extensionType, 108 TypeHandlerVersion: &typeHandlerVersion, 109 AutoUpgradeMinorVersion: &autoUpgradeMinor, 110 }, 111 Tags: expandTags(tags), 112 } 113 114 if settingsString := d.Get("settings").(string); settingsString != "" { 115 settings, err := expandArmVirtualMachineExtensionSettings(settingsString) 116 if err != nil { 117 return fmt.Errorf("unable to parse settings: %s", err) 118 } 119 extension.Properties.Settings = &settings 120 } 121 122 if protectedSettingsString := d.Get("protected_settings").(string); protectedSettingsString != "" { 123 protectedSettings, err := expandArmVirtualMachineExtensionSettings(protectedSettingsString) 124 if err != nil { 125 return fmt.Errorf("unable to parse protected_settings: %s", err) 126 } 127 extension.Properties.ProtectedSettings = &protectedSettings 128 } 129 130 _, err := client.CreateOrUpdate(resGroup, vmName, name, extension, make(chan struct{})) 131 if err != nil { 132 return err 133 } 134 135 read, err := client.Get(resGroup, vmName, name, "") 136 if err != nil { 137 return err 138 } 139 140 if read.ID == nil { 141 return fmt.Errorf("Cannot read Virtual Machine Extension %s (resource group %s) ID", name, resGroup) 142 } 143 144 d.SetId(*read.ID) 145 146 return resourceArmVirtualMachineExtensionsRead(d, meta) 147 } 148 149 func resourceArmVirtualMachineExtensionsRead(d *schema.ResourceData, meta interface{}) error { 150 client := meta.(*ArmClient).vmExtensionClient 151 152 id, err := parseAzureResourceID(d.Id()) 153 if err != nil { 154 return err 155 } 156 resGroup := id.ResourceGroup 157 vmName := id.Path["virtualMachines"] 158 name := id.Path["extensions"] 159 160 resp, err := client.Get(resGroup, vmName, name, "") 161 if err != nil { 162 return fmt.Errorf("Error making Read request on Virtual Machine Extension %s: %s", name, err) 163 } 164 if resp.StatusCode == http.StatusNotFound { 165 d.SetId("") 166 return nil 167 } 168 169 d.Set("name", resp.Name) 170 d.Set("location", azureRMNormalizeLocation(*resp.Location)) 171 d.Set("virtual_machine_name", vmName) 172 d.Set("resource_group_name", resGroup) 173 d.Set("publisher", resp.Properties.Publisher) 174 d.Set("type", resp.Properties.Type) 175 d.Set("type_handler_version", resp.Properties.TypeHandlerVersion) 176 d.Set("auto_upgrade_minor_version", resp.Properties.AutoUpgradeMinorVersion) 177 178 if resp.Properties.Settings != nil { 179 settings, err := flattenArmVirtualMachineExtensionSettings(*resp.Properties.Settings) 180 if err != nil { 181 return fmt.Errorf("unable to parse settings from response: %s", err) 182 } 183 d.Set("settings", settings) 184 } 185 186 flattenAndSetTags(d, resp.Tags) 187 188 return nil 189 } 190 191 func resourceArmVirtualMachineExtensionsDelete(d *schema.ResourceData, meta interface{}) error { 192 client := meta.(*ArmClient).vmExtensionClient 193 194 id, err := parseAzureResourceID(d.Id()) 195 if err != nil { 196 return err 197 } 198 resGroup := id.ResourceGroup 199 name := id.Path["extensions"] 200 vmName := id.Path["virtualMachines"] 201 202 _, err = client.Delete(resGroup, vmName, name, make(chan struct{})) 203 204 return nil 205 } 206 207 func expandArmVirtualMachineExtensionSettings(jsonString string) (map[string]interface{}, error) { 208 var result map[string]interface{} 209 210 err := json.Unmarshal([]byte(jsonString), &result) 211 212 return result, err 213 } 214 215 func flattenArmVirtualMachineExtensionSettings(settingsMap map[string]interface{}) (string, error) { 216 result, err := json.Marshal(settingsMap) 217 if err != nil { 218 return "", err 219 } 220 221 return string(result), nil 222 } 223 224 func suppressDiffVirtualMachineExtensionSettings(k, old, new string, d *schema.ResourceData) bool { 225 oldMap, err := expandArmVirtualMachineExtensionSettings(old) 226 if err != nil { 227 return false 228 } 229 230 newMap, err := expandArmVirtualMachineExtensionSettings(new) 231 if err != nil { 232 return false 233 } 234 235 return reflect.DeepEqual(oldMap, newMap) 236 }