Skip to main content

openstack_keystone_core/catalog/
service.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License at
4//
5//     http://www.apache.org/licenses/LICENSE-2.0
6//
7// Unless required by applicable law or agreed to in writing, software
8// distributed under the License is distributed on an "AS IS" BASIS,
9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10// See the License for the specific language governing permissions and
11// limitations under the License.
12//
13// SPDX-License-Identifier: Apache-2.0
14//! # Catalog provider
15use 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    /// List services
42    #[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    /// Get single service by ID
52    #[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    /// List Endpoints
62    #[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    /// Get single endpoint by ID
72    #[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    /// Get catalog
82    #[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}