Skip to content

Commit cf93cc1

Browse files
committed
feat: node template change doesn't drift the autoscaler policies
1 parent 30cdace commit cf93cc1

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

castai/resource_autoscaler_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,20 @@ func TestAccEKS_ResourceAutoscaler_basic(t *testing.T) {
10261026
ImportState: true,
10271027
ImportStateVerify: true,
10281028
},
1029+
// Step 4: Modify default node template and verify autoscaler doesn't drift
1030+
// This tests the policy - node template sync behavior - when the default node template
1031+
// is modified, the autoscaler should not show drift due to defaultNodeTemplateVersion changing.
1032+
{
1033+
Config: testAccAutoscalerWithNodeTemplateConfig(rName, clusterName),
1034+
Check: resource.ComposeTestCheckFunc(
1035+
// Verify autoscaler state is unchanged despite node template modification
1036+
resource.TestCheckResourceAttr("castai_autoscaler.test", "autoscaler_settings.0.enabled", "false"),
1037+
resource.TestCheckResourceAttr("castai_autoscaler.test", "autoscaler_settings.0.is_scoped_mode", "true"),
1038+
// Verify node template was created/updated
1039+
resource.TestCheckResourceAttr("castai_node_template.default", "name", "default-by-castai"),
1040+
resource.TestCheckResourceAttr("castai_node_template.default", "constraints.0.spot", "true"),
1041+
),
1042+
},
10291043
},
10301044
ExternalProviders: map[string]resource.ExternalProvider{
10311045
"aws": {
@@ -1096,6 +1110,24 @@ resource "castai_autoscaler" "test" {
10961110
nodeDownscalerEnabled, emptyNodesEnabled, delaySeconds))
10971111
}
10981112

1113+
// testAccAutoscalerWithNodeTemplateConfig returns a config that includes both autoscaler and
1114+
// the default node template. This tests the policy↔node template sync behavior.
1115+
func testAccAutoscalerWithNodeTemplateConfig(rName, clusterName string) string {
1116+
return ConfigCompose(testAccAutoscalerConfig(rName, clusterName, false, true), `
1117+
resource "castai_node_template" "default" {
1118+
cluster_id = castai_eks_cluster.test.id
1119+
name = "default-by-castai"
1120+
is_default = true
1121+
is_enabled = true
1122+
1123+
constraints {
1124+
on_demand = true
1125+
spot = true
1126+
}
1127+
}
1128+
`)
1129+
}
1130+
10991131
func TestAutoscalerResource_FlattenAutoscalerSettings(t *testing.T) {
11001132
tests := []struct {
11011133
name string
@@ -1307,3 +1339,53 @@ func TestAutoscalerResource_FlattenEvictor(t *testing.T) {
13071339
r.Equal("5s", result["pod_eviction_failure_back_off_interval"])
13081340
r.Equal(false, result["ignore_pod_disruption_budgets"])
13091341
}
1342+
1343+
func TestAutoscalerResource_FilterVolatileFields(t *testing.T) {
1344+
tests := []struct {
1345+
name string
1346+
input string
1347+
shouldExist []string
1348+
shouldGone []string
1349+
}{
1350+
{
1351+
name: "removes defaultNodeTemplateVersion",
1352+
input: `{"enabled":true,"defaultNodeTemplateVersion":"5","isScopedMode":false}`,
1353+
shouldExist: []string{"enabled", "isScopedMode"},
1354+
shouldGone: []string{"defaultNodeTemplateVersion"},
1355+
},
1356+
{
1357+
name: "handles missing defaultNodeTemplateVersion",
1358+
input: `{"enabled":true,"isScopedMode":false}`,
1359+
shouldExist: []string{"enabled", "isScopedMode"},
1360+
shouldGone: []string{"defaultNodeTemplateVersion"},
1361+
},
1362+
{
1363+
name: "preserves nested structures",
1364+
input: `{"enabled":true,"defaultNodeTemplateVersion":"10","nodeDownscaler":{"enabled":true}}`,
1365+
shouldExist: []string{"enabled", "nodeDownscaler"},
1366+
shouldGone: []string{"defaultNodeTemplateVersion"},
1367+
},
1368+
}
1369+
1370+
for _, tt := range tests {
1371+
t.Run(tt.name, func(t *testing.T) {
1372+
r := require.New(t)
1373+
1374+
result := filterVolatileFields([]byte(tt.input))
1375+
1376+
var filtered map[string]interface{}
1377+
err := json.Unmarshal(result, &filtered)
1378+
r.NoError(err)
1379+
1380+
for _, key := range tt.shouldExist {
1381+
_, exists := filtered[key]
1382+
r.True(exists, "expected key %q to exist", key)
1383+
}
1384+
1385+
for _, key := range tt.shouldGone {
1386+
_, exists := filtered[key]
1387+
r.False(exists, "expected key %q to be removed", key)
1388+
}
1389+
})
1390+
}
1391+
}

0 commit comments

Comments
 (0)