6d2fa6c583
- 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
1052 lines
31 KiB
Go
1052 lines
31 KiB
Go
package schemaversion_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion"
|
|
)
|
|
|
|
func TestV34(t *testing.T) {
|
|
tests := []migrationTestCase{
|
|
{
|
|
name: "splits CloudWatch query with multiple statistics into separate queries",
|
|
input: map[string]interface{}{
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"type": "timeseries",
|
|
"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{}{"Average", "Maximum", "Minimum"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"type": "timeseries",
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "A",
|
|
"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",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-1",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Maximum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "C",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-1",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Minimum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "converts single statistic array to statistic field",
|
|
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{}{"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",
|
|
"statistic": "Average",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "does not migrate non-CloudWatch queries",
|
|
input: map[string]interface{}{
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "A",
|
|
"expr": "up",
|
|
"datasource": "prometheus",
|
|
"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": "up",
|
|
"datasource": "prometheus",
|
|
"statistics": []interface{}{"Average", "Maximum"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "migrates CloudWatch annotation queries with multiple statistics",
|
|
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{}{"Minimum", "Sum"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"annotations": map[string]interface{}{
|
|
"list": []interface{}{
|
|
map[string]interface{}{
|
|
"name": "CloudWatch Annotation - Minimum",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-1",
|
|
"prefixMatching": false,
|
|
"statistic": "Minimum",
|
|
},
|
|
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",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles annotation with empty statistics array",
|
|
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{}{},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"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,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles annotation with single statistic",
|
|
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{}{"Average"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"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,
|
|
"statistic": "Average",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles annotation with null statistic",
|
|
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{}{nil},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"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,
|
|
// 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",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles mixed query types in same panel",
|
|
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{}{"Average", "Maximum"},
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"expr": "up",
|
|
"datasource": "prometheus",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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",
|
|
"statistic": "Average",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"expr": "up",
|
|
"datasource": "prometheus",
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "C",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-1",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Maximum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles CloudWatch query without statistics field",
|
|
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",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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: "handles missing targets gracefully",
|
|
input: map[string]interface{}{
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"type": "timeseries",
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"type": "timeseries",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "handles missing annotations gracefully",
|
|
input: map[string]interface{}{
|
|
"panels": []interface{}{},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"panels": []interface{}{},
|
|
},
|
|
},
|
|
{
|
|
name: "handles empty statistics array",
|
|
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{}{},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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{}{
|
|
"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{}{"Average", "Maximum"},
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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",
|
|
"statistic": "Average",
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
"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": "Maximum",
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "migrates CloudWatch queries in nested panels (collapsed rows)",
|
|
input: map[string]interface{}{
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"collapsed": true,
|
|
"gridPos": map[string]interface{}{
|
|
"h": 1,
|
|
"w": 24,
|
|
"x": 0,
|
|
"y": 89,
|
|
},
|
|
"id": 96,
|
|
"title": "DynamoDB",
|
|
"type": "row",
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"gridPos": map[string]interface{}{
|
|
"h": 8,
|
|
"w": 12,
|
|
"x": 0,
|
|
"y": 0,
|
|
},
|
|
"id": 4,
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "C",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "default",
|
|
"metricName": "CPUUtilization",
|
|
"statistics": []interface{}{"Average", "Minimum", "p12.21"},
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-2",
|
|
"metricName": "CPUUtilization",
|
|
"statistics": []interface{}{"Sum"},
|
|
},
|
|
},
|
|
},
|
|
map[string]interface{}{
|
|
"id": 5,
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "A",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-456"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-west-1",
|
|
"metricName": "NetworkIn",
|
|
"statistics": []interface{}{"Sum", "Min"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]interface{}{
|
|
"schemaVersion": int(34),
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"collapsed": true,
|
|
"gridPos": map[string]interface{}{
|
|
"h": 1,
|
|
"w": 24,
|
|
"x": 0,
|
|
"y": 89,
|
|
},
|
|
"id": 96,
|
|
"title": "DynamoDB",
|
|
"type": "row",
|
|
"panels": []interface{}{
|
|
map[string]interface{}{
|
|
"gridPos": map[string]interface{}{
|
|
"h": 8,
|
|
"w": 12,
|
|
"x": 0,
|
|
"y": 0,
|
|
},
|
|
"id": 4,
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "C",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "default",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Average",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-2",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Sum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "A",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "default",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Minimum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "D",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "default",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "p12.21",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
map[string]interface{}{
|
|
"id": 5,
|
|
"targets": []interface{}{
|
|
map[string]interface{}{
|
|
"refId": "A",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-456"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-west-1",
|
|
"metricName": "NetworkIn",
|
|
"statistic": "Sum",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-456"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-west-1",
|
|
"metricName": "NetworkIn",
|
|
"statistic": "Min",
|
|
"metricEditorMode": 0,
|
|
"metricQueryType": 0,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
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{}{
|
|
"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{}{"Average", "Maximum"},
|
|
"metricEditorMode": 1,
|
|
"metricQueryType": 1,
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
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",
|
|
"statistic": "Average",
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
"metricEditorMode": 1,
|
|
"metricQueryType": 1,
|
|
},
|
|
map[string]interface{}{
|
|
"refId": "B",
|
|
"dimensions": map[string]interface{}{"InstanceId": "i-123"},
|
|
"namespace": "AWS/EC2",
|
|
"region": "us-east-1",
|
|
"metricName": "CPUUtilization",
|
|
"statistic": "Maximum",
|
|
"period": "300",
|
|
"alias": "CPU Usage",
|
|
"metricEditorMode": 1,
|
|
"metricQueryType": 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
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)
|
|
}
|