Skip to content

Commit 1384889

Browse files
committed
add WAREHOUSE as ident
note: only support_forward_warehouse_request will apply warehouse rbac. Now only support SystemResourcesManagement
1 parent 644eff4 commit 1384889

File tree

7 files changed

+63
-8
lines changed

7 files changed

+63
-8
lines changed

src/query/ast/src/parser/statement.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3459,7 +3459,7 @@ pub fn grant_ownership_level(i: Input) -> IResult<AccountMgrLevel> {
34593459
let object = alt((
34603460
value(Object::Udf, rule! { UDF }),
34613461
value(Object::Stage, rule! { STAGE }),
3462-
value(Object::Warehouse, rule! { STAGE }),
3462+
value(Object::Warehouse, rule! { WAREHOUSE }),
34633463
));
34643464

34653465
// Object object_name

src/query/ast/src/parser/token.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,6 +1753,7 @@ impl TokenKind {
17531753
// | TokenKind::RETURNING
17541754
| TokenKind::STAGE
17551755
| TokenKind::UDF
1756+
| TokenKind::WAREHOUSE
17561757
| TokenKind::SHARE
17571758
| TokenKind::SHARES
17581759
| TokenKind::TO

src/query/ast/tests/it/parser.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ fn test_statement() {
774774
r#"GRANT OWNERSHIP ON d20_0014.* TO ROLE 'd20_0015_owner';"#,
775775
r#"GRANT OWNERSHIP ON d20_0014.t TO ROLE 'd20_0015_owner';"#,
776776
r#"GRANT OWNERSHIP ON STAGE s1 TO ROLE 'd20_0015_owner';"#,
777+
r#"GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner';"#,
777778
r#"GRANT OWNERSHIP ON UDF f1 TO ROLE 'd20_0015_owner';"#,
778779
r#"attach table t 's3://a' connection=(access_key_id ='x' secret_access_key ='y' endpoint_url='http://127.0.0.1:9900')"#,
779780
r#"CREATE FUNCTION IF NOT EXISTS isnotempty AS(p) -> not(is_null(p));"#,

src/query/ast/tests/it/testdata/stmt.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23666,6 +23666,28 @@ Grant(
2366623666
)
2366723667

2366823668

23669+
---------- Input ----------
23670+
GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner';
23671+
---------- Output ---------
23672+
GRANT OWNERSHIP ON WAREHOUSE w1 TO ROLE 'd20_0015_owner'
23673+
---------- AST ------------
23674+
Grant(
23675+
GrantStmt {
23676+
source: Privs {
23677+
privileges: [
23678+
Ownership,
23679+
],
23680+
level: Warehouse(
23681+
"w1",
23682+
),
23683+
},
23684+
principal: Role(
23685+
"d20_0015_owner",
23686+
),
23687+
},
23688+
)
23689+
23690+
2366923691
---------- Input ----------
2367023692
GRANT OWNERSHIP ON UDF f1 TO ROLE 'd20_0015_owner';
2367123693
---------- Output ---------

src/query/service/src/interpreters/access/privilege_access.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,13 +1361,24 @@ impl AccessChecker for PrivilegeAccess {
13611361
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
13621362
}
13631363
Plan::CreateWarehouse(_) => {
1364+
let warehouse_mgr = GlobalInstance::get::<Arc<dyn ResourcesManagement>>();
1365+
// Only check support_forward_warehouse_request privileges
1366+
if !warehouse_mgr.support_forward_warehouse_request() {
1367+
return Ok(());
1368+
}
13641369
// only current role has global level create warehouse privilege, it will pass
13651370
self.validate_access(&GrantObject::Global, UserPrivilegeType::CreateWarehouse, true, false)
13661371
.await?;
13671372
}
1368-
Plan::AddWarehouseCluster(_) => {}
1369-
Plan::AssignWarehouseNodes(_) => {}
1370-
Plan::UnassignWarehouseNodes(_) => {}
1373+
Plan::AddWarehouseCluster(plan) => {
1374+
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
1375+
}
1376+
Plan::AssignWarehouseNodes(plan) => {
1377+
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
1378+
}
1379+
Plan::UnassignWarehouseNodes(plan) => {
1380+
self.validate_warehouse_ownership(plan.warehouse.clone(), identity).await.transpose()?;
1381+
}
13711382
}
13721383

13731384
Ok(())

src/query/service/src/interpreters/common/grant.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414

1515
use std::sync::Arc;
1616

17+
use databend_common_base::base::GlobalInstance;
1718
use databend_common_catalog::table_context::TableContext;
1819
use databend_common_exception::Result;
20+
use databend_common_management::WarehouseInfo;
1921
use databend_common_meta_app::principal::GrantObject;
2022
use databend_common_users::UserApiProvider;
23+
use databend_enterprise_resources_management::ResourcesManagement;
2124

2225
use crate::sessions::QueryContext;
2326

@@ -93,9 +96,26 @@ pub async fn validate_grant_object_exists(
9396
)));
9497
}
9598
}
96-
GrantObject::Warehouse(_w) => {
97-
// TODO
98-
return Ok(());
99+
GrantObject::Warehouse(w) => {
100+
let warehouse_mgr = GlobalInstance::get::<Arc<dyn ResourcesManagement>>();
101+
// Only check support_forward_warehouse_request
102+
if !warehouse_mgr.support_forward_warehouse_request() {
103+
return Ok(());
104+
}
105+
let ws = warehouse_mgr.list_warehouses().await?;
106+
return if ws.iter().any(|warehouse| {
107+
if let WarehouseInfo::SystemManaged(sw) = warehouse {
108+
&sw.id == w
109+
} else {
110+
false
111+
}
112+
}) {
113+
Ok(())
114+
} else {
115+
Err(databend_common_exception::ErrorCode::UnknownWarehouse(
116+
format!("warehouse {w} not exists"),
117+
))
118+
};
99119
}
100120
GrantObject::Global => (),
101121
}

src/query/service/src/interpreters/interpreter_privilege_grant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ impl GrantPrivilegeInterpreter {
131131
}
132132

133133
let mut log_msg = format!(
134-
"{}: grant ownership on {:?} to {}",
134+
"{}: grant ownership on {:?} to {}",
135135
ctx.get_id(),
136136
owner_object,
137137
new_role

0 commit comments

Comments
 (0)