Skip to content

Commit 4cda99a

Browse files
Merge pull request #217 from linode/dual-stack-support
include ipv6 address for node external IPs
2 parents 71e7855 + 43db50f commit 4cda99a

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

cloud/linode/instances.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"os"
77
"slices"
88
"strconv"
9+
"strings"
910
"sync"
1011
"time"
1112

@@ -36,8 +37,8 @@ type nodeCache struct {
3637
ttl time.Duration
3738
}
3839

39-
// getInstanceIPv4Addresses returns all ipv4 addresses configured on a linode.
40-
func (nc *nodeCache) getInstanceIPv4Addresses(instance linodego.Instance, vpcips []string) []nodeIP {
40+
// getInstanceAddresses returns all addresses configured on a linode.
41+
func (nc *nodeCache) getInstanceAddresses(instance linodego.Instance, vpcips []string) []nodeIP {
4142
ips := []nodeIP{}
4243

4344
// If vpc ips are present, list them first
@@ -54,6 +55,10 @@ func (nc *nodeCache) getInstanceIPv4Addresses(instance linodego.Instance, vpcips
5455
ips = append(ips, nodeIP{ip: ip.String(), ipType: ipType})
5556
}
5657

58+
if instance.IPv6 != "" {
59+
ips = append(ips, nodeIP{ip: strings.TrimSuffix(instance.IPv6, "/128"), ipType: v1.NodeExternalIP})
60+
}
61+
5762
return ips
5863
}
5964

@@ -97,7 +102,7 @@ func (nc *nodeCache) refreshInstances(ctx context.Context, client client.Client)
97102
}
98103
node := linodeInstance{
99104
instance: &instances[i],
100-
ips: nc.getInstanceIPv4Addresses(instance, vpcNodes[instance.ID]),
105+
ips: nc.getInstanceAddresses(instance, vpcNodes[instance.ID]),
101106
}
102107
newNodes[instance.ID] = node
103108
}
@@ -141,7 +146,7 @@ func (i *instances) linodeByIP(kNode *v1.Node) (*linodego.Instance, error) {
141146
defer i.nodeCache.RUnlock()
142147
var kNodeAddresses []string
143148
for _, address := range kNode.Status.Addresses {
144-
if address.Type == "ExternalIP" || address.Type == "InternalIP" {
149+
if address.Type == v1.NodeExternalIP || address.Type == v1.NodeInternalIP {
145150
kNodeAddresses = append(kNodeAddresses, address.Address)
146151
}
147152
}
@@ -262,7 +267,7 @@ func (i *instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
262267
return nil, err
263268
}
264269

265-
ips, err := i.getLinodeIPv4Addresses(ctx, node)
270+
ips, err := i.getLinodeAddresses(ctx, node)
266271
if err != nil {
267272
sentry.CaptureError(ctx, err)
268273
return nil, err
@@ -291,7 +296,7 @@ func (i *instances) InstanceMetadata(ctx context.Context, node *v1.Node) (*cloud
291296
return meta, nil
292297
}
293298

294-
func (i *instances) getLinodeIPv4Addresses(ctx context.Context, node *v1.Node) ([]nodeIP, error) {
299+
func (i *instances) getLinodeAddresses(ctx context.Context, node *v1.Node) ([]nodeIP, error) {
295300
ctx = sentry.SetHubOnContext(ctx)
296301
instance, err := i.lookupLinode(ctx, node)
297302
if err != nil {

cloud/linode/instances_test.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,38 +144,51 @@ func TestMetadataRetrieval(t *testing.T) {
144144

145145
ipTests := []struct {
146146
name string
147-
inputIPs []string
147+
inputIPv4s []string
148+
inputIPv6 string
148149
outputAddresses []v1.NodeAddress
149150
expectedErr error
150151
}{
151-
{"no IPs", nil, nil, instanceNoIPAddressesError{192910}},
152+
{"no IPs", nil, "", nil, instanceNoIPAddressesError{192910}},
152153
{
153154
"one public, one private",
154155
[]string{"32.74.121.25", "192.168.121.42"},
156+
"",
155157
[]v1.NodeAddress{{Type: v1.NodeExternalIP, Address: "32.74.121.25"}, {Type: v1.NodeInternalIP, Address: "192.168.121.42"}},
156158
nil,
157159
},
160+
{
161+
"one public ipv4, one public ipv6",
162+
[]string{"32.74.121.25"},
163+
"2600:3c06::f03c:94ff:fe1e:e072",
164+
[]v1.NodeAddress{{Type: v1.NodeExternalIP, Address: "32.74.121.25"}, {Type: v1.NodeExternalIP, Address: "2600:3c06::f03c:94ff:fe1e:e072"}},
165+
nil,
166+
},
158167
{
159168
"one public, no private",
160169
[]string{"32.74.121.25"},
170+
"",
161171
[]v1.NodeAddress{{Type: v1.NodeExternalIP, Address: "32.74.121.25"}},
162172
nil,
163173
},
164174
{
165175
"one private, no public",
166176
[]string{"192.168.121.42"},
177+
"",
167178
[]v1.NodeAddress{{Type: v1.NodeInternalIP, Address: "192.168.121.42"}},
168179
nil,
169180
},
170181
{
171182
"two public addresses",
172183
[]string{"32.74.121.25", "32.74.121.22"},
184+
"",
173185
[]v1.NodeAddress{{Type: v1.NodeExternalIP, Address: "32.74.121.25"}, {Type: v1.NodeExternalIP, Address: "32.74.121.22"}},
174186
nil,
175187
},
176188
{
177189
"two private addresses",
178190
[]string{"192.168.121.42", "10.0.2.15"},
191+
"",
179192
[]v1.NodeAddress{{Type: v1.NodeInternalIP, Address: "192.168.121.42"}, {Type: v1.NodeInternalIP, Address: "10.0.2.15"}},
180193
nil,
181194
},
@@ -189,8 +202,8 @@ func TestMetadataRetrieval(t *testing.T) {
189202
providerID := providerIDPrefix + strconv.Itoa(id)
190203
node := nodeWithProviderID(providerID)
191204

192-
ips := make([]*net.IP, 0, len(test.inputIPs))
193-
for _, ip := range test.inputIPs {
205+
ips := make([]*net.IP, 0, len(test.inputIPv4s))
206+
for _, ip := range test.inputIPv4s {
194207
parsed := net.ParseIP(ip)
195208
if parsed == nil {
196209
t.Fatalf("cannot parse %v as an ipv4", ip)
@@ -201,7 +214,7 @@ func TestMetadataRetrieval(t *testing.T) {
201214
linodeType := "g6-standard-1"
202215
region := "us-east"
203216
client.EXPECT().ListInstances(gomock.Any(), nil).Times(1).Return([]linodego.Instance{
204-
{ID: id, Label: name, Type: linodeType, Region: region, IPv4: ips},
217+
{ID: id, Label: name, Type: linodeType, Region: region, IPv4: ips, IPv6: test.inputIPv6},
205218
}, nil)
206219

207220
meta, err := instances.InstanceMetadata(ctx, node)

0 commit comments

Comments
 (0)