Skip to content

Commit 9b64020

Browse files
committed
Make default data view API space aware
1 parent 8862467 commit 9b64020

File tree

11 files changed

+852
-381
lines changed

11 files changed

+852
-381
lines changed

docs/resources/kibana_default_data_view.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ resource "elasticstack_kibana_default_data_view" "default" {
4545

4646
- `force` (Boolean) Update an existing default data view identifier. If set to false and a default data view already exists, the operation will fail.
4747
- `skip_delete` (Boolean) If set to true, the default data view will not be unset when the resource is destroyed. The existing default data view will remain unchanged.
48+
- `space_id` (String) The Kibana space ID to set the default data view in. Defaults to `default`.
4849

4950
### Read-Only
5051

generated/kbapi/kibana.gen.go

Lines changed: 731 additions & 310 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

generated/kbapi/transform_schema.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ func transformKibanaPaths(schema *Schema) {
690690
"/api/maintenance_window/{id}",
691691
"/api/actions/connector/{id}",
692692
"/api/actions/connectors",
693+
"/api/data_views/default",
693694
}
694695

695696
// Add a spaceId parameter if not already present

internal/clients/kibana_oapi/data_views.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ func DeleteDataView(ctx context.Context, client *Client, spaceID string, viewID
8989
}
9090

9191
// GetDefaultDataView reads the default data view from the API.
92-
func GetDefaultDataView(ctx context.Context, client *Client) (*string, diag.Diagnostics) {
93-
resp, err := client.API.GetDefaultDataViewDefaultWithResponse(ctx)
92+
func GetDefaultDataView(ctx context.Context, client *Client, spaceID string) (*string, diag.Diagnostics) {
93+
resp, err := client.API.GetDefaultDataViewDefaultWithResponse(ctx, spaceID)
9494
if err != nil {
9595
return nil, diagutil.FrameworkDiagFromError(err)
9696
}
@@ -107,8 +107,8 @@ func GetDefaultDataView(ctx context.Context, client *Client) (*string, diag.Diag
107107
}
108108

109109
// SetDefaultDataView sets the default data view.
110-
func SetDefaultDataView(ctx context.Context, client *Client, req kbapi.SetDefaultDatailViewDefaultJSONRequestBody) diag.Diagnostics {
111-
resp, err := client.API.SetDefaultDatailViewDefaultWithResponse(ctx, req)
110+
func SetDefaultDataView(ctx context.Context, client *Client, spaceID string, req kbapi.SetDefaultDatailViewDefaultJSONRequestBody) diag.Diagnostics {
111+
resp, err := client.API.SetDefaultDatailViewDefaultWithResponse(ctx, spaceID, req)
112112
if err != nil {
113113
return diagutil.FrameworkDiagFromError(err)
114114
}

internal/kibana/default_data_view/acc_test.go

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ func TestAccResourceDefaultDataView(t *testing.T) {
2525
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minDataViewAPISupport),
2626
Config: testAccResourceDefaultDataViewBasic(indexName1),
2727
Check: resource.ComposeTestCheckFunc(
28-
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "id"),
28+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "id", "default"),
2929
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "data_view_id"),
3030
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "force", "true"),
3131
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "skip_delete", "false"),
32+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "space_id", "default"),
3233
),
3334
},
3435
{
3536
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minDataViewAPISupport),
3637
Config: testAccResourceDefaultDataViewUpdate(indexName1, indexName2),
3738
Check: resource.ComposeTestCheckFunc(
38-
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "id"),
39+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "id", "default"),
3940
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "data_view_id"),
41+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "space_id", "default"),
4042
),
4143
},
4244
},
@@ -54,8 +56,32 @@ func TestAccResourceDefaultDataViewWithSkipDelete(t *testing.T) {
5456
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minDataViewAPISupport),
5557
Config: testAccResourceDefaultDataViewWithSkipDelete(indexName),
5658
Check: resource.ComposeTestCheckFunc(
57-
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "id"),
59+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "id", "default"),
5860
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "skip_delete", "true"),
61+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "space_id", "default"),
62+
),
63+
},
64+
},
65+
})
66+
}
67+
68+
func TestAccResourceDefaultDataViewWithCustomSpace(t *testing.T) {
69+
indexName := "my-index-" + sdkacctest.RandStringFromCharSet(4, sdkacctest.CharSetAlphaNum)
70+
spaceID := "test-space-" + sdkacctest.RandStringFromCharSet(6, sdkacctest.CharSetAlphaNum)
71+
72+
resource.Test(t, resource.TestCase{
73+
PreCheck: func() { acctest.PreCheck(t) },
74+
ProtoV6ProviderFactories: acctest.Providers,
75+
Steps: []resource.TestStep{
76+
{
77+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minDataViewAPISupport),
78+
Config: testAccResourceDefaultDataViewWithCustomSpace(indexName, spaceID),
79+
Check: resource.ComposeTestCheckFunc(
80+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "id", spaceID),
81+
resource.TestCheckResourceAttrSet("elasticstack_kibana_default_data_view.test", "data_view_id"),
82+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "force", "true"),
83+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "skip_delete", "false"),
84+
resource.TestCheckResourceAttr("elasticstack_kibana_default_data_view.test", "space_id", spaceID),
5985
),
6086
},
6187
},
@@ -152,3 +178,37 @@ resource "elasticstack_kibana_default_data_view" "test" {
152178
}
153179
`, indexName, indexName)
154180
}
181+
182+
func testAccResourceDefaultDataViewWithCustomSpace(indexName, spaceID string) string {
183+
return fmt.Sprintf(`
184+
provider "elasticstack" {
185+
elasticsearch {}
186+
kibana {}
187+
}
188+
189+
resource "elasticstack_kibana_space" "test_space" {
190+
space_id = "%s"
191+
name = "Test Space %s"
192+
description = "Test space for default data view"
193+
}
194+
195+
resource "elasticstack_elasticsearch_index" "my_index" {
196+
name = "%s"
197+
deletion_protection = false
198+
}
199+
200+
resource "elasticstack_kibana_data_view" "dv" {
201+
space_id = elasticstack_kibana_space.test_space.space_id
202+
data_view = {
203+
title = "%s*"
204+
}
205+
depends_on = [elasticstack_elasticsearch_index.my_index]
206+
}
207+
208+
resource "elasticstack_kibana_default_data_view" "test" {
209+
space_id = elasticstack_kibana_space.test_space.space_id
210+
data_view_id = elasticstack_kibana_data_view.dv.data_view.id
211+
force = true
212+
}
213+
`, spaceID, spaceID, indexName, indexName)
214+
}

internal/kibana/default_data_view/create.go

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,47 @@ import (
55

66
"github.com/elastic/terraform-provider-elasticstack/generated/kbapi"
77
"github.com/elastic/terraform-provider-elasticstack/internal/clients/kibana_oapi"
8+
"github.com/hashicorp/terraform-plugin-framework/diag"
89
"github.com/hashicorp/terraform-plugin-framework/resource"
10+
"github.com/hashicorp/terraform-plugin-framework/tfsdk"
911
"github.com/hashicorp/terraform-plugin-framework/types"
1012
)
1113

1214
func (r *DefaultDataViewResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
13-
var plan defaultDataViewModel
14-
diags := req.Plan.Get(ctx, &plan)
15-
resp.Diagnostics.Append(diags...)
16-
if resp.Diagnostics.HasError() {
17-
return
15+
resp.Diagnostics.Append(r.setDefaultDataView(ctx, req.Plan, &resp.State)...)
16+
}
17+
18+
// setDefaultDataView is a helper method that contains the core logic for setting the default data view.
19+
func (r *DefaultDataViewResource) setDefaultDataView(ctx context.Context, plan tfsdk.Plan, state *tfsdk.State) diag.Diagnostics {
20+
var model defaultDataViewModel
21+
diags := plan.Get(ctx, &model)
22+
if diags.HasError() {
23+
return diags
1824
}
1925

2026
client, err := r.client.GetKibanaOapiClient()
2127
if err != nil {
22-
resp.Diagnostics.AddError("unable to get kibana client", err.Error())
23-
return
28+
diags.AddError("unable to get kibana client", err.Error())
29+
return diags
2430
}
2531

26-
dataViewID := plan.DataViewID.ValueString()
27-
force := plan.Force.ValueBool()
28-
32+
dataViewID := model.DataViewID.ValueString()
33+
force := model.Force.ValueBool()
34+
spaceID := model.SpaceID.ValueString()
2935
setReq := kbapi.SetDefaultDatailViewDefaultJSONRequestBody{
3036
DataViewId: &dataViewID,
3137
Force: &force,
3238
}
3339

34-
diags = kibana_oapi.SetDefaultDataView(ctx, client, setReq)
35-
resp.Diagnostics.Append(diags...)
36-
if resp.Diagnostics.HasError() {
37-
return
40+
apiDiags := kibana_oapi.SetDefaultDataView(ctx, client, spaceID, setReq)
41+
diags.Append(apiDiags...)
42+
if diags.HasError() {
43+
return diags
3844
}
3945

40-
// Set a static ID since there's only one default data view setting
41-
plan.ID = types.StringValue("default")
46+
// Use the space_id as the resource ID
47+
model.ID = types.StringValue(spaceID)
4248

43-
diags = resp.State.Set(ctx, plan)
44-
resp.Diagnostics.Append(diags...)
49+
diags = state.Set(ctx, model)
50+
return diags
4551
}

internal/kibana/default_data_view/delete.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/elastic/terraform-provider-elasticstack/generated/kbapi"
77
"github.com/elastic/terraform-provider-elasticstack/internal/clients/kibana_oapi"
8+
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
89
"github.com/hashicorp/terraform-plugin-framework/resource"
910
)
1011

@@ -27,15 +28,16 @@ func (r *DefaultDataViewResource) Delete(ctx context.Context, req resource.Delet
2728
return
2829
}
2930

30-
// Unset the default data view by setting it to null
31-
var nullDataViewID *string = nil
32-
force := true
31+
spaceID := state.SpaceID.ValueString()
32+
if spaceID == "" {
33+
spaceID = "default"
34+
}
3335

36+
// Unset the default data view by setting it to null
3437
setReq := kbapi.SetDefaultDatailViewDefaultJSONRequestBody{
35-
DataViewId: nullDataViewID,
36-
Force: &force,
38+
Force: utils.Pointer(true),
3739
}
3840

39-
diags = kibana_oapi.SetDefaultDataView(ctx, client, setReq)
41+
diags = kibana_oapi.SetDefaultDataView(ctx, client, spaceID, setReq)
4042
resp.Diagnostics.Append(diags...)
4143
}

internal/kibana/default_data_view/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ type defaultDataViewModel struct {
99
DataViewID types.String `tfsdk:"data_view_id"`
1010
Force types.Bool `tfsdk:"force"`
1111
SkipDelete types.Bool `tfsdk:"skip_delete"`
12+
SpaceID types.String `tfsdk:"space_id"`
1213
}

internal/kibana/default_data_view/read.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ func (r *DefaultDataViewResource) Read(ctx context.Context, req resource.ReadReq
2222
return
2323
}
2424

25-
defaultDataViewID, diags := kibana_oapi.GetDefaultDataView(ctx, client)
25+
spaceID := state.SpaceID.ValueString()
26+
if spaceID == "" {
27+
spaceID = "default"
28+
}
29+
30+
defaultDataViewID, diags := kibana_oapi.GetDefaultDataView(ctx, client, spaceID)
2631
resp.Diagnostics.Append(diags...)
2732
if resp.Diagnostics.HasError() {
2833
return
@@ -36,9 +41,9 @@ func (r *DefaultDataViewResource) Read(ctx context.Context, req resource.ReadReq
3641

3742
// Update state with current default data view
3843
state.DataViewID = types.StringValue(*defaultDataViewID)
39-
// Keep the ID as "default" - it should remain static
44+
// Use the space_id as the resource ID
4045
if state.ID.IsNull() || state.ID.IsUnknown() {
41-
state.ID = types.StringValue("default")
46+
state.ID = types.StringValue(spaceID)
4247
}
4348

4449
diags = resp.State.Set(ctx, state)

internal/kibana/default_data_view/schema.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
99
"github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault"
1010
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
11+
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringdefault"
1112
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
1213
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1314
)
@@ -37,15 +38,22 @@ func getSchema() schema.Schema {
3738
"force": schema.BoolAttribute{
3839
MarkdownDescription: "Update an existing default data view identifier. If set to false and a default data view already exists, the operation will fail.",
3940
Optional: true,
40-
Computed: true,
41-
Default: booldefault.StaticBool(true),
4241
},
4342
"skip_delete": schema.BoolAttribute{
4443
MarkdownDescription: "If set to true, the default data view will not be unset when the resource is destroyed. The existing default data view will remain unchanged.",
4544
Optional: true,
4645
Computed: true,
4746
Default: booldefault.StaticBool(false),
4847
},
48+
"space_id": schema.StringAttribute{
49+
MarkdownDescription: "The Kibana space ID to set the default data view in. Defaults to `default`.",
50+
Optional: true,
51+
Computed: true,
52+
Default: stringdefault.StaticString("default"),
53+
PlanModifiers: []planmodifier.String{
54+
stringplanmodifier.RequiresReplace(),
55+
},
56+
},
4957
},
5058
}
5159
}

0 commit comments

Comments
 (0)