Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable data client with sample data server side #4268

Merged
merged 6 commits into from
Jun 20, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Enable data client with sample data server side
  • Loading branch information
kristenTian committed Jun 14, 2023
commit 4af88db1cbc6789d408e99800e508c0964ae36e5
2 changes: 1 addition & 1 deletion config/opensearch_dashboards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@
# vis_builder.enabled: false

# Set the value of this setting to true to enable multiple data source feature.
#data_source.enabled: false
data_source.enabled: false
# Set the value of these settings to customize crypto materials to encryption saved credentials
# in data sources.
#data_source.encryption.wrappingKeyName: 'changeme'
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/home/opensearch_dashboards.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"server": true,
"ui": true,
"requiredPlugins": ["data", "urlForwarding"],
"optionalPlugins": ["usageCollection", "telemetry"],
"optionalPlugins": ["usageCollection", "telemetry", "dataSource"],
"requiredBundles": [
"opensearchDashboardsReact"
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ class TutorialDirectoryUi extends React.Component {
<h1>
<FormattedMessage
id="home.tutorial.addDataToOpenSearchDashboardsTitle"
defaultMessage="Add sample data"
defaultMessage="Add sample data to data source"
/>
</h1>
</EuiTitle>
Expand Down
15 changes: 13 additions & 2 deletions src/plugins/home/public/application/sample_data_client.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ function clearIndexPatternsCache() {
getServices().indexPatternService.clearCache();
}

export async function listSampleDataSets() {
return await getServices().http.get(sampleDataUrl);
export async function listSampleDataSets(dataSourceId) {
const query = buildQuery(dataSourceId);
return await getServices().http.get(sampleDataUrl, { query });
}

export async function installSampleDataSet(id, sampleDataDefaultIndex) {
Expand All @@ -64,3 +65,13 @@ export async function uninstallSampleDataSet(id, sampleDataDefaultIndex) {

clearIndexPatternsCache();
}

function buildQuery(dataSourceId) {
const query = {};

if (dataSourceId) {
query.data_source = dataSourceId;
}

return query;
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const ecommerceSpecProvider = function (): SampleDatasetSchema {
description: ecommerceDescription,
previewImagePath: '/plugins/home/assets/sample_data_resources/ecommerce/dashboard.png',
darkPreviewImagePath: '/plugins/home/assets/sample_data_resources/ecommerce/dashboard_dark.png',
overviewDashboard: '722b74f0-b882-11e8-a6d9-e546fe2bba5f',
overviewDashboard: '722b74f0-b882-11e8-a6d9-e546fe2bba5f', // todo: add dataSourceId
appLinks: initialAppLinks,
defaultIndex: 'ff959d40-b880-11e8-a6d9-e546fe2bba5f',
savedObjects: getSavedObjects(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import { i18n } from '@osd/i18n';
import { SavedObject } from 'opensearch-dashboards/server';

// todo: add dataSourceId in id
export const getSavedObjects = (): SavedObject[] => [
{
id: '37cc8650-b882-11e8-a6d9-e546fe2bba5f',
Expand Down
23 changes: 16 additions & 7 deletions src/plugins/home/server/services/sample_data/routes/install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,20 @@ export function createInstallRoute(
{
path: '/api/sample_data/{id}',
validate: {
params: schema.object({ id: schema.string() }),
params: schema.object({
id: schema.string(),
}),
// TODO validate now as date
query: schema.object({ now: schema.maybe(schema.string()) }),
query: schema.object({
now: schema.maybe(schema.string()),
data_source_id: schema.maybe(schema.string()),
}),
},
},
async (context, req, res) => {
const { params, query } = req;
const dataSourceId = query.data_source_id;

const sampleDataset = sampleDatasets.find(({ id }) => id === params.id);
if (!sampleDataset) {
return res.notFound();
Expand All @@ -118,13 +125,17 @@ export function createInstallRoute(
const now = query.now ? new Date(query.now) : new Date();
const nowReference = dateToIso8601IgnoringTime(now);
const counts = {};
const caller = dataSourceId
? context.dataSource.opensearch.legacy.getClient(dataSourceId).callAPI
: context.core.opensearch.legacy.client.callAsCurrentUser;

for (let i = 0; i < sampleDataset.dataIndices.length; i++) {
const dataIndexConfig = sampleDataset.dataIndices[i];
const index = createIndexName(sampleDataset.id, dataIndexConfig.id);

// clean up any old installation of dataset
try {
await context.core.opensearch.legacy.client.callAsCurrentUser('indices.delete', {
await caller('indices.delete', {
index,
});
} catch (err) {
Expand All @@ -139,10 +150,7 @@ export function createInstallRoute(
mappings: { properties: dataIndexConfig.fields },
},
};
await context.core.opensearch.legacy.client.callAsCurrentUser(
'indices.create',
createIndexParams
);
await caller('indices.create', createIndexParams);
} catch (err) {
const errMsg = `Unable to create sample data index "${index}", error: ${err.message}`;
logger.warn(errMsg);
Expand All @@ -167,6 +175,7 @@ export function createInstallRoute(

let createResults;
try {
// todo: double check on data source id
createResults = await context.core.savedObjects.client.bulkCreate(
sampleDataset.savedObjects.map(({ version, ...savedObject }) => savedObject),
{ overwrite: true }
Expand Down
115 changes: 64 additions & 51 deletions src/plugins/home/server/services/sample_data/routes/list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
*/

import { IRouter } from 'src/core/server';
import { schema } from '@osd/config-schema';
import { SampleDatasetSchema } from '../lib/sample_dataset_registry_types';
import { createIndexName } from '../lib/create_index_name';

Expand All @@ -37,66 +38,78 @@ const INSTALLED = 'installed';
const UNKNOWN = 'unknown';

export const createListRoute = (router: IRouter, sampleDatasets: SampleDatasetSchema[]) => {
router.get({ path: '/api/sample_data', validate: false }, async (context, req, res) => {
const registeredSampleDatasets = sampleDatasets.map((sampleDataset) => {
return {
id: sampleDataset.id,
name: sampleDataset.name,
description: sampleDataset.description,
previewImagePath: sampleDataset.previewImagePath,
darkPreviewImagePath: sampleDataset.darkPreviewImagePath,
overviewDashboard: sampleDataset.overviewDashboard,
appLinks: sampleDataset.appLinks,
defaultIndex: sampleDataset.defaultIndex,
dataIndices: sampleDataset.dataIndices.map(({ id }) => ({ id })),
status: sampleDataset.status,
statusMsg: sampleDataset.statusMsg,
};
});
const isInstalledPromises = registeredSampleDatasets.map(async (sampleDataset) => {
for (let i = 0; i < sampleDataset.dataIndices.length; i++) {
const dataIndexConfig = sampleDataset.dataIndices[i];
const index = createIndexName(sampleDataset.id, dataIndexConfig.id);
try {
const indexExists = await context.core.opensearch.legacy.client.callAsCurrentUser(
'indices.exists',
{ index }
);
if (!indexExists) {
sampleDataset.status = NOT_INSTALLED;
router.get(
{
path: '/api/sample_data',
validate: {
query: schema.object({ data_source_id: schema.maybe(schema.string()) }),
},
},
async (context, req, res) => {
const registeredSampleDatasets = sampleDatasets.map((sampleDataset) => {
return {
id: sampleDataset.id,
name: sampleDataset.name,
description: sampleDataset.description,
previewImagePath: sampleDataset.previewImagePath,
darkPreviewImagePath: sampleDataset.darkPreviewImagePath,
overviewDashboard: sampleDataset.overviewDashboard,
appLinks: sampleDataset.appLinks,
defaultIndex: sampleDataset.defaultIndex,
dataIndices: sampleDataset.dataIndices.map(({ id }) => ({ id })),
status: sampleDataset.status,
statusMsg: sampleDataset.statusMsg,
};
});
const isInstalledPromises = registeredSampleDatasets.map(async (sampleDataset) => {
const dataSourceId = req.query.data_source_id;

const caller = dataSourceId
? context.dataSource.opensearch.legacy.getClient(dataSourceId).callAPI
: context.core.opensearch.legacy.client.callAsCurrentUser;

for (let i = 0; i < sampleDataset.dataIndices.length; i++) {
const dataIndexConfig = sampleDataset.dataIndices[i];
const index = createIndexName(sampleDataset.id, dataIndexConfig.id);
try {
const indexExists = await caller('indices.exists', { index });
if (!indexExists) {
sampleDataset.status = NOT_INSTALLED;
return;
}

const { count } = await caller('count', {
index,
});
if (count === 0) {
sampleDataset.status = NOT_INSTALLED;
return;
}
} catch (err) {
sampleDataset.status = UNKNOWN;
sampleDataset.statusMsg = err.message;
return;
}

const { count } = await context.core.opensearch.legacy.client.callAsCurrentUser('count', {
index,
});
if (count === 0) {
}
try {
// todo: prepend dataSourceId
await context.core.savedObjects.client.get('dashboard', sampleDataset.overviewDashboard);
} catch (err) {
if (context.core.savedObjects.client.errors.isNotFoundError(err)) {
sampleDataset.status = NOT_INSTALLED;
return;
}
} catch (err) {

sampleDataset.status = UNKNOWN;
sampleDataset.statusMsg = err.message;
return;
}
}
try {
await context.core.savedObjects.client.get('dashboard', sampleDataset.overviewDashboard);
} catch (err) {
if (context.core.savedObjects.client.errors.isNotFoundError(err)) {
sampleDataset.status = NOT_INSTALLED;
return;
}

sampleDataset.status = UNKNOWN;
sampleDataset.statusMsg = err.message;
return;
}

sampleDataset.status = INSTALLED;
});
sampleDataset.status = INSTALLED;
});

await Promise.all(isInstalledPromises);
return res.ok({ body: registeredSampleDatasets });
});
await Promise.all(isInstalledPromises);
return res.ok({ body: registeredSampleDatasets });
}
);
};
28 changes: 12 additions & 16 deletions src/plugins/home/server/services/sample_data/routes/uninstall.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,34 +45,29 @@ export function createUninstallRoute(
path: '/api/sample_data/{id}',
validate: {
params: schema.object({ id: schema.string() }),
query: schema.object({
data_source_id: schema.maybe(schema.string()),
}),
},
},
async (
{
core: {
opensearch: {
legacy: {
client: { callAsCurrentUser },
},
},
savedObjects: { client: savedObjectsClient },
},
},
request,
response
) => {
async (context, request, response) => {
const sampleDataset = sampleDatasets.find(({ id }) => id === request.params.id);
const dataSourceId = request.query.data_source_id;

if (!sampleDataset) {
return response.notFound();
}

const caller = dataSourceId
? context.dataSource.opensearch.legacy.getClient(dataSourceId).callAPI
: context.core.opensearch.legacy.client.callAsCurrentUser;

for (let i = 0; i < sampleDataset.dataIndices.length; i++) {
const dataIndexConfig = sampleDataset.dataIndices[i];
const index = createIndexName(sampleDataset.id, dataIndexConfig.id);

try {
await callAsCurrentUser('indices.delete', { index });
await caller('indices.delete', { index });
} catch (err) {
return response.customError({
statusCode: err.status,
Expand All @@ -83,8 +78,9 @@ export function createUninstallRoute(
}
}

// todo: dataSourceId
const deletePromises = sampleDataset.savedObjects.map(({ type, id }) =>
savedObjectsClient.delete(type, id)
context.core.savedObjects.client.delete(type, id)
);

try {
Expand Down