Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: object warehouse support rbac #17262

Merged
merged 7 commits into from
Feb 24, 2025
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
add WAREHOUSE as ident
note: only support_forward_warehouse_request will apply warehouse rbac. Now only support SystemResourcesManagement
TCeason committed Feb 19, 2025
commit e727c40bc6083b564aa9a0ed0aef52bb1e963e71
2 changes: 1 addition & 1 deletion src/query/ast/src/parser/statement.rs
Original file line number Diff line number Diff line change
@@ -3476,7 +3476,7 @@ pub fn grant_ownership_level(i: Input) -> IResult<AccountMgrLevel> {
let object = alt((
value(Object::Udf, rule! { UDF }),
value(Object::Stage, rule! { STAGE }),
value(Object::Warehouse, rule! { STAGE }),
value(Object::Warehouse, rule! { WAREHOUSE }),
));

// Object object_name
1 change: 1 addition & 0 deletions src/query/ast/src/parser/token.rs
Original file line number Diff line number Diff line change
@@ -1754,6 +1754,7 @@ impl TokenKind {
// | TokenKind::RETURNING
| TokenKind::STAGE
| TokenKind::UDF
| TokenKind::WAREHOUSE
| TokenKind::SHARE
| TokenKind::SHARES
| TokenKind::TO
1 change: 1 addition & 0 deletions src/query/ast/tests/it/parser.rs
Original file line number Diff line number Diff line change
@@ -774,6 +774,7 @@ fn test_statement() {
r#"GRANT OWNERSHIP ON d20_0014.* TO ROLE 'd20_0015_owner';"#,
r#"GRANT OWNERSHIP ON d20_0014.t TO ROLE 'd20_0015_owner';"#,
r#"GRANT OWNERSHIP ON STAGE s1 TO ROLE 'd20_0015_owner';"#,
r#"GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner';"#,
r#"GRANT OWNERSHIP ON UDF f1 TO ROLE 'd20_0015_owner';"#,
r#"attach table t 's3://a' connection=(access_key_id ='x' secret_access_key ='y' endpoint_url='http://127.0.0.1:9900')"#,
r#"CREATE FUNCTION IF NOT EXISTS isnotempty AS(p) -> not(is_null(p));"#,
22 changes: 22 additions & 0 deletions src/query/ast/tests/it/testdata/stmt.txt
Original file line number Diff line number Diff line change
@@ -23659,6 +23659,28 @@ Grant(
)


---------- Input ----------
GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner';
---------- Output ---------
GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner'
---------- AST ------------
Grant(
GrantStmt {
source: Privs {
privileges: [
Ownership,
],
level: Warehouse(
"w1",
),
},
principal: Role(
"d20_0015_owner",
),
},
)


---------- Input ----------
GRANT OWNERSHIP ON UDF f1 TO ROLE 'd20_0015_owner';
---------- Output ---------
17 changes: 14 additions & 3 deletions src/query/service/src/interpreters/access/privilege_access.rs
Original file line number Diff line number Diff line change
@@ -1361,13 +1361,24 @@ impl AccessChecker for PrivilegeAccess {
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
}
Plan::CreateWarehouse(_) => {
let warehouse_mgr = GlobalInstance::get::<Arc<dyn ResourcesManagement>>();
// Only check support_forward_warehouse_request privileges
if !warehouse_mgr.support_forward_warehouse_request() {
return Ok(());
}
// only current role has global level create warehouse privilege, it will pass
self.validate_access(&GrantObject::Global, UserPrivilegeType::CreateWarehouse, true, false)
.await?;
}
Plan::AddWarehouseCluster(_) => {}
Plan::AssignWarehouseNodes(_) => {}
Plan::UnassignWarehouseNodes(_) => {}
Plan::AddWarehouseCluster(plan) => {
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
}
Plan::AssignWarehouseNodes(plan) => {
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
}
Plan::UnassignWarehouseNodes(plan) => {
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
}
}

Ok(())
26 changes: 23 additions & 3 deletions src/query/service/src/interpreters/common/grant.rs
Original file line number Diff line number Diff line change
@@ -14,10 +14,13 @@

use std::sync::Arc;

use databend_common_base::base::GlobalInstance;
use databend_common_catalog::table_context::TableContext;
use databend_common_exception::Result;
use databend_common_management::WarehouseInfo;
use databend_common_meta_app::principal::GrantObject;
use databend_common_users::UserApiProvider;
use databend_enterprise_resources_management::ResourcesManagement;

use crate::sessions::QueryContext;

@@ -93,9 +96,26 @@ pub async fn validate_grant_object_exists(
)));
}
}
GrantObject::Warehouse(_w) => {
// TODO
return Ok(());
GrantObject::Warehouse(w) => {
let warehouse_mgr = GlobalInstance::get::<Arc<dyn ResourcesManagement>>();
// Only check support_forward_warehouse_request
if !warehouse_mgr.support_forward_warehouse_request() {
return Ok(());
}
let ws = warehouse_mgr.list_warehouses().await?;
return if ws.iter().any(|warehouse| {
if let WarehouseInfo::SystemManaged(sw) = warehouse {
&sw.id == w
} else {
false
}
}) {
Ok(())
} else {
Err(databend_common_exception::ErrorCode::UnknownWarehouse(
format!("warehouse {w} not exists"),
))
};
}
GrantObject::Global => (),
}
Original file line number Diff line number Diff line change
@@ -131,7 +131,7 @@ impl GrantPrivilegeInterpreter {
}

let mut log_msg = format!(
"{}: grant ownership on {:?} to {}",
"{}: grant ownership on {:?} to {}",
ctx.get_id(),
owner_object,
new_role