Skip to content

Commit 7917e8b

Browse files
committed
add more testing for node.status.addresses
1 parent 22fba65 commit 7917e8b

File tree

3 files changed

+133
-7
lines changed

3 files changed

+133
-7
lines changed

pkg/kubelet/kubelet_node_status.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"k8s.io/apimachinery/pkg/api/resource"
3232
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3333
"k8s.io/apimachinery/pkg/types"
34+
utilnet "k8s.io/apimachinery/pkg/util/net"
3435
"k8s.io/apimachinery/pkg/util/sets"
3536
cloudprovider "k8s.io/cloud-provider"
3637
cloudproviderapi "k8s.io/cloud-provider/api"
@@ -729,7 +730,7 @@ func (kl *Kubelet) defaultNodeStatusFuncs() []func(context.Context, *v1.Node) er
729730
}
730731
var setters []func(ctx context.Context, n *v1.Node) error
731732
setters = append(setters,
732-
nodestatus.NodeAddress(kl.nodeIPs, kl.nodeIPValidator, kl.hostname, kl.hostnameOverridden, kl.externalCloudProvider, kl.cloud, nodeAddressesFunc),
733+
nodestatus.NodeAddress(kl.nodeIPs, kl.nodeIPValidator, kl.hostname, kl.hostnameOverridden, kl.externalCloudProvider, kl.cloud, nodeAddressesFunc, utilnet.ResolveBindAddress),
733734
nodestatus.MachineInfo(string(kl.nodeName), kl.maxPods, kl.podsPerCore, kl.GetCachedMachineInfo, kl.containerManager.GetCapacity,
734735
kl.containerManager.GetDevicePluginResourceCapacity, kl.containerManager.GetNodeAllocatableReservation, kl.recordEvent, kl.supportLocalStorageCapacityIsolation()),
735736
nodestatus.VersionInfo(kl.cadvisor.VersionInfo, kl.containerRuntime.Type, kl.containerRuntime.Version),

pkg/kubelet/nodestatus/setters.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
"k8s.io/apimachinery/pkg/api/resource"
3232
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3333
"k8s.io/apimachinery/pkg/util/errors"
34-
utilnet "k8s.io/apimachinery/pkg/util/net"
3534
utilfeature "k8s.io/apiserver/pkg/util/feature"
3635
cloudprovider "k8s.io/cloud-provider"
3736
cloudproviderapi "k8s.io/cloud-provider/api"
@@ -66,6 +65,7 @@ func NodeAddress(nodeIPs []net.IP, // typically Kubelet.nodeIPs
6665
externalCloudProvider bool, // typically Kubelet.externalCloudProvider
6766
cloud cloudprovider.Interface, // typically Kubelet.cloud
6867
nodeAddressesFunc func() ([]v1.NodeAddress, error), // typically Kubelet.cloudResourceSyncManager.NodeAddresses
68+
resolveAddressFunc func(net.IP) (net.IP, error), // typically k8s.io/apimachinery/pkg/util/net.ResolveBindAddress
6969
) Setter {
7070
var nodeIP, secondaryNodeIP net.IP
7171
if len(nodeIPs) > 0 {
@@ -225,7 +225,7 @@ func NodeAddress(nodeIPs []net.IP, // typically Kubelet.nodeIPs
225225
}
226226

227227
if ipAddr == nil {
228-
ipAddr, err = utilnet.ResolveBindAddress(nodeIP)
228+
ipAddr, err = resolveAddressFunc(nodeIP)
229229
}
230230
}
231231

pkg/kubelet/nodestatus/setters_test.go

+129-4
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,14 @@ func TestNodeAddress(t *testing.T) {
6363
cloudProviderExternal
6464
cloudProviderNone
6565
)
66+
6667
existingNodeAddress := v1.NodeAddress{Address: "10.1.1.2"}
6768
cases := []struct {
6869
name string
6970
hostnameOverride bool
7071
nodeIP net.IP
7172
secondaryNodeIP net.IP
73+
resolvedIP net.IP
7274
cloudProviderType cloudProviderType
7375
nodeAddresses []v1.NodeAddress
7476
expectedAddresses []v1.NodeAddress
@@ -234,17 +236,120 @@ func TestNodeAddress(t *testing.T) {
234236
shouldError: false,
235237
},
236238
{
237-
name: "cloud provider is external and nodeIP unspecified",
239+
name: "no cloud provider and nodeIP IPv4 unspecified",
240+
nodeIP: netutils.ParseIPSloppy("0.0.0.0"),
241+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
242+
nodeAddresses: []v1.NodeAddress{},
243+
cloudProviderType: cloudProviderNone,
244+
expectedAddresses: []v1.NodeAddress{
245+
{Type: v1.NodeInternalIP, Address: "10.0.0.2"},
246+
{Type: v1.NodeHostName, Address: testKubeletHostname},
247+
},
248+
shouldError: false,
249+
},
250+
{
251+
name: "no cloud provider and nodeIP IPv6 unspecified",
252+
nodeIP: netutils.ParseIPSloppy("::"),
253+
resolvedIP: netutils.ParseIPSloppy("2001:db2::2"),
254+
nodeAddresses: []v1.NodeAddress{},
255+
cloudProviderType: cloudProviderNone,
256+
expectedAddresses: []v1.NodeAddress{
257+
{Type: v1.NodeInternalIP, Address: "2001:db2::2"},
258+
{Type: v1.NodeHostName, Address: testKubeletHostname},
259+
},
260+
shouldError: false,
261+
},
262+
{
263+
name: "legacy cloud provider and nodeIP IPv4 unspecified",
264+
nodeIP: netutils.ParseIPSloppy("0.0.0.0"),
265+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
266+
nodeAddresses: []v1.NodeAddress{},
267+
cloudProviderType: cloudProviderLegacy,
268+
expectedAddresses: []v1.NodeAddress{
269+
{Type: v1.NodeHostName, Address: testKubeletHostname},
270+
},
271+
shouldError: true,
272+
},
273+
{
274+
name: "legacy cloud provider and nodeIP IPv6 unspecified",
275+
nodeIP: netutils.ParseIPSloppy("::"),
276+
resolvedIP: netutils.ParseIPSloppy("2001:db2::2"),
277+
nodeAddresses: []v1.NodeAddress{},
278+
cloudProviderType: cloudProviderLegacy,
279+
expectedAddresses: []v1.NodeAddress{
280+
{Type: v1.NodeHostName, Address: testKubeletHostname},
281+
},
282+
shouldError: true,
283+
},
284+
{
285+
name: "cloud provider is external and nodeIP IPv4 unspecified",
286+
nodeIP: netutils.ParseIPSloppy("0.0.0.0"),
287+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
288+
nodeAddresses: []v1.NodeAddress{},
289+
cloudProviderType: cloudProviderExternal,
290+
expectedAddresses: []v1.NodeAddress{
291+
{Type: v1.NodeInternalIP, Address: "10.0.0.2"},
292+
{Type: v1.NodeHostName, Address: testKubeletHostname},
293+
},
294+
shouldError: false,
295+
},
296+
{
297+
name: "cloud provider is external and nodeIP IPv6 unspecified",
238298
nodeIP: netutils.ParseIPSloppy("::"),
299+
resolvedIP: netutils.ParseIPSloppy("2001:db2::2"),
239300
nodeAddresses: []v1.NodeAddress{},
240301
cloudProviderType: cloudProviderExternal,
241302
expectedAddresses: []v1.NodeAddress{
303+
{Type: v1.NodeInternalIP, Address: "2001:db2::2"},
242304
{Type: v1.NodeHostName, Address: testKubeletHostname},
243305
},
244306
shouldError: false,
245307
},
246308
{
247-
name: "cloud provider is external and no nodeIP",
309+
name: "no cloud provider and no nodeIP resolve IPv4",
310+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
311+
nodeAddresses: []v1.NodeAddress{},
312+
cloudProviderType: cloudProviderNone,
313+
expectedAddresses: []v1.NodeAddress{
314+
{Type: v1.NodeInternalIP, Address: "10.0.0.2"},
315+
{Type: v1.NodeHostName, Address: testKubeletHostname},
316+
},
317+
shouldError: false,
318+
},
319+
{
320+
name: "no cloud provider and no nodeIP resolve IPv6",
321+
resolvedIP: netutils.ParseIPSloppy("2001:db2::2"),
322+
nodeAddresses: []v1.NodeAddress{},
323+
cloudProviderType: cloudProviderNone,
324+
expectedAddresses: []v1.NodeAddress{
325+
{Type: v1.NodeInternalIP, Address: "2001:db2::2"},
326+
{Type: v1.NodeHostName, Address: testKubeletHostname},
327+
},
328+
shouldError: false,
329+
},
330+
{
331+
name: "legacy cloud provider and no nodeIP",
332+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
333+
nodeAddresses: []v1.NodeAddress{},
334+
cloudProviderType: cloudProviderLegacy,
335+
expectedAddresses: []v1.NodeAddress{
336+
{Type: v1.NodeHostName, Address: testKubeletHostname},
337+
},
338+
shouldError: true,
339+
},
340+
{
341+
name: "cloud provider is external and no nodeIP resolve IPv4",
342+
resolvedIP: netutils.ParseIPSloppy("10.0.0.2"),
343+
nodeAddresses: []v1.NodeAddress{},
344+
cloudProviderType: cloudProviderExternal,
345+
expectedAddresses: []v1.NodeAddress{
346+
{Type: v1.NodeHostName, Address: testKubeletHostname},
347+
},
348+
shouldError: false,
349+
},
350+
{
351+
name: "cloud provider is external and no nodeIP resolve IPv6",
352+
resolvedIP: netutils.ParseIPSloppy("2001:db2::2"),
248353
nodeAddresses: []v1.NodeAddress{},
249354
cloudProviderType: cloudProviderExternal,
250355
expectedAddresses: []v1.NodeAddress{
@@ -638,6 +743,20 @@ func TestNodeAddress(t *testing.T) {
638743
return testCase.nodeAddresses, nil
639744
}
640745

746+
net.DefaultResolver = &net.Resolver{
747+
PreferGo: true,
748+
Dial: func(ctx context.Context, network string, address string) (net.Conn, error) {
749+
return nil, fmt.Errorf("error")
750+
},
751+
}
752+
defer func() {
753+
net.DefaultResolver = &net.Resolver{}
754+
}()
755+
756+
resolveAddressFunc := func(net.IP) (net.IP, error) {
757+
return testCase.resolvedIP, nil
758+
}
759+
641760
// cloud provider is expected to be nil if external provider is set or there is no cloud provider
642761
var cloud cloudprovider.Interface
643762
if testCase.cloudProviderType == cloudProviderLegacy {
@@ -659,7 +778,9 @@ func TestNodeAddress(t *testing.T) {
659778
testCase.hostnameOverride,
660779
testCase.cloudProviderType == cloudProviderExternal,
661780
cloud,
662-
nodeAddressesFunc)
781+
nodeAddressesFunc,
782+
resolveAddressFunc,
783+
)
663784

664785
// call setter on existing node
665786
err := setter(ctx, existingNode)
@@ -739,6 +860,9 @@ func TestNodeAddress_NoCloudProvider(t *testing.T) {
739860
nodeAddressesFunc := func() ([]v1.NodeAddress, error) {
740861
return nil, fmt.Errorf("not reached")
741862
}
863+
resolvedAddressesFunc := func(net.IP) (net.IP, error) {
864+
return nil, fmt.Errorf("not reached")
865+
}
742866

743867
// construct setter
744868
setter := NodeAddress(testCase.nodeIPs,
@@ -747,7 +871,8 @@ func TestNodeAddress_NoCloudProvider(t *testing.T) {
747871
false, // hostnameOverridden
748872
false, // externalCloudProvider
749873
nil, // cloud
750-
nodeAddressesFunc)
874+
nodeAddressesFunc,
875+
resolvedAddressesFunc)
751876

752877
// call setter on existing node
753878
err := setter(ctx, existingNode)

0 commit comments

Comments
 (0)