Skip to content

Commit e858db4

Browse files
Copilottobio
andcommitted
Add version check for required_versions (9.1.0+) and fix empty map handling
Co-authored-by: tobio <[email protected]>
1 parent 487e591 commit e858db4

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

internal/fleet/agent_policy/acc_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
)
2121

2222
var minVersionAgentPolicy = version.Must(version.NewVersion("8.6.0"))
23+
var minVersionRequiredVersions = version.Must(version.NewVersion("9.1.0"))
2324

2425
func TestAccResourceAgentPolicyFromSDK(t *testing.T) {
2526
policyName := sdkacctest.RandStringFromCharSet(22, sdkacctest.CharSetAlphaNum)
@@ -809,7 +810,7 @@ func TestAccResourceAgentPolicyWithRequiredVersions(t *testing.T) {
809810
ProtoV6ProviderFactories: acctest.Providers,
810811
Steps: []resource.TestStep{
811812
{
812-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionAgentPolicy),
813+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionRequiredVersions),
813814
Config: testAccResourceAgentPolicyCreateWithRequiredVersions(policyName),
814815
Check: resource.ComposeTestCheckFunc(
815816
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "name", fmt.Sprintf("Policy %s", policyName)),
@@ -819,7 +820,7 @@ func TestAccResourceAgentPolicyWithRequiredVersions(t *testing.T) {
819820
),
820821
},
821822
{
822-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionAgentPolicy),
823+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionRequiredVersions),
823824
Config: testAccResourceAgentPolicyUpdateRequiredVersionsPercentage(policyName),
824825
Check: resource.ComposeTestCheckFunc(
825826
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "name", fmt.Sprintf("Policy %s", policyName)),
@@ -829,7 +830,7 @@ func TestAccResourceAgentPolicyWithRequiredVersions(t *testing.T) {
829830
),
830831
},
831832
{
832-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionAgentPolicy),
833+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionRequiredVersions),
833834
Config: testAccResourceAgentPolicyAddRequiredVersion(policyName),
834835
Check: resource.ComposeTestCheckFunc(
835836
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "name", fmt.Sprintf("Policy %s", policyName)),
@@ -840,7 +841,7 @@ func TestAccResourceAgentPolicyWithRequiredVersions(t *testing.T) {
840841
),
841842
},
842843
{
843-
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionAgentPolicy),
844+
SkipFunc: versionutils.CheckIfVersionIsUnsupported(minVersionRequiredVersions),
844845
Config: testAccResourceAgentPolicyRemoveRequiredVersions(policyName),
845846
Check: resource.ComposeTestCheckFunc(
846847
resource.TestCheckResourceAttr("elasticstack_fleet_agent_policy.test_policy", "name", fmt.Sprintf("Policy %s", policyName)),

internal/fleet/agent_policy/models.go

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type features struct {
2222
SupportsInactivityTimeout bool
2323
SupportsUnenrollmentTimeout bool
2424
SupportsSpaceIds bool
25+
SupportsRequiredVersions bool
2526
}
2627

2728
type globalDataTagsItemModel struct {
@@ -140,7 +141,9 @@ func (model *agentPolicyModel) populateFromAPI(ctx context.Context, data *kbapi.
140141
versionMap := make(map[string]attr.Value)
141142

142143
for _, rv := range *data.RequiredVersions {
143-
versionMap[rv.Version] = types.Int32Value(int32(rv.Percentage))
144+
// Round the float32 percentage to nearest integer since we use Int32 in the schema
145+
percentage := int32(rv.Percentage + 0.5)
146+
versionMap[rv.Version] = types.Int32Value(percentage)
144147
}
145148

146149
reqVersions, d := types.MapValue(types.Int32Type, versionMap)
@@ -205,7 +208,7 @@ func (model *agentPolicyModel) convertGlobalDataTags(ctx context.Context, feat f
205208
}
206209

207210
// convertRequiredVersions converts the required versions from terraform model to API model
208-
func (model *agentPolicyModel) convertRequiredVersions(ctx context.Context) (*[]struct {
211+
func (model *agentPolicyModel) convertRequiredVersions(ctx context.Context, feat features) (*[]struct {
209212
Percentage float32 `json:"percentage"`
210213
Version string `json:"version"`
211214
}, diag.Diagnostics) {
@@ -215,9 +218,26 @@ func (model *agentPolicyModel) convertRequiredVersions(ctx context.Context) (*[]
215218
return nil, diags
216219
}
217220

221+
// Check if required_versions is supported
222+
if !feat.SupportsRequiredVersions {
223+
return nil, diag.Diagnostics{
224+
diag.NewAttributeErrorDiagnostic(
225+
path.Root("required_versions"),
226+
"Unsupported Elasticsearch version",
227+
fmt.Sprintf("Required versions (automatic agent upgrades) are only supported in Elastic Stack %s and above", MinVersionRequiredVersions),
228+
),
229+
}
230+
}
231+
218232
elements := model.RequiredVersions.Elements()
233+
234+
// If the map is empty (required_versions = {}), return an empty array to clear upgrades
219235
if len(elements) == 0 {
220-
return nil, diags
236+
emptyArray := make([]struct {
237+
Percentage float32 `json:"percentage"`
238+
Version string `json:"version"`
239+
}, 0)
240+
return &emptyArray, diags
221241
}
222242

223243
result := make([]struct {
@@ -350,7 +370,7 @@ func (model *agentPolicyModel) toAPICreateModel(ctx context.Context, feat featur
350370
}
351371

352372
// Handle required_versions
353-
requiredVersions, d := model.convertRequiredVersions(ctx)
373+
requiredVersions, d := model.convertRequiredVersions(ctx, feat)
354374
if d.HasError() {
355375
return kbapi.PostFleetAgentPoliciesJSONRequestBody{}, d
356376
}
@@ -454,7 +474,7 @@ func (model *agentPolicyModel) toAPIUpdateModel(ctx context.Context, feat featur
454474
}
455475

456476
// Handle required_versions
457-
requiredVersions, d := model.convertRequiredVersions(ctx)
477+
requiredVersions, d := model.convertRequiredVersions(ctx, feat)
458478
if d.HasError() {
459479
return kbapi.PutFleetAgentPoliciesAgentpolicyidJSONRequestBody{}, d
460480
}

internal/fleet/agent_policy/resource.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var (
2424
MinVersionInactivityTimeout = version.Must(version.NewVersion("8.7.0"))
2525
MinVersionUnenrollmentTimeout = version.Must(version.NewVersion("8.15.0"))
2626
MinVersionSpaceIds = version.Must(version.NewVersion("9.1.0"))
27+
MinVersionRequiredVersions = version.Must(version.NewVersion("9.1.0"))
2728
)
2829

2930
// NewResource is a helper function to simplify the provider implementation.
@@ -75,11 +76,17 @@ func (r *agentPolicyResource) buildFeatures(ctx context.Context) (features, diag
7576
return features{}, diagutil.FrameworkDiagsFromSDK(diags)
7677
}
7778

79+
supportsRequiredVersions, diags := r.client.EnforceMinVersion(ctx, MinVersionRequiredVersions)
80+
if diags.HasError() {
81+
return features{}, diagutil.FrameworkDiagsFromSDK(diags)
82+
}
83+
7884
return features{
7985
SupportsGlobalDataTags: supportsGDT,
8086
SupportsSupportsAgentless: supportsSupportsAgentless,
8187
SupportsInactivityTimeout: supportsInactivityTimeout,
8288
SupportsUnenrollmentTimeout: supportsUnenrollmentTimeout,
8389
SupportsSpaceIds: supportsSpaceIds,
90+
SupportsRequiredVersions: supportsRequiredVersions,
8491
}, nil
8592
}

0 commit comments

Comments
 (0)