diff --git a/devenv/datasources.yaml b/devenv/datasources.yaml index 7046ae43137..abf0494225c 100644 --- a/devenv/datasources.yaml +++ b/devenv/datasources.yaml @@ -160,33 +160,36 @@ datasources: - name: gdev-mysql type: mysql url: localhost:3306 - database: grafana user: grafana + jsonData: + database: grafana secureJsonData: password: password - name: gdev-mysql-ds-tests type: mysql url: localhost:3306 - database: grafana_ds_tests user: grafana + jsonData: + database: grafana_ds_tests secureJsonData: password: password - name: gdev-mssql type: mssql url: localhost:1433 - database: grafana user: grafana + jsonData: + database: grafana secureJsonData: password: Password! - name: gdev-mssql-tls type: mssql url: localhost:1434 - database: grafana user: grafana jsonData: + database: grafana encrypt: "true" tlsSkipVerify: true secureJsonData: @@ -195,30 +198,31 @@ datasources: - name: gdev-mssql-ds-tests type: mssql url: localhost:1433 - database: grafanatest user: grafana + jsonData: + database: grafanatest secureJsonData: password: Password! - name: gdev-postgres type: postgres url: localhost:5432 - database: grafana user: grafana secureJsonData: password: password jsonData: sslmode: "disable" + database: grafana - name: gdev-postgres-ds-tests type: postgres url: localhost:5432 - database: grafanadstest user: grafanatest secureJsonData: password: grafanatest jsonData: sslmode: "disable" + database: grafanadstest - name: gdev-cloudwatch type: cloudwatch diff --git a/docs/sources/datasources/mssql/_index.md b/docs/sources/datasources/mssql/_index.md index ffc52992abb..8d10672005f 100644 --- a/docs/sources/datasources/mssql/_index.md +++ b/docs/sources/datasources/mssql/_index.md @@ -116,9 +116,9 @@ datasources: - name: MSSQL type: mssql url: localhost:1433 - database: grafana user: grafana jsonData: + database: grafana maxOpenConns: 0 # Grafana v5.4+ maxIdleConns: 2 # Grafana v5.4+ connMaxLifetime: 14400 # Grafana v5.4+ diff --git a/docs/sources/datasources/mysql/_index.md b/docs/sources/datasources/mysql/_index.md index f8cd24d3273..a14037f49da 100644 --- a/docs/sources/datasources/mysql/_index.md +++ b/docs/sources/datasources/mysql/_index.md @@ -91,9 +91,9 @@ datasources: - name: MySQL type: mysql url: localhost:3306 - database: grafana user: grafana jsonData: + database: grafana maxOpenConns: 0 # Grafana v5.4+ maxIdleConns: 2 # Grafana v5.4+ connMaxLifetime: 14400 # Grafana v5.4+ diff --git a/docs/sources/datasources/postgres/_index.md b/docs/sources/datasources/postgres/_index.md index ebf1dab74e8..e33bb45d45d 100644 --- a/docs/sources/datasources/postgres/_index.md +++ b/docs/sources/datasources/postgres/_index.md @@ -125,11 +125,11 @@ datasources: - name: Postgres type: postgres url: localhost:5432 - database: grafana user: grafana secureJsonData: password: 'Password!' jsonData: + database: grafana sslmode: 'disable' # disable/require/verify-ca/verify-full maxOpenConns: 0 # Grafana v5.4+ maxIdleConns: 2 # Grafana v5.4+ diff --git a/pkg/services/datasources/service/store.go b/pkg/services/datasources/service/store.go index 9737da64622..9cc07b3a2b8 100644 --- a/pkg/services/datasources/service/store.go +++ b/pkg/services/datasources/service/store.go @@ -333,6 +333,8 @@ func (ss *SqlStore) UpdateDataSource(ctx context.Context, cmd *datasources.Updat sess.UseBool("basic_auth") sess.UseBool("with_credentials") sess.UseBool("read_only") + // Make sure database field is zeroed out if empty. We want to migrate away from this field. + sess.MustCols("database") // Make sure password are zeroed out if empty. We do this as we want to migrate passwords from // plain text fields to SecureJsonData. sess.MustCols("password") diff --git a/pkg/tsdb/mssql/mssql.go b/pkg/tsdb/mssql/mssql.go index adb90f85988..bf1bec7cfcb 100644 --- a/pkg/tsdb/mssql/mssql.go +++ b/pkg/tsdb/mssql/mssql.go @@ -66,11 +66,17 @@ func newInstanceSettings(cfg *setting.Cfg) datasource.InstanceFactoryFunc { if err != nil { return nil, fmt.Errorf("error reading settings: %w", err) } + + database := jsonData.Database + if database == "" { + database = settings.Database + } + dsInfo := sqleng.DataSourceInfo{ JsonData: jsonData, URL: settings.URL, User: settings.User, - Database: settings.Database, + Database: database, ID: settings.ID, Updated: settings.Updated, UID: settings.UID, diff --git a/pkg/tsdb/mysql/mysql.go b/pkg/tsdb/mysql/mysql.go index df72bea4770..da84655ac93 100644 --- a/pkg/tsdb/mysql/mysql.go +++ b/pkg/tsdb/mysql/mysql.go @@ -60,11 +60,17 @@ func newInstanceSettings(cfg *setting.Cfg, httpClientProvider httpclient.Provide if err != nil { return nil, fmt.Errorf("error reading settings: %w", err) } + + database := jsonData.Database + if database == "" { + database = settings.Database + } + dsInfo := sqleng.DataSourceInfo{ JsonData: jsonData, URL: settings.URL, User: settings.User, - Database: settings.Database, + Database: database, ID: settings.ID, Updated: settings.Updated, UID: settings.UID, diff --git a/pkg/tsdb/postgres/postgres.go b/pkg/tsdb/postgres/postgres.go index f3af9542f0c..0a3defa6acf 100644 --- a/pkg/tsdb/postgres/postgres.go +++ b/pkg/tsdb/postgres/postgres.go @@ -66,11 +66,17 @@ func (s *Service) newInstanceSettings(cfg *setting.Cfg) datasource.InstanceFacto if err != nil { return nil, fmt.Errorf("error reading settings: %w", err) } + + database := jsonData.Database + if database == "" { + database = settings.Database + } + dsInfo := sqleng.DataSourceInfo{ JsonData: jsonData, URL: settings.URL, User: settings.User, - Database: settings.Database, + Database: database, ID: settings.ID, Updated: settings.Updated, UID: settings.UID, diff --git a/pkg/tsdb/sqleng/sql_engine.go b/pkg/tsdb/sqleng/sql_engine.go index e829d93ef14..b5d766de214 100644 --- a/pkg/tsdb/sqleng/sql_engine.go +++ b/pkg/tsdb/sqleng/sql_engine.go @@ -66,6 +66,7 @@ type JsonData struct { Encrypt string `json:"encrypt"` Servername string `json:"servername"` TimeInterval string `json:"timeInterval"` + Database string `json:"database"` } type DataSourceInfo struct { diff --git a/public/app/features/plugins/sql/components/configuration/useMigrateDatabaseField.ts b/public/app/features/plugins/sql/components/configuration/useMigrateDatabaseField.ts new file mode 100644 index 00000000000..d43ebaddbb1 --- /dev/null +++ b/public/app/features/plugins/sql/components/configuration/useMigrateDatabaseField.ts @@ -0,0 +1,25 @@ +import { useEffect } from 'react'; + +import { DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data'; +import { logDebug } from '@grafana/runtime'; + +import { SQLOptions } from '../../types'; + +/** + * Moves the database field from the options object to jsonData.database and empties the database field. + */ +export function useMigrateDatabaseField({ + onOptionsChange, + options, +}: DataSourcePluginOptionsEditorProps) { + useEffect(() => { + if (options.database) { + logDebug(`Migrating from options.database with value ${options.database} for ${options.name}`); + onOptionsChange({ + ...options, + database: '', + jsonData: { ...options.jsonData, database: options.database }, + }); + } + }, [onOptionsChange, options]); +} diff --git a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx index a4ddc85b9d0..dd807efd3ff 100644 --- a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx +++ b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx @@ -24,6 +24,7 @@ import { } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; import { ConnectionLimits } from 'app/features/plugins/sql/components/configuration/ConnectionLimits'; +import { useMigrateDatabaseField } from 'app/features/plugins/sql/components/configuration/useMigrateDatabaseField'; import { MSSQLAuthenticationType, MSSQLEncryptOptions, MssqlOptions } from '../types'; @@ -32,6 +33,8 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps { updateDatasourcePluginResetOption(props, 'password'); }; @@ -99,9 +102,9 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps { updateDatasourcePluginResetOption(props, 'password'); }; @@ -54,9 +57,9 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps diff --git a/public/app/plugins/datasource/postgres/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/postgres/configuration/ConfigurationEditor.tsx index 6c6ab391d2e..20d66677aac 100644 --- a/public/app/plugins/datasource/postgres/configuration/ConfigurationEditor.tsx +++ b/public/app/plugins/datasource/postgres/configuration/ConfigurationEditor.tsx @@ -21,6 +21,7 @@ import { } from '@grafana/ui'; import { ConnectionLimits } from 'app/features/plugins/sql/components/configuration/ConnectionLimits'; import { TLSSecretsConfig } from 'app/features/plugins/sql/components/configuration/TLSSecretsConfig'; +import { useMigrateDatabaseField } from 'app/features/plugins/sql/components/configuration/useMigrateDatabaseField'; import { PostgresOptions, PostgresTLSMethods, PostgresTLSModes, SecureJsonData } from '../types'; @@ -47,6 +48,8 @@ export const PostgresConfigEditor = (props: DataSourcePluginOptionsEditorProps

diff --git a/public/app/plugins/datasource/postgres/configuration/useAutoDetectFeatures.ts b/public/app/plugins/datasource/postgres/configuration/useAutoDetectFeatures.ts index 09ce316d7e8..99ad7378fbc 100644 --- a/public/app/plugins/datasource/postgres/configuration/useAutoDetectFeatures.ts +++ b/public/app/plugins/datasource/postgres/configuration/useAutoDetectFeatures.ts @@ -76,7 +76,7 @@ export function useAutoDetectFeatures({ props, setVersionOptions }: Options) { function isValidConfig(options: DataSourceSettings) { return ( options.url && - options.database && + options.jsonData.database && options.user && (options.secureJsonData?.password || options.secureJsonFields?.password) && (options.jsonData.sslmode === PostgresTLSModes.disable ||