Skip to content

Commit 18d64a4

Browse files
committed
Handle set as default
Signed-off-by: Yuanqi(Ella) Zhu <zhyuanqi@amazon.com>
1 parent be5a16a commit 18d64a4

File tree

9 files changed

+60
-43
lines changed

9 files changed

+60
-43
lines changed

config/opensearch_dashboards.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@
247247
# vis_builder.enabled: false
248248

249249
# Set the value of this setting to true to enable multiple data source feature.
250-
#data_source.enabled: false
250+
data_source.enabled: true
251251
# Set the value of this setting to true to hide local cluster in data source feature.
252252
#data_source.hideLocalCluster: false
253253
# Set the value of these settings to customize crypto materials to encryption saved credentials

src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ describe('Datasource Management: Create Datasource Wizard', () => {
5353

5454
test('should create datasource successfully', async () => {
5555
spyOn(utils, 'createSingleDataSource').and.returnValue({});
56-
spyOn(utils, 'handleSetDefaultDatasourceDuringCreation').and.returnValue({});
56+
spyOn(utils, 'handleSetDefaultDatasource').and.returnValue({});
5757
await act(async () => {
5858
// @ts-ignore
5959
await component.find(formIdentifier).first().prop('handleSubmit')(
@@ -62,7 +62,7 @@ describe('Datasource Management: Create Datasource Wizard', () => {
6262
});
6363
expect(utils.createSingleDataSource).toHaveBeenCalled();
6464
expect(history.push).toBeCalledWith('');
65-
expect(utils.handleSetDefaultDatasourceDuringCreation).toHaveBeenCalled();
65+
expect(utils.handleSetDefaultDatasource).toHaveBeenCalled();
6666
});
6767

6868
test('should fail to create datasource', async () => {

src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
getDataSources,
2222
testConnection,
2323
fetchDataSourceVersion,
24-
handleSetDefaultDatasourceDuringCreation,
24+
handleSetDefaultDatasource,
2525
} from '../utils';
2626
import { LoadingMask } from '../loading_mask';
2727

@@ -79,7 +79,7 @@ export const CreateDataSourceWizard: React.FunctionComponent<CreateDataSourceWiz
7979
attributes.dataSourceVersion = version.dataSourceVersion;
8080
await createSingleDataSource(savedObjects.client, attributes);
8181
// Set the first create data source as default data source.
82-
await handleSetDefaultDatasourceDuringCreation(savedObjects.client, uiSettings);
82+
await handleSetDefaultDatasource(savedObjects.client, uiSettings);
8383
props.history.push('');
8484
} catch (e) {
8585
setIsLoading(false);

src/plugins/data_source_management/public/components/data_source_table/data_source_table.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ describe('DataSourceTable', () => {
128128

129129
it('should delete confirm modal confirm button work normally', async () => {
130130
spyOn(utils, 'deleteMultipleDataSources').and.returnValue(Promise.resolve({}));
131-
spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({});
131+
spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({});
132132
act(() => {
133133
// @ts-ignore
134134
component.find(tableIdentifier).props().selection.onSelectionChange(getMappedDataSources);
@@ -143,12 +143,12 @@ describe('DataSourceTable', () => {
143143
});
144144
component.update();
145145
expect(component.find(confirmModalIdentifier).exists()).toBe(false);
146-
expect(utils.handleSetDefaultDatasourceAfterDeletion).toHaveBeenCalled();
146+
expect(utils.setFirstDataSourceAsDefault).toHaveBeenCalled();
147147
});
148148

149149
it('should delete datasources & fail', async () => {
150150
spyOn(utils, 'deleteMultipleDataSources').and.returnValue(Promise.reject({}));
151-
spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({});
151+
spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({});
152152
act(() => {
153153
// @ts-ignore
154154
component.find(tableIdentifier).props().selection.onSelectionChange(getMappedDataSources);
@@ -164,7 +164,7 @@ describe('DataSourceTable', () => {
164164
});
165165
component.update();
166166
expect(utils.deleteMultipleDataSources).toHaveBeenCalled();
167-
expect(utils.handleSetDefaultDatasourceAfterDeletion).not.toHaveBeenCalled();
167+
expect(utils.setFirstDataSourceAsDefault).not.toHaveBeenCalled();
168168
// @ts-ignore
169169
expect(component.find(confirmModalIdentifier).exists()).toBe(false);
170170
});

src/plugins/data_source_management/public/components/data_source_table/data_source_table.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,7 @@ import {
2929
} from '../../../../opensearch_dashboards_react/public';
3030
import { DataSourceManagementContext, DataSourceTableItem, ToastMessageItem } from '../../types';
3131
import { CreateButton } from '../create_button';
32-
import {
33-
deleteMultipleDataSources,
34-
getDataSources,
35-
handleSetDefaultDatasourceAfterDeletion,
36-
} from '../utils';
32+
import { deleteMultipleDataSources, getDataSources, setFirstDataSourceAsDefault } from '../utils';
3733
import { LoadingMask } from '../loading_mask';
3834

3935
/* Table config */
@@ -256,7 +252,7 @@ export const DataSourceTable = ({ history }: RouteComponentProps) => {
256252
try {
257253
for (const dataSource of selectedDataSources) {
258254
if (uiSettings.get('defaultDataSource') === dataSource.id) {
259-
await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings);
255+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true);
260256
}
261257
}
262258
} catch (e) {

src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ describe('Datasource Management: Edit Datasource Wizard', () => {
138138
});
139139
test('should delete datasource successfully', async () => {
140140
spyOn(utils, 'deleteDataSourceById').and.returnValue({});
141-
spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({});
141+
spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({});
142142
spyOn(uiSettings, 'get').and.returnValue('test1');
143143
await act(async () => {
144144
// @ts-ignore
@@ -148,11 +148,11 @@ describe('Datasource Management: Edit Datasource Wizard', () => {
148148
});
149149
expect(utils.deleteDataSourceById).toHaveBeenCalled();
150150
expect(history.push).toBeCalledWith('');
151-
expect(utils.handleSetDefaultDatasourceAfterDeletion).toHaveBeenCalled();
151+
expect(utils.setFirstDataSourceAsDefault).toHaveBeenCalled();
152152
});
153153
test('should fail to delete datasource', async () => {
154154
spyOn(utils, 'deleteDataSourceById').and.throwError('error');
155-
spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({});
155+
spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({});
156156
spyOn(uiSettings, 'get').and.returnValue('test1');
157157
await act(async () => {
158158
// @ts-ignore
@@ -162,7 +162,7 @@ describe('Datasource Management: Edit Datasource Wizard', () => {
162162
});
163163
component.update();
164164
expect(utils.deleteDataSourceById).toHaveBeenCalled();
165-
expect(utils.handleSetDefaultDatasourceAfterDeletion).not.toHaveBeenCalled();
165+
expect(utils.setFirstDataSourceAsDefault).not.toHaveBeenCalled();
166166
});
167167
test('should test connection', () => {
168168
spyOn(utils, 'testConnection');

src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
getDataSources,
1818
testConnection,
1919
updateDataSourceById,
20-
handleSetDefaultDatasourceAfterDeletion,
20+
setFirstDataSourceAsDefault,
2121
} from '../utils';
2222
import { getEditBreadcrumbs } from '../breadcrumbs';
2323
import { EditDataSourceForm } from './components/edit_form/edit_data_source_form';
@@ -127,7 +127,7 @@ export const EditDataSource: React.FunctionComponent<RouteComponentProps<{ id: s
127127
const setDefaultDataSource = async () => {
128128
try {
129129
if (uiSettings.get('defaultDataSource') === dataSourceID) {
130-
await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings);
130+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true);
131131
}
132132
} catch (e) {
133133
handleDisplayToastMessage({

src/plugins/data_source_management/public/components/utils.test.ts

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import {
1414
isValidUrl,
1515
testConnection,
1616
updateDataSourceById,
17-
handleSetDefaultDatasourceAfterDeletion,
18-
handleSetDefaultDatasourceDuringCreation,
17+
handleSetDefaultDatasource,
18+
setFirstDataSourceAsDefault,
1919
} from './utils';
2020
import { coreMock } from '../../../../core/public/mocks';
2121
import {
@@ -279,29 +279,49 @@ describe('DataSourceManagement: Utils.ts', () => {
279279
expect(getDefaultAuthMethod(authenticationMethodRegistry)?.name).toBe(AuthType.NoAuth);
280280
});
281281
});
282-
describe('handleSetDefaultDatasourceAfterDeletion', () => {
283-
test('should remove defaultDataSource setting and set new defaultDataSource if data sources exist', async () => {
282+
describe('handle set default datasource', () => {
283+
beforeEach(() => {
284+
jest.clearAllMocks(); // Reset all mock calls before each test
285+
});
286+
test('should set default datasource when it does not have default datasource ', async () => {
287+
mockUiSettingsCalls(uiSettings, 'get', null);
284288
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse);
289+
await handleSetDefaultDatasource(savedObjects.client, uiSettings);
290+
expect(uiSettings.set).toHaveBeenCalled();
291+
});
292+
test('should not set default datasource when it has default datasouce', async () => {
285293
mockUiSettingsCalls(uiSettings, 'get', 'test');
286-
287-
await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings);
288-
expect(uiSettings.set).toHaveBeenCalledWith('defaultDataSource', 'test');
294+
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse);
295+
await handleSetDefaultDatasource(savedObjects.client, uiSettings);
296+
expect(uiSettings.set).not.toHaveBeenCalled();
289297
});
290298
});
291-
describe('handleSetDefaultDatasourceDuringCreation', () => {
299+
describe('set first aataSource as default', () => {
292300
beforeEach(() => {
293301
jest.clearAllMocks(); // Reset all mock calls before each test
294302
});
295-
test('should not set defaultDataSource if more than one data source exists', async () => {
303+
test('should set defaultDataSource if more than one data source exists', async () => {
296304
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse);
297-
await handleSetDefaultDatasourceDuringCreation(savedObjects.client, uiSettings);
298-
expect(uiSettings.set).not.toHaveBeenCalled();
305+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true);
306+
expect(uiSettings.set).toHaveBeenCalled();
299307
});
300308
test('should set defaultDataSource if only one data source exists', async () => {
301309
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getSingleDataSourceResponse);
302-
await handleSetDefaultDatasourceDuringCreation(savedObjects.client, uiSettings);
310+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true);
303311
expect(uiSettings.set).toHaveBeenCalled();
304312
});
313+
test('should not set defaultDataSource if no data source exists', async () => {
314+
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', { savedObjects: [] });
315+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true);
316+
expect(uiSettings.remove).toHaveBeenCalled();
317+
expect(uiSettings.set).not.toHaveBeenCalled();
318+
});
319+
test('should not set defaultDataSource if no data source exists and no default datasouce', async () => {
320+
mockResponseForSavedObjectsCalls(savedObjects.client, 'find', { savedObjects: [] });
321+
await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, false);
322+
expect(uiSettings.remove).not.toHaveBeenCalled();
323+
expect(uiSettings.set).not.toHaveBeenCalled();
324+
});
305325
});
306326
describe('Check extractRegisteredAuthTypeCredentials method', () => {
307327
test('Should extract credential field successfully', () => {

src/plugins/data_source_management/public/components/utils.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,27 @@ export async function getDataSourcesWithFields(
5454
return response?.savedObjects;
5555
}
5656

57-
export async function handleSetDefaultDatasourceAfterDeletion(
57+
export async function handleSetDefaultDatasource(
5858
savedObjectsClient: SavedObjectsClientContract,
5959
uiSettings: IUiSettingsClient
6060
) {
61-
uiSettings.remove('defaultDataSource');
62-
const listOfDataSources: DataSourceTableItem[] = await getDataSources(savedObjectsClient);
63-
if (Array.isArray(listOfDataSources) && listOfDataSources.length >= 1) {
64-
const datasourceId = listOfDataSources[0].id;
65-
await uiSettings.set('defaultDataSource', datasourceId);
61+
if (uiSettings.get('defaultDataSource', null) === null) {
62+
return await setFirstDataSourceAsDefault(savedObjectsClient, uiSettings, false);
6663
}
6764
}
6865

69-
export async function handleSetDefaultDatasourceDuringCreation(
66+
export async function setFirstDataSourceAsDefault(
7067
savedObjectsClient: SavedObjectsClientContract,
71-
uiSettings: IUiSettingsClient
68+
uiSettings: IUiSettingsClient,
69+
exists: boolean
7270
) {
71+
if (exists) {
72+
uiSettings.remove('defaultDataSource');
73+
}
7374
const listOfDataSources: DataSourceTableItem[] = await getDataSources(savedObjectsClient);
74-
if (Array.isArray(listOfDataSources) && listOfDataSources.length === 1) {
75+
if (Array.isArray(listOfDataSources) && listOfDataSources.length >= 1) {
7576
const datasourceId = listOfDataSources[0].id;
76-
await uiSettings.set('defaultDataSource', datasourceId);
77+
return await uiSettings.set('defaultDataSource', datasourceId);
7778
}
7879
}
7980

0 commit comments

Comments
 (0)