Skip to content

Commit

Permalink
add support for setting the auto-scaling policy (#92)
Browse files Browse the repository at this point in the history
  • Loading branch information
pmenglund authored Feb 8, 2024
1 parent 4b1b86c commit 8e64714
Show file tree
Hide file tree
Showing 11 changed files with 381 additions and 81 deletions.
6 changes: 6 additions & 0 deletions docs/data-sources/virtual_instance.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ description: |-



## Example Usage

```terraform
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}
```

<!-- schema generated by tfplugindocs -->
## Schema
Expand Down
43 changes: 43 additions & 0 deletions docs/resources/autoscaling_policy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "rockset_autoscaling_policy Resource - terraform-provider-rockset"
subcategory: ""
description: |-
Manages the auto-scaling policy for the main Virtual Instance.
The instance must be a dedicated (size XSMALL or larger) instance to set the policy.
---

# rockset_autoscaling_policy (Resource)

Manages the auto-scaling policy for the **main** Virtual Instance.

The instance must be a dedicated (size `XSMALL` or larger) instance to set the policy.

## Example Usage

```terraform
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}
resource "rockset_autoscaling_policy" "main" {
virtual_instance_id = data.rockset_virtual_instance.main.id
enabled = true
min_size = "MEDIUM"
max_size = "XLARGE2"
}
```

<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `enabled` (Boolean) Is auto-scaling enabled for this Virtual Instance.
- `max_size` (String) Maximum size of the Virtual Instance.
- `min_size` (String) Minimum size of the Virtual Instance.
- `virtual_instance_id` (String) Unique ID of this Virtual Instance.

### Read-Only

- `id` (String) The ID of this resource.
3 changes: 3 additions & 0 deletions examples/data-sources/rockset_virtual_instance/data-source.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}
10 changes: 10 additions & 0 deletions examples/resources/rockset_autoscaling_policy/resource.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}

resource "rockset_autoscaling_policy" "main" {
virtual_instance_id = data.rockset_virtual_instance.main.id
enabled = true
min_size = "MEDIUM"
max_size = "XLARGE2"
}
21 changes: 11 additions & 10 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ require (
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320
github.com/hashicorp/terraform-plugin-log v0.7.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.1
github.com/rockset/rockset-go-client v0.22.3
github.com/rs/zerolog v1.31.0
github.com/rockset/rockset-go-client v0.23.0
github.com/rs/zerolog v1.32.0
github.com/stretchr/testify v1.8.4
)

Expand All @@ -17,7 +17,7 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-checkpoint v0.5.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
Expand All @@ -36,25 +36,26 @@ require (
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/maxbrunsfeld/counterfeiter/v6 v6.7.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/maxbrunsfeld/counterfeiter/v6 v6.8.1 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/oklog/run v1.0.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
github.com/vmihailenco/tagparser v0.1.1 // indirect
github.com/zclconf/go-cty v1.12.1 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/crypto v0.18.0 // indirect
golang.org/x/mod v0.15.0 // indirect
golang.org/x/net v0.20.0 // indirect
golang.org/x/sys v0.16.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.14.0 // indirect
golang.org/x/tools v0.17.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.56.3 // indirect
Expand Down
133 changes: 62 additions & 71 deletions go.sum

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions rockset/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func Provider() *schema.Provider {
ResourcesMap: map[string]*schema.Resource{
"rockset_alias": resourceAlias(),
"rockset_api_key": resourceApiKey(),
"rockset_autoscaling_policy": resourceAutoScalingPolicy(),
"rockset_collection": resourceCollection(),
"rockset_collection_mount": resourceCollectionMount(),
"rockset_dynamodb_collection": resourceDynamoDBCollection(),
Expand Down
191 changes: 191 additions & 0 deletions rockset/resource_auto_scaling_policy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
package rockset

import (
"context"
"strings"

"github.com/hashicorp/go-cty/cty"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/rockset/rockset-go-client"
"github.com/rockset/rockset-go-client/openapi"
"github.com/rockset/rockset-go-client/option"
)

func resourceAutoScalingPolicy() *schema.Resource {
return &schema.Resource{
Description: "Manages the auto-scaling policy for the **main** Virtual Instance.\n\n" +
"The instance must be a dedicated (size `XSMALL` or larger) instance to set the policy.",

CreateContext: resourceAutoScalingPolicyCreate,
ReadContext: resourceAutoScalingPolicyRead,
UpdateContext: resourceAutoScalingPolicyUpdate,
DeleteContext: resourceAutoScalingPolicyDelete,

Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},

Schema: map[string]*schema.Schema{
"virtual_instance_id": {
Description: "Unique ID of this Virtual Instance.",
Type: schema.TypeString,
Required: true,
},
"enabled": {
Description: "Is auto-scaling enabled for this Virtual Instance.",
Type: schema.TypeBool,
Required: true,
},
"min_size": {
Description: "Minimum size of the Virtual Instance.",
Type: schema.TypeString,
Required: true,
ValidateDiagFunc: func(i interface{}, path cty.Path) diag.Diagnostics {
return validateVirtualInstanceSize("min_size", i.(string))
},
},
"max_size": {
Description: "Maximum size of the Virtual Instance.",
Type: schema.TypeString,
Required: true,
ValidateDiagFunc: func(i interface{}, path cty.Path) diag.Diagnostics {
return validateVirtualInstanceSize("max_size", i.(string))
},
},
},
}
}

// TODO move into the go client instead
var virtualInstanceSizes = []option.VirtualInstanceSize{
option.SizeXSmall,
option.SizeSmall,
option.SizeMedium,
option.SizeLarge,
option.SizeXLarge,
option.SizeXLarge2,
option.SizeXLarge4,
option.SizeXLarge8,
option.SizeXLarge16,
}

func validateVirtualInstanceSize(field, size string) diag.Diagnostics {
for _, s := range virtualInstanceSizes {
if s.String() == size {
return nil
}
}
sizes := make([]string, len(virtualInstanceSizes))
for i, s := range virtualInstanceSizes {
sizes[i] = s.String()
}

return diag.Errorf("size must be one of: %s", strings.Join(sizes, ", "))
}

func resourceAutoScalingPolicyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
rc := meta.(*rockset.RockClient)
id := d.Get("virtual_instance_id").(string)
d.SetId(id)

tflog.Trace(ctx, "creating auto-scaling policy")
return updateAutoScalingPolicy(ctx, rc, id, d)
}

func resourceAutoScalingPolicyUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
rc := meta.(*rockset.RockClient)
id := d.Get("virtual_instance_id").(string)

tflog.Trace(ctx, "updating auto-scaling policy")
return updateAutoScalingPolicy(ctx, rc, id, d)
}

