Skip to content

Commit 1516e1f

Browse files
committed
Fix SKU category mapping
1 parent f09e10c commit 1516e1f

File tree

3 files changed

+132
-73
lines changed

3 files changed

+132
-73
lines changed

generated-usage-examples/go/atlas-sdk-go/project-copy/internal/billing/sku_classifier.go

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,73 @@ import (
66

77
// determineProvider identifies the cloud provider based on SKU
88
func determineProvider(sku string) string {
9-
if strings.Contains(sku, "AWS") {
9+
uppercaseSku := strings.ToUpper(sku)
10+
11+
if strings.Contains(uppercaseSku, "AWS") {
1012
return "AWS"
11-
} else if strings.Contains(sku, "AZURE") {
13+
} else if strings.Contains(strings.ToUpper(sku), "AZURE") {
1214
return "AZURE"
13-
} else if strings.Contains(sku, "GCP") {
15+
} else if strings.Contains(strings.ToUpper(sku), "GCP") {
1416
return "GCP"
1517
}
1618
return "n/a"
1719
}
1820

1921
// determineInstance extracts the instance type from SKU
2022
func determineInstance(sku string) string {
21-
parts := strings.Split(sku, "_INSTANCE_")
23+
uppercaseSku := strings.ToUpper(sku)
24+
25+
parts := strings.Split(uppercaseSku, "_INSTANCE_")
2226
if len(parts) > 1 {
2327
return parts[1]
2428
}
2529
return "non-instance"
2630
}
2731

28-
// determineCategory categorizes the SKU
32+
// determineCategory identifies the service category based on SKU
2933
func determineCategory(sku string) string {
30-
categoryPatterns := map[string]string{
31-
"_INSTANCE": "instances",
32-
"BACKUP": "backup",
33-
"PIT_RESTORE": "backup",
34-
"DATA_TRANSFER": "data xfer",
35-
"STORAGE": "storage",
36-
"BI_CONNECTOR": "bi-connector",
37-
"DATA_LAKE": "data lake",
38-
"AUDITING": "audit",
39-
"ATLAS_SUPPORT": "support",
40-
"FREE_SUPPORT": "free support",
41-
"CHARTS": "charts",
42-
"SERVERLESS": "serverless",
43-
"SECURITY": "security",
44-
"PRIVATE_ENDPOINT": "private endpoint",
34+
uppercaseSku := strings.ToUpper(sku)
35+
36+
// Category patterns are defined in order of specificity
37+
categoryPatterns := []struct {
38+
pattern string
39+
category string
40+
}{
41+
{"CLASSIC_BACKUP", "Legacy Backup"},
42+
{"BACKUP_SNAPSHOT", "Backup"},
43+
{"BACKUP_DOWNLOAD", "Backup"},
44+
{"BACKUP_STORAGE", "Backup"},
45+
{"DATA_FEDERATION", "Atlas Data Federation"},
46+
{"DATA_LAKE", "Atlas Data Federation"},
47+
{"STREAM_PROCESSING", "Atlas Stream Processing"},
48+
{"PRIVATE_ENDPOINT", "Data Transfer"},
49+
{"DATA_TRANSFER", "Data Transfer"},
50+
{"SNAPSHOT_COPY", "Backup"},
51+
{"SNAPSHOT_EXPORT", "Backup"},
52+
{"OBJECT_STORAGE", "Backup"},
53+
{"PIT_RESTORE", "Backup"},
54+
{"BI_CONNECTOR", "BI Connector"},
55+
{"CHARTS", "Charts"},
56+
{"INSTANCE", "Clusters"},
57+
{"MMS", "Cloud Manager Standard/Premium"},
58+
{"CLASSIC_COUPON", "Credits"},
59+
{"CREDIT", "Credits"},
60+
{"MINIMUM_CHARGE", "Credits"},
61+
{"FLEX_CONSULTING", "Flex Consulting"},
62+
{"AUDITING", "Premium Features"},
63+
{"ADVANCED_SECURITY", "Premium Features"},
64+
{"SERVERLESS", "Serverless Instances"},
65+
{"STORAGE", "Storage"},
66+
{"ENTITLEMENTS", "Support"},
67+
{"FREE_SUPPORT", "Support"},
68+
{"REALM", "App Services"},
69+
{"STITCH", "App Services"},
4570
}
4671

47-
for pattern, category := range categoryPatterns {
48-
if strings.Contains(sku, pattern) {
49-
return category
72+
for _, pc := range categoryPatterns {
73+
if strings.Index(uppercaseSku, pc.pattern) != -1 {
74+
return pc.category
5075
}
5176
}
52-
return "other"
77+
return "Other"
5378
}

usage-examples/go/atlas-sdk-go/internal/billing/sku_classifier.go

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,48 +6,73 @@ import (
66

77
// determineProvider identifies the cloud provider based on SKU
88
func determineProvider(sku string) string {
9-
if strings.Contains(sku, "AWS") {
9+
uppercaseSku := strings.ToUpper(sku)
10+
11+
if strings.Contains(uppercaseSku, "AWS") {
1012
return "AWS"
11-
} else if strings.Contains(sku, "AZURE") {
13+
} else if strings.Contains(strings.ToUpper(sku), "AZURE") {
1214
return "AZURE"
13-
} else if strings.Contains(sku, "GCP") {
15+
} else if strings.Contains(strings.ToUpper(sku), "GCP") {
1416
return "GCP"
1517
}
1618
return "n/a"
1719
}
1820

1921
// determineInstance extracts the instance type from SKU
2022
func determineInstance(sku string) string {
21-
parts := strings.Split(sku, "_INSTANCE_")
23+
uppercaseSku := strings.ToUpper(sku)
24+
25+
parts := strings.Split(uppercaseSku, "_INSTANCE_")
2226
if len(parts) > 1 {
2327
return parts[1]
2428
}
2529
return "non-instance"
2630
}
2731

28-
// determineCategory categorizes the SKU
32+
// determineCategory identifies the service category based on SKU
2933
func determineCategory(sku string) string {
30-
categoryPatterns := map[string]string{
31-
"_INSTANCE": "instances",
32-
"BACKUP": "backup",
33-
"PIT_RESTORE": "backup",
34-
"DATA_TRANSFER": "data xfer",
35-
"STORAGE": "storage",
36-
"BI_CONNECTOR": "bi-connector",
37-
"DATA_LAKE": "data lake",
38-
"AUDITING": "audit",
39-
"ATLAS_SUPPORT": "support",
40-
"FREE_SUPPORT": "free support",
41-
"CHARTS": "charts",
42-
"SERVERLESS": "serverless",
43-
"SECURITY": "security",
44-
"PRIVATE_ENDPOINT": "private endpoint",
34+
uppercaseSku := strings.ToUpper(sku)
35+
36+
// Category patterns are defined in order of specificity
37+
categoryPatterns := []struct {
38+
pattern string
39+
category string
40+
}{
41+
{"CLASSIC_BACKUP", "Legacy Backup"},
42+
{"BACKUP_SNAPSHOT", "Backup"},
43+
{"BACKUP_DOWNLOAD", "Backup"},
44+
{"BACKUP_STORAGE", "Backup"},
45+
{"DATA_FEDERATION", "Atlas Data Federation"},
46+
{"DATA_LAKE", "Atlas Data Federation"},
47+
{"STREAM_PROCESSING", "Atlas Stream Processing"},
48+
{"PRIVATE_ENDPOINT", "Data Transfer"},
49+
{"DATA_TRANSFER", "Data Transfer"},
50+
{"SNAPSHOT_COPY", "Backup"},
51+
{"SNAPSHOT_EXPORT", "Backup"},
52+
{"OBJECT_STORAGE", "Backup"},
53+
{"PIT_RESTORE", "Backup"},
54+
{"BI_CONNECTOR", "BI Connector"},
55+
{"CHARTS", "Charts"},
56+
{"INSTANCE", "Clusters"},
57+
{"MMS", "Cloud Manager Standard/Premium"},
58+
{"CLASSIC_COUPON", "Credits"},
59+
{"CREDIT", "Credits"},
60+
{"MINIMUM_CHARGE", "Credits"},
61+
{"FLEX_CONSULTING", "Flex Consulting"},
62+
{"AUDITING", "Premium Features"},
63+
{"ADVANCED_SECURITY", "Premium Features"},
64+
{"SERVERLESS", "Serverless Instances"},
65+
{"STORAGE", "Storage"},
66+
{"ENTITLEMENTS", "Support"},
67+
{"FREE_SUPPORT", "Support"},
68+
{"REALM", "App Services"},
69+
{"STITCH", "App Services"},
4570
}
4671

47-
for pattern, category := range categoryPatterns {
48-
if strings.Contains(sku, pattern) {
49-
return category
72+
for _, pc := range categoryPatterns {
73+
if strings.Index(uppercaseSku, pc.pattern) != -1 {
74+
return pc.category
5075
}
5176
}
52-
return "other"
77+
return "Other"
5378
}

usage-examples/go/atlas-sdk-go/internal/billing/sku_classifier_test.go

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ func TestDetermineProvider(t *testing.T) {
1212
sku string
1313
expected string
1414
}{
15-
{"AWS SKU", "MONGODB_ATLAS_AWS_INSTANCE_M10", "AWS"},
16-
{"AZURE SKU", "MONGODB_ATLAS_AZURE_INSTANCE_M20", "AZURE"},
17-
{"GCP SKU", "MONGODB_ATLAS_GCP_INSTANCE_M30", "GCP"},
18-
{"Unknown provider", "MONGODB_ATLAS_INSTANCE_M40", "n/a"},
15+
{"AWS SKU", "NDS_AWS_INSTANCE_M10", "AWS"},
16+
{"AZURE SKU", "NDS_AZURE_INSTANCE_M20", "AZURE"},
17+
{"GCP SKU", "NDS_GCP_INSTANCE_M30", "GCP"},
18+
{"Unknown provider", "NDS_INSTANCE_M40", "n/a"},
1919
{"Empty SKU", "", "n/a"},
20+
{"Mixed case", "nds_Aws_instance", "AWS"},
2021
}
2122

2223
for _, tc := range tests {
@@ -33,11 +34,11 @@ func TestDetermineInstance(t *testing.T) {
3334
sku string
3435
expected string
3536
}{
36-
{"Basic instance", "MONGODB_ATLAS_AWS_INSTANCE_M10", "M10"},
37-
{"Complex instance name", "MONGODB_ATLAS_AWS_INSTANCE_M30_NVME", "M30_NVME"},
38-
{"No instance marker", "MONGODB_ATLAS_BACKUP", "non-instance"},
37+
{"Basic instance", "NDS_AWS_INSTANCE_M10", "M10"},
38+
{"Complex instance name", "NDS_AWS_INSTANCE_M40_NVME", "M40_NVME"},
39+
{"Serverless instance", "NDS_AWS_SERVERLESS_RPU", "non-instance"},
3940
{"Empty SKU", "", "non-instance"},
40-
{"Multiple instance markers", "INSTANCE_M10_INSTANCE_M20", "M20"},
41+
{"Search instance", "NDS_AWS_SEARCH_INSTANCE_S20_COMPUTE_NVME", "S20_COMPUTE_NVME"},
4142
}
4243

4344
for _, tc := range tests {
@@ -54,23 +55,31 @@ func TestDetermineCategory(t *testing.T) {
5455
sku string
5556
expected string
5657
}{
57-
{"Instance category", "MONGODB_ATLAS_AWS_INSTANCE_M10", "instances"},
58-
{"Backup category", "MONGODB_ATLAS_BACKUP", "backup"},
59-
{"PIT Restore", "MONGODB_ATLAS_PIT_RESTORE", "backup"},
60-
{"Data Transfer", "MONGODB_ATLAS_DATA_TRANSFER", "data xfer"},
61-
{"Storage", "MONGODB_ATLAS_STORAGE", "storage"},
62-
{"BI Connector", "MONGODB_ATLAS_BI_CONNECTOR", "bi-connector"},
63-
{"Data Lake", "MONGODB_ATLAS_DATA_LAKE", "data lake"},
64-
{"Auditing", "MONGODB_ATLAS_AUDITING", "audit"},
65-
{"Atlas Support", "MONGODB_ATLAS_SUPPORT", "support"},
66-
{"Free Support", "MONGODB_ATLAS_FREE_SUPPORT", "free support"},
67-
{"Charts", "MONGODB_ATLAS_CHARTS", "charts"},
68-
{"Serverless", "MONGODB_ATLAS_SERVERLESS", "serverless"},
69-
{"Security", "MONGODB_ATLAS_SECURITY", "security"},
70-
{"Private Endpoint", "MONGODB_ATLAS_PRIVATE_ENDPOINT", "private endpoint"},
71-
{"Other category", "MONGODB_ATLAS_UNKNOWN", "other"},
72-
{"Empty SKU", "", "other"},
73-
{"Multiple patterns", "MONGODB_ATLAS_BACKUP_STORAGE", "backup"}, // First match should win
58+
{"Instance category", "NDS_AWS_INSTANCE_M10", "Clusters"},
59+
{"Backup category", "NDS_AWS_BACKUP_SNAPSHOT_STORAGE", "Backup"},
60+
{"PIT Restore", "NDS_AWS_PIT_RESTORE_STORAGE", "Backup"},
61+
{"Legacy Backup", "CLASSIC_BACKUP_STORAGE", "Legacy Backup"},
62+
{"Data Transfer", "NDS_AWS_DATA_TRANSFER_SAME_REGION", "Data Transfer"},
63+
{"Storage", "NDS_AWS_STORAGE_STANDARD", "Storage"},
64+
{"BI Connector", "NDS_BI_CONNECTOR", "BI Connector"},
65+
{"Data Lake", "DATA_LAKE_AWS_DATA_SCANNED", "Atlas Data Federation"},
66+
{"Data Federation", "DATA_FEDERATION_AZURE_DATA_SCANNED", "Atlas Data Federation"},
67+
{"Auditing", "NDS_ENTERPRISE_AUDITING", "Premium Features"},
68+
{"Atlas Support", "NDS_ENTITLEMENTS", "Support"},
69+
{"Free Support", "NDS_FREE_SUPPORT", "Support"},
70+
{"Charts", "CHARTS_DATA_DOWNLOADED", "Charts"},
71+
{"Serverless", "NDS_AWS_SERVERLESS_RPU", "Serverless Instances"},
72+
{"Security", "NDS_ADVANCED_SECURITY", "Premium Features"},
73+
{"Private Endpoint", "NDS_AWS_PRIVATE_ENDPOINT", "Data Transfer"},
74+
{"Cloud Manager", "MMS_PREMIUM", "Cloud Manager Standard/Premium"},
75+
{"Stream Processing", "NDS_AWS_STREAM_PROCESSING_INSTANCE_SP10", "Atlas Stream Processing"},
76+
{"App Services", "REALM_APP_REQUESTS", "App Services"},
77+
{"Credits", "CREDIT", "Credits"},
78+
{"Flex Consulting", "MONGODB_FLEX_CONSULTING", "Flex Consulting"},
79+
{"Other category", "UNKNOWN_SKU_TYPE", "Other"},
80+
{"Empty SKU", "", "Other"},
81+
{"Overlapping patterns", "NDS_AWS_SERVERLESS_STORAGE", "Serverless Instances"},
82+
{"Conflicting patterns", "NDS_AZURE_DATA_LAKE_STORAGE", "Atlas Data Federation"},
7483
}
7584

7685
for _, tc := range tests {

0 commit comments

Comments
 (0)