From a889682e5bfa3d7858116ccb65f9b01289d18425 Mon Sep 17 00:00:00 2001 From: Bandini Bhopi Date: Wed, 26 Apr 2023 23:27:47 +0000 Subject: [PATCH] Adds design document for new saved object service interface for custom repository Signed-off-by: Bandini Bhopi --- CHANGELOG.md | 1 + .../current_saved_object_service_workflow.png | Bin 0 -> 26471 bytes ...proposed_saved_object_service_workflow.png | Bin 0 -> 51849 bytes ...current_saved_object_service_workflow.puml | 19 ++ ...roposed_saved_object_service_workflow.puml | 25 +++ .../saved_object_repository_factory_design.md | 171 ++++++++++++++++++ 6 files changed, 216 insertions(+) create mode 100644 docs/saved_objects/img/current_saved_object_service_workflow.png create mode 100644 docs/saved_objects/img/proposed_saved_object_service_workflow.png create mode 100644 docs/saved_objects/resources/current_saved_object_service_workflow.puml create mode 100644 docs/saved_objects/resources/proposed_saved_object_service_workflow.puml create mode 100644 docs/saved_objects/saved_object_repository_factory_design.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd5689a8e75..9180ca71cacc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -169,6 +169,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - [Doc] Update DEVELOPER_GUIDE.md with added manual bootstrap timeout solution and max virtual memory error solution with docker ([#3764](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/3764)) - [Doc] Add COMMUNICATIONS.md with info about Slack, forum, office hours ([#3837](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/3837)) - [Doc] Add docker files and instructions for debugging Selenium functional tests ([#3747](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/3747)) +- [Saved Object Service] Adds design doc for new Saved Object Service Interface for Custom Repository [#3954](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/3954) ### 🛠 Maintenance diff --git a/docs/saved_objects/img/current_saved_object_service_workflow.png b/docs/saved_objects/img/current_saved_object_service_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..b763101b698793e87822e61d5fca0b2915d4e2f9 GIT binary patch literal 26471 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≦{#&}0Zam}ca?$w|v=~w{ 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 wVW9usOUsb|2Mp#lP3$69$KYicOlmGw# literal 0 HcmV?d00001 diff --git a/docs/saved_objects/resources/current_saved_object_service_workflow.puml b/docs/saved_objects/resources/current_saved_object_service_workflow.puml new file mode 100644 index 000000000000..bc5bbf82c621 --- /dev/null +++ b/docs/saved_objects/resources/current_saved_object_service_workflow.puml @@ -0,0 +1,19 @@ +@startuml +title: Current Saved Object Service Flow +actor User +participant "Saved Object Client" as Client +participant "Saved Object Repository" as Repo +participant "Opensearch" as OS + +User -> Client: Create Saved Object +Client -> Repo: Create Saved Object +Repo -> OS: Index Saved Object +OS --> Repo: Saved Object Saved +Client -> User: Saved Object Created +User -> Client: Get Saved Object +Client -> Repo: Get Saved Object +Repo -> OS: Get Saved Object +OS --> Repo: Return Saved Object +Repo -> Client: Return Saved Object +Client -> User: Saved Object Data +@enduml \ No newline at end of file diff --git a/docs/saved_objects/resources/proposed_saved_object_service_workflow.puml b/docs/saved_objects/resources/proposed_saved_object_service_workflow.puml new file mode 100644 index 000000000000..0e5dc65f6616 --- /dev/null +++ b/docs/saved_objects/resources/proposed_saved_object_service_workflow.puml @@ -0,0 +1,25 @@ +@startuml +title: Proposed Saved Object Service Flow +actor User +participant "Saved Object Client" as Client +participant "Repository Factory Provider" as Factory +participant "Repository\n(e.g. SavedObjectRepository,\nPostgresRepository,\nDynamoDBRepository)" as Repo +participant "Metadata Storage\n(e.g. OpenSearch,\nPostgres, DynamoDB etc)" as Meta + +autonumber +User -> Client: Create Saved Object +Client -> Factory: Get Repository +Factory -> Client: Returns Repository to manage Saved Objects +Client -> Repo: Create Saved Object +Repo -> Meta: Create/Update Record +Meta --> Repo: Saved Object Saved +Client -> User: Saved Object Created +User -> Client: Get Saved Object +Client -> Factory: Get Repository +Factory -> Client: Returns Repository to manage Saved Objects +Client -> Repo: Get Saved Object +Repo -> Meta: Fetch Saved Object from storage +Meta --> Repo: Return Saved Object +Repo -> Client: Return Saved Object +Client -> User: Saved Object Data +@enduml \ No newline at end of file diff --git a/docs/saved_objects/saved_object_repository_factory_design.md b/docs/saved_objects/saved_object_repository_factory_design.md new file mode 100644 index 000000000000..d88393959096 --- /dev/null +++ b/docs/saved_objects/saved_object_repository_factory_design.md @@ -0,0 +1,171 @@ +# New Saved Object Service Interface for Custom Repository + +## Introduction + +The new saved object service interface for custom repository is a project that aims to improve scalability of the existing saved object service by introducing a new interface. The goal of this project is to provide a more efficient and flexible interface that will make it easier for developers to configure metadata of Dashboards in any different storage than OpenSearch, such as mysql, postgres, DDB, serverless (S3+ Athena). + +Currently, Dashboards stores its metadata configuration inside OpenSearch index (called .kibana). This approach is by design of Dashboards and biased towards product decision by upstream which works seamlessly and out of the box for customers but it introduces challenges while operating at scale and providing high availability for Dashboards. While choosing OpenSearch as a storage for Dashboards metadata, availability of Dashboards depends on OpenSearch cluster’s availability and other cluster parameters such as cluster health, state, versions which could make Dashboards unavailable. + +To mitigate above problem and unblock future extensibility of Dashboards, we are building Dashboards Meta storage adaptor to decouple Dashboards metadata storage from OpenSearch. This project will focus on introducing new interface in Saved Object Service using which developer can build their custom repository and save Dashboards metadata in storage of their choice. + +The stakeholders of this new interface include the developers of the Dashboards and community contributors who wants to use other metadata store. + +## Architecture Overview + +The Saved Object Service is a critical component of Dashboards that provides a way to store and manage application data. It is built using a modular architecture that provides a high degree of flexibility and extensibility. The new interface will be designed to replace [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134) implementation so that developers can build plugins that leverage the power of existing saved object service and use their own database to store and retrieve metadata of OpenSearch Dashboards. + +### Current Architecture + +The repository interface named [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134) in OpenSearch-Dashboards is a module that provides an interface for managing saved objects. The [SavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L139) is the implementation of [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134), which uses OpenSearch index as it’s data store. It is responsible for storing, retrieving, and deleting saved objects for Dashboards, such as visualizations, dashboards, and searches. + +The Saved Object Repository is built on top of the OpenSearch client and provides a simplified interface for working with OpenSearch. It uses the Saved Object Serializer to convert saved objects between their internal and external representations. The repository is then being consumed by Saved object client to create scoped saved object client. + +![img](./img/current_saved_object_service_workflow.png) + +### Proposed Architecture + +- **Approach 1 (Preferred)**: The proposed architecture will add one more layer of abstraction in Saved Object Service. `The Repository Factory Provider` in OpenSearch Dashboards will be responsible for creating and managing instances of the Repository (e.g. SavedObjectRepository, PostgresRepository, DynamoDBRepository etc.), which is used to interact with the metadata storage that stores the saved objects. Currently we have an repository interface named [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134), and the [SavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L139) is the implementation, which use an OpenSearch index as its data store. This approach would make the implementation of [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134) replaceable by plugin. + + ![img](./img/proposed_saved_object_service_workflow.png) + + * Pros: + * Only change needed in Dashboard is to introduce one more abstraction layer in Saved Object Service. + * Adds opportunity for community developers to contribute for other meta store. + + * Cons + * Code reusability is low. +
+ +**POC**: +1) Core Dashboards Change: https://github.com/bandinib-amzn/OpenSearch-Dashboards/commit/b9cfc14 +2) Postgres Repository Plugin: https://github.com/bandinib-amzn/metadata_plugin/commit/dac35f0 + +`SavedObjectsServiceSetup` provides interface to create custom Saved Object Repository. +``` +/** +* Set the default {@link SavedObjectRepositoryFactoryProvider | factory provider} for creating Saved Objects repository. +* Only one repository can be set, subsequent calls to this method will fail. +*/ +registerRepositoryFactoryProvider: ( +respositoryFactoryProvider: SavedObjectRepositoryFactoryProvider +) => void; +``` + +Here are the main steps involved in using the Saved Objects Repository Factory in Dashboards: +1. Define the dependencies: The Saved Object Repository Factory Provider requires the function which creates instance of [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134). + ``` + export const repositoryFactoryProvider: SavedObjectRepositoryFactoryProvider = ( + options: SavedObjectsRepositoryOptions + ) => { + . + . + . + return new PostgresRepository({ + typeRegistry, + serializer, + migrator, + allowedTypes, + }); + } + ``` +2. Register the provider: Register the repository factory provider with right dependencies. + ``` + core.savedObjects.registerRepositoryFactoryProvider(repositoryFactoryProvider); + ``` +3. Implement the Saved Object Operations for chosen storage type: Implement the CRUD and other operations for contracts defined in [ISavedObjectRepository](https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/src/core/server/saved_objects/service/lib/repository.ts#L134) + ``` + async create( + type: string, + attributes: T, + options: SavedObjectsCreateOptions = {} + ): Promise> { + ... + } + + async get( + type: string, + id: string, + options: SavedObjectsBaseOptions = {} + ): Promise> { + ... + } + + async update( + type: string, + id: string, + attributes: Partial, + options: SavedObjectsUpdateOptions = {} + ): Promise> { + ... + } + + async deleteFromNamespaces( + type: string, + id: string, + namespaces: string[], + options: SavedObjectsDeleteFromNamespacesOptions = {} + ): Promise { + ... + } + . + . + . + ``` + +- **Approach 2**: Build external plugin and using saved object client wrapper or client factory provider injection mechanism we can build custom object for Postgres or other DB. + + * Pros: + * No changes in core Dashboards. That means we can keep Dashboards as it is with very minimal changes. + + + * Cons + * Code reusability is low. + * Some components of Saved object service such as Serializer, Type registry, interface to create internal and scoped repository are only available during Saved Object Service Start. As per the current architecture, first Saved Object Service Setup → Plugin Setup → Saved Object Service Start → Plugin Start. Some core plugin (e.g. opensearch_dashboards_usage_collection) calls find operation before plugin start and it fails because some components are still not available before plugin start. +
+ + **POC**: https://github.com/bandinib-amzn/metadata_plugin/compare/f040daf...89213eb + + +- **Approach 3**: In this approach, we just extend the `SavedObjectsRepository` class and override CRUD and other saved object operation in core Dashboards. + + * Pros: + * As we are extending the repository in core saved object service itself, we can reuse the validation and utility functions for other database options. + + + * Cons + * Changes in core Dashboards : We will be making considerable changes in critical component of Dashboards. + * With this approach, user will have to use the data storage option that we choose. +
+ + **POC**: https://github.com/bandinib-amzn/OpenSearch-Dashboards/compare/main...22d7f30 + +## Implementation Details + + +| Repository | Component | Change | +| ----------- | ----------- | ----------- | +| OpenSearch-Dashboards | Saved Object Service | Add Saved object repository factory provider | +| OpenSearch-Dashboards | Config | Configuration for metadata storage | +| MetaStorage-Plugin [Name TBD] | Plugin / Extension | We will build new plugin for Postgres. This is use case for new interface in Saved Object Repository. | + +### Configuration for metadata storage: +``` +metaStorage.enabled: true +metaStorage.config: { + type: 'xxxx', + hostName: 'xxxx', + userName: 'xxxx', + password: 'xxxx', + port: xxxx, +} +``` + +## Testing and Quality Assurance + +### Testing Approach + +The following testing approach will be used to ensure the quality of the system: + +1. **Unit testing**: Metadata store plugin will be thoroughly unit tested to ensure it meets its requirements and performs as expected. Also we will add new test cases in OpenSearch-Dashboards to test new repository factory provider. +2. **Integration testing**: Components will be integrated and tested together to ensure they work together seamlessly and without conflicts. +