Skip to content

Commit a850f29

Browse files
committed
Add single-stack IPv6 support
1 parent 1117566 commit a850f29

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

docs/release-notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ nav_order: 9
1111
### Features
1212

1313
- Support partitioning disk with mounted partitions
14+
- Support IPv6 for single-stack OpenStack
1415

1516
### Changes
1617

internal/providers/openstack/openstack.go

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,16 @@ const (
4444
)
4545

4646
var (
47-
metadataServiceUrl = url.URL{
47+
ipv4MetadataServiceUrl = url.URL{
4848
Scheme: "http",
4949
Host: "169.254.169.254",
5050
Path: "openstack/latest/user_data",
5151
}
52+
ipv6MetadataServiceUrl = url.URL{
53+
Scheme: "http",
54+
Host: "[fe80::a9fe:a9fe]",
55+
Path: "openstack/latest/user_data",
56+
}
5257
)
5358

5459
func init() {
@@ -167,13 +172,38 @@ func fetchConfigFromDevice(logger *log.Logger, ctx context.Context, path string)
167172
}
168173

169174
func fetchConfigFromMetadataService(f *resource.Fetcher) ([]byte, error) {
170-
res, err := f.FetchToBuffer(metadataServiceUrl, resource.FetchOptions{})
175+
var resIPv4, resIPv6 []byte
176+
var errIPv4, errIPv6 error
171177

172-
// the metadata server exists but doesn't contain any actual metadata,
173-
// assume that there is no config specified
174-
if err == resource.ErrNotFound {
175-
return nil, nil
178+
// Try IPv4 endpoint
179+
resIPv4, errIPv4 = f.FetchToBuffer(ipv4MetadataServiceUrl, resource.FetchOptions{})
180+
if errIPv4 != nil && errIPv4 != resource.ErrNotFound {
181+
f.Logger.Err("Failed to fetch config from IPv4: %v", errIPv4)
182+
}
183+
184+
// Try IPv6 endpoint
185+
resIPv6, errIPv6 = f.FetchToBuffer(ipv6MetadataServiceUrl, resource.FetchOptions{})
186+
if errIPv6 != nil && errIPv6 != resource.ErrNotFound {
187+
f.Logger.Err("Failed to fetch config from IPv6: %v", errIPv6)
188+
}
189+
190+
// If both IPv4 and IPv6 have valid data, combine them
191+
if resIPv4 != nil && resIPv6 != nil {
192+
return append(resIPv4, resIPv6...), nil
193+
} else if resIPv4 != nil {
194+
return resIPv4, nil
195+
} else if resIPv6 != nil {
196+
return resIPv6, nil
197+
}
198+
199+
// If both endpoints fail, return the appropriate error
200+
if errIPv4 != nil {
201+
return nil, errIPv4
202+
}
203+
if errIPv6 != nil {
204+
return nil, errIPv6
176205
}
177206

178-
return res, err
207+
// If both endpoints return ErrNotFound
208+
return nil, nil
179209
}

0 commit comments

Comments
 (0)