Skip to content

Commit ec089b4

Browse files
authored
Add description to kibana role resource (elastic#1186)
* Add description to kibana role resource * make gen * Remove duplicate version declarations * make lint
1 parent 08d771f commit ec089b4

File tree

10 files changed

+87
-22
lines changed

10 files changed

+87
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Add `headers` for the provider connection ([#1057](https://github.com/elastic/terraform-provider-elasticstack/pull/1057))
44
- Migrate `elasticstack_elasticsearch_system_user` resource to Terraform plugin framework ([#1154](https://github.com/elastic/terraform-provider-elasticstack/pull/1154))
55
- Add custom `endpoint` configuration support for snapshot repository setup ([#1158](https://github.com/elastic/terraform-provider-elasticstack/pull/1158))
6+
- Add `description` to `elasticstack_kibana_security_role` ([#1172](https://github.com/elastic/terraform-provider-elasticstack/issues/1172))
67

78
## [0.11.15] - 2025-04-23
89

docs/data-sources/kibana_security_role.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ data "elasticstack_kibana_security_role" "example" {
3232

3333
### Optional
3434

35+
- `description` (String) Description for the role
3536
- `metadata` (String) Optional meta-data.
3637

3738
### Read-Only

docs/resources/kibana_security_role.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ resource "elasticstack_kibana_security_role" "example" {
124124

125125
### Optional
126126

127+
- `description` (String) Optional description for the role
127128
- `kibana` (Block Set) The list of objects that specify the Kibana privileges for the role. (see [below for nested schema](#nestedblock--kibana))
128129
- `metadata` (String) Optional meta-data.
129130

internal/elasticsearch/security/role.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ import (
1717
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1818
)
1919

20-
var minSupportedRemoteIndicesVersion = version.Must(version.NewVersion("8.10.0"))
21-
var minSupportedDescriptionVersion = version.Must(version.NewVersion("8.15.0"))
20+
var (
21+
MinSupportedRemoteIndicesVersion = version.Must(version.NewVersion("8.10.0"))
22+
MinSupportedDescriptionVersion = version.Must(version.NewVersion("8.15.0"))
23+
)
2224

2325
func ResourceRole() *schema.Resource {
2426
roleSchema := map[string]*schema.Schema{
@@ -268,8 +270,8 @@ func resourceSecurityRolePut(ctx context.Context, d *schema.ResourceData, meta i
268270
// Add description to the role
269271
if v, ok := d.GetOk("description"); ok {
270272
// Return an error if the server version is less than the minimum supported version
271-
if serverVersion.LessThan(minSupportedDescriptionVersion) {
272-
return diag.FromErr(fmt.Errorf("'description' is supported only for Elasticsearch v%s and above", minSupportedDescriptionVersion.String()))
273+
if serverVersion.LessThan(MinSupportedDescriptionVersion) {
274+
return diag.FromErr(fmt.Errorf("'description' is supported only for Elasticsearch v%s and above", MinSupportedDescriptionVersion.String()))
273275
}
274276

275277
description := v.(string)
@@ -379,8 +381,8 @@ func resourceSecurityRolePut(ctx context.Context, d *schema.ResourceData, meta i
379381

380382
if v, ok := d.GetOk("remote_indices"); ok {
381383
definedRemoteIndices := v.(*schema.Set)
382-
if definedRemoteIndices.Len() > 0 && serverVersion.LessThan(minSupportedRemoteIndicesVersion) {
383-
return diag.FromErr(fmt.Errorf("'remote_indices' is supported only for Elasticsearch v%s and above", minSupportedRemoteIndicesVersion.String()))
384+
if definedRemoteIndices.Len() > 0 && serverVersion.LessThan(MinSupportedRemoteIndicesVersion) {
385+
return diag.FromErr(fmt.Errorf("'remote_indices' is supported only for Elasticsearch v%s and above", MinSupportedRemoteIndicesVersion.String()))
384386
}
385387
remoteIndices := make([]models.RemoteIndexPerms, definedRemoteIndices.Len())
386388
for i, idx := range definedRemoteIndices.List() {

internal/elasticsearch/security/role_data_source_test.go

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

66
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
77
"github.com/elastic/terraform-provider-elasticstack/internal/acctest/checks"
8+
"github.com/elastic/terraform-provider-elasticstack/internal/elasticsearch/security"
89
"github.com/elastic/terraform-provider-elasticstack/internal/versionutils"
910
"github.com/hashicorp/go-version"
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -51,7 +52,7 @@ func TestAccDataSourceSecurityRole(t *testing.T) {
5152
},
5253
{
5354
Config: testAccDataSourceSecurityRoleWithDescription,
54-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedDescriptionVersion),
55+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(security.MinSupportedDescriptionVersion),
5556
Check: resource.ComposeTestCheckFunc(
5657
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "name", "data_source_test"),
5758
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "cluster.*", "all"),

internal/elasticsearch/security/role_test.go

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

77
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
88
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
9+
"github.com/elastic/terraform-provider-elasticstack/internal/elasticsearch/security"
910
"github.com/elastic/terraform-provider-elasticstack/internal/versionutils"
10-
"github.com/hashicorp/go-version"
1111
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
1212
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1313
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1414
)
1515

16-
var minSupportedRemoteIndicesVersion = version.Must(version.NewSemver("8.10.0"))
17-
var minSupportedDescriptionVersion = version.Must(version.NewVersion("8.15.0"))
18-
1916
func TestAccResourceSecurityRole(t *testing.T) {
2017
// generate a random username
2118
roleName := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
@@ -53,7 +50,7 @@ func TestAccResourceSecurityRole(t *testing.T) {
5350
),
5451
},
5552
{
56-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedRemoteIndicesVersion),
53+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(security.MinSupportedRemoteIndicesVersion),
5754
Config: testAccResourceSecurityRoleRemoteIndicesCreate(roleNameRemoteIndices),
5855
Check: resource.ComposeTestCheckFunc(
5956
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role.test", "name", roleNameRemoteIndices),
@@ -68,7 +65,7 @@ func TestAccResourceSecurityRole(t *testing.T) {
6865
),
6966
},
7067
{
71-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedRemoteIndicesVersion),
68+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(security.MinSupportedRemoteIndicesVersion),
7269
Config: testAccResourceSecurityRoleRemoteIndicesUpdate(roleNameRemoteIndices),
7370
Check: resource.ComposeTestCheckFunc(
7471
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role.test", "name", roleNameRemoteIndices),
@@ -84,15 +81,15 @@ func TestAccResourceSecurityRole(t *testing.T) {
8481
),
8582
},
8683
{
87-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedDescriptionVersion),
84+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(security.MinSupportedDescriptionVersion),
8885
Config: testAccResourceSecurityRoleDescriptionCreate(roleNameDescription),
8986
Check: resource.ComposeTestCheckFunc(
9087
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role.test", "name", roleNameDescription),
9188
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role.test", "description", "test description"),
9289
),
9390
},
9491
{
95-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedDescriptionVersion),
92+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(security.MinSupportedDescriptionVersion),
9693
Config: testAccResourceSecurityRoleDescriptionUpdate(roleNameDescription),
9794
Check: resource.ComposeTestCheckFunc(
9895
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role.test", "name", roleNameDescription),

internal/kibana/role.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ import (
1515
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1616
)
1717

18-
var minSupportedRemoteIndicesVersion = version.Must(version.NewVersion("8.10.0"))
18+
var (
19+
minSupportedRemoteIndicesVersion = version.Must(version.NewVersion("8.10.0"))
20+
minSupportedDescriptionVersion = version.Must(version.NewVersion("8.15.0"))
21+
)
1922

2023
func ResourceRole() *schema.Resource {
2124
roleSchema := map[string]*schema.Schema{
@@ -232,6 +235,11 @@ func ResourceRole() *schema.Resource {
232235
ValidateFunc: validation.StringIsJSON,
233236
DiffSuppressFunc: utils.DiffJsonSuppress,
234237
},
238+
"description": {
239+
Description: "Optional description for the role",
240+
Type: schema.TypeString,
241+
Optional: true,
242+
},
235243
}
236244

237245
return &schema.Resource{
@@ -293,6 +301,14 @@ func resourceRoleUpsert(ctx context.Context, d *schema.ResourceData, meta interf
293301
}
294302
}
295303

304+
if v, ok := d.GetOk("description"); ok {
305+
if serverVersion.LessThan(minSupportedDescriptionVersion) {
306+
return diag.FromErr(fmt.Errorf("'description' is supported only for Kibana v%s and above", minSupportedDescriptionVersion.String()))
307+
}
308+
309+
kibanaRole.Description = v.(string)
310+
}
311+
296312
roleManageResponse, err := kibana.KibanaRoleManagement.CreateOrUpdate(&kibanaRole)
297313
if err != nil {
298314
return diag.FromErr(err)
@@ -334,6 +350,9 @@ func resourceRoleRead(ctx context.Context, d *schema.ResourceData, meta interfac
334350
if err := d.Set("kibana", flattenKibanaRoleKibanaData(&role.Kibana)); err != nil {
335351
return diag.FromErr(err)
336352
}
353+
if err := d.Set("description", role.Description); err != nil {
354+
return diag.FromErr(err)
355+
}
337356
if role.Metadata != nil {
338357
metadata, err := json.Marshal(role.Metadata)
339358
if err != nil {

internal/kibana/role_data_source.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ func DataSourceRole() *schema.Resource {
217217
ValidateFunc: validation.StringIsJSON,
218218
DiffSuppressFunc: utils.DiffJsonSuppress,
219219
},
220+
"description": {
221+
Description: "Description for the role",
222+
Type: schema.TypeString,
223+
Optional: true,
224+
},
220225
}
221226

222227
return &schema.Resource{

internal/kibana/role_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func TestAccResourceKibanaSecurityRole(t *testing.T) {
1919
roleName := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
2020
roleNameRemoteIndices := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
2121
minSupportedRemoteIndicesVersion := version.Must(version.NewSemver("8.10.0"))
22+
minSupportedDescriptionVersion := version.Must(version.NewVersion("8.15.0"))
2223

2324
resource.Test(t, resource.TestCase{
2425
PreCheck: func() { acctest.PreCheck(t) },
@@ -48,6 +49,16 @@ func TestAccResourceKibanaSecurityRole(t *testing.T) {
4849
checks.TestCheckResourceListAttr("elasticstack_kibana_security_role.test", "kibana.0.spaces", []string{"default"}),
4950
),
5051
},
52+
{
53+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedDescriptionVersion),
54+
Config: testAccResourceSecurityRoleWithDescription(roleName),
55+
Check: resource.ComposeTestCheckFunc(
56+
resource.TestCheckResourceAttr("elasticstack_kibana_security_role.test", "name", roleName),
57+
resource.TestCheckNoResourceAttr("elasticstack_kibana_security_role.test", "kibana.0.feature.#"),
58+
resource.TestCheckNoResourceAttr("elasticstack_kibana_security_role.test", "elasticsearch.0.indices.0.field_security.#"),
59+
resource.TestCheckResourceAttr("elasticstack_kibana_security_role.test", "description", "Role description"),
60+
),
61+
},
5162
{
5263
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedRemoteIndicesVersion),
5364
Config: testAccResourceSecurityRoleRemoteIndicesCreate(roleNameRemoteIndices),
@@ -174,6 +185,32 @@ resource "elasticstack_kibana_security_role" "test" {
174185
`, roleName)
175186
}
176187

188+
func testAccResourceSecurityRoleWithDescription(roleName string) string {
189+
return fmt.Sprintf(`
190+
provider "elasticstack" {
191+
elasticsearch {}
192+
kibana {}
193+
}
194+
195+
resource "elasticstack_kibana_security_role" "test" {
196+
name = "%s"
197+
description = "Role description"
198+
elasticsearch {
199+
cluster = [ "create_snapshot" ]
200+
indices {
201+
names = ["sample"]
202+
privileges = ["create", "read", "write"]
203+
}
204+
run_as = ["kibana", "elastic"]
205+
}
206+
kibana {
207+
base = [ "all" ]
208+
spaces = ["default"]
209+
}
210+
}
211+
`, roleName)
212+
}
213+
177214
func testAccResourceSecurityRoleRemoteIndicesCreate(roleName string) string {
178215
return fmt.Sprintf(`
179216
provider "elasticstack" {

libs/go-kibana-rest/kbapi/api.kibana_role_management.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ const (
1414

1515
// KibanaRole is the API role object
1616
type KibanaRole struct {
17-
Name string `json:"name,omitempty"`
18-
Metadata map[string]interface{} `json:"metadata,omitempty"`
19-
TransientMedata *KibanaRoleTransientMetadata `json:"transient_metadata,omitempty"`
20-
Elasticsearch *KibanaRoleElasticsearch `json:"elasticsearch,omitempty"`
21-
Kibana []KibanaRoleKibana `json:"kibana,omitempty"`
22-
CreateOnly bool `json:"-"`
17+
Name string `json:"name,omitempty"`
18+
Metadata map[string]interface{} `json:"metadata,omitempty"`
19+
TransientMetadata *KibanaRoleTransientMetadata `json:"transient_metadata,omitempty"`
20+
Elasticsearch *KibanaRoleElasticsearch `json:"elasticsearch,omitempty"`
21+
Kibana []KibanaRoleKibana `json:"kibana,omitempty"`
22+
Description string `json:"description,omitempty"`
23+
CreateOnly bool `json:"-"`
2324
}
2425

2526
// KibanaRoleTransientMetadata is the API TransientMedata object

0 commit comments

Comments
 (0)