From ce1b1bc36bee753e5484ba06126c121ef9131a45 Mon Sep 17 00:00:00 2001 From: Isabella Siu Date: Wed, 18 May 2022 13:51:18 -0400 Subject: [PATCH] CloudWatch: migrate variable query dimension filter (#48562) * CloudWatch: migrate variable query dimension filter * separate tests --- .../variableQueryMigrations.test.ts | 48 +++++++++++++++---- .../migrations/variableQueryMigrations.ts | 10 +++- .../plugins/datasource/cloudwatch/types.ts | 2 +- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.test.ts b/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.test.ts index 5f6534f5c6a..5d19c2dc216 100644 --- a/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.test.ts +++ b/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.test.ts @@ -71,26 +71,56 @@ describe('variableQueryMigrations', () => { }); }); describe('when OldVariableQuery is used', () => { - it('should parse the query', () => { + const baseOldQuery: OldVariableQuery = { + queryType: VariableQueryType.Regions, + namespace: '', + region: 'us-east-1', + metricName: '', + dimensionKey: '', + dimensionFilters: '', + ec2Filters: '', + instanceID: '', + attributeName: '', + resourceType: '', + tags: '', + refId: '', + }; + it('should parse ec2 query', () => { const oldQuery: OldVariableQuery = { + ...baseOldQuery, queryType: VariableQueryType.EC2InstanceAttributes, - namespace: '', - region: 'us-east-1', - metricName: '', - dimensionKey: '', ec2Filters: '{"environment":["$environment"]}', - instanceID: '', attributeName: 'rds:db', - resourceType: 'elasticloadbalancing:loadbalancer', - tags: '{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]}', - refId: '', }; const query = migrateVariableQuery(oldQuery); expect(query.region).toBe('us-east-1'); expect(query.attributeName).toBe('rds:db'); expect(query.ec2Filters).toStrictEqual({ environment: ['$environment'] }); + }); + it('should parse resource arn query', () => { + const oldQuery: OldVariableQuery = { + ...baseOldQuery, + queryType: VariableQueryType.ResourceArns, + resourceType: 'elasticloadbalancing:loadbalancer', + tags: '{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]}', + }; + const query = migrateVariableQuery(oldQuery); + expect(query.region).toBe('us-east-1'); expect(query.resourceType).toBe('elasticloadbalancing:loadbalancer'); expect(query.tags).toStrictEqual({ 'elasticbeanstalk:environment-name': ['myApp-dev', 'myApp-prod'] }); }); + it('should parse dimension values query', () => { + const oldQuery: OldVariableQuery = { + ...baseOldQuery, + queryType: VariableQueryType.DimensionValues, + metricName: 'foo', + dimensionKey: 'bar', + dimensionFilters: '{"InstanceId":"$instanceid"}', + }; + const query = migrateVariableQuery(oldQuery); + expect(query.metricName).toBe('foo'); + expect(query.dimensionKey).toBe('bar'); + expect(query.dimensionFilters).toStrictEqual({ InstanceId: '$instanceid' }); + }); }); }); diff --git a/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.ts b/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.ts index 25fae8c167a..add19cbfbcb 100644 --- a/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.ts +++ b/public/app/plugins/datasource/cloudwatch/migrations/variableQueryMigrations.ts @@ -13,10 +13,18 @@ export function migrateVariableQuery(rawQuery: string | VariableQuery | OldVaria // rawQuery is OldVariableQuery if (typeof rawQuery !== 'string') { - const newQuery: VariableQuery = omit(rawQuery, ['ec2Filters', 'tags']); + const newQuery: VariableQuery = omit(rawQuery, ['dimensionFilters', 'ec2Filters', 'tags']); + newQuery.dimensionFilters = {}; newQuery.ec2Filters = {}; newQuery.tags = {}; + if (rawQuery.dimensionFilters !== '') { + try { + newQuery.dimensionFilters = JSON.parse(rawQuery.dimensionFilters); + } catch { + throw new Error(`unable to migrate poorly formed filters: ${rawQuery.dimensionFilters}`); + } + } if (rawQuery.ec2Filters !== '') { try { newQuery.ec2Filters = JSON.parse(rawQuery.ec2Filters); diff --git a/public/app/plugins/datasource/cloudwatch/types.ts b/public/app/plugins/datasource/cloudwatch/types.ts index 9a5545b64fa..8f638a8d132 100644 --- a/public/app/plugins/datasource/cloudwatch/types.ts +++ b/public/app/plugins/datasource/cloudwatch/types.ts @@ -384,7 +384,7 @@ export interface OldVariableQuery extends DataQuery { region: string; metricName: string; dimensionKey: string; - dimensionFilters?: Dimensions; + dimensionFilters: string; ec2Filters: string; instanceID: string; attributeName: string;