@@ -59,6 +59,10 @@ type KernelCompatTester interface {
59
59
IsCompatible () error
60
60
}
61
61
62
+ type HostMacProvider interface {
63
+ GetHostMac (nodeIP net.IP ) string
64
+ }
65
+
62
66
// CanUseWinKernelProxier returns true if we should use the Kernel Proxier
63
67
// instead of the "classic" userspace Proxier. This is determined by checking
64
68
// the windows kernel version and for the existence of kernel features.
@@ -723,6 +727,41 @@ func NewProxier(
723
727
}
724
728
725
729
hcnImpl := newHcnImpl ()
730
+ proxier , err := newProxierInternal (
731
+ ipFamily ,
732
+ hostname ,
733
+ nodeIP ,
734
+ serviceHealthServer ,
735
+ healthzServer ,
736
+ healthzPort ,
737
+ hcnImpl ,
738
+ & localHostMacProvider {},
739
+ config ,
740
+ true , // waitForHNSOverlay
741
+ )
742
+ if err != nil {
743
+ return nil , err
744
+ }
745
+
746
+ burstSyncs := 2
747
+ klog .V (3 ).InfoS ("Record sync param" , "minSyncPeriod" , minSyncPeriod , "syncPeriod" , syncPeriod , "burstSyncs" , burstSyncs )
748
+ proxier .syncRunner = async .NewBoundedFrequencyRunner ("sync-runner" , proxier .syncProxyRules , minSyncPeriod , syncPeriod , burstSyncs )
749
+ return proxier , nil
750
+ }
751
+
752
+ // allow internal testing of proxier
753
+ func newProxierInternal (
754
+ ipFamily v1.IPFamily ,
755
+ hostname string ,
756
+ nodeIP net.IP ,
757
+ serviceHealthServer healthcheck.ServiceHealthServer ,
758
+ healthzServer * healthcheck.ProxyHealthServer ,
759
+ healthzPort int ,
760
+ hcnImpl HcnService ,
761
+ hostMacProvider HostMacProvider ,
762
+ config config.KubeProxyWinkernelConfiguration ,
763
+ waitForHNSOverlay bool ,
764
+ ) (* Proxier , error ) {
726
765
hns , supportedFeatures := newHostNetworkService (hcnImpl )
727
766
hnsNetworkName , err := getNetworkName (config .NetworkName )
728
767
if err != nil {
@@ -741,7 +780,10 @@ func NewProxier(
741
780
// Network could have been detected before Remote Subnet Routes are applied or ManagementIP is updated
742
781
// Sleep and update the network to include new information
743
782
if isOverlay (hnsNetworkInfo ) {
744
- time .Sleep (10 * time .Second )
783
+ if waitForHNSOverlay {
784
+ time .Sleep (10 * time .Second )
785
+ }
786
+
745
787
hnsNetworkInfo , err = hns .getNetworkByName (hnsNetworkName )
746
788
if err != nil {
747
789
return nil , fmt .Errorf ("could not find HNS network %s" , hnsNetworkName )
@@ -765,7 +807,7 @@ func NewProxier(
765
807
if ! utilfeature .DefaultFeatureGate .Enabled (kubefeatures .WinOverlay ) {
766
808
return nil , fmt .Errorf ("WinOverlay feature gate not enabled" )
767
809
}
768
- err = hcn .RemoteSubnetSupported ()
810
+ err = hcnImpl .RemoteSubnetSupported ()
769
811
if err != nil {
770
812
return nil , err
771
813
}
@@ -783,17 +825,8 @@ func NewProxier(
783
825
}
784
826
}
785
827
786
- interfaces , _ := net .Interfaces () //TODO create interfaces
787
- for _ , inter := range interfaces {
788
- addresses , _ := inter .Addrs ()
789
- for _ , addr := range addresses {
790
- addrIP , _ , _ := netutils .ParseCIDRSloppy (addr .String ())
791
- if addrIP .String () == nodeIP .String () {
792
- klog .V (2 ).InfoS ("Record Host MAC address" , "addr" , inter .HardwareAddr )
793
- hostMac = inter .HardwareAddr .String ()
794
- }
795
- }
796
- }
828
+ hostMac = hostMacProvider .GetHostMac (nodeIP )
829
+
797
830
if len (hostMac ) == 0 {
798
831
return nil , fmt .Errorf ("could not find host mac address for %s" , nodeIP )
799
832
}
@@ -827,9 +860,6 @@ func NewProxier(
827
860
proxier .endpointsChanges = endPointChangeTracker
828
861
proxier .serviceChanges = serviceChanges
829
862
830
- burstSyncs := 2
831
- klog .V (3 ).InfoS ("Record sync param" , "minSyncPeriod" , minSyncPeriod , "syncPeriod" , syncPeriod , "burstSyncs" , burstSyncs )
832
- proxier .syncRunner = async .NewBoundedFrequencyRunner ("sync-runner" , proxier .syncProxyRules , minSyncPeriod , syncPeriod , burstSyncs )
833
863
return proxier , nil
834
864
}
835
865
@@ -1785,3 +1815,21 @@ func (proxier *Proxier) deleteLoadBalancer(hns HostNetworkService, lbHnsID *stri
1785
1815
* lbHnsID = ""
1786
1816
return true
1787
1817
}
1818
+
1819
+ type localHostMacProvider struct {}
1820
+
1821
+ func (r * localHostMacProvider ) GetHostMac (nodeIP net.IP ) string {
1822
+ var hostMac string
1823
+ interfaces , _ := net .Interfaces ()
1824
+ for _ , inter := range interfaces {
1825
+ addresses , _ := inter .Addrs ()
1826
+ for _ , addr := range addresses {
1827
+ addrIP , _ , _ := netutils .ParseCIDRSloppy (addr .String ())
1828
+ if addrIP .String () == nodeIP .String () {
1829
+ klog .V (2 ).InfoS ("Record Host MAC address" , "addr" , inter .HardwareAddr )
1830
+ hostMac = inter .HardwareAddr .String ()
1831
+ }
1832
+ }
1833
+ }
1834
+ return hostMac
1835
+ }
0 commit comments