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,
|
2017-12-06 22:30:04 +00:00
|
|
|
Optional: true,
|
2018-01-03 21:18:40 +00:00
|
|
|
Computed: true,
|
2017-06-15 17:41:05 +00:00
|
|
|
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-08-11 21:43:00 +00:00
|
|
|
Type: schema.TypeInt,
|
|
|
|
Optional: true,
|
|
|
|
ForceNew: true,
|
|
|
|
},
|
|
|
|
|
|
|
|
"instance_type": {
|
|
|
|
Type: schema.TypeString,
|
2017-06-26 20:33:05 +00:00
|
|
|
Optional: true,
|
|
|
|
ForceNew: true,
|
2017-08-11 21:43:00 +00:00
|
|
|
Default: "PRODUCTION",
|
|
|
|
ValidateFunc: validation.StringInSlice([]string{"DEVELOPMENT", "PRODUCTION"}, false),
|
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,
|
2017-11-28 00:32:20 +00:00
|
|
|
Computed: true,
|
2017-06-15 17:41:05 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2017-08-11 21:43:00 +00:00
|
|
|
numNodes := int32(d.Get("num_nodes").(int))
|
|
|
|
var instanceType bigtable.InstanceType
|
|
|
|
switch value := d.Get("instance_type"); value {
|
|
|
|
case "DEVELOPMENT":
|
|
|
|
instanceType = bigtable.DEVELOPMENT
|
|
|
|
|
|
|
|
if numNodes > 0 {
|
|
|
|
return fmt.Errorf("Can't specify a non-zero number of nodes: %d for DEVELOPMENT Bigtable instance: %s", numNodes, name)
|
|
|
|
}
|
|
|
|
case "PRODUCTION":
|
|
|
|
instanceType = bigtable.PRODUCTION
|
|
|
|
}
|
|
|
|
|
2017-12-06 22:30:04 +00:00
|
|
|
zone, err := getZone(d, config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-06-15 17:41:05 +00:00
|
|
|
instanceConf := &bigtable.InstanceConf{
|
2017-08-11 21:43:00 +00:00
|
|
|
InstanceId: name,
|
|
|
|
DisplayName: displayName.(string),
|
|
|
|
ClusterId: d.Get("cluster_id").(string),
|
|
|
|
NumNodes: numNodes,
|
|
|
|
InstanceType: instanceType,
|
|
|
|
StorageType: storageType,
|
2017-12-06 22:30:04 +00:00
|
|
|
Zone: zone,
|
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
|
|
|
|
}
|
|
|
|
|
2018-01-03 21:18:40 +00:00
|
|
|
zone, err := getZone(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-11-28 00:32:20 +00:00
|
|
|
d.Set("project", project)
|
2018-01-03 21:18:40 +00:00
|
|
|
d.Set("zone", zone)
|
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
|
|
|
|
}
|