diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts index e52ffca89d730..9fb2d218dbb97 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/AddRemoteInstance.types.ts @@ -102,6 +102,7 @@ export interface PostgreSQLPayload extends RemoteCommonPayload, TLSCommon { tls_key: string; agent_password: string; max_query_length: number; + auto_discovery_limit: number; } export interface MySQLPayload extends RemoteCommonPayload, TLSCommon { diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts index 535ff0d3fd8ef..9db946b11a8eb 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.constants.ts @@ -1,5 +1,5 @@ import { Messages } from './AdditionalOptions.messages'; -import { TablestatOptionsInterface } from './AdditionalOptions.types'; +import { AutoDiscoveryOptionsInterface, TablestatOptionsInterface } from './AdditionalOptions.types'; export const tablestatOptions = [ { @@ -15,3 +15,18 @@ export const tablestatOptions = [ label: Messages.form.tablestatOptions.custom, }, ]; + +export const autoDiscoveryOptions = [ + { + value: AutoDiscoveryOptionsInterface.enabled, + label: Messages.form.autoDiscoveryOptions.enabled, + }, + { + value: AutoDiscoveryOptionsInterface.disabled, + label: Messages.form.autoDiscoveryOptions.disabled, + }, + { + value: AutoDiscoveryOptionsInterface.custom, + label: Messages.form.autoDiscoveryOptions.custom, + }, +]; diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts index 4e89563764044..76fd288d8892a 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.messages.ts @@ -5,5 +5,10 @@ export const Messages = { default: 'Default', custom: 'Custom', }, + autoDiscoveryOptions: { + enabled: 'Enabled', + disabled: 'Disabled', + custom: 'Custom', + }, }, }; diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx index 58a5fcf3986d7..865b0865e8fa6 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.tsx @@ -14,8 +14,8 @@ import { Messages } from '../FormParts.messages'; import { getStyles } from '../FormParts.styles'; import { AdditionalOptionsFormPartProps, PostgreSQLAdditionalOptionsProps } from '../FormParts.types'; -import { tablestatOptions } from './AdditionalOptions.constants'; -import { TablestatOptionsInterface } from './AdditionalOptions.types'; +import { autoDiscoveryOptions, tablestatOptions } from './AdditionalOptions.constants'; +import { AutoDiscoveryOptionsInterface, TablestatOptionsInterface } from './AdditionalOptions.types'; import { MongodbTLSCertificate } from './MongodbTLSCertificate'; import { MysqlTLSCertificate } from './MysqlTLSCertificate'; import { PostgreTLSCertificate } from './PostgreTLSCertificate'; @@ -41,16 +41,55 @@ export const AdditionalOptionsFormPart: FC = ({ ); }; -export const PostgreSQLAdditionalOptions: FC = ({ isRDS, isAzure }) => ( - <> -

{Messages.form.labels.trackingOptions}

- - -); +export const PostgreSQLAdditionalOptions: FC = ({ form, isRDS, isAzure }) => { + const selectedOption = form.getState()?.values?.autoDiscoveryOptions; + const [selectedValue, setSelectedValue] = useState(selectedOption || AutoDiscoveryOptionsInterface.enabled); + const styles = useStyles2(getStyles); + const validators = [platformCoreValidators.containsNumber, ...platformCoreValidators.int32]; + + const getAutoDiscoveryLimitValue = (type: AutoDiscoveryOptionsInterface) => + type === AutoDiscoveryOptionsInterface.enabled ? 0 : type === AutoDiscoveryOptionsInterface.disabled ? -1 : 10; + + useEffect(() => { + setSelectedValue(selectedOption); + form.change('autoDiscoveryLimit', getAutoDiscoveryLimitValue(selectedOption)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedOption]); + + return ( + <> +

{Messages.form.labels.trackingOptions}

+ +

{Messages.form.labels.postgresqlDetails.autoDiscovery}

+
+ + +
+ + ); +}; const getTablestatValues = (type: TablestatOptionsInterface) => { switch (type) { @@ -69,7 +108,8 @@ const MySQLOptions = ({ form }: { form: FormApi }) => { useEffect(() => { setSelectedValue(selectedOption); form.change('tablestats_group_table_limit', getTablestatValues(selectedOption)); - }, [selectedOption, form]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedOption]); return ( <> @@ -115,6 +155,7 @@ export const getAdditionalOptions = ( /> diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts index f58a325d28110..ad4d29f414076 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/AdditionalOptions/AdditionalOptions.types.ts @@ -3,3 +3,9 @@ export enum TablestatOptionsInterface { default = 'default', custom = 'custom', } + +export enum AutoDiscoveryOptionsInterface { + enabled = 'enabled', + disabled = 'disabled', + custom = 'custom', +} diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts index 980c17caf44ba..9fcee1d47cdc2 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.messages.ts @@ -29,6 +29,9 @@ export const Messages = { postgresqlDetails: { database: 'Database', maxQueryLength: 'Max query length', + autoDiscovery: 'Auto-discovery', + autoDiscoveryLimit: 'Auto-discovery limit', + autoDiscoveryLimitOptions: 'State', }, mysqlDetails: { maxQueryLength: 'Max query length', @@ -87,6 +90,7 @@ export const Messages = { postgresqlDetails: { database: 'Database (default: postgres)', maxQueryLength: 'Max query length', + autoDiscoveryLimit: 'Auto-discovery limit', }, mysqlDetails: { maxQueryLength: 'Max query length', @@ -126,6 +130,7 @@ export const Messages = { postgresqlDetails: { database: 'Database name', maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', + autoDiscoveryLimit: 'Turn off auto-discovery when the total count of databases exceeds the limit.', }, mysqlDetails: { maxQueryLength: 'Full Example (Fingerprint) storage is not allowed by default to have the best performance', diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx index 66280c9174a44..7af1b758c480e 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.test.tsx @@ -181,7 +181,7 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(trackingOptions.length); - expect(fields.length).toBe(7); + expect(fields.length).toBe(12); }); it('should render correct for RDS PostgreSQL', async () => { const type = Databases.postgresql; @@ -198,6 +198,6 @@ describe('getAdditionalOptions ::', () => { const fields = container.querySelectorAll('input'); const trakingFields = screen.getAllByTestId('tracking-radio-button'); expect(trakingFields.length).toBe(rdsTrackingOptions.length); - expect(fields.length).toBe(8); + expect(fields.length).toBe(13); }); }); diff --git a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts index 6328066594280..ad0f700338361 100644 --- a/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts +++ b/public/app/percona/add-instance/components/AddRemoteInstance/FormParts/FormParts.types.ts @@ -21,6 +21,7 @@ export interface AdditionalOptionsFormPartProps { export interface PostgreSQLAdditionalOptionsProps { isRDS?: boolean; isAzure?: boolean; + form: FormApi; } export enum Schema { diff --git a/public/app/percona/shared/core/constants.ts b/public/app/percona/shared/core/constants.ts index a59ca235a56b2..b51997143a92e 100644 --- a/public/app/percona/shared/core/constants.ts +++ b/public/app/percona/shared/core/constants.ts @@ -55,3 +55,8 @@ export const DATABASE_ICONS: Record = { [Databases.mariadb]: 'percona-database-mysql', [Databases.haproxy]: 'percona-database-haproxy', }; + +export const INT_32 = { + min: -2147483648, + max: 2147483647, +}; diff --git a/public/app/percona/shared/helpers/validatorsForm/index.ts b/public/app/percona/shared/helpers/validatorsForm/index.ts index 2508cedbae101..fea82f05fbf75 100644 --- a/public/app/percona/shared/helpers/validatorsForm/index.ts +++ b/public/app/percona/shared/helpers/validatorsForm/index.ts @@ -10,5 +10,6 @@ export { maxLength } from './maxLength'; export { required } from './required'; export { requiredTrue } from './requiredTrue'; export { minTags } from './minTags'; +export { int32 } from './int32'; export * from './validator.types'; export * as validators from '.'; diff --git a/public/app/percona/shared/helpers/validatorsForm/int32.ts b/public/app/percona/shared/helpers/validatorsForm/int32.ts new file mode 100644 index 0000000000000..b499466da4dbe --- /dev/null +++ b/public/app/percona/shared/helpers/validatorsForm/int32.ts @@ -0,0 +1,5 @@ +import { INT_32 } from '../../core'; + +import { lessThan, greaterThan } from '.'; + +export const int32 = [greaterThan(INT_32.min - 1), lessThan(INT_32.max + 1)];