## Summary
Previously the data plugin relied on the data view plugin to load saved
searches since the saved searches depend upon the data plugin and
circular dependencies needed to be avoided. This is innovative and
perhaps a bit crazy.
What this PR does
- Data view api no longer loads saved searches, removing browser saved
object client usage
- Moves `kibana_context` expression and getKibanaContext function from
data plugin to saved search plugin since it loads saved searches
- Rename data views `SavedObjectsClientCommon` to `PersistenceAPI` -
this is the abstraction around saved object loading that no longer is
exclusive to the saved objects api.
- Adds saved search server api (plugin contract) for loading saved
searches.
- Functional tests on browser and server for kibana_context expression
when loading saved searches
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary
Part of https://github.com/elastic/kibana/issues/158802
We decided that in the case we don't render a Lens suggestion (for
example when we have the SELECT * case) to render the histogram.
**Reminder**: Histogram makes sense only of there is a time field. For
text based mode, time field exists **ONLY** if there is the @timestamp
field.
I don't allow navigation to Lens or open the edit flyout in this case.
When the edit flyout allows the editing of the form based visualizations
(such as histogram) I will enable it then.
FTs have been changed to accomodate this change.
<img width="1751" alt="image"
src="3d28d881-bc60-43de-acf8-8cbcd172a3df">
### Checklist
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
## Summary
Run Real Endpoint Cypress E2E on CI using Vagrant
---------
Co-authored-by: Tomasz Ciecierski <ciecierskitomek@gmail.com>
Co-authored-by: Ashokaditya <am.struktr@gmail.com>
closes https://github.com/elastic/kibana/issues/161428
PR also updates examples title. Instead of naming the embeddable used,
the title now reflects what the example demonstrates.
* "Hello world embeddable" -> "Render embeddable"
* "Todo embeddable" -> "Update embeddable state"
* "List container embeddable" -> "Groups of embeddables"
* "Dynamically adding children to a container" -> "Context menu"
There is a lot more that could be done to enhance these examples, but I
did not want to get more side tracked then I already did.
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary
This PR fixes few issues occurring while running FTR API tests against
actual serverless project.
How to run:
```
TEST_CLOUD=1 ES_SECURITY_ENABLED=1 NODE_TLS_REJECT_UNAUTHORIZED=0 TEST_ES_URL=<your_es_url_with_credentials> TEST_KIBANA_URL=<your_es_url_with_credentials> node --no-warnings scripts/functional_test_runner --es-version=8.9.0 --config x-pack/test_serverless/api_integration/test_suites/search/config.ts --bail
```
The first error is faced during Elasticsearch version validation
```
ERROR Error: attempted to use the "es" service to fetch Elasticsearch version info but the request failed: ResponseError: {"ok":false,"message":"Unknown resource."}
at SniffingTransport.request (/Users/dmle/github/kibana/node_modules/@elastic/transport/src/Transport.ts:535:17)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at Client.InfoApi [as info] (/Users/dmle/github/kibana/node_modules/@elastic/elasticsearch/src/api/api/info.ts:60:10)
at FunctionalTestRunner.validateEsVersion (functional_test_runner.ts:129:16)
at functional_test_runner.ts:64:11
at FunctionalTestRunner.runHarness (functional_test_runner.ts:251:14)
at FunctionalTestRunner.run (functional_test_runner.ts:48:12)
at log.defaultLevel (cli.ts:112:32)
at run.ts:70:7
at withProcRunner (with_proc_runner.ts:29:5)
at run (run.ts:69:5)
at FunctionalTestRunner.validateEsVersion (functional_test_runner.ts:131:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at functional_test_runner.ts:64:11
at FunctionalTestRunner.runHarness (functional_test_runner.ts:251:14)
at FunctionalTestRunner.run (functional_test_runner.ts:48:12)
at log.defaultLevel (cli.ts:112:32)
at run.ts:70:7
at withProcRunner (with_proc_runner.ts:29:5)
at run (run.ts:69:5)
```
Since there is no version term in case of serverless, we can skip
version check by using newly added to FTR schema `serverless` property
(`false` by default). It is set to `true` in root FTR config
`/shared/config.base`.
The next error is related to ESArchiver relying on `ES` FTR service to
provide ESClient.
```
ResponseError: security_exception
│ Root causes:
│ security_exception: unable to authenticate user [system_indices_superuser] for REST request [/kibana_sample_data_flights]
```
It is fixed by using the default user (from host url) instead of
`system_indices_superuser` we use in stateful run.
## Summary
Managing large number of saved objects can be cumbersome. This api
endpoint allows the management of references without clicking through a
lot of different UIs.
For example -
This swaps all data view id `abcd-efg` references to `xyz-123`
```
POST /api/data_views/swap_references
{
"from_id" : "abcd-efg",
"to_id" : "xyz-123",
"preview" : false, // optional, necessary to save changes
"delete" : true // optional, removes data view which is no longer referenced
}
returns
{
preview: false,
result: [{ id: "123", type: "visualization" }],
deleteSuccess: true
}
```
Additional params -
```
from_type: string - specify the saved object type. Default is `index-pattern` for data view
for_id: string | string[] - limit the affected saved objects to one or more by id
for_type: string - limit the affected saved objects by type
```
Closes https://github.com/elastic/kibana/issues/153806
## Summary
Under some circumstances passing `override` to `POST
/api/data_views/data_view` would fail. Its now fixed.
To test - Try using the override param from the Kibana dev console. I
found it reproduced the problem before the fix and shows its resolved
after the fix. The problem did not appear in the integration tests.
I suspect the problem had to do with how quickly the delete was
performed - if it completed before the create command then everything
was fine. If it didn't then the error would appear. Passing the
overwrite param to the saved object client eliminates the possibility of
the delete failing to complete.
Closes https://github.com/elastic/kibana/issues/161016
## Summary
Sometimes browser/driver process dies during test run on CI and FTR
fails with errors cascade, good example is
[here](https://buildkite.com/elastic/kibana-pull-request/builds/138535#0188fd74-9adf-4011-8168-1bdc6e3d0f17)
Current behaviour on `main`: FTR lifecycle hooks, defined in
[remote](57aea91fae/test/functional/services/remote/remote.ts)
service, has no access to the information about test suite run and
particular test failure. These hooks are related to WebDriver (browser)
state management and suppose to reset it to default state.
Currently we silently fail screenshot taking which means tests execution
is continued even if `--bail` flag is passed. It ends with cascade of
failures with the same error `NoSuchSessionError: invalid session id`
<details>
<summary>FTR output on failure</summary>
```
└- ✖ fail: discover/group1 discover test query should show correct time range string by timepicker
│ Error: expected 'Sep 19, 2015 @ 06:31:44.000' to equal 'Sep 23, 2015 @ 18:31:44.000'
│ at Assertion.assert (expect.js💯11)
│ at Assertion.apply (expect.js:227:8)
│ at Assertion.be (expect.js:69:22)
│ at Context.<anonymous> (_discover.ts:53:31)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Object.apply (wrap_function.js:73:16)
│
│
└-> "after all" hook: afterTestSuite.trigger for "should reload the saved search with persisted query to show the initial hit count"
└- ✖ fail: discover/group1 discover test query "after all" hook: afterTestSuite.trigger for "should reload the saved search with persisted query to show the initial hit count"
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
│
│
└-> "after all" hook in "discover test"
│ debg Cleaning all saved objects { space: undefined }
│ succ deleted 2 objects
└-> "after all" hook: afterTestSuite.trigger in "discover test"
└- ✖ fail: discover/group1 discover test "after all" hook: afterTestSuite.trigger in "discover test"
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
│
│
└-> "after all" hook: unloadMakelogs in "discover/group1"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Unloading indices from "mappings.json"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.22"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.20"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.21"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Unloading indices from "data.json.gz"
└-> "after all" hook: afterTestSuite.trigger in "discover/group1"
└- ✖ fail: discover/group1 "after all" hook: afterTestSuite.trigger in "discover/group1"
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at runMicrotasks (<anonymous>)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
│
│
│
│0 passing (15.7s)
│4 failing
│
│1) discover/group1
│ discover test
│ query
│ should show correct time range string by timepicker:
│
│ Error: expected 'Sep 19, 2015 @ 06:31:44.000' to equal 'Sep 23, 2015 @ 18:31:44.000'
│ at Assertion.assert (expect.js💯11)
│ at Assertion.apply (expect.js:227:8)
│ at Assertion.be (expect.js:69:22)
│ at Context.<anonymous> (_discover.ts:53:31)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Object.apply (wrap_function.js:73:16)
│
│
│2) discover/group1
│ discover test
│ query
│ "after all" hook: afterTestSuite.trigger for "should reload the saved search with persisted query to show the initial hit count":
│
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
│
│
│3) discover/group1
│ discover test
│ "after all" hook: afterTestSuite.trigger in "discover test":
│
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
│
│
│4) discover/group1
│ "after all" hook: afterTestSuite.trigger in "discover/group1":
│
│ NoSuchSessionError: invalid session id
│ at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:524:15)
│ at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:601:13)
│ at Executor.execute (node_modules/selenium-webdriver/lib/http.js:529:28)
│ at runMicrotasks (<anonymous>)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Task.exec (prevent_parallel_calls.ts:28:20)
```
</details>
This PR change: I didn't find a good reason why we need to fail silently
on screenshot taking. I added a check WebDriver session status with
`hasOpenWindow` and take failure artefacts only if is still valid.
Next change is to fail FTR after hooks related to WebDriver silently:
there is no help having cascade of the repeated stacktrace so I wrap
WebDriver call in hooks with `tryWebDriverCall` that catches the error
and only prints it for visibility.
<details>
<summary>FTR new output on failure</summary>
```
│ERROR WebDriver session is no longer valid.
│ Probably Chrome process crashed when it tried to use more memory than what was available.
│ERROR Browser is closed, no artifacts were captured for the failure
└- ✖ fail: discover/group1 discover test query should show correct time range string by timepicker
│ Error: expected 'Sep 19, 2015 @ 06:31:44.000' to equal 'Sep 23, 2015 @ 18:31:44.000'
│ at Assertion.assert (expect.js💯11)
│ at Assertion.apply (expect.js:227:8)
│ at Assertion.be (expect.js:69:22)
│ at Context.<anonymous> (_discover.ts:53:31)
│ at processTicksAndRejections (node:internal/process/task_queues:96:5)
│ at Object.apply (wrap_function.js:73:16)
│
│
└-> "after all" hook: afterTestSuite.trigger for "should reload the saved search with persisted query to show the initial hit count"
│ERROR WebDriver session is no longer valid
└-> "after all" hook in "discover test"
│ debg Cleaning all saved objects { space: undefined }
│ warn browser[SEVERE] ERROR FETCHING BROWSR LOGS: This driver instance does not have a valid session ID (did you call WebDriver.quit()?) and may no longer be used.
│ succ deleted 2 objects
└-> "after all" hook: afterTestSuite.trigger in "discover test"
│ERROR WebDriver session is no longer valid
└-> "after all" hook: unloadMakelogs in "discover/group1"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Unloading indices from "mappings.json"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.22"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.20"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Deleted existing index "logstash-2015.09.21"
│ info [test/functional/fixtures/es_archiver/logstash_functional] Unloading indices from "data.json.gz"
└-> "after all" hook: afterTestSuite.trigger in "discover/group1"
│ERROR WebDriver session is no longer valid
0 passing (16.2s)
1 failing
1) discover/group1
discover test
query
should show correct time range string by timepicker:
Error: expected 'Sep 19, 2015 @ 06:31:44.000' to equal 'Sep 23, 2015 @ 18:31:44.000'
at Assertion.assert (expect.js💯11)
at Assertion.apply (expect.js:227:8)
at Assertion.be (expect.js:69:22)
at Context.<anonymous> (_discover.ts:53:31)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at Object.apply (wrap_function.js:73:16)
```
</details>
Flaky-test-runner verification: started 100x to hopefully catch invalid
session on CI
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/2539
Note: locally I was simulating it by calling `this.driver.close()` to
close browser before screenshot taking
Resolves https://github.com/elastic/kibana/issues/159392
## Summary
This PR hides the feature visibility section on the space management
screen and disables adding `disabledFeatures` when creating or updating
spaces using the REST API or spaces client on serverless.
## Screenshot

## Testing
1. Start Kibana in serverless mode: `yarn start --serverless`
2. Edit default space and observe that the feature visibility section is
not rendered
3. Quit Kibana and restart using classic mode: `yarn start`
4. Edit default space and observe that the feature visibility section is
rendered correctly
5. Other considerations:
- Disabling feature visibility in the classic offering should throw an
error (`xpack.spaces.allowFeatureVisibility: false`)
- Enabling feature visibility on serverless should throw an error
(`xpack.spaces.allowFeatureVisibility: true`)
## Summary
Closes#154500.
Closes https://github.com/elastic/kibana/issues/114206.
This updates the UX around cloning dashboards. I removed the clone
confirm model, so cloning a dashboard is just a one click action now.
This aligns with how other apps like ML handle cloning. I've also made
the dashboard title breadcrumb a button in edit mode that opens the
dashboard settings flyout for better discoverability.
4f5ea117-a5e4-4ec5-9113-8b09fd8c84a1
I also changed the pattern for cloned dashboard title from `Dashboard
Title Copy` to `Dashboard Title (#)`.
<img width="1226" alt="Screenshot 2023-06-30 at 1 03 35 PM"
src="b50ba5c6-dc95-4aab-a320-b1a78b74c1b6">
## Summary
Previously - If you changed a data view's index pattern AND the new
pattern didn't contain the timestamp field, you'd see a blank timestamp
field and it would let you save. The data view would have been saved
with the previous timestamp field which doesn't exist.
Now - The timestamp validator checks to make sure the selected timestamp
field is in the list of available options. This is helpful because it
keeps the previous timestamp value in case you do select an index
pattern that contains it.
Closes: https://github.com/elastic/kibana/issues/150219
- Closes https://github.com/elastic/kibana/issues/150317
## Summary
This PR:
- hides "Use without saving" button from NoData screen on Discover page
to align with Dashboard and Lens behaviour
- allows to open a saved search via URL even if there are no data views
present (before NoData screen was shown instead).
## Summary
Composite runtime fields with dots in the name were broken, now fixed.
To verify -
1. Create runtime field with dot in the name
2. Make a composite runtime field with subfields with dot in the name
3. Go back and edit those fields
Closes: https://github.com/elastic/kibana/issues/159648
### Release note
Fixes creation and editing of composite runtime fields with dots in the
names.
## Summary
- Move field preview to internal route
- Add versioning to route
- Endpoint is called with version
- Response schema validation
Closes https://github.com/elastic/kibana/issues/159158
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
## Summary
Attempt to fix https://github.com/elastic/kibana/issues/156581
The best explanation I have is that the two retrieved visualisations are
not necessarily retrieved in the expected order.
Sorting the results should ensure the expected order.
Will use the flaky test runner to check the fix.
## Summary
While splitting `test/functional/apps/dashboard/group2/config.ts` in
#160612, I noticed that some tests (`it` function level) takes 30-45
seconds though having little actions to do in Kibana.
After closer look I found that:
- `await PageObjects.dashboard.clickNewDashboard();` call takes ~13-15
seconds when dashboard is empty
- `await dashboardAddPanel.closeAddPanel();` call takes ~12 seconds when
there are no flyouts displayed
Expected improvement:
- `await PageObjects.dashboard.clickNewDashboard()` call takes **2**
seconds, used **103** times in tests.
- `await dashboardAddPanel.closeAddPanel()` call takes **3** seconds,
used **21** times in tests.
PR FTR configs runtime
<img width="778" alt="image"
src="673fee19-91ef-4bc3-9848-5f844b42774c">
`main` branch last 3 days avg configs runtime
<img width="1555" alt="image"
src="6e364cb9-c786-411a-9491-a749351f4c94">
flaky test runner 50x for 6 most affected configs
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/2519
## Summary
Splitting `test/functional/apps/dashboard/group2/config.ts` as it
getting close to 35 minutes and quite often run on its own on CI worker.
<img width="1713" alt="image"
src="ac7f5dc6-2a12-4057-af98-81ff53bac1c4">`
This PR splits config into 2 almost run time equal groups:
- test/functional/apps/dashboard/group2/config.ts 18m 31s
- test/functional/apps/dashboard/group6/config.ts 16m 53s
Flaky-test-runner for both configs:
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/2522
## Summary
This updates connector tiles for Enterprise Search to bring them in line
with 8.9.
<img width="1032" alt="Screenshot 2023-06-26 at 16 26 40"
src="a222a2a3-17ad-4e72-8ce8-57e09d89d05e">
<img width="1035" alt="Screenshot 2023-06-26 at 16 25 04"
src="3ce1e78c-b4fe-404b-b314-e02f3d6f439e">
<img width="1086" alt="Screenshot 2023-06-26 at 16 24 40"
src="14dd6ca5-875f-4c2d-9408-a2fa15abbbec">
---------
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
Optimize switch to text-based queries by reducing unnecessary EuiDataGrid renderings and addressing performance regression. Introduce a PARTIAL state emission in the document$ observable for text-based query results. This state indicates ongoing loading in the UI. The appState to URL changes hook completes with the COMPLETE state submission to document$, enabling UI rendering.
Co-authored-by: Davis McPhee <davismcphee@hotmail.com>
## Summary
Related to #159582
To better understand the PR, we need to have a look at `esArchiver.load`
function and how it handles `mappings.json`:
- It processes the file and if it finds saved object index (e.g.
`.kibana`), it will delete all SO indexes (.kibana,
.kibana_task_manager, .kibana_alerting_cases, etc.) created on Kibana
start. Then esArchiver will re-create all indexes according to defined
mappings.
In order to keep our tests relevant to the latest code changes, it is
good to avoid re-creating SO indexes and use "official" ones whenever it
is possible. This PR removes/cleans `mappings.json` files where it seems
reasonable. I also deleted few not used archives:
- es_archiver/saved_objects/ui_counters
- es_archiver/saved_objects/usage_counters
- security_solution_cypress/es_archives/empty_kibana
## Summary
Why?
To simplify the process of migration to react-router@6.
https://github.com/remix-run/react-router/discussions/8753
What problems exactly it solves?
- In my previous PR I added `CompatRouter`
https://github.com/elastic/kibana/pull/159173, which caused changes in
~50 files and pinged 15 Teams. And this is just meant to be a temporary
change, so when we're done with the migration I would have to revert
these changes and engage everyone to review the PR again. And it is just
a single step in the migration strategy. So to make our lives easier I
think it would be better to have a common place where we do import our
router components because it will allow us to surface some extra logic
in single place instead of going through the whole source code again.
- `react-router@6` doesn't support a custom `Route` component, so that
means our custom `Route` component that we're using almost everywhere
today, will need to be replaced by a different solution. I have decided
to add `Routes` component, which will be responsible for rendering the
proper component (`react-router@6` renamed `Switch` to `Routes`, so I
have named this component to align with the dictionary of the new
router) and also is going to add the logic that today is done in `Route`
(moving logic to `Routes` will be done in the follow-up PR, here I just
wanted to focus on using the common router components to make the review
process easier)
---------
Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
- Closes https://github.com/elastic/kibana/issues/160212
## Summary
Added the missing encoding and updated tests.
## For testing
An id with special characters like `/` can be specified via `_bulk` API.
Example:
```
POST _bulk
{ "index" : { "_index" : "context-special", "_id" : "test&?#+/=" } }
{ "timestamp":"2023-06-20T20:00:00.123Z", "name": "test" }
```