Dashboard: Backend always set metricEditorMode: 0 regardless metricQueryType and expression (#111613)
- Fix metricEditorMode logic to match frontend hasOwnProperty behavior - Fix metricQueryType to only set when property doesn't exist - Fix statistics processing to handle all types like frontend does - Fix null statistic handling to match frontend behavior - Fix object string representation to match JavaScript behavior - Add comprehensive test coverage for all CloudWatch migration scenarios - Achieve 100% backend-frontend consistency for v34 migration * Fix v34 CloudWatch migration backend-frontend inconsistencies - Fix metricEditorMode logic to match frontend hasOwnProperty behavior - Fix metricQueryType to only set when property doesn't exist - Fix statistics processing to handle all types like frontend does - Fix null statistic handling to match frontend behavior - Fix object string representation to match JavaScript behavior - Add comprehensive test coverage for all CloudWatch migration scenarios - Achieve 100% backend-frontend consistency for v34 migration * Improve v34 CloudWatch migration test coverage - Add targeted tests for hasOwnProperty logic coverage - Add comprehensive getSuffixForStat coverage (all data types) - Add generateNextRefId double letter generation tests - Simplify test cases while maintaining full coverage - Achieve 93%+ coverage on all critical v34 functions - Remove redundant test cases for better maintainability * Clean up v34 CloudWatch migration code - Remove unnecessary comments and documentation - Simplify function signatures and logic - Maintain functionality while improving readability - Keep essential logic intact with cleaner code * Only remove unnecessary comments
This commit is contained in:
@@ -185,7 +185,7 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles invalid statistics in CloudWatch annotation queries",
|
||||
name: "handles annotation with empty statistics array",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
@@ -195,7 +195,7 @@ func TestV34(t *testing.T) {
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistics": []interface{}{123, "Sum", nil},
|
||||
"statistics": []interface{}{},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -205,15 +205,7 @@ func TestV34(t *testing.T) {
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - Sum",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": "Sum",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - null",
|
||||
"name": "CloudWatch Annotation",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
@@ -224,7 +216,7 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles multiple valid statistics mixed with invalid ones in annotation",
|
||||
name: "handles annotation with single statistic",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
@@ -234,7 +226,7 @@ func TestV34(t *testing.T) {
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistics": []interface{}{123, "Sum", nil, "Average"},
|
||||
"statistics": []interface{}{"Average"},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -244,22 +236,7 @@ func TestV34(t *testing.T) {
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - Sum",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": "Sum",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - null",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - Average",
|
||||
"name": "CloudWatch Annotation",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
@@ -271,7 +248,7 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles CloudWatch annotation with all invalid statistics",
|
||||
name: "handles annotation with null statistic",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
@@ -281,7 +258,7 @@ func TestV34(t *testing.T) {
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistics": []interface{}{123, nil, map[string]interface{}{"invalid": "value"}},
|
||||
"statistics": []interface{}{nil},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -296,6 +273,87 @@ func TestV34(t *testing.T) {
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
// No statistic property for null
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles annotation with all suffix types (for getSuffixForStat coverage)",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistics": []interface{}{123, true, false, map[string]interface{}{}, []interface{}{}, "", "Average"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - 123",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": 123,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - true",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": true,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - false",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": false,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - [object Object]",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": map[string]interface{}{},
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - ",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": []interface{}{},
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - ",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": "",
|
||||
},
|
||||
map[string]interface{}{
|
||||
"name": "CloudWatch Annotation - Average",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"prefixMatching": false,
|
||||
"statistic": "Average",
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -468,94 +526,6 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles invalid statistics values gracefully",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistics": []interface{}{123, nil, "Average", map[string]interface{}{"invalid": "value"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"refId": "B",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistic": "Average",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles CloudWatch query with all invalid statistics",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistics": []interface{}{123, nil, map[string]interface{}{"invalid": "value"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "preserves other query properties during migration",
|
||||
input: map[string]interface{}{
|
||||
@@ -768,6 +738,88 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "preserves existing metricQueryType (hasOwnProperty test)",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricQueryType": 1, // Already exists - should be preserved
|
||||
"statistics": []interface{}{"Average"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricQueryType": 1, // Preserved
|
||||
"metricEditorMode": 1, // Set to Code due to Insights
|
||||
"statistic": "Average",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "preserves existing metricEditorMode (hasOwnProperty test)",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricEditorMode": 1, // Already exists - should be preserved
|
||||
"statistics": []interface{}{"Average"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{
|
||||
"refId": "A",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"metricEditorMode": 1, // Preserved
|
||||
"metricQueryType": 0, // Set to default
|
||||
"statistic": "Average",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "preserves existing metricEditorMode and metricQueryType values",
|
||||
input: map[string]interface{}{
|
||||
@@ -826,6 +878,174 @@ func TestV34(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles refId generation with existing refIds",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{"refId": "A", "expr": "prometheus"},
|
||||
map[string]interface{}{"refId": "C", "expr": "prometheus"}, // Skip B to test gap filling
|
||||
map[string]interface{}{
|
||||
"refId": "D",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistics": []interface{}{"Average", "Maximum"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": []interface{}{
|
||||
map[string]interface{}{"refId": "A", "expr": "prometheus"},
|
||||
map[string]interface{}{"refId": "C", "expr": "prometheus"},
|
||||
map[string]interface{}{
|
||||
"refId": "D",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistic": "Average",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
},
|
||||
map[string]interface{}{
|
||||
"refId": "B", // Should use the available B
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistic": "Maximum",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles non-CloudWatch annotation (skips migration)",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "Regular Annotation",
|
||||
"datasource": "prometheus",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"annotations": map[string]interface{}{
|
||||
"list": []interface{}{
|
||||
map[string]interface{}{
|
||||
"name": "Regular Annotation",
|
||||
"datasource": "prometheus",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles missing annotations list",
|
||||
input: map[string]interface{}{
|
||||
"annotations": map[string]interface{}{},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"annotations": map[string]interface{}{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "handles missing annotations entirely",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "tests generateNextRefId double letter generation",
|
||||
input: map[string]interface{}{
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": func() []interface{} {
|
||||
targets := []interface{}{}
|
||||
// Create A-Z refIds
|
||||
for c := 'A'; c <= 'Z'; c++ {
|
||||
targets = append(targets, map[string]interface{}{
|
||||
"refId": string(c),
|
||||
"expr": "prometheus",
|
||||
})
|
||||
}
|
||||
// Add CloudWatch query that will need double letter refId
|
||||
targets = append(targets, map[string]interface{}{
|
||||
"refId": "AA",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistics": []interface{}{"Average", "Maximum"},
|
||||
})
|
||||
return targets
|
||||
}(),
|
||||
},
|
||||
},
|
||||
},
|
||||
expected: map[string]interface{}{
|
||||
"schemaVersion": int(34),
|
||||
"panels": []interface{}{
|
||||
map[string]interface{}{
|
||||
"id": 1,
|
||||
"targets": func() []interface{} {
|
||||
targets := []interface{}{}
|
||||
// Create A-Z refIds
|
||||
for c := 'A'; c <= 'Z'; c++ {
|
||||
targets = append(targets, map[string]interface{}{
|
||||
"refId": string(c),
|
||||
"expr": "prometheus",
|
||||
})
|
||||
}
|
||||
// Add the migrated CloudWatch queries
|
||||
targets = append(targets, map[string]interface{}{
|
||||
"refId": "AA",
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistic": "Average",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
})
|
||||
targets = append(targets, map[string]interface{}{
|
||||
"refId": "AB", // Next available double letter
|
||||
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
||||
"namespace": "AWS/EC2",
|
||||
"region": "us-east-1",
|
||||
"metricName": "CPUUtilization",
|
||||
"statistic": "Maximum",
|
||||
"metricEditorMode": 0,
|
||||
"metricQueryType": 0,
|
||||
})
|
||||
return targets
|
||||
}(),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
runMigrationTests(t, tests, schemaversion.V34)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user