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

[Index patterns] Default index pattern REST API #100691

Merged
merged 4 commits into from
May 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
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
9 changes: 6 additions & 3 deletions docs/api/index-patterns.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,16 @@ The following index patterns APIs are available:
** <<index-patterns-api-create, Create index pattern API>> to create {kib} index pattern
** <<index-patterns-api-update, Update index pattern API>> to partially updated {kib} index pattern
** <<index-patterns-api-delete, Delete index pattern API>> to delete {kib} index pattern
* Default index pattern
** <<index-patterns-api-default-get, Get default index pattern API>> to retrieve a default index pattern
** <<index-patterns-api-default-set, Set default index pattern API>> to set a default index pattern
* Fields
** <<index-patterns-fields-api-update, Update index pattern field>> to change field metadata, such as `count`, `customLabel` and `format`.


** <<index-patterns-fields-api-update, Update index pattern field>> to change field metadata, such as `count`, `customLabel` and `format`

include::index-patterns/get.asciidoc[]
include::index-patterns/create.asciidoc[]
include::index-patterns/update.asciidoc[]
include::index-patterns/delete.asciidoc[]
include::index-patterns/default-get.asciidoc[]
include::index-patterns/default-set.asciidoc[]
include::index-patterns/update-fields.asciidoc[]
55 changes: 55 additions & 0 deletions docs/api/index-patterns/default-get.asciidoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
[[index-patterns-api-default-get]]
=== Get default index pattern API
++++
<titleabbrev>Get default index pattern</titleabbrev>
++++

experimental[] Retrieve a default index pattern ID. Kibana UI uses default index pattern unless user picks a different one.

[[index-patterns-api-default-get-request]]
==== Request

`GET <kibana host>:<port>/api/index_patterns/default`

`GET <kibana host>:<port>/s/<space_id>/api/index_patterns/default`

[[index-patterns-api-default-get-params]]
==== Path parameters

