diff --git a/docs/api/saved-objects/create.asciidoc b/docs/api/saved-objects/create.asciidoc
index 571b57a5ef9c2..11e0617761224 100644
--- a/docs/api/saved-objects/create.asciidoc
+++ b/docs/api/saved-objects/create.asciidoc
@@ -13,7 +13,7 @@ experimental[] Create {kib} saved objects.
`POST :/api/saved_objects//`
-`POST :/s//saved_objects/`
+`POST :/s//api/saved_objects/`
[[saved-objects-api-create-path-params]]
==== Path parameters
diff --git a/docs/apm/images/apm-alert.png b/docs/apm/images/apm-alert.png
index 43c6faa41c75e..350704d8969ae 100644
Binary files a/docs/apm/images/apm-alert.png and b/docs/apm/images/apm-alert.png differ
diff --git a/docs/apm/images/apm-geo-ui.jpg b/docs/apm/images/apm-geo-ui.jpg
deleted file mode 100644
index 5b80e1e7a8f0c..0000000000000
Binary files a/docs/apm/images/apm-geo-ui.jpg and /dev/null differ
diff --git a/docs/apm/images/apm-geo-ui.png b/docs/apm/images/apm-geo-ui.png
new file mode 100644
index 0000000000000..a767ed7e08e0c
Binary files /dev/null and b/docs/apm/images/apm-geo-ui.png differ
diff --git a/docs/apm/images/service-maps.png b/docs/apm/images/service-maps.png
index d4272e8999991..078fabcfa2879 100644
Binary files a/docs/apm/images/service-maps.png and b/docs/apm/images/service-maps.png differ
diff --git a/docs/apm/machine-learning.asciidoc b/docs/apm/machine-learning.asciidoc
index 03f7e13c98579..b203b8668072f 100644
--- a/docs/apm/machine-learning.asciidoc
+++ b/docs/apm/machine-learning.asciidoc
@@ -1,6 +1,6 @@
[role="xpack"]
[[machine-learning-integration]]
-=== Machine Learning integration
+=== integration
++++
Integrate with machine learning
diff --git a/docs/apm/transactions.asciidoc b/docs/apm/transactions.asciidoc
index 8012c9108ca5e..84ab6b2a58579 100644
--- a/docs/apm/transactions.asciidoc
+++ b/docs/apm/transactions.asciidoc
@@ -64,7 +64,7 @@ The transaction overview page is customized for the JavaScript RUM Agent.
This page highlights things like *page load times*, *transactions per minute*, and even the *average page load duration distribution by country*.
[role="screenshot"]
-image::apm/images/apm-geo-ui.jpg[average page load duration distribution]
+image::apm/images/apm-geo-ui.png[average page load duration distribution]
This data is available due to the geo-ip and user agent pipelines being enabled by default,
which allows for the capture of geo-location and user agent data.
diff --git a/docs/canvas/canvas-tutorial.asciidoc b/docs/canvas/canvas-tutorial.asciidoc
index 9b23817de2767..7a376564e9620 100644
--- a/docs/canvas/canvas-tutorial.asciidoc
+++ b/docs/canvas/canvas-tutorial.asciidoc
@@ -14,7 +14,7 @@ For this tutorial, you'll need to add the < Canvas*.
+. Open the menu, then go to *Canvas*.
. On the *Canvas workpads* page, click *Create workpad*.
diff --git a/docs/canvas/canvas-workpad.asciidoc b/docs/canvas/canvas-workpad.asciidoc
index ac2d348920114..9d49c5f492bbb 100644
--- a/docs/canvas/canvas-workpad.asciidoc
+++ b/docs/canvas/canvas-workpad.asciidoc
@@ -20,7 +20,9 @@ To create a workpad, choose one of the following options:
To use the background colors, images, and data of your choice, start with a blank workpad.
-. On the *Canvas workpads* page, click *Create workpad*.
+. Open the menu, then go to *Canvas*.
+
+. On the *Canvas workpads* view, click *Create workpad*.
. Add a *Name* to your workpad.
@@ -41,7 +43,9 @@ image::images/canvas-background-color-picker.png[Canvas color picker]
If you're unsure about where to start, you can use one of the preconfigured templates that come with Canvas.
-. On the *Canvas workpads* page, select *Templates*.
+. Open the menu, then go to *Canvas*.
+
+. On the *Canvas workpads* view, select *Templates*.
. Click the preconfigured template that you want to use.
@@ -53,7 +57,9 @@ If you're unsure about where to start, you can use one of the preconfigured temp
When you want to use a workpad that someone else has already started, import the JSON file into Canvas.
-To import a workpad, go to the *Canvas workpads* page, then click and drag the file to the *Import workpad JSON file* field.
+. Open the menu, then go to *Canvas*.
+
+. On the *Canvas workpads* view, click and drag the file to the *Import workpad JSON file* field.
[float]
[[sample-data-workpad]]
diff --git a/docs/dev-tools/console/console.asciidoc b/docs/dev-tools/console/console.asciidoc
index 9f225986d5df0..fdb235d528e89 100644
--- a/docs/dev-tools/console/console.asciidoc
+++ b/docs/dev-tools/console/console.asciidoc
@@ -7,7 +7,7 @@ Console enables you to interact with the REST API of {es}. You can:
* View API documentation
* Get your request history
-To get started, go to *Dev Tools > Console*.
+To get started, open the menu, go to *Dev Tools*, then click *Console*.
[role="screenshot"]
image::dev-tools/console/images/console.png["Console"]
diff --git a/docs/dev-tools/console/images/console-settings.png b/docs/dev-tools/console/images/console-settings.png
index 1edd249cc7ee1..6a1fdd978e492 100644
Binary files a/docs/dev-tools/console/images/console-settings.png and b/docs/dev-tools/console/images/console-settings.png differ
diff --git a/docs/dev-tools/console/images/console.png b/docs/dev-tools/console/images/console.png
index 090668afc29d1..0511ed858d1c3 100644
Binary files a/docs/dev-tools/console/images/console.png and b/docs/dev-tools/console/images/console.png differ
diff --git a/docs/dev-tools/grokdebugger/images/grok-debugger-custom-pattern.png b/docs/dev-tools/grokdebugger/images/grok-debugger-custom-pattern.png
index 68b3669e4916a..2cb6f1dbf7226 100644
Binary files a/docs/dev-tools/grokdebugger/images/grok-debugger-custom-pattern.png and b/docs/dev-tools/grokdebugger/images/grok-debugger-custom-pattern.png differ
diff --git a/docs/dev-tools/grokdebugger/images/grok-debugger-overview.png b/docs/dev-tools/grokdebugger/images/grok-debugger-overview.png
index 3c5ce010129d5..b6e9b734b307e 100644
Binary files a/docs/dev-tools/grokdebugger/images/grok-debugger-overview.png and b/docs/dev-tools/grokdebugger/images/grok-debugger-overview.png differ
diff --git a/docs/dev-tools/grokdebugger/index.asciidoc b/docs/dev-tools/grokdebugger/index.asciidoc
index 1fb9f945d8636..5162e806edd07 100644
--- a/docs/dev-tools/grokdebugger/index.asciidoc
+++ b/docs/dev-tools/grokdebugger/index.asciidoc
@@ -35,7 +35,7 @@ is automatically enabled in {kib}.
NOTE: If you're using {security}, you must have the `manage_pipeline`
permission to use the Grok Debugger.
-. In the side navigation, click *DevTools*, then open the *Grok Debugger*.
+. Open the menu, go to *Dev Tools*, then click *Grok Debugger*.
. In *Sample Data*, enter a message that is representative of the data that you
want to parse. For example:
+
diff --git a/docs/dev-tools/painlesslab/images/painless-lab.png b/docs/dev-tools/painlesslab/images/painless-lab.png
index f65257852792e..fbfd54f69954d 100644
Binary files a/docs/dev-tools/painlesslab/images/painless-lab.png and b/docs/dev-tools/painlesslab/images/painless-lab.png differ
diff --git a/docs/dev-tools/painlesslab/index.asciidoc b/docs/dev-tools/painlesslab/index.asciidoc
index e55424baf3142..09545548c82b6 100644
--- a/docs/dev-tools/painlesslab/index.asciidoc
+++ b/docs/dev-tools/painlesslab/index.asciidoc
@@ -12,6 +12,6 @@ process {ref}/docs-reindex.html[reindexed data], define complex
<>,
and work with data in other contexts.
-To get started, go to *Dev Tools > Painless Lab*.
+To get started, open the menu, go to *Dev Tools*, then click *Painless Lab*.
image::dev-tools/painlesslab/images/painless-lab.png[Painless Lab]
diff --git a/docs/dev-tools/searchprofiler/getting-started.asciidoc b/docs/dev-tools/searchprofiler/getting-started.asciidoc
index 4a87d4b84b783..eaa7fea6c7f8d 100644
--- a/docs/dev-tools/searchprofiler/getting-started.asciidoc
+++ b/docs/dev-tools/searchprofiler/getting-started.asciidoc
@@ -2,7 +2,7 @@
[[profiler-getting-started]]
=== Getting Started
-The {searchprofiler} is automatically enabled in {kib}. Go to *Dev Tools > Search Profiler*
+The {searchprofiler} is automatically enabled in {kib}. From the menu, go to *Dev Tools*, then click *Search Profiler*
to get started.
{searchprofiler} displays the names of the indices searched, the shards in each index,
@@ -11,10 +11,10 @@ with the query you want to profile and click *Profile*.
The following example shows the results of profiling the `match_all` query.
If we take a closer look at the information for the `.kibana_1` sample index, the
-Cumulative Time field shows us that the query took 0.067ms to execute.
+Cumulative Time field shows us that the query took 1.279ms to execute.
[role="screenshot"]
-image::dev-tools/searchprofiler/images/query.png["{searchprofiler} example"]
+image::dev-tools/searchprofiler/images/overview.png["{searchprofiler} example"]
[NOTE]
diff --git a/docs/dev-tools/searchprofiler/images/filter.png b/docs/dev-tools/searchprofiler/images/filter.png
index 1b36d5ebe1d0d..a740ec44b9d80 100644
Binary files a/docs/dev-tools/searchprofiler/images/filter.png and b/docs/dev-tools/searchprofiler/images/filter.png differ
diff --git a/docs/dev-tools/searchprofiler/images/gs10.png b/docs/dev-tools/searchprofiler/images/gs10.png
index 7d8ae8402d6b9..6be78b2ce8eb3 100644
Binary files a/docs/dev-tools/searchprofiler/images/gs10.png and b/docs/dev-tools/searchprofiler/images/gs10.png differ
diff --git a/docs/dev-tools/searchprofiler/images/gs8.png b/docs/dev-tools/searchprofiler/images/gs8.png
index efe00fdcc6f09..7ab8389897e4e 100644
Binary files a/docs/dev-tools/searchprofiler/images/gs8.png and b/docs/dev-tools/searchprofiler/images/gs8.png differ
diff --git a/docs/dev-tools/searchprofiler/images/overview.png b/docs/dev-tools/searchprofiler/images/overview.png
index cce3ab43f5fa9..19df1700a5bae 100644
Binary files a/docs/dev-tools/searchprofiler/images/overview.png and b/docs/dev-tools/searchprofiler/images/overview.png differ
diff --git a/docs/dev-tools/searchprofiler/images/pasting.png b/docs/dev-tools/searchprofiler/images/pasting.png
index 298cef203a7de..466ab9159bfed 100644
Binary files a/docs/dev-tools/searchprofiler/images/pasting.png and b/docs/dev-tools/searchprofiler/images/pasting.png differ
diff --git a/docs/dev-tools/searchprofiler/images/query.png b/docs/dev-tools/searchprofiler/images/query.png
deleted file mode 100644
index 31b0f54eebfa7..0000000000000
Binary files a/docs/dev-tools/searchprofiler/images/query.png and /dev/null differ
diff --git a/docs/discover/images/read-only-badge.png b/docs/discover/images/read-only-badge.png
index b46b9576fa3ff..f630bcb32c34f 100644
Binary files a/docs/discover/images/read-only-badge.png and b/docs/discover/images/read-only-badge.png differ
diff --git a/docs/discover/search.asciidoc b/docs/discover/search.asciidoc
index c6e1daee9b072..eef2a12a964b8 100644
--- a/docs/discover/search.asciidoc
+++ b/docs/discover/search.asciidoc
@@ -104,7 +104,9 @@ To save the current search:
. Click *Save* in the Kibana toolbar.
. Enter a name for the search and click *Save*.
-You can import, export and delete saved searches from *Management/Kibana/Saved Objects*.
+To import, export and delete saved searches:
+. Open the menu, then click *Stack Management.
+. From the {kib} menu, click *Saved Ojbects*.
==== Open a saved search
To load a saved search into Discover:
diff --git a/docs/getting-started/images/add-sample-data.png b/docs/getting-started/images/add-sample-data.png
new file mode 100644
index 0000000000000..1878550bc3169
Binary files /dev/null and b/docs/getting-started/images/add-sample-data.png differ
diff --git a/docs/getting-started/images/tutorial-sample-dashboard.png b/docs/getting-started/images/tutorial-sample-dashboard.png
new file mode 100644
index 0000000000000..ccce8c3bb3208
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-dashboard.png differ
diff --git a/docs/getting-started/images/tutorial-sample-discover1.png b/docs/getting-started/images/tutorial-sample-discover1.png
new file mode 100644
index 0000000000000..1bad8774ba584
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-discover1.png differ
diff --git a/docs/getting-started/images/tutorial-sample-discover2.png b/docs/getting-started/images/tutorial-sample-discover2.png
new file mode 100644
index 0000000000000..a439f1d76a991
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-discover2.png differ
diff --git a/docs/getting-started/images/tutorial-sample-edit1.png b/docs/getting-started/images/tutorial-sample-edit1.png
new file mode 100644
index 0000000000000..b5ae56b5c0d83
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-edit1.png differ
diff --git a/docs/getting-started/images/tutorial-sample-edit2.png b/docs/getting-started/images/tutorial-sample-edit2.png
new file mode 100644
index 0000000000000..17a029a17e1b4
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-edit2.png differ
diff --git a/docs/getting-started/images/tutorial-sample-filter.png b/docs/getting-started/images/tutorial-sample-filter.png
new file mode 100644
index 0000000000000..770e26e951b3a
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-filter.png differ
diff --git a/docs/getting-started/images/tutorial-sample-inspect1.png b/docs/getting-started/images/tutorial-sample-inspect1.png
new file mode 100644
index 0000000000000..6a3d41ae03584
Binary files /dev/null and b/docs/getting-started/images/tutorial-sample-inspect1.png differ
diff --git a/docs/images/tutorial-sample-query.png b/docs/getting-started/images/tutorial-sample-query.png
similarity index 100%
rename from docs/images/tutorial-sample-query.png
rename to docs/getting-started/images/tutorial-sample-query.png
diff --git a/docs/getting-started/tutorial-dashboard.asciidoc b/docs/getting-started/tutorial-dashboard.asciidoc
index 87a1e38efcfe0..2ee2d76024aed 100644
--- a/docs/getting-started/tutorial-dashboard.asciidoc
+++ b/docs/getting-started/tutorial-dashboard.asciidoc
@@ -1,17 +1,18 @@
[[tutorial-dashboard]]
-=== Add visualizations to a dashboard
+=== Add the visualizations to a dashboard
-A dashboard is a collection of visualizations that you can arrange and share.
-You'll build a dashboard that contains the visualizations and map that you saved during
+Build a dashboard that contains the visualizations and map that you saved during
this tutorial.
-. Open *Dashboard*.
-. On the Dashboard overview page, click *Create new dashboard*.
+. Open the menu, go to *Dashboard*, then click *Create dashboard*.
. Set the time filter to May 18, 2015 to May 20, 2015.
-. Click *Add* in the menu bar.
-. Add *Bar Example*, *Map Example*, *Markdown Example*, and *Pie Example*.
+. Click *Add*, then select the following:
+ * *Bar Example*
+ * *Map Example*
+ * *Markdown Example*
+ * *Pie Example*
+
-Your sample dashboard should look like this:
+Your sample dashboard looks like this:
+
[role="screenshot"]
image::images/tutorial-dashboard.png[]
@@ -32,27 +33,21 @@ but sometimes you need to look at the actual data to
understand what's really going on. You can inspect the data behind any visualization
and view the {es} query used to retrieve it.
-. In the dashboard, hover the pointer over the pie chart, and then click the icon in the upper right.
-. From the *Options* menu, select *Inspect*.
+. Click the pie chart *Options* menu, then select *Inspect*.
+
[role="screenshot"]
image::images/tutorial-full-inspect1.png[]
-. To look at the query used to fetch the data for the visualization, select *View > Requests*
-in the upper right of the Inspect pane.
+. To look at the query used to fetch the data for the visualization, select *View > Requests*.
[float]
=== Next steps
-Now that you have a handle on the basics, you're ready to start exploring
-your own data with Kibana.
-
-* See {kibana-ref}/discover.html[Discover] for information about searching and filtering
-your data.
-* See {kibana-ref}/visualize.html[Visualize] for information about the visualization
-types Kibana has to offer.
-* See {kibana-ref}/management.html[Management] for information about configuring Kibana
-and managing your saved objects.
-* See {kibana-ref}/console-kibana.html[Console] to learn about the interactive
-console you can use to submit REST requests to Elasticsearch.
+Now that you have the basics, you're ready to start exploring
+your own data with {kib}.
+
+* To learn about searching and filtering your data, refer to {kibana-ref}/discover.html[Discover].
+* To learn about the visualization types {kib} has to offer, refer to {kibana-ref}/visualize.html[Visualize].
+* To learn about configuring {kib} and managing your saved objects, refer to {kibana-ref}/management.html[Management].
+* To learn about the interactive console you can use to submit REST requests to {es}, refer to {kibana-ref}/console-kibana.html[Console].
diff --git a/docs/getting-started/tutorial-define-index.asciidoc b/docs/getting-started/tutorial-define-index.asciidoc
index f8ffb47ab8c00..254befa55faea 100644
--- a/docs/getting-started/tutorial-define-index.asciidoc
+++ b/docs/getting-started/tutorial-define-index.asciidoc
@@ -18,35 +18,35 @@ First you'll create index patterns for the Shakespeare data set, which has an
index named `shakespeare,` and the accounts data set, which has an index named
`bank`. These data sets don't contain time series data.
-. In Kibana, open *Management*, and then click *Index Patterns.*
-. If this is your first index pattern, the *Create index pattern* page opens automatically.
+. Open the menu, then go to *Stack Management > {kib} > Index Patterns*.
+. If this is your first index pattern, the *Create index pattern* page opens.
Otherwise, click *Create index pattern*.
-. Enter `shakes*` in the *Index pattern* field.
+. In the *Index pattern field*, enter `shakes*`.
+
[role="screenshot"]
image::images/tutorial-pattern-1.png[]
. Click *Next step*.
-. In *Configure settings*, click *Create index pattern*.
+. Select the *Time Filter field name*, then click *Create index pattern*.
+
You’re presented a table of all fields and associated data types in the index.
-. Return to the *Index patterns* overview page and define a second index pattern named `ba*`.
+. Return to the *Index patterns* page and create a second index pattern named `ba*`.
[float]
-==== Create an index pattern for time series data
+==== Create an index pattern for the time series data
-Now create an index pattern for the Logstash index, which
-contains time series data.
+Create an index pattern for the Logstash index, which
+contains the time series data.
. Define an index pattern named `logstash*`.
. Click *Next step*.
-. Open the *Time Filter field name* dropdown and select *@timestamp*.
+. From the *Time Filter field name* dropdown, select *@timestamp*.
. Click *Create index pattern*.
NOTE: When you define an index pattern, the indices that match that pattern must
exist in Elasticsearch and they must contain data. To check which indices are
-available, go to *Dev Tools > Console* and enter `GET _cat/indices`. Alternately, use
+available, open the menu, then go to *Dev Tools > Console* and enter `GET _cat/indices`. Alternately, use
`curl -XGET "http://localhost:9200/_cat/indices"`.
diff --git a/docs/getting-started/tutorial-discovering.asciidoc b/docs/getting-started/tutorial-discovering.asciidoc
index 355477286d445..31d77be1275ee 100644
--- a/docs/getting-started/tutorial-discovering.asciidoc
+++ b/docs/getting-started/tutorial-discovering.asciidoc
@@ -5,15 +5,15 @@ Using *Discover*, enter
an {ref}/query-dsl-query-string-query.html#query-string-syntax[Elasticsearch
query] to search your data and filter the results.
-. Open *Discover*.
+. Open the menu, then go to *Discover*.
+
The `shakes*` index pattern appears.
-. To make `ba*` the current index, click the index pattern dropdown, then select `ba*`.
+. To make `ba*` the index, click the *Change Index Pattern* dropdown, then select `ba*`.
+
By default, all fields are shown for each matching document.
-. In the search field, enter:
+. In the *Search* field, enter the following:
+
[source,text]
account_number<100 AND balance>47500
@@ -25,7 +25,7 @@ excess of 47,500. Results appear for account numbers 8, 32, 78, 85, and 97.
image::images/tutorial-discover-2.png[]
+
. Hover over the list of *Available fields*, then
-click *add* next to each field you want include as a column in the table.
+click *Add* next to each field you want include in the table.
+
For example, when you add the `account_number` field, the display changes to a list of five
account numbers.
diff --git a/docs/getting-started/tutorial-full-experience.asciidoc b/docs/getting-started/tutorial-full-experience.asciidoc
index a05205fceab4a..e6f2de87905bf 100644
--- a/docs/getting-started/tutorial-full-experience.asciidoc
+++ b/docs/getting-started/tutorial-full-experience.asciidoc
@@ -94,7 +94,7 @@ You must also have the `create`, `manage` `read`, `write,` and `delete`
index privileges. See {ref}/security-privileges.html[Security privileges]
for more information.
-In Kibana *Dev Tools > Console*, set up a mapping for the Shakespeare data set:
+Open *Dev Tools*. On the *Console* page, set up a mapping for the Shakespeare data set:
[source,js]
PUT /shakespeare
diff --git a/docs/getting-started/tutorial-sample-data.asciidoc b/docs/getting-started/tutorial-sample-data.asciidoc
index f41c648a3d492..2460a55e13293 100644
--- a/docs/getting-started/tutorial-sample-data.asciidoc
+++ b/docs/getting-started/tutorial-sample-data.asciidoc
@@ -21,7 +21,7 @@ on the `kibana_sample_data_*` indices. See
Install the Flights sample data set, if you haven't already.
-. On the {kib} home page, click the link underneath *Add sample data*.
+. On the home page, click *Load a data set and a {kib} dashboard*.
. On the *Sample flight data* card, click *Add data*.
. Once the data is added, click *View data > Dashboard*.
+
@@ -29,7 +29,7 @@ You’re taken to the *Global Flight* dashboard, a collection of charts, graphs,
maps, and other visualizations of the the data in the `kibana_sample_data_flights` index.
+
[role="screenshot"]
-image::images/tutorial-sample-dashboard.png[]
+image::getting-started/images/tutorial-sample-dashboard.png[]
[float]
[[tutorial-sample-filter]]
@@ -43,19 +43,19 @@ For more detailed information on these actions, see
[float]
==== Filter the data
-. In the *Controls* visualization, set an *Origin City* and a *Destination City*.
+. In the *Controls* visualization, select an *Origin City* and a *Destination City*.
. Click *Apply changes*.
+
-The `OriginCityName` and the `DestCityName` fields are filtered to match
+The `OriginCityName` and the `DestCityName` fields filter the data on the dasbhoard to match
the data you specified.
+
-For example, this dashboard shows the data for flights from London to Oslo.
+For example, the following dashboard shows the data for flights from London to Milan.
+
[role="screenshot"]
-image::images/tutorial-sample-filter.png[]
+image::getting-started/images/tutorial-sample-filter.png[]
-. To add a filter manually, click *Add filter* in the filter bar,
-and specify the data you want to view.
+. To add a filter manually, click *Add filter*,
+then specify the data you want to view.
. When you are finished experimenting, remove all filters.
@@ -78,7 +78,7 @@ The dashboard updates to show data for the flights out of Rome on JetBeats and
{kib} Airlines.
+
[role="screenshot"]
-image::images/tutorial-sample-query.png[]
+image::getting-started/images/tutorial-sample-query.png[]
. When you are finished exploring the dashboard, remove the query by
clearing the contents in the query bar and clicking *Update*.
@@ -92,7 +92,7 @@ matches the selected index pattern. The index pattern tells {kib} which {es} ind
exploring. You can submit search queries, filter the
search results, and view document data.
-. In the side navigation, click *Discover*.
+. From the menu, click *Discover*.
. Ensure `kibana_sample_data_flights` is the current index pattern.
You might need to click *New* in the menu bar to refresh the data.
@@ -102,7 +102,7 @@ documents over time. A table lists the fields for
each matching document. By default, all fields are shown.
+
[role="screenshot"]
-image::images/tutorial-sample-discover1.png[]
+image::getting-started/images/tutorial-sample-discover1.png[]
. To choose which fields to display,
hover the pointer over the list of *Available fields*, and then click *add* next
@@ -112,7 +112,7 @@ For example, if you add the `DestAirportID` and `DestWeather` fields,
the display includes columns for those two fields.
+
[role="screenshot"]
-image::images/tutorial-sample-discover2.png[]
+image::getting-started/images/tutorial-sample-discover2.png[]
[float]
[[tutorial-sample-edit]]
@@ -146,7 +146,7 @@ categories, or buckets.
You now see the average ticket price for all four airlines.
+
[role="screenshot"]
-image::images/tutorial-sample-edit1.png[]
+image::getting-started/images/tutorial-sample-edit1.png[]
[float]
==== Save the visualization
@@ -160,7 +160,7 @@ handle in the lower right. You can also rearrange the visualizations by clicking
the header and dragging. Be sure to save the dashboard.
+
[role="screenshot"]
-image::images/tutorial-sample-edit2.png[]
+image::getting-started/images/tutorial-sample-edit2.png[]
[float]
[[tutorial-sample-inspect]]
@@ -177,7 +177,7 @@ and view the {es} query used to retrieve it.
The initial view shows the document count.
+
[role="screenshot"]
-image::images/tutorial-sample-inspect1.png[]
+image::getting-started/images/tutorial-sample-inspect1.png[]
. To look at the query used to fetch the data for the visualization, select *View > Requests*
in the upper right of the Inspect pane.
diff --git a/docs/getting-started/tutorial-visualizing.asciidoc b/docs/getting-started/tutorial-visualizing.asciidoc
index acd4d6d908fd4..20b4e33583072 100644
--- a/docs/getting-started/tutorial-visualizing.asciidoc
+++ b/docs/getting-started/tutorial-visualizing.asciidoc
@@ -1,7 +1,7 @@
[[tutorial-visualizing]]
=== Visualize your data
-In the Visualize application, you can shape your data using a variety
+In *Visualize*, you can shape your data using a variety
of charts, tables, and maps, and more. In this tutorial, you'll create four
visualizations:
@@ -14,21 +14,20 @@ visualizations:
[[tutorial-visualize-pie]]
=== Pie chart
-You'll use the pie chart to
+Use the pie chart to
gain insight into the account balances in the bank account data.
-. Open *Visualize* to show the overview page.
-. Click *Create new visualization*. You'll see all the visualization
-types in Kibana.
+. Open then menu, then go to *Visualize*.
+. Click *Create visualization*.
+
[role="screenshot"]
image::images/tutorial-visualize-wizard-step-1.png[]
. Click *Pie*.
-. In *Choose a source*, select the `ba*` index pattern.
+. On the *Choose a source* window, select `ba*`.
+
Initially, the pie contains a single "slice."
-That's because the default search matched all documents.
+That's because the default search matches all documents.
+
To specify which slices to display in the pie, you use an Elasticsearch
{ref}/search-aggregations.html[bucket aggregation]. This aggregation
@@ -39,8 +38,8 @@ each range.
. In the *Buckets* pane, click *Add > Split slices.*
+
-.. In the *Aggregation* dropdown, select *Range*.
-.. In the *Field* dropdown, select *balance*.
+.. From the *Aggregation* dropdown, select *Range*.
+.. From the *Field* dropdown, select *balance*.
.. Click *Add range* four times to bring the total number of ranges to six.
.. Define the following ranges:
+
@@ -52,7 +51,7 @@ each range.
15000 30999
31000 50000
-. Click *Apply changes* image:images/apply-changes-button.png[].
+. Click *Update*.
+
Now you can see what proportion of the 1000 accounts fall into each balance
range.
@@ -63,56 +62,54 @@ image::images/tutorial-visualize-pie-2.png[]
. Add another bucket aggregation that looks at the ages of the account
holders.
-.. At the bottom of the *Buckets* pane, click *Add*.
-.. For *sub-bucket type,* select *Split slices*.
-.. In the *Sub aggregation* dropdown, select *Terms*.
-.. In the *Field* dropdown, select *age*.
+.. In the *Buckets* pane, click *Add*, then click *Split slices*.
+.. From the *Sub aggregation* dropdown, select *Terms*.
+.. From the *Field* dropdown, select *age*.
-. Click *Apply changes* image:images/apply-changes-button.png[].
+. Click *Update*.
+
-Now you can see the break down of the ages of the account holders, displayed
+The break down of the ages of the account holders are displayed
in a ring around the balance ranges.
+
[role="screenshot"]
image::images/tutorial-visualize-pie-3.png[]
-. To save this chart so you can use it later, click *Save* in
-the top menu bar and enter `Pie Example`.
+. Click *Save*, then enter `Pie Example` in the *Title* field.
[float]
[[tutorial-visualize-bar]]
=== Bar chart
-You'll use a bar chart to look at the Shakespeare data set and compare
+Use a bar chart to look at the Shakespeare data set and compare
the number of speaking parts in the plays.
-. Create a *Vertical Bar* chart and set the search source to `shakes*`.
+. Click *Create visualization > Vertical Bar*, then set the source to `shakes*`.
+
Initially, the chart is a single bar that shows the total count
of documents that match the default wildcard query.
-. Show the number of speaking parts per play along the Y-axis.
+. Show the number of speaking parts per play along the y-axis.
.. In the *Metrics* pane, expand *Y-axis*.
-.. Set *Aggregation* to *Unique Count*.
-.. Set *Field* to *speaker*.
-.. In the *Custom label* box, enter `Speaking Parts`.
+.. From the *Aggregation* dropdown, select *Unique Count*.
+.. From the *Field* dropdown, select *speaker*.
+.. In the *Custom label* field, enter `Speaking Parts`.
-. Click *Apply changes* image:images/apply-changes-button.png[].
+. Click *Update*.
-. Show the plays along the X-axis.
+. Show the plays along the x-axis.
.. In the *Buckets* pane, click *Add > X-axis*.
-.. Set *Aggregation* to *Terms*.
-.. Set *Field* to *play_name*.
-.. To list plays alphabetically, in the *Order* dropdown, select *Ascending*.
-.. Give the axis a custom label, `Play Name`.
+.. From the *Aggregation* dropdown, select *Terms*.
+.. From the *Field* dropdown, select *play_name*.
+.. To list the plays alphabetically, select *Ascending* from the *Order* dropdown.
+.. In the *Custom label* field, enter `Play Name`.
-. Click *Apply changes* image:images/apply-changes-button.png[].
+. Click *Update*.
+
[role="screenshot"]
image::images/tutorial-visualize-bar-1.5.png[]
-. *Save* this chart with the name `Bar Example`.
+. *Save* the chart with the name `Bar Example`.
+
Hovering over a bar shows a tooltip with the number of speaking parts for
that play.
@@ -126,24 +123,24 @@ as `not analyzed`.
[[tutorial-visualize-markdown]]
=== Markdown
-Create a Markdown widget to add formatted text to your dashboard.
+Add formatted text to your dashboard with a markdown tool.
-. Create a *Markdown* visualization.
-. Copy the following text into the text box.
+. Click *Create visualization > Markdown*.
+. In the text field, enter the following:
+
[source,markdown]
# This is a tutorial dashboard!
The Markdown widget uses **markdown** syntax.
> Blockquotes in Markdown use the > character.
-. Click *Apply changes* image:images/apply-changes-button.png[].
+. Click *Update*.
+
The Markdown renders in the preview pane.
+
[role="screenshot"]
image::images/tutorial-visualize-md-2.png[]
-. *Save* this visualization with the name `Markdown Example`.
+. *Save* the tool with the name `Markdown Example`.
[float]
[[tutorial-visualize-map]]
@@ -151,34 +148,32 @@ image::images/tutorial-visualize-md-2.png[]
Using <>, you can visualize geographic information in the log file sample data.
-. Click *Maps* in the New Visualization
-menu to create a Map.
+. Click *Create visualization > Maps*.
. Set the time.
.. In the time filter, click *Show dates*.
.. Click the start date, then *Absolute*.
.. Set the *Start date* to May 18, 2015.
-.. In the time filter, click *now*, then *Absolute*.
+.. Click *now*, then *Absolute*.
.. Set the *End date* to May 20, 2015.
.. Click *Update*
. Map the geo coordinates from the log files.
+.. Click *Add layer > Clusters and Grids*.
+.. From the *Index pattern* dropdown, select *logstash*.
.. Click *Add layer*.
-.. Click the *Grid aggregation* data source.
-.. Set *Index pattern* to *logstash*.
-.. Click the *Add layer* button.
-. Set the layer style.
-.. For *Fill color*, select the yellow to red color ramp.
-.. For *Border color*, select white.
+. Set the *Layer Style*.
+.. From the *Fill color* dropdown, select the yellow to red color ramp.
+.. From the *Border color* dropdown, select white.
.. Click *Save & close*.
+
-The map now looks like this:
+The map looks like this:
+
[role="screenshot"]
image::images/tutorial-visualize-map-2.png[]
. Navigate the map by clicking and dragging. Use the controls
to zoom the map and set filters.
-. *Save* this map with the name `Map Example`.
+. *Save* the map with the name `Map Example`.
diff --git a/docs/images/Dashboard_add_new_visualization.png b/docs/images/Dashboard_add_new_visualization.png
index 445f1f5dd8df5..3685f9c5c9a74 100644
Binary files a/docs/images/Dashboard_add_new_visualization.png and b/docs/images/Dashboard_add_new_visualization.png differ
diff --git a/docs/images/Dashboard_add_visualization.png b/docs/images/Dashboard_add_visualization.png
index 179dbc66eb194..b1b86d47e5982 100644
Binary files a/docs/images/Dashboard_add_visualization.png and b/docs/images/Dashboard_add_visualization.png differ
diff --git a/docs/images/Dashboard_example.png b/docs/images/Dashboard_example.png
index 5d18acb67bef5..1a80f4b3bdf07 100644
Binary files a/docs/images/Dashboard_example.png and b/docs/images/Dashboard_example.png differ
diff --git a/docs/images/Dashboard_inspect.png b/docs/images/Dashboard_inspect.png
index 80edcf3a49ca0..d65b968e043a6 100644
Binary files a/docs/images/Dashboard_inspect.png and b/docs/images/Dashboard_inspect.png differ
diff --git a/docs/images/Discover-ContextView.png b/docs/images/Discover-ContextView.png
index 5c2de602f6b41..b9682764f4575 100644
Binary files a/docs/images/Discover-ContextView.png and b/docs/images/Discover-ContextView.png differ
diff --git a/docs/images/Discover-Start.png b/docs/images/Discover-Start.png
index 27e7a2c728597..fb885c20c1cf7 100644
Binary files a/docs/images/Discover-Start.png and b/docs/images/Discover-Start.png differ
diff --git a/docs/images/Histogram-Time.png b/docs/images/Histogram-Time.png
index a716b50ea74d1..0bba4e584357d 100644
Binary files a/docs/images/Histogram-Time.png and b/docs/images/Histogram-Time.png differ
diff --git a/docs/images/Timepicker-View.png b/docs/images/Timepicker-View.png
index d4db77ec0c624..2c9cc1628c235 100644
Binary files a/docs/images/Timepicker-View.png and b/docs/images/Timepicker-View.png differ
diff --git a/docs/images/add-sample-data.png b/docs/images/add-sample-data.png
deleted file mode 100644
index 6e771580b1e2f..0000000000000
Binary files a/docs/images/add-sample-data.png and /dev/null differ
diff --git a/docs/images/dashboard-read-only-badge.png b/docs/images/dashboard-read-only-badge.png
index b61d587f7ef1d..232bb92dee99e 100644
Binary files a/docs/images/dashboard-read-only-badge.png and b/docs/images/dashboard-read-only-badge.png differ
diff --git a/docs/images/intro-dashboard.png b/docs/images/intro-dashboard.png
old mode 100755
new mode 100644
index 5d18acb67bef5..fe4e6f620d19c
Binary files a/docs/images/intro-dashboard.png and b/docs/images/intro-dashboard.png differ
diff --git a/docs/images/intro-data-tutorial.png b/docs/images/intro-data-tutorial.png
index a00e41c8b2a4c..fd469919593af 100644
Binary files a/docs/images/intro-data-tutorial.png and b/docs/images/intro-data-tutorial.png differ
diff --git a/docs/images/intro-discover.png b/docs/images/intro-discover.png
old mode 100755
new mode 100644
index 27e7a2c728597..54e5725596421
Binary files a/docs/images/intro-discover.png and b/docs/images/intro-discover.png differ
diff --git a/docs/images/intro-management.png b/docs/images/intro-management.png
index 3c14529a53e90..4f32bfa80c3fd 100644
Binary files a/docs/images/intro-management.png and b/docs/images/intro-management.png differ
diff --git a/docs/images/kibana-status-page-7_5_0.png b/docs/images/kibana-status-page-7_5_0.png
index 2dac4c3f94c35..a28bbe13e3930 100644
Binary files a/docs/images/kibana-status-page-7_5_0.png and b/docs/images/kibana-status-page-7_5_0.png differ
diff --git a/docs/images/management-index-read-only-badge.png b/docs/images/management-index-read-only-badge.png
index 54e685894f5e1..d59007192c63b 100644
Binary files a/docs/images/management-index-read-only-badge.png and b/docs/images/management-index-read-only-badge.png differ
diff --git a/docs/images/management-license.png b/docs/images/management-license.png
index e13a5cc06f6da..3347aec8632e4 100644
Binary files a/docs/images/management-license.png and b/docs/images/management-license.png differ
diff --git a/docs/images/management-saved-objects.png b/docs/images/management-saved-objects.png
index 8ae68c8102b05..ba1f5af581dfd 100644
Binary files a/docs/images/management-saved-objects.png and b/docs/images/management-saved-objects.png differ
diff --git a/docs/images/management-upgrade-assistant-9.0.png b/docs/images/management-upgrade-assistant-9.0.png
old mode 100755
new mode 100644
index b08ae8ac81ffe..7c9dec1b09b87
Binary files a/docs/images/management-upgrade-assistant-9.0.png and b/docs/images/management-upgrade-assistant-9.0.png differ
diff --git a/docs/images/management_create_rollup_job.png b/docs/images/management_create_rollup_job.png
old mode 100755
new mode 100644
index f06ce97010849..c3139c9f8df1a
Binary files a/docs/images/management_create_rollup_job.png and b/docs/images/management_create_rollup_job.png differ
diff --git a/docs/images/management_rollup_job_dashboard.png b/docs/images/management_rollup_job_dashboard.png
old mode 100755
new mode 100644
index 995fde2060ff7..d3c394183cad8
Binary files a/docs/images/management_rollup_job_dashboard.png and b/docs/images/management_rollup_job_dashboard.png differ
diff --git a/docs/images/management_rollup_job_details.png b/docs/images/management_rollup_job_details.png
old mode 100755
new mode 100644
index 63114adb8d63f..e6e93a6dae130
Binary files a/docs/images/management_rollup_job_details.png and b/docs/images/management_rollup_job_details.png differ
diff --git a/docs/images/management_rollup_job_vis.png b/docs/images/management_rollup_job_vis.png
old mode 100755
new mode 100644
index 672a3045b335b..e1f46e4db5c0a
Binary files a/docs/images/management_rollup_job_vis.png and b/docs/images/management_rollup_job_vis.png differ
diff --git a/docs/images/management_rollup_list.png b/docs/images/management_rollup_list.png
old mode 100755
new mode 100644
index bbebb6140d1e7..60e9a35071003
Binary files a/docs/images/management_rollup_list.png and b/docs/images/management_rollup_list.png differ
diff --git a/docs/images/monitoring-dashboard.png b/docs/images/monitoring-dashboard.png
index 0ad5192df7678..d0a0c14cb9f7d 100644
Binary files a/docs/images/monitoring-dashboard.png and b/docs/images/monitoring-dashboard.png differ
diff --git a/docs/images/settings-read-only-badge.png b/docs/images/settings-read-only-badge.png
index 449d5199ccb16..c4453b3818932 100644
Binary files a/docs/images/settings-read-only-badge.png and b/docs/images/settings-read-only-badge.png differ
diff --git a/docs/images/tutorial-dashboard.png b/docs/images/tutorial-dashboard.png
index 48e75260e9f60..8193d410bc5f1 100644
Binary files a/docs/images/tutorial-dashboard.png and b/docs/images/tutorial-dashboard.png differ
diff --git a/docs/images/tutorial-discover-2.png b/docs/images/tutorial-discover-2.png
index 4f4b2dc920ccb..7190c90d8e5ba 100644
Binary files a/docs/images/tutorial-discover-2.png and b/docs/images/tutorial-discover-2.png differ
diff --git a/docs/images/tutorial-discover-3.png b/docs/images/tutorial-discover-3.png
index 7b3e12d74686b..bbab47acaf9d4 100644
Binary files a/docs/images/tutorial-discover-3.png and b/docs/images/tutorial-discover-3.png differ
diff --git a/docs/images/tutorial-full-inspect1.png b/docs/images/tutorial-full-inspect1.png
index 8e756634af76a..94c9f2566f624 100644
Binary files a/docs/images/tutorial-full-inspect1.png and b/docs/images/tutorial-full-inspect1.png differ
diff --git a/docs/images/tutorial-sample-dashboard.png b/docs/images/tutorial-sample-dashboard.png
deleted file mode 100644
index 9f287640f201c..0000000000000
Binary files a/docs/images/tutorial-sample-dashboard.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-discover1.png b/docs/images/tutorial-sample-discover1.png
deleted file mode 100644
index dc35ec41609e9..0000000000000
Binary files a/docs/images/tutorial-sample-discover1.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-discover2.png b/docs/images/tutorial-sample-discover2.png
deleted file mode 100644
index c5d7833db6126..0000000000000
Binary files a/docs/images/tutorial-sample-discover2.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-edit1.png b/docs/images/tutorial-sample-edit1.png
deleted file mode 100644
index 621fa39120851..0000000000000
Binary files a/docs/images/tutorial-sample-edit1.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-edit2.png b/docs/images/tutorial-sample-edit2.png
deleted file mode 100644
index c289b3643a87d..0000000000000
Binary files a/docs/images/tutorial-sample-edit2.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-filter.png b/docs/images/tutorial-sample-filter.png
deleted file mode 100644
index 7c1d041448557..0000000000000
Binary files a/docs/images/tutorial-sample-filter.png and /dev/null differ
diff --git a/docs/images/tutorial-sample-inspect1.png b/docs/images/tutorial-sample-inspect1.png
deleted file mode 100644
index 71a608597338a..0000000000000
Binary files a/docs/images/tutorial-sample-inspect1.png and /dev/null differ
diff --git a/docs/images/tutorial-visualize-bar-1.5.png b/docs/images/tutorial-visualize-bar-1.5.png
index 4ec256959f14f..c02b9ca59dff5 100644
Binary files a/docs/images/tutorial-visualize-bar-1.5.png and b/docs/images/tutorial-visualize-bar-1.5.png differ
diff --git a/docs/images/tutorial-visualize-pie-2.png b/docs/images/tutorial-visualize-pie-2.png
index 6d16c2dab2bfb..ef5d62b4ceee7 100644
Binary files a/docs/images/tutorial-visualize-pie-2.png and b/docs/images/tutorial-visualize-pie-2.png differ
diff --git a/docs/images/tutorial-visualize-pie-3.png b/docs/images/tutorial-visualize-pie-3.png
index 324d8f8c07a29..6974c8d34b0dd 100644
Binary files a/docs/images/tutorial-visualize-pie-3.png and b/docs/images/tutorial-visualize-pie-3.png differ
diff --git a/docs/images/tutorial-visualize-wizard-step-1.png b/docs/images/tutorial-visualize-wizard-step-1.png
index fa353ae528318..afc9dda648265 100644
Binary files a/docs/images/tutorial-visualize-wizard-step-1.png and b/docs/images/tutorial-visualize-wizard-step-1.png differ
diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc
index cafd50d92376f..561919738786e 100644
--- a/docs/management/advanced-options.asciidoc
+++ b/docs/management/advanced-options.asciidoc
@@ -5,7 +5,7 @@ The *Advanced Settings* UI enables you to edit settings that control the behavio
For example, you can change the format used to display dates, specify the default index pattern, and set the precision
for displayed decimal values.
-. Go to *Management > {kib} > Advanced Settings*.
+. Open the menu, then go to *Stack Management > {kib} > Advanced Settings*.
. Scroll or search for the setting you want to modify.
. Enter a new value for the setting.
. Click *Save changes*.
diff --git a/docs/management/alerting/alerts-and-actions-intro.asciidoc b/docs/management/alerting/alerts-and-actions-intro.asciidoc
index 4674c9ba902be..efc6a670af3e9 100644
--- a/docs/management/alerting/alerts-and-actions-intro.asciidoc
+++ b/docs/management/alerting/alerts-and-actions-intro.asciidoc
@@ -6,7 +6,7 @@ beta[]
The *Alerts and Actions* UI lets you <> in a space, and provides tools to <> so that alerts can trigger actions like notification, indexing, and ticketing.
-To manage alerting and connectors, go to *Management > {kib} > Alerts and Actions*.
+To manage alerting and connectors, open the menu, then go to *Stack Management > {kib} > Alerts and Actions*.
[role="screenshot"]
image:management/alerting/images/alerts-and-actions-ui.png[Example alert listing in the Alerts and Actions UI]
diff --git a/docs/management/index-lifecycle-policies/add-policy-to-index.asciidoc b/docs/management/index-lifecycle-policies/add-policy-to-index.asciidoc
index 099bd222d6ba0..eb014a5165048 100644
--- a/docs/management/index-lifecycle-policies/add-policy-to-index.asciidoc
+++ b/docs/management/index-lifecycle-policies/add-policy-to-index.asciidoc
@@ -2,15 +2,15 @@
[[adding-policy-to-index]]
=== Adding a policy to an index
-You can add a lifecycle policy to an index and view the status for indices
-managed by a policy in *Management > {es} > Index Management*. This page lists your
+To add a lifecycle policy to an index and view the status for indices
+managed by a policy, open the menu, then go to *Stack Management > {es} > Index Management*. This page lists your
{es} indices, which you can filter by lifecycle status and lifecycle phase.
-To add a policy, select the index name and then select *Manage > Add lifecycle policy*.
+To add a policy, select the index name and then select *Manage Index > Add lifecycle policy*.
You’ll see the policy name, the phase the index is in, the current
action, and if any errors occurred performing that action.
-To remove a policy from an index, select *Manage > Remove lifecycle policy*.
+To remove a policy from an index, select *Manage Index > Remove lifecycle policy*.
[role="screenshot"]
image::images/index_management_add_policy.png[][UI for adding a policy to an index]
diff --git a/docs/management/index-lifecycle-policies/create-policy.asciidoc b/docs/management/index-lifecycle-policies/create-policy.asciidoc
index 629a278ab7c61..7849ef6b92054 100644
--- a/docs/management/index-lifecycle-policies/create-policy.asciidoc
+++ b/docs/management/index-lifecycle-policies/create-policy.asciidoc
@@ -12,8 +12,8 @@ you’re likely moving your data to less performant hardware and reducing the
number of shards and replicas. It’s important to ensure that the index
continues to have enough replicas to prevent data loss in the event of failures.
-*Index Lifecycle Policies* is automatically enabled in {kib}. Go to
-*Management > {es} > Index Lifecycle Policies*.
+*Index Lifecycle Policies* is automatically enabled in {kib}. Open the menu, then go to
+*Stack Management > {es} > Index Lifecycle Policies*.
NOTE: If you don’t want to use this feature, you can disable it by setting
`xpack.ilm.enabled` to false in your `kibana.yml` configuration file. If you
diff --git a/docs/management/index-lifecycle-policies/example-index-lifecycle-policy.asciidoc b/docs/management/index-lifecycle-policies/example-index-lifecycle-policy.asciidoc
index e6d94e9ca61a3..69e74d6538e4f 100644
--- a/docs/management/index-lifecycle-policies/example-index-lifecycle-policy.asciidoc
+++ b/docs/management/index-lifecycle-policies/example-index-lifecycle-policy.asciidoc
@@ -59,7 +59,7 @@ output as described in {filebeat-ref}/filebeat-getting-started.html[Getting Star
{filebeat} includes a default {ilm-init} policy that enables rollover. {ilm-init}
is enabled automatically if you’re using the default `filebeat.yml` and index template.
-To view the default policy in {kib}, go to *Management > Index Lifecycle Policies*,
+To view the default policy in {kib}, open the menu, go to * Stack Management > {es} > Index Lifecycle Policies*,
search for _filebeat_, and choose the _filebeat-version_ policy.
This policy initiates the rollover action when the index size reaches 50GB or
@@ -114,8 +114,8 @@ If meeting a specific retention time period is most important, you can create a
custom policy. For this option, you will use {filebeat} daily indices without
rollover.
-. Create a custom policy in {kib}, go to *Management > Index Lifecycle Policies >
-Create Policy*.
+. To create a custom policy, open the menu, go to *Stack Management > {es} > Index Lifecycle Policies*, then click
+*Create policy*.
. Activate the warm phase and configure it as follows:
+
@@ -156,8 +156,8 @@ image::images/tutorial-ilm-custom-policy.png["Modify the custom policy to add a
[role="screenshot"]
image::images/tutorial-ilm-delete-phase-creation.png["Delete phase"]
-. Configure the index to use the new policy in *{kib} > Management > Index Lifecycle
-Policies*
+. To configure the index to use the new policy, open the menu, then go to *Stack Management > {es} > Index Lifecycle
+Policies*.
.. Find your {ilm-init} policy.
.. Click the *Actions* link next to your policy name.
diff --git a/docs/management/index-patterns.asciidoc b/docs/management/index-patterns.asciidoc
index 37980e2b15c6b..05036311c094c 100644
--- a/docs/management/index-patterns.asciidoc
+++ b/docs/management/index-patterns.asciidoc
@@ -25,9 +25,8 @@ image::images/management-index-read-only-badge.png[Example of Index Pattern Mana
[[settings-create-pattern]]
=== Create an index pattern
-If you are in an app that requires an index pattern, and you don't have one yet,
-{kib} prompts you to create one. Or, you can go directly to
-*Management > Kibana > Index Patterns*.
+When you don't have an index pattern, {kib} prompts you to create one. Or, you can open the menu,
+then go to *Stack Management > {kib} > Index Patterns* to go directly to the *Index Patterns* UI.
[role="screenshot"]
image:management/index-patterns/images/rollup-index-pattern.png["Menu with rollup index pattern"]
diff --git a/docs/management/managing-beats.asciidoc b/docs/management/managing-beats.asciidoc
index 5a23b60307131..26998a3b5b8f4 100644
--- a/docs/management/managing-beats.asciidoc
+++ b/docs/management/managing-beats.asciidoc
@@ -4,7 +4,7 @@
include::{asciidoc-dir}/../../shared/discontinued.asciidoc[tag=cm-discontinued]
-Use the Central Management UI under *Management > {beats}* to define and
+To use the Central Management UI, open the menu, go to *Stack Management > {beats} > Central Management*, then define and
manage configurations in a central location in {kib} and quickly deploy
configuration changes to all {beats} running across your enterprise. For more
about central management, see the related {beats} documentation:
@@ -17,8 +17,8 @@ about central management, see the related {beats} documentation:
This feature requires an Elastic license that includes {beats} central
management.
-Don't have a license? You can start a 30-day trial. In {kib}, go to
-*Management > License Management*. At the end of the trial
+Don't have a license? You can start a 30-day trial. Open the menu, go to
+*Stack Management > Elasticsearch > License Management*. At the end of the trial
period, you can purchase a subscription to keep using central management. For
more information, see https://www.elastic.co/subscriptions and
{stack-ov}/license-management.html[License Management].
diff --git a/docs/management/managing-ccr.asciidoc b/docs/management/managing-ccr.asciidoc
index b2db5a80cfe7e..2df9addf74919 100644
--- a/docs/management/managing-ccr.asciidoc
+++ b/docs/management/managing-ccr.asciidoc
@@ -7,7 +7,7 @@ remote clusters on a local cluster. {ref}/xpack-ccr.html[Cross-cluster replicati
is commonly used to provide remote backups for disaster recovery and for
geo-proximite copies of data.
-To get started, go to *Management > Cross-Cluster Replication*.
+To get started, open the menu, then go to *Stack Management > Elasticsearch > Cross-Cluster Replication*.
[role="screenshot"]
image::images/cross-cluster-replication-list-view.png[][Cross-cluster replication list view]
diff --git a/docs/management/managing-fields.asciidoc b/docs/management/managing-fields.asciidoc
index 9682d918aabe4..ad3a0ef0fcdd1 100644
--- a/docs/management/managing-fields.asciidoc
+++ b/docs/management/managing-fields.asciidoc
@@ -134,7 +134,7 @@ https://www.elastic.co/blog/using-painless-kibana-scripted-fields[Using Painless
[[create-scripted-field]]
=== Create a scripted field
-. Go to *Management > {kib} > Index Patterns*
+. Open the menu, then go to *Stack Management > {kib} > Index Patterns*
. Select the index pattern you want to add a scripted field to.
. Go to the *Scripted fields* tab for the index pattern, then click *Add scripted field*.
. Enter a name for the scripted field.
@@ -148,7 +148,6 @@ For more information about scripted fields in {es}, see
[[update-scripted-field]]
=== Update a scripted field
-. Go to *Management > {kib} > Index Patterns*
. Click the *Scripted fields* tab for the index pattern.
. Click the *Edit* button for the scripted field you want to change.
. Make your changes, then click *Save field*.
@@ -160,7 +159,6 @@ exceptions whenever you try to view the dynamically generated data.
[[delete-scripted-field]]
=== Delete a scripted field
-. Go to *Management > {kib} > Index Patterns*
. Click the *Scripted fields* tab for the index pattern.
. Click *Delete* for the scripted field you want to remove.
. Click *Delete* on the confirmation window.
diff --git a/docs/management/managing-indices.asciidoc b/docs/management/managing-indices.asciidoc
index 946d9ee1b41c7..4fc4ac1d37429 100644
--- a/docs/management/managing-indices.asciidoc
+++ b/docs/management/managing-indices.asciidoc
@@ -13,7 +13,7 @@ the amount of bookkeeping when working with indices. Instead of manually
setting up your indices, you can create them automatically from a template,
ensuring that your settings, mappings, and aliases are consistently defined.
-To manage your indices, go to *Management > {es} > Index Management*.
+To manage your indices, open the menu, then go to *Stack Management > {es} > Index Management*.
[role="screenshot"]
image::images/management_index_labels.png[Index Management UI]
diff --git a/docs/management/managing-licenses.asciidoc b/docs/management/managing-licenses.asciidoc
index a7ed4e942f3f6..6cd6657a0aaeb 100644
--- a/docs/management/managing-licenses.asciidoc
+++ b/docs/management/managing-licenses.asciidoc
@@ -6,8 +6,8 @@ with no expiration date. For the full list of free features that are included in
the basic license, refer to https://www.elastic.co/subscriptions[the subscription page].
If you want to try out the full set of platinum features, you can activate a
-30-day trial license. Go to *Management > License Management* to view the
-status of your license, start a trial, or install a new license.
+30-day trial license. To view the
+status of your license, start a trial, or install a new license, open the menu, then go to *Stack Management > {es} > License Management*.
NOTE: You can start a trial only if your cluster has not already activated a
trial license for the current major product version. For example, if you have
@@ -15,7 +15,7 @@ already activated a trial for 6.0, you cannot start a new trial until
7.0. You can, however, contact `info@elastic.co` to request an extended trial
license.
-When you activate a new license level, new features appear in *Management*.
+When you activate a new license level, new features appear in *Stack Management*.
[role="screenshot"]
image::images/management-license.png[]
diff --git a/docs/management/managing-remote-clusters.asciidoc b/docs/management/managing-remote-clusters.asciidoc
index 51d9f42a0b83e..8ccd27b65aed6 100644
--- a/docs/management/managing-remote-clusters.asciidoc
+++ b/docs/management/managing-remote-clusters.asciidoc
@@ -6,7 +6,7 @@ connection from your cluster to other clusters. This functionality is
required for {ref}/xpack-ccr.html[cross-cluster replication] and
{ref}/modules-cross-cluster-search.html[cross-cluster search].
-To get started, go to *Management > Remote Clusters*.
+To get started, open the menu, then go to *Stack Management > {es} > Remote Clusters*.
[role="screenshot"]
image::images/remote-clusters-list-view.png[Remote Clusters list view, including Add a remote cluster button]
diff --git a/docs/management/managing-saved-objects.asciidoc b/docs/management/managing-saved-objects.asciidoc
index a92a6ae4bdc09..51de5ad620b46 100644
--- a/docs/management/managing-saved-objects.asciidoc
+++ b/docs/management/managing-saved-objects.asciidoc
@@ -5,7 +5,7 @@ The *Saved Objects* UI helps you keep track of and manage your saved objects. Th
store data for later use, including dashboards, visualizations, maps, index patterns,
Canvas workpads, and more.
-To get started, go to *Management > {kib} > Saved Objects*. With this UI, you can:
+To get started, open the menu, then go to *Stack Management > {kib} > Saved Objects*. With this UI, you can:
* <>
* <>
@@ -62,7 +62,7 @@ the NDJSON includes related objects. Exported dashboards include their associate
[float]
[role="xpack"]
[[managing-saved-objects-copy-to-space]]
-=== [xpack]#Copy to other {kib} spaces#
+=== Copy to other {kib} spaces
To copy a saved object to another space, click the actions icon image:images/actions_icon.png[Actions icon]
and select *Copy to space*. From here, you can select the spaces in which to copy the object.
diff --git a/docs/management/rollups/create_and_manage_rollups.asciidoc b/docs/management/rollups/create_and_manage_rollups.asciidoc
index e9e4054f3b9ba..bbdc382d04b38 100644
--- a/docs/management/rollups/create_and_manage_rollups.asciidoc
+++ b/docs/management/rollups/create_and_manage_rollups.asciidoc
@@ -8,7 +8,7 @@ by an index pattern, and then rolls it into a new index. Rollup indices are a go
compactly store months or years of historical
data for use in visualizations and reports.
-You’ll find *Rollup Jobs* under *Management > Elasticsearch*. With this UI,
+To get started, open the menu, then go to *Stack Management > {es} > Rollup Jobs*. With this UI,
you can:
* <>
diff --git a/docs/management/snapshot-restore/images/create_snapshot.png b/docs/management/snapshot-restore/images/create_snapshot.png
old mode 100755
new mode 100644
index 5e33eb7c3dcfc..14c1229a23ce1
Binary files a/docs/management/snapshot-restore/images/create_snapshot.png and b/docs/management/snapshot-restore/images/create_snapshot.png differ
diff --git a/docs/management/snapshot-restore/index.asciidoc b/docs/management/snapshot-restore/index.asciidoc
index 7253d6eaa0f68..a64b74069f978 100644
--- a/docs/management/snapshot-restore/index.asciidoc
+++ b/docs/management/snapshot-restore/index.asciidoc
@@ -8,7 +8,7 @@ Snapshots are important because they provide a copy of your data in case
something goes wrong. If you need to roll back to an older version of your data,
you can restore a snapshot from the repository.
-You’ll find *Snapshot and Restore* under *Management > Elasticsearch*.
+To get started, open the menu, then go to *Stack Management > {es} > Snapshot and Restore*.
With this UI, you can:
* Register a repository for storing your snapshots
@@ -32,7 +32,7 @@ The minimum required permissions to access *Snapshot and Restore* include:
* Cluster privileges: `monitor`, `manage_slm`, `cluster:admin/snapshot`, and `cluster:admin/repository`
* Index privileges: `all` on the `monitor` index if you want to access content in the *Restore Status* tab
-You can add these privileges in *Management > Security > Roles*.
+To add privileges, open the menu, then go to *Stack Management > Security > Roles*.
[role="screenshot"]
image:management/snapshot-restore/images/snapshot_permissions.png["Edit Role"]
@@ -191,7 +191,7 @@ your master and data nodes. You can do this in one of two ways:
Use *Snapshot and Restore* to register the repository where your snapshots
will live.
-. Go to *Management > Elasticsearch > Snapshot and Restore*.
+. Open the menu, then go to *Stack Management > {es} > Snapshot and Restore*.
. Click *Register a repository* in either the introductory message or *Repository view*.
. Enter a name for your repository, for example, `my_backup`.
. Select *Shared file system*.
@@ -212,7 +212,7 @@ The repository currently doesn’t have any snapshots.
==== Add a snapshot to the repository
Use the {ref}/snapshots-take-snapshot.html[snapshot API] to create a snapshot.
-. Go to *Dev Tools > Console*.
+. Open the menu, go to *Dev Tools*, then select *Console*.
. Create the snapshot:
+
[source,js]
diff --git a/docs/management/upgrade-assistant/index.asciidoc b/docs/management/upgrade-assistant/index.asciidoc
index b1121b423fea7..9a0dfd25489ea 100644
--- a/docs/management/upgrade-assistant/index.asciidoc
+++ b/docs/management/upgrade-assistant/index.asciidoc
@@ -3,7 +3,7 @@
== Upgrade Assistant
The Upgrade Assistant helps you prepare for your upgrade to {es} 9.0.
-To access the assistant, go to *Management > 9.0 Upgrade Assistant*.
+To access the assistant, open the menu, then go to *Stack Management > {es} > 9.0 Upgrade Assistant*.
The assistant identifies the deprecated settings in your cluster and indices
and guides you through the process of resolving issues, including reindexing.
diff --git a/docs/management/watcher-ui/index.asciidoc b/docs/management/watcher-ui/index.asciidoc
index 205e614dc21cd..fa3e0cce04fff 100644
--- a/docs/management/watcher-ui/index.asciidoc
+++ b/docs/management/watcher-ui/index.asciidoc
@@ -8,7 +8,7 @@ Watches are helpful for analyzing mission-critical and business-critical
streaming data. For example, you might watch application logs for performance
outages or audit access logs for security threats.
-To get started with the Watcher UI, go to *Management > Elasticsearch > Watcher*.
+To get started with the Watcher UI, open then menu, then go to *Stack Management > {es} > Watcher*.
With this UI, you can:
* <>
@@ -40,7 +40,7 @@ and either of these watcher roles:
* `watcher_admin`. You can perform all Watcher actions, including create and edit watches.
* `watcher_user`. You can view watches, but not create or edit them.
-You can manage roles in *Management > Security > Roles*, or use the
+To manage roles, open then menu, then go to *Stack Management > Security > Roles*, or use the
<>. Watches are shared between
all users with the same role.
diff --git a/docs/maps/geojson-upload.asciidoc b/docs/maps/geojson-upload.asciidoc
index 7e2cdddfd30ef..5618e5ab0bd16 100644
--- a/docs/maps/geojson-upload.asciidoc
+++ b/docs/maps/geojson-upload.asciidoc
@@ -17,7 +17,7 @@ GeoJSON is the most commonly used and flexible option.
Follow these instructions to upload a GeoJSON data file, or try the
<>.
-. Open *Elastic Maps*, and then click *Add layer*.
+. Open the menu, go to *Elastic Maps*, and then click *Add layer*.
. Click *Uploaded GeoJSON*.
+
[role="screenshot"]
diff --git a/docs/maps/images/inspector.png b/docs/maps/images/inspector.png
index a0d214b35a988..0d59394caeda2 100644
Binary files a/docs/maps/images/inspector.png and b/docs/maps/images/inspector.png differ
diff --git a/docs/maps/maps-getting-started.asciidoc b/docs/maps/maps-getting-started.asciidoc
index a74d442d6ffa2..239419695138d 100644
--- a/docs/maps/maps-getting-started.asciidoc
+++ b/docs/maps/maps-getting-started.asciidoc
@@ -44,7 +44,7 @@ In this tutorial, you'll learn to:
The first thing to do is to create a new map.
-. If you haven't already, open *Elastic Maps*.
+. If you haven't already, open the menu, then click *{kib} > Maps*.
. On the maps list page, click *Create map*.
. Set the time range to *Last 7 days*.
+
@@ -205,8 +205,8 @@ You have completed the steps for re-creating the sample data map.
=== Adding the map to a dashboard
You can add your saved map to a {kibana-ref}/dashboard.html[dashboard] and view your geospatial data alongside bar charts, pie charts, and other visualizations.
-. In the side navigation, click *Dashboard*.
-. Click *Create new dashboard*.
+. Open the menu, then go to *Dashboard*.
+. Click *Create dashboard*.
. Set the time range to *Last 7 days*.
. Click *Add*.
+
diff --git a/docs/siem/images/cases-ui.png b/docs/siem/images/cases-ui.png
index b513efb664740..d7b125b87a004 100644
Binary files a/docs/siem/images/cases-ui.png and b/docs/siem/images/cases-ui.png differ
diff --git a/docs/siem/images/detections-ui.png b/docs/siem/images/detections-ui.png
index 3139ffea0767d..b698ac5d08469 100644
Binary files a/docs/siem/images/detections-ui.png and b/docs/siem/images/detections-ui.png differ
diff --git a/docs/siem/images/hosts-ui.png b/docs/siem/images/hosts-ui.png
index be9fd29246b51..77cdb227e1d0b 100644
Binary files a/docs/siem/images/hosts-ui.png and b/docs/siem/images/hosts-ui.png differ
diff --git a/docs/siem/images/ml-ui.png b/docs/siem/images/ml-ui.png
index 168ff6363186a..568ae324dadd7 100644
Binary files a/docs/siem/images/ml-ui.png and b/docs/siem/images/ml-ui.png differ
diff --git a/docs/siem/images/network-ui.png b/docs/siem/images/network-ui.png
index de8ce89273a02..52caa7835d51a 100644
Binary files a/docs/siem/images/network-ui.png and b/docs/siem/images/network-ui.png differ
diff --git a/docs/siem/images/overview-ui.png b/docs/siem/images/overview-ui.png
index 6ac02104d6123..09128775a5097 100644
Binary files a/docs/siem/images/overview-ui.png and b/docs/siem/images/overview-ui.png differ
diff --git a/docs/siem/images/timeline-ui.png b/docs/siem/images/timeline-ui.png
index 9a9c1d9c790e7..fbf5843fc445c 100644
Binary files a/docs/siem/images/timeline-ui.png and b/docs/siem/images/timeline-ui.png differ
diff --git a/docs/siem/siem-ui.asciidoc b/docs/siem/siem-ui.asciidoc
index 985138756622d..21a2ed55fdfdc 100644
--- a/docs/siem/siem-ui.asciidoc
+++ b/docs/siem/siem-ui.asciidoc
@@ -58,7 +58,7 @@ Cases are used to open and track security issues directly in SIEM.
Cases list the original reporter and all users who contribute to a case
(`participants`). Case comments support Markdown syntax, and allow linking to
saved Timelines. Additionally, you can send cases to external systems from
-within SIEM (currently ServiceNow).
+within SIEM (currently ServiceNow and Jira).
For information about opening, updating, and closing cases, see
{siem-guide}/cases-overview.html[Cases] in the SIEM Guide.
diff --git a/docs/spaces/images/change-space.png b/docs/spaces/images/change-space.png
index 6907c80b5984f..fcf379afec84c 100644
Binary files a/docs/spaces/images/change-space.png and b/docs/spaces/images/change-space.png differ
diff --git a/docs/spaces/images/edit-space-feature-visibility.png b/docs/spaces/images/edit-space-feature-visibility.png
index 447944d2fe5ad..bc983bde2679c 100644
Binary files a/docs/spaces/images/edit-space-feature-visibility.png and b/docs/spaces/images/edit-space-feature-visibility.png differ
diff --git a/docs/spaces/images/edit-space.png b/docs/spaces/images/edit-space.png
index 8381d546eaf07..68ffea23c4ac4 100644
Binary files a/docs/spaces/images/edit-space.png and b/docs/spaces/images/edit-space.png differ
diff --git a/docs/spaces/images/space-management.png b/docs/spaces/images/space-management.png
index 0cbbd7da1243b..9d68be0d19f0d 100644
Binary files a/docs/spaces/images/space-management.png and b/docs/spaces/images/space-management.png differ
diff --git a/docs/spaces/index.asciidoc b/docs/spaces/index.asciidoc
index 990af3a018b1f..bbc213dc2050e 100644
--- a/docs/spaces/index.asciidoc
+++ b/docs/spaces/index.asciidoc
@@ -29,7 +29,7 @@ Kibana supports spaces in several ways. You can:
[[spaces-managing]]
=== View, create, and delete spaces
-Go to **Management > Spaces** for an overview of your spaces. This view provides actions
+Open the menu, then go to *Stack Management > {kib} > Spaces* for an overview of your spaces. This view provides actions
for you to create, edit, and delete spaces.
[role="screenshot"]
@@ -94,8 +94,8 @@ image::spaces/images/spaces-roles.png["Controlling features visiblity"]
[[spaces-moving-objects]]
=== Move saved objects between spaces
-You can <> from one space to another
-in **Management > Saved objects**.
+To <> from one space to another, open the menu,
+then go to *Stack Management > {kib} > Saved objects*.
Alternately, you can move objects using {kib}'s <>
interface.
diff --git a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc
index e41bd0939495d..b1cf2d650e576 100644
--- a/docs/user/alerting/action-types/pre-configured-connectors.asciidoc
+++ b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc
@@ -61,8 +61,8 @@ Sensitive properties, such as passwords, can also be stored in the < Alerts and Actions*, preconfigured connectors
-appear in the <>,
+When you open the menu, then go to *Stack Management > {kib} > Alerts and Actions*, preconfigured connectors
+appear on the <>,
regardless of which space you are in.
They are tagged as “preconfigured”, and you cannot delete them.
@@ -101,7 +101,7 @@ This example shows a preconfigured action type with one out-of-the box connector
[[managing-pre-configured-action-types]]
To attach a preconfigured action to an alert:
-. In *Management > Alerts and Actions*, open the *Connectors* tab.
+. Open the menu, then go to *Stack Management > {kib} > Alerts and Actions*, open the *Connectors* tab.
. Click *Create connector.*
diff --git a/docs/user/dashboard.asciidoc b/docs/user/dashboard.asciidoc
index b90593c46db4c..bd6d10c3d7eb3 100644
--- a/docs/user/dashboard.asciidoc
+++ b/docs/user/dashboard.asciidoc
@@ -44,7 +44,7 @@ add them as you create the dashboard, or you can add
<>,
which include pre-built dashboards.
-To begin, open *Dashboard*, then click *Create new dashboard.*
+To begin, open the menu, go to *Dashboard*, then click *Create dashboard.*
[float]
[[dashboard-add-elements]]
@@ -186,5 +186,5 @@ tools. To create a short URL, you must have write access to {kib}.
[[import-dashboards]]
=== Export the dashboard
-To export the dashboard, go to *Management > Saved Objects*. For more information,
-see <>.
+To export the dashboard, open the menu, then click *Stack Management > Saved Objects*. For more information,
+refer to <>.
diff --git a/docs/user/getting-started.asciidoc b/docs/user/getting-started.asciidoc
index 0eb823dcc720f..2ff3a09152df4 100644
--- a/docs/user/getting-started.asciidoc
+++ b/docs/user/getting-started.asciidoc
@@ -29,14 +29,14 @@ such as cost, revenue, and price.
To use the sample data sets:
-. Go to the {kib} home page.
+. Go to the home page.
. Click *Load a data set and a {kib} dashboard*.
. Click *View data* and view the prepackaged dashboards, maps, and more.
[role="screenshot"]
-image::images/add-sample-data.png[]
+image::getting-started/images/add-sample-data.png[]
NOTE: The timestamps in the sample data sets are relative to when they are installed.
If you uninstall and reinstall a data set, the timestamps change to reflect the most recent installation.
diff --git a/docs/user/graph/getting-started.asciidoc b/docs/user/graph/getting-started.asciidoc
index 4f61b62da5cce..aca6d40a3532e 100644
--- a/docs/user/graph/getting-started.asciidoc
+++ b/docs/user/graph/getting-started.asciidoc
@@ -9,7 +9,7 @@ You must index data into {es} before you can create a graph.
[[exploring-connections]]
=== Graph a data connection
-. From the side navigation, open *Graph*.
+. Open the menu, then go to *Graph*.
+
If this is your first graph, follow the prompts to create it.
For subsequent graphs, click *New*.
diff --git a/docs/user/graph/images/graph-add-query.png b/docs/user/graph/images/graph-add-query.png
old mode 100755
new mode 100644
index 0b978462ae75e..1b233e3ef8b69
Binary files a/docs/user/graph/images/graph-add-query.png and b/docs/user/graph/images/graph-add-query.png differ
diff --git a/docs/user/graph/images/graph-link-summary.png b/docs/user/graph/images/graph-link-summary.png
old mode 100755
new mode 100644
index ca07f350f975e..4c75be00de0f5
Binary files a/docs/user/graph/images/graph-link-summary.png and b/docs/user/graph/images/graph-link-summary.png differ
diff --git a/docs/user/graph/images/graph-read-only-badge.png b/docs/user/graph/images/graph-read-only-badge.png
index a4d517cd5fe70..a33b927ef0624 100644
Binary files a/docs/user/graph/images/graph-read-only-badge.png and b/docs/user/graph/images/graph-read-only-badge.png differ
diff --git a/docs/user/graph/images/graph-url-connections.png b/docs/user/graph/images/graph-url-connections.png
old mode 100755
new mode 100644
index 94c9c4341d9b8..4f8c163ab764b
Binary files a/docs/user/graph/images/graph-url-connections.png and b/docs/user/graph/images/graph-url-connections.png differ
diff --git a/docs/user/ml/images/outliers.jpg b/docs/user/ml/images/outliers.jpg
deleted file mode 100644
index 88663062b52d6..0000000000000
Binary files a/docs/user/ml/images/outliers.jpg and /dev/null differ
diff --git a/docs/user/ml/images/outliers.png b/docs/user/ml/images/outliers.png
new file mode 100644
index 0000000000000..3f4c5f6c6bbf0
Binary files /dev/null and b/docs/user/ml/images/outliers.png differ
diff --git a/docs/user/ml/index.asciidoc b/docs/user/ml/index.asciidoc
index 6483ddde07335..f82bb0a406511 100644
--- a/docs/user/ml/index.asciidoc
+++ b/docs/user/ml/index.asciidoc
@@ -96,7 +96,7 @@ If you have a license that includes the {ml-features}, you can create
in {kib}. For example:
[role="screenshot"]
-image::user/ml/images/outliers.jpg[{oldetection-cap} results in {kib}]
+image::user/ml/images/outliers.png[{oldetection-cap} results in {kib}]
For more information about the {dfanalytics} feature, see
{ml-docs}/ml-dfanalytics.html[{ml-cap} {dfanalytics}].
\ No newline at end of file
diff --git a/docs/user/monitoring/elasticsearch-details.asciidoc b/docs/user/monitoring/elasticsearch-details.asciidoc
index 93f809cfff650..15e4676c443df 100644
--- a/docs/user/monitoring/elasticsearch-details.asciidoc
+++ b/docs/user/monitoring/elasticsearch-details.asciidoc
@@ -12,7 +12,7 @@ the <>, <>,
*Stack Monitoring* page.
[role="screenshot"]
-image::user/monitoring/images/monitoring-elasticsearch.jpg["Monitoring clusters"]
+image::user/monitoring/images/monitoring-elasticsearch.png["Monitoring clusters"]
See also {ref}/monitor-elasticsearch-cluster.html[Monitor a cluster].
@@ -35,7 +35,7 @@ information about any shards that are being recovered. If you use {filebeat} to
collect log data from this cluster, you can also see its recent logs.
[role="screenshot"]
-image::user/monitoring/images/monitoring-overview.jpg["Elasticsearch Cluster Overview"]
+image::user/monitoring/images/monitoring-overview.png["Elasticsearch Cluster Overview"]
TIP: Not sure what a chart is showing? Click the info button for a description
of the metrics.
@@ -50,7 +50,7 @@ To view node metrics, click **Nodes**. The Nodes section shows the status
of each node in your cluster.
[role="screenshot"]
-image::user/monitoring/images/monitoring-nodes.jpg["Elasticsearch Nodes"]
+image::user/monitoring/images/monitoring-nodes.png["Elasticsearch Nodes"]
[float]
[[nodes-page-overview]]
@@ -62,7 +62,7 @@ health. If you use {filebeat} to collect log data from this node, you can also
see its recent logs.
[role="screenshot"]
-image::user/monitoring/images/monitoring-node.jpg["Elasticsearch Node Overview"]
+image::user/monitoring/images/monitoring-node.png["Elasticsearch Node Overview"]
[float]
[[nodes-page-advanced]]
@@ -73,7 +73,7 @@ To view advanced node metrics, click the **Advanced** tab for a node. The
statistics reported by the selected {es} node.
[role="screenshot"]
-image::user/monitoring/images/monitoring-node-advanced.jpg["Elasticsearch Node Advanced"]
+image::user/monitoring/images/monitoring-node-advanced.png["Elasticsearch Node Advanced"]
You can use the advanced node view to diagnose issues that generally involve
more advanced knowledge of {es}, such as poor garbage collection performance.
@@ -87,7 +87,7 @@ To view index metrics, click **Indices**. The Indices section shows the same
overall index and search metrics as the Overview and a table of your indices.
[role="screenshot"]
-image::user/monitoring/images/monitoring-indices.jpg["Elasticsearch Indices"]
+image::user/monitoring/images/monitoring-indices.png["Elasticsearch Indices"]
[float]
[[indices-page-overview]]
@@ -97,7 +97,7 @@ From the Indices listing, you can view data for a particular index. To drill
down into the data for a particular index, click its name in the Indices table.
[role="screenshot"]
-image::user/monitoring/images/monitoring-index.jpg["Elasticsearch Index Overview"]
+image::user/monitoring/images/monitoring-index.png["Elasticsearch Index Overview"]
[float]
[[indices-page-advanced]]
@@ -109,7 +109,7 @@ about the {es} index. If the index has more than one shard, then its shards
might live on more than one node.
[role="screenshot"]
-image::user/monitoring/images/monitoring-index-advanced.jpg["Elasticsearch Index Advanced"]
+image::user/monitoring/images/monitoring-index-advanced.png["Elasticsearch Index Advanced"]
The Advanced index view can be used to diagnose issues that generally involve
more advanced knowledge of {es}, such as wasteful index memory usage.
@@ -160,7 +160,7 @@ If you click *Logs*, you can see the most recent logs for the cluster. For
example:
[role="screenshot"]
-image::user/monitoring/images/monitoring-elasticsearch-logs.jpg["Recent {es} logs"]
+image::user/monitoring/images/monitoring-elasticsearch-logs.png["Recent {es} logs"]
TIP: By default, up to 10 log entries are shown. You can show up to 50 log
entries by changing the
diff --git a/docs/user/monitoring/images/monitoring-ccr-shard.png b/docs/user/monitoring/images/monitoring-ccr-shard.png
index 1fb7f4dfebd26..88d3a02ee6f87 100644
Binary files a/docs/user/monitoring/images/monitoring-ccr-shard.png and b/docs/user/monitoring/images/monitoring-ccr-shard.png differ
diff --git a/docs/user/monitoring/images/monitoring-ccr.png b/docs/user/monitoring/images/monitoring-ccr.png
index eb8f417ae4761..d76f2e7bd791e 100644
Binary files a/docs/user/monitoring/images/monitoring-ccr.png and b/docs/user/monitoring/images/monitoring-ccr.png differ
diff --git a/docs/user/monitoring/images/monitoring-elasticsearch-logs.jpg b/docs/user/monitoring/images/monitoring-elasticsearch-logs.jpg
deleted file mode 100644
index bdcf924652e19..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-elasticsearch-logs.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-elasticsearch-logs.png b/docs/user/monitoring/images/monitoring-elasticsearch-logs.png
new file mode 100644
index 0000000000000..e0050762b3db8
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-elasticsearch-logs.png differ
diff --git a/docs/user/monitoring/images/monitoring-elasticsearch.jpg b/docs/user/monitoring/images/monitoring-elasticsearch.jpg
deleted file mode 100644
index 5ba8624d24c4b..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-elasticsearch.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-elasticsearch.png b/docs/user/monitoring/images/monitoring-elasticsearch.png
new file mode 100644
index 0000000000000..a33ecb00964d2
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-elasticsearch.png differ
diff --git a/docs/user/monitoring/images/monitoring-index-advanced.jpg b/docs/user/monitoring/images/monitoring-index-advanced.jpg
deleted file mode 100644
index 61f8e99f5ada6..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-index-advanced.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-index-advanced.png b/docs/user/monitoring/images/monitoring-index-advanced.png
new file mode 100644
index 0000000000000..825692add2140
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-index-advanced.png differ
diff --git a/docs/user/monitoring/images/monitoring-index.jpg b/docs/user/monitoring/images/monitoring-index.jpg
deleted file mode 100644
index 7a6b6d9cff850..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-index.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-index.png b/docs/user/monitoring/images/monitoring-index.png
new file mode 100644
index 0000000000000..f859bd10d0fdf
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-index.png differ
diff --git a/docs/user/monitoring/images/monitoring-indices.jpg b/docs/user/monitoring/images/monitoring-indices.jpg
deleted file mode 100644
index 91e1bc05cfd3b..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-indices.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-indices.png b/docs/user/monitoring/images/monitoring-indices.png
new file mode 100644
index 0000000000000..42b523609678d
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-indices.png differ
diff --git a/docs/user/monitoring/images/monitoring-jobs.png b/docs/user/monitoring/images/monitoring-jobs.png
index 531f37ecae8ec..6d830bd1d338a 100644
Binary files a/docs/user/monitoring/images/monitoring-jobs.png and b/docs/user/monitoring/images/monitoring-jobs.png differ
diff --git a/docs/user/monitoring/images/monitoring-kibana-instance.png b/docs/user/monitoring/images/monitoring-kibana-instance.png
index 564abe60e9bec..bd04c40003295 100644
Binary files a/docs/user/monitoring/images/monitoring-kibana-instance.png and b/docs/user/monitoring/images/monitoring-kibana-instance.png differ
diff --git a/docs/user/monitoring/images/monitoring-kibana-instances.png b/docs/user/monitoring/images/monitoring-kibana-instances.png
index c431ceb02b396..577fdfa3c9a4d 100644
Binary files a/docs/user/monitoring/images/monitoring-kibana-instances.png and b/docs/user/monitoring/images/monitoring-kibana-instances.png differ
diff --git a/docs/user/monitoring/images/monitoring-kibana-overview.png b/docs/user/monitoring/images/monitoring-kibana-overview.png
index cae5789b2571e..d183ea7f05777 100644
Binary files a/docs/user/monitoring/images/monitoring-kibana-overview.png and b/docs/user/monitoring/images/monitoring-kibana-overview.png differ
diff --git a/docs/user/monitoring/images/monitoring-logstash-node.png b/docs/user/monitoring/images/monitoring-logstash-node.png
index 750e683b72aa5..72fd25cd19dcf 100644
Binary files a/docs/user/monitoring/images/monitoring-logstash-node.png and b/docs/user/monitoring/images/monitoring-logstash-node.png differ
diff --git a/docs/user/monitoring/images/monitoring-logstash-nodes.png b/docs/user/monitoring/images/monitoring-logstash-nodes.png
index 559a69ae9b191..185e6909fa700 100644
Binary files a/docs/user/monitoring/images/monitoring-logstash-nodes.png and b/docs/user/monitoring/images/monitoring-logstash-nodes.png differ
diff --git a/docs/user/monitoring/images/monitoring-logstash-overview.png b/docs/user/monitoring/images/monitoring-logstash-overview.png
index 7b7ea3baaa02d..36636aaaaba56 100644
Binary files a/docs/user/monitoring/images/monitoring-logstash-overview.png and b/docs/user/monitoring/images/monitoring-logstash-overview.png differ
diff --git a/docs/user/monitoring/images/monitoring-node-advanced.jpg b/docs/user/monitoring/images/monitoring-node-advanced.jpg
deleted file mode 100644
index 9bdb626104016..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-node-advanced.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-node-advanced.png b/docs/user/monitoring/images/monitoring-node-advanced.png
new file mode 100644
index 0000000000000..754a5be6e483b
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-node-advanced.png differ
diff --git a/docs/user/monitoring/images/monitoring-node.jpg b/docs/user/monitoring/images/monitoring-node.jpg
deleted file mode 100644
index cdfd8ba6632de..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-node.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-node.png b/docs/user/monitoring/images/monitoring-node.png
new file mode 100644
index 0000000000000..176cf5437fb80
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-node.png differ
diff --git a/docs/user/monitoring/images/monitoring-nodes.jpg b/docs/user/monitoring/images/monitoring-nodes.jpg
deleted file mode 100644
index 2e668a0c91174..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-nodes.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-nodes.png b/docs/user/monitoring/images/monitoring-nodes.png
new file mode 100644
index 0000000000000..9183a7be6ea1d
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-nodes.png differ
diff --git a/docs/user/monitoring/images/monitoring-overview.jpg b/docs/user/monitoring/images/monitoring-overview.jpg
deleted file mode 100644
index 2362e1992af3c..0000000000000
Binary files a/docs/user/monitoring/images/monitoring-overview.jpg and /dev/null differ
diff --git a/docs/user/monitoring/images/monitoring-overview.png b/docs/user/monitoring/images/monitoring-overview.png
new file mode 100644
index 0000000000000..6ffb816afd891
Binary files /dev/null and b/docs/user/monitoring/images/monitoring-overview.png differ
diff --git a/docs/user/monitoring/monitoring-kibana.asciidoc b/docs/user/monitoring/monitoring-kibana.asciidoc
index ba55e2d16c150..b9ec3982eb3c5 100644
--- a/docs/user/monitoring/monitoring-kibana.asciidoc
+++ b/docs/user/monitoring/monitoring-kibana.asciidoc
@@ -36,8 +36,8 @@ By default, if you are running {kib} locally, go to `http://localhost:5601/`.
If {es} {security-features} are enabled, log in.
--
-... In the side navigation, click *Stack Monitoring*. If data collection is
-disabled, you are prompted to turn it on.
+... Open the menu, then go to *Stack Monitoring*. If data collection is
+disabled, you are prompted to turn it on.
** From the Console or command line, set `xpack.monitoring.collection.enabled`
to `true` on the production cluster. +
diff --git a/docs/user/monitoring/viewing-metrics.asciidoc b/docs/user/monitoring/viewing-metrics.asciidoc
index 48dd2be9ee6a2..6203565c3fe93 100644
--- a/docs/user/monitoring/viewing-metrics.asciidoc
+++ b/docs/user/monitoring/viewing-metrics.asciidoc
@@ -74,7 +74,7 @@ By default, if you are running {kib} locally, go to `http://localhost:5601/`.
If the Elastic {security-features} are enabled, log in.
--
-. In the side navigation, click *Stack Monitoring*.
+. Open *Stack Monitoring*.
+
--
If data collection is disabled, you are prompted to turn on data collection.
diff --git a/docs/user/reporting/images/share-button.png b/docs/user/reporting/images/share-button.png
index 46a4cce598119..0b307d947935e 100644
Binary files a/docs/user/reporting/images/share-button.png and b/docs/user/reporting/images/share-button.png differ
diff --git a/docs/user/reporting/images/shareable-container.png b/docs/user/reporting/images/shareable-container.png
index db5a41dcff471..e114f63e2fe12 100644
Binary files a/docs/user/reporting/images/shareable-container.png and b/docs/user/reporting/images/shareable-container.png differ
diff --git a/docs/user/reporting/index.asciidoc b/docs/user/reporting/index.asciidoc
index fde88130a26b4..19aa9823faaf0 100644
--- a/docs/user/reporting/index.asciidoc
+++ b/docs/user/reporting/index.asciidoc
@@ -94,7 +94,7 @@ image::user/reporting/images/preserve-layout-switch.png["Share"]
[[manage-report-history]]
== View and manage report history
-For a list of your reports, go to *Management > Reporting*.
+For a list of your reports, open the menu, then go to *Stack Management > {kib} > Reporting*.
From this view, you can monitor the generation of a report and
download reports that you previously generated.
diff --git a/docs/user/security/api-keys/index.asciidoc b/docs/user/security/api-keys/index.asciidoc
index b8d6649a3fb85..c93d7caec1b7d 100644
--- a/docs/user/security/api-keys/index.asciidoc
+++ b/docs/user/security/api-keys/index.asciidoc
@@ -14,8 +14,8 @@ and then put the API credentials into a cron job.
Or, you might create API keys to automate ingestion of new data from
remote sources, without a live user interaction.
-You can create API keys from the {kib} Console. To view and invalidate
-API keys, use *Management > Security > API Keys*.
+You can create API keys from the {kib} Console. To view and invalidate
+API keys, open the menu, then go to *Stack Management > Security > API Keys*.
[role="screenshot"]
image:user/security/api-keys/images/api-keys.png["API Keys UI"]
@@ -38,9 +38,9 @@ or contact your system administrator.
[[api-keys-security-privileges]]
=== Security privileges
-You must have the `manage_security`, `manage_api_key`, or the `manage_own_api_key`
-cluster privileges to use API keys in {kib}. You can manage roles in
-*Management > Security > Roles*, or use the <>.
+You must have the `manage_security`, `manage_api_key`, or the `manage_own_api_key`
+cluster privileges to use API keys in {kib}. To manage roles, open the menu, then go to
+*Stack Management > Security > Roles*, or use the <>.
[float]
diff --git a/docs/user/security/authorization/index.asciidoc b/docs/user/security/authorization/index.asciidoc
index 4b91812660c78..93d6d4249119f 100644
--- a/docs/user/security/authorization/index.asciidoc
+++ b/docs/user/security/authorization/index.asciidoc
@@ -12,7 +12,7 @@ NOTE: When running multiple tenants of Kibana by changing the `kibana.index` in
[[xpack-kibana-role-management]]
=== {kib} role management
-To create a role that grants {kib} privileges, go to **Management -> Security -> Roles** and click **Create role**.
+To create a role that grants {kib} privileges, open the menu, go to *Stack Management > Security > Roles* and click **Create role**.
[[adding_kibana_privileges]]
==== Adding {kib} privileges
diff --git a/docs/user/security/images/assign_base_privilege.png b/docs/user/security/images/assign_base_privilege.png
index 2aef42132ef21..34e2bcf81d618 100644
Binary files a/docs/user/security/images/assign_base_privilege.png and b/docs/user/security/images/assign_base_privilege.png differ
diff --git a/docs/user/security/images/assign_feature_privilege.png b/docs/user/security/images/assign_feature_privilege.png
index 26fbbf20b39ad..c9449f6390253 100644
Binary files a/docs/user/security/images/assign_feature_privilege.png and b/docs/user/security/images/assign_feature_privilege.png differ
diff --git a/docs/user/security/images/mutual-tls-role-mapping.png b/docs/user/security/images/mutual-tls-role-mapping.png
index d95ce41e130c2..e870efe5d5b74 100644
Binary files a/docs/user/security/images/mutual-tls-role-mapping.png and b/docs/user/security/images/mutual-tls-role-mapping.png differ
diff --git a/docs/user/security/images/role-management.png b/docs/user/security/images/role-management.png
index 2a78c69a5e352..29efdd85c4df3 100644
Binary files a/docs/user/security/images/role-management.png and b/docs/user/security/images/role-management.png differ
diff --git a/docs/user/security/images/role-new-user.png b/docs/user/security/images/role-new-user.png
index 0e8d75421cca3..c882eeea42d60 100644
Binary files a/docs/user/security/images/role-new-user.png and b/docs/user/security/images/role-new-user.png differ
diff --git a/docs/user/security/index.asciidoc b/docs/user/security/index.asciidoc
index e3d6e0d97c73a..e1a46a415fe68 100644
--- a/docs/user/security/index.asciidoc
+++ b/docs/user/security/index.asciidoc
@@ -13,7 +13,7 @@ auditing. For more information, see
[float]
=== Users
-You can create and manage users on the *Management -> Security -> Users* page.
+To create and manage users, open the menu, then go to *Stack Management > Security > Users*.
You can also change their passwords and roles. For more information about
authentication and built-in users, see
{ref}/setting-up-authentication.html[Setting up user authentication].
@@ -21,7 +21,7 @@ authentication and built-in users, see
[float]
=== Roles
-You can manage roles on the *Management -> Security -> Roles* page, or use
+To manage roles, open the menu, then go to *Stack Management > Security > Roles*, or use
the <>. For more information on configuring roles for {kib}, see <>.
For a more holistic overview of configuring roles for the entire stack,
diff --git a/docs/user/security/rbac_tutorial.asciidoc b/docs/user/security/rbac_tutorial.asciidoc
index d45aae86a9ccb..d7299f814b43c 100644
--- a/docs/user/security/rbac_tutorial.asciidoc
+++ b/docs/user/security/rbac_tutorial.asciidoc
@@ -1,5 +1,5 @@
[[space-rbac-tutorial]]
-=== Tutorial: Use role-based access control to customize Kibana spaces
+=== Tutorial: Use role-based access control to customize Kibana spaces
With role-based access control (RBAC), you can provide users access to data, tools,
and Kibana spaces. In this tutorial, you will learn how to configure roles
@@ -45,7 +45,7 @@ through in this tutorial:
[float]
==== Create a role
-Go to **Management > Roles**
+Open the menu, then go to *Stack Management > Security > Roles*
for an overview of your roles. This view provides actions
for you to create, edit, and delete roles.
@@ -88,11 +88,11 @@ to create saved searches while designing visualizations.
image::security/images/role-space-visualization.png["Associate space"]
[float]
-==== Create the developer's user account with the proper roles
+==== Create the developer user account with the proper roles
-Go to **Management > Users** and click on **Create user** to create a
-user. Give the user the `dev-mortgage` role
-and the `monitoring-user` role, which is required for users of **Stack Monitoring**.
+. Open the menu, then go to *Stack Management > Users*.
+. Click **Create user**, then give the user the `dev-mortgage`
+and `monitoring-user` roles, which are required for *Stack Monitoring* users.
[role="screenshot"]
image::security/images/role-new-user.png["Developer user"]
diff --git a/docs/user/security/reporting.asciidoc b/docs/user/security/reporting.asciidoc
index 825580bdc772e..30340e1db989a 100644
--- a/docs/user/security/reporting.asciidoc
+++ b/docs/user/security/reporting.asciidoc
@@ -24,14 +24,13 @@ to report on and the {es} indices.
[[reporting-roles-management-ui]]
=== If you are using the `native` realm
-You can assign roles through the
-*Management* app in Kibana or with the <>.
-This example shows how to use *Management* to create a user who has a custom role and the
+To assign roles, open the menu, then go to *Stack Management > Security > Roles*, use the <>.
+This example shows how to use *Roles* page to create a user who has a custom role and the
`reporting_user` role.
-. Go to *Management > Roles*, and click *Create role*.
+. Open the menu, then go to *Stack Management > Security > Roles*.
-. Give the new role a name, for example, `custom_reporting_user`.
+. Click *Create role*, then give the role a name, for example, `custom_reporting_user`.
. Specify the indices and privileges.
+
@@ -52,9 +51,7 @@ that provides read and write privileges in
. Save your new role.
-. Create a user account with the proper roles.
-+
-Go to *Management > Users*, add a new user, and assign the user the built-in
+. Open the menu, then go to *Stack Management > Security > Users*, add a new user, and assign the user the built-in
`reporting_user` role and your new custom role, `custom_reporting_user`.
[float]
@@ -72,10 +69,10 @@ If you use a different pattern for the `xpack.reporting.index` setting,
you must create a custom role with appropriate access to the index, similar
to the following:
-. Go to *Management > Roles*, and click *Create role*.
-. Name the role `custom-reporting-user`.
+. Open the menu, then go to *Stack Management >Security > Roles*.
+. Click *Create role*, then name the role `custom-reporting-user`.
. Specify the custom index and assign it the `all` index privilege.
-. Go to *Management > Users* and create a new user with
+. Open the menu, then go to *Stack Management > Security > Users* and create a new user with
the `kibana_system` role and the `custom-reporting-user` role.
. Configure {kib} to use the new account:
[source,js]
diff --git a/docs/user/security/role-mappings/images/role-mappings-create-step-1.png b/docs/user/security/role-mappings/images/role-mappings-create-step-1.png
index 2b4ad16459529..76aee8fd85b66 100644
Binary files a/docs/user/security/role-mappings/images/role-mappings-create-step-1.png and b/docs/user/security/role-mappings/images/role-mappings-create-step-1.png differ
diff --git a/docs/user/security/role-mappings/images/role-mappings-create-step-2.gif b/docs/user/security/role-mappings/images/role-mappings-create-step-2.gif
index 0a10126ea3cce..c4a982d96c365 100644
Binary files a/docs/user/security/role-mappings/images/role-mappings-create-step-2.gif and b/docs/user/security/role-mappings/images/role-mappings-create-step-2.gif differ
diff --git a/docs/user/security/role-mappings/images/role-mappings-grid.png b/docs/user/security/role-mappings/images/role-mappings-grid.png
index 96c9ee8e4cd95..f33cd7a3652b2 100644
Binary files a/docs/user/security/role-mappings/images/role-mappings-grid.png and b/docs/user/security/role-mappings/images/role-mappings-grid.png differ
diff --git a/docs/user/security/role-mappings/index.asciidoc b/docs/user/security/role-mappings/index.asciidoc
index 01028ab4d59e0..661c319af827f 100644
--- a/docs/user/security/role-mappings/index.asciidoc
+++ b/docs/user/security/role-mappings/index.asciidoc
@@ -9,7 +9,7 @@ or SAML.
Role mappings have no effect for users inside the `native` or `file` realms.
-To manage your role mappings, use *Management > Security > Role Mappings*.
+To manage your role mappings, open the menu, then go to *Stack Management > Security > Role Mappings*.
With *Role mappings*, you can:
@@ -23,12 +23,13 @@ image:user/security/role-mappings/images/role-mappings-grid.png["Role mappings"]
[float]
=== Create a role mapping
-To create a role mapping, navigate to *Management > Security > Role Mappings*, and click **Create role mapping**.
-Give your role mapping a unique name, and choose which roles you wish to assign to your users.
+. Open the menu, then go to *Stack Management > Security > Role Mappings*.
+. Click *Create role mapping*.
+. Give your role mapping a unique name, and choose which roles you wish to assign to your users.
++
If you need more flexibility, you can use {ref}/security-api-put-role-mapping.html#_role_templates[role templates] instead.
-
-Next, define the rules describing which users should receive the roles you defined. Rules can optionally grouped and nested, allowing for sophisticated logic to suite complex requirements.
-View the {ref}/role-mapping-resources.html[role mapping resources for an overview of the allowed rule types].
+. Define the rules describing which users should receive the roles you defined. Rules can optionally grouped and nested, allowing for sophisticated logic to suite complex requirements.
+. View the {ref}/role-mapping-resources.html[role mapping resources for an overview of the allowed rule types].
[float]
diff --git a/docs/user/security/securing-kibana.asciidoc b/docs/user/security/securing-kibana.asciidoc
index 33c81961fcd7b..6fc2b0af318a4 100644
--- a/docs/user/security/securing-kibana.asciidoc
+++ b/docs/user/security/securing-kibana.asciidoc
@@ -99,10 +99,10 @@ use {kib}.
For more information on Basic Authentication and additional methods of
authenticating {kib} users, see <>.
-You can manage privileges on the *Management / Security / Roles* page in {kib}.
+To manage privileges, open the menu, then go to *Stack Management > Security > Roles*.
-If you're using the native realm with Basic Authentication, you can assign roles
-using the *Management / Security / Users* page in {kib} or the
+If you're using the native realm with Basic Authentication, open then menu,
+then go to *Stack Management > Security > Users* to assign roles, or use the
{ref}/security-api.html#security-user-apis[user management APIs]. For example,
the following creates a user named `jacknich` and assigns it the `kibana_admin`
role:
diff --git a/docs/user/visualize.asciidoc b/docs/user/visualize.asciidoc
index ebc2f404d43c1..f020f56774dab 100644
--- a/docs/user/visualize.asciidoc
+++ b/docs/user/visualize.asciidoc
@@ -7,7 +7,7 @@ _Visualize_ enables you to create visualizations of the data from your {es} indi
{kib} visualizations are based on {es} queries. By using a series of {es} {ref}/search-aggregations.html[aggregations] to extract and process your data, you can create charts that show you the trends, spikes, and dips you need to know about.
-To begin, open *Visualize*, then click *Create new visualization*.
+To begin, open the menu, go to *Visualize*, then click *Create visualization*.
[float]
[[visualization-types]]
diff --git a/docs/visualize/images/read-only-badge.png b/docs/visualize/images/read-only-badge.png
index 8970105f7443c..fda5b97231020 100644
Binary files a/docs/visualize/images/read-only-badge.png and b/docs/visualize/images/read-only-badge.png differ
diff --git a/docs/visualize/lens.asciidoc b/docs/visualize/lens.asciidoc
index 38ccb7878a92b..09b55af9be2db 100644
--- a/docs/visualize/lens.asciidoc
+++ b/docs/visualize/lens.asciidoc
@@ -110,9 +110,7 @@ To start, you'll need to add the <>.
Drag and drop your data onto the visualization builder pane.
-. From the menu, click *Visualize*, then click *Create visualization*.
-
-. On the *New Visualization* window, click *Lens*.
+. Open *Lens*.
. Select the *kibana_sample_data_ecommerce* index pattern.
diff --git a/src/plugins/discover/public/application/angular/discover.js b/src/plugins/discover/public/application/angular/discover.js
index 88885b3eb211b..8ff5af1e3a767 100644
--- a/src/plugins/discover/public/application/angular/discover.js
+++ b/src/plugins/discover/public/application/angular/discover.js
@@ -970,13 +970,17 @@ function discoverController(
};
$scope.addColumn = function addColumn(columnName) {
- $scope.indexPattern.popularizeField(columnName, 1);
+ if (uiCapabilities.discover.save) {
+ $scope.indexPattern.popularizeField(columnName, 1);
+ }
const columns = columnActions.addColumn($scope.state.columns, columnName);
setAppState({ columns });
};
$scope.removeColumn = function removeColumn(columnName) {
- $scope.indexPattern.popularizeField(columnName, 1);
+ if (uiCapabilities.discover.save) {
+ $scope.indexPattern.popularizeField(columnName, 1);
+ }
const columns = columnActions.removeColumn($scope.state.columns, columnName);
setAppState({ columns });
};
diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.test.tsx b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.test.tsx
index 60011914e8f74..90ade60d2073d 100644
--- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.test.tsx
+++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.test.tsx
@@ -45,6 +45,9 @@ jest.mock('../../../kibana_services', () => ({
visualize: {
show: true,
},
+ discover: {
+ save: false,
+ },
},
uiSettings: {
get: (key: string) => {
diff --git a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx
index 5a319d30b2515..96e04c13d70e9 100644
--- a/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx
+++ b/src/plugins/discover/public/application/components/sidebar/discover_sidebar.tsx
@@ -114,10 +114,12 @@ export function DiscoverSidebar({
setOpenFieldMap(new Map(openFieldMap.set(field.name, false)));
} else {
setOpenFieldMap(new Map(openFieldMap.set(field.name, true)));
- selectedIndexPattern.popularizeField(field.name, 1);
+ if (services.capabilities.discover.save) {
+ selectedIndexPattern.popularizeField(field.name, 1);
+ }
}
},
- [openFieldMap, selectedIndexPattern]
+ [openFieldMap, selectedIndexPattern, services.capabilities.discover.save]
);
const onChangeFieldSearch = useCallback(
(field: string, value: string | boolean | undefined) => {
diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.test.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.test.ts
new file mode 100644
index 0000000000000..aefd074c373f9
--- /dev/null
+++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.test.ts
@@ -0,0 +1,40 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { getApmMlJobCategory } from './get_service_anomalies';
+import { Job as AnomalyDetectionJob } from '../../../../ml/server';
+
+describe('getApmMlJobCategory', () => {
+ it('should match service names with different casings', () => {
+ const mlJob = {
+ job_id: 'testservice-request-high_mean_response_time',
+ groups: ['apm', 'testservice', 'request'],
+ } as AnomalyDetectionJob;
+ const serviceNames = ['testService'];
+ const apmMlJobCategory = getApmMlJobCategory(mlJob, serviceNames);
+
+ expect(apmMlJobCategory).toEqual({
+ jobId: 'testservice-request-high_mean_response_time',
+ serviceName: 'testService',
+ transactionType: 'request',
+ });
+ });
+
+ it('should match service names with spaces', () => {
+ const mlJob = {
+ job_id: 'test_service-request-high_mean_response_time',
+ groups: ['apm', 'test_service', 'request'],
+ } as AnomalyDetectionJob;
+ const serviceNames = ['Test Service'];
+ const apmMlJobCategory = getApmMlJobCategory(mlJob, serviceNames);
+
+ expect(apmMlJobCategory).toEqual({
+ jobId: 'test_service-request-high_mean_response_time',
+ serviceName: 'Test Service',
+ transactionType: 'request',
+ });
+ });
+});
diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
index 7b26078d5ffbf..ac76464e2f2e8 100644
--- a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
+++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts
@@ -8,27 +8,40 @@ import { leftJoin } from '../../../common/utils/left_join';
import { Job as AnomalyDetectionJob } from '../../../../ml/server';
import { PromiseReturnType } from '../../../typings/common';
import { IEnvOptions } from './get_service_map';
-import { APM_ML_JOB_GROUP_NAME } from '../../../common/ml_job_constants';
+import {
+ APM_ML_JOB_GROUP_NAME,
+ encodeForMlApi,
+} from '../../../common/ml_job_constants';
type ApmMlJobCategory = NonNullable>;
-const getApmMlJobCategory = (
+export const getApmMlJobCategory = (
mlJob: AnomalyDetectionJob,
serviceNames: string[]
) => {
- const apmJobGroups = mlJob.groups.filter(
- (groupName) => groupName !== APM_ML_JOB_GROUP_NAME
+ const serviceByGroupNameMap = new Map(
+ serviceNames.map((serviceName) => [
+ encodeForMlApi(serviceName),
+ serviceName,
+ ])
);
- if (apmJobGroups.length === mlJob.groups.length) {
+ if (!mlJob.groups.includes(APM_ML_JOB_GROUP_NAME)) {
// ML job missing "apm" group name
return;
}
- const [serviceName] = intersection(apmJobGroups, serviceNames);
+ const apmJobGroups = mlJob.groups.filter(
+ (groupName) => groupName !== APM_ML_JOB_GROUP_NAME
+ );
+ const apmJobServiceNames = apmJobGroups.map(
+ (groupName) => serviceByGroupNameMap.get(groupName) || groupName
+ );
+ const [serviceName] = intersection(apmJobServiceNames, serviceNames);
if (!serviceName) {
// APM ML job service was not found
return;
}
+ const serviceGroupName = encodeForMlApi(serviceName);
const [transactionType] = apmJobGroups.filter(
- (groupName) => groupName !== serviceName
+ (groupName) => groupName !== serviceGroupName
);
if (!transactionType) {
// APM ML job transaction type was not found.
diff --git a/x-pack/plugins/index_management/kibana.json b/x-pack/plugins/index_management/kibana.json
index 7387a042988c0..2e0fa04337b40 100644
--- a/x-pack/plugins/index_management/kibana.json
+++ b/x-pack/plugins/index_management/kibana.json
@@ -9,6 +9,7 @@
"management"
],
"optionalPlugins": [
+ "security",
"usageCollection"
],
"configPath": ["xpack", "index_management"]
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts
index 8fb4dcff0bcea..cdcb1abf8ed5d 100644
--- a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts
@@ -15,7 +15,7 @@ import {
nextTick,
} from '../../../../../../../../../test_utils';
import { WithAppDependencies } from './setup_environment';
-import { ComponentTemplateList } from '../../../component_template_list';
+import { ComponentTemplateList } from '../../../component_template_list/component_template_list';
const testBedConfig: TestBedConfig = {
memoryRouter: {
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/auth_provider.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/auth_provider.tsx
new file mode 100644
index 0000000000000..ed4bd10447b0b
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/auth_provider.tsx
@@ -0,0 +1,27 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import React from 'react';
+
+import { AuthorizationProvider } from '../shared_imports';
+import { useComponentTemplatesContext } from '../component_templates_context';
+
+export const ComponentTemplatesAuthProvider: React.FunctionComponent = ({
+ children,
+}: {
+ children?: React.ReactNode;
+}) => {
+ const { httpClient, apiBasePath } = useComponentTemplatesContext();
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list_container.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list_container.tsx
new file mode 100644
index 0000000000000..af8ab1b94c790
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list_container.tsx
@@ -0,0 +1,21 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import React from 'react';
+
+import { ComponentTemplatesAuthProvider } from './auth_provider';
+import { ComponentTemplatesWithPrivileges } from './with_privileges';
+import { ComponentTemplateList } from './component_template_list';
+
+export const ComponentTemplateListContainer: React.FunctionComponent = () => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts
index 84ee48d14bb8c..873e6d02298fb 100644
--- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts
@@ -4,4 +4,4 @@
* you may not use this file except in compliance with the Elastic License.
*/
-export { ComponentTemplateList } from './component_template_list';
+export { ComponentTemplateListContainer as ComponentTemplateList } from './component_template_list_container';
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/with_privileges.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/with_privileges.tsx
new file mode 100644
index 0000000000000..2886a7715ff09
--- /dev/null
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/with_privileges.tsx
@@ -0,0 +1,83 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+import { FormattedMessage } from '@kbn/i18n/react';
+import React, { FunctionComponent } from 'react';
+
+import {
+ SectionError,
+ useAuthorizationContext,
+ WithPrivileges,
+ SectionLoading,
+ NotAuthorizedSection,
+} from '../shared_imports';
+import { APP_CLUSTER_REQUIRED_PRIVILEGES } from '../constants';
+
+export const ComponentTemplatesWithPrivileges: FunctionComponent = ({
+ children,
+}: {
+ children?: React.ReactNode;
+}) => {
+ const { apiError } = useAuthorizationContext();
+
+ if (apiError) {
+ return (
+
+ }
+ error={apiError}
+ />
+ );
+ }
+
+ return (
+ `cluster.${privilege}`)}
+ >
+ {({ isLoading, hasPrivileges, privilegesMissing }) => {
+ if (isLoading) {
+ return (
+
+
+
+ );
+ }
+
+ if (!hasPrivileges) {
+ return (
+
+ }
+ message={
+
+ }
+ />
+ );
+ }
+
+ return <>{children}>;
+ }}
+
+ );
+};
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx
index 6f5f5bdebd6d0..55f20ce21d417 100644
--- a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx
@@ -21,6 +21,8 @@ interface Props {
}
interface Context {
+ httpClient: HttpSetup;
+ apiBasePath: string;
api: ReturnType;
documentation: ReturnType;
trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void;
@@ -45,7 +47,7 @@ export const ComponentTemplatesProvider = ({
return (
{children}
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts
index 3e763119fa9fb..501acde07fc00 100644
--- a/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts
@@ -8,3 +8,6 @@
export const UIM_COMPONENT_TEMPLATE_LIST_LOAD = 'component_template_list_load';
export const UIM_COMPONENT_TEMPLATE_DELETE = 'component_template_delete';
export const UIM_COMPONENT_TEMPLATE_DELETE_MANY = 'component_template_delete_many';
+
+// privileges
+export const APP_CLUSTER_REQUIRED_PRIVILEGES = ['manage_index_templates'];
diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts
index 863b00b353c49..049204f03c0c1 100644
--- a/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts
+++ b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts
@@ -12,4 +12,10 @@ export {
sendRequest,
useRequest,
SectionLoading,
+ WithPrivileges,
+ AuthorizationProvider,
+ SectionError,
+ Error,
+ useAuthorizationContext,
+ NotAuthorizedSection,
} from '../../../../../../../src/plugins/es_ui_shared/public';
diff --git a/x-pack/plugins/index_management/server/plugin.ts b/x-pack/plugins/index_management/server/plugin.ts
index f254333007c39..c1b9945c2cd1d 100644
--- a/x-pack/plugins/index_management/server/plugin.ts
+++ b/x-pack/plugins/index_management/server/plugin.ts
@@ -59,7 +59,7 @@ export class IndexMgmtServerPlugin implements Plugin security !== undefined && security.license.isEnabled(),
+ },
indexDataEnricher: this.indexDataEnricher,
lib: {
isEsError,
diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/index.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/index.ts
index 7ecb71182e87e..2ed123754a8b2 100644
--- a/x-pack/plugins/index_management/server/routes/api/component_templates/index.ts
+++ b/x-pack/plugins/index_management/server/routes/api/component_templates/index.ts
@@ -10,10 +10,12 @@ import { registerGetAllRoute } from './get';
import { registerCreateRoute } from './create';
import { registerUpdateRoute } from './update';
import { registerDeleteRoute } from './delete';
+import { registerPrivilegesRoute } from './privileges';
export function registerComponentTemplateRoutes(dependencies: RouteDependencies) {
registerGetAllRoute(dependencies);
registerCreateRoute(dependencies);
registerUpdateRoute(dependencies);
registerDeleteRoute(dependencies);
+ registerPrivilegesRoute(dependencies);
}
diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.test.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.test.ts
new file mode 100644
index 0000000000000..b34ffe3e0baf5
--- /dev/null
+++ b/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.test.ts
@@ -0,0 +1,153 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+import { httpServerMock, httpServiceMock } from 'src/core/server/mocks';
+import {
+ kibanaResponseFactory,
+ RequestHandlerContext,
+ RequestHandler,
+ IRouter,
+} from 'src/core/server';
+
+import { License } from '../../../services/license';
+import { IndexDataEnricher } from '../../../services/index_data_enricher';
+
+import { registerPrivilegesRoute } from './privileges';
+
+jest.mock('../../../services/index_data_enricher');
+
+const httpService = httpServiceMock.createSetupContract();
+
+const mockedIndexDataEnricher = new IndexDataEnricher();
+
+const mockRouteContext = ({
+ callAsCurrentUser,
+}: {
+ callAsCurrentUser: any;
+}): RequestHandlerContext => {
+ const routeContextMock = ({
+ core: {
+ elasticsearch: {
+ legacy: {
+ client: {
+ callAsCurrentUser,
+ },
+ },
+ },
+ },
+ } as unknown) as RequestHandlerContext;
+
+ return routeContextMock;
+};
+
+describe('GET privileges', () => {
+ let routeHandler: RequestHandler;
+
+ beforeEach(() => {
+ const router = httpService.createRouter('') as jest.Mocked;
+
+ registerPrivilegesRoute({
+ router,
+ license: {
+ guardApiRoute: (route: any) => route,
+ } as License,
+ config: {
+ isSecurityEnabled: () => true,
+ },
+ indexDataEnricher: mockedIndexDataEnricher,
+ lib: {
+ isEsError: jest.fn(),
+ },
+ });
+
+ routeHandler = router.get.mock.calls[0][1];
+ });
+
+ it('should return the correct response when a user has privileges', async () => {
+ const privilegesResponseMock = {
+ username: 'elastic',
+ has_all_requested: true,
+ cluster: { manage_index_templates: true },
+ index: {},
+ application: {},
+ };
+
+ const routeContextMock = mockRouteContext({
+ callAsCurrentUser: jest.fn().mockResolvedValueOnce(privilegesResponseMock),
+ });
+
+ const request = httpServerMock.createKibanaRequest();
+ const response = await routeHandler(routeContextMock, request, kibanaResponseFactory);
+
+ expect(response.payload).toEqual({
+ hasAllPrivileges: true,
+ missingPrivileges: {
+ cluster: [],
+ },
+ });
+ });
+
+ it('should return the correct response when a user does not have privileges', async () => {
+ const privilegesResponseMock = {
+ username: 'elastic',
+ has_all_requested: false,
+ cluster: { manage_index_templates: false },
+ index: {},
+ application: {},
+ };
+
+ const routeContextMock = mockRouteContext({
+ callAsCurrentUser: jest.fn().mockResolvedValueOnce(privilegesResponseMock),
+ });
+
+ const request = httpServerMock.createKibanaRequest();
+ const response = await routeHandler(routeContextMock, request, kibanaResponseFactory);
+
+ expect(response.payload).toEqual({
+ hasAllPrivileges: false,
+ missingPrivileges: {
+ cluster: ['manage_index_templates'],
+ },
+ });
+ });
+
+ describe('With security disabled', () => {
+ beforeEach(() => {
+ const router = httpService.createRouter('') as jest.Mocked;
+
+ registerPrivilegesRoute({
+ router,
+ license: {
+ guardApiRoute: (route: any) => route,
+ } as License,
+ config: {
+ isSecurityEnabled: () => false,
+ },
+ indexDataEnricher: mockedIndexDataEnricher,
+ lib: {
+ isEsError: jest.fn(),
+ },
+ });
+
+ routeHandler = router.get.mock.calls[0][1];
+ });
+
+ it('should return the default privileges response', async () => {
+ const routeContextMock = mockRouteContext({
+ callAsCurrentUser: jest.fn(),
+ });
+
+ const request = httpServerMock.createKibanaRequest();
+ const response = await routeHandler(routeContextMock, request, kibanaResponseFactory);
+
+ expect(response.payload).toEqual({
+ hasAllPrivileges: true,
+ missingPrivileges: {
+ cluster: [],
+ },
+ });
+ });
+ });
+});
diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.ts
new file mode 100644
index 0000000000000..08a3c37187f2d
--- /dev/null
+++ b/x-pack/plugins/index_management/server/routes/api/component_templates/privileges.ts
@@ -0,0 +1,70 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License;
+ * you may not use this file except in compliance with the Elastic License.
+ */
+
+import { Privileges } from 'src/plugins/es_ui_shared/public';
+import { RouteDependencies } from '../../../types';
+import { addBasePath } from '../index';
+
+const extractMissingPrivileges = (privilegesObject: { [key: string]: boolean } = {}): string[] =>
+ Object.keys(privilegesObject).reduce((privileges: string[], privilegeName: string): string[] => {
+ if (!privilegesObject[privilegeName]) {
+ privileges.push(privilegeName);
+ }
+ return privileges;
+ }, []);
+
+export const registerPrivilegesRoute = ({ license, router, config }: RouteDependencies) => {
+ router.get(
+ {
+ path: addBasePath('/component_templates/privileges'),
+ validate: false,
+ },
+ license.guardApiRoute(async (ctx, req, res) => {
+ const privilegesResult: Privileges = {
+ hasAllPrivileges: true,
+ missingPrivileges: {
+ cluster: [],
+ },
+ };
+
+ // Skip the privileges check if security is not enabled
+ if (!config.isSecurityEnabled()) {
+ return res.ok({ body: privilegesResult });
+ }
+
+ const {
+ core: {
+ elasticsearch: {
+ legacy: { client },
+ },
+ },
+ } = ctx;
+
+ try {
+ const { has_all_requested: hasAllPrivileges, cluster } = await client.callAsCurrentUser(
+ 'transport.request',
+ {
+ path: '/_security/user/_has_privileges',
+ method: 'POST',
+ body: {
+ cluster: ['manage_index_templates'],
+ },
+ }
+ );
+
+ if (!hasAllPrivileges) {
+ privilegesResult.missingPrivileges.cluster = extractMissingPrivileges(cluster);
+ }
+
+ privilegesResult.hasAllPrivileges = hasAllPrivileges;
+
+ return res.ok({ body: privilegesResult });
+ } catch (e) {
+ return res.internalError({ body: e });
+ }
+ })
+ );
+};
diff --git a/x-pack/plugins/index_management/server/types.ts b/x-pack/plugins/index_management/server/types.ts
index b3fb546281f1e..1482d9225c7b5 100644
--- a/x-pack/plugins/index_management/server/types.ts
+++ b/x-pack/plugins/index_management/server/types.ts
@@ -5,16 +5,21 @@
*/
import { ScopedClusterClient, IRouter } from 'src/core/server';
import { LicensingPluginSetup } from '../../licensing/server';
+import { SecurityPluginSetup } from '../../security/server';
import { License, IndexDataEnricher } from './services';
import { isEsError } from './lib/is_es_error';
export interface Dependencies {
+ security: SecurityPluginSetup;
licensing: LicensingPluginSetup;
}
export interface RouteDependencies {
router: IRouter;
license: License;
+ config: {
+ isSecurityEnabled: () => boolean;
+ };
indexDataEnricher: IndexDataEnricher;
lib: {
isEsError: typeof isEsError;
diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx
index 76da38ead6523..e4d37772eac2e 100644
--- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx
+++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel.tsx
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { useState, useEffect, useMemo, useContext } from 'react';
+import React, { useState, useEffect, useMemo, useContext, useCallback } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
import {
@@ -136,6 +136,26 @@ export function InnerWorkspacePanel({
framePublicAPI.filters,
]);
+ const onEvent = useCallback(
+ (event: ExpressionRendererEvent) => {
+ if (!plugins.uiActions) {
+ // ui actions not available, not handling event...
+ return;
+ }
+ if (isLensBrushEvent(event)) {
+ plugins.uiActions.getTrigger(VIS_EVENT_TO_TRIGGER[event.name]).exec({
+ data: event.data,
+ });
+ }
+ if (isLensFilterEvent(event)) {
+ plugins.uiActions.getTrigger(VIS_EVENT_TO_TRIGGER[event.name]).exec({
+ data: event.data,
+ });
+ }
+ },
+ [plugins.uiActions]
+ );
+
const autoRefreshFetch$ = useMemo(
() => plugins.data.query.timefilter.timefilter.getAutoRefreshFetch$(),
[plugins.data.query.timefilter.timefilter.getAutoRefreshFetch$]
@@ -231,22 +251,7 @@ export function InnerWorkspacePanel({
padding="m"
expression={expression!}
reload$={autoRefreshFetch$}
- onEvent={(event: ExpressionRendererEvent) => {
- if (!plugins.uiActions) {
- // ui actions not available, not handling event...
- return;
- }
- if (isLensBrushEvent(event)) {
- plugins.uiActions.getTrigger(VIS_EVENT_TO_TRIGGER[event.name]).exec({
- data: event.data,
- });
- }
- if (isLensFilterEvent(event)) {
- plugins.uiActions.getTrigger(VIS_EVENT_TO_TRIGGER[event.name]).exec({
- data: event.data,
- });
- }
- }}
+ onEvent={onEvent}
renderError={(errorMessage?: string | null) => {
return (
diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts
index b17a5aa28ac6a..2d004d3315beb 100644
--- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts
@@ -61,14 +61,20 @@ const Mac: HostOS[] = [];
const OS: HostOS[] = [...Windows, ...Mac, ...Linux];
-const POLICIES: Array<{ name: string; id: string }> = [
+const APPLIED_POLICIES: Array<{
+ name: string;
+ id: string;
+ status: HostPolicyResponseActionStatus;
+}> = [
{
name: 'Default',
id: '00000000-0000-0000-0000-000000000000',
+ status: HostPolicyResponseActionStatus.success,
},
{
name: 'With Eventing',
id: 'C2A9093E-E289-4C0A-AA44-8C32A414FA7A',
+ status: HostPolicyResponseActionStatus.success,
},
];
@@ -181,7 +187,11 @@ interface HostInfo {
host: Host;
endpoint: {
policy: {
- id: string;
+ applied: {
+ id: string;
+ status: HostPolicyResponseActionStatus;
+ name: string;
+ };
};
};
}
@@ -271,7 +281,12 @@ export class EndpointDocGenerator {
* Creates new random policy id for the host to simulate new policy application
*/
public updatePolicyId() {
- this.commonInfo.endpoint.policy.id = this.randomChoice(POLICIES).id;
+ this.commonInfo.endpoint.policy.applied.id = this.randomChoice(APPLIED_POLICIES).id;
+ this.commonInfo.endpoint.policy.applied.status = this.randomChoice([
+ HostPolicyResponseActionStatus.success,
+ HostPolicyResponseActionStatus.failure,
+ HostPolicyResponseActionStatus.warning,
+ ]);
}
private createHostData(): HostInfo {
@@ -293,7 +308,9 @@ export class EndpointDocGenerator {
os: this.randomChoice(OS),
},
endpoint: {
- policy: this.randomChoice(POLICIES),
+ policy: {
+ applied: this.randomChoice(APPLIED_POLICIES),
+ },
},
};
}
@@ -974,7 +991,7 @@ export class EndpointDocGenerator {
status: HostPolicyResponseActionStatus.success,
},
],
- id: this.commonInfo.endpoint.policy.id,
+ id: this.commonInfo.endpoint.policy.applied.id,
response: {
configurations: {
events: {
@@ -1015,8 +1032,9 @@ export class EndpointDocGenerator {
],
},
},
- status: this.randomHostPolicyResponseActionStatus(),
+ status: this.commonInfo.endpoint.policy.applied.status,
version: policyVersion,
+ name: this.commonInfo.endpoint.policy.applied.name,
},
},
},
diff --git a/x-pack/plugins/security_solution/common/endpoint/types.ts b/x-pack/plugins/security_solution/common/endpoint/types.ts
index 816f9b77115ec..cfbf8f176b32d 100644
--- a/x-pack/plugins/security_solution/common/endpoint/types.ts
+++ b/x-pack/plugins/security_solution/common/endpoint/types.ts
@@ -253,7 +253,11 @@ export type AlertEvent = Immutable<{
};
endpoint: {
policy: {
- id: string;
+ applied: {
+ id: string;
+ status: HostPolicyResponseActionStatus;
+ name: string;
+ };
};
};
process: {
@@ -357,7 +361,11 @@ export type HostMetadata = Immutable<{
};
endpoint: {
policy: {
- id: string;
+ applied: {
+ id: string;
+ status: HostPolicyResponseActionStatus;
+ name: string;
+ };
};
};
agent: {
@@ -700,6 +708,7 @@ export interface HostPolicyResponse {
applied: {
version: string;
id: string;
+ name: string;
status: HostPolicyResponseActionStatus;
actions: HostPolicyResponseAppliedAction[];
response: {
diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/__snapshots__/page_view.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/endpoint/__snapshots__/page_view.test.tsx.snap
index 5d077dba447fa..6d8ea6b346eff 100644
--- a/x-pack/plugins/security_solution/public/common/components/endpoint/__snapshots__/page_view.test.tsx.snap
+++ b/x-pack/plugins/security_solution/public/common/components/endpoint/__snapshots__/page_view.test.tsx.snap
@@ -2,11 +2,11 @@
exports[`PageView component should display body header custom element 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -97,11 +97,11 @@ exports[`PageView component should display body header custom element 1`] = `
exports[`PageView component should display body header wrapped in EuiTitle 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -195,11 +195,11 @@ exports[`PageView component should display body header wrapped in EuiTitle 1`] =
exports[`PageView component should display header left and right 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -308,11 +308,11 @@ exports[`PageView component should display header left and right 1`] = `
exports[`PageView component should display only body if not header props used 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -380,11 +380,11 @@ exports[`PageView component should display only body if not header props used 1`
exports[`PageView component should display only header left 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -482,11 +482,11 @@ exports[`PageView component should display only header left 1`] = `
exports[`PageView component should display only header right but include an empty left side 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -581,11 +581,11 @@ exports[`PageView component should display only header right but include an empt
exports[`PageView component should pass through EuiPage props 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
@@ -670,11 +670,11 @@ exports[`PageView component should pass through EuiPage props 1`] = `
exports[`PageView component should use custom element for header left and not wrap in EuiTitle 1`] = `
.c0.endpoint--isListView {
- padding: 0;
+ padding: 0 70px 0 24px;
}
.c0.endpoint--isListView .endpoint-header {
- padding: 24px;
+ padding: 24px 0;
margin-bottom: 0;
}
diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/page_view.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/page_view.tsx
index 6fe15310fc88e..65c536fe12085 100644
--- a/x-pack/plugins/security_solution/public/common/components/endpoint/page_view.tsx
+++ b/x-pack/plugins/security_solution/public/common/components/endpoint/page_view.tsx
@@ -21,13 +21,14 @@ import {
import React, { memo, MouseEventHandler, ReactNode, useMemo } from 'react';
import styled from 'styled-components';
import { EuiTabProps } from '@elastic/eui/src/components/tabs/tab';
+import { gutterTimeline } from '../../lib/helpers';
const StyledEuiPage = styled(EuiPage)`
&.endpoint--isListView {
- padding: 0;
+ padding: 0 ${gutterTimeline} 0 ${(props) => props.theme.eui.euiSizeL};
.endpoint-header {
- padding: ${(props) => props.theme.eui.euiSizeL};
+ padding: ${(props) => props.theme.eui.euiSizeL} 0;
margin-bottom: 0;
}
.endpoint-page-content {
diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx
index 9b0ca73cf021f..a3862d4454c1d 100644
--- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx
@@ -86,7 +86,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => {
title: i18n.translate('xpack.securitySolution.endpoint.host.details.policy', {
defaultMessage: 'Policy',
}),
- description: details.endpoint.policy.id,
+ description: details.endpoint.policy.applied.id,
},
{
title: i18n.translate('xpack.securitySolution.endpoint.host.details.policyStatus', {
@@ -138,10 +138,10 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => {
},
];
}, [
- details.endpoint.policy.id,
- details.host.ip,
- details.host.hostname,
details.agent.version,
+ details.endpoint.policy.applied.id,
+ details.host.hostname,
+ details.host.ip,
policyStatus,
policyResponseUri,
policyStatusClickHandler,
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/action.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/action.ts
index 6866bcbf31f89..e14e39bf45c93 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/action.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/action.ts
@@ -6,6 +6,7 @@
import { PolicyData } from '../../../../../../common/endpoint/types';
import { ServerApiError } from '../../../../../common/types';
+import { GetAgentStatusResponse } from '../../../../../../../ingest_manager/common/types/rest_spec';
interface ServerReturnedPolicyListData {
type: 'serverReturnedPolicyListData';
@@ -22,4 +23,42 @@ interface ServerFailedToReturnPolicyListData {
payload: ServerApiError;
}
-export type PolicyListAction = ServerReturnedPolicyListData | ServerFailedToReturnPolicyListData;
+interface UserClickedPolicyListDeleteButton {
+ type: 'userClickedPolicyListDeleteButton';
+ payload: { policyId: string };
+}
+
+interface UserOpenedPolicyListDeleteModal {
+ type: 'userOpenedPolicyListDeleteModal';
+ payload: { agentConfigId: string };
+}
+
+interface ServerDeletedPolicyFailure {
+ type: 'serverDeletedPolicyFailure';
+ payload: ServerApiError;
+}
+
+interface ServerDeletedPolicy {
+ type: 'serverDeletedPolicy';
+ payload: { id: string; success: boolean };
+}
+
+interface ServerReturnedPolicyAgentsSummaryForDeleteFailure {
+ type: 'serverReturnedPolicyAgentsSummaryForDeleteFailure';
+ payload: ServerApiError;
+}
+
+interface ServerReturnedPolicyAgentsSummaryForDelete {
+ type: 'serverReturnedPolicyAgentsSummaryForDelete';
+ payload: { agentStatusSummary: GetAgentStatusResponse['results'] };
+}
+
+export type PolicyListAction =
+ | ServerReturnedPolicyListData
+ | ServerFailedToReturnPolicyListData
+ | UserClickedPolicyListDeleteButton
+ | ServerDeletedPolicyFailure
+ | ServerDeletedPolicy
+ | UserOpenedPolicyListDeleteModal
+ | ServerReturnedPolicyAgentsSummaryForDeleteFailure
+ | ServerReturnedPolicyAgentsSummaryForDelete;
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/index.test.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/index.test.ts
index a312134bbcd22..ce81c58893a7b 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/index.test.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/index.test.ts
@@ -13,7 +13,12 @@ import { DATASOURCE_SAVED_OBJECT_TYPE } from '../../../../../../../ingest_manage
import { policyListReducer } from './reducer';
import { policyListMiddlewareFactory } from './middleware';
-import { isOnPolicyListPage, selectIsLoading, urlSearchParams } from './selectors';
+import {
+ isOnPolicyListPage,
+ selectIsLoading,
+ urlSearchParams,
+ selectIsDeleting,
+} from './selectors';
import { DepsStartMock, depsStartMock } from '../../../../../common/mock/endpoint';
import { setPolicyListApiMockImplementation } from './test_mock_utils';
import { INGEST_API_DATASOURCES } from './services/ingest';
@@ -85,6 +90,33 @@ describe('policy list store concerns', () => {
expect(selectIsLoading(store.getState())).toBe(false);
});
+ it('it sets `isDeleting` when `userClickedPolicyListDeleteButton`', async () => {
+ expect(selectIsDeleting(store.getState())).toBe(false);
+ store.dispatch({
+ type: 'userClickedPolicyListDeleteButton',
+ payload: {
+ policyId: '123',
+ },
+ });
+ expect(selectIsDeleting(store.getState())).toBe(true);
+ await waitForAction('serverDeletedPolicy');
+ expect(selectIsDeleting(store.getState())).toBe(false);
+ });
+
+ it('it sets refreshes policy data when `serverDeletedPolicy`', async () => {
+ expect(selectIsLoading(store.getState())).toBe(false);
+ store.dispatch({
+ type: 'serverDeletedPolicy',
+ payload: {
+ policyId: '',
+ success: true,
+ },
+ });
+ expect(selectIsLoading(store.getState())).toBe(true);
+ await waitForAction('serverReturnedPolicyListData');
+ expect(selectIsLoading(store.getState())).toBe(false);
+ });
+
it('it resets state on `userChangedUrl` and pathname is NOT `/policy`', async () => {
store.dispatch({
type: 'userChangedUrl',
@@ -108,9 +140,18 @@ describe('policy list store concerns', () => {
location: undefined,
policyItems: [],
isLoading: false,
+ isDeleting: false,
+ deleteStatus: undefined,
pageIndex: 0,
pageSize: 10,
total: 0,
+ agentStatusSummary: {
+ error: 0,
+ events: 0,
+ offline: 0,
+ online: 0,
+ total: 0,
+ },
});
});
it('uses default pagination params when not included in url', async () => {
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/middleware.ts
index 66962c378537f..39c685da3ec46 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/middleware.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/middleware.ts
@@ -5,10 +5,19 @@
*/
import { GetPolicyListResponse, PolicyListState } from '../../types';
-import { sendGetEndpointSpecificDatasources } from './services/ingest';
+import {
+ sendGetEndpointSpecificDatasources,
+ sendDeleteDatasource,
+ sendGetFleetAgentStatusForConfig,
+} from './services/ingest';
import { isOnPolicyListPage, urlSearchParams } from './selectors';
import { ImmutableMiddlewareFactory } from '../../../../../common/store';
import { initialPolicyListState } from './reducer';
+import {
+ DeleteDatasourcesResponse,
+ DeleteDatasourcesRequest,
+ GetAgentStatusResponse,
+} from '../../../../../../../ingest_manager/common';
export const policyListMiddlewareFactory: ImmutableMiddlewareFactory = (
coreStart
@@ -19,7 +28,10 @@ export const policyListMiddlewareFactory: ImmutableMiddlewareFactory Immutable = () => ({
policyItems: [],
isLoading: false,
+ isDeleting: false,
+ deleteStatus: undefined,
apiError: undefined,
pageIndex: 0,
pageSize: 10,
total: 0,
location: undefined,
+ agentStatusSummary: {
+ error: 0,
+ events: 0,
+ offline: 0,
+ online: 0,
+ total: 0,
+ },
});
export const policyListReducer: ImmutableReducer = (
@@ -33,6 +42,7 @@ export const policyListReducer: ImmutableReducer = (
...state,
...action.payload,
isLoading: false,
+ isDeleting: false,
};
}
@@ -41,6 +51,47 @@ export const policyListReducer: ImmutableReducer = (
...state,
apiError: action.payload,
isLoading: false,
+ isDeleting: false,
+ };
+ }
+
+ if (action.type === 'serverDeletedPolicyFailure') {
+ return {
+ ...state,
+ ...action.payload,
+ isLoading: false,
+ isDeleting: false,
+ };
+ }
+
+ if (action.type === 'serverDeletedPolicy') {
+ return {
+ ...state,
+ deleteStatus: action.payload.success,
+ isLoading: true,
+ isDeleting: false,
+ };
+ }
+
+ if (action.type === 'userClickedPolicyListDeleteButton') {
+ return {
+ ...state,
+ isLoading: false,
+ isDeleting: true,
+ };
+ }
+
+ if (action.type === 'serverReturnedPolicyAgentsSummaryForDelete') {
+ return {
+ ...state,
+ ...action.payload,
+ };
+ }
+
+ if (action.type === 'serverReturnedPolicyAgentsSummaryForDeleteFailure') {
+ return {
+ ...state,
+ ...action.payload,
};
}
@@ -60,6 +111,7 @@ export const policyListReducer: ImmutableReducer = (
...newState,
apiError: undefined,
isLoading: true,
+ isDeleting: false,
};
}
return newState;
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/selectors.ts
index c900ceb186f69..089c97b5520a2 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/selectors.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/selectors.ts
@@ -25,6 +25,13 @@ export const selectIsLoading = (state: Immutable) => state.isLo
export const selectApiError = (state: Immutable) => state.apiError;
+export const selectIsDeleting = (state: Immutable) => state.isDeleting;
+
+export const selectDeleteStatus = (state: Immutable) => state.deleteStatus;
+
+export const selectAgentStatusSummary = (state: Immutable) =>
+ state.agentStatusSummary;
+
export const isOnPolicyListPage = (state: Immutable) => {
return (
matchPath(state.location?.pathname ?? '', {
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts
index db482e2a6bdb6..cece3f1b4c8f2 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_list/services/ingest.ts
@@ -8,6 +8,8 @@ import { HttpFetchOptions, HttpStart } from 'kibana/public';
import {
GetDatasourcesRequest,
GetAgentStatusResponse,
+ DeleteDatasourcesResponse,
+ DeleteDatasourcesRequest,
DATASOURCE_SAVED_OBJECT_TYPE,
} from '../../../../../../../../ingest_manager/common';
import { GetPolicyListResponse, GetPolicyResponse, UpdatePolicyResponse } from '../../../types';
@@ -17,6 +19,7 @@ const INGEST_API_ROOT = `/api/ingest_manager`;
export const INGEST_API_DATASOURCES = `${INGEST_API_ROOT}/datasources`;
const INGEST_API_FLEET = `${INGEST_API_ROOT}/fleet`;
const INGEST_API_FLEET_AGENT_STATUS = `${INGEST_API_FLEET}/agent-status`;
+const INGEST_API_DELETE_DATASOURCE = `${INGEST_API_DATASOURCES}/delete`;
/**
* Retrieves a list of endpoint specific datasources (those created with a `package.name` of
@@ -53,6 +56,23 @@ export const sendGetDatasource = (
return http.get(`${INGEST_API_DATASOURCES}/${datasourceId}`, options);
};
+/**
+ * Retrieves a single datasource based on ID from ingest
+ * @param http
+ * @param datasourceId
+ * @param options
+ */
+export const sendDeleteDatasource = (
+ http: HttpStart,
+ body: DeleteDatasourcesRequest,
+ options?: HttpFetchOptions
+) => {
+ return http.post(INGEST_API_DELETE_DATASOURCE, {
+ ...options,
+ body: JSON.stringify(body.body),
+ });
+};
+
/**
* Updates a datasources
*
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
index f8cc0d5cd0508..4d798d3717ce4 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts
@@ -37,6 +37,12 @@ export interface PolicyListState {
isLoading: boolean;
/** current location information */
location?: Immutable;
+ /** policy is being deleted */
+ isDeleting: boolean;
+ /** Deletion status */
+ deleteStatus?: boolean;
+ /** A summary of stats for the agents associated with a given Fleet Agent Configuration */
+ agentStatusSummary?: GetAgentStatusResponse['results'];
}
/**
diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.tsx
index d34a6d2d93893..24254530f75db 100644
--- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.tsx
+++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_list.tsx
@@ -17,12 +17,17 @@ import {
EuiContextMenuItem,
EuiButtonIcon,
EuiContextMenuPanel,
+ EuiOverlayMask,
+ EuiConfirmModal,
+ EuiCallOut,
+ EuiSpacer,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { FormattedMessage } from '@kbn/i18n/react';
import { useDispatch } from 'react-redux';
import { useLocation, useHistory } from 'react-router-dom';
import { createStructuredSelector } from 'reselect';
+import styled from 'styled-components';
import { CreateStructuredSelector } from '../../../../common/store';
import * as selectors from '../store/policy_list/selectors';
import { usePolicyListSelector } from './policy_hooks';
@@ -52,6 +57,10 @@ const NO_WRAP_TRUNCATE_STYLE: CSSProperties = Object.freeze({
whiteSpace: 'nowrap',
});
+const DangerEuiContextMenuItem = styled(EuiContextMenuItem)`
+ color: ${(props) => props.theme.eui.textColors.danger};
+`;
+
// eslint-disable-next-line react/display-name
export const TableRowActions = React.memo<{ items: EuiContextMenuPanelProps['items'] }>(
({ items }) => {
@@ -63,8 +72,10 @@ export const TableRowActions = React.memo<{ items: EuiContextMenuPanelProps['ite
-
+
);
}
@@ -106,6 +117,9 @@ export const PolicyList = React.memo(() => {
const history = useHistory();
const location = useLocation();
+ const [showDelete, setShowDelete] = useState(false);
+ const [policyIdToDelete, setPolicyIdToDelete] = useState('');
+
const dispatch = useDispatch<(action: PolicyListAction) => void>();
const {
selectPolicyItems: policyItems,
@@ -114,6 +128,9 @@ export const PolicyList = React.memo(() => {
selectTotal: totalItemCount,
selectIsLoading: loading,
selectApiError: apiError,
+ selectIsDeleting: isDeleting,
+ selectDeleteStatus: deleteStatus,
+ selectAgentStatusSummary: agentStatusSummary,
} = usePolicyListSelector(selector);
useEffect(() => {
@@ -126,6 +143,38 @@ export const PolicyList = React.memo(() => {
}
}, [apiError, dispatch, notifications.toasts]);
+ // Handle showing update statuses
+ useEffect(() => {
+ if (deleteStatus !== undefined) {
+ if (deleteStatus === true) {
+ setPolicyIdToDelete('');
+ setShowDelete(false);
+ notifications.toasts.success({
+ toastLifeTimeMs: 10000,
+ title: i18n.translate('xpack.securitySolution.endpoint.policyList.deleteSuccessToast', {
+ defaultMessage: 'Success!',
+ }),
+ body: (
+
+ ),
+ });
+ } else {
+ notifications.toasts.danger({
+ toastLifeTimeMs: 10000,
+ title: i18n.translate('xpack.securitySolution.endpoint.policyList.deleteFailedToast', {
+ defaultMessage: 'Failed!',
+ }),
+ body: i18n.translate('xpack.securitySolution.endpoint.policyList.deleteFailedToastBody', {
+ defaultMessage: 'Failed to delete policy',
+ }),
+ });
+ }
+ }
+ }, [notifications.toasts, deleteStatus]);
+
const paginationSetup = useMemo(() => {
return {
pageIndex,
@@ -143,6 +192,36 @@ export const PolicyList = React.memo(() => {
[history, location.pathname]
);
+ const handleDeleteOnClick = useCallback(
+ ({ policyId, agentConfigId }: { policyId: string; agentConfigId: string }) => {
+ dispatch({
+ type: 'userOpenedPolicyListDeleteModal',
+ payload: {
+ agentConfigId,
+ },
+ });
+ setPolicyIdToDelete(policyId);
+ setShowDelete(true);
+ },
+ [dispatch]
+ );
+
+ const handleDeleteConfirmation = useCallback(
+ ({ policyId }: { policyId: string }) => {
+ dispatch({
+ type: 'userClickedPolicyListDeleteButton',
+ payload: {
+ policyId,
+ },
+ });
+ },
+ [dispatch]
+ );
+
+ const handleDeleteCancel = useCallback(() => {
+ setShowDelete(false);
+ }, []);
+
const columns: Array>> = useMemo(
() => [
{
@@ -248,6 +327,19 @@ export const PolicyList = React.memo(() => {
/>
,
+ {
+ handleDeleteOnClick({ agentConfigId: item.config_id, policyId: item.id });
+ }}
+ >
+
+ ,
]}
/>
);
@@ -256,38 +348,122 @@ export const PolicyList = React.memo(() => {
],
},
],
- [services.application]
+ [services.application, handleDeleteOnClick]
);
return (
-
+ <>
+ {showDelete && (
+ {
+ handleDeleteConfirmation({ policyId: policyIdToDelete });
+ }}
+ />
+ )}
+
+
+
+ }
+ >
+ [...policyItems], [policyItems])}
+ columns={columns}
+ loading={loading}
+ pagination={paginationSetup}
+ onChange={handleTableChange}
+ data-test-subj="policyTable"
+ hasActions={false}
+ />
+
+
+ >
+ );
+});
+
+PolicyList.displayName = 'PolicyList';
+
+const ConfirmDelete = React.memo<{
+ hostCount: number;
+ isDeleting: boolean;
+ onConfirm: () => void;
+ onCancel: () => void;
+}>(({ hostCount, isDeleting, onCancel, onConfirm }) => {
+ return (
+
+
+ ) : (
+
+ )
+ }
+ confirmButtonDisabled={isDeleting}
+ cancelButtonText={i18n.translate(
+ 'xpack.securitySolution.endpoint.policyList.deleteConfirm.cancelButtonTitle',
+ {
+ defaultMessage: 'Cancel',
+ }
+ )}
+ >
+ {hostCount > 0 && (
+ <>
+
+
+
+
+ >
+ )}
+
-
- }
- >
- [...policyItems], [policyItems])}
- columns={columns}
- loading={loading}
- pagination={paginationSetup}
- onChange={handleTableChange}
- data-test-subj="policyTable"
- hasActions={false}
- />
-
-
+
+
+
);
});
-PolicyList.displayName = 'PolicyList';
+ConfirmDelete.displayName = 'ConfirmDelete';
diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts
index b2f5866a3ae7d..9b9d4a74e5970 100644
--- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts
+++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts
@@ -27,7 +27,6 @@ import {
} from '../../../../common/endpoint/types';
import { SearchResponse } from 'elasticsearch';
import { registerEndpointRoutes } from './index';
-import * as data from '../../test_data/all_metadata_data.json';
import {
createMockAgentService,
createMockMetadataIndexPatternRetriever,
@@ -37,6 +36,7 @@ import { AgentService } from '../../../../../ingest_manager/server';
import Boom from 'boom';
import { EndpointAppContextService } from '../../endpoint_app_context_services';
import { createMockConfig } from '../../../lib/detection_engine/routes/__mocks__';
+import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data';
describe('test endpoint route', () => {
let routerMock: jest.Mocked;
@@ -78,10 +78,7 @@ describe('test endpoint route', () => {
it('test find the latest of all endpoints', async () => {
const mockRequest = httpServerMock.createKibanaRequest({});
-
- const response: SearchResponse = (data as unknown) as SearchResponse<
- HostMetadata
- >;
+ const response = createSearchResponse(new EndpointDocGenerator().generateHostMetadata());
mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response));
[routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) =>
path.startsWith('/api/endpoint/metadata')
@@ -97,8 +94,8 @@ describe('test endpoint route', () => {
expect(routeConfig.options).toEqual({ authRequired: true });
expect(mockResponse.ok).toBeCalled();
const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList;
- expect(endpointResultList.hosts.length).toEqual(2);
- expect(endpointResultList.total).toEqual(2);
+ expect(endpointResultList.hosts.length).toEqual(1);
+ expect(endpointResultList.total).toEqual(1);
expect(endpointResultList.request_page_index).toEqual(0);
expect(endpointResultList.request_page_size).toEqual(10);
});
@@ -119,7 +116,7 @@ describe('test endpoint route', () => {
mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error');
mockScopedClient.callAsCurrentUser.mockImplementationOnce(() =>
- Promise.resolve((data as unknown) as SearchResponse)
+ Promise.resolve(createSearchResponse(new EndpointDocGenerator().generateHostMetadata()))
);
[routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) =>
path.startsWith('/api/endpoint/metadata')
@@ -138,8 +135,8 @@ describe('test endpoint route', () => {
expect(routeConfig.options).toEqual({ authRequired: true });
expect(mockResponse.ok).toBeCalled();
const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList;
- expect(endpointResultList.hosts.length).toEqual(2);
- expect(endpointResultList.total).toEqual(2);
+ expect(endpointResultList.hosts.length).toEqual(1);
+ expect(endpointResultList.total).toEqual(1);
expect(endpointResultList.request_page_index).toEqual(10);
expect(endpointResultList.request_page_size).toEqual(10);
});
@@ -162,7 +159,7 @@ describe('test endpoint route', () => {
mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error');
mockScopedClient.callAsCurrentUser.mockImplementationOnce(() =>
- Promise.resolve((data as unknown) as SearchResponse)
+ Promise.resolve(createSearchResponse(new EndpointDocGenerator().generateHostMetadata()))
);
[routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) =>
path.startsWith('/api/endpoint/metadata')
@@ -194,8 +191,8 @@ describe('test endpoint route', () => {
expect(routeConfig.options).toEqual({ authRequired: true });
expect(mockResponse.ok).toBeCalled();
const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList;
- expect(endpointResultList.hosts.length).toEqual(2);
- expect(endpointResultList.total).toEqual(2);
+ expect(endpointResultList.hosts.length).toEqual(1);
+ expect(endpointResultList.total).toEqual(1);
expect(endpointResultList.request_page_index).toEqual(10);
expect(endpointResultList.request_page_size).toEqual(10);
});
@@ -203,25 +200,9 @@ describe('test endpoint route', () => {
describe('Endpoint Details route', () => {
it('should return 404 on no results', async () => {
const mockRequest = httpServerMock.createKibanaRequest({ params: { id: 'BADID' } });
+
mockScopedClient.callAsCurrentUser.mockImplementationOnce(() =>
- Promise.resolve({
- took: 3,
- timed_out: false,
- _shards: {
- total: 1,
- successful: 1,
- skipped: 0,
- failed: 0,
- },
- hits: {
- total: {
- value: 9,
- relation: 'eq',
- },
- max_score: null,
- hits: [],
- },
- })
+ Promise.resolve(createSearchResponse())
);
mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error');
[routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) =>
@@ -241,13 +222,10 @@ describe('test endpoint route', () => {
});
it('should return a single endpoint with status online', async () => {
+ const response = createSearchResponse(new EndpointDocGenerator().generateHostMetadata());
const mockRequest = httpServerMock.createKibanaRequest({
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- params: { id: (data as any).hits.hits[0]._id },
+ params: { id: response.hits.hits[0]._id },
});
- const response: SearchResponse = (data as unknown) as SearchResponse<
- HostMetadata
- >;
mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('online');
mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response));
[routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) =>
@@ -269,9 +247,7 @@ describe('test endpoint route', () => {
});
it('should return a single endpoint with status error when AgentService throw 404', async () => {
- const response: SearchResponse = (data as unknown) as SearchResponse<
- HostMetadata
- >;
+ const response = createSearchResponse(new EndpointDocGenerator().generateHostMetadata());
const mockRequest = httpServerMock.createKibanaRequest({
params: { id: response.hits.hits[0]._id },
@@ -299,9 +275,7 @@ describe('test endpoint route', () => {
});
it('should return a single endpoint with status error when status is not offline or online', async () => {
- const response: SearchResponse = (data as unknown) as SearchResponse<
- HostMetadata
- >;
+ const response = createSearchResponse(new EndpointDocGenerator().generateHostMetadata());
const mockRequest = httpServerMock.createKibanaRequest({
params: { id: response.hits.hits[0]._id },
@@ -327,3 +301,59 @@ describe('test endpoint route', () => {
});
});
});
+
+function createSearchResponse(hostMetadata?: HostMetadata): SearchResponse {
+ return ({
+ took: 15,
+ timed_out: false,
+ _shards: {
+ total: 1,
+ successful: 1,
+ skipped: 0,
+ failed: 0,
+ },
+ hits: {
+ total: {
+ value: 5,
+ relation: 'eq',
+ },
+ max_score: null,
+ hits: hostMetadata
+ ? [
+ {
+ _index: 'metrics-endpoint.metadata-default-1',
+ _id: '8FhM0HEBYyRTvb6lOQnw',
+ _score: null,
+ _source: hostMetadata,
+ sort: [1588337587997],
+ inner_hits: {
+ most_recent: {
+ hits: {
+ total: {
+ value: 2,
+ relation: 'eq',
+ },
+ max_score: null,
+ hits: [
+ {
+ _index: 'metrics-endpoint.metadata-default-1',
+ _id: 'W6Vo1G8BYQH1gtPUgYkC',
+ _score: null,
+ _source: hostMetadata,
+ sort: [1579816615336],
+ },
+ ],
+ },
+ },
+ },
+ },
+ ]
+ : [],
+ },
+ aggregations: {
+ total: {
+ value: 1,
+ },
+ },
+ } as unknown) as SearchResponse;
+}
diff --git a/x-pack/plugins/security_solution/server/endpoint/test_data/all_metadata_data.json b/x-pack/plugins/security_solution/server/endpoint/test_data/all_metadata_data.json
deleted file mode 100644
index 48952afb33f68..0000000000000
--- a/x-pack/plugins/security_solution/server/endpoint/test_data/all_metadata_data.json
+++ /dev/null
@@ -1,216 +0,0 @@
-{
- "took": 343,
- "timed_out": false,
- "_shards": {
- "total": 1,
- "successful": 1,
- "skipped": 0,
- "failed": 0
- },
- "hits": {
- "total": {
- "value": 4,
- "relation": "eq"
- },
- "max_score": null,
- "hits": [
- {
- "_index": "metadata-endpoint-default-1",
- "_id": "WqVo1G8BYQH1gtPUgYkC",
- "_score": null,
- "_source": {
- "@timestamp": 1579816615336,
- "event": {
- "created": "2020-01-23T21:56:55.336Z"
- },
- "elastic": {
- "agent": {
- "id": "56a75650-3c8a-4e4f-ac17-6dd729c650e2"
- }
- },
- "endpoint": {
- "policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
- }
- },
- "agent": {
- "version": "6.8.3",
- "id": "56a75650-3c8a-4e4f-ac17-6dd729c650e2",
- "name": "Elastic Endpoint"
- },
- "host": {
- "id": "7141a48b-e19f-4ae3-89a0-6e7179a84265",
- "hostname": "larimer-0.example.com",
- "ip": "10.21.48.136",
- "mac": "77-be-30-f0-e8-d6",
- "architecture": "x86_64",
- "os": {
- "name": "windows 6.2",
- "full": "Windows Server 2012",
- "version": "6.2",
- "variant": "Windows Server"
- }
- }
- },
- "fields": {
- "host.id.keyword": ["7141a48b-e19f-4ae3-89a0-6e7179a84265"]
- },
- "sort": [1579816615336],
- "inner_hits": {
- "most_recent": {
- "hits": {
- "total": {
- "value": 2,
- "relation": "eq"
- },
- "max_score": null,
- "hits": [
- {
- "_index": "metadata-endpoint-default-1",
- "_id": "WqVo1G8BYQH1gtPUgYkC",
- "_score": null,
- "_source": {
- "@timestamp": 1579816615336,
- "event": {
- "created": "2020-01-23T21:56:55.336Z"
- },
- "elastic": {
- "agent": {
- "id": "56a75650-3c8a-4e4f-ac17-6dd729c650e2"
- }
- },
- "endpoint": {
- "policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
- }
- },
- "agent": {
- "version": "6.8.3",
- "id": "56a75650-3c8a-4e4f-ac17-6dd729c650e2",
- "name": "Elastic Endpoint"
- },
- "host": {
- "id": "7141a48b-e19f-4ae3-89a0-6e7179a84265",
- "hostname": "larimer-0.example.com",
- "ip": "10.21.48.136",
- "mac": "77-be-30-f0-e8-d6",
- "architecture": "x86_64",
- "os": {
- "name": "windows 6.2",
- "full": "Windows Server 2012",
- "version": "6.2",
- "variant": "Windows Server"
- }
- }
- },
- "sort": [1579816615336]
- }
- ]
- }
- }
- }
- },
- {
- "_index": "metadata-endpoint-default-1",
- "_id": "W6Vo1G8BYQH1gtPUgYkC",
- "_score": null,
- "_source": {
- "@timestamp": 1579816615336,
- "event": {
- "created": "2020-01-23T21:56:55.336Z"
- },
- "elastic": {
- "agent": {
- "id": "c2d84d8f-d355-40de-8b54-5d318d4d1312"
- }
- },
- "endpoint": {
- "policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
- }
- },
- "agent": {
- "version": "6.4.3",
- "id": "c2d84d8f-d355-40de-8b54-5d318d4d1312",
- "name": "Elastic Endpoint"
- },
- "host": {
- "id": "f35ec6c1-6562-45b1-818f-2f14c0854adf",
- "hostname": "hildebrandt-6.example.com",
- "ip": "10.53.92.84",
- "mac": "af-f1-8f-51-25-2a",
- "architecture": "x86_64",
- "os": {
- "name": "windows 10.0",
- "full": "Windows 10",
- "version": "10.0",
- "variant": "Windows Pro"
- }
- }
- },
- "fields": {
- "host.id.keyword": ["f35ec6c1-6562-45b1-818f-2f14c0854adf"]
- },
- "sort": [1579816615336],
- "inner_hits": {
- "most_recent": {
- "hits": {
- "total": {
- "value": 2,
- "relation": "eq"
- },
- "max_score": null,
- "hits": [
- {
- "_index": "metadata-endpoint-default-1",
- "_id": "W6Vo1G8BYQH1gtPUgYkC",
- "_score": null,
- "_source": {
- "@timestamp": 1579816615336,
- "event": {
- "created": "2020-01-23T21:56:55.336Z"
- },
- "elastic": {
- "agent": {
- "id": "c2d84d8f-d355-40de-8b54-5d318d4d1312"
- }
- },
- "endpoint": {
- "policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
- }
- },
- "agent": {
- "version": "6.4.3",
- "id": "c2d84d8f-d355-40de-8b54-5d318d4d1312",
- "name": "Elastic Endpoint"
- },
- "host": {
- "id": "f35ec6c1-6562-45b1-818f-2f14c0854adf",
- "hostname": "hildebrandt-6.example.com",
- "ip": "10.53.92.84",
- "mac": "af-f1-8f-51-25-2a",
- "architecture": "x86_64",
- "os": {
- "name": "windows 10.0",
- "full": "Windows 10",
- "version": "10.0",
- "variant": "Windows Pro"
- }
- }
- },
- "sort": [1579816615336]
- }
- ]
- }
- }
- }
- }
- ]
- },
- "aggregations": {
- "total": {
- "value": 2
- }
- }
-}
diff --git a/x-pack/test/api_integration/apis/endpoint/metadata.ts b/x-pack/test/api_integration/apis/endpoint/metadata.ts
index 6c6db10729ab6..61f294cbd6f9c 100644
--- a/x-pack/test/api_integration/apis/endpoint/metadata.ts
+++ b/x-pack/test/api_integration/apis/endpoint/metadata.ts
@@ -199,6 +199,24 @@ export default function ({ getService }: FtrProviderContext) {
expect(body.request_page_index).to.eql(0);
});
+ it('metadata api should return the latest event for all the events where policy status is not success', async () => {
+ const { body } = await supertest
+ .post('/api/endpoint/metadata')
+ .set('kbn-xsrf', 'xxx')
+ .send({
+ filter: `not endpoint.policy.applied.status:success`,
+ })
+ .expect(200);
+ const statuses: Set = new Set(
+ body.hosts.map(
+ (hostInfo: Record) => hostInfo.metadata.endpoint.policy.applied.status
+ )
+ );
+
+ expect(statuses.size).to.eql(1);
+ expect(Array.from(statuses)).to.eql(['failure']);
+ });
+
it('metadata api should return the endpoint based on the elastic agent id, and status should be error', async () => {
const targetEndpointId = 'fc0ff548-feba-41b6-8367-65e8790d0eaf';
const targetElasticAgentId = '023fa40c-411d-4188-a941-4147bfadd095';
diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts
index 10ab35714b1ce..56b4ec45b42b7 100644
--- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts
+++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts
@@ -338,5 +338,20 @@ export default function ({ getService }: FtrProviderContext) {
expect(body.errors[0].error.msg).to.contain('index_template_missing_exception');
});
});
+
+ describe('Privileges', () => {
+ it('should return privileges result', async () => {
+ const uri = `${API_BASE_PATH}/component_templates/privileges`;
+
+ const { body } = await supertest.get(uri).set('kbn-xsrf', 'xxx').expect(200);
+
+ expect(body).to.eql({
+ hasAllPrivileges: true,
+ missingPrivileges: {
+ cluster: [],
+ },
+ });
+ });
+ });
});
}
diff --git a/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz b/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz
index 49082ed3bec8b..2921abededde5 100644
Binary files a/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz and b/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz differ
diff --git a/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json b/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json
index 0f9f86b36dec7..a8d868ebbec15 100644
--- a/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json
+++ b/x-pack/test/functional/es_archives/endpoint/metadata/api_feature/data.json
@@ -17,7 +17,11 @@
},
"endpoint": {
"policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
+ "applied": {
+ "name": "Default",
+ "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A",
+ "status": "failure"
+ }
}
},
"event": {
@@ -66,7 +70,11 @@
},
"endpoint": {
"policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
+ "applied": {
+ "name": "Default",
+ "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A",
+ "status": "success"
+ }
}
},
"event": {
@@ -114,7 +122,11 @@
},
"endpoint": {
"policy": {
- "id": "00000000-0000-0000-0000-000000000000"
+ "applied": {
+ "name": "Default",
+ "id": "00000000-0000-0000-0000-000000000000",
+ "status": "failure"
+ }
}
},
"event": {
@@ -160,7 +172,11 @@
},
"endpoint": {
"policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
+ "applied": {
+ "name": "Default",
+ "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A",
+ "status": "failure"
+ }
}
},
"event": {
@@ -209,7 +225,11 @@
},
"endpoint": {
"policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
+ "applied": {
+ "name": "Default",
+ "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A",
+ "status": "success"
+ }
}
},
"event": {
@@ -256,7 +276,11 @@
},
"endpoint": {
"policy": {
- "id": "00000000-0000-0000-0000-000000000000"
+ "applied": {
+ "name": "With Eventing",
+ "id": "00000000-0000-0000-0000-000000000000",
+ "status": "failure"
+ }
}
},
"event": {
@@ -303,7 +327,11 @@
},
"endpoint": {
"policy": {
- "id": "00000000-0000-0000-0000-000000000000"
+ "applied": {
+ "name": "With Eventing",
+ "id": "00000000-0000-0000-0000-000000000000",
+ "status": "failure"
+ }
}
},
"event": {
@@ -351,7 +379,11 @@
},
"endpoint": {
"policy": {
- "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A"
+ "applied": {
+ "name": "Default",
+ "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A",
+ "status": "success"
+ }
}
},
"event": {
@@ -398,7 +430,11 @@
},
"endpoint": {
"policy": {
- "id": "00000000-0000-0000-0000-000000000000"
+ "applied": {
+ "name": "With Eventing",
+ "id": "00000000-0000-0000-0000-000000000000",
+ "status": "success"
+ }
}
},
"event": {
diff --git a/x-pack/test/functional/es_archives/endpoint/policy/data.json.gz b/x-pack/test/functional/es_archives/endpoint/policy/data.json.gz
index 2fab424d27cad..f380785f021bb 100644
Binary files a/x-pack/test/functional/es_archives/endpoint/policy/data.json.gz and b/x-pack/test/functional/es_archives/endpoint/policy/data.json.gz differ
diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_list.ts
index a5efd604d63ee..7ce1a07ad5a17 100644
--- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_list.ts
+++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_list.ts
@@ -81,12 +81,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
expect(relativeDate).to.match(RELATIVE_DATE_FORMAT);
});
});
- it('should show policy name as link', async () => {
- const policyNameLink = await testSubjects.find('policyNameLink');
- expect(await policyNameLink.getTagName()).to.equal('a');
- expect(await policyNameLink.getAttribute('href')).to.match(
- new RegExp(`\/management\/policy\/${policyInfo.datasource.id}$`)
+
+ it('should show agent config action as a link', async () => {
+ await (await pageObjects.policy.findFirstActionsButton()).click();
+ const agentConfigLink = await testSubjects.find('agentConfigLink');
+ expect(await agentConfigLink.getAttribute('href')).to.match(
+ new RegExp(`\/ingestManager#\/configs\/${policyInfo.agentConfig.id}$`)
);
+ // Close action menu
+ await (await pageObjects.policy.findFirstActionsButton()).click();
+ });
+
+ it('should delete a policy', async () => {
+ await pageObjects.policy.launchAndFindDeleteModal();
+ await testSubjects.existOrFail('policyListDeleteModal');
+ await pageObjects.common.clickConfirmOnModal();
+ await pageObjects.endpoint.waitForTableToNotHaveData('policyTable');
+ const policyTotal = await testSubjects.getVisibleText('policyTotalCount');
+ expect(policyTotal).to.equal('0 Policies');
});
});
});
diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts
index 0f1c9527b717b..830c5ec5a42d1 100644
--- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts
+++ b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts
@@ -33,6 +33,16 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider
});
},
+ async waitForTableToNotHaveData(dataTestSubj: string) {
+ await retry.waitForWithTimeout('table to not have data', 2000, async () => {
+ const tableData = await pageObjects.endpointPageUtils.tableData(dataTestSubj);
+ if (tableData[1][0] === 'No items found') {
+ return true;
+ }
+ return false;
+ });
+ },
+
async waitForVisibleTextToChange(dataTestSubj: string, currentText: string) {
await retry.waitForWithTimeout('visible text to change', 2000, async () => {
const detailFlyoutTitle = await testSubjects.getVisibleText(dataTestSubj);
diff --git a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts
index aa9c5361de846..eb481cdfc99c4 100644
--- a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts
+++ b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts
@@ -19,6 +19,32 @@ export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrPr
await pageObjects.header.waitUntilLoadingHasFinished();
},
+ /**
+ * Finds and returns the Policy Details Page Save button
+ */
+ async findFirstActionsButton() {
+ await this.ensureIsOnPolicyPage();
+ return (await testSubjects.findAll('policyActionsButton'))[0];
+ },
+
+ /**
+ * Finds and returns the Policy Details Page Save button
+ */
+ async launchAndFindDeleteModal() {
+ const actionsButton = await this.findFirstActionsButton();
+ await actionsButton.click();
+ const deleteAction = await testSubjects.find('policyDeleteButton');
+ await deleteAction.click();
+ return await testSubjects.find('policyListDeleteModal');
+ },
+
+ /**
+ * ensures that the Policy Page is the currently display view
+ */
+ async ensureIsOnPolicyPage() {
+ await testSubjects.existOrFail('policyTable');
+ },
+
/**
* Navigates to the Endpoint Policy Details page
*