mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-25 21:46:50 +00:00
fix(ecstore): parse ARN region and id in display order (#5790)
* test(ecstore): pin ARN display/parse round-trip field order * fix(ecstore): parse ARN region and id in display order
This commit is contained in:
@@ -56,11 +56,59 @@ impl FromStr for ARN {
|
|||||||
if parts.len() != 6 {
|
if parts.len() != 6 {
|
||||||
return Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Invalid ARN format"));
|
return Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Invalid ARN format"));
|
||||||
}
|
}
|
||||||
|
// Display emits `arn:rustfs:{type}:{region}:{id}:{bucket}`; read the
|
||||||
|
// segments back in the same order so parse(display(a)) == a.
|
||||||
Ok(ARN {
|
Ok(ARN {
|
||||||
arn_type: BucketTargetType::from_str(parts[2]).unwrap_or_default(),
|
arn_type: BucketTargetType::from_str(parts[2]).unwrap_or_default(),
|
||||||
id: parts[3].to_string(),
|
region: parts[3].to_string(),
|
||||||
region: parts[4].to_string(),
|
id: parts[4].to_string(),
|
||||||
bucket: parts[5].to_string(),
|
bucket: parts[5].to_string(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
/// Display emits `arn:rustfs:{type}:{region}:{id}:{bucket}` (madmin layout);
|
||||||
|
/// FromStr must read the same positions back so parse(display(a)) == a.
|
||||||
|
#[test]
|
||||||
|
fn from_str_round_trips_display_with_region_and_id() {
|
||||||
|
let arn = ARN::new(
|
||||||
|
BucketTargetType::ReplicationService,
|
||||||
|
"depl-123".to_string(),
|
||||||
|
"us-east-1".to_string(),
|
||||||
|
"bucket-a".to_string(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let parsed = ARN::from_str(&arn.to_string()).expect("display output must parse");
|
||||||
|
|
||||||
|
assert_eq!(parsed.arn_type, arn.arn_type);
|
||||||
|
assert_eq!(parsed.region, arn.region, "region must survive display->parse round-trip");
|
||||||
|
assert_eq!(parsed.id, arn.id, "id must survive display->parse round-trip");
|
||||||
|
assert_eq!(parsed.bucket, arn.bucket);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_str_reads_region_then_id_in_display_order() {
|
||||||
|
let parsed = ARN::from_str("arn:rustfs:replication:us-east-1:depl-123:bucket-a").expect("valid ARN must parse");
|
||||||
|
|
||||||
|
assert_eq!(parsed.arn_type, BucketTargetType::ReplicationService);
|
||||||
|
assert_eq!(parsed.region, "us-east-1");
|
||||||
|
assert_eq!(parsed.id, "depl-123");
|
||||||
|
assert_eq!(parsed.bucket, "bucket-a");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// RustFS commonly generates ARNs with an empty region:
|
||||||
|
/// `arn:rustfs:replication::<deployment_id>:<bucket>`.
|
||||||
|
#[test]
|
||||||
|
fn from_str_handles_empty_region_segment() {
|
||||||
|
let parsed = ARN::from_str("arn:rustfs:replication::depl-123:bucket-a").expect("valid ARN must parse");
|
||||||
|
|
||||||
|
assert_eq!(parsed.arn_type, BucketTargetType::ReplicationService);
|
||||||
|
assert_eq!(parsed.region, "", "region segment is empty in this form");
|
||||||
|
assert_eq!(parsed.id, "depl-123");
|
||||||
|
assert_eq!(parsed.bucket, "bucket-a");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user