2017-06-15 17:41:05 +00:00
|
|
|
package google
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2017-07-05 19:54:38 +00:00
|
|
|
"log"
|
2017-06-15 17:41:05 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/helper/schema"
|
|
|
|
"github.com/hashicorp/terraform/helper/validation"
|
|
|
|
|
|
|
|
"cloud.google.com/go/bigtable"
|
|
|
|
"golang.org/x/net/context"
|
|
|
|
)
|
|
|
|
|
|
|
|
func resourceBigtableInstance() *schema.Resource {
|
|
|
|
return &schema.Resource{
|
|
|
|
Create: resourceBigtableInstanceCreate,
|
|
|
|
Read: resourceBigtableInstanceRead,
|
|
|
|
Delete: resourceBigtableInstanceDestroy,
|
|
|
|
|
|
|
|
Schema: map[string]*schema.Schema{
|
|
|
|
"name": {
|
|
|
|
Type: schema.TypeString,
|
|
|
|
Required: true,
|
|
|
|
ForceNew: true,
|
|
|
|
},
|
|
|
|
|
2017-06-26 21:03:35 +00:00
|
|
|
"cluster_id": {
|
2017-06-15 17:41:05 +00:00
|
|
|
Type: schema.TypeString,
|
2017-06-26 21:03:35 +00:00
|
|
|
Required: true,
|
2017-06-15 17:41:05 +00:00
|
|
|
ForceNew: true,
|
|
|
|
},
|
|
|
|
|
2017-06-26 21:03:35 +00:00
|
|
|
"zone": {
|
2017-06-15 17:41:05 +00:00
|
|
|
Type: schema.TypeString,
|
|
|
|
Required: true,
|
|
|
|
ForceNew: true,
|
|
|
|
},
|
|
|
|
|
2017-06-26 21:03:35 +00:00
|
|
|
"display_name": {
|
|
|
|
Type: schema.TypeString,
|
|
|
|
Optional: true,
|
|
|
|
ForceNew: true,
|
|
|
|
Computed: true,
|
|
|
|
},
|
|
|
|
|
2017-06-15 17:41:05 +00:00
|
|
|
"num_nodes": {
|
2017-06-26 20:33:05 +00:00
|
|
|
Type: schema.TypeInt,
|
|
|
|
Optional: true,
|
|
|
|
ForceNew: true,
|
|
|
|
Default: 3,
|
|
|
|
ValidateFunc: IntAtLeast(3),
|
2017-06-15 17:41:05 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
"storage_type": {
|
|
|
|
Type: schema.TypeString,
|
2017-06-26 20:33:05 +00:00
|
|
|
Optional: true,
|
2017-06-15 17:41:05 +00:00
|
|
|
ForceNew: true,
|
2017-06-26 20:33:05 +00:00
|
|
|
Default: "SSD",
|
2017-06-15 17:41:05 +00:00
|
|
|
ValidateFunc: validation.StringInSlice([]string{"SSD", "HDD"}, false),
|
|
|
|
},
|
|
|
|
|
|
|
|
"project": {
|
|
|
|
Type: schema.TypeString,
|
|
|
|
Optional: true,
|
|
|
|
ForceNew: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func resourceBigtableInstanceCreate(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
config := meta.(*Config)
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
project, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
name := d.Get("name").(string)
|
|
|
|
displayName, ok := d.GetOk("display_name")
|
|
|
|
if !ok {
|
|
|
|
displayName = name
|
|
|
|
}
|
|
|
|
|
|
|
|
var storageType bigtable.StorageType
|
|
|
|
switch value := d.Get("storage_type"); value {
|
|
|
|
case "HDD":
|
|
|
|
storageType = bigtable.HDD
|
|
|
|
case "SSD":
|
|
|
|
storageType = bigtable.SSD
|
|
|
|
}
|
|
|
|
|
|
|
|
instanceConf := &bigtable.InstanceConf{
|
|
|
|
InstanceId: name,
|
|
|
|
DisplayName: displayName.(string),
|
2017-06-26 20:33:05 +00:00
|
|
|
ClusterId: d.Get("cluster_id").(string),
|
|
|
|
NumNodes: int32(d.Get("num_nodes").(int)),
|
2017-06-15 17:41:05 +00:00
|
|
|
StorageType: storageType,
|
2017-06-26 20:33:05 +00:00
|
|
|
Zone: d.Get("zone").(string),
|
2017-06-15 17:41:05 +00:00
|
|
|
}
|
|
|
|
|
2017-06-26 20:34:33 +00:00
|
|
|
c, err := config.bigtableClientFactory.NewInstanceAdminClient(project)
|
2017-06-15 17:41:05 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error starting instance admin client. %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
err = c.CreateInstance(ctx, instanceConf)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error creating instance. %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
d.SetId(name)
|
|
|
|
|
|
|
|
return resourceBigtableInstanceRead(d, meta)
|
|
|
|
}
|
|
|
|
|
|
|
|
func resourceBigtableInstanceRead(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
config := meta.(*Config)
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
project, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-06-26 20:34:33 +00:00
|
|
|
c, err := config.bigtableClientFactory.NewInstanceAdminClient(project)
|
2017-06-15 17:41:05 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error starting instance admin client. %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
defer c.Close()
|
|
|
|
|
2017-06-28 17:00:49 +00:00
|
|
|
instance, err := c.InstanceInfo(ctx, d.Id())
|
2017-06-15 17:41:05 +00:00
|
|
|
if err != nil {
|
2017-06-28 19:46:06 +00:00
|
|
|
log.Printf("[WARN] Removing %s because it's gone", d.Id())
|
|
|
|
d.SetId("")
|
|
|
|
return fmt.Errorf("Error retrieving instance. Could not find %s. %s", d.Id(), err)
|
2017-06-15 17:41:05 +00:00
|
|
|
}
|
|
|
|
|
2017-06-28 17:00:49 +00:00
|
|
|
d.Set("name", instance.Name)
|
|
|
|
d.Set("display_name", instance.DisplayName)
|
2017-06-15 17:41:05 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func resourceBigtableInstanceDestroy(d *schema.ResourceData, meta interface{}) error {
|
|
|
|
config := meta.(*Config)
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
project, err := getProject(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-06-26 20:34:33 +00:00
|
|
|
c, err := config.bigtableClientFactory.NewInstanceAdminClient(project)
|
2017-06-15 17:41:05 +00:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error starting instance admin client. %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
defer c.Close()
|
|
|
|
|
|
|
|
name := d.Id()
|
|
|
|
err = c.DeleteInstance(ctx, name)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("Error deleting instance. %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
d.SetId("")
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2017-06-26 20:33:05 +00:00
|
|
|
|
|
|
|
// IntAtLeast returns a SchemaValidateFunc which tests if the provided value
|
|
|
|
// is of type int and is above min (inclusive)
|
|
|
|
func IntAtLeast(min int) schema.SchemaValidateFunc {
|
|
|
|
return func(i interface{}, k string) (s []string, es []error) {
|
|
|
|
v, ok := i.(int)
|
|
|
|
if !ok {
|
|
|
|
es = append(es, fmt.Errorf("expected type of %s to be int", k))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if v < min {
|
|
|
|
es = append(es, fmt.Errorf("expected %s to be at least %d, got %d", k, min, v))
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|