@@ -2,11 +2,13 @@ package elbv2
2
2
3
3
import (
4
4
"context"
5
+ awssdk "github.com/aws/aws-sdk-go/aws"
5
6
"github.com/go-logr/logr"
6
7
"github.com/pkg/errors"
7
8
corev1 "k8s.io/api/core/v1"
9
+ "k8s.io/apimachinery/pkg/api/equality"
8
10
apierrors "k8s.io/apimachinery/pkg/api/errors"
9
- v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10
12
"k8s.io/apimachinery/pkg/util/wait"
11
13
elbv2api "sigs.k8s.io/aws-load-balancer-controller/apis/elbv2/v1beta1"
12
14
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
@@ -17,6 +19,8 @@ import (
17
19
)
18
20
19
21
const (
22
+ defaultWaitTGBObservedPollInterval = 200 * time .Millisecond
23
+ defaultWaitTGBObservedTimeout = 60 * time .Second
20
24
defaultWaitTGBDeletionPollInterval = 200 * time .Millisecond
21
25
defaultWaitTGBDeletionTimeout = 60 * time .Second
22
26
)
@@ -37,78 +41,81 @@ func NewDefaultTargetGroupBindingManager(k8sClient client.Client, trackingProvid
37
41
trackingProvider : trackingProvider ,
38
42
logger : logger ,
39
43
44
+ waitTGBObservedPollInterval : defaultWaitTGBObservedPollInterval ,
45
+ waitTGBObservedTimout : defaultWaitTGBObservedTimeout ,
40
46
waitTGBDeletionPollInterval : defaultWaitTGBDeletionPollInterval ,
41
47
waitTGBDeletionTimeout : defaultWaitTGBDeletionTimeout ,
42
48
}
43
49
}
44
50
45
51
var _ TargetGroupBindingManager = & defaultTargetGroupBindingManager {}
46
52
53
+ // default implementation for TargetGroupBindingManager.
47
54
type defaultTargetGroupBindingManager struct {
48
55
k8sClient client.Client
49
56
trackingProvider tracking.Provider
50
57
logger logr.Logger
51
58
59
+ waitTGBObservedPollInterval time.Duration
60
+ waitTGBObservedTimout time.Duration
52
61
waitTGBDeletionPollInterval time.Duration
53
62
waitTGBDeletionTimeout time.Duration
54
63
}
55
64
56
65
func (m * defaultTargetGroupBindingManager ) Create (ctx context.Context , resTGB * elbv2model.TargetGroupBindingResource ) (elbv2model.TargetGroupBindingResourceStatus , error ) {
57
- tgARN , err := resTGB . Spec . Template . Spec . TargetGroupARN . Resolve (ctx )
66
+ k8sTGBSpec , err := buildK8sTargetGroupBindingSpec (ctx , resTGB )
58
67
if err != nil {
59
68
return elbv2model.TargetGroupBindingResourceStatus {}, err
60
69
}
61
- stackLabels := m .trackingProvider .StackLabels (resTGB .Stack ())
62
- k8sTGBSpec := elbv2api.TargetGroupBindingSpec {
63
- TargetGroupARN : tgARN ,
64
- TargetType : resTGB .Spec .Template .Spec .TargetType ,
65
- ServiceRef : resTGB .Spec .Template .Spec .ServiceRef ,
66
- }
67
- if resTGB .Spec .Template .Spec .Networking != nil {
68
- k8sTGBNetworking , err := buildK8sTargetGroupBindingNetworking (ctx , * resTGB .Spec .Template .Spec .Networking )
69
- if err != nil {
70
- return elbv2model.TargetGroupBindingResourceStatus {}, err
71
- }
72
- k8sTGBSpec .Networking = & k8sTGBNetworking
73
- }
74
70
71
+ stackLabels := m .trackingProvider .StackLabels (resTGB .Stack ())
75
72
k8sTGB := & elbv2api.TargetGroupBinding {
76
- ObjectMeta : v1 .ObjectMeta {
73
+ ObjectMeta : metav1 .ObjectMeta {
77
74
Namespace : resTGB .Spec .Template .Namespace ,
78
75
Name : resTGB .Spec .Template .Name ,
79
76
Labels : stackLabels ,
80
77
},
81
78
Spec : k8sTGBSpec ,
82
79
}
80
+
81
+ m .logger .Info ("creating targetGroupBinding" ,
82
+ "stackID" , resTGB .Stack ().StackID (),
83
+ "resourceID" , resTGB .ID ())
83
84
if err := m .k8sClient .Create (ctx , k8sTGB ); err != nil {
84
85
return elbv2model.TargetGroupBindingResourceStatus {}, err
85
86
}
87
+ m .logger .Info ("created targetGroupBinding" ,
88
+ "stackID" , resTGB .Stack ().StackID (),
89
+ "resourceID" , resTGB .ID (),
90
+ "targetGroupBinding" , k8s .NamespacedName (k8sTGB ))
86
91
return buildResTargetGroupBindingStatus (k8sTGB ), nil
87
92
}
88
93
89
94
func (m * defaultTargetGroupBindingManager ) Update (ctx context.Context , resTGB * elbv2model.TargetGroupBindingResource , k8sTGB * elbv2api.TargetGroupBinding ) (elbv2model.TargetGroupBindingResourceStatus , error ) {
90
- tgARN , err := resTGB . Spec . Template . Spec . TargetGroupARN . Resolve (ctx )
95
+ k8sTGBSpec , err := buildK8sTargetGroupBindingSpec (ctx , resTGB )
91
96
if err != nil {
92
97
return elbv2model.TargetGroupBindingResourceStatus {}, err
93
98
}
94
- k8sTGBSpec := elbv2api.TargetGroupBindingSpec {
95
- TargetGroupARN : tgARN ,
96
- TargetType : resTGB .Spec .Template .Spec .TargetType ,
97
- ServiceRef : resTGB .Spec .Template .Spec .ServiceRef ,
98
- }
99
- if resTGB .Spec .Template .Spec .Networking != nil {
100
- k8sTGBNetworking , err := buildK8sTargetGroupBindingNetworking (ctx , * resTGB .Spec .Template .Spec .Networking )
101
- if err != nil {
102
- return elbv2model.TargetGroupBindingResourceStatus {}, err
103
- }
104
- k8sTGBSpec .Networking = & k8sTGBNetworking
99
+ if equality .Semantic .DeepEqual (k8sTGB .Spec , k8sTGBSpec ) {
100
+ return buildResTargetGroupBindingStatus (k8sTGB ), nil
105
101
}
106
102
107
103
oldK8sTGB := k8sTGB .DeepCopy ()
108
104
k8sTGB .Spec = k8sTGBSpec
105
+ m .logger .Info ("modifying targetGroupBinding" ,
106
+ "stackID" , resTGB .Stack ().StackID (),
107
+ "resourceID" , resTGB .ID (),
108
+ "targetGroupBinding" , k8s .NamespacedName (k8sTGB ))
109
109
if err := m .k8sClient .Patch (ctx , k8sTGB , client .MergeFrom (oldK8sTGB )); err != nil {
110
110
return elbv2model.TargetGroupBindingResourceStatus {}, err
111
111
}
112
+ if err := m .waitUntilTargetGroupBindingObserved (ctx , k8sTGB ); err != nil {
113
+ return elbv2model.TargetGroupBindingResourceStatus {}, err
114
+ }
115
+ m .logger .Info ("modified targetGroupBinding" ,
116
+ "stackID" , resTGB .Stack ().StackID (),
117
+ "resourceID" , resTGB .ID (),
118
+ "targetGroupBinding" , k8s .NamespacedName (k8sTGB ))
112
119
return buildResTargetGroupBindingStatus (k8sTGB ), nil
113
120
}
114
121
@@ -126,6 +133,23 @@ func (m *defaultTargetGroupBindingManager) Delete(ctx context.Context, tgb *elbv
126
133
return nil
127
134
}
128
135
136
+ func (m * defaultTargetGroupBindingManager ) waitUntilTargetGroupBindingObserved (ctx context.Context , tgb * elbv2api.TargetGroupBinding ) error {
137
+ ctx , cancel := context .WithTimeout (ctx , m .waitTGBObservedTimout )
138
+ defer cancel ()
139
+
140
+ observedTGB := & elbv2api.TargetGroupBinding {}
141
+ return wait .PollImmediateUntil (m .waitTGBObservedPollInterval , func () (bool , error ) {
142
+ if err := m .k8sClient .Get (ctx , k8s .NamespacedName (tgb ), observedTGB ); err != nil {
143
+ return false , err
144
+ }
145
+ if awssdk .Int64Value (observedTGB .Status .ObservedGeneration ) >= tgb .Generation {
146
+ return true , nil
147
+ }
148
+
149
+ return false , nil
150
+ }, ctx .Done ())
151
+ }
152
+
129
153
func (m * defaultTargetGroupBindingManager ) waitUntilTargetGroupBindingDeleted (ctx context.Context , tgb * elbv2api.TargetGroupBinding ) error {
130
154
ctx , cancel := context .WithTimeout (ctx , m .waitTGBDeletionTimeout )
131
155
defer cancel ()
@@ -142,6 +166,28 @@ func (m *defaultTargetGroupBindingManager) waitUntilTargetGroupBindingDeleted(ct
142
166
}, ctx .Done ())
143
167
}
144
168
169
+ func buildK8sTargetGroupBindingSpec (ctx context.Context , resTGB * elbv2model.TargetGroupBindingResource ) (elbv2api.TargetGroupBindingSpec , error ) {
170
+ tgARN , err := resTGB .Spec .Template .Spec .TargetGroupARN .Resolve (ctx )
171
+ if err != nil {
172
+ return elbv2api.TargetGroupBindingSpec {}, err
173
+ }
174
+
175
+ k8sTGBSpec := elbv2api.TargetGroupBindingSpec {
176
+ TargetGroupARN : tgARN ,
177
+ TargetType : resTGB .Spec .Template .Spec .TargetType ,
178
+ ServiceRef : resTGB .Spec .Template .Spec .ServiceRef ,
179
+ }
180
+
181
+ if resTGB .Spec .Template .Spec .Networking != nil {
182
+ k8sTGBNetworking , err := buildK8sTargetGroupBindingNetworking (ctx , * resTGB .Spec .Template .Spec .Networking )
183
+ if err != nil {
184
+ return elbv2api.TargetGroupBindingSpec {}, err
185
+ }
186
+ k8sTGBSpec .Networking = & k8sTGBNetworking
187
+ }
188
+ return k8sTGBSpec , nil
189
+ }
190
+
145
191
func buildK8sTargetGroupBindingNetworking (ctx context.Context , resTGBNetworking elbv2model.TargetGroupBindingNetworking ) (elbv2api.TargetGroupBindingNetworking , error ) {
146
192
k8sIngress := make ([]elbv2api.NetworkingIngressRule , 0 , len (resTGBNetworking .Ingress ))
147
193
for _ , rule := range resTGBNetworking .Ingress {
0 commit comments