Skip to content

Commit 3b2c1d8

Browse files
committed
update ingress status && check endpoint
1 parent 5b28420 commit 3b2c1d8

File tree

1 file changed

+63
-7
lines changed

1 file changed

+63
-7
lines changed

managers/ingress.go

+63-7
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,27 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
6767
// when ingress is added, install rule to loxilb-ingress
6868
models, err := r.createLoxiModelList(ctx, ingress)
6969
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)
7171
}
7272

73+
logger.V(4).Info("createLoxiModelList return models:", "[]loxiapi.LoadBalancerModel", models)
74+
7375
for _, model := range models {
7476
err = r.LoxiClient.LoadBalancer().Create(ctx, &model)
7577
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+
}
7882
}
7983
}
8084

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)
8191
return ctrl.Result{}, nil
8292
}
8393

@@ -124,6 +134,10 @@ func (r *LoxilbIngressReconciler) createLoxiLoadBalancerEndpoints(ctx context.Co
124134
}
125135
}
126136

137+
if len(loxilbEpList) == 0 {
138+
return loxilbEpList, fmt.Errorf("backend %s/%s service has no endpoint now", ns, name)
139+
}
140+
127141
return loxilbEpList, nil
128142
}
129143

@@ -178,6 +192,52 @@ func (r *LoxilbIngressReconciler) createLoxiModelList(ctx context.Context, ingre
178192
return models, nil
179193
}
180194

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+
181241
func (r *LoxilbIngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
182242
checkIngClassNameFunc := func(ing *netv1.Ingress) bool {
183243
if ing.Spec.IngressClassName != nil {
@@ -192,10 +252,6 @@ func (r *LoxilbIngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
192252
For(&netv1.Ingress{}).
193253
WithEventFilter(predicate.Funcs{
194254
UpdateFunc: func(e event.UpdateEvent) bool {
195-
ing, ok := e.ObjectNew.(*netv1.Ingress)
196-
if ok {
197-
return checkIngClassNameFunc(ing)
198-
}
199255
return false
200256
},
201257
DeleteFunc: func(e event.DeleteEvent) bool {

0 commit comments

Comments
 (0)