github.com/bradfeehan/terraform@v0.7.0-rc3.0.20170529055808-34b45c5ad841/builtin/providers/google/resource_sql_user.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/terraform/helper/schema"
     9  	"google.golang.org/api/sqladmin/v1beta4"
    10  )
    11  
    12  func resourceSqlUser() *schema.Resource {
    13  	return &schema.Resource{
    14  		Create: resourceSqlUserCreate,
    15  		Read:   resourceSqlUserRead,
    16  		Update: resourceSqlUserUpdate,
    17  		Delete: resourceSqlUserDelete,
    18  		Importer: &schema.ResourceImporter{
    19  			State: schema.ImportStatePassthrough,
    20  		},
    21  
    22  		SchemaVersion: 1,
    23  		MigrateState:  resourceSqlUserMigrateState,
    24  
    25  		Schema: map[string]*schema.Schema{
    26  			"host": &schema.Schema{
    27  				Type:     schema.TypeString,
    28  				Required: true,
    29  				ForceNew: true,
    30  			},
    31  
    32  			"instance": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Required: true,
    35  				ForceNew: true,
    36  			},
    37  
    38  			"name": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Required: true,
    41  				ForceNew: true,
    42  			},
    43  
    44  			"password": &schema.Schema{
    45  				Type:      schema.TypeString,
    46  				Required:  true,
    47  				Sensitive: true,
    48  			},
    49  
    50  			"project": &schema.Schema{
    51  				Type:     schema.TypeString,
    52  				Optional: true,
    53  				ForceNew: true,
    54  			},
    55  		},
    56  	}
    57  }
    58  
    59  func resourceSqlUserCreate(d *schema.ResourceData, meta interface{}) error {
    60  	config := meta.(*Config)
    61  
    62  	project, err := getProject(d, config)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	name := d.Get("name").(string)
    68  	instance := d.Get("instance").(string)
    69  	password := d.Get("password").(string)
    70  	host := d.Get("host").(string)
    71  
    72  	user := &sqladmin.User{
    73  		Name:     name,
    74  		Instance: instance,
    75  		Password: password,
    76  		Host:     host,
    77  	}
    78  
    79  	op, err := config.clientSqlAdmin.Users.Insert(project, instance,
    80  		user).Do()
    81  
    82  	if err != nil {
    83  		return fmt.Errorf("Error, failed to insert "+
    84  			"user %s into instance %s: %s", name, instance, err)
    85  	}
    86  
    87  	d.SetId(fmt.Sprintf("%s/%s", instance, name))
    88  
    89  	err = sqladminOperationWait(config, op, "Insert User")
    90  
    91  	if err != nil {
    92  		return fmt.Errorf("Error, failure waiting for insertion of %s "+
    93  			"into %s: %s", name, instance, err)
    94  	}
    95  
    96  	return resourceSqlUserRead(d, meta)
    97  }
    98  
    99  func resourceSqlUserRead(d *schema.ResourceData, meta interface{}) error {
   100  	config := meta.(*Config)
   101  
   102  	project, err := getProject(d, config)
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	instanceAndName := strings.SplitN(d.Id(), "/", 2)
   108  	if len(instanceAndName) != 2 {
   109  		return fmt.Errorf(
   110  			"Wrong number of arguments when specifying imported id. Expected: 2.  Saw: %d. Expected Input: $INSTANCENAME/$SQLUSERNAME Input: %s",
   111  			len(instanceAndName),
   112  			d.Id())
   113  	}
   114  
   115  	instance := instanceAndName[0]
   116  	name := instanceAndName[1]
   117  
   118  	users, err := config.clientSqlAdmin.Users.List(project, instance).Do()
   119  
   120  	if err != nil {
   121  		return handleNotFoundError(err, d, fmt.Sprintf("SQL User %q in instance %q", name, instance))
   122  	}
   123  
   124  	var user *sqladmin.User
   125  	for _, currentUser := range users.Items {
   126  		if currentUser.Name == name {
   127  			user = currentUser
   128  			break
   129  		}
   130  	}
   131  
   132  	if user == nil {
   133  		log.Printf("[WARN] Removing SQL User %q because it's gone", d.Get("name").(string))
   134  		d.SetId("")
   135  
   136  		return nil
   137  	}
   138  
   139  	d.Set("host", user.Host)
   140  	d.Set("instance", user.Instance)
   141  	d.Set("name", user.Name)
   142  	return nil
   143  }
   144  
   145  func resourceSqlUserUpdate(d *schema.ResourceData, meta interface{}) error {
   146  	config := meta.(*Config)
   147  
   148  	if d.HasChange("password") {
   149  		project, err := getProject(d, config)
   150  		if err != nil {
   151  			return err
   152  		}
   153  
   154  		name := d.Get("name").(string)
   155  		instance := d.Get("instance").(string)
   156  		host := d.Get("host").(string)
   157  		password := d.Get("password").(string)
   158  
   159  		user := &sqladmin.User{
   160  			Name:     name,
   161  			Instance: instance,
   162  			Password: password,
   163  			Host:     host,
   164  		}
   165  
   166  		op, err := config.clientSqlAdmin.Users.Update(project, instance, host, name,
   167  			user).Do()
   168  
   169  		if err != nil {
   170  			return fmt.Errorf("Error, failed to update"+
   171  				"user %s into user %s: %s", name, instance, err)
   172  		}
   173  
   174  		err = sqladminOperationWait(config, op, "Insert User")
   175  
   176  		if err != nil {
   177  			return fmt.Errorf("Error, failure waiting for update of %s "+
   178  				"in %s: %s", name, instance, err)
   179  		}
   180  
   181  		return resourceSqlUserRead(d, meta)
   182  	}
   183  
   184  	return nil
   185  }
   186  
   187  func resourceSqlUserDelete(d *schema.ResourceData, meta interface{}) error {
   188  	config := meta.(*Config)
   189  
   190  	project, err := getProject(d, config)
   191  	if err != nil {
   192  		return err
   193  	}
   194  
   195  	name := d.Get("name").(string)
   196  	instance := d.Get("instance").(string)
   197  	host := d.Get("host").(string)
   198  
   199  	op, err := config.clientSqlAdmin.Users.Delete(project, instance, host, name).Do()
   200  
   201  	if err != nil {
   202  		return fmt.Errorf("Error, failed to delete"+
   203  			"user %s in instance %s: %s", name,
   204  			instance, err)
   205  	}
   206  
   207  	err = sqladminOperationWait(config, op, "Delete User")
   208  
   209  	if err != nil {
   210  		return fmt.Errorf("Error, failure waiting for deletion of %s "+
   211  			"in %s: %s", name, instance, err)
   212  	}
   213  
   214  	return nil
   215  }