Skip to content

Commit de26951

Browse files
committed
support for Update
1 parent 7840c93 commit de26951

File tree

4 files changed

+279
-28
lines changed

4 files changed

+279
-28
lines changed

internal/clients/elasticsearch/index.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,38 @@ func GetTransform(ctx context.Context, apiClient *clients.ApiClient, name *strin
612612
return nil, diags
613613
}
614614

615+
func UpdateTransform(ctx context.Context, apiClient *clients.ApiClient, transform *models.Transform, params *models.UpdateTransformParams) diag.Diagnostics {
616+
fmt.Println("entering UpdateTransform")
617+
var diags diag.Diagnostics
618+
pipelineBytes, err := json.Marshal(transform)
619+
if err != nil {
620+
return diag.FromErr(err)
621+
}
622+
623+
esClient, err := apiClient.GetESClient()
624+
if err != nil {
625+
return diag.FromErr(err)
626+
}
627+
628+
opts := []func(*esapi.TransformUpdateTransformRequest){
629+
esClient.TransformUpdateTransform.WithContext(ctx),
630+
esClient.TransformUpdateTransform.WithDeferValidation(params.DeferValidation),
631+
esClient.TransformUpdateTransform.WithTimeout(params.Timeout),
632+
}
633+
634+
res, err := esClient.TransformUpdateTransform(bytes.NewReader(pipelineBytes), transform.Name, opts...)
635+
if err != nil {
636+
return diag.FromErr(err)
637+
}
638+
639+
defer res.Body.Close()
640+
if diags := utils.CheckError(res, fmt.Sprintf("Unable to update transform: %s", transform.Name)); diags.HasError() {
641+
return diags
642+
}
643+
644+
return diags
645+
}
646+
615647
func DeleteTransform(ctx context.Context, apiClient *clients.ApiClient, name string) diag.Diagnostics {
616648
fmt.Println("entering DeleteTransform for ", name)
617649
var diags diag.Diagnostics

internal/elasticsearch/transform/transform.go

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -222,41 +222,63 @@ func resourceTransformRead(ctx context.Context, d *schema.ResourceData, meta int
222222
return diags
223223
}
224224

225-
func resourceTransformDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
226-
fmt.Println("entering resourceTransformDelete")
225+
func resourceTransformUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
226+
fmt.Println("entering resourceTransformUpdate")
227+
227228
client, diags := clients.NewApiClient(d, meta)
228229
if diags.HasError() {
229230
return diags
230231
}
231232

232-
id := d.Id()
233-
compId, diags := clients.CompositeIdFromStr(id)
233+
transformName := d.Get("name").(string)
234+
_, diags = client.ID(ctx, transformName)
234235
if diags.HasError() {
235236
return diags
236237
}
237238

238-
if diags := elasticsearch.DeleteTransform(ctx, client, compId.ResourceId); diags.HasError() {
239+
updatedTransform, err := getTransformFromResourceData(ctx, d, transformName)
240+
if err != nil {
241+
return diag.FromErr(err)
242+
}
243+
244+
updatedTransform.Pivot = nil
245+
updatedTransform.Latest = nil
246+
247+
params := models.UpdateTransformParams{
248+
DeferValidation: d.Get("defer_validation").(bool),
249+
}
250+
251+
timeout, err := time.ParseDuration(d.Get("timeout").(string))
252+
if err != nil {
253+
return diag.FromErr(err)
254+
}
255+
params.Timeout = timeout
256+
257+
if diags := elasticsearch.UpdateTransform(ctx, client, updatedTransform, &params); diags.HasError() {
239258
return diags
240259
}
241260

242-
return diags
261+
return resourceTransformRead(ctx, d, meta)
243262
}
244263

245-
func resourceTransformUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
246-
fmt.Println("entering resourceTransformUpdate")
247-
// TODO
264+
func resourceTransformDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
265+
fmt.Println("entering resourceTransformDelete")
248266
client, diags := clients.NewApiClient(d, meta)
249267
if diags.HasError() {
250268
return diags
251269
}
252270

253-
transformName := d.Get("name").(string)
254-
_, diags = client.ID(ctx, transformName)
271+
id := d.Id()
272+
compId, diags := clients.CompositeIdFromStr(id)
255273
if diags.HasError() {
256274
return diags
257275
}
258276

259-
return resourceTransformRead(ctx, d, meta)
277+
if diags := elasticsearch.DeleteTransform(ctx, client, compId.ResourceId); diags.HasError() {
278+
return diags
279+
}
280+
281+
return diags
260282
}
261283

