@@ -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+
10991131func 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