@@ -74,16 +74,12 @@ func (r *MSKTopicConfigRule) validateTopicConfig(runner tflint.Runner, topic *hc
74
74
return err
75
75
}
76
76
77
- configAttr , hasConfig := topic .Body .Attributes ["config" ]
78
- if ! hasConfig {
79
- err := runner .EmitIssue (
80
- r ,
81
- "missing config attribute: the topic configuration must be specified in a config attribute" ,
82
- topic .DefRange ,
83
- )
84
- if err != nil {
85
- return fmt .Errorf ("emitting issue: missing config block: %w" , err )
86
- }
77
+ configAttr , err := r .validateAndGetConfigAttr (runner , topic )
78
+ if err != nil {
79
+ return err
80
+ }
81
+
82
+ if configAttr == nil {
87
83
return nil
88
84
}
89
85
@@ -97,21 +93,61 @@ func (r *MSKTopicConfigRule) validateTopicConfig(runner tflint.Runner, topic *hc
97
93
return err
98
94
}
99
95
100
- cleanupPolicy , err := r .getAndValidateCleanupPolicy (runner , configAttr , configKeyToPairMap )
96
+ if err = r .validateCleanupPolicyConfig (runner , configAttr , configKeyToPairMap ); err != nil {
97
+ return err
98
+ }
99
+ return nil
100
+ }
101
+
102
+ func (r * MSKTopicConfigRule ) validateCleanupPolicyConfig (
103
+ runner tflint.Runner ,
104
+ configAttr * hclext.Attribute ,
105
+ configKeyToPairMap map [string ]hcl.KeyValuePair ,
106
+ ) error {
107
+ cleanupPolicy , err := r .getAndValidateCleanupPolicyValue (runner , configAttr , configKeyToPairMap )
101
108
if err != nil {
102
109
return err
103
110
}
111
+
104
112
switch cleanupPolicy {
105
113
case cleanupPolicyDelete :
106
114
if err := r .validateRetentionForDeletePolicy (runner , configAttr , configKeyToPairMap ); err != nil {
107
115
return err
108
116
}
109
117
case cleanupPolicyCompact :
110
- // todo: validate no retention & remote storage for compact
118
+ reason := "compacted topic"
119
+ if err := r .validateTieredStorageDisabled (runner , configKeyToPairMap , reason ); err != nil {
120
+ return err
121
+ }
122
+ if err := r .validateLocalRetentionNotDefined (runner , configKeyToPairMap , reason ); err != nil {
123
+ return err
124
+ }
125
+ if err := r .validateRetentionTimeNotDefined (runner , configKeyToPairMap , reason ); err != nil {
126
+ return err
127
+ }
111
128
}
112
129
return nil
113
130
}
114
131
132
+ func (r * MSKTopicConfigRule ) validateAndGetConfigAttr (
133
+ runner tflint.Runner ,
134
+ topic * hclext.Block ,
135
+ ) (* hclext.Attribute , error ) {
136
+ configAttr , hasConfig := topic .Body .Attributes ["config" ]
137
+ if ! hasConfig {
138
+ err := runner .EmitIssue (
139
+ r ,
140
+ "missing config attribute: the topic configuration must be specified in a config attribute" ,
141
+ topic .DefRange ,
142
+ )
143
+ if err != nil {
144
+ return nil , fmt .Errorf ("emitting issue: missing config block: %w" , err )
145
+ }
146
+ return nil , nil
147
+ }
148
+ return configAttr , nil
149
+ }
150
+
115
151
func constructConfigKeyToPairMap (configAttr * hclext.Attribute ) (map [string ]hcl.KeyValuePair , error ) {
116
152
configExpr , ok := configAttr .Expr .(* hclsyntax.ObjectConsExpr )
117
153
if ! ok {
@@ -258,7 +294,7 @@ var (
258
294
cleanupPolicyValidValues = []string {cleanupPolicyDelete , cleanupPolicyCompact }
259
295
)
260
296
261
- func (r * MSKTopicConfigRule ) getAndValidateCleanupPolicy (
297
+ func (r * MSKTopicConfigRule ) getAndValidateCleanupPolicyValue (
262
298
runner tflint.Runner ,
263
299
config * hclext.Attribute ,
264
300
configKeyToPairMap map [string ]hcl.KeyValuePair ,
@@ -349,11 +385,12 @@ func (r *MSKTopicConfigRule) validateRetentionForDeletePolicy(
349
385
return err
350
386
}
351
387
} else {
352
- if err := r .validateTieredStorageNotEnabled (runner , configKeyToPairMap ); err != nil {
388
+ reason := fmt .Sprintf ("less than %d days retention" , tieredStorageThresholdInDays )
389
+ if err := r .validateTieredStorageDisabled (runner , configKeyToPairMap , reason ); err != nil {
353
390
return err
354
391
}
355
392
356
- if err := r .validateLocalRetentionNotDefined (runner , configKeyToPairMap ); err != nil {
393
+ if err := r .validateLocalRetentionNotDefined (runner , configKeyToPairMap , reason ); err != nil {
357
394
return err
358
395
}
359
396
}
@@ -413,16 +450,17 @@ func (r *MSKTopicConfigRule) validateLocalRetentionDefined(
413
450
func (r * MSKTopicConfigRule ) validateLocalRetentionNotDefined (
414
451
runner tflint.Runner ,
415
452
configKeyToPairMap map [string ]hcl.KeyValuePair ,
453
+ reason string ,
416
454
) error {
417
455
localRetTimePair , hasLocalRetTimeAttr := configKeyToPairMap [localRetentionTimeAttr ]
418
456
if ! hasLocalRetTimeAttr {
419
457
return nil
420
458
}
421
459
422
460
msg := fmt .Sprintf (
423
- "defining %s is misleading when tiered storage is disabled due to less than %d days retention : removing it..." ,
461
+ "defining %s is misleading when tiered storage is disabled due to %s : removing it..." ,
424
462
localRetentionTimeAttr ,
425
- tieredStorageThresholdInDays ,
463
+ reason ,
426
464
)
427
465
err := runner .EmitIssueWithFix (r , msg , localRetTimePair .Value .Range (),
428
466
func (f tflint.Fixer ) error {
@@ -490,9 +528,10 @@ func (r *MSKTopicConfigRule) validateTieredStorageEnabled(
490
528
return nil
491
529
}
492
530
493
- func (r * MSKTopicConfigRule ) validateTieredStorageNotEnabled (
531
+ func (r * MSKTopicConfigRule ) validateTieredStorageDisabled (
494
532
runner tflint.Runner ,
495
533
configKeyToPairMap map [string ]hcl.KeyValuePair ,
534
+ reason string ,
496
535
) error {
497
536
tieredStoragePair , hasTieredStorageAttr := configKeyToPairMap [tieredStorageEnableAttr ]
498
537
@@ -511,8 +550,8 @@ func (r *MSKTopicConfigRule) validateTieredStorageNotEnabled(
511
550
}
512
551
513
552
msg := fmt .Sprintf (
514
- "tiered storage is not supported for less than %d days retention : disabling it..." ,
515
- tieredStorageThresholdInDays ,
553
+ "tiered storage is not supported for %s : disabling it..." ,
554
+ reason ,
516
555
)
517
556
err := runner .EmitIssueWithFix (r , msg , tieredStoragePair .Value .Range (),
518
557
func (f tflint.Fixer ) error {
@@ -573,3 +612,32 @@ func (r *MSKTopicConfigRule) getAndValidateRetentionTime(
573
612
}
574
613
return & retTimeIntVal , nil
575
614
}
615
+
616
+ func (r * MSKTopicConfigRule ) validateRetentionTimeNotDefined (
617
+ runner tflint.Runner ,
618
+ configKeyToPairMap map [string ]hcl.KeyValuePair ,
619
+ reason string ,
620
+ ) error {
621
+ retTimePair , hasRetTime := configKeyToPairMap [retentionTimeAttr ]
622
+ if ! hasRetTime {
623
+ return nil
624
+ }
625
+ msg := fmt .Sprintf ("defining %s is misleading for %s: removing it..." , retentionTimeAttr , reason )
626
+ keyRange := retTimePair .Key .Range ()
627
+
628
+ err := runner .EmitIssueWithFix (r , msg , keyRange ,
629
+ func (f tflint.Fixer ) error {
630
+ return f .Remove (
631
+ hcl.Range {
632
+ Filename : keyRange .Filename ,
633
+ Start : keyRange .Start ,
634
+ End : retTimePair .Value .Range ().End ,
635
+ },
636
+ )
637
+ },
638
+ )
639
+ if err != nil {
640
+ return fmt .Errorf ("emitting issue: retention time defined for compacted topic: %w" , err )
641
+ }
642
+ return nil
643
+ }
0 commit comments