@@ -19,6 +19,7 @@ package managers
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "time"
22
23
23
24
corev1 "k8s.io/api/core/v1"
24
25
netv1 "k8s.io/api/networking/v1"
@@ -47,15 +48,40 @@ type LoxilbIngressReconciler struct {
47
48
func (r * LoxilbIngressReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
48
49
logger := log .FromContext (ctx )
49
50
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
+
50
70
ingress := & netv1.Ingress {}
51
- err : = r .Client .Get (ctx , req .NamespacedName , ingress )
71
+ err = r .Client .Get (ctx , req .NamespacedName , ingress )
52
72
if err != nil {
53
73
// Ingress is deleted.
54
74
if errors .IsNotFound (err ) {
55
75
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
+ }
59
85
}
60
86
return ctrl.Result {}, nil
61
87
}
@@ -67,13 +93,54 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
67
93
// when ingress is added, install rule to loxilb-ingress
68
94
models , err := r .createLoxiModelList (ctx , ingress )
69
95
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
+ }
70
106
logger .Error (err , "Failed to set ingress. failed to create loxilb loadbalancer model" , "[]loxiapi.LoadBalancerModel" , models )
71
107
return ctrl.Result {}, err
72
108
}
73
109
74
- logger . Info ( "createLoxiModelList return models:" , " []loxiapi.LoadBalancerModel" , models )
75
-
110
+ var applyModels []loxiapi.LoadBalancerModel
111
+ nextModel:
76
112
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 {
77
144
err = r .LoxiClient .LoadBalancer ().Create (ctx , & model )
78
145
if err != nil {
79
146
if err .Error () != "lbrule-exists error" {
@@ -88,7 +155,7 @@ func (r *LoxilbIngressReconciler) Reconcile(ctx context.Context, req ctrl.Reques
88
155
}
89
156
90
157
logger .Info ("This resource is created" , "ingress" , ingress )
91
- return ctrl.Result {}, nil
158
+ return ctrl.Result {RequeueAfter : 30 * time . Second }, nil
92
159
}
93
160
94
161
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
141
208
return loxilbEpList , nil
142
209
}
143
210
144
- func (r * LoxilbIngressReconciler ) checkTlsHost (host string , TLS []netv1.IngressTLS ) bool {
211
+ func (r * LoxilbIngressReconciler ) checkTLSHost (host string , TLS []netv1.IngressTLS ) bool {
145
212
for _ , tls := range TLS {
146
213
for _ , tlsHost := range tls .Hosts {
147
214
if host == tlsHost {
@@ -170,11 +237,15 @@ func (r *LoxilbIngressReconciler) createLoxiModelList(ctx context.Context, ingre
170
237
ns := r .getBackendServiceNamespace (ingress , name )
171
238
port := path .Backend .Service .Port .Number
172
239
security := int32 (0 )
173
- if r .checkTlsHost (rule .Host , ingress .Spec .TLS ) {
240
+ if r .checkTLSHost (rule .Host , ingress .Spec .TLS ) {
174
241
security = 1
175
242
}
176
243
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 )
178
249
loxiep , err := r .createLoxiLoadBalancerEndpoints (ctx , ns , name , port )
179
250
if err != nil {
180
251
return models , err
0 commit comments