openstack_keystone_core/catalog/
service.rs1use async_trait::async_trait;
16use std::sync::Arc;
17
18use crate::catalog::{CatalogProviderError, backend::CatalogBackend, types::*};
19use crate::config::Config;
20use crate::keystone::ServiceState;
21use crate::plugin_manager::PluginManagerApi;
22
23pub struct CatalogService {
24 backend_driver: Arc<dyn CatalogBackend>,
25}
26
27impl CatalogService {
28 pub fn new<P: PluginManagerApi>(
29 config: &Config,
30 plugin_manager: &P,
31 ) -> Result<Self, CatalogProviderError> {
32 let backend_driver = plugin_manager
33 .get_catalog_backend(config.catalog.driver.clone())?
34 .clone();
35 Ok(Self { backend_driver })
36 }
37}
38
39#[async_trait]
40impl CatalogApi for CatalogService {
41 #[tracing::instrument(level = "info", skip(self, state))]
43 async fn list_services(
44 &self,
45 state: &ServiceState,
46 params: &ServiceListParameters,
47 ) -> Result<Vec<Service>, CatalogProviderError> {
48 self.backend_driver.list_services(state, params).await
49 }
50
51 #[tracing::instrument(level = "info", skip(self, state))]
53 async fn get_service<'a>(
54 &self,
55 state: &ServiceState,
56 id: &'a str,
57 ) -> Result<Option<Service>, CatalogProviderError> {
58 self.backend_driver.get_service(state, id).await
59 }
60
61 #[tracing::instrument(level = "info", skip(self, state))]
63 async fn list_endpoints(
64 &self,
65 state: &ServiceState,
66 params: &EndpointListParameters,
67 ) -> Result<Vec<Endpoint>, CatalogProviderError> {
68 self.backend_driver.list_endpoints(state, params).await
69 }
70
71 #[tracing::instrument(level = "info", skip(self, state))]
73 async fn get_endpoint<'a>(
74 &self,
75 state: &ServiceState,
76 id: &'a str,
77 ) -> Result<Option<Endpoint>, CatalogProviderError> {
78 self.backend_driver.get_endpoint(state, id).await
79 }
80
81 #[tracing::instrument(level = "info", skip(self, state))]
83 async fn get_catalog(
84 &self,
85 state: &ServiceState,
86 enabled: bool,
87 ) -> Result<Vec<(Service, Vec<Endpoint>)>, CatalogProviderError> {
88 self.backend_driver.get_catalog(state, enabled).await
89 }
90}