Skip to content

Commit c0b413e

Browse files
authored
Data source opensearch client honors the timeout settings in yaml file (#9651)
* Data source client honors the timeout settings in yaml file Signed-off-by: Binlong Gao <[email protected]> * Add change log Signed-off-by: Binlong Gao <[email protected]> * Fix legacy client Signed-off-by: Binlong Gao <[email protected]> * Check timeout params in all unit tests Signed-off-by: Binlong Gao <[email protected]> * Do not import type from core server Signed-off-by: Binlong Gao <[email protected]> * Remove useless type cast Signed-off-by: Binlong Gao <[email protected]> --------- Signed-off-by: Binlong Gao <[email protected]>
1 parent 09f0381 commit c0b413e

File tree

8 files changed

+174
-18
lines changed

8 files changed

+174
-18
lines changed

changelogs/fragments/9651.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
fix:
2+
- Data source opensearch client honors the timeout settings in yaml file ([#9651](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/9651))

src/plugins/data_source/config.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright OpenSearch Contributors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
5+
import { Duration } from 'moment';
66
import { schema, TypeOf } from '@osd/config-schema';
77
import { fileAppenderSchema } from './audit_config';
88

@@ -61,4 +61,11 @@ export const configSchema = schema.object({
6161
}),
6262
});
6363

64-
export type DataSourcePluginConfigType = TypeOf<typeof configSchema>;
64+
export type ConfigSchema = TypeOf<typeof configSchema>;
65+
66+
export type DataSourcePluginConfigType = ConfigSchema & {
67+
globalOpenSearchConfig: {
68+
requestTimeout: Duration;
69+
pingTimeout: Duration;
70+
};
71+
};

src/plugins/data_source/server/client/client_config.test.ts

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright OpenSearch Contributors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5+
import { duration } from 'moment';
56
import { DataSourcePluginConfigType } from '../../config';
67
import { parseClientOptions } from './client_config';
78

@@ -17,15 +18,21 @@ describe('parseClientOptions', () => {
1718
clientPool: {
1819
size: 5,
1920
},
21+
globalOpenSearchConfig: {
22+
requestTimeout: duration(1, 'seconds'),
23+
pingTimeout: duration(2, 'seconds'),
24+
},
2025
} as DataSourcePluginConfigType;
2126

22-
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT)).toEqual(
27+
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, [])).toEqual(
2328
expect.objectContaining({
2429
node: TEST_DATA_SOURCE_ENDPOINT,
2530
ssl: {
2631
requestCert: true,
2732
rejectUnauthorized: true,
2833
},
34+
requestTimeout: 1000,
35+
pingTimeout: 2000,
2936
})
3037
);
3138
});
@@ -39,15 +46,21 @@ describe('parseClientOptions', () => {
3946
clientPool: {
4047
size: 5,
4148
},
49+
globalOpenSearchConfig: {
50+
requestTimeout: duration(1, 'seconds'),
51+
pingTimeout: duration(2, 'seconds'),
52+
},
4253
} as DataSourcePluginConfigType;
43-
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT)).toEqual(
54+
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, [])).toEqual(
4455
expect.objectContaining({
4556
node: TEST_DATA_SOURCE_ENDPOINT,
4657
ssl: {
4758
requestCert: true,
4859
rejectUnauthorized: false,
4960
ca: undefined,
5061
},
62+
requestTimeout: 1000,
63+
pingTimeout: 2000,
5164
})
5265
);
5366
});
@@ -62,10 +75,14 @@ describe('parseClientOptions', () => {
6275
clientPool: {
6376
size: 5,
6477
},
78+
globalOpenSearchConfig: {
79+
requestTimeout: duration(1, 'seconds'),
80+
pingTimeout: duration(2, 'seconds'),
81+
},
6582
} as DataSourcePluginConfigType;
6683
mockReadFileSync.mockReset();
6784
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
68-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
85+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
6986
expect(mockReadFileSync).toHaveBeenCalledTimes(1);
7087
mockReadFileSync.mockClear();
7188
expect(parsedConfig).toEqual(
@@ -77,6 +94,8 @@ describe('parseClientOptions', () => {
7794
checkServerIdentity: expect.any(Function),
7895
ca: ['content-of-some-path'],
7996
},
97+
requestTimeout: 1000,
98+
pingTimeout: 2000,
8099
})
81100
);
82101
expect(parsedConfig.ssl?.checkServerIdentity()).toBeUndefined();
@@ -92,10 +111,14 @@ describe('parseClientOptions', () => {
92111
clientPool: {
93112
size: 5,
94113
},
114+
globalOpenSearchConfig: {
115+
requestTimeout: duration(1, 'seconds'),
116+
pingTimeout: duration(2, 'seconds'),
117+
},
95118
} as DataSourcePluginConfigType;
96119
mockReadFileSync.mockReset();
97120
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
98-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
121+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
99122
expect(mockReadFileSync).toHaveBeenCalledTimes(1);
100123
mockReadFileSync.mockClear();
101124
expect(parsedConfig).toEqual(
@@ -106,6 +129,8 @@ describe('parseClientOptions', () => {
106129
rejectUnauthorized: true,
107130
ca: ['content-of-some-path'],
108131
},
132+
requestTimeout: 1000,
133+
pingTimeout: 2000,
109134
})
110135
);
111136
});
@@ -119,10 +144,47 @@ describe('parseClientOptions', () => {
119144
clientPool: {
120145
size: 5,
121146
},
147+
globalOpenSearchConfig: {
148+
requestTimeout: duration(1, 'seconds'),
149+
pingTimeout: duration(2, 'seconds'),
150+
},
151+
} as DataSourcePluginConfigType;
152+
mockReadFileSync.mockReset();
153+
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
154+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
155+
expect(mockReadFileSync).toHaveBeenCalledTimes(0);
156+
mockReadFileSync.mockClear();
157+
expect(parsedConfig).toEqual(
158+
expect.objectContaining({
159+
node: TEST_DATA_SOURCE_ENDPOINT,
160+
ssl: {
161+
requestCert: true,
162+
rejectUnauthorized: true,
163+
ca: undefined,
164+
},
165+
requestTimeout: 1000,
166+
pingTimeout: 2000,
167+
})
168+
);
169+
});
170+
171+
test('test honor pingTimeout and requestTimeout from the global configs', () => {
172+
const config = {
173+
enabled: true,
174+
ssl: {
175+
verificationMode: 'full',
176+
},
177+
clientPool: {
178+
size: 5,
179+
},
180+
globalOpenSearchConfig: {
181+
requestTimeout: duration(1, 'seconds'),
182+
pingTimeout: duration(2, 'seconds'),
183+
},
122184
} as DataSourcePluginConfigType;
123185
mockReadFileSync.mockReset();
124186
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
125-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
187+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
126188
expect(mockReadFileSync).toHaveBeenCalledTimes(0);
127189
mockReadFileSync.mockClear();
128190
expect(parsedConfig).toEqual(
@@ -133,6 +195,8 @@ describe('parseClientOptions', () => {
133195
rejectUnauthorized: true,
134196
ca: undefined,
135197
},
198+
requestTimeout: 1000,
199+
pingTimeout: 2000,
136200
})
137201
);
138202
});

