ceph_async/
ceph_version.rs1use std::str::FromStr;
2
3use crate::error::RadosError;
4
5#[cfg(test)]
6mod tests {
7 use super::*;
8
9 #[test]
10 fn it_compares() {
11 assert!(CephVersion::Argonaut < CephVersion::Bobtail);
12 assert!(CephVersion::Luminous > CephVersion::Jewel);
13 }
14
15 #[test]
16 fn it_parses_jewel() {
17 let version: CephVersion = "ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)"
18 .parse()
19 .unwrap();
20 assert_eq!(version, CephVersion::Jewel);
21 }
22}
23
24#[non_exhaustive]
25#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
26pub enum CephVersion {
27 Argonaut,
28 Bobtail,
29 Cuttlefish,
30 Dumpling,
31 Emperor,
32 Firefly,
33 Giant,
34 Hammer,
35 Infernalis,
36 Jewel,
37 Kraken,
38 Luminous,
39 Mimic,
40 Nautilus,
41 Octopus,
42 Pacific,
43}
44
45impl FromStr for CephVersion {
46 type Err = RadosError;
47
48 fn from_str(s: &str) -> Result<Self, RadosError> {
52 use crate::CephVersion::*;
53 let mut parts = s.split(' ');
54 if let (Some(_ceph), Some(_version), Some(version_str)) =
55 (parts.next(), parts.next(), parts.next())
56 {
57 let mut version_parts = version_str.split('.');
58 if let (Some(major), Some(minor), Some(_patch)) = (
59 version_parts.next(),
60 version_parts.next(),
61 version_parts.next(),
62 ) {
63 match major {
64 "16" => return Ok(Pacific),
65 "15" => return Ok(Octopus),
66 "14" => return Ok(Nautilus),
67 "13" => return Ok(Mimic),
68 "12" => return Ok(Luminous),
69 "11" => return Ok(Kraken),
70 "10" => return Ok(Jewel),
71 "9" => return Ok(Infernalis),
72 "0" => match minor {
73 "94" => return Ok(Hammer),
74 "97" => return Ok(Giant),
75 "80" => return Ok(Firefly),
76 "72" => return Ok(Emperor),
77 "67" => return Ok(Dumpling),
78 "61" => return Ok(Cuttlefish),
79 "56" => return Ok(Bobtail),
80 "48" => return Ok(Argonaut),
81 _ => {}
82 },
83 _ => {}
84 }
85 }
86 }
87 Err(RadosError::Parse(s.into()))
88 }
89}