func updateAutoScalingPolicy(ctx context.Context, rc *rockset.RockClient, id string, d *schema.ResourceData) diag.Diagnostics {
var policy openapi.AutoScalingPolicy
enabled := d.Get("enabled").(bool)
minSize := d.Get("min_size").(string)
maxSize := d.Get("max_size").(string)

policy.Enabled = &enabled
policy.MinSize = &minSize
policy.MaxSize = &maxSize

tflog.Trace(ctx, "updating auto-scaling policy", map[string]interface{}{
"virtual_instance_id": id,
"enabled": enabled,
"min_size": minSize,
"max_size": maxSize,
})
vi, err := rc.UpdateVirtualInstance(ctx, id, option.WithVirtualInstanceAutoScalingPolicy(policy))
if err != nil {
return DiagFromErr(err)
}

policy = vi.GetAutoScalingPolicy()
tflog.Info(ctx, "updated auto-scaling policy", map[string]interface{}{
"virtual_instance_id": id,
"enabled": policy.GetEnabled(),
"min_size": policy.GetMinSize(),
"max_size": policy.GetMaxSize(),
})

return nil
}

func resourceAutoScalingPolicyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
rc := meta.(*rockset.RockClient)
var diags diag.Diagnostics

id := d.Id()

vi, err := rc.GetVirtualInstance(ctx, id)
if err != nil {
return DiagFromErr(err)
}

policy := vi.GetAutoScalingPolicy()
if err = d.Set("enabled", policy.GetEnabled()); err != nil {
return DiagFromErr(err)
}
if err = d.Set("min_size", policy.GetMinSize()); err != nil {
return DiagFromErr(err)
}
if err = d.Set("max_size", policy.GetMaxSize()); err != nil {
return DiagFromErr(err)
}

tflog.Info(ctx, "read auto-scaling policy", map[string]interface{}{
"virtual_instance_id": id,
"enabled": policy.GetEnabled(),
"min_size": policy.GetMinSize(),
"max_size": policy.GetMaxSize(),
})

return diags
}

func resourceAutoScalingPolicyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
rc := meta.(*rockset.RockClient)
var diags diag.Diagnostics

id := d.Id()

vi, err := rc.GetVirtualInstance(ctx, id)
if err != nil {
return DiagFromErr(err)
}
policy := vi.GetAutoScalingPolicy()
policy.Enabled = openapi.PtrBool(false)

_, err = rc.UpdateVirtualInstance(ctx, id, option.WithVirtualInstanceAutoScalingPolicy(policy))
if err != nil {
return DiagFromErr(err)
}

d.SetId("")
tflog.Info(ctx, "deleted auto-scaling policy", map[string]interface{}{"virtual_instance_id": id})

return diags
}
34 changes: 34 additions & 0 deletions rockset/resource_auto_scaling_policy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package rockset

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccAutoScalingPolicy_Basic(t *testing.T) {
vi := "rockset_autoscaling_policy.main"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: testAccProviderFactories,
Steps: []resource.TestStep{
{
Config: getHCL("autoscaling_policy_enable.tf"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(vi, "id"),
resource.TestCheckResourceAttr(vi, "enabled", "true"),
resource.TestCheckResourceAttr(vi, "min_size", "XSMALL"),
resource.TestCheckResourceAttr(vi, "max_size", "MEDIUM"),
),
},
{
Config: getHCL("autoscaling_policy_disable.tf"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(vi, "id"),
resource.TestCheckResourceAttr(vi, "enabled", "false"),
),
},
},
})
}
10 changes: 10 additions & 0 deletions testdata/autoscaling_policy_disable.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}

resource "rockset_autoscaling_policy" "main" {
virtual_instance_id = data.rockset_virtual_instance.main.id
enabled = false
min_size = "XSMALL"
max_size = "MEDIUM"
}
10 changes: 10 additions & 0 deletions testdata/autoscaling_policy_enable.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
data "rockset_virtual_instance" "main" {
id = "29e4a43c-fff4-4fe6-80e3-1ee57bc22e82"
}

resource "rockset_autoscaling_policy" "main" {
virtual_instance_id = data.rockset_virtual_instance.main.id
enabled = true
min_size = "XSMALL"
max_size = "MEDIUM"
}

0 comments on commit 8e64714

Please sign in to comment.