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 }