Skip to content

Commit 6965f19

Browse files
daemitustobio
andauthored
update elasticsearch_security_api_key model/test (#766)
* update elasticsearch_security_api_key model/test * Update changelog * utils.Pointer * Only test remote indices when supported --------- Co-authored-by: Toby Brain <[email protected]>
1 parent 8568596 commit 6965f19

File tree

4 files changed

+109
-21
lines changed

4 files changed

+109
-21
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- Remove `space_id` parameter from private locations to fix inconsistent state for `elasticstack_kibana_synthetics_private_location` `space_id` ([#733](https://github.com/elastic/terraform-provider-elasticstack/pull/733))
99
- Add the `Frequency` field to the Create Rule API ([#753](https://github.com/elastic/terraform-provider-elasticstack/pull/753))
1010
- Prevent a provider panic when the repository referenced in an `elasticstack_elasticsearch_snapshot_repository` does not exist ([#758](https://github.com/elastic/terraform-provider-elasticstack/pull/758))
11+
- Add support for `remote_indicies` to `elasticstack_elasticsearch_security_api_key` (#766)[https://github.com/elastic/terraform-provider-elasticstack/pull/766]
1112

1213
## [0.11.6] - 2024-08-20
1314

internal/elasticsearch/security/api_key_test.go

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7-
"github.com/hashicorp/go-version"
87
"reflect"
98
"regexp"
109
"testing"
1110

11+
"github.com/hashicorp/go-version"
12+
1213
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
1314
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
1415
"github.com/elastic/terraform-provider-elasticstack/internal/clients/elasticsearch"
1516
"github.com/elastic/terraform-provider-elasticstack/internal/elasticsearch/security"
1617
"github.com/elastic/terraform-provider-elasticstack/internal/models"
18+
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
1719
"github.com/elastic/terraform-provider-elasticstack/internal/versionutils"
1820
sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
1921
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -40,14 +42,65 @@ func TestAccResourceSecurityApiKey(t *testing.T) {
4042
return err
4143
}
4244

43-
allowRestrictedIndices := false
4445
expectedRoleDescriptor := map[string]models.ApiKeyRoleDescriptor{
4546
"role-a": {
4647
Cluster: []string{"all"},
4748
Indices: []models.IndexPerms{{
4849
Names: []string{"index-a*"},
4950
Privileges: []string{"read"},
50-
AllowRestrictedIndices: &allowRestrictedIndices,
51+
AllowRestrictedIndices: utils.Pointer(false),
52+
}},
53+
},
54+
}
55+
56+
if !reflect.DeepEqual(testRoleDescriptor, expectedRoleDescriptor) {
57+
return fmt.Errorf("%v doesn't match %v", testRoleDescriptor, expectedRoleDescriptor)
58+
}
59+
60+
return nil
61+
}),
62+
resource.TestCheckResourceAttrSet("elasticstack_elasticsearch_security_api_key.test", "expiration"),
63+
resource.TestCheckResourceAttrSet("elasticstack_elasticsearch_security_api_key.test", "api_key"),
64+
resource.TestCheckResourceAttrSet("elasticstack_elasticsearch_security_api_key.test", "encoded"),
65+
),
66+
},
67+
},
68+
})
69+
}
70+
71+
func TestAccResourceSecurityApiKeyWithRemoteIndices(t *testing.T) {
72+
// generate a random name
73+
apiKeyName := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
74+
75+
resource.Test(t, resource.TestCase{
76+
PreCheck: func() { acctest.PreCheck(t) },
77+
CheckDestroy: checkResourceSecurityApiKeyDestroy,
78+
ProtoV6ProviderFactories: acctest.Providers,
79+
Steps: []resource.TestStep{
80+
{
81+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minSupportedRemoteIndicesVersion),
82+
Config: testAccResourceSecurityApiKeyRemoteIndices(apiKeyName),
83+
Check: resource.ComposeTestCheckFunc(
84+
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_api_key.test", "name", apiKeyName),
85+
resource.TestCheckResourceAttrWith("elasticstack_elasticsearch_security_api_key.test", "role_descriptors", func(testValue string) error {
86+
var testRoleDescriptor map[string]models.ApiKeyRoleDescriptor
87+
if err := json.Unmarshal([]byte(testValue), &testRoleDescriptor); err != nil {
88+
return err
89+
}
90+
91+
expectedRoleDescriptor := map[string]models.ApiKeyRoleDescriptor{
92+
"role-a": {
93+
Cluster: []string{"all"},
94+
Indices: []models.IndexPerms{{
95+
Names: []string{"index-a*"},
96+
Privileges: []string{"read"},
97+
AllowRestrictedIndices: utils.Pointer(false),
98+
}},
99+
RemoteIndices: []models.RemoteIndexPerms{{
100+
Clusters: []string{"*"},
101+
Names: []string{"index-a*"},
102+
Privileges: []string{"read"},
103+
AllowRestrictedIndices: utils.Pointer(true),
51104
}},
52105
},
53106
}
@@ -165,7 +218,38 @@ resource "elasticstack_elasticsearch_security_api_key" "test" {
165218
privileges = ["read"]
166219
allow_restricted_indices = false
167220
}]
168-
}
221+
}
222+
})
223+
224+
expiration = "1d"
225+
}
226+
`, apiKeyName)
227+
}
228+
229+
func testAccResourceSecurityApiKeyRemoteIndices(apiKeyName string) string {
230+
return fmt.Sprintf(`
231+
provider "elasticstack" {
232+
elasticsearch {}
233+
}
234+
235+
resource "elasticstack_elasticsearch_security_api_key" "test" {
236+
name = "%s"
237+
238+
role_descriptors = jsonencode({
239+
role-a = {
240+
cluster = ["all"]
241+
indices = [{
242+
names = ["index-a*"]
243+
privileges = ["read"]
244+
allow_restricted_indices = false
245+
}]
246+
remote_indices = [{
247+
clusters = ["*"]
248+
names = ["index-a*"]
249+
privileges = ["read"]
250+
allow_restricted_indices = true
251+
}]
252+
}
169253
})
170254
171255
expiration = "1d"
@@ -190,8 +274,8 @@ resource "elasticstack_elasticsearch_security_api_key" "test" {
190274
privileges = ["read"]
191275
allow_restricted_indices = false
192276
}],
193-
restriction = {
194-
workflows = [ "search_application_query"]
277+
restriction = {
278+
workflows = [ "search_application_query"]
195279
}
196280
}
197281
})

