ceph_async/
ceph_version.rs

1use 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    /// Expects an input in the form that the `ceph --version` command, or the
49    /// rados version commands give them:
50    /// `ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)`
51    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}