From 9941e06e222cec0cf2347c9bc5b719621b28d251 Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Wed, 6 Jul 2022 19:27:21 +0200 Subject: [PATCH] Plugins: InfluxDB variable interpolation fix for influxdbBackendMigration feature flag (#51624) --- .../plugins/datasource/influxdb/datasource.ts | 10 ++-- .../influxdb/specs/datasource.test.ts | 57 ++++++++++++++----- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/public/app/plugins/datasource/influxdb/datasource.ts b/public/app/plugins/datasource/influxdb/datasource.ts index 3001fcd2467..20c72684e2c 100644 --- a/public/app/plugins/datasource/influxdb/datasource.ts +++ b/public/app/plugins/datasource/influxdb/datasource.ts @@ -5,6 +5,7 @@ import { v4 as uuidv4 } from 'uuid'; import { AnnotationEvent, + AnnotationQueryRequest, ArrayVector, DataFrame, DataQueryError, @@ -21,7 +22,6 @@ import { TIME_SERIES_TIME_FIELD_NAME, TIME_SERIES_VALUE_FIELD_NAME, TimeSeries, - AnnotationQueryRequest, } from '@grafana/data'; import { BackendDataSourceResponse, @@ -240,7 +240,7 @@ export default class InfluxDatasource extends DataSourceWithBackend { }); describe('Variables should be interpolated correctly', () => { - const templateSrv: any = { replace: jest.fn() }; const instanceSettings: any = {}; - const ds = new InfluxDatasource(instanceSettings, templateSrv); const text = 'interpolationText'; - templateSrv.replace.mockReturnValue(text); + const text2 = 'interpolationText2'; + const textWithoutFormatRegex = 'interpolationText,interpolationText2'; + const textWithFormatRegex = 'interpolationText|interpolationText2'; + const variableMap: Record = { + $interpolationVar: text, + $interpolationVar2: text2, + }; + const templateSrv: any = { + replace: jest.fn((target?: string, scopedVars?: ScopedVars, format?: string | Function): string => { + if (!format) { + return variableMap[target!] || ''; + } + if (format === 'regex') { + return textWithFormatRegex; + } + return textWithoutFormatRegex; + }), + }; + const ds = new InfluxDatasource(instanceSettings, templateSrv); const fluxQuery = { refId: 'x', - query: '$interpolationVar', + query: '$interpolationVar,$interpolationVar2', }; const influxQuery = { @@ -202,7 +219,7 @@ describe('InfluxDataSource', () => { { key: 'cpu', operator: '=~', - value: '/^$interpolationVar$/', + value: '/^$interpolationVar,$interpolationVar2$/', }, ], groupBy: [ @@ -223,20 +240,20 @@ describe('InfluxDataSource', () => { function fluxChecks(query: any) { expect(templateSrv.replace).toBeCalledTimes(1); - expect(query).toBe(text); + expect(query).toBe(textWithFormatRegex); } function influxChecks(query: any) { expect(templateSrv.replace).toBeCalledTimes(10); expect(query.alias).toBe(text); - expect(query.measurement).toBe(text); - expect(query.policy).toBe(text); - expect(query.limit).toBe(text); - expect(query.slimit).toBe(text); + expect(query.measurement).toBe(textWithFormatRegex); + expect(query.policy).toBe(textWithFormatRegex); + expect(query.limit).toBe(textWithFormatRegex); + expect(query.slimit).toBe(textWithFormatRegex); expect(query.tz).toBe(text); - expect(query.tags![0].value).toBe(text); - expect(query.groupBy![0].params![0]).toBe(text); - expect(query.select![0][0].params![0]).toBe(text); + expect(query.tags![0].value).toBe(textWithFormatRegex); + expect(query.groupBy![0].params![0]).toBe(textWithFormatRegex); + expect(query.select![0][0].params![0]).toBe(textWithFormatRegex); } describe('when interpolating query variables for dashboard->explore', () => { @@ -244,6 +261,7 @@ describe('InfluxDataSource', () => { ds.isFlux = true; const queries = ds.interpolateVariablesInQueries([fluxQuery], { interpolationVar: { text: text, value: text }, + interpolationVar2: { text: text2, value: text2 }, }); fluxChecks(queries[0].query); }); @@ -252,6 +270,7 @@ describe('InfluxDataSource', () => { ds.isFlux = false; const queries = ds.interpolateVariablesInQueries([influxQuery], { interpolationVar: { text: text, value: text }, + interpolationVar2: { text: text2, value: text2 }, }); influxChecks(queries[0]); }); @@ -260,7 +279,12 @@ describe('InfluxDataSource', () => { describe('when interpolating template variables', () => { it('should apply all template variables with Flux mode', () => { ds.isFlux = true; - const query = ds.applyTemplateVariables(fluxQuery, { interpolationVar: { text: text, value: text } }); + const query = ds.applyTemplateVariables(fluxQuery, { + interpolationVar: { + text: text, + value: text, + }, + }); fluxChecks(query.query); }); @@ -268,7 +292,10 @@ describe('InfluxDataSource', () => { ds.isFlux = false; ds.access = 'proxy'; config.featureToggles.influxdbBackendMigration = true; - const query = ds.applyTemplateVariables(influxQuery, { interpolationVar: { text: text, value: text } }); + const query = ds.applyTemplateVariables(influxQuery, { + interpolationVar: { text: text, value: text }, + interpolationVar2: { text: 'interpolationText2', value: 'interpolationText2' }, + }); influxChecks(query); }); });