262284
func getTransformFromResourceData(ctx context.Context, d *schema.ResourceData, name string) (*models.Transform, error) {

internal/elasticsearch/transform/transform_test.go

Lines changed: 208 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,91 @@ import (
1414
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1515
)
1616

17-
func TestAccResourceTransform(t *testing.T) {
18-
transformName := sdkacctest.RandStringFromCharSet(18, sdkacctest.CharSetAlphaNum)
17+
func TestAccResourceTransformWithPivot(t *testing.T) {
18+
19+
transformNamePivot := sdkacctest.RandStringFromCharSet(18, sdkacctest.CharSetAlphaNum)
20+
resource.Test(t, resource.TestCase{
21+
PreCheck: func() { acctest.PreCheck(t) },
22+
CheckDestroy: checkResourceTransformDestroy,
23+
ProtoV5ProviderFactories: acctest.Providers,
24+
Steps: []resource.TestStep{
25+
{
26+
Config: testAccResourceTransformWithPivotCreate(transformNamePivot),
27+
Check: resource.ComposeTestCheckFunc(
28+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "name", transformNamePivot),
29+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "description", "test description"),
30+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "source.0.indices.0", "source_index_for_transform"),
31+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "destination.0.index", "dest_index_for_transform"),
32+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "frequency", "5m"),
33+
),
34+
},
35+
{
36+
Config: testAccResourceTransformWithPivotUpdate(transformNamePivot),
37+
Check: resource.ComposeTestCheckFunc(
38+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "name", transformNamePivot),
39+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "description", "yet another test description"),
40+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "source.0.indices.0", "source_index_for_transform"),
41+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "source.0.indices.1", "additional_index"),
42+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "destination.0.index", "dest_index_for_transform_v2"),
43+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "frequency", "10m"),
44+
),
45+
},
46+
},
47+
})
48+
}
1949

50+
func TestAccResourceTransformWithLatest(t *testing.T) {
51+
52+
transformNameLatest := sdkacctest.RandStringFromCharSet(20, sdkacctest.CharSetAlphaNum)
53+
resource.Test(t, resource.TestCase{
54+
PreCheck: func() { acctest.PreCheck(t) },
55+
CheckDestroy: checkResourceTransformDestroy,
56+
ProtoV5ProviderFactories: acctest.Providers,
57+
Steps: []resource.TestStep{
58+
{
59+
Config: testAccResourceTransformWithLatestCreate(transformNameLatest),
60+
Check: resource.ComposeTestCheckFunc(
61+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_latest", "name", transformNameLatest),
62+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_latest", "description", "test description (latest)"),
63+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_latest", "source.0.indices.0", "source_index_for_transform"),
64+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_latest", "destination.0.index", "dest_index_for_transform"),
65+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_latest", "frequency", "2m"),
66+
),
67+
},
68+
},
69+
})
70+
}
71+
72+
func TestAccResourceTransformNoDefer(t *testing.T) {
73+
74+
transformName := sdkacctest.RandStringFromCharSet(18, sdkacctest.CharSetAlphaNum)
75+
indexName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum)
2076
resource.Test(t, resource.TestCase{
2177
PreCheck: func() { acctest.PreCheck(t) },
2278
CheckDestroy: checkResourceTransformDestroy,
2379
ProtoV5ProviderFactories: acctest.Providers,
2480
Steps: []resource.TestStep{
2581
{
26-
Config: testAccResourceTransformCreate(transformName),
82+
Config: testAccResourceTransformNoDeferCreate(transformName, indexName),
2783
Check: resource.ComposeTestCheckFunc(
28-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "name", transformName),
29-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "description", "test description"),
30-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "source.0.indices.0", "source_index_for_transform"),
31-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "destination.0.index", "dest_index_for_transform"),
32-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "frequency", "5m"),
33-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "pivot.#", "1"),
34-
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test", "latest.#", "0"),
84+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "name", transformName),
85+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "description", "test description"),
86+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "source.0.indices.0", indexName),
87+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "destination.0.index", "dest_index_for_transform"),
88+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_transform.test_pivot", "frequency", "5m"),
3589
),
3690
},
37-
// {
38-
// Config: testAccResourceTransformUpdate(transformName),
39-
// Check: resource.ComposeTestCheckFunc(),
40-
// },
4191
},
4292
})
4393
}
4494

