diff --git a/src/catalog/backends.rs b/src/catalog/backends.rs index a4618644..788c421e 100644 --- a/src/catalog/backends.rs +++ b/src/catalog/backends.rs @@ -12,5 +12,56 @@ // // SPDX-License-Identifier: Apache-2.0 +use async_trait::async_trait; +use dyn_clone::DynClone; + pub mod error; pub mod sql; + +use crate::catalog::error::CatalogProviderError; +use crate::catalog::{Endpoint, EndpointListParameters, Service, ServiceListParameters}; +use crate::config::Config; +use crate::keystone::ServiceState; + +#[async_trait] +pub trait CatalogBackend: DynClone + Send + Sync + std::fmt::Debug { + /// Set config + fn set_config(&mut self, config: Config); + + /// List services + async fn list_services( + &self, + state: &ServiceState, + params: &ServiceListParameters, + ) -> Result, CatalogProviderError>; + + /// Get single service by ID + async fn get_service<'a>( + &self, + state: &ServiceState, + id: &'a str, + ) -> Result, CatalogProviderError>; + + /// List Endpoints + async fn list_endpoints( + &self, + state: &ServiceState, + params: &EndpointListParameters, + ) -> Result, CatalogProviderError>; + + /// Get single endpoint by ID + async fn get_endpoint<'a>( + &self, + state: &ServiceState, + id: &'a str, + ) -> Result, CatalogProviderError>; + + /// Get Catalog (Services with Endpoints) + async fn get_catalog( + &self, + state: &ServiceState, + enabled: bool, + ) -> Result)>, CatalogProviderError>; +} + +dyn_clone::clone_trait_object!(CatalogBackend); diff --git a/src/catalog/backends/sql.rs b/src/catalog/backends/sql.rs index f1dc88ef..2733aa2d 100644 --- a/src/catalog/backends/sql.rs +++ b/src/catalog/backends/sql.rs @@ -19,6 +19,7 @@ use sea_orm::query::*; use super::super::types::*; use crate::catalog::CatalogProviderError; +use crate::catalog::backends::CatalogBackend; use crate::catalog::backends::error::{CatalogDatabaseError, db_err}; use crate::config::Config; use crate::db::entity::{ diff --git a/src/catalog/mock.rs b/src/catalog/mock.rs new file mode 100644 index 00000000..56aabeb6 --- /dev/null +++ b/src/catalog/mock.rs @@ -0,0 +1,69 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use async_trait::async_trait; +#[cfg(test)] +use mockall::mock; + +use crate::catalog::CatalogApi; +use crate::catalog::error::CatalogProviderError; +use crate::catalog::types::{Endpoint, EndpointListParameters, Service, ServiceListParameters}; +use crate::config::Config; +use crate::keystone::ServiceState; +use crate::plugin_manager::PluginManager; + +#[cfg(test)] +mock! { + pub CatalogProvider { + pub fn new(cfg: &Config, plugin_manager: &PluginManager) -> Result; + } + + #[async_trait] + impl CatalogApi for CatalogProvider { + async fn list_services( + &self, + state: &ServiceState, + params: &ServiceListParameters + ) -> Result, CatalogProviderError>; + + async fn get_service<'a>( + &self, + state: &ServiceState, + id: &'a str, + ) -> Result, CatalogProviderError>; + + async fn list_endpoints( + &self, + state: &ServiceState, + params: &EndpointListParameters, + ) -> Result, CatalogProviderError>; + + async fn get_endpoint<'a>( + &self, + state: &ServiceState, + id: &'a str, + ) -> Result, CatalogProviderError>; + + async fn get_catalog( + &self, + state: &ServiceState, + enabled: bool, + ) -> Result)>, CatalogProviderError>; + + } + + impl Clone for CatalogProvider { + fn clone(&self) -> Self; + } +} diff --git a/src/catalog/mod.rs b/src/catalog/mod.rs index 8cbe80c8..9c26164d 100644 --- a/src/catalog/mod.rs +++ b/src/catalog/mod.rs @@ -13,103 +13,28 @@ // SPDX-License-Identifier: Apache-2.0 use async_trait::async_trait; -#[cfg(test)] -use mockall::mock; pub mod backends; pub mod error; +#[cfg(test)] +mod mock; pub(crate) mod types; +use crate::catalog::backends::CatalogBackend; use crate::catalog::backends::sql::SqlBackend; use crate::catalog::error::CatalogProviderError; -use crate::catalog::types::{ - CatalogBackend, Endpoint, EndpointListParameters, Service, ServiceListParameters, -}; use crate::config::Config; use crate::keystone::ServiceState; use crate::plugin_manager::PluginManager; -#[derive(Clone, Debug)] -pub struct CatalogProvider { - backend_driver: Box, -} - -#[async_trait] -pub trait CatalogApi: Send + Sync + Clone { - async fn list_services( - &self, - state: &ServiceState, - params: &ServiceListParameters, - ) -> Result, CatalogProviderError>; - - async fn get_service<'a>( - &self, - state: &ServiceState, - id: &'a str, - ) -> Result, CatalogProviderError>; - - async fn list_endpoints( - &self, - state: &ServiceState, - params: &EndpointListParameters, - ) -> Result, CatalogProviderError>; - - async fn get_endpoint<'a>( - &self, - state: &ServiceState, - id: &'a str, - ) -> Result, CatalogProviderError>; - - async fn get_catalog( - &self, - state: &ServiceState, - enabled: bool, - ) -> Result)>, CatalogProviderError>; -} - #[cfg(test)] -mock! { - pub CatalogProvider { - pub fn new(cfg: &Config, plugin_manager: &PluginManager) -> Result; - } - - #[async_trait] - impl CatalogApi for CatalogProvider { - async fn list_services( - &self, - state: &ServiceState, - params: &ServiceListParameters - ) -> Result, CatalogProviderError>; - - async fn get_service<'a>( - &self, - state: &ServiceState, - id: &'a str, - ) -> Result, CatalogProviderError>; +pub use mock::MockCatalogProvider; - async fn list_endpoints( - &self, - state: &ServiceState, - params: &EndpointListParameters, - ) -> Result, CatalogProviderError>; +pub use types::*; - async fn get_endpoint<'a>( - &self, - state: &ServiceState, - id: &'a str, - ) -> Result, CatalogProviderError>; - - async fn get_catalog( - &self, - state: &ServiceState, - enabled: bool, - ) -> Result)>, CatalogProviderError>; - - } - - impl Clone for CatalogProvider { - fn clone(&self) -> Self; - } +#[derive(Clone, Debug)] +pub struct CatalogProvider { + backend_driver: Box, } impl CatalogProvider { diff --git a/src/catalog/types.rs b/src/catalog/types.rs index b677dcc9..66c7452c 100644 --- a/src/catalog/types.rs +++ b/src/catalog/types.rs @@ -12,15 +12,12 @@ // // SPDX-License-Identifier: Apache-2.0 +use async_trait::async_trait; + pub mod endpoint; pub mod service; -use async_trait::async_trait; -use dyn_clone::DynClone; - use crate::catalog::CatalogProviderError; -use crate::config::Config; - pub use crate::catalog::types::endpoint::{ Endpoint, EndpointBuilder, EndpointBuilderError, EndpointListParameters, }; @@ -30,44 +27,34 @@ pub use crate::catalog::types::service::{ use crate::keystone::ServiceState; #[async_trait] -pub trait CatalogBackend: DynClone + Send + Sync + std::fmt::Debug { - /// Set config - fn set_config(&mut self, config: Config); - - /// List services +pub trait CatalogApi: Send + Sync + Clone { async fn list_services( &self, state: &ServiceState, params: &ServiceListParameters, ) -> Result, CatalogProviderError>; - /// Get single service by ID async fn get_service<'a>( &self, state: &ServiceState, id: &'a str, ) -> Result, CatalogProviderError>; - /// List Endpoints async fn list_endpoints( &self, state: &ServiceState, params: &EndpointListParameters, ) -> Result, CatalogProviderError>; - /// Get single endpoint by ID async fn get_endpoint<'a>( &self, state: &ServiceState, id: &'a str, ) -> Result, CatalogProviderError>; - /// Get Catalog (Services with Endpoints) async fn get_catalog( &self, state: &ServiceState, enabled: bool, ) -> Result)>, CatalogProviderError>; } - -dyn_clone::clone_trait_object!(CatalogBackend); diff --git a/src/plugin_manager.rs b/src/plugin_manager.rs index 5ca703dc..4a5d3b5e 100644 --- a/src/plugin_manager.rs +++ b/src/plugin_manager.rs @@ -15,7 +15,7 @@ use std::collections::HashMap; use crate::assignment::types::AssignmentBackend; -use crate::catalog::types::CatalogBackend; +use crate::catalog::backends::CatalogBackend; use crate::federation::types::FederationBackend; use crate::identity::types::IdentityBackend; use crate::resource::types::ResourceBackend;