Skip to content

Commit e8852fe

Browse files
committed
implement deletionOptions
Signed-off-by: Markus Blaschke <mblaschke82@gmail.com>
1 parent 9bef6ae commit e8852fe

File tree

5 files changed

+62
-9
lines changed

5 files changed

+62
-9
lines changed

example.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ ttl:
2121
# this rule will match ALL resources, !BE CAREFUL!
2222
# - {group: "*", version: "*", kind: "*"}
2323

24+
deleteOptions:
25+
propagationPolicy: foreground # Foreground, Background, Orphan or empty
26+
gracePeriodSeconds: 120 # seconds
27+
2428
#################################################
2529
## static rules
2630
## applies a fixed TTLs against resources metadata.creationTimestamp (or JMESpath timestampPath)
@@ -95,6 +99,10 @@ rules:
9599
matchLabels:
96100
foo: bar
97101

102+
deleteOptions:
103+
propagationPolicy: foreground # Foreground, Background, Orphan or empty
104+
gracePeriodSeconds: 120 # seconds
105+
98106
# kubernetes selector (matchLabels, matchExpressions), optional
99107
# if a namespaceSelector is active only namespaced resources will be checked
100108
# !! be careful !!

kube_janitor/config.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ type (
2121
Annotation string `json:"annotation"`
2222
Label string `json:"label"`
2323
Resources ConfigResourceList `json:"resources"`
24+
25+
DeleteOptions ConfigRuleDeleteOptions `json:"deleteOptions"`
2426
}
2527

2628
ConfigResourceList []*ConfigResource
@@ -39,8 +41,17 @@ type (
3941
Resources ConfigResourceList `json:"resources"`
4042
NamespaceSelector ConfigLabelSelector `json:"namespaceSelector"`
4143
Ttl string `json:"ttl"`
44+
45+
DeleteOptions ConfigRuleDeleteOptions `json:"deleteOptions"`
4246
}
4347

48+
ConfigRuleDeleteOptions struct {
49+
PropagationPolicy *ConfigRuleDeletePropagationPolicy `json:"propagationPolicy"`
50+
GracePeriodSeconds *int64 `json:"gracePeriodSeconds"`
51+
}
52+
53+
ConfigRuleDeletePropagationPolicy metav1.DeletionPropagation
54+
4455
ConfigLabelSelector struct {
4556
metav1.LabelSelector `json:",inline"`
4657
selector *string
@@ -80,6 +91,10 @@ func (c *ConfigTtl) Validate() error {
8091
}
8192
}
8293

94+
if err := c.DeleteOptions.PropagationPolicy.validate(); err != nil {
95+
return err
96+
}
97+
8398
return nil
8499
}
85100

@@ -93,6 +108,10 @@ func (c *ConfigRule) Validate() error {
93108
return errors.New("rules requires at least one resource")
94109
}
95110

111+
if err := c.DeleteOptions.PropagationPolicy.validate(); err != nil {
112+
return err
113+
}
114+
96115
return nil
97116
}
98117

@@ -160,3 +179,19 @@ func (selector *ConfigLabelSelector) Compile() (string, error) {
160179

161180
return *selector.selector, nil
162181
}
182+
183+
// validate validates the deletion PropagationPolicy
184+
func (p *ConfigRuleDeletePropagationPolicy) validate() error {
185+
if p == nil {
186+
return nil
187+
}
188+
189+
switch metav1.DeletionPropagation(*p) {
190+
case "", metav1.DeletePropagationForeground, metav1.DeletePropagationBackground, metav1.DeletePropagationOrphan:
191+
// ok
192+
default:
193+
return errors.New("propagation policy must be Foreground, Background, or Orphan")
194+
}
195+
196+
return nil
197+
}

