From 190c9600addf76eb18704d379f59e3ff1becff24 Mon Sep 17 00:00:00 2001 From: "opensearch-trigger-bot[bot]" <98922864+opensearch-trigger-bot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 13:06:34 -0700 Subject: [PATCH] Design for New Saved Object Service Interface for Custom Repository (#3954) (#4546) * Adds design document for new saved object service interface for custom repository Signed-off-by: Bandini Bhopi (cherry picked from commit 61ea841e4eab621d86aed9274c95b1bcc2f66c55) Signed-off-by: github-actions[bot] Co-authored-by: github-actions[bot] --- .../current_saved_object_service_workflow.png | Bin 0 -> 26471 bytes ...proposed_saved_object_service_workflow.png | Bin 0 -> 53121 bytes ...current_saved_object_service_workflow.puml | 19 ++ ...roposed_saved_object_service_workflow.puml | 38 ++++ .../saved_object_repository_factory_design.md | 171 ++++++++++++++++++ 5 files changed, 228 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/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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 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..27a5e1cd49ed --- /dev/null +++ b/docs/saved_objects/resources/proposed_saved_object_service_workflow.puml @@ -0,0 +1,38 @@ +@startuml + +title: Proposed Saved Object Service Flow + +actor User + +participant "OpenSearch-Dashboards" as OSD + +box "Saved Object Service" #LightBlue +participant "Saved Object Client" as Client +participant "Repository Factory Provider" as Factory +end box + +box "Dashboards Storage Plugin" #LightYellow +participant "Repository\n(e.g. PostgresRepository,\nDynamoDBRepository)" as Repo +participant "Metadata Storage\n(e.g. Postgres, \nDynamoDB etc)" as Meta +end box + +autonumber +group OSD Bootstrap +Repo -> Factory: Register custom repository +Factory -> Client: Returns repository +Client -> OSD: Returns Saved Object Client +end group +User -> Client: Create Saved Object +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 -> 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 + +skinparam BoxPadding 15 +@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..d3fedd3575dc --- /dev/null +++ b/docs/saved_objects/saved_object_repository_factory_design.md @@ -0,0 +1,171 @@ +# Proposed 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. +