From 4044cc9aebad00530a5464b82ce3e3d20230d27c Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Mon, 29 Nov 2021 04:25:43 -0500 Subject: [PATCH] CloudMonitoring: Avoid to escape regexps in filters (#41961) (#42417) (cherry picked from commit 9cbc872f228b092962194ec19bbf47261cd46df4) Co-authored-by: Andres Martinez Gotor --- .../datasource/cloud-monitoring/datasource.ts | 6 ++++-- .../cloud-monitoring/specs/datasource.test.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/cloud-monitoring/datasource.ts b/public/app/plugins/datasource/cloud-monitoring/datasource.ts index e6762799894..94b78a815f8 100644 --- a/public/app/plugins/datasource/cloud-monitoring/datasource.ts +++ b/public/app/plugins/datasource/cloud-monitoring/datasource.ts @@ -1,4 +1,4 @@ -import { chunk, flatten, isString } from 'lodash'; +import { chunk, flatten, isString, isArray } from 'lodash'; import { from, lastValueFrom, Observable, of } from 'rxjs'; import { map, mergeMap } from 'rxjs/operators'; import { @@ -296,7 +296,9 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend< completeFilter.map(({ key, operator, value, condition }: Filter) => [ this.templateSrv.replace(key, scopedVars || {}), operator, - this.templateSrv.replace(value, scopedVars || {}, 'regex'), + this.templateSrv.replace(value, scopedVars || {}, (value: string | string[]) => { + return isArray(value) && value.length ? `(${value.join('|')})` : value; + }), ...(condition ? [condition] : []), ]) ); diff --git a/public/app/plugins/datasource/cloud-monitoring/specs/datasource.test.ts b/public/app/plugins/datasource/cloud-monitoring/specs/datasource.test.ts index db478db95d6..2058e476feb 100644 --- a/public/app/plugins/datasource/cloud-monitoring/specs/datasource.test.ts +++ b/public/app/plugins/datasource/cloud-monitoring/specs/datasource.test.ts @@ -113,6 +113,22 @@ describe('CloudMonitoringDataSource', () => { expect(interpolated[2]).toBe('(filtervalue1|filtervalue2)'); }); + + it('should not escape a regex', () => { + const templateSrv = initTemplateSrv('/[a-Z]*.html', true); + const { ds } = getTestcontext({ templateSrv }); + const interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '[[test]]'], {}); + + expect(interpolated[2]).toBe('/[a-Z]*.html'); + }); + + it('should not escape an array of regexes but join them as a regex', () => { + const templateSrv = initTemplateSrv(['/[a-Z]*.html', '/foo.html'], true); + const { ds } = getTestcontext({ templateSrv }); + const interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '[[test]]'], {}); + + expect(interpolated[2]).toBe('(/[a-Z]*.html|/foo.html)'); + }); }); });