test accountinfo

This commit is contained in:
weisd
2024-11-12 17:38:36 +08:00
parent 47ade0f135
commit b400860538
8 changed files with 102 additions and 26 deletions
Generated
+1
View File
@@ -2115,6 +2115,7 @@ dependencies = [
"s3s", "s3s",
"serde", "serde",
"serde-xml-rs", "serde-xml-rs",
"serde_json",
"serde_urlencoded", "serde_urlencoded",
"time", "time",
"tracing", "tracing",
+1 -1
View File
@@ -14,7 +14,7 @@ use super::condition::{
#[derive(Debug, Deserialize, Serialize, Default, Clone, PartialEq, Eq)] #[derive(Debug, Deserialize, Serialize, Default, Clone, PartialEq, Eq)]
pub struct ActionSet(HashSet<Action>); pub struct ActionSet(pub HashSet<Action>);
impl ActionSet { impl ActionSet {
pub fn is_match(&self, act: &Action) -> bool { pub fn is_match(&self, act: &Action) -> bool {
+7 -1
View File
@@ -41,6 +41,12 @@ pub struct Resource {
} }
impl Resource { impl Resource {
pub fn new(pattern: &str) -> Self {
Self {
pattern: pattern.to_owned(),
rtype: ResourceARNType::ResourceARNS3,
}
}
pub fn validate_bucket(&self, bucket: &str) -> Result<()> { pub fn validate_bucket(&self, bucket: &str) -> Result<()> {
self.validate()?; self.validate()?;
if !wildcard::match_pattern(&self.pattern, bucket) if !wildcard::match_pattern(&self.pattern, bucket)
@@ -187,7 +193,7 @@ impl<'de> Deserialize<'de> for Resource {
#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] #[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(transparent)] #[serde(transparent)]
pub struct ResourceSet(HashSet<Resource>); pub struct ResourceSet(pub HashSet<Resource>);
impl ResourceSet { impl ResourceSet {
pub fn validate_bucket(&self, bucket: &str) -> Result<()> { pub fn validate_bucket(&self, bucket: &str) -> Result<()> {
+12 -11
View File
@@ -819,7 +819,7 @@ lazy_static! {
#[async_trait::async_trait] #[async_trait::async_trait]
impl StorageAPI for ECStore { impl StorageAPI for ECStore {
async fn backend_info(&self) -> BackendInfo { async fn backend_info(&self) -> BackendInfo {
let (standard_scparities, rrscparities) = { let (standard_sc_parity, rr_sc_parity) = {
if let Some(sc) = GLOBAL_StorageClass.get() { if let Some(sc) = GLOBAL_StorageClass.get() {
let sc_parity = sc let sc_parity = sc
.get_parity_for_sc(storageclass::CLASS_STANDARD) .get_parity_for_sc(storageclass::CLASS_STANDARD)
@@ -833,17 +833,17 @@ impl StorageAPI for ECStore {
} }
}; };
let mut standard_scdata = Vec::new(); let mut standard_sc_data = Vec::new();
let mut rrscdata = Vec::new(); let mut rr_sc_data = Vec::new();
let mut drives_per_set = Vec::new(); let mut drives_per_set = Vec::new();
let mut total_sets = Vec::new(); let mut total_sets = Vec::new();
for (idx, set_count) in self.set_drive_counts().iter().enumerate() { for (idx, set_count) in self.set_drive_counts().iter().enumerate() {
if let Some(sc_parity) = standard_scparities { if let Some(sc_parity) = standard_sc_parity {
standard_scdata.push(set_count - sc_parity); standard_sc_data.push(set_count - sc_parity);
} }
if let Some(rr_sc_parity) = rrscparities { if let Some(sc_parity) = rr_sc_parity {
rrscdata.push(set_count - rr_sc_parity); rr_sc_data.push(set_count - sc_parity);
} }
total_sets.push(self.pools[idx].set_count); total_sets.push(self.pools[idx].set_count);
drives_per_set.push(*set_count); drives_per_set.push(*set_count);
@@ -853,12 +853,13 @@ impl StorageAPI for ECStore {
backend_type: BackendByte::Erasure, backend_type: BackendByte::Erasure,
online_disks: BackendDisks::new(), online_disks: BackendDisks::new(),
offline_disks: BackendDisks::new(), offline_disks: BackendDisks::new(),
standard_scdata, standard_sc_data,
standard_scparities, standard_sc_parity,
rrscdata, rr_sc_data,
rrscparities, rr_sc_parity,
total_sets, total_sets,
drives_per_set, drives_per_set,
..Default::default()
} }
} }
async fn storage_info(&self) -> StorageInfo { async fn storage_info(&self) -> StorageInfo {
+16 -7
View File
@@ -780,7 +780,7 @@ pub struct DeletedObject {
// pub replication_state: ReplicationState, // pub replication_state: ReplicationState,
} }
#[derive(Debug, Default)] #[derive(Debug, Default, Serialize)]
pub enum BackendByte { pub enum BackendByte {
#[default] #[default]
Unknown, Unknown,
@@ -824,7 +824,7 @@ pub struct StorageInfo {
pub backend: BackendInfo, pub backend: BackendInfo,
} }
#[derive(Debug, Default)] #[derive(Debug, Default, Serialize)]
pub struct BackendDisks(HashMap<String, usize>); pub struct BackendDisks(HashMap<String, usize>);
impl BackendDisks { impl BackendDisks {
@@ -836,15 +836,24 @@ impl BackendDisks {
} }
} }
#[derive(Debug, Default)] #[derive(Debug, Default, Serialize)]
#[serde(rename_all = "PascalCase", default)]
pub struct BackendInfo { pub struct BackendInfo {
pub backend_type: BackendByte, pub backend_type: BackendByte,
pub online_disks: BackendDisks, pub online_disks: BackendDisks,
pub offline_disks: BackendDisks, pub offline_disks: BackendDisks,
pub standard_scdata: Vec<usize>, #[serde(rename = "StandardSCData")]
pub standard_scparities: Option<usize>, pub standard_sc_data: Vec<usize>,
pub rrscdata: Vec<usize>, #[serde(rename = "StandardSCParities")]
pub rrscparities: Option<usize>, pub standard_sc_parities: Vec<usize>,
#[serde(rename = "StandardSCParity")]
pub standard_sc_parity: Option<usize>,
#[serde(rename = "RRSCData")]
pub rr_sc_data: Vec<usize>,
#[serde(rename = "RRSCParities")]
pub rr_sc_parities: Vec<usize>,
#[serde(rename = "RRSCParity")]
pub rr_sc_parity: Option<usize>,
pub total_sets: Vec<usize>, pub total_sets: Vec<usize>,
pub drives_per_set: Vec<usize>, pub drives_per_set: Vec<usize>,
} }
+1
View File
@@ -21,3 +21,4 @@ quick-xml = "0.37.0"
serde-xml-rs = "0.6.0" serde-xml-rs = "0.6.0"
ecstore.workspace = true ecstore.workspace = true
time.workspace = true time.workspace = true
serde_json.workspace = true
+62 -4
View File
@@ -1,16 +1,24 @@
use std::collections::HashSet;
use crate::router::Operation; use crate::router::Operation;
use ecstore::bucket::policy::action::{Action, ActionSet};
use ecstore::bucket::policy::bucket_policy::{BPStatement, BucketPolicy};
use ecstore::bucket::policy::effect::Effect;
use ecstore::bucket::policy::resource::{Resource, ResourceSet};
use ecstore::store_api::StorageAPI;
use ecstore::utils::xml; use ecstore::utils::xml;
use ecstore::{new_object_layer_fn, store_api::BackendInfo};
use hyper::StatusCode; use hyper::StatusCode;
use matchit::Params; use matchit::Params;
use s3s::S3ErrorCode;
use s3s::{ use s3s::{
dto::{AssumeRoleOutput, Credentials, Timestamp}, dto::{AssumeRoleOutput, Credentials, Timestamp},
s3_error, Body, S3Request, S3Response, S3Result, s3_error, Body, S3Error, S3Request, S3Response, S3Result,
}; };
use serde::Deserialize; use serde::{Deserialize, Serialize};
use serde_urlencoded::from_bytes; use serde_urlencoded::from_bytes;
use time::{Duration, OffsetDateTime}; use time::{Duration, OffsetDateTime};
use tracing::warn; use tracing::warn;
#[derive(Deserialize, Debug, Default)] #[derive(Deserialize, Debug, Default)]
#[serde(rename_all = "PascalCase", default)] #[serde(rename_all = "PascalCase", default)]
pub struct AssumeRoleRequest { pub struct AssumeRoleRequest {
@@ -88,6 +96,14 @@ impl Operation for AssumeRoleHandle {
} }
} }
#[derive(Debug, Serialize, Default)]
#[serde(rename_all = "PascalCase", default)]
pub struct AccountInfo {
pub account_name: String,
pub server: BackendInfo,
pub policy: BucketPolicy,
}
pub struct AccountInfoHandler {} pub struct AccountInfoHandler {}
#[async_trait::async_trait] #[async_trait::async_trait]
impl Operation for AccountInfoHandler { impl Operation for AccountInfoHandler {
@@ -98,7 +114,49 @@ impl Operation for AccountInfoHandler {
warn!("AccountInfoHandler cread {:?}", &cred); warn!("AccountInfoHandler cread {:?}", &cred);
return Err(s3_error!(NotImplemented)); let layer = new_object_layer_fn();
let lock = layer.read().await;
let store = match lock.as_ref() {
Some(s) => s,
None => return Err(S3Error::with_message(S3ErrorCode::InternalError, "Not init".to_string())),
};
// test policy
let mut s3_all_act = HashSet::with_capacity(1);
s3_all_act.insert(Action::AllActions);
let mut all_res = HashSet::with_capacity(1);
all_res.insert(Resource::new("*"));
let bucket_policy = BucketPolicy {
id: "".to_owned(),
version: "2012-10-17".to_owned(),
statements: vec![BPStatement {
sid: "".to_owned(),
effect: Effect::Allow,
actions: ActionSet(s3_all_act),
resources: ResourceSet(all_res),
..Default::default()
}],
};
// let policy = bucket_policy
// .marshal_msg()
// .map_err(|_e| S3Error::with_message(S3ErrorCode::InternalError, "parse policy failed"))?;
let backend_info = store.backend_info().await;
let info = AccountInfo {
account_name: cred.access_key,
server: backend_info,
policy: bucket_policy,
};
let output = serde_json::to_string(&info)
.map_err(|_e| S3Error::with_message(S3ErrorCode::InternalError, "parse accountInfo failed"))?;
Ok(S3Response::new((StatusCode::OK, Body::from(output))))
} }
} }
+2 -2
View File
@@ -14,8 +14,8 @@ fi
export RUSTFS_STORAGE_CLASS_INLINE_BLOCK="512 KB" export RUSTFS_STORAGE_CLASS_INLINE_BLOCK="512 KB"
DATA_DIR_ARG="./target/volume/test{0...4}" # DATA_DIR_ARG="./target/volume/test{0...4}"
# DATA_DIR_ARG="./target/volume/test" DATA_DIR_ARG="./target/volume/test"
if [ -n "$1" ]; then if [ -n "$1" ]; then
DATA_DIR_ARG="$1" DATA_DIR_ARG="$1"