kubernetes-operator/internal/controller/operator/dapr_controller_support.go

109 lines
2.4 KiB
Go

package operator
import (
"context"
"strconv"
"github.com/dapr-sandbox/dapr-kubernetes-operator/pkg/controller/predicates"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
"k8s.io/apimachinery/pkg/types"
ctrlCli "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)
func gcSelector(rc *ReconciliationRequest) (labels.Selector, error) {
namespace, err := labels.NewRequirement(
DaprReleaseNamespace,
selection.Equals,
[]string{rc.Resource.Namespace})
if err != nil {
return nil, errors.Wrap(err, "cannot determine release namespace requirement")
}
name, err := labels.NewRequirement(
DaprReleaseName,
selection.Equals,
[]string{rc.Resource.Name})
if err != nil {
return nil, errors.Wrap(err, "cannot determine release name requirement")
}
generation, err := labels.NewRequirement(
DaprReleaseGeneration,
selection.LessThan,
[]string{strconv.FormatInt(rc.Resource.Generation, 10)})
if err != nil {
return nil, errors.Wrap(err, "cannot determine generation requirement")
}
selector := labels.NewSelector().
Add(*namespace).
Add(*name).
Add(*generation)
return selector, nil
}
func labelsToRequest(_ context.Context, object ctrlCli.Object) []reconcile.Request {
allLabels := object.GetLabels()
if allLabels == nil {
return nil
}
name := allLabels[DaprReleaseName]
if name == "" {
return nil
}
namespace := allLabels[DaprReleaseNamespace]
if namespace == "" {
return nil
}
return []reconcile.Request{{
NamespacedName: types.NamespacedName{
Name: name,
Namespace: namespace,
},
}}
}
func dependantWithLabels(watchUpdate bool, watchDelete bool) predicate.Predicate {
return predicate.And(
&predicates.HasLabel{
Name: DaprReleaseName,
},
&predicates.HasLabel{
Name: DaprReleaseNamespace,
},
&predicates.DependentPredicate{
WatchUpdate: watchUpdate,
WatchDelete: watchDelete,
},
)
}
func ReleaseSelector() (labels.Selector, error) {
hasReleaseNameLabel, err := labels.NewRequirement(DaprReleaseName, selection.Exists, []string{})
if err != nil {
return nil, err
}
hasReleaseNamespaceLabel, err := labels.NewRequirement(DaprReleaseNamespace, selection.Exists, []string{})
if err != nil {
return nil, err
}
selector := labels.NewSelector().
Add(*hasReleaseNameLabel).
Add(*hasReleaseNamespaceLabel)
return selector, nil
}