Skip to main content

openstack_keystone_core/
provider.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//! # Provider manager
15//!
16//! Provider manager provides access to the individual service providers. This
17//! gives an easy interact for passing overall manager down to the individual
18//! providers that might need to call other providers while also allowing an
19//! easy injection of mocked providers.
20use derive_builder::Builder;
21
22use crate::application_credential::ApplicationCredentialApi;
23use crate::application_credential::ApplicationCredentialProvider;
24#[cfg(any(test, feature = "mock"))]
25use crate::application_credential::MockApplicationCredentialProvider;
26use crate::assignment::AssignmentApi;
27use crate::assignment::AssignmentProvider;
28#[cfg(any(test, feature = "mock"))]
29use crate::assignment::MockAssignmentProvider;
30use crate::catalog::CatalogApi;
31use crate::catalog::CatalogProvider;
32#[cfg(any(test, feature = "mock"))]
33use crate::catalog::MockCatalogProvider;
34use crate::config::Config;
35use crate::error::KeystoneError;
36use crate::federation::FederationApi;
37use crate::federation::FederationProvider;
38#[cfg(any(test, feature = "mock"))]
39use crate::federation::MockFederationProvider;
40use crate::identity::IdentityApi;
41use crate::identity::IdentityProvider;
42#[cfg(any(test, feature = "mock"))]
43use crate::identity::MockIdentityProvider;
44use crate::identity_mapping::IdentityMappingApi;
45use crate::identity_mapping::IdentityMappingProvider;
46#[cfg(any(test, feature = "mock"))]
47use crate::identity_mapping::MockIdentityMappingProvider;
48use crate::k8s_auth::K8sAuthApi;
49use crate::k8s_auth::K8sAuthProvider;
50#[cfg(any(test, feature = "mock"))]
51use crate::k8s_auth::MockK8sAuthProvider;
52use crate::plugin_manager::PluginManagerApi;
53#[cfg(any(test, feature = "mock"))]
54use crate::resource::MockResourceProvider;
55use crate::resource::ResourceApi;
56use crate::resource::ResourceProvider;
57#[cfg(any(test, feature = "mock"))]
58use crate::revoke::MockRevokeProvider;
59use crate::revoke::RevokeApi;
60use crate::revoke::RevokeProvider;
61#[cfg(any(test, feature = "mock"))]
62use crate::role::MockRoleProvider;
63use crate::role::RoleApi;
64use crate::role::RoleProvider;
65#[cfg(any(test, feature = "mock"))]
66use crate::token::MockTokenProvider;
67use crate::token::TokenApi;
68use crate::token::TokenProvider;
69#[cfg(any(test, feature = "mock"))]
70use crate::trust::MockTrustProvider;
71use crate::trust::TrustApi;
72use crate::trust::TrustProvider;
73
74/// Global provider manager.
75#[derive(Builder)]
76// It is necessary to use the owned pattern since otherwise builder invokes clone which immediately
77// confuses mockall used in tests
78#[builder(pattern = "owned")]
79pub struct Provider {
80    /// Configuration.
81    pub config: Config,
82    /// Application credential provider.
83    application_credential: ApplicationCredentialProvider,
84    /// Assignment provider.
85    assignment: AssignmentProvider,
86    /// Catalog provider.
87    catalog: CatalogProvider,
88    /// Federation provider.
89    federation: FederationProvider,
90    /// Identity provider.
91    identity: IdentityProvider,
92    /// Identity mapping provider.
93    identity_mapping: IdentityMappingProvider,
94    /// K8s auth provider.
95    k8s_auth: K8sAuthProvider,
96    /// Resource provider.
97    resource: ResourceProvider,
98    /// Revoke provider.
99    revoke: RevokeProvider,
100    /// Role provider.
101    role: RoleProvider,
102    /// Token provider.
103    token: TokenProvider,
104    /// Trust provider.
105    trust: TrustProvider,
106}
107
108#[cfg(any(test, feature = "mock"))]
109impl ProviderBuilder {
110    pub fn mock_application_credential(self, value: MockApplicationCredentialProvider) -> Self {
111        let mut new = self;
112        new.application_credential = Some(ApplicationCredentialProvider::Mock(value));
113        new
114    }
115
116    pub fn mock_assignment(self, value: MockAssignmentProvider) -> Self {
117        let mut new = self;
118        new.assignment = Some(AssignmentProvider::Mock(value));
119        new
120    }
121
122    pub fn mock_catalog(self, value: MockCatalogProvider) -> Self {
123        let mut new = self;
124        new.catalog = Some(CatalogProvider::Mock(value));
125        new
126    }
127
128    pub fn mock_federation(self, value: MockFederationProvider) -> Self {
129        let mut new = self;
130        new.federation = Some(FederationProvider::Mock(value));
131        new
132    }
133
134    pub fn mock_identity(self, value: MockIdentityProvider) -> Self {
135        let mut new = self;
136        new.identity = Some(IdentityProvider::Mock(value));
137        new
138    }
139    pub fn mock_identity_mapping(self, value: MockIdentityMappingProvider) -> Self {
140        let mut new = self;
141        new.identity_mapping = Some(IdentityMappingProvider::Mock(value));
142        new
143    }
144    pub fn mock_k8s_auth(self, value: MockK8sAuthProvider) -> Self {
145        let mut new = self;
146        new.k8s_auth = Some(K8sAuthProvider::Mock(value));
147        new
148    }
149    pub fn mock_resource(self, value: MockResourceProvider) -> Self {
150        let mut new = self;
151        new.resource = Some(ResourceProvider::Mock(value));
152        new
153    }
154    pub fn mock_revoke(self, value: MockRevokeProvider) -> Self {
155        let mut new = self;
156        new.revoke = Some(RevokeProvider::Mock(value));
157        new
158    }
159    pub fn mock_role(self, value: MockRoleProvider) -> Self {
160        let mut new = self;
161        new.role = Some(RoleProvider::Mock(value));
162        new
163    }
164    pub fn mock_token(self, value: MockTokenProvider) -> Self {
165        let mut new = self;
166        new.token = Some(TokenProvider::Mock(value));
167        new
168    }
169    pub fn mock_trust(self, value: MockTrustProvider) -> Self {
170        let mut new = self;
171        new.trust = Some(TrustProvider::Mock(value));
172        new
173    }
174}
175
176impl Provider {
177    pub fn new<P: PluginManagerApi>(
178        cfg: Config,
179        plugin_manager: &P,
180    ) -> Result<Self, KeystoneError> {
181        let application_credential_provider =
182            ApplicationCredentialProvider::new(&cfg, plugin_manager)?;
183        let assignment_provider = AssignmentProvider::new(&cfg, plugin_manager)?;
184        let catalog_provider = CatalogProvider::new(&cfg, plugin_manager)?;
185        let federation_provider = FederationProvider::new(&cfg, plugin_manager)?;
186        let identity_provider = IdentityProvider::new(&cfg, plugin_manager)?;
187        let identity_mapping_provider = IdentityMappingProvider::new(&cfg, plugin_manager)?;
188        let k8s_auth_provider = K8sAuthProvider::new(&cfg, plugin_manager)?;
189        let resource_provider = ResourceProvider::new(&cfg, plugin_manager)?;
190        let revoke_provider = RevokeProvider::new(&cfg, plugin_manager)?;
191        let role_provider = RoleProvider::new(&cfg, plugin_manager)?;
192        let token_provider = TokenProvider::new(&cfg, plugin_manager)?;
193        let trust_provider = TrustProvider::new(&cfg, plugin_manager)?;
194
195        Ok(Self {
196            config: cfg,
197            application_credential: application_credential_provider,
198            assignment: assignment_provider,
199            catalog: catalog_provider,
200            federation: federation_provider,
201            identity: identity_provider,
202            identity_mapping: identity_mapping_provider,
203            k8s_auth: k8s_auth_provider,
204            resource: resource_provider,
205            revoke: revoke_provider,
206            role: role_provider,
207            token: token_provider,
208            trust: trust_provider,
209        })
210    }
211
212    #[cfg(any(test, feature = "mock"))]
213    pub fn mocked_builder() -> ProviderBuilder {
214        let config = Config::default();
215        let application_credential_mock =
216            crate::application_credential::MockApplicationCredentialProvider::default();
217        let assignment_mock = crate::assignment::MockAssignmentProvider::default();
218        let catalog_mock = crate::catalog::MockCatalogProvider::default();
219        let identity_mock = crate::identity::MockIdentityProvider::default();
220        let identity_mapping_mock = crate::identity_mapping::MockIdentityMappingProvider::default();
221        let federation_mock = crate::federation::MockFederationProvider::default();
222        let k8s_auth_mock = crate::k8s_auth::MockK8sAuthProvider::default();
223        let resource_mock = crate::resource::MockResourceProvider::default();
224        let revoke_mock = crate::revoke::MockRevokeProvider::default();
225        let role_mock = crate::role::MockRoleProvider::default();
226        let token_mock = crate::token::MockTokenProvider::default();
227        let trust_mock = crate::trust::MockTrustProvider::default();
228
229        ProviderBuilder::default()
230            .config(config.clone())
231            .mock_application_credential(application_credential_mock)
232            .mock_assignment(assignment_mock)
233            .mock_catalog(catalog_mock)
234            .mock_identity(identity_mock)
235            .mock_identity_mapping(identity_mapping_mock)
236            .mock_federation(federation_mock)
237            .mock_k8s_auth(k8s_auth_mock)
238            .mock_resource(resource_mock)
239            .mock_revoke(revoke_mock)
240            .mock_role(role_mock)
241            .mock_token(token_mock)
242            .mock_trust(trust_mock)
243    }
244
245    /// Get the application credential provider.
246    pub fn get_application_credential_provider(&self) -> &impl ApplicationCredentialApi {
247        &self.application_credential
248    }
249
250    /// Get the assignment provider.
251    pub fn get_assignment_provider(&self) -> &impl AssignmentApi {
252        &self.assignment
253    }
254
255    /// Get the catalog provider.
256    pub fn get_catalog_provider(&self) -> &impl CatalogApi {
257        &self.catalog
258    }
259
260    /// Get the federation provider.
261    pub fn get_federation_provider(&self) -> &impl FederationApi {
262        &self.federation
263    }
264
265    /// Get the identity provider.
266    pub fn get_identity_provider(&self) -> &impl IdentityApi {
267        &self.identity
268    }
269
270    /// Get the identity mapping provider.
271    pub fn get_identity_mapping_provider(&self) -> &impl IdentityMappingApi {
272        &self.identity_mapping
273    }
274
275    /// Get the resource provider.
276    pub fn get_k8s_auth_provider(&self) -> &impl K8sAuthApi {
277        &self.k8s_auth
278    }
279
280    /// Get the resource provider.
281    pub fn get_resource_provider(&self) -> &impl ResourceApi {
282        &self.resource
283    }
284
285    /// Get the revocation provider.
286    pub fn get_revoke_provider(&self) -> &impl RevokeApi {
287        &self.revoke
288    }
289
290    /// Get the role provider.
291    pub fn get_role_provider(&self) -> &impl RoleApi {
292        &self.role
293    }
294
295    /// Get the token provider.
296    pub fn get_token_provider(&self) -> &impl TokenApi {
297        &self.token
298    }
299
300    /// Get the trust provider.
301    pub fn get_trust_provider(&self) -> &impl TrustApi {
302        &self.trust
303    }
304}