Skip to content

Commit

Permalink
Delete generate PrometheusRule by setting OwnerReferences
Browse files Browse the repository at this point in the history
By setting owner references on the object we create, kubernetes will
handle deletion of the generated PrometheusRule when the corresponding
ServiceLevelObjective is deleted.

Example:

        k apply -f examples/pyrra-http-errors.yaml
        servicelevelobjective.pyrra.dev/pyrra-api-errors created

we see that the controller generates a prometheusrule object:

        k get prometheusrule,servicelevelobjective -n monitoring
        NAME                                                    AGE
        prometheusrule.monitoring.coreos.com/pyrra-api-errors   1s
        servicelevelobjective.pyrra.dev/pyrra-api-errors        1s

when we delete the SLO, the matching rule is deleted:

        k delete servicelevelobjective.pyrra.dev/pyrra-api-errors -n monitoring

        k get prometheusrule,servicelevelobjective -n monitoring
        No resources found in monitoring namespace.

Updates pyrra-dev#39
  • Loading branch information
chlunde committed Nov 23, 2021
1 parent cd12ee8 commit 15e00d4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
10 changes: 10 additions & 0 deletions kubernetes/controllers/servicelevelobjective.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ func makePrometheusRule(kubeObjective pyrrav1alpha1.ServiceLevelObjective) (*mon
return nil, err
}

isController := true
return &monitoringv1.PrometheusRule{
TypeMeta: metav1.TypeMeta{
Kind: monitoringv1.PrometheusRuleKind,
Expand All @@ -105,6 +106,15 @@ func makePrometheusRule(kubeObjective pyrrav1alpha1.ServiceLevelObjective) (*mon
Name: kubeObjective.GetName(),
Namespace: kubeObjective.GetNamespace(),
Labels: kubeObjective.GetLabels(),
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: kubeObjective.APIVersion,
Kind: kubeObjective.Kind,
Name: kubeObjective.Name,
UID: kubeObjective.UID,
Controller: &isController,
},
},
},
Spec: monitoringv1.PrometheusRuleSpec{
Groups: []monitoringv1.RuleGroup{group},
Expand Down
19 changes: 18 additions & 1 deletion kubernetes/controllers/servicelevelobjective_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,22 @@ import (
)

func Test_makePrometheusRule(t *testing.T) {
trueBool := true
tests := []struct {
name string
objective pyrrav1alpha1.ServiceLevelObjective
rules *monitoringv1.PrometheusRule
}{{
name: "http",
objective: pyrrav1alpha1.ServiceLevelObjective{
ObjectMeta: metav1.ObjectMeta{Name: "http"},
TypeMeta: metav1.TypeMeta{
APIVersion: pyrrav1alpha1.GroupVersion.Version,
Kind: "ServiceLevelObjective",
},
ObjectMeta: metav1.ObjectMeta{
Name: "http",
UID: "123",
},
Spec: pyrrav1alpha1.ServiceLevelObjectiveSpec{
Target: "99.5",
Window: model.Duration(28 * 24 * time.Hour),
Expand All @@ -44,6 +52,15 @@ func Test_makePrometheusRule(t *testing.T) {
},
ObjectMeta: metav1.ObjectMeta{
Name: "http",
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: pyrrav1alpha1.GroupVersion.Version,
Kind: "ServiceLevelObjective",
Name: "http",
UID: "123",
Controller: &trueBool,
},
},
},
Spec: monitoringv1.PrometheusRuleSpec{
Groups: []monitoringv1.RuleGroup{{
Expand Down

0 comments on commit 15e00d4

Please sign in to comment.