Skip to content

Commit 4020952

Browse files
Copilottobio
andcommitted
Convert inactivity_timeout to string duration type with seconds conversion
Co-authored-by: tobio <[email protected]>
1 parent 5385514 commit 4020952

File tree

4 files changed

+46
-26
lines changed

4 files changed

+46
-26
lines changed

internal/fleet/agent_policy/models.go

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/elastic/terraform-provider-elasticstack/generated/kbapi"
99
"github.com/elastic/terraform-provider-elasticstack/internal/utils"
10+
"github.com/elastic/terraform-provider-elasticstack/internal/utils/customtypes"
1011

1112
"github.com/hashicorp/terraform-plugin-framework/attr"
1213
"github.com/hashicorp/terraform-plugin-framework/diag"
@@ -26,22 +27,22 @@ type globalDataTagsItemModel struct {
2627
}
2728

2829
type agentPolicyModel struct {
29-
ID types.String `tfsdk:"id"`
30-
PolicyID types.String `tfsdk:"policy_id"`
31-
Name types.String `tfsdk:"name"`
32-
Namespace types.String `tfsdk:"namespace"`
33-
Description types.String `tfsdk:"description"`
34-
DataOutputId types.String `tfsdk:"data_output_id"`
35-
MonitoringOutputId types.String `tfsdk:"monitoring_output_id"`
36-
FleetServerHostId types.String `tfsdk:"fleet_server_host_id"`
37-
DownloadSourceId types.String `tfsdk:"download_source_id"`
38-
MonitorLogs types.Bool `tfsdk:"monitor_logs"`
39-
MonitorMetrics types.Bool `tfsdk:"monitor_metrics"`
40-
SysMonitoring types.Bool `tfsdk:"sys_monitoring"`
41-
SkipDestroy types.Bool `tfsdk:"skip_destroy"`
42-
SupportsAgentless types.Bool `tfsdk:"supports_agentless"`
43-
InactivityTimeout types.Float32 `tfsdk:"inactivity_timeout"`
44-
GlobalDataTags types.Map `tfsdk:"global_data_tags"` //> globalDataTagsModel
30+
ID types.String `tfsdk:"id"`
31+
PolicyID types.String `tfsdk:"policy_id"`
32+
Name types.String `tfsdk:"name"`
33+
Namespace types.String `tfsdk:"namespace"`
34+
Description types.String `tfsdk:"description"`
35+
DataOutputId types.String `tfsdk:"data_output_id"`
36+
MonitoringOutputId types.String `tfsdk:"monitoring_output_id"`
37+
FleetServerHostId types.String `tfsdk:"fleet_server_host_id"`
38+
DownloadSourceId types.String `tfsdk:"download_source_id"`
39+
MonitorLogs types.Bool `tfsdk:"monitor_logs"`
40+
MonitorMetrics types.Bool `tfsdk:"monitor_metrics"`
41+
SysMonitoring types.Bool `tfsdk:"sys_monitoring"`
42+
SkipDestroy types.Bool `tfsdk:"skip_destroy"`
43+
SupportsAgentless types.Bool `tfsdk:"supports_agentless"`
44+
InactivityTimeout customtypes.Duration `tfsdk:"inactivity_timeout"`
45+
GlobalDataTags types.Map `tfsdk:"global_data_tags"` //> globalDataTagsModel
4546
}
4647

4748
func (model *agentPolicyModel) populateFromAPI(ctx context.Context, data *kbapi.AgentPolicy) diag.Diagnostics {
@@ -75,7 +76,13 @@ func (model *agentPolicyModel) populateFromAPI(ctx context.Context, data *kbapi.
7576
model.Name = types.StringValue(data.Name)
7677
model.Namespace = types.StringValue(data.Namespace)
7778
model.SupportsAgentless = types.BoolPointerValue(data.SupportsAgentless)
78-
model.InactivityTimeout = types.Float32PointerValue(data.InactivityTimeout)
79+
if data.InactivityTimeout != nil {
80+
// Convert seconds to duration string
81+
durationStr := fmt.Sprintf("%.0fs", *data.InactivityTimeout)
82+
model.InactivityTimeout = customtypes.NewDurationValue(durationStr)
83+
} else {
84+
model.InactivityTimeout = customtypes.NewDurationNull()
85+
}
7986
if utils.Deref(data.GlobalDataTags) != nil {
8087
diags := diag.Diagnostics{}
8188
var map0 = make(map[string]globalDataTagsItemModel)
@@ -200,7 +207,12 @@ func (model *agentPolicyModel) toAPICreateModel(ctx context.Context, feat featur
200207
),
201208
}
202209
}
203-
body.InactivityTimeout = model.InactivityTimeout.ValueFloat32Pointer()
210+
duration, diags := model.InactivityTimeout.Parse()
211+
if diags.HasError() {
212+
return kbapi.PostFleetAgentPoliciesJSONRequestBody{}, diags
213+
}
214+
seconds := float32(duration.Seconds())
215+
body.InactivityTimeout = &seconds
204216
}
205217

