@@ -67,17 +67,27 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
67
67
// when ingress is added, install rule to loxilb-ingress
68
68
models , err := r .createLoxiModelList (ctx , ingress )
69
69
if err != nil {
70
- logger .Error (err , "Failed to set ingress. failed to create loxilb loadbalancer model" , "ingress " , ingress )
70
+ logger .Error (err , "Failed to set ingress. failed to create loxilb loadbalancer model" , "[]loxiapi.LoadBalancerModel " , models )
71
71
}
72
72
73
+ logger .V (4 ).Info ("createLoxiModelList return models:" , "[]loxiapi.LoadBalancerModel" , models )
74
+
73
75
for _ , model := range models {
74
76
err = r .LoxiClient .LoadBalancer ().Create (ctx , & model )
75
77
if err != nil {
76
- logger .Error (err , "Failed to set ingress. failed to install loadbalancer rule to loxilb" , "ingress" , ingress )
77
- return ctrl.Result {}, err
78
+ if err .Error () != "lbrule-exists error" {
79
+ logger .Error (err , "Failed to set ingress. failed to install loadbalancer rule to loxilb" , "loxiapi.LoadBalancerModel" , model )
80
+ return ctrl.Result {}, err
81
+ }
78
82
}
79
83
}
80
84
85
+ if err := r .updateIngressStatus (ctx , ingress ); err != nil {
86
+ logger .Error (err , "Failed to update ingress status." , "ingress" , ingress )
87
+ return ctrl.Result {}, err
88
+ }
89
+
90
+ logger .Info ("This resource is created" , "ingress" , ingress )
81
91
return ctrl.Result {}, nil
82
92
}
83
93
@@ -124,6 +134,10 @@ func (r *LoxilbIngressReconciler) createLoxiLoadBalancerEndpoints(ctx context.Co
124
134
}
125
135
}
126
136
137
+ if len (loxilbEpList ) == 0 {
138
+ return loxilbEpList , fmt .Errorf ("backend %s/%s service has no endpoint now" , ns , name )
139
+ }
140
+
127
141
return loxilbEpList , nil
128
142
}
129
143
@@ -178,6 +192,52 @@ func (r *LoxilbIngressReconciler) createLoxiModelList(ctx context.Context, ingre
178
192
return models , nil
179
193
}
180
194
195
+ func (r * LoxilbIngressReconciler ) updateIngressStatus (ctx context.Context , ingress * netv1.Ingress ) error {
196
+ lbSvcKey := types.NamespacedName {}
197
+ if gwProvider , isok := ingress .Annotations ["gateway-api-controller" ]; isok {
198
+ if gwProvider == "loxilb.io/loxilb" {
199
+ lbSvcKey .Namespace = ingress .Annotations ["parent-gateway-namespace" ]
200
+ lbSvcKey .Name = fmt .Sprintf ("%s-ingress-service" , ingress .Annotations ["parent-gateway" ])
201
+ }
202
+ } else {
203
+ if lbNs , isok := ingress .Annotations ["loadbalancer-service-namespace" ]; isok {
204
+ lbSvcKey .Namespace = lbNs
205
+ } else {
206
+ lbSvcKey .Namespace = "default"
207
+ }
208
+
209
+ if lbName , isok := ingress .Annotations ["loadbalancer-service" ]; isok {
210
+ lbSvcKey .Name = lbName
211
+ } else {
212
+ return fmt .Errorf ("ingress %s/%s has no information about loadbalancer service" , ingress .Namespace , ingress .Name )
213
+ }
214
+ }
215
+
216
+ svc := & corev1.Service {}
217
+ if err := r .Client .Get (ctx , lbSvcKey , svc ); err != nil {
218
+ return err
219
+ }
220
+
221
+ for _ , ing := range svc .Status .LoadBalancer .Ingress {
222
+ newIngressLoadBalancerIngress := netv1.IngressLoadBalancerIngress {
223
+ IP : ing .IP ,
224
+ Hostname : ing .Hostname ,
225
+ }
226
+ for _ , port := range ing .Ports {
227
+ newIngressPortStatus := netv1.IngressPortStatus {
228
+ Port : port .Port ,
229
+ Protocol : port .Protocol ,
230
+ Error : port .Error ,
231
+ }
232
+ newIngressLoadBalancerIngress .Ports = append (newIngressLoadBalancerIngress .Ports , newIngressPortStatus )
233
+ }
234
+
235
+ ingress .Status .LoadBalancer .Ingress = append (ingress .Status .LoadBalancer .Ingress , newIngressLoadBalancerIngress )
236
+ }
237
+
238
+ return r .Client .Status ().Update (ctx , ingress )
239
+ }
240
+
181
241
func (r * LoxilbIngressReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
182
242
checkIngClassNameFunc := func (ing * netv1.Ingress ) bool {
183
243
if ing .Spec .IngressClassName != nil {
@@ -192,10 +252,6 @@ func (r *LoxilbIngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
192
252
For (& netv1.Ingress {}).
193
253
WithEventFilter (predicate.Funcs {
194
254
UpdateFunc : func (e event.UpdateEvent ) bool {
195
- ing , ok := e .ObjectNew .(* netv1.Ingress )
196
- if ok {
197
- return checkIngClassNameFunc (ing )
198
- }
199
255
return false
200
256
},
201
257
DeleteFunc : func (e event.DeleteEvent ) bool {
0 commit comments