kube_janitor/manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (j *Janitor) LoadConfigFromFile(path string) *Janitor {
121121
logger.Info("parsing configuration")
122122
err = yaml.UnmarshalContext(parserCtx, data, j.config, yaml.Strict(), yaml.UseJSONUnmarshaler())
123123
if err != nil {
124-
logger.Fatal("failed to parse config file")
124+
logger.Fatal("failed to parse config file", slog.Any("error", err.Error()))
125125
}
126126

127127
err = j.config.Validate()

kube_janitor/task.common.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (j *Janitor) runRule(ctx context.Context, logger *slogger.Logger, rule *Con
7575
gvkLogger,
7676
resourceType,
7777
resource,
78-
rule.Id,
78+
rule,
7979
ttl,
8080
metricList,
8181
)
@@ -92,7 +92,7 @@ func (j *Janitor) runRule(ctx context.Context, logger *slogger.Logger, rule *Con
9292
}
9393

9494
// checkResourceTtlAndTriggerDeleteIfExpired checks the resource against the defined TTL and deletes if the resource is expired
95-
func (j *Janitor) checkResourceTtlAndTriggerDeleteIfExpired(ctx context.Context, logger *slogger.Logger, resourceConfig *ConfigResource, resource unstructured.Unstructured, ruleId string, ttlValue string, metricResourceTtl *prometheusCommon.MetricList) error {
95+
func (j *Janitor) checkResourceTtlAndTriggerDeleteIfExpired(ctx context.Context, logger *slogger.Logger, resourceConfig *ConfigResource, resource unstructured.Unstructured, rule *ConfigRule, ttlValue string, metricResourceTtl *prometheusCommon.MetricList) error {
9696
resourceLogger := logger.WithGroup("resource").With(
9797
slog.String("namespace", resource.GetNamespace()),
9898
slog.String("name", resource.GetName()),
@@ -149,22 +149,31 @@ func (j *Janitor) checkResourceTtlAndTriggerDeleteIfExpired(ctx context.Context,
149149
resourceLogger.Info("resource is expired, would delete resource (DRY-RUN)", slog.Time("expirationDate", *parsedDate))
150150
} else {
151151
resourceLogger.Info("deleting expired resource", slog.Time("expirationDate", *parsedDate))
152-
err := j.dynClient.Resource(resourceConfig.AsGVR()).Namespace(resource.GetNamespace()).Delete(ctx, resource.GetName(), metav1.DeleteOptions{})
152+
deleteOpts := metav1.DeleteOptions{}
153+
if rule.DeleteOptions.PropagationPolicy != nil {
154+
propagationPolicy := metav1.DeletionPropagation(*rule.DeleteOptions.PropagationPolicy)
155+
deleteOpts.PropagationPolicy = &propagationPolicy
156+
}
157+
if rule.DeleteOptions.GracePeriodSeconds != nil {
158+
deleteOpts.GracePeriodSeconds = rule.DeleteOptions.GracePeriodSeconds
159+
}
160+
161+
err := j.dynClient.Resource(resourceConfig.AsGVR()).Namespace(resource.GetNamespace()).Delete(ctx, resource.GetName(), deleteOpts)
153162
if err != nil {
154163
return err
155164
}
156165

157166
// increase deleted counter
158167
j.prometheus.deleted.With(
159168
prometheus.Labels{
160-
"rule": ruleId,
169+
"rule": rule.Id,
161170
"groupVersionKind": fmt.Sprintf("%s/%s/%s", groupVersionKind.Group, groupVersionKind.Version, groupVersionKind.Kind),
162171
"namespace": resource.GetNamespace(),
163172
},
164173
).Inc()
165174

166175
reason := "TimeToLiveExpired"
167-
message := fmt.Sprintf(`TTL of "%v" is expired and resource is being deleted (%s)`, ttlValue, ruleId)
176+
message := fmt.Sprintf(`TTL of "%v" is expired and resource is being deleted (%s)`, ttlValue, rule.Id)
168177

169178
err = j.kubeCreateEventFromResource(ctx, resource.GetNamespace(), resource, message, reason)
170179
if err != nil {
@@ -176,7 +185,7 @@ func (j *Janitor) checkResourceTtlAndTriggerDeleteIfExpired(ctx context.Context,
176185

177186
metricResourceTtl.AddTime(
178187
prometheus.Labels{
179-
"rule": ruleId,
188+
"rule": rule.Id,
180189
"groupVersionKind": fmt.Sprintf("%s/%s/%s", groupVersionKind.Group, groupVersionKind.Version, groupVersionKind.Kind),
181190
"namespace": resource.GetNamespace(),
182191
"name": resource.GetName(),

kube_janitor/task.ttl.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ func (j *Janitor) runTtlResources(ctx context.Context) error {
4646

4747
// faked rule for ttl handling
4848
rule := &ConfigRule{
49-
Id: RuleIdInternalTTL,
50-
Resources: j.config.Ttl.Resources,
49+
Id: RuleIdInternalTTL,
50+
Resources: j.config.Ttl.Resources,
51+
DeleteOptions: j.config.Ttl.DeleteOptions,
5152
}
5253

5354
err := j.runRule(ctx, j.logger, rule, metricResourceTtl, filterFunc)

0 commit comments

Comments
 (0)