206218
tags, diags := model.convertGlobalDataTags(ctx, feat)
@@ -255,7 +267,12 @@ func (model *agentPolicyModel) toAPIUpdateModel(ctx context.Context, feat featur
255267
),
256268
}
257269
}
258-
body.InactivityTimeout = model.InactivityTimeout.ValueFloat32Pointer()
270+
duration, diags := model.InactivityTimeout.Parse()
271+
if diags.HasError() {
272+
return kbapi.PutFleetAgentPoliciesAgentpolicyidJSONRequestBody{}, diags
273+
}
274+
seconds := float32(duration.Seconds())
275+
body.InactivityTimeout = &seconds
259276
}
260277

261278
tags, diags := model.convertGlobalDataTags(ctx, feat)

internal/fleet/agent_policy/resource_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,15 @@ func TestAccResourceAgentPolicy(t *testing.T) {
145145
},
146146
{
147147
SkipFunc: versionutils.CheckIfVersionIsUnsupported(agent_policy.MinVersionInactivityTimeout),
148-
Config: testAccResourceAgentPolicyCreateWithInactivityTimeout(policyName, false, 120),
148+
Config: testAccResourceAgentPolicyCreateWithInactivityTimeout(policyName, false, "2m"),
149149
Check: resource.ComposeTestCheckFunc(
150150
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "name", fmt.Sprintf("Policy %s", policyName)),
151151
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "namespace", "default"),
152152
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "description", "Test Agent Policy with Inactivity Timeout"),
153153
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "monitor_logs", "true"),
154154
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "monitor_metrics", "false"),
155155
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "skip_destroy", "false"),
156-
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "inactivity_timeout", "120"),
156+
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "inactivity_timeout", "2m"),
157157
),
158158
},
159159
{
@@ -308,7 +308,7 @@ data "elasticstack_fleet_enrollment_tokens" "test_policy" {
308308
`, fmt.Sprintf("Policy %s", id), skipDestroy)
309309
}
310310

311-
func testAccResourceAgentPolicyCreateWithInactivityTimeout(id string, skipDestroy bool, inactivityTimeout float32) string {
311+
func testAccResourceAgentPolicyCreateWithInactivityTimeout(id string, skipDestroy bool, inactivityTimeout string) string {
312312
return fmt.Sprintf(`
313313
provider "elasticstack" {
314314
elasticsearch {}
@@ -322,7 +322,7 @@ resource "elasticstack_fleet_agent_policy" "test_policy" {
322322
monitor_logs = true
323323
monitor_metrics = false
324324
skip_destroy = %t
325-
inactivity_timeout = %g
325+
inactivity_timeout = "%s"
326326
}
327327
328328
data "elasticstack_fleet_enrollment_tokens" "test_policy" {

internal/fleet/agent_policy/schema.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package agent_policy
33
import (
44
"context"
55

6+
"github.com/elastic/terraform-provider-elasticstack/internal/utils/customtypes"
67
"github.com/hashicorp/terraform-plugin-framework-validators/float32validator"
78
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
89
"github.com/hashicorp/terraform-plugin-framework/attr"
@@ -97,10 +98,11 @@ func getSchema() schema.Schema {
9798
boolplanmodifier.RequiresReplace(),
9899
},
99100
},
100-
"inactivity_timeout": schema.Float32Attribute{
101-
Description: "The inactivity timeout (in seconds) for the agent policy. If an agent does not report within this time period, it will be considered inactive.",
101+
"inactivity_timeout": schema.StringAttribute{
102+
Description: "The inactivity timeout for the agent policy. If an agent does not report within this time period, it will be considered inactive. Supports duration strings (e.g., '30s', '2m', '1h').",
102103
Computed: true,
103104
Optional: true,
105+
CustomType: customtypes.DurationType{},
104106
},
105107
"global_data_tags": schema.MapNestedAttribute{
106108
Description: "User-defined data tags to apply to all inputs. Values can be strings (string_value) or numbers (number_value) but not both. Example -- key1 = {string_value = value1}, key2 = {number_value = 42}",

internal/fleet/agent_policy/version_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package agent_policy
22

33
import (
44
"context"
5+
"github.com/elastic/terraform-provider-elasticstack/internal/utils/customtypes"
56
"github.com/hashicorp/go-version"
67
"github.com/hashicorp/terraform-plugin-framework/types"
78
"testing"
@@ -35,7 +36,7 @@ func TestInactivityTimeoutVersionValidation(t *testing.T) {
3536
model := &agentPolicyModel{
3637
Name: types.StringValue("test"),
3738
Namespace: types.StringValue("default"),
38-
InactivityTimeout: types.Float32Value(120.0),
39+
InactivityTimeout: customtypes.NewDurationValue("2m"),
3940
}
4041

4142
// Create features with inactivity timeout NOT supported

0 commit comments

Comments
 (0)