Skip to content

Commit fe48d9a

Browse files
committed
BugFix - handled duplicate resource name into resource discovery
1 parent 64c9f9a commit fe48d9a

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

internal/commonexport/commonexport_functions.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,13 +856,22 @@ var GenerateTerraformNameFromResource = func(resourceAttributes map[string]inter
856856

857857
var CheckDuplicateResourceName = func(terraformName string) string {
858858
ResourceNameCountLock.Lock()
859-
if count, resourceNameExists := ResourceNameCount[terraformName]; resourceNameExists {
860-
ResourceNameCount[terraformName] = count + 1
861-
terraformName = fmt.Sprintf("%s_%d", terraformName, count)
859+
defer ResourceNameCountLock.Unlock() // Ensure the lock is released even if a panic occurs
862860

861+
originalName := terraformName
862+
863+
// Check if resource already exists
864+
for {
865+
if _, exists := ResourceNameCount[terraformName]; !exists {
866+
break
867+
}
868+
count := ResourceNameCount[originalName]
869+
ResourceNameCount[originalName] = count + 1
870+
terraformName = fmt.Sprintf("%s_%d", originalName, count)
863871
}
872+
864873
ResourceNameCount[terraformName] = 1
865-
ResourceNameCountLock.Unlock()
874+
866875
return terraformName
867876
}
868877

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package commonexport
2+
3+
import (
4+
"sync"
5+
"testing"
6+
)
7+
8+
func TestUnitCheckDuplicateResourceName(t *testing.T) {
9+
ResourceNameCount = make(map[string]int)
10+
t.Run("Concurrency", func(t *testing.T) {
11+
names := []string{"resource", "resource_1", "resource_2", "resource", "resource", "resource_1"}
12+
var wg sync.WaitGroup
13+
wg.Add(len(names))
14+
15+
results := make(chan string, len(names))
16+
17+
for _, name := range names {
18+
go func(name string) {
19+
defer wg.Done()
20+
results <- CheckDuplicateResourceName(name)
21+
}(name)
22+
}
23+
24+
wg.Wait()
25+
close(results)
26+
27+
// Map to track unique results
28+
uniqueResults := make(map[string]bool)
29+
30+
for result := range results {
31+
t.Logf("result: %v\n", result)
32+
if _, exists := uniqueResults[result]; exists {
33+
t.Errorf("duplicate name found: %v", result)
34+
} else {
35+
uniqueResults[result] = true
36+
}
37+
}
38+
39+
})
40+
}

0 commit comments

Comments
 (0)