Skip to content

Commit 66afcae

Browse files
authored
[fix] : fix internal ip ordering (#247)
* fix internal ip ordering * add test to make sure ip's are in specific order
1 parent 9212805 commit 66afcae

File tree

2 files changed

+96
-10
lines changed

2 files changed

+96
-10
lines changed

cloud/linode/instances.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,18 @@ func (i *instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
284284
return nil, err
285285
}
286286

287-
uniqueAddrs := make(map[string]v1.NodeAddressType, len(node.Status.Addresses)+len(ips))
287+
addresses := []v1.NodeAddress{{Type: v1.NodeHostName, Address: linode.Label}}
288288
for _, ip := range ips {
289-
if _, ok := uniqueAddrs[ip.ip]; ok {
289+
addresses = append(addresses, v1.NodeAddress{Type: ip.ipType, Address: ip.ip})
290+
}
291+
292+
// create temporary uniqueAddrs cache just for reference
293+
uniqueAddrs := make(map[string]v1.NodeAddressType, len(node.Status.Addresses)+len(ips))
294+
for _, ip := range addresses {
295+
if _, ok := uniqueAddrs[ip.Address]; ok {
290296
continue
291297
}
292-
uniqueAddrs[ip.ip] = ip.ipType
298+
uniqueAddrs[ip.Address] = ip.Type
293299
}
294300

295301
// include IPs set by kubelet for internal node IP
@@ -299,14 +305,10 @@ func (i *instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
299305
}
300306
if addr.Type == v1.NodeInternalIP {
301307
uniqueAddrs[addr.Address] = v1.NodeInternalIP
308+
addresses = append(addresses, v1.NodeAddress{Type: addr.Type, Address: addr.Address})
302309
}
303310
}
304311

305-
addresses := []v1.NodeAddress{{Type: v1.NodeHostName, Address: linode.Label}}
306-
for k, v := range uniqueAddrs {
307-
addresses = append(addresses, v1.NodeAddress{Type: v, Address: k})
308-
}
309-
310312
klog.Infof("Instance %s, assembled IP addresses: %v", node.Name, addresses)
311313
// note that Zone is omitted as it's not a thing in Linode
312314
meta := &cloudprovider.InstanceMetadata{

cloud/linode/instances_test.go

+86-2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,90 @@ func TestMetadataRetrieval(t *testing.T) {
144144
}, meta.NodeAddresses)
145145
})
146146

147+
t.Run("should return data when linode is found (by name) and addresses must be in order", func(t *testing.T) {
148+
instances := newInstances(client)
149+
id := 123
150+
name := "mock-instance"
151+
node := nodeWithName(name)
152+
publicIPv4 := net.ParseIP("45.76.101.25")
153+
privateIPv4 := net.ParseIP("192.168.133.65")
154+
ipv6Addr := "2001::8a2e:370:7348"
155+
linodeType := "g6-standard-1"
156+
region := "us-east"
157+
158+
Options.VPCNames = "test"
159+
vpcIDs["test"] = 1
160+
Options.EnableRouteController = true
161+
162+
instance := linodego.Instance{
163+
ID: id,
164+
Label: name,
165+
Type: linodeType,
166+
Region: region,
167+
IPv4: []*net.IP{&publicIPv4, &privateIPv4},
168+
IPv6: ipv6Addr,
169+
}
170+
vpcIP := "10.0.0.2"
171+
addressRange1 := "10.192.0.0/24"
172+
addressRange2 := "10.192.10.0/24"
173+
routesInVPC := []linodego.VPCIP{
174+
{
175+
Address: &vpcIP,
176+
AddressRange: nil,
177+
VPCID: vpcIDs["test"],
178+
NAT1To1: nil,
179+
LinodeID: id,
180+
},
181+
{
182+
Address: nil,
183+
AddressRange: &addressRange1,
184+
VPCID: vpcIDs["test"],
185+
NAT1To1: nil,
186+
LinodeID: id,
187+
},
188+
{
189+
Address: nil,
190+
AddressRange: &addressRange2,
191+
VPCID: vpcIDs["test"],
192+
NAT1To1: nil,
193+
LinodeID: id,
194+
},
195+
}
196+
197+
client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{instance}, nil)
198+
client.EXPECT().ListVPCIPAddresses(gomock.Any(), vpcIDs["test"], gomock.Any()).Return(routesInVPC, nil)
199+
200+
meta, err := instances.InstanceMetadata(ctx, node)
201+
assert.NoError(t, err)
202+
assert.Equal(t, providerIDPrefix+strconv.Itoa(id), meta.ProviderID)
203+
assert.Equal(t, region, meta.Region)
204+
assert.Equal(t, linodeType, meta.InstanceType)
205+
assert.Equal(t, []v1.NodeAddress{
206+
{
207+
Type: v1.NodeHostName,
208+
Address: name,
209+
},
210+
{
211+
Type: v1.NodeInternalIP,
212+
Address: vpcIP,
213+
},
214+
{
215+
Type: v1.NodeExternalIP,
216+
Address: publicIPv4.String(),
217+
},
218+
{
219+
Type: v1.NodeInternalIP,
220+
Address: privateIPv4.String(),
221+
},
222+
{
223+
Type: v1.NodeExternalIP,
224+
Address: ipv6Addr,
225+
},
226+
}, meta.NodeAddresses)
227+
228+
Options.VPCNames = ""
229+
})
230+
147231
ipTests := []struct {
148232
name string
149233
inputIPv4s []string
@@ -226,7 +310,7 @@ func TestMetadataRetrieval(t *testing.T) {
226310
nil,
227311
},
228312
{
229-
"one private addresses, one existing internal IP set on the node",
313+
"one private address, one existing internal IP set on the node",
230314
[]string{"192.168.121.42"},
231315
"",
232316
"",
@@ -329,7 +413,7 @@ func TestMetadataRetrieval(t *testing.T) {
329413
expectedInstance := linodego.Instance{Label: "expected-instance", ID: 12345, IPv4: []*net.IP{&publicIP, &privateIP}}
330414

331415
for _, test := range getByIPTests {
332-
t.Run(fmt.Sprintf("gets lindoe by IP - %s", test.name), func(t *testing.T) {
416+
t.Run(fmt.Sprintf("gets linode by IP - %s", test.name), func(t *testing.T) {
333417
instances := newInstances(client)
334418
client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{{ID: 3456, IPv4: []*net.IP{&wrongIP}}, expectedInstance}, nil)
335419
node := v1.Node{ObjectMeta: metav1.ObjectMeta{Name: "test-node-1"}, Status: v1.NodeStatus{Addresses: test.nodeAddresses}}

0 commit comments

Comments
 (0)