45-
func testAccResourceTransformCreate(name string) string {
95+
func testAccResourceTransformWithPivotCreate(name string) string {
4696
return fmt.Sprintf(`
4797
provider "elasticstack" {
4898
elasticsearch {}
4999
}
50100
51-
resource "elasticstack_elasticsearch_transform" "test" {
101+
resource "elasticstack_elasticsearch_transform" "test_pivot" {
52102
name = "%s"
53103
description = "test description"
54104
@@ -85,6 +135,148 @@ resource "elasticstack_elasticsearch_transform" "test" {
85135
`, name)
86136
}
87137

138+
func testAccResourceTransformWithPivotUpdate(name string) string {
139+
return fmt.Sprintf(`
140+
provider "elasticstack" {
141+
elasticsearch {}
142+
}
143+
144+
resource "elasticstack_elasticsearch_transform" "test_pivot" {
145+
name = "%s"
146+
description = "yet another test description"
147+
148+
source {
149+
indices = ["source_index_for_transform", "additional_index"]
150+
}
151+
152+
destination {
153+
index = "dest_index_for_transform_v2"
154+
}
155+
156+
pivot = jsonencode({
157+
"group_by": {
158+
"customer_id": {
159+
"terms": {
160+
"field": "customer_id",
161+
"missing_bucket": true
162+
}
163+
}
164+
},
165+
"aggregations": {
166+
"max_price": {
167+
"max": {
168+
"field": "taxful_total_price"
169+
}
170+
}
171+
}
172+
})
173+
frequency = "10m"
174+
175+
defer_validation = true
176+
timeout = "1m"
177+
}
178+
`, name)
179+
}
180+
181+
func testAccResourceTransformWithLatestCreate(name string) string {
182+
return fmt.Sprintf(`
183+
provider "elasticstack" {
184+
elasticsearch {}
185+
}
186+
187+
resource "elasticstack_elasticsearch_transform" "test_latest" {
188+
name = "%s"
189+
description = "test description (latest)"
190+
191+
source {
192+
indices = ["source_index_for_transform"]
193+
}
194+
195+
destination {
196+
index = "dest_index_for_transform"
197+
}
198+
199+
latest = jsonencode({
200+
"unique_key": ["customer_id"],
201+
"sort": "order_date"
202+
})
203+
frequency = "2m"
204+
205+
defer_validation = true
206+
timeout = "1m"
207+
}
208+
`, name)
209+
}
210+
211+
func testAccResourceTransformNoDeferCreate(transformName, indexName string) string {
212+
return fmt.Sprintf(`
213+
provider "elasticstack" {
214+
elasticsearch {}
215+
}
216+
217+
resource "elasticstack_elasticsearch_index" "test_index" {
218+
name = "%s"
219+
220+
alias {
221+
name = "test_alias_1"
222+
}
223+
224+
mappings = jsonencode({
225+
properties = {
226+
field1 = { type = "text" }
227+
}
228+
})
229+
230+
settings {
231+
setting {
232+
name = "index.number_of_replicas"
233+
value = "2"
234+
}
235+
}
236+
237+
deletion_protection = false
238+
wait_for_active_shards = "all"
239+
master_timeout = "1m"
240+
timeout = "1m"
241+
}
242+
243+
resource "elasticstack_elasticsearch_transform" "test_pivot" {
244+
name = "%s"
245+
description = "test description"
246+
247+
source {
248+
indices = [elasticstack_elasticsearch_index.test_index.name]
249+
}
250+
251+
destination {
252+
index = "dest_index_for_transform"
253+
}
254+
255+
pivot = jsonencode({
256+
"group_by": {
257+
"customer_id": {
258+
"terms": {
259+
"field": "customer_id",
260+
"missing_bucket": true
261+
}
262+
}
263+
},
264+
"aggregations": {
265+
"max_price": {
266+
"max": {
267+
"field": "taxful_total_price"
268+
}
269+
}
270+
}
271+
})
272+
frequency = "5m"
273+
274+
defer_validation = false
275+
timeout = "1m"
276+
}
277+
`, indexName, transformName)
278+
}
279+
88280
func checkResourceTransformDestroy(s *terraform.State) error {
89281
client, err := clients.NewAcceptanceTestingClient()
90282
if err != nil {

internal/models/transform.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ type PutTransformParams struct {
3333
Timeout time.Duration
3434
}
3535

36+
type UpdateTransformParams struct {
37+
DeferValidation bool
38+
Timeout time.Duration
39+
}
40+
3641
type GetTransformResponse struct {
3742
Count json.Number `json:"count,omitempty"`
3843
Transforms []Transform `json:"transforms"`

0 commit comments

Comments
 (0)