/
predicates.go
71 lines (65 loc) · 2.07 KB
/
predicates.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright 2023 Dimitri Koshkin. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package controller
import (
"strings"
"github.com/go-logr/logr"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"github.com/dkoshkin/kubernetes-upgrader/internal/constants"
)
func ResourceNotPaused(logger logr.Logger) predicate.Funcs {
return predicate.Funcs{
UpdateFunc: func(e event.UpdateEvent) bool {
return processIfNotPaused(
logger.WithValues("predicate", "ResourceNotPaused", "eventType", "update"),
e.ObjectNew,
)
},
CreateFunc: func(e event.CreateEvent) bool {
return processIfNotPaused(
logger.WithValues("predicate", "ResourceNotPaused", "eventType", "create"),
e.Object,
)
},
DeleteFunc: func(e event.DeleteEvent) bool {
return processIfNotPaused(
logger.WithValues("predicate", "ResourceNotPaused", "eventType", "delete"),
e.Object,
)
},
GenericFunc: func(e event.GenericEvent) bool {
return processIfNotPaused(
logger.WithValues("predicate", "ResourceNotPaused", "eventType", "generic"),
e.Object,
)
},
}
}
func processIfNotPaused(logger logr.Logger, obj client.Object) bool {
kind := strings.ToLower(obj.GetObjectKind().GroupVersionKind().Kind)
log := logger.WithValues("namespace", obj.GetNamespace(), kind, obj.GetName())
objMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
log.Error(err, "error converting object to unstructured")
return true
}
paused, found, err := unstructured.NestedBool(objMap, "spec", "paused")
if err != nil {
log.Error(err, "error checking value spec.paused from object")
return true
}
if !found {
log.V(constants.LogLevelDebug).
Info("Resource does not have spec.paused, will attempt to map resource")
return true
}
if paused {
log.V(constants.LogLevelDebug).Info("Resource is paused, will not attempt to map resource")
return false
}
return true
}