Compare commits
59 Commits
python-client
...
1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 707c60681a | |||
| dc24a0cd84 | |||
| d6c5440900 | |||
| 0415843a16 | |||
| bcf443f976 | |||
| 31003b1523 | |||
| d313fd2e8f | |||
| b55e3f7e95 | |||
| a3a1795ab5 | |||
| 164ead7dbd | |||
| 19fb0d0948 | |||
| 57d7ee0aaa | |||
| 1f90f3ca52 | |||
| c378da8799 | |||
| 7cb714894f | |||
| 7f9932f008 | |||
| fff3b3ec2b | |||
| 1a901d2033 | |||
| 973d967514 | |||
| dcb3a0c02d | |||
| 65d2ef4860 | |||
| d4c20f0402 | |||
| 9a5c8cd6ae | |||
| 48d1603ed1 | |||
| 01a9fb6d6d | |||
| cbdefc2463 | |||
| a38eb15400 | |||
| dc69f8010b | |||
| 268f1d9571 | |||
| f8cac33ebc | |||
| eda842a36d | |||
| 7c425f102d | |||
| c85fd21b4f | |||
| 430b9fed50 | |||
| e8a863e943 | |||
| b12dab6705 | |||
| d2ba96967b | |||
| a9144167d8 | |||
| 07b0650128 | |||
| 293743e15b | |||
| 2d228a86ca | |||
| bff43bed13 | |||
| 75efdfeae8 | |||
| 54a0b8e755 | |||
| 6bf8a7d51a | |||
| 05ba9198f6 | |||
| 125585f04e | |||
| ed8230cb02 | |||
| 7aed3bfbf1 | |||
| fbc0447bcd | |||
| 18d3891879 | |||
| e210d7d217 | |||
| 51d359ec40 | |||
| 4d39000cd3 | |||
| cea3ba7ce9 | |||
| 1c4f81eb53 | |||
| bfc56f2f7f | |||
| 9a2e6ed028 | |||
| 12ce7e5fea |
+145
@@ -0,0 +1,145 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Go client
|
||||||
|
nav_order: 80
|
||||||
|
---
|
||||||
|
|
||||||
|
# Go client
|
||||||
|
|
||||||
|
The OpenSearch Go client lets you connect your Go application with the data in your OpenSearch cluster.
|
||||||
|
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
If you're creating a new project:
|
||||||
|
|
||||||
|
```go
|
||||||
|
go mod init
|
||||||
|
```
|
||||||
|
|
||||||
|
To add the client to your project, import it like any other module:
|
||||||
|
|
||||||
|
```go
|
||||||
|
go get github.com/opensearch-project/opensearch-go
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sample code
|
||||||
|
|
||||||
|
This sample code creates a client, adds an index with non-default settings, inserts a document, searches for the document, deletes the document, and finally deletes the index:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
|
opensearch "github.com/opensearch-project/opensearch-go"
|
||||||
|
opensearchapi "github.com/opensearch-project/opensearch-go/opensearchapi"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
const IndexName = "go-test-index1"
|
||||||
|
func main() {
|
||||||
|
// Initialize the client with SSL/TLS enabled.
|
||||||
|
client, err := opensearch.NewClient(opensearch.Config{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
||||||
|
},
|
||||||
|
Addresses: []string{"https://localhost:9200"},
|
||||||
|
Username: "admin", // For testing only. Don't store credentials in code.
|
||||||
|
Password: "admin",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("cannot initialize", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print OpenSearch version information on console.
|
||||||
|
fmt.Println(client.Info())
|
||||||
|
|
||||||
|
// Define index mapping.
|
||||||
|
mapping := strings.NewReader(`{
|
||||||
|
'settings': {
|
||||||
|
'index': {
|
||||||
|
'number_of_shards': 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`)
|
||||||
|
|
||||||
|
// Create an index with non-default settings.
|
||||||
|
res := opensearchapi.CreateRequest{
|
||||||
|
Index: IndexName,
|
||||||
|
Body: mapping,
|
||||||
|
}
|
||||||
|
fmt.Println("creating index", res)
|
||||||
|
|
||||||
|
// Add a document to the index.
|
||||||
|
document := strings.NewReader(`{
|
||||||
|
"title": "Moneyball",
|
||||||
|
"director": "Bennett Miller",
|
||||||
|
"year": "2011"
|
||||||
|
}`)
|
||||||
|
|
||||||
|
docId := "1"
|
||||||
|
req := opensearchapi.IndexRequest{
|
||||||
|
Index: IndexName,
|
||||||
|
DocumentID: docId,
|
||||||
|
Body: document,
|
||||||
|
}
|
||||||
|
insertResponse, err := req.Do(context.Background(), client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("failed to insert document ", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println(insertResponse)
|
||||||
|
|
||||||
|
// Search for the document.
|
||||||
|
content := strings.NewReader(`{
|
||||||
|
"size": 5,
|
||||||
|
"query": {
|
||||||
|
"multi_match": {
|
||||||
|
"query": "miller",
|
||||||
|
"fields": ["title^2", "director"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`)
|
||||||
|
|
||||||
|
search := opensearchapi.SearchRequest{
|
||||||
|
Body: content,
|
||||||
|
}
|
||||||
|
|
||||||
|
searchResponse, err := search.Do(context.Background(), client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("failed to search document ", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println(searchResponse)
|
||||||
|
|
||||||
|
// Delete the document.
|
||||||
|
delete := opensearchapi.DeleteRequest{
|
||||||
|
Index: IndexName,
|
||||||
|
DocumentID: docId,
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteResponse, err := delete.Do(context.Background(), client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("failed to delete document ", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println("deleting document")
|
||||||
|
fmt.Println(deleteResponse)
|
||||||
|
|
||||||
|
// Delete previously created index.
|
||||||
|
deleteIndex := opensearchapi.IndicesDeleteRequest{
|
||||||
|
Index: []string{IndexName},
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteIndexResponse, err := deleteIndex.Do(context.Background(), client)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("failed to delete index ", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println("deleting index", deleteIndexResponse)
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
layout: default
|
layout: default
|
||||||
title: Java high-level REST client
|
title: Elasticsearch OSS Java high-level REST client
|
||||||
nav_order: 60
|
nav_order: 60
|
||||||
---
|
---
|
||||||
|
|
||||||
# Java high-level REST client
|
# Elasticsearch OSS Java high-level REST client
|
||||||
|
|
||||||
The Elasticsearch OSS Java high-level REST client allows you to interact with your OpenSearch clusters and indices through Java methods and data structures rather than HTTP methods and JSON.
|
The Elasticsearch OSS Java high-level REST client allows you to interact with your OpenSearch clusters and indices through Java methods and data structures rather than HTTP methods and JSON.
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ To start using the Elasticsearch OSS Java high-level REST client, ensure that yo
|
|||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
You can now start your OpenSearch cluster. The 7.10.2 high-level REST client works with the 1.x versions of OpenSearch.
|
You can now start your OpenSearch cluster. The 7.10.2 Elasticsearch OSS high-level REST client works with the 1.x versions of OpenSearch.
|
||||||
|
|
||||||
## Sample code
|
## Sample code
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ public class RESTClientSample {
|
|||||||
HashMap<String, Object> mapping = new HashMap<String, Object>();
|
HashMap<String, Object> mapping = new HashMap<String, Object>();
|
||||||
mapping.put("properties", ageMapping);
|
mapping.put("properties", ageMapping);
|
||||||
createIndexRequest.mapping(mapping);
|
createIndexRequest.mapping(mapping);
|
||||||
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT
|
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
|
||||||
|
|
||||||
//Adding data to the index.
|
//Adding data to the index.
|
||||||
IndexRequest request = new IndexRequest("custom-index"); //Add a document to the custom-index we created.
|
IndexRequest request = new IndexRequest("custom-index"); //Add a document to the custom-index we created.
|
||||||
|
|||||||
@@ -0,0 +1,141 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: JavaScript client
|
||||||
|
nav_order: 90
|
||||||
|
---
|
||||||
|
|
||||||
|
# JavaScript client
|
||||||
|
|
||||||
|
The OpenSearch JavaScript client provides a safer and easier way to interact with your OpenSearch cluster. Rather than using OpenSearch from the browser and potentially exposing your data to the public, you can build an OpenSearch client that takes care of sending requests to your cluster.
|
||||||
|
|
||||||
|
The client contains a library of APIs that let you perform different operations on your cluster and return a standard response body. The example here demonstrates some basic operations like creating an index, adding documents, and searching your data.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
To add the client to your project, install it from [npm](https://www.npmjs.com):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @opensearch-project/opensearch
|
||||||
|
```
|
||||||
|
|
||||||
|
To install a specific major version of the client, run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @opensearch-project/opensearch@<version>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you prefer to add the client manually or just want to examine the source code, see [opensearch-js](https://github.com/opensearch-project/opensearch-js) on GitHub.
|
||||||
|
|
||||||
|
Then require the client:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const { Client } = require("@opensearch-project/opensearch");
|
||||||
|
```
|
||||||
|
|
||||||
|
## Sample code
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var host = "localhost";
|
||||||
|
var protocol = "https";
|
||||||
|
var port = 9200;
|
||||||
|
var auth = "admin:admin"; // For testing only. Don't store credentials in code.
|
||||||
|
var ca_certs_path = "/full/path/to/root-ca.pem";
|
||||||
|
|
||||||
|
// Optional client certificates if you don't want to use HTTP basic authentication.
|
||||||
|
// var client_cert_path = '/full/path/to/client.pem'
|
||||||
|
// var client_key_path = '/full/path/to/client-key.pem'
|
||||||
|
|
||||||
|
// Create a client with SSL/TLS enabled.
|
||||||
|
var { Client } = require("@opensearch-project/opensearch");
|
||||||
|
var fs = require("fs");
|
||||||
|
var client = new Client({
|
||||||
|
node: protocol + "://" + auth + "@" + host + ":" + port,
|
||||||
|
ssl: {
|
||||||
|
ca: fs.readFileSync(ca_certs_path),
|
||||||
|
// You can turn off certificate verification (rejectUnauthorized: false) if you're using self-signed certificates with a hostname mismatch.
|
||||||
|
// cert: fs.readFileSync(client_cert_path),
|
||||||
|
// key: fs.readFileSync(client_key_path)
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
async function search() {
|
||||||
|
// Create an index with non-default settings.
|
||||||
|
var index_name = "books";
|
||||||
|
var settings = {
|
||||||
|
settings: {
|
||||||
|
index: {
|
||||||
|
number_of_shards: 4,
|
||||||
|
number_of_replicas: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await client.indices.create({
|
||||||
|
index: index_name,
|
||||||
|
body: settings,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Creating index:");
|
||||||
|
console.log(response.body);
|
||||||
|
|
||||||
|
// Add a document to the index.
|
||||||
|
var document = {
|
||||||
|
title: "The Outsider",
|
||||||
|
author: "Stephen King",
|
||||||
|
year: "2018",
|
||||||
|
genre: "Crime fiction",
|
||||||
|
};
|
||||||
|
|
||||||
|
var id = "1";
|
||||||
|
|
||||||
|
var response = await client.index({
|
||||||
|
id: id,
|
||||||
|
index: index_name,
|
||||||
|
body: document,
|
||||||
|
refresh: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Adding document:");
|
||||||
|
console.log(response.body);
|
||||||
|
|
||||||
|
// Search for the document.
|
||||||
|
var query = {
|
||||||
|
query: {
|
||||||
|
match: {
|
||||||
|
title: {
|
||||||
|
query: "The Outsider",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await client.search({
|
||||||
|
index: index_name,
|
||||||
|
body: query,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Search results:");
|
||||||
|
console.log(response.body.hits);
|
||||||
|
|
||||||
|
// Delete the document.
|
||||||
|
var response = await client.delete({
|
||||||
|
index: index_name,
|
||||||
|
id: id,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Deleting document:");
|
||||||
|
console.log(response.body);
|
||||||
|
|
||||||
|
// Delete the index.
|
||||||
|
var response = await client.indices.delete({
|
||||||
|
index: index_name,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Deleting index:");
|
||||||
|
console.log(response.body);
|
||||||
|
}
|
||||||
|
|
||||||
|
search().catch(console.log);
|
||||||
|
```
|
||||||
@@ -20,7 +20,7 @@ Resource | Description
|
|||||||
The specification in the default Helm chart supports many standard use cases and setups. You can modify the default chart to configure your desired specifications and set Transport Layer Security (TLS) and role-based access control (RBAC).
|
The specification in the default Helm chart supports many standard use cases and setups. You can modify the default chart to configure your desired specifications and set Transport Layer Security (TLS) and role-based access control (RBAC).
|
||||||
|
|
||||||
For information about the default configuration, steps to configure security, and configurable parameters, see the
|
For information about the default configuration, steps to configure security, and configurable parameters, see the
|
||||||
[README](https://github.com/opensearch-project/opensearch-devops/blob/main/Helm/README.md).
|
[README](https://github.com/opensearch-project/helm-charts/tree/main/charts).
|
||||||
|
|
||||||
The instructions here assume you have a Kubernetes cluster with Helm preinstalled. See the [Kubernetes documentation](https://kubernetes.io/docs/setup/) for steps to configure a Kubernetes cluster and the [Helm documentation](https://helm.sh/docs/intro/install/) to install Helm.
|
The instructions here assume you have a Kubernetes cluster with Helm preinstalled. See the [Kubernetes documentation](https://kubernetes.io/docs/setup/) for steps to configure a Kubernetes cluster and the [Helm documentation](https://helm.sh/docs/intro/install/) to install Helm.
|
||||||
{: .note }
|
{: .note }
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
message: "🔥 [OpenSearch 1.0 released on July 12th! Get it now!](/downloads.html)"
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
message: "🌡️ [OpenSearch 1.1.0 is here, get it while it's hot!](/downloads.html)"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"current": "1.0",
|
||||||
|
"past": []
|
||||||
|
}
|
||||||
@@ -90,36 +90,36 @@ You can specify the following options.
|
|||||||
|
|
||||||
Options | Description | Type | Required
|
Options | Description | Type | Required
|
||||||
:--- | :--- |:--- |:--- |
|
:--- | :--- |:--- |:--- |
|
||||||
`source_index` | The name of the detector. | `string` | Yes
|
`source_index` | The name of the detector. | String | Yes
|
||||||
`target_index` | Specify the target index that the rolled up data is ingested into. You could either create a new target index or use an existing index. The target index cannot be a combination of raw and rolled up data. | `string` | Yes
|
`target_index` | Specify the target index that the rolled up data is ingested into. You could either create a new target index or use an existing index. The target index cannot be a combination of raw and rolled up data. | String | Yes
|
||||||
`schedule` | Schedule of the index rollup job which can be an interval or a cron expression. | `object` | Yes
|
`schedule` | Schedule of the index rollup job which can be an interval or a cron expression. | Object | Yes
|
||||||
`schedule.interval` | Specify the frequency of execution of the rollup job. | `object` | No
|
`schedule.interval` | Specify the frequency of execution of the rollup job. | Object | No
|
||||||
`schedule.interval.start_time` | Start time of the interval. | `timestamp` | Yes
|
`schedule.interval.start_time` | Start time of the interval. | Timestamp | Yes
|
||||||
`schedule.interval.period` | Define the interval period. | `string` | Yes
|
`schedule.interval.period` | Define the interval period. | String | Yes
|
||||||
`schedule.interval.unit` | Specify the time unit of the interval. | `string` | Yes
|
`schedule.interval.unit` | Specify the time unit of the interval. | String | Yes
|
||||||
`schedule.interval.cron` | Optionally, specify a cron expression to define therollup frequency. | `list` | No
|
`schedule.interval.cron` | Optionally, specify a cron expression to define therollup frequency. | List | No
|
||||||
`schedule.interval.cron.expression` | Specify a Unix cron expression. | `string` | Yes
|
`schedule.interval.cron.expression` | Specify a Unix cron expression. | String | Yes
|
||||||
`schedule.interval.cron.timezone` | Specify timezones as defined by the IANA Time Zone Database. Defaults to UTC. | `string` | No
|
`schedule.interval.cron.timezone` | Specify timezones as defined by the IANA Time Zone Database. Defaults to UTC. | String | No
|
||||||
`description` | Optionally, describe the rollup job. | `string` | No
|
`description` | Optionally, describe the rollup job. | String | No
|
||||||
`enabled` | When true, the index rollup job is scheduled. Default is true. | `boolean` | Yes
|
`enabled` | When true, the index rollup job is scheduled. Default is true. | Boolean | Yes
|
||||||
`continuous` | Specify whether or not the index rollup job continuously rolls up data forever or just executes over the current data set once and stops. Default is false. | `boolean` | Yes
|
`continuous` | Specify whether or not the index rollup job continuously rolls up data forever or just executes over the current data set once and stops. Default is false. | Boolean | Yes
|
||||||
`error_notification` | Set up a Mustache message template sent for error notifications. For example, if an index rollup job fails, the system sends a message to a Slack channel. | `object` | No
|
`error_notification` | Set up a Mustache message template sent for error notifications. For example, if an index rollup job fails, the system sends a message to a Slack channel. | Object | No
|
||||||
`page_size` | Specify the number of buckets to paginate through at a time while rolling up. | `number` | Yes
|
`page_size` | Specify the number of buckets to paginate through at a time while rolling up. | Number | Yes
|
||||||
`delay` | Specify time value to delay execution of the index rollup job. | `time_unit` | No
|
`delay` | The number of milliseconds to delay execution of the index rollup job. | Long | No
|
||||||
`dimensions` | Specify aggregations to create dimensions for the roll up time window. | `object` | Yes
|
`dimensions` | Specify aggregations to create dimensions for the roll up time window. | Object | Yes
|
||||||
`dimensions.date_histogram` | Specify either fixed_interval or calendar_interval, but not both. Either one limits what you can query in the target index. | `object` | No
|
`dimensions.date_histogram` | Specify either fixed_interval or calendar_interval, but not both. Either one limits what you can query in the target index. | Object | No
|
||||||
`dimensions.date_histogram.fixed_interval` | Specify the fixed interval for aggregations in milliseconds, seconds, minutes, hours, or days. | `string` | No
|
`dimensions.date_histogram.fixed_interval` | Specify the fixed interval for aggregations in milliseconds, seconds, minutes, hours, or days. | String | No
|
||||||
`dimensions.date_histogram.calendar_interval` | Specify the calendar interval for aggregations in minutes, hours, days, weeks, months, quarters, or years. | `string` | No
|
`dimensions.date_histogram.calendar_interval` | Specify the calendar interval for aggregations in minutes, hours, days, weeks, months, quarters, or years. | String | No
|
||||||
`dimensions.date_histogram.field` | Specify the date field used in date histogram aggregation. | `string` | No
|
`dimensions.date_histogram.field` | Specify the date field used in date histogram aggregation. | String | No
|
||||||
`dimensions.date_histogram.timezone` | Specify the timezones as defined by the IANA Time Zone Database. The default is UTC. | `string` | No
|
`dimensions.date_histogram.timezone` | Specify the timezones as defined by the IANA Time Zone Database. The default is UTC. | String | No
|
||||||
`dimensions.terms` | Specify the term aggregations that you want to roll up. | `object` | No
|
`dimensions.terms` | Specify the term aggregations that you want to roll up. | Object | No
|
||||||
`dimensions.terms.fields` | Specify terms aggregation for compatible fields. | `object` | No
|
`dimensions.terms.fields` | Specify terms aggregation for compatible fields. | Object | No
|
||||||
`dimensions.histogram` | Specify the histogram aggregations that you want to roll up. | `object` | No
|
`dimensions.histogram` | Specify the histogram aggregations that you want to roll up. | Object | No
|
||||||
`dimensions.histogram.field` | Add a field for histogram aggregations. | `string` | Yes
|
`dimensions.histogram.field` | Add a field for histogram aggregations. | String | Yes
|
||||||
`dimensions.histogram.interval` | Specify the histogram aggregation interval for the field. | `long` | Yes
|
`dimensions.histogram.interval` | Specify the histogram aggregation interval for the field. | Long | Yes
|
||||||
`dimensions.metrics` | Specify a list of objects that represent the fields and metrics that you want to calculate. | `nested object` | No
|
`dimensions.metrics` | Specify a list of objects that represent the fields and metrics that you want to calculate. | Nested object | No
|
||||||
`dimensions.metrics.field` | Specify the field that you want to perform metric aggregations on. | `string` | No
|
`dimensions.metrics.field` | Specify the field that you want to perform metric aggregations on. | String | No
|
||||||
`dimensions.metrics.field.metrics` | Specify the metric aggregations you want to calculate for the field. | `multiple strings` | No
|
`dimensions.metrics.field.metrics` | Specify the metric aggregations you want to calculate for the field. | Multiple strings | No
|
||||||
|
|
||||||
|
|
||||||
#### Sample response
|
#### Sample response
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ PUT _plugins/_ism/policies/policy_id
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you have more than one template that matches an index pattern, ISM uses the priority value to determine which template to apply.
|
||||||
|
|
||||||
For an example ISM template policy, see [Sample policy with ISM template]({{site.url}}{{site.baseurl}}/im-plugin/ism/policies#sample-policy-with-ism-template).
|
For an example ISM template policy, see [Sample policy with ISM template]({{site.url}}{{site.baseurl}}/im-plugin/ism/policies#sample-policy-with-ism-template).
|
||||||
|
|
||||||
Older versions of the plugin include the `policy_id` in an index template, so when an index is created that matches the index template pattern, the index will have the policy attached to it:
|
Older versions of the plugin include the `policy_id` in an index template, so when an index is created that matches the index template pattern, the index will have the policy attached to it:
|
||||||
@@ -89,6 +91,7 @@ Make sure that the alias that you enter already exists. For more information abo
|
|||||||
|
|
||||||
After you attach a policy to an index, ISM creates a job that runs every 5 minutes by default to perform policy actions, check conditions, and transition the index into different states. To change the default time interval for this job, see [Settings]({{site.url}}{{site.baseurl}}/im-plugin/ism/settings/).
|
After you attach a policy to an index, ISM creates a job that runs every 5 minutes by default to perform policy actions, check conditions, and transition the index into different states. To change the default time interval for this job, see [Settings]({{site.url}}{{site.baseurl}}/im-plugin/ism/settings/).
|
||||||
|
|
||||||
|
ISM does not run jobs if the cluster state is red.
|
||||||
|
|
||||||
### Step 3: Manage indices
|
### Step 3: Manage indices
|
||||||
|
|
||||||
|
|||||||
@@ -558,10 +558,12 @@ The following sample template policy is for a rollover use case.
|
|||||||
PUT _index_template/ism_rollover
|
PUT _index_template/ism_rollover
|
||||||
{
|
{
|
||||||
"index_patterns": ["log*"],
|
"index_patterns": ["log*"],
|
||||||
|
"template": {
|
||||||
"settings": {
|
"settings": {
|
||||||
"plugins.index_state_management.rollover_alias": "log"
|
"plugins.index_state_management.rollover_alias": "log"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Create an index with the `log` alias:
|
3. Create an index with the `log` alias:
|
||||||
@@ -586,6 +588,12 @@ The following sample template policy is for a rollover use case.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
5. Verify if the policy is attached to the `log-000001` index:
|
||||||
|
|
||||||
|
```json
|
||||||
|
GET _plugins/_ism/explain/log-000001?pretty
|
||||||
|
```
|
||||||
|
|
||||||
## Example policy
|
## Example policy
|
||||||
|
|
||||||
The following example policy implements a `hot`, `warm`, and `delete` workflow. You can use this policy as a template to prioritize resources to your indices based on their levels of activity.
|
The following example policy implements a `hot`, `warm`, and `delete` workflow. You can use this policy as a template to prioritize resources to your indices based on their levels of activity.
|
||||||
|
|||||||
@@ -6,3 +6,9 @@
|
|||||||
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
|
<script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
|
||||||
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js"></script>
|
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3.0.1/es5/tex-mml-chtml.js"></script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if jekyll.environment == "development" %}
|
||||||
|
<script src="{{ '/assets/js/version-selector.js' | relative_url }}"></script>
|
||||||
|
{% else %}
|
||||||
|
<script src="{{ '/docs/latest/assets/js/version-selector.js' }}"></script>
|
||||||
|
{% endif %}
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ layout: table_wrappers
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<nav role="navigation" aria-label="Main" id="site-nav" class="site-nav">
|
<nav role="navigation" aria-label="Main" id="site-nav" class="site-nav">
|
||||||
|
{% assign past_versions = site.data.versions.past | join: ";" %}
|
||||||
|
<div class="version-wrapper">
|
||||||
|
<version-selector selected="{{ site.data.versions.current }}"></version-selector>
|
||||||
|
</div>
|
||||||
{% assign pages_top_size = site.html_pages
|
{% assign pages_top_size = site.html_pages
|
||||||
| where_exp:"item", "item.title != nil"
|
| where_exp:"item", "item.title != nil"
|
||||||
| where_exp:"item", "item.parent == nil"
|
| where_exp:"item", "item.parent == nil"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Resource | Description
|
|||||||
The specification in the default Helm chart supports many standard use cases and setups. You can modify the default chart to configure your desired specifications and set Transport Layer Security (TLS) and role-based access control (RBAC).
|
The specification in the default Helm chart supports many standard use cases and setups. You can modify the default chart to configure your desired specifications and set Transport Layer Security (TLS) and role-based access control (RBAC).
|
||||||
|
|
||||||
For information about the default configuration, steps to configure security, and configurable parameters, see the
|
For information about the default configuration, steps to configure security, and configurable parameters, see the
|
||||||
[README](https://github.com/opensearch-project/opensearch-devops/blob/main/Helm/README.md).
|
[README](https://github.com/opensearch-project/helm-charts/tree/main/charts).
|
||||||
|
|
||||||
The instructions here assume you have a Kubernetes cluster with Helm preinstalled. See the [Kubernetes documentation](https://kubernetes.io/docs/setup/) for steps to configure a Kubernetes cluster and the [Helm documentation](https://helm.sh/docs/intro/install/) to install Helm.
|
The instructions here assume you have a Kubernetes cluster with Helm preinstalled. See the [Kubernetes documentation](https://kubernetes.io/docs/setup/) for steps to configure a Kubernetes cluster and the [Helm documentation](https://helm.sh/docs/intro/install/) to install Helm.
|
||||||
{: .note }
|
{: .note }
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ In a tarball installation, Performance Analyzer collects data when it is enabled
|
|||||||
1. Launch the agent CLI:
|
1. Launch the agent CLI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ES_HOME="$PWD" ./bin/performance-analyzer-agent-cli
|
OPENSEARCH_HOME="$PWD" ./bin/performance-analyzer-agent-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
1. In a separate window, enable the Performance Analyzer plugin:
|
1. In a separate window, enable the Performance Analyzer plugin:
|
||||||
|
|||||||
@@ -156,28 +156,6 @@ POST _reindex
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Reindex sorted documents
|
|
||||||
|
|
||||||
You can copy certain documents after sorting specific fields in the document.
|
|
||||||
|
|
||||||
This command copies the last 10 documents based on the `timestamp` field:
|
|
||||||
|
|
||||||
```json
|
|
||||||
POST _reindex
|
|
||||||
{
|
|
||||||
"size":10,
|
|
||||||
"source":{
|
|
||||||
"index":"source",
|
|
||||||
"sort":{
|
|
||||||
"timestamp":"desc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dest":{
|
|
||||||
"index":"destination"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Transform documents during reindexing
|
## Transform documents during reindexing
|
||||||
|
|
||||||
You can transform your data during the reindexing process using the `script` option.
|
You can transform your data during the reindexing process using the `script` option.
|
||||||
@@ -272,7 +250,6 @@ Option | Valid values | Description | Required
|
|||||||
`query` | Object | The search query to use for the reindex operation. | No
|
`query` | Object | The search query to use for the reindex operation. | No
|
||||||
`size` | Integer | The number of documents to reindex. | No
|
`size` | Integer | The number of documents to reindex. | No
|
||||||
`slice` | String | Specify manual or automatic slicing to parallelize reindexing. | No
|
`slice` | String | Specify manual or automatic slicing to parallelize reindexing. | No
|
||||||
`sort` | List | Sort specific fields in the document before reindexing. | No
|
|
||||||
|
|
||||||
## Destination index options
|
## Destination index options
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Reindex
|
||||||
|
parent: Document APIs
|
||||||
|
grand_parent: REST API reference
|
||||||
|
nav_order: 60
|
||||||
|
---
|
||||||
|
|
||||||
|
# Index document
|
||||||
|
Introduced 1.0
|
||||||
|
{: .label .label-purple}
|
||||||
|
|
||||||
|
The reindex API operation lets you copy all or a subset of your data from a source index into a destination index.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
POST /_reindex
|
||||||
|
{
|
||||||
|
"source":{
|
||||||
|
"index":"my-source-index"
|
||||||
|
},
|
||||||
|
"dest":{
|
||||||
|
"index":"my-destination-index"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Path and HTTP methods
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /_reindex
|
||||||
|
```
|
||||||
|
|
||||||
|
## URL parameters
|
||||||
|
|
||||||
|
All URL parameters are optional.
|
||||||
|
|
||||||
|
Parameter | Type | Description
|
||||||
|
:--- | :--- | :---
|
||||||
|
refresh | Boolean | If true, OpenSearch refreshes shards to make the reindex operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`.
|
||||||
|
timeout | Time | How long to wait for a response from the cluster. Default is `30s`.
|
||||||
|
wait_for_active_shards | String | The number of active shards that must be available before OpenSearch processes the reindex request. Default is 1 (only the primary shard). Set to `all` or a positive integer. Values greater than 1 require replicas. For example, if you specify a value of 3, the index must have two replicas distributed across two additional nodes for the operation to succeed.
|
||||||
|
wait_for_completion | Boolean | Waits for the matching tasks to complete. Default is `false`.
|
||||||
|
requests_per_second | Integer | Specifies the request’s throttling in sub-requests per second. Default is -1, which means no throttling.
|
||||||
|
require_alias | Boolean | Whether the destination index must be an index alias. Default is false.
|
||||||
|
scroll | Time | How long to keep the search context open. Default is `5m`.
|
||||||
|
slices | Integer | Number of sub-tasks OpenSearch should divide this task into. Default is 1, which means OpenSearch should not divide this task. Setting this parameter to `auto` indicates to OpenSearch that it should automatically decide how many slices to split the task into.
|
||||||
|
max_docs | Integer | How many documents the update by query operation should process at most. Default is all documents.
|
||||||
|
|
||||||
|
## Request body
|
||||||
|
|
||||||
|
Your request body must contain the names of the source index and destination index. All other fields are optional.
|
||||||
|
|
||||||
|
Field | Description
|
||||||
|
:--- | :---
|
||||||
|
conflicts | Indicates to OpenSearch what should happen if the delete by query operation runs into a version conflict. Valid options are `abort` and `proceed`. Default is abort.
|
||||||
|
source | Information about the source index to include. Valid fields are `index`, `max_docs`, `query`, `remote`, `size`, `slice`, and `_source`.
|
||||||
|
index | The name of the source index to copy data from.
|
||||||
|
max_docs | The maximum number of documents to reindex.
|
||||||
|
query | The search query to use for the reindex operation.
|
||||||
|
remote | Information about a remote OpenSearch cluster to copy data from. Valid fields are `host`, `username`, `password`, `socket_timeout`, and `connect_timeout`.
|
||||||
|
host | Host URL of the OpenSearch cluster to copy data from.
|
||||||
|
username | Username to authenticate with the remote cluster.
|
||||||
|
password | Password to authenticate with the remote cluster.
|
||||||
|
socket_timeout | The wait time for socket reads. Default is 30s.
|
||||||
|
connect_timeout | The wait time for remote connection timeouts. Default is 30s.
|
||||||
|
size | The number of documents to reindex.
|
||||||
|
slice | Whether to manually or automatically slice the reindex operation so it executes in parallel.
|
||||||
|
_source | Whether to reindex source fields. Speicfy a list of fields to reindex or true to reindex all fields. Default is true.
|
||||||
|
id | The ID to associate with manual slicing.
|
||||||
|
max | Maximum number of slices.
|
||||||
|
dest | Information about the destination index. Valid values are `index`, `version_type`, and `op_type`.
|
||||||
|
index | Name of the destination index.
|
||||||
|
version_type | The indexing operation's version type. Valid values are `internal`, `external`, `external_gt` (retrieve the document if the specified version number is greater than the document’s current version), and `external_gte` (retrieve the document if the specified version number is greater or equal to than the document’s current version).
|
||||||
|
op_type | Whether to copy over documents that are missing in the destination index. Valid values are `create` (ignore documents with the same ID from the source index) and `index` (copy everything from the source index).
|
||||||
|
script | A script that OpenSearch uses to apply transformations to the data during the reindex operation.
|
||||||
|
source | The actual script that OpenSearch runs.
|
||||||
|
lang | The scripting language. Valid options are `painless`, `expression`, `mustache`, and `java`.
|
||||||
|
|
||||||
|
## Response
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"took": 28829,
|
||||||
|
"timed_out": false,
|
||||||
|
"total": 111396,
|
||||||
|
"updated": 0,
|
||||||
|
"created": 111396,
|
||||||
|
"deleted": 0,
|
||||||
|
"batches": 112,
|
||||||
|
"version_conflicts": 0,
|
||||||
|
"noops": 0,
|
||||||
|
"retries": {
|
||||||
|
"bulk": 0,
|
||||||
|
"search": 0
|
||||||
|
},
|
||||||
|
"throttled_millis": 0,
|
||||||
|
"requests_per_second": -1.0,
|
||||||
|
"throttled_until_millis": 0,
|
||||||
|
"failures": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Response body fields
|
||||||
|
|
||||||
|
Field | Description
|
||||||
|
:--- | :---
|
||||||
|
took | How long the operation took in milliseconds.
|
||||||
|
timed_out | Whether the operation timed out.
|
||||||
|
total | The total number of documents processed.
|
||||||
|
updated | The number of documents updated in the destination index.
|
||||||
|
created | The number of documents created in the destination index.
|
||||||
|
deleted | The number of documents deleted.
|
||||||
|
batches | Number of scroll responses.
|
||||||
|
version_conflicts | Number of version conflicts.
|
||||||
|
noops | How many documents OpenSearch ignored during the operation.
|
||||||
|
retries | Number of bulk and search retry requests.
|
||||||
|
throttled_millis | Number of throttled milliseconds during the request.
|
||||||
|
requests_per_second | Number of requests executed per second during the operation.
|
||||||
|
throttled_until_millis | The amount of time until OpenSearch executes the next throttled request.
|
||||||
|
failures | Any failures that occurred during the operation.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
layout: default
|
||||||
|
title: Remote cluster information
|
||||||
|
parent: REST API reference
|
||||||
|
nav_order: 25
|
||||||
|
---
|
||||||
|
|
||||||
|
# Remote cluster information
|
||||||
|
Introduced 1.0
|
||||||
|
{: .label .label-purple }
|
||||||
|
|
||||||
|
This operation provides connection information for any remote OpenSearch clusters that you've configured for the local cluster, such as the remote cluster alias, connection mode (`sniff` or `proxy`), IP addresses for seed nodes, and timeout settings.
|
||||||
|
|
||||||
|
The response is more comprehensive and useful than a call to `_cluster/settings`, which only includes the cluster alias and seed nodes.
|
||||||
|
|
||||||
|
|
||||||
|
## Path and HTTP methods
|
||||||
|
|
||||||
|
```
|
||||||
|
GET _remote/info
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"opensearch-cluster2": {
|
||||||
|
"connected": true,
|
||||||
|
"mode": "sniff",
|
||||||
|
"seeds": [
|
||||||
|
"172.28.0.2:9300"
|
||||||
|
],
|
||||||
|
"num_nodes_connected": 1,
|
||||||
|
"max_connections_per_cluster": 3,
|
||||||
|
"initial_connect_timeout": "30s",
|
||||||
|
"skip_unavailable": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
$content-width: 900px;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Brand colors
|
// Brand colors
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ code {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.site-nav {
|
.site-nav {
|
||||||
padding-top: 2rem;
|
padding-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-category {
|
.nav-category {
|
||||||
@@ -389,7 +389,7 @@ html {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
@include serif;
|
@include serif;
|
||||||
@include font-size(18);
|
@include font-size(16);
|
||||||
background: $background-lightest;
|
background: $background-lightest;
|
||||||
color: $text;
|
color: $text;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
@@ -962,6 +962,7 @@ main {
|
|||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
padding: 1px 0 6px;
|
padding: 1px 0 6px;
|
||||||
margin: .45em 0 .35em;
|
margin: .45em 0 .35em;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
|
||||||
@include mq(md) {
|
@include mq(md) {
|
||||||
@include font-size(32, true);
|
@include font-size(32, true);
|
||||||
@@ -975,6 +976,7 @@ main {
|
|||||||
a {
|
a {
|
||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
background: none;
|
background: none;
|
||||||
|
color: $text-link-alternate;
|
||||||
|
|
||||||
&:hover, :active {
|
&:hover, :active {
|
||||||
background: none;
|
background: none;
|
||||||
@@ -1082,6 +1084,11 @@ main {
|
|||||||
@include sans-serif;
|
@include sans-serif;
|
||||||
@include warning-stripes;
|
@include warning-stripes;
|
||||||
|
|
||||||
|
/* To match the website */
|
||||||
|
font-size: 1.125rem;
|
||||||
|
text-decoration-thickness: 0.5px;
|
||||||
|
text-underline-offset: 1px;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: $text;
|
color: $text;
|
||||||
|
|
||||||
@@ -1102,3 +1109,17 @@ main {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.version-wrapper {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
version-selector {
|
||||||
|
z-index: 1;
|
||||||
|
font-size: .9rem;
|
||||||
|
|
||||||
|
--normal-bg: linear-gradient(#{lighten($blue-300, 5%)}, #{darken($blue-300, 2%)});
|
||||||
|
--hover-bg: linear-gradient(#{lighten($blue-300, 2%)}, #{darken($blue-300, 4%)});
|
||||||
|
--link-color: #{$blue-300};
|
||||||
|
}
|
||||||
|
|||||||
@@ -1159,6 +1159,12 @@ Introduced 1.0
|
|||||||
|
|
||||||
Updates the existing configuration using the REST API. This operation can easily break your existing configuration, so we recommend using `securityadmin.sh` instead, which is far safer. See [Access control for the API](#access-control-for-the-api) for how to enable this operation.
|
Updates the existing configuration using the REST API. This operation can easily break your existing configuration, so we recommend using `securityadmin.sh` instead, which is far safer. See [Access control for the API](#access-control-for-the-api) for how to enable this operation.
|
||||||
|
|
||||||
|
Before you can execute the operation, you must first add the following line to `opensearch.yml`:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
plugins.security.unsupported.restapi.allow_securityconfig_modification: true
|
||||||
|
```
|
||||||
|
|
||||||
#### Request
|
#### Request
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -1179,6 +1185,106 @@ PATCH _plugins/_security/api/securityconfig
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Distinguished names
|
||||||
|
|
||||||
|
These REST APIs let a super admin add, retrieve, update, or delete any distinguished names from an allow list to enable communication between clusters and/or nodes.
|
||||||
|
|
||||||
|
Before you can use the REST API to configure the allow list, you must first add the following line to `opensearch.yml`:
|
||||||
|
|
||||||
|
```yml
|
||||||
|
plugins.security.nodes_dn_dynamic_config_enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Get distinguished names
|
||||||
|
|
||||||
|
Retrieves all distinguished names in the allow list.
|
||||||
|
|
||||||
|
#### Request
|
||||||
|
|
||||||
|
```
|
||||||
|
GET _plugins/_security/api/nodesdn
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Sample response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cluster1": {
|
||||||
|
"nodes_dn": [
|
||||||
|
"CN=cluster1.example.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To get the distinguished names from a specific cluster's or node's allow list, include the cluster's name in the request path.
|
||||||
|
|
||||||
|
#### Request
|
||||||
|
|
||||||
|
```
|
||||||
|
GET _plugins/_security/api/nodesdn/<cluster-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Sample response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cluster3": {
|
||||||
|
"nodes_dn": [
|
||||||
|
"CN=cluster3.example.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Update distinguished names
|
||||||
|
|
||||||
|
Adds or updates the specified distinguished names in the cluster's or node's allow list.
|
||||||
|
|
||||||
|
#### Request
|
||||||
|
|
||||||
|
```json
|
||||||
|
PUT _plugins/_security/api/nodesdn/<cluster-name>
|
||||||
|
{
|
||||||
|
"nodes_dn": [
|
||||||
|
"CN=cluster3.example.com"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Sample response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "CREATED",
|
||||||
|
"message": "'cluster3' created."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Delete distinguished names
|
||||||
|
|
||||||
|
Deletes all distinguished names in the specified cluster's or node's allow list.
|
||||||
|
|
||||||
|
#### Request
|
||||||
|
|
||||||
|
```
|
||||||
|
DELETE _plugins/_security/api/nodesdn/<cluster-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Sample response
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "OK",
|
||||||
|
"message": "'cluster3' deleted."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -1188,101 +1294,38 @@ PATCH _plugins/_security/api/securityconfig
|
|||||||
Introduced 1.0
|
Introduced 1.0
|
||||||
{: .label .label-purple }
|
{: .label .label-purple }
|
||||||
|
|
||||||
Retrieves the current security plugin configuration in JSON format.
|
Retrieves the cluster's security certificates.
|
||||||
|
|
||||||
#### Request
|
#### Request
|
||||||
|
|
||||||
```
|
```
|
||||||
GET _plugins/_security/api/securityconfig
|
GET _opendistro/_security/api/ssl/certs
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Update configuration
|
|
||||||
Introduced 1.0
|
|
||||||
{: .label .label-purple }
|
|
||||||
|
|
||||||
Creates or updates the existing configuration using the REST API rather than `securityadmin.sh`. This operation can easily break your existing configuration, so we recommend using `securityadmin.sh` instead. See [Access control for the API](#access-control-for-the-api) for how to enable this operation.
|
|
||||||
|
|
||||||
#### Request
|
|
||||||
|
|
||||||
```json
|
|
||||||
PUT _plugins/_security/api/securityconfig/config
|
|
||||||
{
|
|
||||||
"dynamic": {
|
|
||||||
"filtered_alias_mode": "warn",
|
|
||||||
"disable_rest_auth": false,
|
|
||||||
"disable_intertransport_auth": false,
|
|
||||||
"respect_request_indices_options": false,
|
|
||||||
"opensearch-dashboards": {
|
|
||||||
"multitenancy_enabled": true,
|
|
||||||
"server_username": "kibanaserver",
|
|
||||||
"index": ".opensearch-dashboards"
|
|
||||||
},
|
|
||||||
"http": {
|
|
||||||
"anonymous_auth_enabled": false
|
|
||||||
},
|
|
||||||
"authc": {
|
|
||||||
"basic_internal_auth_domain": {
|
|
||||||
"http_enabled": true,
|
|
||||||
"transport_enabled": true,
|
|
||||||
"order": 0,
|
|
||||||
"http_authenticator": {
|
|
||||||
"challenge": true,
|
|
||||||
"type": "basic",
|
|
||||||
"config": {}
|
|
||||||
},
|
|
||||||
"authentication_backend": {
|
|
||||||
"type": "intern",
|
|
||||||
"config": {}
|
|
||||||
},
|
|
||||||
"description": "Authenticate via HTTP Basic against internal users database"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"auth_failure_listeners": {},
|
|
||||||
"do_not_fail_on_forbidden": false,
|
|
||||||
"multi_rolespan_enabled": true,
|
|
||||||
"hosts_resolver_mode": "ip-only",
|
|
||||||
"do_not_fail_on_forbidden_empty": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Sample response
|
#### Sample response
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"status": "OK",
|
"http_certificates_list": [
|
||||||
"message": "'config' updated."
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Patch configuration
|
|
||||||
Introduced 1.0
|
|
||||||
{: .label .label-purple }
|
|
||||||
|
|
||||||
Updates the existing configuration using the REST API rather than `securityadmin.sh`. This operation can easily break your existing configuration, so we recommend using `securityadmin.sh` instead. See [Access control for the API](#access-control-for-the-api) for how to enable this operation.
|
|
||||||
|
|
||||||
#### Request
|
|
||||||
|
|
||||||
```json
|
|
||||||
PATCH _plugins/_security/api/securityconfig
|
|
||||||
[
|
|
||||||
{
|
{
|
||||||
"op": "replace", "path": "/config/dynamic/authc/basic_internal_auth_domain/transport_enabled", "value": "true"
|
"issuer_dn": "CN=Example Com Inc. Root CA,OU=Example Com Inc. Root CA,O=Example Com Inc.,DC=example,DC=com",
|
||||||
|
"subject_dn": "CN=node-0.example.com,OU=node,O=node,L=test,DC=de",
|
||||||
|
"san": "[[8, 1.2.3.4.5.5], [2, node-0.example.com]",
|
||||||
|
"not_before": "2018-04-22T03:43:47Z",
|
||||||
|
"not_after": "2028-04-19T03:43:47Z"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transport_certificates_list": [
|
||||||
|
{
|
||||||
|
"issuer_dn": "CN=Example Com Inc. Root CA,OU=Example Com Inc. Root CA,O=Example Com Inc.,DC=example,DC=com",
|
||||||
|
"subject_dn": "CN=node-0.example.com,OU=node,O=node,L=test,DC=de",
|
||||||
|
"san": "[[8, 1.2.3.4.5.5], [2, node-0.example.com]",
|
||||||
|
"not_before": "2018-04-22T03:43:47Z",
|
||||||
|
"not_after": "2028-04-19T03:43:47Z"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
```
|
|
||||||
|
|
||||||
#### Sample response
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "OK",
|
|
||||||
"message": "Resource updated."
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Cache
|
## Cache
|
||||||
|
|||||||
@@ -65,11 +65,11 @@ Save this file as `docker-compose.yml` and run `docker-compose up` to start two
|
|||||||
```yml
|
```yml
|
||||||
version: '3'
|
version: '3'
|
||||||
services:
|
services:
|
||||||
opensearch-node1:
|
opensearch-ccs-node1:
|
||||||
image: opensearchproject/opensearch:{{site.opensearch_version}}
|
image: opensearchproject/opensearch:{{site.opensearch_version}}
|
||||||
container_name: opensearch-node1
|
container_name: opensearch-ccs-node1
|
||||||
environment:
|
environment:
|
||||||
- cluster.name=opensearch-cluster1
|
- cluster.name=opensearch-ccs-cluster1
|
||||||
- discovery.type=single-node
|
- discovery.type=single-node
|
||||||
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
|
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
|
||||||
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
|
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
|
||||||
@@ -85,11 +85,11 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- opensearch-net
|
- opensearch-net
|
||||||
|
|
||||||
opensearch-node2:
|
opensearch-ccs-node2:
|
||||||
image: opensearchproject/opensearch:{{site.opensearch_version}}
|
image: opensearchproject/opensearch:{{site.opensearch_version}}
|
||||||
container_name: opensearch-node2
|
container_name: opensearch-ccs-node2
|
||||||
environment:
|
environment:
|
||||||
- cluster.name=opensearch-cluster2
|
- cluster.name=opensearch-ccs-cluster2
|
||||||
- discovery.type=single-node
|
- discovery.type=single-node
|
||||||
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
|
- bootstrap.memory_lock=true # along with the memlock settings below, disables swapping
|
||||||
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
|
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM
|
||||||
@@ -118,26 +118,26 @@ After the clusters start, verify the names of each:
|
|||||||
```json
|
```json
|
||||||
curl -XGET -u 'admin:admin' -k 'https://localhost:9200'
|
curl -XGET -u 'admin:admin' -k 'https://localhost:9200'
|
||||||
{
|
{
|
||||||
"cluster_name" : "opensearch-cluster1",
|
"cluster_name" : "opensearch-ccs-cluster1",
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
|
|
||||||
curl -XGET -u 'admin:admin' -k 'https://localhost:9250'
|
curl -XGET -u 'admin:admin' -k 'https://localhost:9250'
|
||||||
{
|
{
|
||||||
"cluster_name" : "opensearch-cluster2",
|
"cluster_name" : "opensearch-ccs-cluster2",
|
||||||
...
|
...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Both clusters run on `localhost`, so the important identifier is the port number. In this case, use port 9200 (`opensearch-node1`) as the remote cluster, and port 9250 (`opensearch-node2`) as the coordinating cluster.
|
Both clusters run on `localhost`, so the important identifier is the port number. In this case, use port 9200 (`opensearch-ccs-node1`) as the remote cluster, and port 9250 (`opensearch-ccs-node2`) as the coordinating cluster.
|
||||||
|
|
||||||
To get the IP address for the remote cluster, first identify its container ID:
|
To get the IP address for the remote cluster, first identify its container ID:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker ps
|
docker ps
|
||||||
CONTAINER ID IMAGE PORTS NAMES
|
CONTAINER ID IMAGE PORTS NAMES
|
||||||
6fe89ebc5a8e opensearchproject/opensearch:{{site.opensearch_version}} 0.0.0.0:9200->9200/tcp, 0.0.0.0:9600->9600/tcp, 9300/tcp opensearch-node1
|
6fe89ebc5a8e opensearchproject/opensearch:{{site.opensearch_version}} 0.0.0.0:9200->9200/tcp, 0.0.0.0:9600->9600/tcp, 9300/tcp opensearch-ccs-node1
|
||||||
2da08b6c54d8 opensearchproject/opensearch:{{site.opensearch_version}} 9300/tcp, 0.0.0.0:9250->9200/tcp, 0.0.0.0:9700->9600/tcp opensearch-node2
|
2da08b6c54d8 opensearchproject/opensearch:{{site.opensearch_version}} 9300/tcp, 0.0.0.0:9250->9200/tcp, 0.0.0.0:9700->9600/tcp opensearch-ccs-node2
|
||||||
```
|
```
|
||||||
|
|
||||||
Then get that container's IP address:
|
Then get that container's IP address:
|
||||||
@@ -154,7 +154,7 @@ curl -k -XPUT -H 'Content-Type: application/json' -u 'admin:admin' 'https://loca
|
|||||||
{
|
{
|
||||||
"persistent": {
|
"persistent": {
|
||||||
"search.remote": {
|
"search.remote": {
|
||||||
"opensearch-cluster1": {
|
"opensearch-ccs-cluster1": {
|
||||||
"seeds": ["172.31.0.3:9300"]
|
"seeds": ["172.31.0.3:9300"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,11 +171,11 @@ curl -XPUT -k -H 'Content-Type: application/json' -u 'admin:admin' 'https://loca
|
|||||||
At this point, cross-cluster search works. You can test it using the `admin` user:
|
At this point, cross-cluster search works. You can test it using the `admin` user:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -XGET -k -u 'admin:admin' 'https://localhost:9250/opensearch-cluster1:books/_search?pretty'
|
curl -XGET -k -u 'admin:admin' 'https://localhost:9250/opensearch-ccs-cluster1:books/_search?pretty'
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
"hits": [{
|
"hits": [{
|
||||||
"_index": "opensearch-cluster1:books",
|
"_index": "opensearch-ccs-cluster1:books",
|
||||||
"_type": "_doc",
|
"_type": "_doc",
|
||||||
"_id": "1",
|
"_id": "1",
|
||||||
"_score": 1.0,
|
"_score": 1.0,
|
||||||
@@ -196,7 +196,7 @@ curl -XPUT -k -u 'admin:admin' 'https://localhost:9250/_plugins/_security/api/in
|
|||||||
Then run the same search as before with `booksuser`:
|
Then run the same search as before with `booksuser`:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
curl -XGET -k -u booksuser:password 'https://localhost:9250/opensearch-cluster1:books/_search?pretty'
|
curl -XGET -k -u booksuser:password 'https://localhost:9250/opensearch-ccs-cluster1:books/_search?pretty'
|
||||||
{
|
{
|
||||||
"error" : {
|
"error" : {
|
||||||
"root_cause" : [
|
"root_cause" : [
|
||||||
@@ -225,11 +225,11 @@ Both clusters must have the user, but only the remote cluster needs the role and
|
|||||||
Finally, repeat the search:
|
Finally, repeat the search:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -XGET -k -u booksuser:password 'https://localhost:9250/opensearch-cluster1:books/_search?pretty'
|
curl -XGET -k -u booksuser:password 'https://localhost:9250/opensearch-ccs-cluster1:books/_search?pretty'
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
"hits": [{
|
"hits": [{
|
||||||
"_index": "opensearch-cluster1:books",
|
"_index": "opensearch-ccs-cluster1:books",
|
||||||
"_type": "_doc",
|
"_type": "_doc",
|
||||||
"_id": "1",
|
"_id": "1",
|
||||||
"_score": 1.0,
|
"_score": 1.0,
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ plugins.security.authcz.impersonation_dn:
|
|||||||
|
|
||||||
## Impersonating Users
|
## Impersonating Users
|
||||||
|
|
||||||
To impersonate another user, submit a request to the system with the HTTP header `opensearch_security_impersonate_as` set to the name of the user to be impersonated. A good test is to make a GET request to the `_plugins/_security/authinfo` URI:
|
To impersonate another user, submit a request to the system with the HTTP header `opendistro_security_impersonate_as` set to the name of the user to be impersonated. A good test is to make a GET request to the `_plugins/_security/authinfo` URI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -XGET -u 'admin:admin' -k -H "opensearch_security_impersonate_as: user_1" https://localhost:9200/_plugins/_security/authinfo?pretty
|
curl -XGET -u 'admin:admin' -k -H "opendistro_security_impersonate_as: user_1" https://localhost:9200/_plugins/_security/authinfo?pretty
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -7,58 +7,129 @@ nav_order: 50
|
|||||||
|
|
||||||
# Permissions
|
# Permissions
|
||||||
|
|
||||||
This page is a complete list of available permissions in the security plugin. Each permission controls access to a data type or API.
|
Each permission in the security plugin controls access to some action that the OpenSearch cluster can perform, such as indexing a document or checking cluster health.
|
||||||
|
|
||||||
Rather than creating new action groups from individual permissions, you can often achieve your desired security posture using some combination of the default action groups. To learn more, see [Default Action Groups]({{site.url}}{{site.baseurl}}/security-plugin/access-control/default-action-groups/).
|
Most permissions are self-describing. For example, `cluster:admin/ingest/pipeline/get` lets you retrieve information about ingest pipelines. _In many cases_, a permission correlates to a specific REST API operation, such as `GET _ingest/pipeline`.
|
||||||
|
|
||||||
|
Despite this correlation, permissions do **not** directly map to REST API operations. Operations such as `POST _bulk` and `GET _msearch` can access many indices and perform many actions in a single request. Even a simple request, such as `GET _cat/nodes`, performs several actions in order to generate its response.
|
||||||
|
|
||||||
|
In short, controlling access to the REST API is insufficient. Instead, the security plugin controls access to the underlying OpenSearch actions.
|
||||||
|
|
||||||
|
For example, consider the following `_bulk` request:
|
||||||
|
|
||||||
|
```json
|
||||||
|
POST _bulk
|
||||||
|
{ "delete": { "_index": "test-index", "_id": "tt2229499" } }
|
||||||
|
{ "index": { "_index": "test-index", "_id": "tt1979320" } }
|
||||||
|
{ "title": "Rush", "year": 2013 }
|
||||||
|
{ "create": { "_index": "test-index", "_id": "tt1392214" } }
|
||||||
|
{ "title": "Prisoners", "year": 2013 }
|
||||||
|
{ "update": { "_index": "test-index", "_id": "tt0816711" } }
|
||||||
|
{ "doc" : { "title": "World War Z" } }
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
For this request to succeed, you must have the following permissions for `test-index`:
|
||||||
|
|
||||||
|
- indices:data/write/bulk*
|
||||||
|
- indices:data/write/delete
|
||||||
|
- indices:data/write/index
|
||||||
|
- indices:data/write/update
|
||||||
|
|
||||||
|
These permissions also allow you add, update, or delete documents (e.g. `PUT test-index/_doc/tt0816711`), because they govern the underlying OpenSearch actions of indexing and deleting documents rather than a specific API path and HTTP method.
|
||||||
|
|
||||||
|
|
||||||
|
## Test permissions
|
||||||
|
|
||||||
|
If you want a user to have the absolute minimum set of permissions necessary to perform some function---the [principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)----the best way is to send representative requests to your cluster as a new test user. In the case of a permissions error, the security plugin is very explicit about which permissions are missing. Consider this request and response:
|
||||||
|
|
||||||
|
```json
|
||||||
|
GET _cat/shards?v
|
||||||
|
|
||||||
|
{
|
||||||
|
"error": {
|
||||||
|
"root_cause": [{
|
||||||
|
"type": "security_exception",
|
||||||
|
"reason": "no permissions for [indices:monitor/stats] and User [name=test-user, backend_roles=[], requestedTenant=null]"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"status": 403
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[Create a user and a role]({{site.url}}{{site.baseurl}}/security-plugin/access-control/users-roles/), map the role to the user, and start sending signed requests using curl, Postman, or any other client. Then gradually add permissions to the role as you encounter errors. Even after you resolve one permissions error, the same request might generate new errors; the plugin only returns the first error it encounters, so keep trying until the request succeeds.
|
||||||
|
|
||||||
|
Rather than individual permissions, you can often achieve your desired security posture using a combination of the default action groups. See [Default action groups]({{site.url}}{{site.baseurl}}/security-plugin/access-control/default-action-groups/) for descriptions of the permissions that each group grants.
|
||||||
{: .tip }
|
{: .tip }
|
||||||
|
|
||||||
|
|
||||||
## Cluster
|
## Cluster permissions
|
||||||
|
|
||||||
|
These permissions are for the cluster and can't be applied granularly. For example, you either have permissions to take snapshots (`cluster:admin/snapshot/create`) or you don't. You can't have permissions to take snapshots only for certain indices.
|
||||||
|
|
||||||
- cluster:admin/ingest/pipeline/delete
|
- cluster:admin/ingest/pipeline/delete
|
||||||
- cluster:admin/ingest/pipeline/get
|
- cluster:admin/ingest/pipeline/get
|
||||||
- cluster:admin/ingest/pipeline/put
|
- cluster:admin/ingest/pipeline/put
|
||||||
- cluster:admin/ingest/pipeline/simulate
|
- cluster:admin/ingest/pipeline/simulate
|
||||||
- cluster:admin/ingest/processor/grok/get
|
- cluster:admin/ingest/processor/grok/get
|
||||||
- cluster:admin/opensearch/ad/detector/delete
|
- cluster:admin/opendistro/ad/detector/delete
|
||||||
- cluster:admin/opensearch/ad/detector/jobmanagement
|
- cluster:admin/opendistro/ad/detector/info
|
||||||
- cluster:admin/opensearch/ad/detector/run
|
- cluster:admin/opendistro/ad/detector/jobmanagement
|
||||||
- cluster:admin/opensearch/ad/detector/search
|
- cluster:admin/opendistro/ad/detector/preview
|
||||||
- cluster:admin/opensearch/ad/detector/stats
|
- cluster:admin/opendistro/ad/detector/run
|
||||||
- cluster:admin/opensearch/ad/detector/write
|
- cluster:admin/opendistro/ad/detector/search
|
||||||
- cluster:admin/opensearch/ad/detectors/get
|
- cluster:admin/opendistro/ad/detector/stats
|
||||||
- cluster:admin/opensearch/ad/result/search
|
- cluster:admin/opendistro/ad/detector/write
|
||||||
- cluster:admin/opensearch/alerting/alerts/ack
|
- cluster:admin/opendistro/ad/detectors/get
|
||||||
- cluster:admin/opensearch/alerting/alerts/get
|
- cluster:admin/opendistro/ad/result/search
|
||||||
- cluster:admin/opensearch/alerting/destination/delete
|
- cluster:admin/opendistro/ad/tasks/search
|
||||||
- cluster:admin/opensearch/alerting/destination/email_account/delete
|
- cluster:admin/opendistro/alerting/alerts/ack (acknowledge)
|
||||||
- cluster:admin/opensearch/alerting/destination/email_account/get
|
- cluster:admin/opendistro/alerting/alerts/get
|
||||||
- cluster:admin/opensearch/alerting/destination/email_account/search
|
- cluster:admin/opendistro/alerting/destination/delete
|
||||||
- cluster:admin/opensearch/alerting/destination/email_account/write
|
- cluster:admin/opendistro/alerting/destination/email_account/delete
|
||||||
- cluster:admin/opensearch/alerting/destination/email_group/delete
|
- cluster:admin/opendistro/alerting/destination/email_account/get
|
||||||
- cluster:admin/opensearch/alerting/destination/email_group/get
|
- cluster:admin/opendistro/alerting/destination/email_account/search
|
||||||
- cluster:admin/opensearch/alerting/destination/email_group/search
|
- cluster:admin/opendistro/alerting/destination/email_account/write
|
||||||
- cluster:admin/opensearch/alerting/destination/email_group/write
|
- cluster:admin/opendistro/alerting/destination/email_group/delete
|
||||||
- cluster:admin/opensearch/alerting/destination/get
|
- cluster:admin/opendistro/alerting/destination/email_group/get
|
||||||
- cluster:admin/opensearch/alerting/destination/write
|
- cluster:admin/opendistro/alerting/destination/email_group/search
|
||||||
- cluster:admin/opensearch/alerting/monitor/delete
|
- cluster:admin/opendistro/alerting/destination/email_group/write
|
||||||
- cluster:admin/opensearch/alerting/monitor/execute
|
- cluster:admin/opendistro/alerting/destination/get
|
||||||
- cluster:admin/opensearch/alerting/monitor/get
|
- cluster:admin/opendistro/alerting/destination/write
|
||||||
- cluster:admin/opensearch/alerting/monitor/search
|
- cluster:admin/opendistro/alerting/monitor/delete
|
||||||
- cluster:admin/opensearch/alerting/monitor/write
|
- cluster:admin/opendistro/alerting/monitor/execute
|
||||||
- cluster:admin/opensearch/asynchronous_search/stats
|
- cluster:admin/opendistro/alerting/monitor/get
|
||||||
- cluster:admin/opensearch/asynchronous_search/delete
|
- cluster:admin/opendistro/alerting/monitor/search
|
||||||
- cluster:admin/opensearch/asynchronous_search/get
|
- cluster:admin/opendistro/alerting/monitor/write
|
||||||
- cluster:admin/opensearch/asynchronous_search/submit
|
- cluster:admin/opendistro/asynchronous_search/stats
|
||||||
- cluster:admin/opensearch/reports/definition/create
|
- cluster:admin/opendistro/asynchronous_search/delete
|
||||||
- cluster:admin/opensearch/reports/definition/delete
|
- cluster:admin/opendistro/asynchronous_search/get
|
||||||
- cluster:admin/opensearch/reports/definition/get
|
- cluster:admin/opendistro/asynchronous_search/submit
|
||||||
- cluster:admin/opensearch/reports/definition/list
|
- cluster:admin/opendistro/ism/managedindex/add
|
||||||
- cluster:admin/opensearch/reports/definition/on_demand
|
- cluster:admin/opendistro/ism/managedindex/change
|
||||||
- cluster:admin/opensearch/reports/definition/update
|
- cluster:admin/opendistro/ism/managedindex/remove
|
||||||
- cluster:admin/opensearch/reports/instance/get
|
- cluster:admin/opendistro/ism/managedindex/explain
|
||||||
- cluster:admin/opensearch/reports/instance/list
|
- cluster:admin/opendistro/ism/managedindex/retry
|
||||||
- cluster:admin/opensearch/reports/menu/download
|
- cluster:admin/opendistro/ism/policy/write
|
||||||
|
- cluster:admin/opendistro/ism/policy/get
|
||||||
|
- cluster:admin/opendistro/ism/policy/search
|
||||||
|
- cluster:admin/opendistro/ism/policy/delete
|
||||||
|
- cluster:admin/opendistro/rollup/index
|
||||||
|
- cluster:admin/opendistro/rollup/get
|
||||||
|
- cluster:admin/opendistro/rollup/search
|
||||||
|
- cluster:admin/opendistro/rollup/delete
|
||||||
|
- cluster:admin/opendistro/rollup/start
|
||||||
|
- cluster:admin/opendistro/rollup/stop
|
||||||
|
- cluster:admin/opendistro/rollup/explain
|
||||||
|
- cluster:admin/opendistro/reports/definition/create
|
||||||
|
- cluster:admin/opendistro/reports/definition/update
|
||||||
|
- cluster:admin/opendistro/reports/definition/on_demand
|
||||||
|
- cluster:admin/opendistro/reports/definition/delete
|
||||||
|
- cluster:admin/opendistro/reports/definition/get
|
||||||
|
- cluster:admin/opendistro/reports/definition/list
|
||||||
|
- cluster:admin/opendistro/reports/instance/list
|
||||||
|
- cluster:admin/opendistro/reports/instance/get
|
||||||
|
- cluster:admin/opendistro/reports/menu/download
|
||||||
- cluster:admin/reindex/rethrottle
|
- cluster:admin/reindex/rethrottle
|
||||||
- cluster:admin/repository/delete
|
- cluster:admin/repository/delete
|
||||||
- cluster:admin/repository/get
|
- cluster:admin/repository/get
|
||||||
@@ -94,7 +165,9 @@ Rather than creating new action groups from individual permissions, you can ofte
|
|||||||
- cluster:monitor/tasks/list
|
- cluster:monitor/tasks/list
|
||||||
|
|
||||||
|
|
||||||
## Indices
|
## Index permissions
|
||||||
|
|
||||||
|
These permissions apply to an index or index pattern. You might want a user to have read access to all indices (i.e. `*`), but write access to only a few (e.g. `web-logs` and `product-catalog`).
|
||||||
|
|
||||||
- indices:admin/aliases
|
- indices:admin/aliases
|
||||||
- indices:admin/aliases/exists
|
- indices:admin/aliases/exists
|
||||||
@@ -102,13 +175,22 @@ Rather than creating new action groups from individual permissions, you can ofte
|
|||||||
- indices:admin/analyze
|
- indices:admin/analyze
|
||||||
- indices:admin/cache/clear
|
- indices:admin/cache/clear
|
||||||
- indices:admin/close
|
- indices:admin/close
|
||||||
- indices:admin/create
|
- indices:admin/close*
|
||||||
- indices:admin/delete
|
- indices:admin/create (create indices)
|
||||||
|
- indices:admin/data_stream/create
|
||||||
|
- indices:admin/data_stream/delete
|
||||||
|
- indices:admin/data_stream/get
|
||||||
|
- indices:admin/delete (delete indices)
|
||||||
- indices:admin/exists
|
- indices:admin/exists
|
||||||
- indices:admin/flush
|
- indices:admin/flush
|
||||||
- indices:admin/flush*
|
- indices:admin/flush*
|
||||||
- indices:admin/forcemerge
|
- indices:admin/forcemerge
|
||||||
- indices:admin/get
|
- indices:admin/get (retrieve index and mapping)
|
||||||
|
- indices:admin/index_template/delete
|
||||||
|
- indices:admin/index_template/get
|
||||||
|
- indices:admin/index_template/put
|
||||||
|
- indices:admin/index_template/simulate
|
||||||
|
- indices:admin/index_template/simulate_index
|
||||||
- indices:admin/mapping/put
|
- indices:admin/mapping/put
|
||||||
- indices:admin/mappings/fields/get
|
- indices:admin/mappings/fields/get
|
||||||
- indices:admin/mappings/fields/get*
|
- indices:admin/mappings/fields/get*
|
||||||
@@ -137,22 +219,23 @@ Rather than creating new action groups from individual permissions, you can ofte
|
|||||||
- indices:data/read/mget*
|
- indices:data/read/mget*
|
||||||
- indices:data/read/msearch
|
- indices:data/read/msearch
|
||||||
- indices:data/read/msearch/template
|
- indices:data/read/msearch/template
|
||||||
- indices:data/read/mtv
|
- indices:data/read/mtv (multi-term vectors)
|
||||||
- indices:data/read/mtv*
|
- indices:data/read/mtv*
|
||||||
- indices:data/read/scroll
|
- indices:data/read/scroll
|
||||||
- indices:data/read/scroll/clear
|
- indices:data/read/scroll/clear
|
||||||
- indices:data/read/search
|
- indices:data/read/search
|
||||||
- indices:data/read/search*
|
- indices:data/read/search*
|
||||||
- indices:data/read/search/template
|
- indices:data/read/search/template
|
||||||
- indices:data/read/tv
|
- indices:data/read/tv (term vectors)
|
||||||
- indices:data/write/bulk
|
- indices:data/write/bulk
|
||||||
- indices:data/write/bulk*
|
- indices:data/write/bulk*
|
||||||
- indices:data/write/delete
|
- indices:data/write/delete (delete documents)
|
||||||
- indices:data/write/delete/byquery
|
- indices:data/write/delete/byquery
|
||||||
- indices:data/write/index
|
- indices:data/write/index (add documents to existing indices)
|
||||||
- indices:data/write/reindex
|
- indices:data/write/reindex
|
||||||
- indices:data/write/update
|
- indices:data/write/update
|
||||||
- indices:data/write/update/byquery
|
- indices:data/write/update/byquery
|
||||||
|
- indices:monitor/data_stream/stats
|
||||||
- indices:monitor/recovery
|
- indices:monitor/recovery
|
||||||
- indices:monitor/segments
|
- indices:monitor/segments
|
||||||
- indices:monitor/settings/get
|
- indices:monitor/settings/get
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ Active Directory and LDAP can be used for both authentication and authorization
|
|||||||
|
|
||||||
In most cases, you want to configure both authentication and authorization. You can also use authentication only and map the users retrieved from LDAP directly to security plugin roles.
|
In most cases, you want to configure both authentication and authorization. You can also use authentication only and map the users retrieved from LDAP directly to security plugin roles.
|
||||||
|
|
||||||
{% comment %}
|
|
||||||
|
|
||||||
## Docker example
|
## Docker example
|
||||||
|
|
||||||
@@ -38,7 +37,7 @@ We provide a fully functional example that can help you understand how to use an
|
|||||||
1. Index a document as `psantos`:
|
1. Index a document as `psantos`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -XPUT https://localhost:9200/new-index/_doc/1 -H 'Content-Type: application/json' -d '{"title": "Spirited Away"}' -u psantos:password -k
|
curl -XPUT 'https://localhost:9200/new-index/_doc/1' -H 'Content-Type: application/json' -d '{"title": "Spirited Away"}' -u 'psantos:password' -k
|
||||||
```
|
```
|
||||||
|
|
||||||
If you try the same request as `jroe`, it fails. The `Developers` group is mapped to the `readall`, `manage_snapshots`, and `kibana_user` roles and has no write permissions.
|
If you try the same request as `jroe`, it fails. The `Developers` group is mapped to the `readall`, `manage_snapshots`, and `kibana_user` roles and has no write permissions.
|
||||||
@@ -46,14 +45,13 @@ We provide a fully functional example that can help you understand how to use an
|
|||||||
1. Search for the document as `jroe`:
|
1. Search for the document as `jroe`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -XGET https://localhost:9200/new-index/_search?pretty -u jroe:password -k
|
curl -XGET 'https://localhost:9200/new-index/_search?pretty' -u 'jroe:password' -k
|
||||||
```
|
```
|
||||||
|
|
||||||
This request succeeds, because the `Developers` group is mapped to the `readall` role.
|
This request succeeds, because the `Developers` group is mapped to the `readall` role.
|
||||||
|
|
||||||
1. If you want to examine the contents of the various containers, run `docker ps` to find the container ID and then `docker exec -it <container-id> /bin/bash`.
|
1. If you want to examine the contents of the various containers, run `docker ps` to find the container ID and then `docker exec -it <container-id> /bin/bash`.
|
||||||
|
|
||||||
{% endcomment %}
|
|
||||||
|
|
||||||
## Connection settings
|
## Connection settings
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ The security plugin supports user authentication through SAML single sign-on. Th
|
|||||||
|
|
||||||
This profile is meant for use with web browsers. It is not a general-purpose way of authenticating users against the security plugin, so its primary use case is to support OpenSearch Dashboards single sign-on.
|
This profile is meant for use with web browsers. It is not a general-purpose way of authenticating users against the security plugin, so its primary use case is to support OpenSearch Dashboards single sign-on.
|
||||||
|
|
||||||
{% comment %}
|
|
||||||
|
|
||||||
## Docker example
|
## Docker example
|
||||||
|
|
||||||
@@ -35,7 +34,6 @@ We provide a fully functional example that can help you understand how to use SA
|
|||||||
|
|
||||||
In particular, you might find it helpful to review the contents of the `/var/www/simplesamlphp/config/` and `/var/www/simplesamlphp/metadata/` directories.
|
In particular, you might find it helpful to review the contents of the `/var/www/simplesamlphp/config/` and `/var/www/simplesamlphp/metadata/` directories.
|
||||||
|
|
||||||
{% endcomment %}
|
|
||||||
|
|
||||||
## Activating SAML
|
## Activating SAML
|
||||||
|
|
||||||
@@ -300,13 +298,13 @@ authc:
|
|||||||
|
|
||||||
Because most of the SAML-specific configuration is done in the security plugin, just activate SAML in your `opensearch_dashboards.yml` by adding the following:
|
Because most of the SAML-specific configuration is done in the security plugin, just activate SAML in your `opensearch_dashboards.yml` by adding the following:
|
||||||
|
|
||||||
```
|
```yml
|
||||||
plugins.security.auth.type: "saml"
|
opensearch_security.auth.type: "saml"
|
||||||
```
|
```
|
||||||
|
|
||||||
In addition, the OpenSearch Dashboards endpoint for validating the SAML assertions must be whitelisted:
|
In addition, the OpenSearch Dashboards endpoint for validating the SAML assertions must be whitelisted:
|
||||||
|
|
||||||
```
|
```yml
|
||||||
server.xsrf.whitelist: ["/_plugins/_security/saml/acs"]
|
server.xsrf.whitelist: ["/_plugins/_security/saml/acs"]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ plugins.security.restapi.password_validation_error_message: "Password must be mi
|
|||||||
|
|
||||||
## whitelist.yml
|
## whitelist.yml
|
||||||
|
|
||||||
You can use `whitelist.yml` to allow list any endpoints and HTTP requests. If enabled, all users except the SuperAdmin are allowed access to only the specified endpoints and HTTP requests, and all other HTTP requests associated with the endpoint are denied. For example, if GET `_cluster/settings` is allow listed, users cannot submit PUT requests to `_cluster/settings` to update cluster settings.
|
You can use `whitelist.yml` to add any endpoints and HTTP requests to a list of allowed endpoints and requests. If enabled, all users except the super admin are allowed access to only the specified endpoints and HTTP requests, and all other HTTP requests associated with the endpoint are denied. For example, if GET `_cluster/settings` is added to the allow list, users cannot submit PUT requests to `_cluster/settings` to update cluster settings.
|
||||||
|
|
||||||
Note that while you can configure access to endpoints this way, for most cases, it is still best to configure permissions using the security plugin's users and roles, which have more granular settings.
|
Note that while you can configure access to endpoints this way, for most cases, it is still best to configure permissions using the security plugin's users and roles, which have more granular settings.
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ requests:
|
|||||||
- PUT
|
- PUT
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also allow list custom indices. `whitelist.yml` doesn't support wildcards, so you must manually specify all of the indices you want to allow list.
|
You can also add custom indices to the allow list. `whitelist.yml` doesn't support wildcards, so you must manually specify all of the indices you want to add.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
requests: # Only allow GET requests to /sample-index1/_doc/1 and /sample-index2/_doc/1
|
requests: # Only allow GET requests to /sample-index1/_doc/1 and /sample-index2/_doc/1
|
||||||
@@ -315,6 +315,10 @@ _meta:
|
|||||||
|
|
||||||
## tenants.yml
|
## tenants.yml
|
||||||
|
|
||||||
|
You can use this file to specify and add any number of OpenSearch Dashboards tenants to your OpenSearch cluster. For more information about tenants, see [OpenSearch Dashboards multi-tenancy]({{site.url}}{{site.baseurl}}/security-plugin/access-control/multi-tenancy).
|
||||||
|
|
||||||
|
Like all of the other YAML files, we recommend you use `tenants.yml` to add any tenants you must have in your cluster, and then use OpenSearch Dashboards or the [REST API]({{site.url}}{{site.baseurl}}/security-plugin/access-control/api/#tenants) if you need to further configure or create any other tenants.
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
---
|
---
|
||||||
_meta:
|
_meta:
|
||||||
@@ -325,9 +329,12 @@ admin_tenant:
|
|||||||
description: "Demo tenant for admin user"
|
description: "Demo tenant for admin user"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## nodes_dn.yml
|
## nodes_dn.yml
|
||||||
|
|
||||||
|
`nodes_dn.yml` lets you add certificates' [distinguished names (DNs)]({{site.url}}{{site.baseurl}}/security-plugin/configuration/generate-certificates/#add-distinguished-names-to-opensearchyml) an allow list to enable communication between any number of nodes and/or clusters. For example, a node that has the DN `CN=node1.example.com` in its allow list accepts communication from any other node or certificate that uses that DN.
|
||||||
|
|
||||||
|
The DNs get indexed into a [system index]({{site.url}}{{site.baseurl}}/security-plugin/configuration/system-indices) that only a super admin or an admin with a Transport Layer Security (TLS) certificate can access. If you want to programmatically add DNs to your allow lists, use the [REST API]({{site.url}}{{site.baseurl}}/security-plugin/access-control/api/#distinguished-names).
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
---
|
---
|
||||||
_meta:
|
_meta:
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,176 @@
|
|||||||
|
const PREFIX = "OpenSearch ";
|
||||||
|
const tpl = `
|
||||||
|
<style>
|
||||||
|
:host {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 1em;
|
||||||
|
user-select: none;
|
||||||
|
margin: 3px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #FFFFFF;
|
||||||
|
background-color: #00509c;
|
||||||
|
background-image: var(--normal-bg);
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12);
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 0.3em 3em 0.3em 1em;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
z-index: 2;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root:hover {
|
||||||
|
background-image: var(--hover-bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#root:focus:hover {
|
||||||
|
box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
#root:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
bottom: 5px;
|
||||||
|
width: 0;
|
||||||
|
border-width: 0 1px;
|
||||||
|
border-color: #000 rgba(0, 0, 0, .2) #000 rgba(255, 255, 255, .6);
|
||||||
|
right: 2em;
|
||||||
|
border-style: solid;
|
||||||
|
background-blend-mode: multiply;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root > svg {
|
||||||
|
position: absolute;
|
||||||
|
right: .5em;
|
||||||
|
top: .6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dropdown {
|
||||||
|
position: absolute;
|
||||||
|
min-width: calc(100% - 2px);
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), 0 4px 10px rgba(0, 0, 0, 0.12);
|
||||||
|
|
||||||
|
margin: -5px 1px 0 1px;
|
||||||
|
padding-top: 5px;
|
||||||
|
white-space: nowrap;
|
||||||
|
border-radius: 0 0 4px 4px;
|
||||||
|
|
||||||
|
background: #fff;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
:host(:not([aria-expanded="true"])) #dropdown {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#spacer {
|
||||||
|
appearance: none;
|
||||||
|
visibility: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
height: 0;
|
||||||
|
margin: 0 1px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#spacer > a,
|
||||||
|
#dropdown > a {
|
||||||
|
display: block;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding: 0.3em calc(3em - 1px) 0.3em calc(1em - 1px);
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--link-color);
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dropdown > a:last-child {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dropdown > a:hover {
|
||||||
|
background: #efefef;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.latest:after {
|
||||||
|
content: "LATEST";
|
||||||
|
position: absolute;
|
||||||
|
right: .4rem;
|
||||||
|
font-size: 0.6em;
|
||||||
|
font-weight: 700;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<a id="root" role="button" aria-labelledby="selected" aria-controls="dropdown" tabindex="0">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9l6 6l6-6"/></g></svg>
|
||||||
|
<span id="selected"></span>
|
||||||
|
</a>
|
||||||
|
<div id="dropdown" role="navigation"></div>
|
||||||
|
<div id="spacer" aria-hidden="true"></div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
class VersionSelector extends HTMLElement {
|
||||||
|
static get observedAttributes() {
|
||||||
|
return ['selected'];
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.attachShadow({mode: 'open'});
|
||||||
|
this._onBlur = (e => {
|
||||||
|
this._expand(false);
|
||||||
|
this.removeEventListener('blur', this._onBlur);
|
||||||
|
}).bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
async connectedCallback() {
|
||||||
|
const {shadowRoot} = this;
|
||||||
|
const frag = this._makeFragment(tpl);
|
||||||
|
|
||||||
|
frag.querySelector('#selected').textContent = `${PREFIX}${this.getAttribute('selected')}`;
|
||||||
|
|
||||||
|
const pathName = location.pathname.replace(/\/docs(\/((latest|\d+\.\d+)\/?)?)?/, '');
|
||||||
|
const versionsDOMText = DOC_VERSIONS.map((v, idx) => `<a href="/docs/${v}/${pathName}"${idx === 0 ? ' class="latest"' : ''}>${PREFIX}${v}</a>`)
|
||||||
|
.join('');
|
||||||
|
|
||||||
|
frag.querySelector('#dropdown').appendChild(this._makeFragment(versionsDOMText));
|
||||||
|
frag.querySelector('#spacer').appendChild(this._makeFragment(versionsDOMText));
|
||||||
|
|
||||||
|
shadowRoot.appendChild(frag);
|
||||||
|
|
||||||
|
this._instrument(shadowRoot);
|
||||||
|
}
|
||||||
|
|
||||||
|
_instrument(shadowRoot) {
|
||||||
|
shadowRoot.querySelector('#root').addEventListener('click', e => {
|
||||||
|
this._expand(this.getAttribute('aria-expanded') !== 'true');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_expand(flag) {
|
||||||
|
this.setAttribute('aria-expanded', flag);
|
||||||
|
if (flag) this.addEventListener('blur', this._onBlur);
|
||||||
|
}
|
||||||
|
|
||||||
|
_makeFragment(html) {
|
||||||
|
return document.createRange().createContextualFragment(html);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
customElements.define('version-selector', VersionSelector);
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
permalink: /assets/js/version-selector.js
|
||||||
|
---
|
||||||
|
(() => {
|
||||||
|
{% assign current_array = site.data.versions.current | split: '!' %}
|
||||||
|
{% assign all_versions = current_array | concat: site.data.versions.past %}
|
||||||
|
const DOC_VERSIONS = {{ all_versions | jsonify }};
|
||||||
|
{% include_relative _version-selector.js %}
|
||||||
|
})();
|
||||||
@@ -37,7 +37,7 @@ Component | Purpose
|
|||||||
[Anomaly Detection]({{site.url}}{{site.baseurl}}/monitoring-plugins/ad/) | Identify atypical data and receive automatic notifications
|
[Anomaly Detection]({{site.url}}{{site.baseurl}}/monitoring-plugins/ad/) | Identify atypical data and receive automatic notifications
|
||||||
[Asynchronous Search]({{site.url}}{{site.baseurl}}/search-plugins/async/) | Run search requests in the background
|
[Asynchronous Search]({{site.url}}{{site.baseurl}}/search-plugins/async/) | Run search requests in the background
|
||||||
|
|
||||||
Most of OpenSearch plugins have a corresponding OpenSearch Dashboards plugin that provide a convenient, unified user interface.
|
Most OpenSearch plugins have corresponding OpenSearch Dashboards plugins that provide a convenient, unified user interface.
|
||||||
|
|
||||||
For specifics around the project, see the [FAQ](https://opensearch.org/faq/).
|
For specifics around the project, see the [FAQ](https://opensearch.org/faq/).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user