internal/elasticsearch/security/role_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ import (
1313
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
1414
)
1515

16+
var minSupportedRemoteIndicesVersion = version.Must(version.NewSemver("8.10.0"))
17+
1618
func TestAccResourceSecurityRole(t *testing.T) {
1719
// generate a random username
1820
roleName := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
1921
roleNameRemoteIndices := sdkacctest.RandStringFromCharSet(10, sdkacctest.CharSetAlphaNum)
20-
minSupportedRemoteIndicesVersion := version.Must(version.NewSemver("8.10.0"))
2122

2223
resource.Test(t, resource.TestCase{
2324
PreCheck: func() { acctest.PreCheck(t) },
@@ -202,7 +203,7 @@ resource "elasticstack_elasticsearch_security_role" "test" {
202203
names = ["sample2"]
203204
privileges = ["create", "read", "write"]
204205
}
205-
206+
206207
metadata = jsonencode({
207208
version = 1
208209
})

internal/models/models.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,15 @@ type Role struct {
8484
}
8585

8686
type ApiKeyRoleDescriptor struct {
87-
Name string `json:"-"`
88-
Applications []Application `json:"applications,omitempty"`
89-
Global map[string]interface{} `json:"global,omitempty"`
90-
Cluster []string `json:"cluster,omitempty"`
91-
Indices []IndexPerms `json:"indices,omitempty"`
92-
Metadata map[string]interface{} `json:"metadata,omitempty"`
93-
RusAs []string `json:"run_as,omitempty"`
94-
Restriction *Restriction `json:"restriction,omitempty"`
87+
Name string `json:"-"`
88+
Applications []Application `json:"applications,omitempty"`
89+
Global map[string]interface{} `json:"global,omitempty"`
90+
Cluster []string `json:"cluster,omitempty"`
91+
Indices []IndexPerms `json:"indices,omitempty"`
92+
RemoteIndices []RemoteIndexPerms `json:"remote_indices,omitempty"`
93+
Metadata map[string]interface{} `json:"metadata,omitempty"`
94+
RusAs []string `json:"run_as,omitempty"`
95+
Restriction *Restriction `json:"restriction,omitempty"`
9596
}
9697

9798
type Restriction struct {
@@ -133,11 +134,12 @@ type IndexPerms struct {
133134
}
134135

135136
type RemoteIndexPerms struct {
136-
FieldSecurity *FieldSecurity `json:"field_security,omitempty"`
137-
Names []string `json:"names"`
138-
Clusters []string `json:"clusters"`
139-
Privileges []string `json:"privileges"`
140-
Query *string `json:"query,omitempty"`
137+
FieldSecurity *FieldSecurity `json:"field_security,omitempty"`
138+
Names []string `json:"names"`
139+
Clusters []string `json:"clusters"`
140+
Privileges []string `json:"privileges"`
141+
Query *string `json:"query,omitempty"`
142+
AllowRestrictedIndices *bool `json:"allow_restricted_indices,omitempty"`
141143
}
142144

143145
type FieldSecurity struct {

0 commit comments

Comments
 (0)