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