This repository has been archived by the owner on Oct 21, 2021. It is now read-only.
/
progressiverollout_controller_watches.go
128 lines (110 loc) · 4.37 KB
/
progressiverollout_controller_watches.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package controllers
import (
"context"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"github.com/go-logr/logr"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
"github.com/maruina/argocd-progressive-rollout-controller/components"
deploymentv1alpha1 "github.com/maruina/argocd-progressive-rollout-controller/api/v1alpha1"
)
// applicationWatchMapper is a support struct to filter Application events based on their owner
type applicationWatchMapper struct {
client.Client
Log logr.Logger
}
// secretWatchMapper is a support struct to filter Secret events
type secretWatchMapper struct {
client.Client
Log logr.Logger
}
// Map maps an Application event to the matching ProgressiveRollout object
func (a *applicationWatchMapper) Map(app handler.MapObject) []reconcile.Request {
var requests []reconcile.Request
pr, err := a.ListMatchingProgressiveRollout(a.Client, app.Meta)
if err != nil {
a.Log.Error(err, "error calling ListMatchingProgressiveRollout")
return requests
}
if pr != nil {
a.Log.V(1).Info("application event matched with a progressiverollout", "app", app.Meta.GetName(), "pr", pr.Name)
requests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{
Name: pr.Name,
Namespace: pr.Namespace,
}})
}
return requests
}
// ListMatchingProgressiveRollout filters the Application by looking at the OwnerReference
// and returns the ProgressiveRollout referencing it
func (a *applicationWatchMapper) ListMatchingProgressiveRollout(c client.Client, app metav1.Object) (*deploymentv1alpha1.ProgressiveRollout, error) {
allProgressiveRollout := &deploymentv1alpha1.ProgressiveRolloutList{}
err := c.List(context.Background(), allProgressiveRollout, &client.ListOptions{Namespace: app.GetNamespace()})
if err != nil {
return nil, err
}
// Check if the Application owner is reference by any ProgressiveRollout
for _, pr := range allProgressiveRollout.Items {
for _, owner := range app.GetOwnerReferences() {
if pr.Spec.SourceRef.Kind == owner.Kind && pr.Spec.SourceRef.Name == owner.Name && *pr.Spec.SourceRef.APIGroup == owner.APIVersion {
return &pr, nil
}
}
}
// No match
return nil, nil
}
// Map maps a Secret event to the matching ProgressiveRollout object
func (s *secretWatchMapper) Map(app handler.MapObject) []reconcile.Request {
var requests []reconcile.Request
pr, err := s.ListMatchingProgressiveRollout(s.Client, app.Meta)
if err != nil {
s.Log.Error(err, "error calling ListMatchingProgressiveRollout")
return requests
}
if pr != nil {
s.Log.V(1).Info("application event matched with a progressiverollout", "app", app.Meta.GetName(), "pr", pr.Name)
requests = append(requests, reconcile.Request{NamespacedName: types.NamespacedName{
Name: pr.Name,
Namespace: pr.Namespace,
}})
}
return requests
}
// ListMatchingProgressiveRollout filters the Secret by looking at which Progressive Rollout Cluster or Requeue selector match
func (s *secretWatchMapper) ListMatchingProgressiveRollout(c client.Client, secret metav1.Object) (*deploymentv1alpha1.ProgressiveRollout, error) {
allProgressiveRollout := &deploymentv1alpha1.ProgressiveRolloutList{}
err := c.List(context.Background(), allProgressiveRollout, &client.ListOptions{Namespace: secret.GetNamespace()})
if err != nil {
return nil, err
}
// Check if the ProgressiveRollout selector match with the event object
for _, pr := range allProgressiveRollout.Items {
for _, stage := range pr.Spec.Stages {
clusterList, err := components.GetSecretListFromSelector(context.Background(), s.Client, &stage.Clusters.Selector)
if err != nil {
return nil, err
}
for _, c := range clusterList.Items {
if c.Name == secret.GetName() {
s.Log.V(1).Info("secret event matched with a progressiverollout", "secret", secret.GetName(), "selector", "cluster", "pr", pr.Name)
return &pr, nil
}
}
requeueList, err := components.GetSecretListFromSelector(context.Background(), s.Client, &stage.Requeue.Selector)
if err != nil {
return nil, err
}
for _, c := range requeueList.Items {
if c.Name == secret.GetName() {
s.Log.V(1).Info("secret event matched with a progressiverollout", "secret", secret.GetName(), "selector", "requeue", "pr", pr.Name)
return &pr, nil
}
}
}
}
// No match
return nil, nil
}