Skip to content

Commit c0bb79a

Browse files
committed
refactor: Use role provider from drivers
It is wrong to directly access database to resolve roles from other provider drivers (e.g. app_cred, trust, etc). In addition to that when role is present in other resource it is usually a role reference (short info about the role), so introduce an new `RoleRef` type.
1 parent 18fc659 commit c0bb79a

52 files changed

Lines changed: 695 additions & 356 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/keystone/src/api/v3/auth/token/token_impl.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use crate::api::common;
1616
use crate::api::error::KeystoneApiError;
1717
use crate::api::v3::auth::token::types::{System, Token, TokenBuilder, UserBuilder};
18-
use crate::api::v3::role::types::Role;
1918
use crate::identity::IdentityApi;
2019
use crate::keystone::ServiceState;
2120
use crate::resource::{
@@ -71,7 +70,7 @@ impl ProviderToken {
7170
.clone()
7271
.into_iter()
7372
.map(Into::into)
74-
.collect::<Vec<Role>>(),
73+
.collect::<Vec<_>>(),
7574
);
7675
}
7776

@@ -207,8 +206,8 @@ mod tests {
207206
use sea_orm::DatabaseConnection;
208207
use std::sync::Arc;
209208

210-
use crate::api::v3::role::types::Role;
211-
use crate::role::types::Role as ProviderRole;
209+
use crate::api::v3::role::types::RoleRef;
210+
use crate::role::types::RoleRef as ProviderRoleRef;
212211

213212
use crate::config::Config;
214213
use crate::identity::{MockIdentityProvider, types::UserResponseBuilder};
@@ -397,10 +396,10 @@ mod tests {
397396
let token = ProviderToken::ProjectScope(ProjectScopePayload {
398397
user_id: "bar".into(),
399398
project_id: "project_id".into(),
400-
roles: Some(vec![ProviderRole {
399+
roles: Some(vec![ProviderRoleRef {
401400
id: "rid".into(),
402-
name: "role_name".into(),
403-
..Default::default()
401+
name: Some("role_name".into()),
402+
domain_id: None,
404403
}]),
405404
..Default::default()
406405
});
@@ -415,10 +414,10 @@ mod tests {
415414
assert!(api_token.domain.is_none());
416415
assert_eq!(
417416
api_token.roles,
418-
Some(vec![Role {
417+
Some(vec![RoleRef {
419418
id: "rid".into(),
420419
name: "role_name".into(),
421-
..Default::default()
420+
domain_id: None
422421
}])
423422
);
424423
}
@@ -482,10 +481,10 @@ mod tests {
482481
trust: Some(Trust {
483482
id: "trust_id".into(),
484483
impersonation: false,
485-
roles: Some(vec![ProviderRole {
484+
roles: Some(vec![ProviderRoleRef {
486485
id: "rid".into(),
487-
name: "role_name".into(),
488-
..Default::default()
486+
name: Some("role_name".into()),
487+
domain_id: None,
489488
}]),
490489
..Default::default()
491490
}),
@@ -502,10 +501,10 @@ mod tests {
502501
assert!(api_token.domain.is_none());
503502
assert_eq!(
504503
api_token.roles,
505-
Some(vec![Role {
504+
Some(vec![RoleRef {
506505
id: "rid".into(),
507506
name: "role_name".into(),
508-
..Default::default()
507+
domain_id: None,
509508
}])
510509
);
511510
}

crates/keystone/src/api/v3/role/list.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ mod tests {
121121
// for some reason when deserializing missing value appears still as an empty
122122
// object
123123
extra: Some(json!({})),
124-
..Default::default()
124+
description: None,
125+
domain_id: None
125126
}],
126127
res.roles
127128
);
@@ -134,7 +135,7 @@ mod tests {
134135
.expect_list_roles()
135136
.withf(|_, qp: &RoleListParameters| {
136137
RoleListParameters {
137-
domain_id: Some("domain".into()),
138+
domain_id: Some(Some("domain".into())),
138139
name: Some("name".into()),
139140
} == *qp
140141
})

crates/keystone/src/api/v3/role/show.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ mod tests {
128128
ApiRole {
129129
id: "bar".into(),
130130
extra: Some(json!({})),
131-
..Default::default()
131+
name: String::new(),
132+
domain_id: None,
133+
description: None
132134
},
133135
res.role,
134136
);

crates/keystone/src/api/v3/role/types.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ impl From<types::Role> for Role {
3434
}
3535
}
3636

37+
impl From<types::RoleRef> for RoleRef {
38+
fn from(value: types::RoleRef) -> Self {
39+
Self {
40+
id: value.id,
41+
domain_id: value.domain_id,
42+
name: value.name.unwrap_or_default(),
43+
}
44+
}
45+
}
46+
3747
impl IntoResponse for types::Role {
3848
fn into_response(self) -> Response {
3949
(
@@ -49,7 +59,7 @@ impl IntoResponse for types::Role {
4959
impl From<RoleListParameters> for types::RoleListParameters {
5060
fn from(value: RoleListParameters) -> Self {
5161
Self {
52-
domain_id: value.domain_id,
62+
domain_id: Some(value.domain_id),
5363
name: value.name,
5464
}
5565
}

crates/keystone/src/api/v4/auth/token/token_impl.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use validator::Validate;
1515

1616
use crate::api::common;
1717
use crate::api::error::KeystoneApiError;
18-
use crate::api::v3::role::types::Role;
1918
use crate::api::v4::auth::token::types::{System, Token, TokenBuilder, UserBuilder};
2019
use crate::identity::IdentityApi;
2120
use crate::keystone::ServiceState;
@@ -72,7 +71,7 @@ impl ProviderToken {
7271
.clone()
7372
.into_iter()
7473
.map(Into::into)
75-
.collect::<Vec<Role>>(),
74+
.collect::<Vec<_>>(),
7675
);
7776
}
7877

@@ -210,8 +209,8 @@ mod tests {
210209
use sea_orm::DatabaseConnection;
211210
use std::sync::Arc;
212211

213-
use crate::api::v3::role::types::Role;
214-
use crate::role::types::Role as ProviderRole;
212+
use crate::api::v3::role::types::RoleRef;
213+
use crate::role::types::RoleRef as ProviderRoleRef;
215214

216215
use crate::config::Config;
217216
use crate::identity::{MockIdentityProvider, types::UserResponseBuilder};
@@ -400,10 +399,10 @@ mod tests {
400399
let token = ProviderToken::ProjectScope(ProjectScopePayload {
401400
user_id: "bar".into(),
402401
project_id: "project_id".into(),
403-
roles: Some(vec![ProviderRole {
402+
roles: Some(vec![ProviderRoleRef {
404403
id: "rid".into(),
405-
name: "role_name".into(),
406-
..Default::default()
404+
name: Some("role_name".into()),
405+
domain_id: None,
407406
}]),
408407
..Default::default()
409408
});
@@ -418,10 +417,10 @@ mod tests {
418417
assert!(api_token.domain.is_none());
419418
assert_eq!(
420419
api_token.roles,
421-
Some(vec![Role {
420+
Some(vec![RoleRef {
422421
id: "rid".into(),
423422
name: "role_name".into(),
424-
..Default::default()
423+
domain_id: None,
425424
}])
426425
);
427426
}
@@ -487,10 +486,10 @@ mod tests {
487486
impersonation: false,
488487
trustor_user_id: "trustor".into(),
489488
trustee_user_id: "trustee".into(),
490-
roles: Some(vec![ProviderRole {
489+
roles: Some(vec![ProviderRoleRef {
491490
id: "rid".into(),
492-
name: "role_name".into(),
493-
..Default::default()
491+
name: Some("role_name".into()),
492+
domain_id: None,
494493
}]),
495494
..Default::default()
496495
}),
@@ -507,10 +506,10 @@ mod tests {
507506
assert!(api_token.domain.is_none());
508507
assert_eq!(
509508
api_token.roles,
510-
Some(vec![Role {
509+
Some(vec![RoleRef {
511510
id: "rid".into(),
512511
name: "role_name".into(),
513-
..Default::default()
512+
domain_id: None,
514513
}])
515514
);
516515
}

crates/keystone/src/api/v4/role/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ mod tests {
129129
// for some reason when deserializing missing value appears still as an empty
130130
// object
131131
extra: Some(json!({})),
132-
..Default::default()
132+
domain_id: None,
133+
description: None
133134
}],
134135
res.roles
135136
);
@@ -142,7 +143,7 @@ mod tests {
142143
.expect_list_roles()
143144
.withf(|_, qp: &RoleListParameters| {
144145
RoleListParameters {
145-
domain_id: Some("domain".into()),
146+
domain_id: Some(Some("domain".into())),
146147
name: Some("name".into()),
147148
} == *qp
148149
})
@@ -247,7 +248,9 @@ mod tests {
247248
ApiRole {
248249
id: "bar".into(),
249250
extra: Some(json!({})),
250-
..Default::default()
251+
name: String::new(),
252+
domain_id: None,
253+
description: None
251254
},
252255
res.role,
253256
);

crates/keystone/src/api/v4/token/restriction/create.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ mod tests {
8686
super::{openapi_router, tests::get_mocked_state},
8787
*,
8888
};
89-
use crate::role::types::Role as ProviderRole;
89+
use crate::role::types::RoleRef as ProviderRoleRef;
9090
use crate::token::{MockTokenProvider, types as provider_types};
9191

9292
#[tokio::test]
@@ -114,10 +114,10 @@ mod tests {
114114
domain_id: "did".into(),
115115
project_id: Some("pid".into()),
116116
role_ids: vec!["r1".into(), "r2".into()],
117-
roles: Some(vec![ProviderRole {
117+
roles: Some(vec![ProviderRoleRef {
118118
id: "r1".into(),
119-
name: "r1n".into(),
120-
..Default::default()
119+
name: Some("r1n".into()),
120+
domain_id: None,
121121
}]),
122122
})
123123
});
@@ -136,10 +136,10 @@ mod tests {
136136
allow_renew: true,
137137
allow_rescope: true,
138138
roles: vec![
139-
ProviderRole {
139+
ProviderRoleRef {
140140
id: "r1".into(),
141-
name: "r1n".into(),
142-
..Default::default()
141+
name: Some("r1n".into()),
142+
domain_id: None,
143143
}
144144
.into(),
145145
],

crates/keystone/src/api/v4/token/restriction/delete.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ mod tests {
9797
use tower_http::trace::TraceLayer;
9898

9999
use super::super::{openapi_router, tests::get_mocked_state};
100-
use crate::role::types::Role as ProviderRole;
100+
use crate::role::types::RoleRef as ProviderRoleRef;
101101
use crate::token::{MockTokenProvider, TokenProviderError, types as provider_types};
102102

103103
#[tokio::test]
@@ -120,13 +120,15 @@ mod tests {
120120
project_id: Some("pid".into()),
121121
role_ids: vec!["r1".into(), "r2".into()],
122122
roles: Some(vec![
123-
ProviderRole {
123+
ProviderRoleRef {
124124
id: "r1".into(),
125-
..Default::default()
125+
name: None,
126+
domain_id: None,
126127
},
127-
ProviderRole {
128+
ProviderRoleRef {
128129
id: "r2".into(),
129-
..Default::default()
130+
name: None,
131+
domain_id: None,
130132
},
131133
]),
132134
}))

crates/keystone/src/api/v4/token/restriction/list.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ mod tests {
9797
super::{openapi_router, tests::get_mocked_state},
9898
*,
9999
};
100-
use crate::api::v3::role_assignment::types::Role;
101-
use crate::role::types::Role as ProviderRole;
100+
use crate::api::v3::role::types::RoleRef;
101+
use crate::role::types::RoleRef as ProviderRoleRef;
102102
use crate::token::{MockTokenProvider, types as provider_types};
103103

104104
#[tokio::test]
@@ -117,15 +117,15 @@ mod tests {
117117
project_id: Some("pid".into()),
118118
role_ids: vec!["r1".into(), "r2".into()],
119119
roles: Some(vec![
120-
ProviderRole {
120+
ProviderRoleRef {
121121
id: "r1".into(),
122-
name: "r1n".into(),
123-
..Default::default()
122+
name: Some("r1n".into()),
123+
domain_id: None,
124124
},
125-
ProviderRole {
125+
ProviderRoleRef {
126126
id: "r2".into(),
127-
name: "r2n".into(),
128-
..Default::default()
127+
name: Some("r2n".into()),
128+
domain_id: None,
129129
},
130130
]),
131131
}])
@@ -161,13 +161,15 @@ mod tests {
161161
user_id: Some("uid".into()),
162162
project_id: Some("pid".into()),
163163
roles: vec![
164-
Role {
164+
RoleRef {
165165
id: "r1".into(),
166-
name: Some("r1n".into())
166+
name: "r1n".into(),
167+
domain_id: None
167168
},
168-
Role {
169+
RoleRef {
169170
id: "r2".into(),
170-
name: Some("r2n".into())
171+
name: "r2n".into(),
172+
domain_id: None
171173
}
172174
]
173175
}],
@@ -197,15 +199,15 @@ mod tests {
197199
project_id: Some("pid".into()),
198200
role_ids: vec!["r1".into(), "r2".into()],
199201
roles: Some(vec![
200-
ProviderRole {
202+
ProviderRoleRef {
201203
id: "r1".into(),
202-
name: "r1n".into(),
203-
..Default::default()
204+
name: Some("r1n".into()),
205+
domain_id: None,
204206
},
205-
ProviderRole {
207+
ProviderRoleRef {
206208
id: "r2".into(),
207-
name: "r2n".into(),
208-
..Default::default()
209+
name: Some("r2n".into()),
210+
domain_id: None,
209211
},
210212
]),
211213
}])

0 commit comments

Comments
 (0)