@@ -589,48 +589,8 @@ func (l *loadbalancers) updateLoadBalancer(ctx context.Context, loadbalancer *sc
589589 return err
590590 }
591591
592- if l .pnID != "" {
593- respPN , err := l .api .ListLBPrivateNetworks (& scwlb.ZonedAPIListLBPrivateNetworksRequest {
594- Zone : loadbalancer .Zone ,
595- LBID : loadbalancer .ID ,
596- })
597- if err != nil {
598- return fmt .Errorf ("error listing private networks of load balancer %s: %v" , loadbalancer .ID , err )
599- }
600-
601- var pnNIC * scwlb.PrivateNetwork
602- for _ , pNIC := range respPN .PrivateNetwork {
603- if pNIC .PrivateNetworkID == l .pnID {
604- pnNIC = pNIC
605- continue
606- }
607-
608- // this PN should not be attached to this loadbalancer
609- if ! lbExternallyManaged {
610- klog .V (3 ).Infof ("detach extra private network %s from load balancer %s" , pNIC .PrivateNetworkID , loadbalancer .ID )
611- err = l .api .DetachPrivateNetwork (& scwlb.ZonedAPIDetachPrivateNetworkRequest {
612- Zone : loadbalancer .Zone ,
613- LBID : loadbalancer .ID ,
614- PrivateNetworkID : pNIC .PrivateNetworkID ,
615- })
616- if err != nil {
617- return fmt .Errorf ("unable to detach unmatched private network %s from %s: %v" , pNIC .PrivateNetworkID , loadbalancer .ID , err )
618- }
619- }
620- }
621-
622- if pnNIC == nil {
623- klog .V (3 ).Infof ("attach private network %s to load balancer %s" , l .pnID , loadbalancer .ID )
624- _ , err = l .api .AttachPrivateNetwork (& scwlb.ZonedAPIAttachPrivateNetworkRequest {
625- Zone : loadbalancer .Zone ,
626- LBID : loadbalancer .ID ,
627- PrivateNetworkID : l .pnID ,
628- DHCPConfig : & scwlb.PrivateNetworkDHCPConfig {},
629- })
630- if err != nil {
631- return fmt .Errorf ("unable to attach private network %s on %s: %v" , l .pnID , loadbalancer .ID , err )
632- }
633- }
592+ if err := l .attachPrivateNetworks (loadbalancer , service , lbExternallyManaged ); err != nil {
593+ return fmt .Errorf ("failed to attach private networks: %w" , err )
634594 }
635595
636596 var targetIPs []string
@@ -819,6 +779,74 @@ func (l *loadbalancers) updateLoadBalancer(ctx context.Context, loadbalancer *sc
819779 return nil
820780}
821781
782+ func (l * loadbalancers ) attachPrivateNetworks (loadbalancer * scwlb.LB , service * v1.Service , lbExternallyManaged bool ) error {
783+ if l .pnID == "" {
784+ return nil
785+ }
786+
787+ // maps pnID => attached
788+ pnIDs := make (map [string ]bool )
789+
790+ // Fetch user-specified PrivateNetworkIDs unless LB is externally managed.
791+ if ! lbExternallyManaged {
792+ for _ , pnID := range getPrivateNetworkIDs (service ) {
793+ pnIDs [pnID ] = false
794+ }
795+ }
796+
797+ if len (pnIDs ) == 0 {
798+ pnIDs [l .pnID ] = false
799+ }
800+
801+ respPN , err := l .api .ListLBPrivateNetworks (& scwlb.ZonedAPIListLBPrivateNetworksRequest {
802+ Zone : loadbalancer .Zone ,
803+ LBID : loadbalancer .ID ,
804+ })
805+ if err != nil {
806+ return fmt .Errorf ("error listing private networks of load balancer %s: %v" , loadbalancer .ID , err )
807+ }
808+
809+ for _ , pNIC := range respPN .PrivateNetwork {
810+ if _ , ok := pnIDs [pNIC .PrivateNetworkID ]; ok {
811+ // Mark this Private Network as attached.
812+ pnIDs [pNIC .PrivateNetworkID ] = true
813+ continue
814+ }
815+
816+ // this PN should not be attached to this loadbalancer
817+ if ! lbExternallyManaged {
818+ klog .V (3 ).Infof ("detach extra private network %s from load balancer %s" , pNIC .PrivateNetworkID , loadbalancer .ID )
819+ err = l .api .DetachPrivateNetwork (& scwlb.ZonedAPIDetachPrivateNetworkRequest {
820+ Zone : loadbalancer .Zone ,
821+ LBID : loadbalancer .ID ,
822+ PrivateNetworkID : pNIC .PrivateNetworkID ,
823+ })
824+ if err != nil {
825+ return fmt .Errorf ("unable to detach unmatched private network %s from %s: %v" , pNIC .PrivateNetworkID , loadbalancer .ID , err )
826+ }
827+ }
828+ }
829+
830+ for pnID , attached := range pnIDs {
831+ if attached {
832+ continue
833+ }
834+
835+ klog .V (3 ).Infof ("attach private network %s to load balancer %s" , pnID , loadbalancer .ID )
836+ _ , err = l .api .AttachPrivateNetwork (& scwlb.ZonedAPIAttachPrivateNetworkRequest {
837+ Zone : loadbalancer .Zone ,
838+ LBID : loadbalancer .ID ,
839+ PrivateNetworkID : pnID ,
840+ DHCPConfig : & scwlb.PrivateNetworkDHCPConfig {},
841+ })
842+ if err != nil {
843+ return fmt .Errorf ("unable to attach private network %s on %s: %v" , pnID , loadbalancer .ID , err )
844+ }
845+ }
846+
847+ return nil
848+ }
849+
822850// createPrivateServiceStatus creates a LoadBalancer status for services with private load balancers
823851func (l * loadbalancers ) createPrivateServiceStatus (service * v1.Service , lb * scwlb.LB , ipMode * v1.LoadBalancerIPMode ) (* v1.LoadBalancerStatus , error ) {
824852 if l .pnID == "" {
0 commit comments