Skip to content

Commit cb45510

Browse files
committed
Merge remote-tracking branch 'origin/main' into mockgen-tool
* origin/main: fix(deps): update module github.com/hashicorp/terraform-plugin-docs to v0.22.0 (#1188) Bump github.com/cloudflare/circl from 1.6.0 to 1.6.1 in /tools (#1187) Migrate the System User resource to the plugin framework. (#1154) Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 in /tools (#1184) Bump golang.org/x/net from 0.36.0 to 0.38.0 in /libs/go-kibana-rest (#1183)
2 parents f959a36 + 2200fda commit cb45510

File tree

25 files changed

+494
-283
lines changed

25 files changed

+494
-283
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## [Unreleased]
22

33
- Add `headers` for the provider connection ([#1057](https://github.com/elastic/terraform-provider-elasticstack/pull/1057))
4+
- Migrate `elasticstack_elasticsearch_system_user` resource to Terraform plugin framework ([#1154](https://github.com/elastic/terraform-provider-elasticstack/pull/1154))
45
- Add custom `endpoint` configuration support for snapshot repository setup ([#1158](https://github.com/elastic/terraform-provider-elasticstack/pull/1158))
56

67
## [0.11.15] - 2025-04-23

docs/resources/elasticsearch_security_system_user.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ resource "elasticstack_elasticsearch_security_system_user" "kibana_system" {
4141

4242
### Optional
4343

44-
- `elasticsearch_connection` (Block List, Max: 1, Deprecated) Elasticsearch connection configuration block. This property will be removed in a future provider version. Configure the Elasticsearch connection via the provider configuration instead. (see [below for nested schema](#nestedblock--elasticsearch_connection))
44+
- `elasticsearch_connection` (Block List, Deprecated) Elasticsearch connection configuration block. (see [below for nested schema](#nestedblock--elasticsearch_connection))
4545
- `enabled` (Boolean) Specifies whether the user is enabled. The default value is true.
46-
- `password` (String, Sensitive) The users password. Passwords must be at least 6 characters long.
47-
- `password_hash` (String, Sensitive) A hash of the users password. This must be produced using the same hashing algorithm as has been configured for password storage (see https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html#hashing-settings).
46+
- `password` (String, Sensitive) The user's password. Passwords must be at least 6 characters long.
47+
- `password_hash` (String, Sensitive) A hash of the user's password. This must be produced using the same hashing algorithm as has been configured for password storage (see https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html#hashing-settings).
4848

4949
### Read-Only
5050

internal/utils/testutils.go renamed to internal/acctest/checks/resource_list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package utils
1+
package checks
22

33
import (
44
"fmt"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package checks
2+
3+
import (
4+
"encoding/base64"
5+
"fmt"
6+
"io"
7+
8+
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10+
)
11+
12+
func CheckUserCanAuthenticate(username string, password string) func(*terraform.State) error {
13+
return func(s *terraform.State) error {
14+
client, err := clients.NewAcceptanceTestingClient()
15+
if err != nil {
16+
return err
17+
}
18+
19+
esClient, err := client.GetESClient()
20+
if err != nil {
21+
return err
22+
}
23+
24+
credentials := fmt.Sprintf("%s:%s", username, password)
25+
authHeader := fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(credentials)))
26+
27+
req := esClient.Security.Authenticate.WithHeader(map[string]string{"Authorization": authHeader})
28+
resp, err := esClient.Security.Authenticate(req)
29+
if err != nil {
30+
return err
31+
}
32+
33+
defer resp.Body.Close()
34+
35+
if resp.IsError() {
36+
body, err := io.ReadAll(resp.Body)
37+
38+
return fmt.Errorf("failed to authenticate as test user [%s] %s %s", username, body, err)
39+
}
40+
return nil
41+
}
42+
}

internal/clients/elasticsearch/security.go

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -89,60 +89,88 @@ func DeleteUser(ctx context.Context, apiClient *clients.ApiClient, username stri
8989
return diags
9090
}
9191

92-
func EnableUser(ctx context.Context, apiClient *clients.ApiClient, username string) diag.Diagnostics {
93-
var diags diag.Diagnostics
92+
func EnableUser(ctx context.Context, apiClient *clients.ApiClient, username string) fwdiag.Diagnostics {
93+
var diags fwdiag.Diagnostics
9494
esClient, err := apiClient.GetESClient()
9595
if err != nil {
96-
return diag.FromErr(err)
96+
diags.AddError(
97+
"Unable to get Elasticsearch client",
98+
err.Error(),
99+
)
100+
return diags
97101
}
98102
res, err := esClient.Security.EnableUser(username, esClient.Security.EnableUser.WithContext(ctx))
99103
if err != nil {
100-
return diag.FromErr(err)
104+
diags.AddError(
105+
"Unable to enable system user",
106+
err.Error(),
107+
)
108+
return diags
101109
}
102110
defer res.Body.Close()
103-
if diags := utils.CheckError(res, "Unable to enable system user"); diags.HasError() {
111+
if diags := utils.CheckErrorFromFW(res, "Unable to enable system user"); diags.HasError() {
104112
return diags
105113
}
106114
return diags
107115
}
108116

109-
func DisableUser(ctx context.Context, apiClient *clients.ApiClient, username string) diag.Diagnostics {
110-
var diags diag.Diagnostics
117+
func DisableUser(ctx context.Context, apiClient *clients.ApiClient, username string) fwdiag.Diagnostics {
118+
var diags fwdiag.Diagnostics
111119
esClient, err := apiClient.GetESClient()
112120
if err != nil {
113-
return diag.FromErr(err)
121+
diags.AddError(
122+
"Unable to get Elasticsearch client",
123+
err.Error(),
124+
)
125+
return diags
114126
}
115127
res, err := esClient.Security.DisableUser(username, esClient.Security.DisableUser.WithContext(ctx))
116128
if err != nil {
117-
return diag.FromErr(err)
129+
diags.AddError(
130+
"Unable to disable system user",
131+
err.Error(),
132+
)
133+
return diags
118134
}
119135
defer res.Body.Close()
120-
if diags := utils.CheckError(res, "Unable to disable system user"); diags.HasError() {
136+
if diags := utils.CheckErrorFromFW(res, "Unable to disable system user"); diags.HasError() {
121137
return diags
122138
}
123139
return diags
124140
}
125141

126-
func ChangeUserPassword(ctx context.Context, apiClient *clients.ApiClient, username string, userPassword *models.UserPassword) diag.Diagnostics {
127-
var diags diag.Diagnostics
142+
func ChangeUserPassword(ctx context.Context, apiClient *clients.ApiClient, username string, userPassword *models.UserPassword) fwdiag.Diagnostics {
143+
var diags fwdiag.Diagnostics
128144
userPasswordBytes, err := json.Marshal(userPassword)
129145
if err != nil {
130-
return diag.FromErr(err)
146+
diags.AddError(
147+
"Unable to marshal user password",
148+
err.Error(),
149+
)
150+
return diags
131151
}
132152
esClient, err := apiClient.GetESClient()
133153
if err != nil {
134-
return diag.FromErr(err)
154+
diags.AddError(
155+
"Unable to get Elasticsearch client",
156+
err.Error(),
157+
)
158+
return diags
135159
}
136160
res, err := esClient.Security.ChangePassword(
137161
bytes.NewReader(userPasswordBytes),
138162
esClient.Security.ChangePassword.WithUsername(username),
139163
esClient.Security.ChangePassword.WithContext(ctx),
140164
)
141165
if err != nil {
142-
return diag.FromErr(err)
166+
diags.AddError(
167+
"Unable to change user password",
168+
err.Error(),
169+
)
170+
return diags
143171
}
144172
defer res.Body.Close()
145-
if diags := utils.CheckError(res, "Unable to change user's password"); diags.HasError() {
173+
if diags := utils.CheckErrorFromFW(res, "Unable to change user's password"); diags.HasError() {
146174
return diags
147175
}
148176
return diags

internal/elasticsearch/security/role_data_source_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"testing"
55

66
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
7-
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
7+
"github.com/elastic/terraform-provider-elasticstack/internal/acctest/checks"
88
"github.com/elastic/terraform-provider-elasticstack/internal/versionutils"
99
"github.com/hashicorp/go-version"
1010
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -21,11 +21,11 @@ func TestAccDataSourceSecurityRole(t *testing.T) {
2121
Check: resource.ComposeTestCheckFunc(
2222
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "name", "data_source_test"),
2323
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "cluster.*", "all"),
24-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
24+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
2525
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.privileges.*", "all"),
2626
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.allow_restricted_indices", "true"),
2727
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.application", "myapp"),
28-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
28+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
2929
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.resources.*", "*"),
3030
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "run_as.*", "other_user"),
3131
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "metadata", `{"version":1}`),
@@ -37,11 +37,11 @@ func TestAccDataSourceSecurityRole(t *testing.T) {
3737
Check: resource.ComposeTestCheckFunc(
3838
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "name", "data_source_test"),
3939
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "cluster.*", "all"),
40-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
40+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
4141
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.privileges.*", "all"),
4242
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.allow_restricted_indices", "true"),
4343
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.application", "myapp"),
44-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
44+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
4545
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.resources.*", "*"),
4646
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "run_as.*", "other_user"),
4747
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "metadata", `{"version":1}`),
@@ -55,11 +55,11 @@ func TestAccDataSourceSecurityRole(t *testing.T) {
5555
Check: resource.ComposeTestCheckFunc(
5656
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "name", "data_source_test"),
5757
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "cluster.*", "all"),
58-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
58+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.names", []string{"index1", "index2"}),
5959
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.privileges.*", "all"),
6060
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "indices.0.allow_restricted_indices", "true"),
6161
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.application", "myapp"),
62-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
62+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.privileges", []string{"admin", "read"}),
6363
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "applications.0.resources.*", "*"),
6464
resource.TestCheckTypeSetElemAttr("data.elasticstack_elasticsearch_security_role.test", "run_as.*", "other_user"),
6565
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role.test", "metadata", `{"version":1}`),

internal/elasticsearch/security/role_mapping_data_source_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"testing"
55

66
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
7-
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
7+
"github.com/elastic/terraform-provider-elasticstack/internal/acctest/checks"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
99
)
1010

@@ -18,7 +18,7 @@ func TestAccDataSourceSecurityRoleMapping(t *testing.T) {
1818
Check: resource.ComposeTestCheckFunc(
1919
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "name", "data_source_test"),
2020
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "enabled", "true"),
21-
utils.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin"}),
21+
checks.TestCheckResourceListAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin"}),
2222
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "rules", `{"any":[{"field":{"username":"esadmin"}},{"field":{"groups":"cn=admins,dc=example,dc=com"}}]}`),
2323
resource.TestCheckResourceAttr("data.elasticstack_elasticsearch_security_role_mapping.test", "metadata", `{"version":1}`),
2424
),

internal/elasticsearch/security/role_mapping_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"testing"
77

88
"github.com/elastic/terraform-provider-elasticstack/internal/acctest"
9+
"github.com/elastic/terraform-provider-elasticstack/internal/acctest/checks"
910
"github.com/elastic/terraform-provider-elasticstack/internal/clients"
10-
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
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"
@@ -25,7 +25,7 @@ func TestResourceRoleMapping(t *testing.T) {
2525
Check: resource.ComposeTestCheckFunc(
2626
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "name", roleMappingName),
2727
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "enabled", "true"),
28-
utils.TestCheckResourceListAttr("elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin"}),
28+
checks.TestCheckResourceListAttr("elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin"}),
2929
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "rules", `{"any":[{"field":{"username":"esadmin"}},{"field":{"groups":"cn=admins,dc=example,dc=com"}}]}`),
3030
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "metadata", `{"version":1}`),
3131
),
@@ -35,7 +35,7 @@ func TestResourceRoleMapping(t *testing.T) {
3535
Check: resource.ComposeTestCheckFunc(
3636
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "name", roleMappingName),
3737
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "enabled", "false"),
38-
utils.TestCheckResourceListAttr("elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin", "user"}),
38+
checks.TestCheckResourceListAttr("elasticstack_elasticsearch_security_role_mapping.test", "roles", []string{"admin", "user"}),
3939
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "rules", `{"any":[{"field":{"username":"esadmin"}},{"field":{"groups":"cn=admins,dc=example,dc=com"}}]}`),
4040
resource.TestCheckResourceAttr("elasticstack_elasticsearch_security_role_mapping.test", "metadata", `{}`),
4141
),

0 commit comments

Comments
 (0)