src/plugins/data_source/server/client/client_config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ type DataSourceSSLConfigOptions = Partial<{
2323
* @param endpoint endpoint url of data source
2424
*/
2525
export function parseClientOptions(
26-
// TODO: will use client configs, that comes from a merge result of user config and default opensearch client config,
2726
config: DataSourcePluginConfigType,
2827
endpoint: string,
2928
registeredSchema: any[]
@@ -59,10 +58,13 @@ export function parseClientOptions(
5958
sslConfig.ca = certificateAuthorities;
6059
}
6160

61+
// for now, we only use part of the default opensearch client configs, may onboard more in the future
6262
const clientOptions: ClientOptions = {
6363
node: endpoint,
6464
ssl: sslConfig,
6565
plugins: registeredSchema,
66+
requestTimeout: config.globalOpenSearchConfig.requestTimeout.asMilliseconds(),
67+
pingTimeout: config.globalOpenSearchConfig.pingTimeout.asMilliseconds(),
6668
};
6769

6870
return clientOptions;

src/plugins/data_source/server/data_source_service.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import { duration } from 'moment';
67
import { loggingSystemMock } from '../../../core/server/mocks';
78
import { DataSourcePluginConfigType } from '../config';
89
import { DataSourceService } from './data_source_service';
@@ -21,6 +22,10 @@ describe('Data Source Service', () => {
2122
clientPool: {
2223
size: 5,
2324
},
25+
globalOpenSearchConfig: {
26+
requestTimeout: duration(100, 'seconds'),
27+
pingTimeout: duration(10, 'seconds'),
28+
},
2429
} as DataSourcePluginConfigType;
2530
});
2631

src/plugins/data_source/server/legacy/client_config.test.ts

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright OpenSearch Contributors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5+
import { duration } from 'moment';
56
import { DataSourcePluginConfigType } from '../../config';
67
import { parseClientOptions } from './client_config';
78

@@ -17,14 +18,20 @@ describe('parseClientOptions', () => {
1718
clientPool: {
1819
size: 5,
1920
},
21+
globalOpenSearchConfig: {
22+
requestTimeout: duration(10, 'seconds'),
23+
pingTimeout: duration(20, 'seconds'),
24+
},
2025
} as DataSourcePluginConfigType;
2126

22-
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT)).toEqual(
27+
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, [])).toEqual(
2328
expect.objectContaining({
2429
host: TEST_DATA_SOURCE_ENDPOINT,
2530
ssl: {
2631
rejectUnauthorized: true,
2732
},
33+
requestTimeout: 10000,
34+
pingTimeout: 20000,
2835
})
2936
);
3037
});
@@ -38,14 +45,20 @@ describe('parseClientOptions', () => {
3845
clientPool: {
3946
size: 5,
4047
},
48+
globalOpenSearchConfig: {
49+
requestTimeout: duration(10, 'seconds'),
50+
pingTimeout: duration(20, 'seconds'),
51+
},
4152
} as DataSourcePluginConfigType;
42-
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT)).toEqual(
53+
expect(parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, [])).toEqual(
4354
expect.objectContaining({
4455
host: TEST_DATA_SOURCE_ENDPOINT,
4556
ssl: {
4657
rejectUnauthorized: false,
4758
ca: undefined,
4859
},
60+
requestTimeout: 10000,
61+
pingTimeout: 20000,
4962
})
5063
);
5164
});
@@ -60,10 +73,14 @@ describe('parseClientOptions', () => {
6073
clientPool: {
6174
size: 5,
6275
},
76+
globalOpenSearchConfig: {
77+
requestTimeout: duration(10, 'seconds'),
78+
pingTimeout: duration(20, 'seconds'),
79+
},
6380
} as DataSourcePluginConfigType;
6481
mockReadFileSync.mockReset();
6582
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
66-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
83+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
6784
expect(mockReadFileSync).toHaveBeenCalledTimes(1);
6885
mockReadFileSync.mockClear();
6986
expect(parsedConfig).toEqual(
@@ -74,6 +91,8 @@ describe('parseClientOptions', () => {
7491
checkServerIdentity: expect.any(Function),
7592
ca: ['content-of-some-path'],
7693
},
94+
requestTimeout: 10000,
95+
pingTimeout: 20000,
7796
})
7897
);
7998
expect(parsedConfig.ssl?.checkServerIdentity()).toBeUndefined();
@@ -89,10 +108,14 @@ describe('parseClientOptions', () => {
89108
clientPool: {
90109
size: 5,
91110
},
111+
globalOpenSearchConfig: {
112+
requestTimeout: duration(10, 'seconds'),
113+
pingTimeout: duration(20, 'seconds'),
114+
},
92115
} as DataSourcePluginConfigType;
93116
mockReadFileSync.mockReset();
94117
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
95-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
118+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
96119
expect(mockReadFileSync).toHaveBeenCalledTimes(1);
97120
mockReadFileSync.mockClear();
98121
expect(parsedConfig).toEqual(
@@ -102,6 +125,8 @@ describe('parseClientOptions', () => {
102125
rejectUnauthorized: true,
103126
ca: ['content-of-some-path'],
104127
},
128+
requestTimeout: 10000,
129+
pingTimeout: 20000,
105130
})
106131
);
107132
});
@@ -115,10 +140,46 @@ describe('parseClientOptions', () => {
115140
clientPool: {
116141
size: 5,
117142
},
143+
globalOpenSearchConfig: {
144+
requestTimeout: duration(10, 'seconds'),
145+
pingTimeout: duration(20, 'seconds'),
146+
},
147+
} as DataSourcePluginConfigType;
148+
mockReadFileSync.mockReset();
149+
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
150+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
151+
expect(mockReadFileSync).toHaveBeenCalledTimes(0);
152+
mockReadFileSync.mockClear();
153+
expect(parsedConfig).toEqual(
154+
expect.objectContaining({
155+
host: TEST_DATA_SOURCE_ENDPOINT,
156+
ssl: {
157+
rejectUnauthorized: true,
158+
ca: undefined,
159+
},
160+
requestTimeout: 10000,
161+
pingTimeout: 20000,
162+
})
163+
);
164+
});
165+
166+
test('test honor pingTimeout and requestTimeout from the global configs', () => {
167+
const config = {
168+
enabled: true,
169+
ssl: {
170+
verificationMode: 'full',
171+
},
172+
clientPool: {
173+
size: 5,
174+
},
175+
globalOpenSearchConfig: {
176+
requestTimeout: duration(15, 'seconds'),
177+
pingTimeout: duration(25, 'seconds'),
178+
},
118179
} as DataSourcePluginConfigType;
119180
mockReadFileSync.mockReset();
120181
mockReadFileSync.mockImplementation((path: string) => `content-of-${path}`);
121-
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT);
182+
const parsedConfig = parseClientOptions(config, TEST_DATA_SOURCE_ENDPOINT, []);
122183
expect(mockReadFileSync).toHaveBeenCalledTimes(0);
123184
mockReadFileSync.mockClear();
124185
expect(parsedConfig).toEqual(
@@ -128,6 +189,8 @@ describe('parseClientOptions', () => {
128189
rejectUnauthorized: true,
129190
ca: undefined,
130191
},
192+
requestTimeout: 15000,
193+
pingTimeout: 25000,
131194
})
132195
);
133196
});

0 commit comments

Comments
 (0)