@@ -1110,7 +1110,7 @@ func servicePortToFrontend(service *v1.Service, loadbalancer *scwlb.LB, port v1.
11101110 }
11111111
11121112 return & scwlb.Frontend {
1113- Name : fmt .Sprintf ("%s_tcp_% d" , string (service .UID ), port .Port ),
1113+ Name : fmt .Sprintf ("%s_%s_% d" , string (service .UID ), strings . ToLower ( string ( port . Protocol ) ), port .Port ),
11141114 InboundPort : port .Port ,
11151115 TimeoutClient : & timeoutClient ,
11161116 ConnectionRateLimit : connectionRateLimit ,
@@ -1292,7 +1292,7 @@ func servicePortToBackend(service *v1.Service, loadbalancer *scwlb.LB, port v1.S
12921292 healthCheck .TransientCheckDelay = healthCheckTransientCheckDelay
12931293
12941294 backend := & scwlb.Backend {
1295- Name : fmt .Sprintf ("%s_tcp_% d" , string (service .UID ), port .NodePort ),
1295+ Name : fmt .Sprintf ("%s_%s_% d" , string (service .UID ), strings . ToLower ( string ( port . Protocol ) ), port .NodePort ),
12961296 Pool : nodeIPs ,
12971297 ForwardProtocol : protocol ,
12981298 SslBridging : & sslBridging ,
@@ -1330,25 +1330,30 @@ func servicePortToBackend(service *v1.Service, loadbalancer *scwlb.LB, port v1.S
13301330
13311331// serviceToLB converts a service definition to a list of load balancer frontends and backends
13321332func serviceToLB (service * v1.Service , loadbalancer * scwlb.LB , nodeIPs []string ) (map [int32 ]* scwlb.Frontend , map [int32 ]* scwlb.Backend , error ) {
1333- frontends := map [int32 ]* scwlb.Frontend {}
1334- backends := map [int32 ]* scwlb.Backend {}
1333+ tcpFrontends := map [int32 ]* scwlb.Frontend {}
1334+ tcpBackends := map [int32 ]* scwlb.Backend {}
13351335
13361336 for _ , port := range service .Spec .Ports {
1337- frontend , err := servicePortToFrontend (service , loadbalancer , port )
1337+ if port .Protocol != v1 .ProtocolTCP {
1338+ klog .V (3 ).Infof ("skipping unsupported protocol %s for port %d in service %s/%s" , port .Protocol , port .Port , service .Namespace , service .Name )
1339+ continue
1340+ }
1341+
1342+ tcpFrontend , err := servicePortToFrontend (service , loadbalancer , port )
13381343 if err != nil {
13391344 return nil , nil , fmt .Errorf ("failed to prepare frontend for port %d: %v" , port .Port , err )
13401345 }
13411346
1342- backend , err := servicePortToBackend (service , loadbalancer , port , nodeIPs )
1347+ tcpBackend , err := servicePortToBackend (service , loadbalancer , port , nodeIPs )
13431348 if err != nil {
13441349 return nil , nil , fmt .Errorf ("failed to prepare backend for port %d: %v" , port .Port , err )
13451350 }
13461351
1347- frontends [port .Port ] = frontend
1348- backends [port .NodePort ] = backend
1352+ tcpFrontends [port .Port ] = tcpFrontend
1353+ tcpBackends [port .NodePort ] = tcpBackend
13491354 }
13501355
1351- return frontends , backends , nil
1356+ return tcpFrontends , tcpBackends , nil
13521357}
13531358
13541359// frontendEquals returns true if the two frontends configuration are equal
@@ -1482,7 +1487,7 @@ func backendEquals(got, want *scwlb.Backend) bool {
14821487}
14831488
14841489type frontendOps struct {
1485- remove map [ int32 ]* scwlb.Frontend
1490+ remove [ ]* scwlb.Frontend
14861491 update map [int32 ]* scwlb.Frontend
14871492 create map [int32 ]* scwlb.Frontend
14881493 keep map [int32 ]* scwlb.Frontend
@@ -1491,42 +1496,42 @@ type frontendOps struct {
14911496// compareFrontends returns the frontends operation to do to achieve the wanted configuration
14921497// will ignore frontends with names not starting with the filterPrefix if provided
14931498func compareFrontends (got []* scwlb.Frontend , want map [int32 ]* scwlb.Frontend , filterPrefix string ) frontendOps {
1494- remove := make (map [ int32 ]* scwlb.Frontend )
1499+ remove := make ([ ]* scwlb.Frontend , 0 )
14951500 update := make (map [int32 ]* scwlb.Frontend )
14961501 create := make (map [int32 ]* scwlb.Frontend )
14971502 keep := make (map [int32 ]* scwlb.Frontend )
14981503
1499- filteredGot := make ([]* scwlb.Frontend , 0 , len (got ))
1504+ lbEvaluatedFrontendMap := make (map [int32 ]* scwlb.Frontend )
1505+
1506+ // Check for deletions and updates
15001507 for _ , current := range got {
1501- if strings .HasPrefix (current .Name , filterPrefix ) {
1502- filteredGot = append (filteredGot , current )
1508+ if ! strings .HasPrefix (current .Name , filterPrefix ) {
1509+ continue
1510+ }
1511+
1512+ // Will remove duplicated frontends with the same InboundPort.
1513+ if _ , ok := lbEvaluatedFrontendMap [current .InboundPort ]; ok {
1514+ remove = append (remove , current )
1515+ continue
1516+ } else {
1517+ lbEvaluatedFrontendMap [current .InboundPort ] = current
15031518 }
1504- }
15051519
1506- // Check for deletions and updates
1507- for _ , current := range filteredGot {
15081520 if target , ok := want [current .InboundPort ]; ok {
1509- if ! frontendEquals (current , target ) {
1521+ if frontendEquals (current , target ) {
1522+ keep [target .InboundPort ] = current
1523+ } else {
15101524 target .ID = current .ID
15111525 update [target .InboundPort ] = target
1512- } else {
1513- keep [target .InboundPort ] = current
15141526 }
15151527 } else {
1516- remove [ current . InboundPort ] = current
1528+ remove = append ( remove , current )
15171529 }
15181530 }
15191531
15201532 // Check for additions
15211533 for _ , target := range want {
1522- found := false
1523- for _ , current := range filteredGot {
1524- if current .InboundPort == target .InboundPort {
1525- found = true
1526- break
1527- }
1528- }
1529- if ! found {
1534+ if _ , ok := lbEvaluatedFrontendMap [target .InboundPort ]; ! ok {
15301535 create [target .InboundPort ] = target
15311536 }
15321537 }
@@ -1540,50 +1545,50 @@ func compareFrontends(got []*scwlb.Frontend, want map[int32]*scwlb.Frontend, fil
15401545}
15411546
15421547type backendOps struct {
1543- remove map [ int32 ]* scwlb.Backend
1548+ remove [ ]* scwlb.Backend
15441549 update map [int32 ]* scwlb.Backend
15451550 create map [int32 ]* scwlb.Backend
15461551 keep map [int32 ]* scwlb.Backend
15471552}
15481553
15491554// compareBackends returns the backends operation to do to achieve the wanted configuration
15501555func compareBackends (got []* scwlb.Backend , want map [int32 ]* scwlb.Backend , filterPrefix string ) backendOps {
1551- remove := make (map [ int32 ]* scwlb.Backend )
1556+ remove := make ([ ]* scwlb.Backend , 0 )
15521557 update := make (map [int32 ]* scwlb.Backend )
15531558 create := make (map [int32 ]* scwlb.Backend )
15541559 keep := make (map [int32 ]* scwlb.Backend )
15551560
1556- filteredGot := make ([]* scwlb.Backend , 0 , len (got ))
1561+ lbEvaluatedBackendMap := make (map [int32 ]* scwlb.Backend )
1562+
1563+ // Check for deletions and updates
15571564 for _ , current := range got {
1558- if strings .HasPrefix (current .Name , filterPrefix ) {
1559- filteredGot = append (filteredGot , current )
1565+ if ! strings .HasPrefix (current .Name , filterPrefix ) {
1566+ continue
1567+ }
1568+
1569+ // Will remove duplicated backends with the same ForwardPort.
1570+ if _ , ok := lbEvaluatedBackendMap [current .ForwardPort ]; ok {
1571+ remove = append (remove , current )
1572+ continue
1573+ } else {
1574+ lbEvaluatedBackendMap [current .ForwardPort ] = current
15601575 }
1561- }
15621576
1563- // Check for deletions and updates
1564- for _ , current := range filteredGot {
15651577 if target , ok := want [current .ForwardPort ]; ok {
1566- if ! backendEquals (current , target ) {
1578+ if backendEquals (current , target ) {
1579+ keep [target .ForwardPort ] = current
1580+ } else {
15671581 target .ID = current .ID
15681582 update [target .ForwardPort ] = target
1569- } else {
1570- keep [target .ForwardPort ] = current
15711583 }
15721584 } else {
1573- remove [ current . ForwardPort ] = current
1585+ remove = append ( remove , current )
15741586 }
15751587 }
15761588
15771589 // Check for additions
15781590 for _ , target := range want {
1579- found := false
1580- for _ , current := range filteredGot {
1581- if current .ForwardPort == target .ForwardPort {
1582- found = true
1583- break
1584- }
1585- }
1586- if ! found {
1591+ if _ , ok := lbEvaluatedBackendMap [target .ForwardPort ]; ! ok {
15871592 create [target .ForwardPort ] = target
15881593 }
15891594 }
0 commit comments