From 4c15f8356e10d36fc852c52bfe4d250b95023c01 Mon Sep 17 00:00:00 2001 From: Isabella Siu Date: Fri, 20 May 2022 08:59:40 -0400 Subject: [PATCH] CloudWatch: migrate old variable queries with empty array (#49197) (#49269) (cherry picked from commit 66220758b30ebbb9f0b9594defd7bba0273c7eaf) --- .../datasource/cloudwatch/migration.test.ts | 47 +++++++++++++++---- .../datasource/cloudwatch/migrations.ts | 9 ++++ .../datasource/cloudwatch/variables.test.ts | 25 ++++++++++ .../datasource/cloudwatch/variables.ts | 6 +-- 4 files changed, 76 insertions(+), 11 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/migration.test.ts b/public/app/plugins/datasource/cloudwatch/migration.test.ts index 227036202fe..6db351bd077 100644 --- a/public/app/plugins/datasource/cloudwatch/migration.test.ts +++ b/public/app/plugins/datasource/cloudwatch/migration.test.ts @@ -210,6 +210,16 @@ describe('migration', () => { expect(query.dimensionFilters).toBe(''); }); }); + + describe('and filter value is an empty array', () => { + it('should leave an empty filter', () => { + const query = migrateVariableQuery( + 'dimension_values(us-east-1,AWS/RDS,CPUUtilization,DBInstanceIdentifier, [])' + ); + expect(query.dimensionFilters).toBe(''); + }); + }); + describe('and filter param is defined by user', () => { it('should use the user defined filter', () => { const query = migrateVariableQuery( @@ -223,14 +233,35 @@ describe('migration', () => { expect(query.dimensionFilters).toBe('{"InstanceId":"$instance_id"}'); }); }); - describe('when resource_arns query is used', () => { - it('should parse the query', () => { - const query = migrateVariableQuery('resource_arns(us-east-1,rds:db,{"environment":["$environment"]})'); - expect(query.queryType).toBe(VariableQueryType.ResourceArns); - expect(query.region).toBe('us-east-1'); - expect(query.resourceType).toBe('rds:db'); - expect(query.tags).toBe('{"environment":["$environment"]}'); - }); + }); + + describe('when resource_arns query is used', () => { + it('should parse the query', () => { + const query = migrateVariableQuery('resource_arns(us-east-1,rds:db,{"environment":["$environment"]})'); + expect(query.queryType).toBe(VariableQueryType.ResourceArns); + expect(query.region).toBe('us-east-1'); + expect(query.resourceType).toBe('rds:db'); + expect(query.tags).toBe('{"environment":["$environment"]}'); + }); + + it('should parse a empty array for tags', () => { + const query = migrateVariableQuery('resource_arns(us-east-1,rds:db, [])'); + expect(query.tags).toBe(''); + }); + }); + + describe('when ec2_instance_attribute query is used', () => { + it('should parse the query', () => { + const query = migrateVariableQuery('ec2_instance_attribute(us-east-1,rds:db,{"environment":["$environment"]})'); + expect(query.queryType).toBe(VariableQueryType.EC2InstanceAttributes); + expect(query.region).toBe('us-east-1'); + expect(query.attributeName).toBe('rds:db'); + expect(query.ec2Filters).toBe('{"environment":["$environment"]}'); + }); + + it('should parse an empty array for filters', () => { + const query = migrateVariableQuery('ec2_instance_attribute(us-east-1,rds:db,[])'); + expect(query.ec2Filters).toBe(''); }); }); }); diff --git a/public/app/plugins/datasource/cloudwatch/migrations.ts b/public/app/plugins/datasource/cloudwatch/migrations.ts index 0430946fb0c..6585f6e28af 100644 --- a/public/app/plugins/datasource/cloudwatch/migrations.ts +++ b/public/app/plugins/datasource/cloudwatch/migrations.ts @@ -124,6 +124,9 @@ export function migrateVariableQuery(rawQuery: string | VariableQuery): Variable newQuery.metricName = dimensionValuesQuery[3]; newQuery.dimensionKey = dimensionValuesQuery[4]; newQuery.dimensionFilters = dimensionValuesQuery[6] || ''; + if (newQuery.dimensionFilters === '[]') { + newQuery.dimensionFilters = ''; + } return newQuery; } @@ -141,6 +144,9 @@ export function migrateVariableQuery(rawQuery: string | VariableQuery): Variable newQuery.region = ec2InstanceAttributeQuery[1]; newQuery.attributeName = ec2InstanceAttributeQuery[2]; newQuery.ec2Filters = ec2InstanceAttributeQuery[3] || ''; + if (newQuery.ec2Filters === '[]') { + newQuery.ec2Filters = ''; + } return newQuery; } @@ -150,6 +156,9 @@ export function migrateVariableQuery(rawQuery: string | VariableQuery): Variable newQuery.region = resourceARNsQuery[1]; newQuery.resourceType = resourceARNsQuery[2]; newQuery.tags = resourceARNsQuery[3] || ''; + if (newQuery.tags === '[]') { + newQuery.tags = ''; + } return newQuery; } diff --git a/public/app/plugins/datasource/cloudwatch/variables.test.ts b/public/app/plugins/datasource/cloudwatch/variables.test.ts index e4d2bd4dc0d..c4c95f5ea98 100644 --- a/public/app/plugins/datasource/cloudwatch/variables.test.ts +++ b/public/app/plugins/datasource/cloudwatch/variables.test.ts @@ -74,6 +74,7 @@ describe('variables', () => { expect(getDimensionValues).not.toBeCalled(); expect(result).toEqual([]); }); + it('should run if values are set', async () => { const result = await variables.execute(query); expect(getDimensionValues).toBeCalledWith(query.region, query.namespace, query.metricName, query.dimensionKey, { @@ -81,6 +82,18 @@ describe('variables', () => { }); expect(result).toEqual([{ text: 'e', value: 'e', expandable: true }]); }); + + it('should replace empty array filters with empty object', async () => { + const result = await variables.execute({ ...query, dimensionFilters: '[]' }); + expect(getDimensionValues).toBeCalledWith( + query.region, + query.namespace, + query.metricName, + query.dimensionKey, + {} + ); + expect(result).toEqual([{ text: 'e', value: 'e', expandable: true }]); + }); }); describe('EBS volume ids', () => { @@ -129,6 +142,12 @@ describe('variables', () => { expect(getEc2InstanceAttribute).toBeCalledWith(query.region, query.attributeName, { env: ['b'] }); expect(result).toEqual([{ text: 'g', value: 'g', expandable: true }]); }); + + it('should replace empty array filters with empty object', async () => { + const result = await variables.execute({ ...query, ec2Filters: '[]' }); + expect(getEc2InstanceAttribute).toBeCalledWith(query.region, query.attributeName, {}); + expect(result).toEqual([{ text: 'g', value: 'g', expandable: true }]); + }); }); describe('resource arns', () => { @@ -154,6 +173,12 @@ describe('variables', () => { expect(getResourceARNs).toBeCalledWith(query.region, query.resourceType, { a: ['InstanceId', 'InstanceType'] }); expect(result).toEqual([{ text: 'h', value: 'h', expandable: true }]); }); + + it('should replace empty array tags with empty object', async () => { + const result = await variables.execute({ ...query, tags: '[]' }); + expect(getResourceARNs).toBeCalledWith(query.region, query.resourceType, {}); + expect(result).toEqual([{ text: 'h', value: 'h', expandable: true }]); + }); }); it('should run statistics', async () => { diff --git a/public/app/plugins/datasource/cloudwatch/variables.ts b/public/app/plugins/datasource/cloudwatch/variables.ts index f251e15a2fd..d40b27fcb17 100644 --- a/public/app/plugins/datasource/cloudwatch/variables.ts +++ b/public/app/plugins/datasource/cloudwatch/variables.ts @@ -96,7 +96,7 @@ export class CloudWatchVariableSupport extends CustomVariableSupport