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  }