Skip to content

Commit 0f8cd01

Browse files
authored
Merge pull request #6 from benzaita/lx-899-split-og-and-indexing-status
Lx 899 split og and indexing status
2 parents f08f2be + c51afd6 commit 0f8cd01

File tree

10 files changed

+209
-47
lines changed

10 files changed

+209
-47
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ NAMESPACE=benzaita
44
NAME=chaossearch
55
BINARY=terraform-provider-${NAME}
66
VERSION=0.6.0
7-
OS_ARCH=linux_amd64
7+
OS_ARCH=darwin_amd64
88

99
default: install
1010

chaossearch/client/client.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"net/http"
1212
"os"
1313
"time"
14+
"encoding/json"
1415

1516
"github.com/aws/aws-sdk-go/aws/credentials"
1617
v4 "github.com/aws/aws-sdk-go/aws/signer/v4"
@@ -93,9 +94,9 @@ func (client *Client) unmarshalJSONBody(bodyReader io.Reader, v interface{}) err
9394
return fmt.Errorf("Failed to read body: %s", err)
9495
}
9596

96-
if err :=json.Unmarshal(bodyAsBytes, v); err != nil {
97+
if err := json.Unmarshal(bodyAsBytes, v); err != nil {
9798
return fmt.Errorf("Failed to unmarshal JSON: %s", err)
9899
}
99100

100101
return nil
101-
}
102+
}

chaossearch/client/model.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ type ReadObjectGroupResponse struct {
2626
PartitionBy string
2727
SourceBucket string
2828
IndexRetention int
29-
Active bool
3029
}
3130