`space_id`::
(Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used.

[[index-patterns-api-default-get-codes]]
==== Response code

`200`::
Indicates a successful call.

[[index-patterns-api-default-get-example]]
==== Example

Retrieve the default index pattern id:

[source,sh]
--------------------------------------------------
$ curl -X GET api/index_patterns/default
--------------------------------------------------
// KIBANA

The API returns an ID of a default index pattern:

[source,sh]
--------------------------------------------------
{
"index_pattern_id": "..."
}
--------------------------------------------------

In case there is no default index pattern, the API returns:

[source,sh]
--------------------------------------------------
{
"index_pattern_id": null
}
--------------------------------------------------
84 changes: 84 additions & 0 deletions docs/api/index-patterns/default-set.asciidoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
[[index-patterns-api-default-set]]
=== Set default index pattern API
++++
<titleabbrev>Set default index pattern</titleabbrev>
++++

experimental[] Set a default index pattern ID. Kibana UI will use default index pattern unless user picks a different one.
The API doesn't validate if given `index_pattern_id` is a valid id.

[[index-patterns-api-default-set-request]]
==== Request

`POST <kibana host>:<port>/api/index_patterns/default`

`POST <kibana host>:<port>/s/<space_id>/api/index_patterns/default`

[[index-patterns-api-default-set-params]]
==== Path parameters

`space_id`::
(Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used.

[[index-patterns-api-default-set-body]]
==== Request body

`index_pattern_id`:: (Required, `string` or `null`) Sets a default index pattern id. Use `null` to unset a default index pattern.

`force`:: (Optional, boolean) Updates existing default index pattern id. The default is `false`.


[[index-patterns-api-default-set-codes]]
==== Response code

`200`::
Indicates a successful call.

[[index-patterns-api-default-set-example]]
==== Example

Set the default index pattern id if none is set:

[source,sh]
--------------------------------------------------
$ curl -X POST api/index_patterns/default
{
"index_pattern_id": "..."
}
--------------------------------------------------
// KIBANA


Upsert the default index pattern:

[source,sh]
--------------------------------------------------
$ curl -X POST api/index_patterns/default
{
"index_pattern_id": "...",
"force": true
}
--------------------------------------------------
// KIBANA

Unset the default index pattern:

[source,sh]
--------------------------------------------------
$ curl -X POST api/index_patterns/default
{
"index_pattern_id": null,
"force": true
}
--------------------------------------------------
// KIBANA

The API returns:

[source,sh]
--------------------------------------------------
{
"acknowledged": true
}
--------------------------------------------------

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [IndexPatternsService](./kibana-plugin-plugins-data-public.indexpatternsservice.md) &gt; [getDefaultId](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefaultid.md)

## IndexPatternsService.getDefaultId property

Get default index pattern id

<b>Signature:</b>

```typescript
getDefaultId: () => Promise<string | null>;
```
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@ export declare class IndexPatternsService
| [get](./kibana-plugin-plugins-data-public.indexpatternsservice.get.md) | | <code>(id: string) =&gt; Promise&lt;IndexPattern&gt;</code> | Get an index pattern by id. Cache optimized |
| [getCache](./kibana-plugin-plugins-data-public.indexpatternsservice.getcache.md) | | <code>() =&gt; Promise&lt;SavedObject&lt;IndexPatternSavedObjectAttrs&gt;[] &#124; null &#124; undefined&gt;</code> | |
| [getDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefault.md) | | <code>() =&gt; Promise&lt;IndexPattern &#124; null&gt;</code> | Get default index pattern |
| [getDefaultId](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefaultid.md) | | <code>() =&gt; Promise&lt;string &#124; null&gt;</code> | Get default index pattern id |
| [getFieldsForIndexPattern](./kibana-plugin-plugins-data-public.indexpatternsservice.getfieldsforindexpattern.md) | | <code>(indexPattern: IndexPattern &#124; IndexPatternSpec, options?: GetFieldsOptions &#124; undefined) =&gt; Promise&lt;any&gt;</code> | Get field list by providing an index patttern (or spec) |
| [getFieldsForWildcard](./kibana-plugin-plugins-data-public.indexpatternsservice.getfieldsforwildcard.md) | | <code>(options: GetFieldsOptions) =&gt; Promise&lt;any&gt;</code> | Get field list by providing { pattern } |
| [getIds](./kibana-plugin-plugins-data-public.indexpatternsservice.getids.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;string[]&gt;</code> | Get list of index pattern ids |
| [getIdsWithTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.getidswithtitle.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;Array&lt;{</code><br/><code> id: string;</code><br/><code> title: string;</code><br/><code> }&gt;&gt;</code> | Get list of index pattern ids with titles |
| [getTitles](./kibana-plugin-plugins-data-public.indexpatternsservice.gettitles.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;string[]&gt;</code> | Get list of index pattern titles |
| [refreshFields](./kibana-plugin-plugins-data-public.indexpatternsservice.refreshfields.md) | | <code>(indexPattern: IndexPattern) =&gt; Promise&lt;void&gt;</code> | Refresh field list for a given index pattern |
| [savedObjectToSpec](./kibana-plugin-plugins-data-public.indexpatternsservice.savedobjecttospec.md) | | <code>(savedObject: SavedObject&lt;IndexPatternAttributes&gt;) =&gt; IndexPatternSpec</code> | Converts index pattern saved object to index pattern spec |
| [setDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.setdefault.md) | | <code>(id: string, force?: boolean) =&gt; Promise&lt;void&gt;</code> | Optionally set default index pattern, unless force = true |
| [setDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.setdefault.md) | | <code>(id: string &#124; null, force?: boolean) =&gt; Promise&lt;void&gt;</code> | Optionally set default index pattern, unless force = true |

## Methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ Optionally set default index pattern, unless force = true
<b>Signature:</b>

```typescript
setDefault: (id: string, force?: boolean) => Promise<void>;
setDefault: (id: string | null, force?: boolean) => Promise<void>;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) &gt; [IndexPatternsService](./kibana-plugin-plugins-data-server.indexpatternsservice.md) &gt; [getDefaultId](./kibana-plugin-plugins-data-server.indexpatternsservice.getdefaultid.md)

## IndexPatternsService.getDefaultId property

Get default index pattern id

<b>Signature:</b>

```typescript
getDefaultId: () => Promise<string | null>;
```
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@ export declare class IndexPatternsService
| [get](./kibana-plugin-plugins-data-server.indexpatternsservice.get.md) | | <code>(id: string) =&gt; Promise&lt;IndexPattern&gt;</code> | Get an index pattern by id. Cache optimized |
| [getCache](./kibana-plugin-plugins-data-server.indexpatternsservice.getcache.md) | | <code>() =&gt; Promise&lt;SavedObject&lt;IndexPatternSavedObjectAttrs&gt;[] &#124; null &#124; undefined&gt;</code> | |
| [getDefault](./kibana-plugin-plugins-data-server.indexpatternsservice.getdefault.md) | | <code>() =&gt; Promise&lt;IndexPattern &#124; null&gt;</code> | Get default index pattern |
| [getDefaultId](./kibana-plugin-plugins-data-server.indexpatternsservice.getdefaultid.md) | | <code>() =&gt; Promise&lt;string &#124; null&gt;</code> | Get default index pattern id |
| [getFieldsForIndexPattern](./kibana-plugin-plugins-data-server.indexpatternsservice.getfieldsforindexpattern.md) | | <code>(indexPattern: IndexPattern &#124; IndexPatternSpec, options?: GetFieldsOptions &#124; undefined) =&gt; Promise&lt;any&gt;</code> | Get field list by providing an index patttern (or spec) |
| [getFieldsForWildcard](./kibana-plugin-plugins-data-server.indexpatternsservice.getfieldsforwildcard.md) | | <code>(options: GetFieldsOptions) =&gt; Promise&lt;any&gt;</code> | Get field list by providing { pattern } |
| [getIds](./kibana-plugin-plugins-data-server.indexpatternsservice.getids.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;string[]&gt;</code> | Get list of index pattern ids |
| [getIdsWithTitle](./kibana-plugin-plugins-data-server.indexpatternsservice.getidswithtitle.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;Array&lt;{</code><br/><code> id: string;</code><br/><code> title: string;</code><br/><code> }&gt;&gt;</code> | Get list of index pattern ids with titles |
| [getTitles](./kibana-plugin-plugins-data-server.indexpatternsservice.gettitles.md) | | <code>(refresh?: boolean) =&gt; Promise&lt;string[]&gt;</code> | Get list of index pattern titles |
| [refreshFields](./kibana-plugin-plugins-data-server.indexpatternsservice.refreshfields.md) | | <code>(indexPattern: IndexPattern) =&gt; Promise&lt;void&gt;</code> | Refresh field list for a given index pattern |
| [savedObjectToSpec](./kibana-plugin-plugins-data-server.indexpatternsservice.savedobjecttospec.md) | | <code>(savedObject: SavedObject&lt;IndexPatternAttributes&gt;) =&gt; IndexPatternSpec</code> | Converts index pattern saved object to index pattern spec |
| [setDefault](./kibana-plugin-plugins-data-server.indexpatternsservice.setdefault.md) | | <code>(id: string, force?: boolean) =&gt; Promise&lt;void&gt;</code> | Optionally set default index pattern, unless force = true |
| [setDefault](./kibana-plugin-plugins-data-server.indexpatternsservice.setdefault.md) | | <code>(id: string &#124; null, force?: boolean) =&gt; Promise&lt;void&gt;</code> | Optionally set default index pattern, unless force = true |

## Methods

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ Optionally set default index pattern, unless force = true
<b>Signature:</b>

```typescript
setDefault: (id: string, force?: boolean) => Promise<void>;
setDefault: (id: string | null, force?: boolean) => Promise<void>;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) &gt; [SearchStrategyDependencies](./kibana-plugin-plugins-data-server.searchstrategydependencies.md) &gt; [request](./kibana-plugin-plugins-data-server.searchstrategydependencies.request.md)

## SearchStrategyDependencies.request property

<b>Signature:</b>

```typescript
request: KibanaRequest;
```
Original file line number Diff line number Diff line change
Expand Up @@ -192,20 +192,28 @@ export class IndexPatternsService {
* Get default index pattern
*/
getDefault = async () => {
const defaultIndexPatternId = await this.config.get('defaultIndex');
const defaultIndexPatternId = await this.getDefaultId();
if (defaultIndexPatternId) {
return await this.get(defaultIndexPatternId);
}

return null;
};

/**
* Get default index pattern id
*/
getDefaultId = async (): Promise<string | null> => {
const defaultIndexPatternId = await this.config.get('defaultIndex');
return defaultIndexPatternId ?? null;
};

/**
* Optionally set default index pattern, unless force = true
* @param id
* @param force
*/
setDefault = async (id: string, force = false) => {
setDefault = async (id: string | null, force = false) => {
if (force || !this.config.get('defaultIndex')) {
await this.config.set('defaultIndex', id);
}
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/data/public/public.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1624,6 +1624,7 @@ export class IndexPatternsService {
// (undocumented)
getCache: () => Promise<SavedObject<IndexPatternSavedObjectAttrs>[] | null | undefined>;
getDefault: () => Promise<IndexPattern | null>;
getDefaultId: () => Promise<string | null>;
getFieldsForIndexPattern: (indexPattern: IndexPattern | IndexPatternSpec, options?: GetFieldsOptions | undefined) => Promise<any>;
// Warning: (ae-forgotten-export) The symbol "GetFieldsOptions" needs to be exported by the entry point index.d.ts
getFieldsForWildcard: (options: GetFieldsOptions) => Promise<any>;
Expand All @@ -1635,7 +1636,7 @@ export class IndexPatternsService {
getTitles: (refresh?: boolean) => Promise<string[]>;
refreshFields: (indexPattern: IndexPattern) => Promise<void>;
savedObjectToSpec: (savedObject: SavedObject<IndexPatternAttributes>) => IndexPatternSpec;
setDefault: (id: string, force?: boolean) => Promise<void>;
setDefault: (id: string | null, force?: boolean) => Promise<void>;
updateSavedObject(indexPattern: IndexPattern, saveAttempts?: number, ignoreErrors?: boolean): Promise<void | Error>;
}

Expand Down
2 changes: 2 additions & 0 deletions src/plugins/data/server/index_patterns/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { registerGetScriptedFieldRoute } from './routes/scripted_fields/get_scri
import { registerDeleteScriptedFieldRoute } from './routes/scripted_fields/delete_scripted_field';
import { registerUpdateScriptedFieldRoute } from './routes/scripted_fields/update_scripted_field';
import type { DataPluginStart, DataPluginStartDependencies } from '../plugin';
import { registerManageDefaultIndexPatternRoutes } from './routes/default_index_pattern';

export function registerRoutes(
http: HttpServiceSetup,
Expand All @@ -42,6 +43,7 @@ export function registerRoutes(
registerGetIndexPatternRoute(router, getStartServices);
registerDeleteIndexPatternRoute(router, getStartServices);
registerUpdateIndexPatternRoute(router, getStartServices);
registerManageDefaultIndexPatternRoutes(router, getStartServices);

// Fields API
registerUpdateFieldsRoute(router, getStartServices);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import { schema } from '@kbn/config-schema';
import { IRouter, StartServicesAccessor } from '../../../../../core/server';
import type { DataPluginStart, DataPluginStartDependencies } from '../../plugin';
import { handleErrors } from './util/handle_errors';

export const registerManageDefaultIndexPatternRoutes = (
router: IRouter,
getStartServices: StartServicesAccessor<DataPluginStartDependencies, DataPluginStart>
) => {
router.get(
{
path: '/api/index_patterns/default',
validate: {},
},
handleErrors(async (ctx, req, res) => {
const savedObjectsClient = ctx.core.savedObjects.client;
const elasticsearchClient = ctx.core.elasticsearch.client.asCurrentUser;
const [, , { indexPatterns }] = await getStartServices();
const indexPatternsService = await indexPatterns.indexPatternsServiceFactory(
savedObjectsClient,
elasticsearchClient
);

const defaultIndexPatternId = await indexPatternsService.getDefaultId();

return res.ok({
body: {
index_pattern_id: defaultIndexPatternId,
},
});
})
);

router.post(
{
path: '/api/index_patterns/default',
validate: {
body: schema.object({
index_pattern_id: schema.nullable(
schema.string({
minLength: 1,
maxLength: 1_000,
})
),
force: schema.boolean({ defaultValue: false }),
}),
},
},
handleErrors(async (ctx, req, res) => {
const savedObjectsClient = ctx.core.savedObjects.client;
const elasticsearchClient = ctx.core.elasticsearch.client.asCurrentUser;
const [, , { indexPatterns }] = await getStartServices();
const indexPatternsService = await indexPatterns.indexPatternsServiceFactory(
savedObjectsClient,
elasticsearchClient
);

const newDefaultId = req.body.index_pattern_id;
const force = req.body.force;

await indexPatternsService.setDefault(newDefaultId, force);

return res.ok({
body: {
acknowledged: true,
},
});
})
);
};
Loading