ceph-async 4.0.5

Forked from official ceph-rust. Async pr from jcsp was merged. A rust-lang specific interface to Ceph librados and Admin Sockets. You can create a Ceph development environment with the Chef automation tools: https://github.com/bloomberg/chef-bcs or with ceph-ansible. Chef-bcs uses the ceph-chef cookbook created and manage at github.com/ceph/ceph-chef. It will build out a full Ceph environment which you can then use for development etc. See README.md for details.
Documentation
#[cfg(feature = "rados_striper")]
use {ceph::ceph as ceph_helpers, ceph::error::RadosError, nix::errno::Errno, std::env, std::str};

#[cfg(not(feature = "rados_striper"))]
fn main() {}

#[cfg(feature = "rados_striper")]
fn main() {
    let user_id = "admin";
    let config_file = env::var("CEPH_CONF").unwrap_or("/etc/ceph/ceph.conf".to_string());
    let pool_name = "ceph-rust-test";

    println!("Connecting to ceph");
    let cluster = ceph_helpers::connect_to_ceph(user_id, &config_file).unwrap();

    println!("Creating pool {}", pool_name);
    match cluster.rados_create_pool(pool_name) {
        Ok(_) => {}
        Err(RadosError::ApiError(Errno::EEXIST)) => {
            cluster.rados_delete_pool(pool_name).unwrap();
            cluster.rados_create_pool(pool_name).unwrap();
        }
        Err(err) => panic!("{:?}", err),
    }

    let object_name = "ceph-rust-test-object";

    {
        println!("Creating ioctx");
        let ioctx = cluster.get_rados_ioctx(pool_name).unwrap();

        println!("Creating rados striper");
        let rados_striper = ioctx.get_rados_striper().unwrap();

        println!("Writing test object");
        rados_striper
            .rados_object_write(object_name, "lorem".as_bytes(), 0)
            .unwrap();
        rados_striper
            .rados_object_write(object_name, " ipsum".as_bytes(), 5)
            .unwrap();
    }

    {
        println!("Creating ioctx");
        let ioctx = cluster.get_rados_ioctx(pool_name).unwrap();

        println!("Creating rados striper");
        let rados_striper = ioctx.get_rados_striper().unwrap();

        println!("Getting test object stat");
        let (size, _) = rados_striper.rados_object_stat(object_name).unwrap();

        let mut read_buf = vec![0; size as usize];

        println!("Reading test object");
        rados_striper
            .rados_object_read(object_name, &mut read_buf, 0)
            .unwrap();

        let read_buf_str = str::from_utf8(&read_buf).unwrap();

        assert_eq!(read_buf_str, "lorem ipsum");
    }

    println!("Deleting pool {}", pool_name);
    cluster.rados_delete_pool(pool_name).unwrap();
}