3231
type CreateObjectGroupRequest struct {
@@ -41,7 +40,7 @@ type CreateObjectGroupRequest struct {
4140
IndexRetention int
4241
}
4342

44-
type SetActiveRequest struct {
43+
type UpdateIndexingStateRequest struct {
4544
ObjectGroupName string
4645
Active bool
4746
}
@@ -54,3 +53,17 @@ type UpdateObjectGroupRequest struct {
5453
Name string
5554
IndexRetention int
5655
}
56+
57+
type ReadIndexingStateRequest struct {
58+
ObjectGroupName string
59+
}
60+
61+
type readBucketMetadataRequest struct {
62+
BucketName string `json:"BucketName"`
63+
Stats bool `json:"Stats"`
64+
}
65+
66+
type IndexingState struct {
67+
ObjectGroupName string
68+
Active bool
69+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package client
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"encoding/json"
7+
"fmt"
8+
"net/http"
9+
)
10+
11+
12+
// There are other nested structures that we don't marshal here because we don't need to.
13+
// Feel free to add them in the future when needed
14+
type readBucketMetadataResponse struct {
15+
Bucket string `json:"Bucket"`
16+
State string `json:"State"`
17+
}
18+
19+
// For documentation see: https://docs.chaossearch.io/reference#bucketmodel
20+
func (client *Client) ReadIndexingState(ctx context.Context, req *ReadIndexingStateRequest) (*IndexingState, error) {
21+
method := "POST"
22+
body := &readBucketMetadataRequest{
23+
BucketName: req.ObjectGroupName,
24+
Stats: false,
25+
}
26+
27+
response, err := makeGetBucketMetadataRequest(method, client, ctx, body)
28+
if err != nil {
29+
return nil, fmt.Errorf("request failed: %s", err)
30+
}
31+
32+
bucketMetadata := &IndexingState{
33+
ObjectGroupName: response.Bucket,
34+
Active: false,
35+
}
36+
37+
if response.State == "Active" || response.State == "Idle" {
38+
bucketMetadata.Active = true
39+
}
40+
41+
return bucketMetadata, nil
42+
}
43+
44+
func makeGetBucketMetadataRequest(method string, client *Client, ctx context.Context, body *readBucketMetadataRequest) (*readBucketMetadataResponse, error) {
45+
url := fmt.Sprintf("%s/Bucket/metadata", client.config.URL)
46+
47+
jsonedBody, err := json.Marshal(body)
48+
if err != nil {
49+
return nil, fmt.Errorf("cannot marshal request body: %s", err)
50+
}
51+
52+
httpReq, err := http.NewRequestWithContext(ctx, method, url, bytes.NewReader(jsonedBody))
53+
if err != nil {
54+
return nil, fmt.Errorf("failed to create request: %s", err)
55+
}
56+
57+
httpResp, err := client.signAndDo(httpReq, jsonedBody)
58+
if err != nil {
59+
return nil, fmt.Errorf("failed to %s to %s: %s", method, url, err)
60+
}
61+
defer httpResp.Body.Close()
62+
63+
64+
var response readBucketMetadataResponse
65+
err = client.unmarshalJSONBody(httpResp.Body, &response)
66+
if err != nil {
67+
return nil, fmt.Errorf("failed to unmarshal response: %s", err)
68+
}
69+
70+
return &response, nil
71+
}

chaossearch/client/operation_read_object_group.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,6 @@ func mapBucketTaggingToResponse(tagging *s3.GetBucketTaggingOutput, v *ReadObjec
105105
return err
106106
}
107107

108-
if err := readJSONTagValue(tagging, "cs3.modeled", &v.Active); err != nil {
109-
return err
110-
}
111-
112108
var filterObject struct {
113109
Type string `json:"_type"`
114110
Pattern string `json:"pattern"`

chaossearch/client/operation_set_active.go renamed to chaossearch/client/operation_update_indexing_state.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import (
88
"net/http"
99
)
1010

11-
func (client *Client) SetActive(ctx context.Context, req *SetActiveRequest) error {
11+
// For documentation see: https://docs.chaossearch.io/reference#bucketmodel
12+
func (client *Client) UpdateIndexingState(ctx context.Context, req *UpdateIndexingStateRequest) error {
1213
method := "POST"
1314
url := fmt.Sprintf("%s/Bucket/model", client.config.URL)
1415

15-
bodyAsBytes, err := marshalSetActiveRequest(req)
16+
bodyAsBytes, err := marshalUpdateIndexingStateRequest(req)
1617
if err != nil {
1718
return err
1819
}
@@ -31,7 +32,7 @@ func (client *Client) SetActive(ctx context.Context, req *SetActiveRequest) erro
3132
return nil
3233
}
3334

34-
func marshalSetActiveRequest(req *SetActiveRequest) ([]byte, error) {
35+
func marshalUpdateIndexingStateRequest(req *UpdateIndexingStateRequest) ([]byte, error) {
3536
var modelMode int
3637

3738
if req.Active {

chaossearch/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func Provider() *schema.Provider {
4141
},
4242
ResourcesMap: map[string]*schema.Resource{
4343
"chaossearch_object_group": resourceObjectGroup(),
44+
"chaossearch_indexing_state": resourceIndexingState(),
4445
},
4546
DataSourcesMap: map[string]*schema.Resource{
4647
"chaossearch_object_groups": dataSourceObjectGroups(),
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package chaossearch
2+
3+
import (
4+
"context"
5+
"terraform-provider-chaossearch/chaossearch/client"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func resourceIndexingState() *schema.Resource {
12+
return &schema.Resource{
13+
CreateContext: resourceIndexingStateCreate,
14+
ReadContext: resourceIndexingStateRead,
15+
UpdateContext: resourceIndexingStateUpdate,
16+
DeleteContext: resourceIndexingStateDelete,
17+
Importer: &schema.ResourceImporter{
18+
StateContext: schema.ImportStatePassthroughContext,
19+
},
20+
Schema: map[string]*schema.Schema{
21+
"object_group_name": {
22+
Type: schema.TypeString,
23+
Required: true,
24+
ForceNew: true,
25+
},
26+
"active": {
27+
Type: schema.TypeBool,
28+
Description: "Whether the live indexing should be running or not",
29+
Required: true,
30+
ForceNew: false,
31+
},
32+
},
33+
}
34+
}
35+
36+
func resourceIndexingStateCreate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
37+
c := meta.(*ProviderMeta).Client
38+
39+
updateIndexingStateRequest := &client.UpdateIndexingStateRequest{
40+
ObjectGroupName: data.Get("object_group_name").(string),
41+
Active: data.Get("active").(bool),
42+
}
43+
44+
if err := c.UpdateIndexingState(ctx, updateIndexingStateRequest); err != nil {
45+
return diag.FromErr(err)
46+
}
47+
48+
data.SetId(data.Get("object_group_name").(string))
49+
50+
return resourceIndexingStateRead(ctx, data, meta)
51+
}
52+
53+
func resourceIndexingStateRead(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
54+
diags := diag.Diagnostics{}
55+
56+
c := meta.(*ProviderMeta).Client
57+
58+
readIndexingStateRequest := &client.ReadIndexingStateRequest{
59+
ObjectGroupName: data.Get("object_group_name").(string),
60+
}
61+
62+
resp, err := c.ReadIndexingState(ctx, readIndexingStateRequest)
63+
if err != nil {
64+
return diag.FromErr(err)
65+
}
66+
67+
data.SetId(resp.ObjectGroupName)
68+
data.Set("active", resp.Active)
69+
70+
return diags
71+
}
72+
73+
func resourceIndexingStateUpdate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
74+
c := meta.(*ProviderMeta).Client
75+
76+
updateIndexingStateRequest := &client.UpdateIndexingStateRequest{
77+
ObjectGroupName: data.Get("object_group_name").(string),
78+
Active: data.Get("active").(bool),
79+
}
80+
if err := c.UpdateIndexingState(ctx, updateIndexingStateRequest); err != nil {
81+
return diag.FromErr(err)
82+
}
83+
84+
return resourceIndexingStateRead(ctx, data, meta)
85+
}
86+
87+
func resourceIndexingStateDelete(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
88+
c := meta.(*ProviderMeta).Client
89+
90+
stopIndexingRequest := &client.UpdateIndexingStateRequest{
91+
ObjectGroupName: data.Get("object_group_name").(string),
92+
Active: false,
93+
}
94+
if err := c.UpdateIndexingState(ctx, stopIndexingRequest); err != nil {
95+
return diag.FromErr(err)
96+
}
97+
98+
data.SetId("")
99+
100+
return nil
101+
}

chaossearch/resource_object_group.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,6 @@ func resourceObjectGroup() *schema.Resource {
7777
Optional: true,
7878
ForceNew: false,
7979
},
80-
"active": {
81-
Type: schema.TypeBool,
82-
Description: "Whether the live indexing should be running or not",
83-
Required: true,
84-
ForceNew: false,
85-
},
8680

8781
// Workaround. Otherwise Terraform fails with "All fields are ForceNew or Computed w/out Optional, Update is superfluous"
8882
"description": {
@@ -113,15 +107,6 @@ func resourceObjectGroupCreate(ctx context.Context, data *schema.ResourceData, m
113107
return diag.FromErr(err)
114108
}
115109

116-
setActiveRequest := &client.SetActiveRequest{
117-
ObjectGroupName: data.Get("name").(string),
118-
Active: data.Get("active").(bool),
119-
}
120-
121-
if err := c.SetActive(ctx, setActiveRequest); err != nil {
122-
return diag.FromErr(err)
123-
}
124-
125110
data.SetId(data.Get("name").(string))
126111

127112
return resourceObjectGroupRead(ctx, data, meta)
@@ -145,7 +130,6 @@ func resourceObjectGroupRead(ctx context.Context, data *schema.ResourceData, met
145130
data.Set("format", resp.Format)
146131
data.Set("live_events_sqs_arn", resp.LiveEventsSqsArn)
147132
data.Set("index_retention", resp.IndexRetention)
148-
data.Set("active", resp.Active)
149133

150134
// When the object in an Object Group use no compression, you need to create it with
151135
// `compression = ""`. However, when querying an Object Group whose object are not
@@ -167,14 +151,6 @@ func resourceObjectGroupRead(ctx context.Context, data *schema.ResourceData, met
167151
func resourceObjectGroupUpdate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
168152
c := meta.(*ProviderMeta).Client
169153

170-
setActiveRequest := &client.SetActiveRequest{
171-
ObjectGroupName: data.Get("name").(string),
172-
Active: data.Get("active").(bool),
173-
}
174-
if err := c.SetActive(ctx, setActiveRequest); err != nil {
175-
return diag.FromErr(err)
176-
}
177-
178154
updateObjectGroupRequest := &client.UpdateObjectGroupRequest{
179155
Name: data.Get("name").(string),
180156
IndexRetention: data.Get("index_retention").(int),
@@ -190,14 +166,6 @@ func resourceObjectGroupUpdate(ctx context.Context, data *schema.ResourceData, m
190166
func resourceObjectGroupDelete(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
191167
c := meta.(*ProviderMeta).Client
192168

193-
stopIndexingRequest := &client.SetActiveRequest{
194-
ObjectGroupName: data.Get("name").(string),
195-
Active: false,
196-
}
197-
if err := c.SetActive(ctx, stopIndexingRequest); err != nil {
198-
return diag.FromErr(err)
199-
}
200-
201169
deleteObjectGroupRequest := &client.DeleteObjectGroupRequest{
202170
Name: data.Get("name").(string),
203171
}

examples/main.tf

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
terraform {
22
required_providers {
33
chaossearch = {
4-
versions = ["0.2"]
4+
versions = ["0.6.0"]
55
source = "benzaita/chaossearch"
66
}
77
}
88
}
99

10-
provider "chaossearch" {}
10+
provider "chaossearch" {
11+
url = "http://example.com"
12+
access_key_id = "chaossearch_access_key_id"
13+
secret_access_key = "chaossearch_secret_access_key"
14+
region = "eu-west-1"
15+
}
1116

1217
resource "chaossearch_object_group" "my-object-group" {
1318
name = "my-object-group"
1419
source_bucket = "<s3 bucket name>"
15-
live_events_sqs_arn ="<sqs arn>"
20+
live_events_sqs_arn ="arn:aws:sqs:sqs_sqs"
1621

1722
filter_json = jsonencode({
1823
AND = [
@@ -28,3 +33,8 @@ resource "chaossearch_object_group" "my-object-group" {
2833

2934
partition_by = "<regex>"
3035
}
36+
37+
resource "chaossearch_indexing_state" "my-object-group" {
38+
object_group_name = chaossearch_object_group.my-object-group.name
39+
active = true
40+
}

0 commit comments

Comments
 (0)