Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions crates/keystone/src/role/types/role.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,16 @@ impl From<Role> for RoleRef {
}
}

impl From<&Role> for RoleRef {
fn from(value: &Role) -> Self {
Self {
id: value.id.clone(),
name: Some(value.name.clone()),
domain_id: value.domain_id.clone(),
}
}
}

/// Query parameters for listing roles.
#[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, Validate)]
#[builder(build_fn(error = "BuilderError"))]
Expand Down
39 changes: 38 additions & 1 deletion tests/integration/src/assignment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
use eyre::Result;
use std::sync::Arc;

use openstack_keystone::assignment::{AssignmentApi, types::AssignmentCreate};
use openstack_keystone::assignment::{AssignmentApi, types::*};
use openstack_keystone::keystone::Service;

mod grant;
Expand All @@ -35,3 +35,40 @@ pub async fn grant_role_to_user_on_project<U: Into<String>, P: Into<String>, R:
.await?;
Ok(())
}

pub async fn check_grant(state: &Arc<Service>, assignment: &Assignment) -> Result<bool> {
let mut params = RoleAssignmentListParametersBuilder::default();
params.role_id(assignment.role_id.clone());
match assignment.r#type {
AssignmentType::GroupDomain => {
params.domain_id(assignment.target_id.clone());
params.group_id(assignment.actor_id.clone());
}
AssignmentType::GroupProject => {
params.project_id(assignment.target_id.clone());
params.group_id(assignment.actor_id.clone());
}
AssignmentType::GroupSystem => {
params.system_id(assignment.target_id.clone());
params.group_id(assignment.actor_id.clone());
}
AssignmentType::UserDomain => {
params.domain_id(assignment.target_id.clone());
params.user_id(assignment.actor_id.clone());
}
AssignmentType::UserProject => {
params.project_id(assignment.target_id.clone());
params.user_id(assignment.actor_id.clone());
}
AssignmentType::UserSystem => {
params.system_id(assignment.target_id.clone());
params.user_id(assignment.actor_id.clone());
}
}
let assignments = state
.provider
.get_assignment_provider()
.list_role_assignments(state, &params.build()?)
.await?;
Ok(assignments.len() > 0)
}
29 changes: 19 additions & 10 deletions tests/integration/src/assignment/grant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
mod list;
mod revoke;

use std::sync::Arc;

use eyre::Report;
use sea_orm::{DbConn, entity::*};
use std::sync::Arc;
use tempfile::TempDir;

use openstack_keystone::config::Config;
use openstack_keystone::db::entity::{prelude::*, project};
Expand All @@ -26,7 +28,6 @@ use openstack_keystone::plugin_manager::PluginManager;
use openstack_keystone::policy::PolicyFactory;
use openstack_keystone::provider::Provider;

//use super::setup_schema;
use crate::common::{bootstrap, get_isolated_database};

async fn setup_assignment_data(db: &DbConn) -> Result<(), Report> {
Expand Down Expand Up @@ -70,18 +71,26 @@ async fn setup_assignment_data(db: &DbConn) -> Result<(), Report> {
Ok(())
}

async fn get_state() -> Result<Arc<Service>, Report> {
async fn get_state() -> Result<(Arc<Service>, TempDir), Report> {
let db = get_isolated_database().await?;
setup_assignment_data(&db).await?;

let cfg: Config = Config::default();
let tmp_fernet_repo = TempDir::new()?;

let mut cfg: Config = Config::default();
cfg.auth.methods = vec!["application_credential".into(), "password".into()];
cfg.fernet_tokens.key_repository = tmp_fernet_repo.path().to_path_buf();
let fernet_utils = openstack_keystone::token::backend::fernet::utils::FernetUtils {
key_repository: cfg.fernet_tokens.key_repository.clone(),
max_active_keys: cfg.fernet_tokens.max_active_keys,
};
fernet_utils.initialize_key_repository()?;

let plugin_manager = PluginManager::default();
let provider = Provider::new(cfg.clone(), plugin_manager)?;
Ok(Arc::new(Service::new(
cfg,
db,
provider,
PolicyFactory::default(),
)?))

Ok((
Arc::new(Service::new(cfg, db, provider, PolicyFactory::default())?),
tmp_fernet_repo,
))
}
6 changes: 3 additions & 3 deletions tests/integration/src/assignment/grant/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ async fn init_data(state: &ServiceState) -> Result<()> {
#[traced_test]
#[tokio::test]
async fn test_list_user_domain() -> Result<()> {
let state = get_state().await?;
let (state, _) = get_state().await?;
init_data(&state).await?;

assert_eq!(
Expand Down Expand Up @@ -119,7 +119,7 @@ async fn test_list_user_domain() -> Result<()> {

#[tokio::test]
async fn test_list_user_tl_project() -> Result<()> {
let state = get_state().await?;
let (state, _) = get_state().await?;
init_data(&state).await?;

assert_eq!(
Expand Down Expand Up @@ -158,7 +158,7 @@ async fn test_list_user_tl_project() -> Result<()> {

#[tokio::test]
async fn test_list_user_sub_project() -> Result<()> {
let state = get_state().await?;
let (state, _) = get_state().await?;
init_data(&state).await?;

assert_eq!(
Expand Down
Loading
Loading