|
9 | 9 | "bytes" |
10 | 10 | "context" |
11 | 11 | "fmt" |
| 12 | + "maps" |
12 | 13 | "slices" |
13 | 14 | "strconv" |
14 | 15 | "strings" |
@@ -322,7 +323,7 @@ func (t *TerraformReconciler) computeTerraformStatusState(ctx context.Context, t |
322 | 323 | return nil, nil, err |
323 | 324 | } |
324 | 325 |
|
325 | | - subnets, err := computeProviderStatusSubnets(infrastructureConfig, output) |
| 326 | + subnets, err := computeProviderStatusSubnets(t.log, infrastructureConfig, output) |
326 | 327 | if err != nil { |
327 | 328 | return nil, nil, err |
328 | 329 | } |
@@ -556,32 +557,44 @@ func generateTerraformInfraConfig(ctx context.Context, infrastructure *extension |
556 | 557 | return terraformInfraConfig, nil |
557 | 558 | } |
558 | 559 |
|
559 | | -func computeProviderStatusSubnets(infrastructure *api.InfrastructureConfig, values map[string]string) ([]v1alpha1.Subnet, error) { |
| 560 | +func computeProviderStatusSubnets(logger logr.Logger, infrastructure *api.InfrastructureConfig, values map[string]string) ([]v1alpha1.Subnet, error) { |
560 | 561 | var subnetsToReturn []v1alpha1.Subnet |
561 | 562 |
|
562 | | - for key, value := range values { |
| 563 | + for _, key := range slices.Sorted(maps.Keys(values)) { |
| 564 | + value := values[key] |
563 | 565 | var prefix, purpose string |
564 | | - if strings.HasPrefix(key, aws.SubnetPublicPrefix) { |
| 566 | + switch { |
| 567 | + case strings.HasPrefix(key, aws.SubnetPublicPrefix): |
565 | 568 | prefix = aws.SubnetPublicPrefix |
566 | 569 | purpose = api.PurposePublic |
567 | | - } |
568 | | - if strings.HasPrefix(key, aws.SubnetNodesPrefix) { |
| 570 | + case strings.HasPrefix(key, aws.SubnetNodesPrefix): |
569 | 571 | prefix = aws.SubnetNodesPrefix |
570 | 572 | purpose = v1alpha1.PurposeNodes |
571 | | - } |
572 | | - |
573 | | - if len(prefix) == 0 { |
| 573 | + default: |
574 | 574 | continue |
575 | 575 | } |
576 | 576 |
|
577 | 577 | zoneID, err := strconv.Atoi(strings.TrimPrefix(key, prefix)) |
578 | 578 | if err != nil { |
579 | 579 | return nil, err |
580 | 580 | } |
| 581 | + if zoneID < 0 || zoneID >= len(infrastructure.Networks.Zones) { |
| 582 | + return nil, fmt.Errorf("zone index %d out of range", zoneID) |
| 583 | + } |
| 584 | + zone := infrastructure.Networks.Zones[zoneID].Name |
| 585 | + |
| 586 | + zoneExists := slices.ContainsFunc(subnetsToReturn, func(s v1alpha1.Subnet) bool { |
| 587 | + return s.Zone == zone && s.Purpose == purpose |
| 588 | + }) |
| 589 | + if zoneExists { |
| 590 | + logger.Info("Skipping subnet addition to status as zone is already present", "zone", zone, "purpose", purpose) |
| 591 | + continue |
| 592 | + } |
| 593 | + |
581 | 594 | subnetsToReturn = append(subnetsToReturn, v1alpha1.Subnet{ |
582 | 595 | ID: value, |
583 | 596 | Purpose: purpose, |
584 | | - Zone: infrastructure.Networks.Zones[zoneID].Name, |
| 597 | + Zone: zone, |
585 | 598 | }) |
586 | 599 | } |
587 | 600 |
|
|
0 commit comments