github.com/IBM-Cloud/terraform@v0.6.4-0.20170726051544-8872b87621df/builtin/providers/azurerm/resource_arm_sql_database.go (about) 1 package azurerm 2 3 import ( 4 "fmt" 5 "log" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 "github.com/jen20/riviera/azure" 9 "github.com/jen20/riviera/sql" 10 ) 11 12 func resourceArmSqlDatabase() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceArmSqlDatabaseCreate, 15 Read: resourceArmSqlDatabaseRead, 16 Update: resourceArmSqlDatabaseCreate, 17 Delete: resourceArmSqlDatabaseDelete, 18 19 Schema: map[string]*schema.Schema{ 20 "name": { 21 Type: schema.TypeString, 22 Required: true, 23 ForceNew: true, 24 }, 25 26 "location": locationSchema(), 27 28 "resource_group_name": { 29 Type: schema.TypeString, 30 Required: true, 31 ForceNew: true, 32 }, 33 34 "server_name": { 35 Type: schema.TypeString, 36 Required: true, 37 ForceNew: true, 38 }, 39 40 "create_mode": { 41 Type: schema.TypeString, 42 Optional: true, 43 Default: "Default", 44 }, 45 46 "source_database_id": { 47 Type: schema.TypeString, 48 Optional: true, 49 Computed: true, 50 }, 51 52 "restore_point_in_time": { 53 Type: schema.TypeString, 54 Optional: true, 55 Computed: true, 56 }, 57 58 "edition": { 59 Type: schema.TypeString, 60 Optional: true, 61 Computed: true, 62 ValidateFunc: validateArmSqlDatabaseEdition, 63 }, 64 65 "collation": { 66 Type: schema.TypeString, 67 Optional: true, 68 Computed: true, 69 }, 70 71 "max_size_bytes": { 72 Type: schema.TypeString, 73 Optional: true, 74 Computed: true, 75 }, 76 77 "requested_service_objective_id": { 78 Type: schema.TypeString, 79 Optional: true, 80 Computed: true, 81 }, 82 83 "requested_service_objective_name": { 84 Type: schema.TypeString, 85 Optional: true, 86 Computed: true, 87 }, 88 89 "source_database_deletion_date": { 90 Type: schema.TypeString, 91 Optional: true, 92 Computed: true, 93 }, 94 95 "elastic_pool_name": { 96 Type: schema.TypeString, 97 Optional: true, 98 Computed: true, 99 }, 100 101 "encryption": { 102 Type: schema.TypeString, 103 Computed: true, 104 }, 105 106 "creation_date": { 107 Type: schema.TypeString, 108 Computed: true, 109 }, 110 111 "default_secondary_location": { 112 Type: schema.TypeString, 113 Computed: true, 114 }, 115 116 "tags": tagsSchema(), 117 }, 118 } 119 } 120 121 func resourceArmSqlDatabaseCreate(d *schema.ResourceData, meta interface{}) error { 122 client := meta.(*ArmClient) 123 rivieraClient := client.rivieraClient 124 125 tags := d.Get("tags").(map[string]interface{}) 126 expandedTags := expandTags(tags) 127 128 command := &sql.CreateOrUpdateDatabase{ 129 Name: d.Get("name").(string), 130 Location: d.Get("location").(string), 131 ResourceGroupName: d.Get("resource_group_name").(string), 132 ServerName: d.Get("server_name").(string), 133 Tags: *expandedTags, 134 CreateMode: azure.String(d.Get("create_mode").(string)), 135 } 136 137 if v, ok := d.GetOk("source_database_id"); ok { 138 command.SourceDatabaseID = azure.String(v.(string)) 139 } 140 141 if v, ok := d.GetOk("edition"); ok { 142 command.Edition = azure.String(v.(string)) 143 } 144 145 if v, ok := d.GetOk("collation"); ok { 146 command.Collation = azure.String(v.(string)) 147 } 148 149 if v, ok := d.GetOk("max_size_bytes"); ok { 150 command.MaxSizeBytes = azure.String(v.(string)) 151 } 152 153 if v, ok := d.GetOk("source_database_deletion_date"); ok { 154 command.SourceDatabaseDeletionDate = azure.String(v.(string)) 155 } 156 157 if v, ok := d.GetOk("requested_service_objective_id"); ok { 158 command.RequestedServiceObjectiveID = azure.String(v.(string)) 159 } 160 161 if v, ok := d.GetOk("elastic_pool_name"); ok { 162 command.ElasticPoolName = azure.String(v.(string)) 163 } 164 165 if v, ok := d.GetOk("requested_service_objective_name"); ok { 166 command.RequestedServiceObjectiveName = azure.String(v.(string)) 167 } 168 169 createRequest := rivieraClient.NewRequest() 170 createRequest.Command = command 171 172 createResponse, err := createRequest.Execute() 173 if err != nil { 174 return fmt.Errorf("Error creating SQL Database: %s", err) 175 } 176 if !createResponse.IsSuccessful() { 177 return fmt.Errorf("Error creating SQL Database: %s", createResponse.Error) 178 } 179 180 readRequest := rivieraClient.NewRequest() 181 readRequest.Command = &sql.GetDatabase{ 182 Name: d.Get("name").(string), 183 ResourceGroupName: d.Get("resource_group_name").(string), 184 ServerName: d.Get("server_name").(string), 185 } 186 187 readResponse, err := readRequest.Execute() 188 if err != nil { 189 return fmt.Errorf("Error reading SQL Database: %s", err) 190 } 191 if !readResponse.IsSuccessful() { 192 return fmt.Errorf("Error reading SQL Database: %s", readResponse.Error) 193 } 194 195 resp := readResponse.Parsed.(*sql.GetDatabaseResponse) 196 d.SetId(*resp.ID) 197 198 return resourceArmSqlDatabaseRead(d, meta) 199 } 200 201 func resourceArmSqlDatabaseRead(d *schema.ResourceData, meta interface{}) error { 202 client := meta.(*ArmClient) 203 rivieraClient := client.rivieraClient 204 205 readRequest := rivieraClient.NewRequestForURI(d.Id()) 206 readRequest.Command = &sql.GetDatabase{} 207 208 readResponse, err := readRequest.Execute() 209 if err != nil { 210 return fmt.Errorf("Error reading SQL Database: %s", err) 211 } 212 if !readResponse.IsSuccessful() { 213 log.Printf("[INFO] Error reading SQL Database %q - removing from state", d.Id()) 214 d.SetId("") 215 return fmt.Errorf("Error reading SQL Database: %s", readResponse.Error) 216 } 217 218 resp := readResponse.Parsed.(*sql.GetDatabaseResponse) 219 220 d.Set("name", resp.Name) 221 d.Set("creation_date", resp.CreationDate) 222 d.Set("default_secondary_location", resp.DefaultSecondaryLocation) 223 d.Set("elastic_pool_name", resp.ElasticPoolName) 224 225 flattenAndSetTags(d, resp.Tags) 226 227 return nil 228 } 229 230 func resourceArmSqlDatabaseDelete(d *schema.ResourceData, meta interface{}) error { 231 client := meta.(*ArmClient) 232 rivieraClient := client.rivieraClient 233 234 deleteRequest := rivieraClient.NewRequestForURI(d.Id()) 235 deleteRequest.Command = &sql.DeleteDatabase{} 236 237 deleteResponse, err := deleteRequest.Execute() 238 if err != nil { 239 return fmt.Errorf("Error deleting SQL Database: %s", err) 240 } 241 if !deleteResponse.IsSuccessful() { 242 return fmt.Errorf("Error deleting SQL Database: %s", deleteResponse.Error) 243 } 244 245 return nil 246 } 247 248 func validateArmSqlDatabaseEdition(v interface{}, k string) (ws []string, errors []error) { 249 editions := map[string]bool{ 250 "Basic": true, 251 "Standard": true, 252 "Premium": true, 253 "DataWarehouse": true, 254 } 255 if !editions[v.(string)] { 256 errors = append(errors, fmt.Errorf("SQL Database Edition can only be Basic, Standard, Premium or DataWarehouse")) 257 } 258 return 259 }