Skip to content

Commit dc5130b

Browse files
Merge pull request #10 from TrekkieCoder/main
PR: support for change in deployment endpoints
2 parents 4ca4834 + ef92107 commit dc5130b

File tree

3 files changed

+84
-13
lines changed

3 files changed

+84
-13
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module loxilb.io/loxilb-ingress-manager
33
go 1.23.0
44

55
require (
6-
github.com/loxilb-io/kube-loxilb v0.9.6-0.20240724081844-310d8829b72f
6+
github.com/loxilb-io/kube-loxilb v0.9.7-0.20241004024038-4b8ffe3b0ef9
77
k8s.io/api v0.30.3
88
k8s.io/apimachinery v0.30.3
99
k8s.io/client-go v0.30.3

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
6464
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
6565
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
6666
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
67-
github.com/loxilb-io/kube-loxilb v0.9.6-0.20240724081844-310d8829b72f h1:epj7PKKn49bPJXC4/ZseppGumBje5YSwd6l/zSR1q1I=
68-
github.com/loxilb-io/kube-loxilb v0.9.6-0.20240724081844-310d8829b72f/go.mod h1:ShMJ6ylhEeWRGSnqoAWxuJ44K2I7zJAUH0s3gkJELRA=
67+
github.com/loxilb-io/kube-loxilb v0.9.7-0.20241004024038-4b8ffe3b0ef9 h1:yw4M9mAM0IDg2+yA3DqwrN3HuLfWGMquKcnr7u8UmXg=
68+
github.com/loxilb-io/kube-loxilb v0.9.7-0.20241004024038-4b8ffe3b0ef9/go.mod h1:+hSZ4/dswNl/RVQFbIefYqCbrh0XA7m6d9yY6QF9Lx0=
6969
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
7070
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
7171
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=

managers/ingress.go

+81-10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package managers
1919
import (
2020
"context"
2121
"fmt"
22+
"time"
2223

2324
corev1 "k8s.io/api/core/v1"
2425
netv1 "k8s.io/api/networking/v1"
@@ -47,15 +48,40 @@ type LoxilbIngressReconciler struct {
4748
func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
4849
logger := log.FromContext(ctx)
4950

51+
ruleName := fmt.Sprintf("%s_%s", req.Namespace, req.Name)
52+
ruleNameHTTPS := fmt.Sprintf("%s_%s_https", req.Namespace, req.Name)
53+
54+
currLBList, err := r.LoxiClient.LoadBalancer().List(ctx)
55+
if err != nil {
56+
logger.Info("Failed to get existing loxilb-ingress rules")
57+
return ctrl.Result{}, err
58+
}
59+
60+
exist := false
61+
existHTTPS := false
62+
for _, lbItem := range currLBList.Item {
63+
if lbItem.Service.Name == ruleName {
64+
exist = true
65+
} else if lbItem.Service.Name == ruleNameHTTPS {
66+
existHTTPS = true
67+
}
68+
}
69+
5070
ingress := &netv1.Ingress{}
51-
err := r.Client.Get(ctx, req.NamespacedName, ingress)
71+
err = r.Client.Get(ctx, req.NamespacedName, ingress)
5272
if err != nil {
5373
// Ingress is deleted.
5474
if errors.IsNotFound(err) {
5575
logger.Info("This resource is deleted", "Ingress", req.NamespacedName)
56-
ruleName := fmt.Sprintf("%s_%s", req.Namespace, req.Name)
57-
if err := r.LoxiClient.LoadBalancer().DeleteByName(ctx, ruleName); err != nil {
58-
logger.Error(err, "failed to delete loxilb-ingress rule "+ruleName)
76+
if exist {
77+
if err := r.LoxiClient.LoadBalancer().DeleteByName(ctx, ruleName); err != nil {
78+
logger.Error(err, "failed to delete loxilb-ingress rule "+ruleName)
79+
}
80+
}
81+
if existHTTPS {
82+
if err := r.LoxiClient.LoadBalancer().DeleteByName(ctx, ruleNameHTTPS); err != nil {
83+
logger.Error(err, "failed to delete loxilb-ingress rule "+ruleNameHTTPS)
84+
}
5985
}
6086
return ctrl.Result{}, nil
6187
}
@@ -67,13 +93,54 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
6793
// when ingress is added, install rule to loxilb-ingress
6894
models, err := r.createLoxiModelList(ctx, ingress)
6995
if err != nil {
96+
if exist {
97+
if err := r.LoxiClient.LoadBalancer().DeleteByName(ctx, ruleName); err == nil {
98+
logger.Info("deleted loxilb-ingress rule ", ruleName, "no endpoints")
99+
}
100+
}
101+
if existHTTPS {
102+
if err := r.LoxiClient.LoadBalancer().DeleteByName(ctx, ruleNameHTTPS); err == nil {
103+
logger.Info("deleted loxilb-ingress rule ", ruleNameHTTPS, "no endpoints")
104+
}
105+
}
70106
logger.Error(err, "Failed to set ingress. failed to create loxilb loadbalancer model", "[]loxiapi.LoadBalancerModel", models)
71107
return ctrl.Result{}, err
72108
}
73109

74-
logger.Info("createLoxiModelList return models:", "[]loxiapi.LoadBalancerModel", models)
75-
110+
var applyModels []loxiapi.LoadBalancerModel
111+
nextModel:
76112
for _, model := range models {
113+
for _, lbItem := range currLBList.Item {
114+
if lbItem.Service.Name == model.Service.Name && len(lbItem.Endpoints) == len(model.Endpoints) {
115+
match := true
116+
for _, mep := range model.Endpoints {
117+
epMatch := false
118+
for _, ep := range lbItem.Endpoints {
119+
if mep.EndpointIP == ep.EndpointIP && mep.TargetPort == ep.TargetPort {
120+
epMatch = true
121+
break
122+
}
123+
}
124+
if !epMatch {
125+
match = false
126+
break
127+
}
128+
}
129+
if match {
130+
continue nextModel
131+
}
132+
}
133+
}
134+
applyModels = append(applyModels, model)
135+
}
136+
137+
if len(applyModels) <= 0 {
138+
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
139+
}
140+
141+
logger.Info("createLoxiModelList return models:", "[]loxiapi.LoadBalancerModel", applyModels)
142+
143+
for _, model := range applyModels {
77144
err = r.LoxiClient.LoadBalancer().Create(ctx, &model)
78145
if err != nil {
79146
if err.Error() != "lbrule-exists error" {
@@ -88,7 +155,7 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
88155
}
89156

90157
logger.Info("This resource is created", "ingress", ingress)
91-
return ctrl.Result{}, nil
158+
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
92159
}
93160

94161
func (r *LoxilbIngressReconciler) createLoxiLoadBalancerService(ns, name, externalIP string, security int32, host string) loxiapi.LoadBalancerService {
@@ -141,7 +208,7 @@ func (r *LoxilbIngressReconciler) createLoxiLoadBalancerEndpoints(ctx context.Co
141208
return loxilbEpList, nil
142209
}
143210

144-
func (r *LoxilbIngressReconciler) checkTlsHost(host string, TLS []netv1.IngressTLS) bool {
211+
func (r *LoxilbIngressReconciler) checkTLSHost(host string, TLS []netv1.IngressTLS) bool {
145212
for _, tls := range TLS {
146213
for _, tlsHost := range tls.Hosts {
147214
if host == tlsHost {
@@ -170,11 +237,15 @@ func (r *LoxilbIngressReconciler) createLoxiModelList(ctx context.Context, ingre
170237
ns := r.getBackendServiceNamespace(ingress, name)
171238
port := path.Backend.Service.Port.Number
172239
security := int32(0)
173-
if r.checkTlsHost(rule.Host, ingress.Spec.TLS) {
240+
if r.checkTLSHost(rule.Host, ingress.Spec.TLS) {
174241
security = 1
175242
}
176243

177-
loxisvc := r.createLoxiLoadBalancerService(ingress.Namespace, ingress.Name, r.LoxiClient.Host, security, rule.Host)
244+
lbName := ingress.Name
245+
if security == 1 {
246+
lbName += "_https"
247+
}
248+
loxisvc := r.createLoxiLoadBalancerService(ingress.Namespace, lbName, r.LoxiClient.Host, security, rule.Host)
178249
loxiep, err := r.createLoxiLoadBalancerEndpoints(ctx, ns, name, port)
179250
if err != nil {
180251
return models, err

0 commit comments

Comments
 (0)