@@ -109,7 +109,7 @@ func (r *EgressWatcher) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
109109}
110110
111111func  (r  * EgressWatcher ) reconcileEgressClient (ctx  context.Context , eg  * coilv2.Egress , pod  * corev1.Pod , logger  * logr.Logger ) error  {
112- 	hook , err  :=  r .getHook (ctx , eg , logger )
112+ 	hooks , err  :=  r .getHooks (ctx , eg , logger )
113113	if  err  !=  nil  {
114114		return  fmt .Errorf ("failed to setup NAT hook: %w" , err )
115115	}
@@ -125,8 +125,11 @@ func (r *EgressWatcher) reconcileEgressClient(ctx context.Context, eg *coilv2.Eg
125125			ipv6  =  ip .To16 ()
126126		}
127127	}
128- 	if  err  :=  r .PodNet .Update (ipv4 , ipv6 , hook , pod ); err  !=  nil  {
129- 		return  fmt .Errorf ("failed to update NAT configuration: %w" , err )
128+ 
129+ 	for  _ , hook  :=  range  hooks  {
130+ 		if  err  :=  r .PodNet .Update (ipv4 , ipv6 , hook , pod ); err  !=  nil  {
131+ 			return  fmt .Errorf ("failed to update NAT configuration: %w" , err )
132+ 		}
130133	}
131134
132135	return  nil 
@@ -138,49 +141,39 @@ type gwNets struct {
138141	sportAuto  bool 
139142}
140143
141- func  (r  * EgressWatcher ) getHook (ctx  context.Context , eg  * coilv2.Egress , logger  * logr.Logger ) (nodenet.SetupHook , error ) {
144+ func  (r  * EgressWatcher ) getHooks (ctx  context.Context , eg  * coilv2.Egress , logger  * logr.Logger ) ([] nodenet.SetupHook , error ) {
142145	var  gw  gwNets 
143146	svc  :=  & corev1.Service {}
144147
145148	if  err  :=  r .Get (ctx , client.ObjectKey {Namespace : eg .Namespace , Name : eg .Name }, svc ); err  !=  nil  {
146149		return  nil , err 
147150	}
148151
149- 	// See getHook in coild_server.go 
150- 	svcIP  :=  net .ParseIP (svc .Spec .ClusterIP )
151- 	if  svcIP  ==  nil  {
152- 		return  nil , fmt .Errorf ("invalid ClusterIP in Service %s %s" , eg .Name , svc .Spec .ClusterIP )
153- 	}
154- 	var  subnets  []* net.IPNet 
155- 	if  ip4  :=  svcIP .To4 (); ip4  !=  nil  {
156- 		svcIP  =  ip4 
157- 		for  _ , sn  :=  range  eg .Spec .Destinations  {
158- 			_ , subnet , err  :=  net .ParseCIDR (sn )
159- 			if  err  !=  nil  {
160- 				return  nil , fmt .Errorf ("invalid network in Egress %s" , eg .Name )
161- 			}
162- 			if  subnet .IP .To4 () !=  nil  {
163- 				subnets  =  append (subnets , subnet )
164- 			}
152+ 	hooks  :=  []nodenet.SetupHook {}
153+ 	for  _ , clusterIP  :=  range  svc .Spec .ClusterIPs  {
154+ 		var  subnets  []* net.IPNet 
155+ 		svcIP  :=  net .ParseIP (clusterIP )
156+ 		if  svcIP  ==  nil  {
157+ 			return  nil , fmt .Errorf ("invalid ClusterIP in Service %s %s" , eg .Name , svc .Spec .ClusterIP )
165158		}
166- 	}  else  { 
159+ 
167160		for  _ , sn  :=  range  eg .Spec .Destinations  {
168161			_ , subnet , err  :=  net .ParseCIDR (sn )
169162			if  err  !=  nil  {
170163				return  nil , fmt .Errorf ("invalid network in Egress %s" , eg .Name )
171164			}
172- 			if  subnet .IP .To4 () ==  nil  {
165+ 			if  ( svcIP . To4 ()  !=   nil )  ==  ( subnet .IP .To4 () !=  nil )  {
173166				subnets  =  append (subnets , subnet )
174167			}
175168		}
176- 	}
177169
178- 	if  len (subnets ) >  0  {
179- 		gw  =  gwNets {gateway : svcIP , networks : subnets , sportAuto : eg .Spec .FouSourcePortAuto }
180- 		return  r .hook (gw , logger ), nil 
170+ 		if  len (subnets ) >  0  {
171+ 			gw  =  gwNets {gateway : svcIP , networks : subnets , sportAuto : eg .Spec .FouSourcePortAuto }
172+ 			hooks  =  append (hooks , r .hook (gw , logger ))
173+ 		}
181174	}
182175
183- 	return  nil , nil 
176+ 	return  hooks , nil 
184177}
185178
186179func  (r  * EgressWatcher ) hook (gwn  gwNets , log  * logr.Logger ) func (ipv4 , ipv6  net.IP ) error  {
0 commit comments