|
4 | 4 | "context" |
5 | 5 | "errors" |
6 | 6 | "fmt" |
| 7 | + "slices" |
| 8 | + |
7 | 9 | "github.com/aws/aws-sdk-go-v2/aws" |
8 | 10 | awssdk "github.com/aws/aws-sdk-go-v2/aws" |
9 | 11 | "github.com/aws/aws-sdk-go-v2/service/globalaccelerator" |
@@ -60,10 +62,10 @@ func (m *defaultAcceleratorManager) buildSDKCreateAcceleratorInput(_ context.Con |
60 | 62 | IdempotencyToken: aws.String(idempotencyToken), |
61 | 63 | } |
62 | 64 |
|
63 | | - //TODO: BYOIP feature |
64 | | - //if len(resAccelerator.Spec.IpAddresses) > 0 { |
65 | | - // createInput.IpAddresses = resAccelerator.Spec.IpAddresses |
66 | | - //} |
| 65 | + // BYOIP feature: Set IP addresses if provided |
| 66 | + if len(resAccelerator.Spec.IpAddresses) > 0 { |
| 67 | + createInput.IpAddresses = resAccelerator.Spec.IpAddresses |
| 68 | + } |
67 | 69 |
|
68 | 70 | // Add tags |
69 | 71 | tags := m.trackingProvider.ResourceTags(resAccelerator.Stack(), resAccelerator, resAccelerator.Spec.Tags) |
@@ -103,11 +105,8 @@ func (m *defaultAcceleratorManager) buildSDKUpdateAcceleratorInput(ctx context.C |
103 | 105 | IpAddressType: agatypes.IpAddressType(resAccelerator.Spec.IPAddressType), |
104 | 106 | Enabled: resAccelerator.Spec.Enabled, |
105 | 107 | } |
| 108 | + // BYOIP is only supported during accelerator creation, not updates |
106 | 109 |
|
107 | | - //TODO: BYOIP feature |
108 | | - //if len(resAccelerator.Spec.IpAddresses) > 0 { |
109 | | - // updateInput.IpAddresses = resAccelerator.Spec.IpAddresses |
110 | | - //} |
111 | 110 | return updateInput |
112 | 111 | } |
113 | 112 |
|
@@ -272,10 +271,43 @@ func (m *defaultAcceleratorManager) isSDKAcceleratorSettingsDrifted(resAccelerat |
272 | 271 | return true |
273 | 272 | } |
274 | 273 |
|
275 | | - //TODO : BYOIP feature |
| 274 | + // Check if user attempts to change IP addresses (BYOIP only supported at creation) |
| 275 | + if len(resAccelerator.Spec.IpAddresses) > 0 && !m.areIPAddressesEqual(resAccelerator.Spec.IpAddresses, sdkAccelerator.Accelerator.IpSets) { |
| 276 | + m.logger.Info("IP addresses cannot be updated after accelerator creation, ignoring IP address changes") |
| 277 | + } |
| 278 | + |
276 | 279 | return false |
277 | 280 | } |
278 | 281 |
|
| 282 | +func (m *defaultAcceleratorManager) areIPAddressesEqual(desiredIPs []string, actualIPSets []agatypes.IpSet) bool { |
| 283 | + |
| 284 | + // IPv6 BYOIP is not supported at this time |
| 285 | + return m.areIPv4AddressesEqual(desiredIPs, actualIPSets) |
| 286 | +} |
| 287 | + |
| 288 | +// areIPv4AddressesEqual compares desired IPv4 addresses with actual IP sets from AWS |
| 289 | +func (m *defaultAcceleratorManager) areIPv4AddressesEqual(desiredIPs []string, actualIPSets []agatypes.IpSet) bool { |
| 290 | + actualIPv4s := extractIPv4Addresses(actualIPSets) |
| 291 | + if len(desiredIPs) != len(actualIPv4s) { |
| 292 | + return false |
| 293 | + } |
| 294 | + |
| 295 | + slices.Sort(desiredIPs) |
| 296 | + slices.Sort(actualIPv4s) |
| 297 | + return slices.Equal(desiredIPs, actualIPv4s) |
| 298 | +} |
| 299 | + |
| 300 | +// extractIPv4Addresses extracts IPv4 addresses from IPSets |
| 301 | +func extractIPv4Addresses(ipSets []agatypes.IpSet) []string { |
| 302 | + ips := make([]string, 0) |
| 303 | + for _, ipSet := range ipSets { |
| 304 | + if ipSet.IpAddressFamily == "IPv4" { |
| 305 | + ips = append(ips, ipSet.IpAddresses...) |
| 306 | + } |
| 307 | + } |
| 308 | + return ips |
| 309 | +} |
| 310 | + |
279 | 311 | func (m *defaultAcceleratorManager) getIdempotencyToken(resAccelerator *agamodel.Accelerator) string { |
280 | 312 | // Use the CRD's UID as the idempotency token as its unique |
281 | 313 | return resAccelerator.GetCRDUID() |
|
0 commit comments