├── .dockerignore ├── .editorconfig ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── Cargo.toml ├── Dockerfile ├── LICENSE.txt ├── Makefile ├── README.md ├── docs ├── COPYRIGHT.txt ├── FiraSans-LICENSE.txt ├── FiraSans-Medium.woff ├── FiraSans-Regular.woff ├── Heuristica-Italic.woff ├── Heuristica-LICENSE.txt ├── LICENSE-APACHE.txt ├── LICENSE-MIT.txt ├── SourceCodePro-LICENSE.txt ├── SourceCodePro-Regular.woff ├── SourceCodePro-Semibold.woff ├── SourceSerifPro-Bold.woff ├── SourceSerifPro-LICENSE.txt ├── SourceSerifPro-Regular.woff ├── ceph │ ├── index.html │ └── sidebar-items.js ├── ceph_rust │ ├── JsonData.t.html │ ├── JsonValue.t.html │ ├── error │ │ ├── RadosError.t.html │ │ ├── RadosResult.t.html │ │ ├── enum.RadosError.html │ │ ├── index.html │ │ ├── sidebar-items.js │ │ └── type.RadosResult.html │ ├── index.html │ ├── json │ │ ├── fn.json_as_string.html │ │ ├── fn.json_data.html │ │ ├── fn.json_find.html │ │ ├── index.html │ │ ├── json_as_string.v.html │ │ ├── json_data.v.html │ │ ├── json_find.v.html │ │ └── sidebar-items.js │ ├── rados │ │ ├── AllocFlags.t.html │ │ ├── LIBRADOS_CMPXATTR_OP_EQ.v.html │ │ ├── LIBRADOS_CMPXATTR_OP_GT.v.html │ │ ├── LIBRADOS_CMPXATTR_OP_GTE.v.html │ │ ├── LIBRADOS_CMPXATTR_OP_LT.v.html │ │ ├── LIBRADOS_CMPXATTR_OP_LTE.v.html │ │ ├── LIBRADOS_CMPXATTR_OP_NE.v.html │ │ ├── LIBRADOS_OPERATION_BALANCE_READS.v.html │ │ ├── LIBRADOS_OPERATION_IGNORE_CACHE.v.html │ │ ├── LIBRADOS_OPERATION_IGNORE_OVERLAY.v.html │ │ ├── LIBRADOS_OPERATION_LOCALIZE_READS.v.html │ │ ├── LIBRADOS_OPERATION_NOFLAG.v.html │ │ ├── LIBRADOS_OPERATION_ORDER_READS_WRITES.v.html │ │ ├── LIBRADOS_OPERATION_SKIPRWLOCKS.v.html │ │ ├── LIBRADOS_OP_FLAG_EXCL.v.html │ │ ├── LIBRADOS_OP_FLAG_FADVISE_DONTNEED.v.html │ │ ├── LIBRADOS_OP_FLAG_FADVISE_NOCACHE.v.html │ │ ├── LIBRADOS_OP_FLAG_FADVISE_RANDOM.v.html │ │ ├── LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL.v.html │ │ ├── LIBRADOS_OP_FLAG_FADVISE_WILLNEED.v.html │ │ ├── LIBRADOS_OP_FLAG_FAILOK.v.html │ │ ├── OperationFlags.t.html │ │ ├── Struct_rados_cluster_stat_t.t.html │ │ ├── Struct_rados_pool_stat_t.t.html │ │ ├── XattrFlags.t.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_EQ.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_GT.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_GTE.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_LT.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_LTE.html │ │ ├── constant.LIBRADOS_CMPXATTR_OP_NE.html │ │ ├── constant.LIBRADOS_OPERATION_BALANCE_READS.html │ │ ├── constant.LIBRADOS_OPERATION_IGNORE_CACHE.html │ │ ├── constant.LIBRADOS_OPERATION_IGNORE_OVERLAY.html │ │ ├── constant.LIBRADOS_OPERATION_LOCALIZE_READS.html │ │ ├── constant.LIBRADOS_OPERATION_NOFLAG.html │ │ ├── constant.LIBRADOS_OPERATION_ORDER_READS_WRITES.html │ │ ├── constant.LIBRADOS_OPERATION_SKIPRWLOCKS.html │ │ ├── constant.LIBRADOS_OP_FLAG_EXCL.html │ │ ├── constant.LIBRADOS_OP_FLAG_FADVISE_DONTNEED.html │ │ ├── constant.LIBRADOS_OP_FLAG_FADVISE_NOCACHE.html │ │ ├── constant.LIBRADOS_OP_FLAG_FADVISE_RANDOM.html │ │ ├── constant.LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL.html │ │ ├── constant.LIBRADOS_OP_FLAG_FADVISE_WILLNEED.html │ │ ├── constant.LIBRADOS_OP_FLAG_FAILOK.html │ │ ├── index.html │ │ ├── rados_callback_t.t.html │ │ ├── rados_completion_t.t.html │ │ ├── rados_config_t.t.html │ │ ├── rados_ioctx_t.t.html │ │ ├── rados_list_ctx_t.t.html │ │ ├── rados_log_callback_t.t.html │ │ ├── rados_omap_iter_t.t.html │ │ ├── rados_read_op_t.t.html │ │ ├── rados_snap_t.t.html │ │ ├── rados_t.t.html │ │ ├── rados_watchcb2_t.t.html │ │ ├── rados_watchcb_t.t.html │ │ ├── rados_watcherrcb_t.t.html │ │ ├── rados_write_op_t.t.html │ │ ├── rados_xattrs_iter_t.t.html │ │ ├── sidebar-items.js │ │ ├── struct.AllocFlags.html │ │ ├── struct.OperationFlags.html │ │ ├── struct.Struct_rados_cluster_stat_t.html │ │ ├── struct.Struct_rados_pool_stat_t.html │ │ ├── struct.XattrFlags.html │ │ ├── type.rados_callback_t.html │ │ ├── type.rados_completion_t.html │ │ ├── type.rados_config_t.html │ │ ├── type.rados_ioctx_t.html │ │ ├── type.rados_list_ctx_t.html │ │ ├── type.rados_log_callback_t.html │ │ ├── type.rados_omap_iter_t.html │ │ ├── type.rados_read_op_t.html │ │ ├── type.rados_snap_t.html │ │ ├── type.rados_t.html │ │ ├── type.rados_watchcb2_t.html │ │ ├── type.rados_watchcb_t.html │ │ ├── type.rados_watcherrcb_t.html │ │ ├── type.rados_write_op_t.html │ │ └── type.rados_xattrs_iter_t.html │ ├── sidebar-items.js │ ├── status │ │ ├── CephStatus.t.html │ │ ├── CephStatusHealth.t.html │ │ ├── CephStatusHealth2.t.html │ │ ├── CephStatusHealthDetail.t.html │ │ ├── CephStatusHealthMons.t.html │ │ ├── CephStatusHealthServices.t.html │ │ ├── CephStatusHealthServicesMon.t.html │ │ ├── CephStatusHealthServicesMonStats.t.html │ │ ├── CephStatusHealthSummary.t.html │ │ ├── CephStatusHealthTimeChecks.t.html │ │ ├── CephStatusMDSMap.t.html │ │ ├── CephStatusMDSRank.t.html │ │ ├── CephStatusMonMap.t.html │ │ ├── CephStatusMonRank.t.html │ │ ├── CephStatusOSDMapH.t.html │ │ ├── CephStatusOSDMapL.t.html │ │ ├── CephStatusPGMap.t.html │ │ ├── CephStatusPGState.t.html │ │ ├── index.html │ │ ├── sidebar-items.js │ │ ├── struct.CephStatus.html │ │ ├── struct.CephStatusHealth.html │ │ ├── struct.CephStatusHealth2.html │ │ ├── struct.CephStatusHealthDetail.html │ │ ├── struct.CephStatusHealthMons.html │ │ ├── struct.CephStatusHealthServices.html │ │ ├── struct.CephStatusHealthServicesMon.html │ │ ├── struct.CephStatusHealthServicesMonStats.html │ │ ├── struct.CephStatusHealthSummary.html │ │ ├── struct.CephStatusHealthTimeChecks.html │ │ ├── struct.CephStatusMDSMap.html │ │ ├── struct.CephStatusMDSRank.html │ │ ├── struct.CephStatusMonMap.html │ │ ├── struct.CephStatusMonRank.html │ │ ├── struct.CephStatusOSDMapH.html │ │ ├── struct.CephStatusOSDMapL.html │ │ ├── struct.CephStatusPGMap.html │ │ └── struct.CephStatusPGState.html │ ├── type.JsonData.html │ ├── type.JsonValue.html │ └── utils │ │ ├── fn.run_args.html │ │ ├── fn.run_cli.html │ │ ├── index.html │ │ ├── run_args.v.html │ │ ├── run_cli.v.html │ │ └── sidebar-items.js ├── implementors │ ├── core │ │ ├── clone │ │ │ └── trait.Clone.js │ │ ├── cmp │ │ │ ├── trait.Eq.js │ │ │ ├── trait.Ord.js │ │ │ ├── trait.PartialEq.js │ │ │ └── trait.PartialOrd.js │ │ ├── convert │ │ │ └── trait.From.js │ │ ├── default │ │ │ └── trait.Default.js │ │ ├── fmt │ │ │ ├── trait.Debug.js │ │ │ └── trait.Display.js │ │ ├── hash │ │ │ └── trait.Hash.js │ │ ├── iter │ │ │ └── traits │ │ │ │ ├── trait.Extend.js │ │ │ │ └── trait.FromIterator.js │ │ ├── marker │ │ │ └── trait.Copy.js │ │ └── ops │ │ │ ├── trait.BitAnd.js │ │ │ ├── trait.BitAndAssign.js │ │ │ ├── trait.BitOr.js │ │ │ ├── trait.BitOrAssign.js │ │ │ ├── trait.BitXor.js │ │ │ ├── trait.BitXorAssign.js │ │ │ ├── trait.Not.js │ │ │ ├── trait.Sub.js │ │ │ └── trait.SubAssign.js │ ├── rustc_serialize │ │ └── serialize │ │ │ ├── trait.Decodable.js │ │ │ └── trait.Encodable.js │ └── std │ │ └── error │ │ └── trait.Error.js ├── jquery.js ├── main.css ├── main.js ├── normalize.css ├── rustdoc.css ├── search-index.js └── src │ ├── ceph │ └── examples │ │ └── ceph.rs.html │ └── ceph_rust │ ├── error.rs.html │ ├── json.rs.html │ ├── lib.rs.html │ ├── rados.rs.html │ ├── src │ ├── error.rs.html │ ├── json.rs.html │ ├── lib.rs.html │ ├── rados.rs.html │ ├── status.rs.html │ └── utils.rs.html │ ├── status.rs.html │ └── utils.rs.html ├── entrypoint.sh ├── examples ├── ceph.rs ├── rados_striper.rs └── status.rs ├── gen_docs.sh ├── micro-osd.sh ├── rust-toolchain.toml ├── sample_files ├── ceph_admin_socket_client_commands.json ├── ceph_admin_socket_mon_commands.json ├── ceph_admin_socket_osd_commands.json ├── ceph_librados_commands.json └── ceph_status_format_json.json ├── setup-micro-osd.sh ├── src ├── admin_sockets.rs ├── ceph.rs ├── ceph_client.rs ├── ceph_version.rs ├── ceph_volume.rs ├── cmd.rs ├── error.rs ├── json.rs ├── lib.rs ├── mon_command.rs ├── rados.rs ├── rados_striper.rs ├── status.rs └── utils.rs └── tests ├── ceph_health-jewel ├── integration_tests.rs ├── mon_status-hammer ├── mon_status-jewel ├── mon_status-nautilus ├── osd_tree-hammer ├── osd_tree-jewel └── rados_striper_all.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # NOTE: If using Atom then install the EditorConfig plugin. Go to editorconfig.org. 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 4 8 | end_of_line = lf 9 | charset = utf-8 10 | trim_trailing_whitespace = true 11 | insert_final_newline = true 12 | 13 | # 4 space indentation 14 | [*.py] 15 | indent_size = 4 16 | 17 | # Tab indentation (no size specified) 18 | [Makefile] 19 | indent_style = tab 20 | 21 | [*.md] 22 | trim_trailing_whitespace = false 23 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | push: 8 | branches: 9 | - master 10 | 11 | env: 12 | RUSTFLAGS: -Dwarnings 13 | 14 | jobs: 15 | build_and_test: 16 | name: Build and test 17 | runs-on: ${{ matrix.os }} 18 | strategy: 19 | matrix: 20 | os: [ubuntu-latest] 21 | rust: [nightly, beta, stable] 22 | 23 | steps: 24 | - uses: actions/checkout@v4 25 | 26 | - name: Install ${{ matrix.rust }} 27 | run: rustup install ${{ matrix.rust }} 28 | 29 | - name: Install Ceph 30 | run: | 31 | sudo apt-get update 32 | sudo apt-get install -y apt-transport-https 33 | wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - 34 | echo "deb https://download.ceph.com/debian-octopus/ focal main" | sudo tee /etc/apt/sources.list.d/ceph.list 35 | sudo apt-get update -y 36 | sudo apt-get install -y --no-install-recommends uuid-runtime ceph-mgr ceph-mon ceph-osd ceph-mds librados-dev libradosstriper-dev 37 | 38 | - name: check 39 | run: cargo check --all-targets 40 | 41 | - name: check rados_striper 42 | run: cargo check --features rados_striper --all-targets 43 | 44 | - name: tests 45 | run: cargo test --all-targets 46 | 47 | cross: 48 | name: Cross compile 49 | runs-on: ubuntu-latest 50 | strategy: 51 | matrix: 52 | target: 53 | - i686-unknown-linux-gnu 54 | - armv7-unknown-linux-gnueabihf 55 | - aarch64-unknown-linux-gnu 56 | 57 | steps: 58 | - uses: actions/checkout@v4 59 | 60 | - name: Install nightly 61 | run: rustup install nightly 62 | 63 | - name: Install cross 64 | run: cargo install cross 65 | 66 | - name: check 67 | run: cross check --all --target ${{ matrix.target }} 68 | 69 | check_fmt_and_docs: 70 | name: Checking fmt and docs 71 | runs-on: ubuntu-latest 72 | steps: 73 | - uses: actions/checkout@v4 74 | - name: fmt 75 | run: cargo fmt --all -- --check 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | **/*.rs.bk 3 | Cargo.lock 4 | vscode.code-workspace 5 | .build-docker 6 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ceph" 3 | version = "3.2.5" 4 | authors = [ 5 | "Chris Jones ", 6 | "Chris Holcombe ", 7 | "Chris MacNaughton ", 8 | ] 9 | license = "Apache-2.0" 10 | readme = "README.md" 11 | 12 | # This is a list of up to five keywords that describe this crate. Keywords 13 | # are searchable on crates.io, and you may choose any words that would 14 | # help someone find this crate. 15 | keywords = ["ceph", "storage"] 16 | 17 | # This is a list of up to five categories where this crate would fit. 18 | # Categories are a fixed list available at crates.io/category_slugs, and 19 | # they must match exactly. 20 | categories = ["filesystem"] 21 | 22 | documentation = "https://docs.rs/ceph" 23 | repository = "https://github.com/ceph/ceph-rust" 24 | homepage = "https://github.com/ceph/ceph-rust" 25 | 26 | description = """ 27 | Official Ceph-rust. A rust-lang specific interface to Ceph librados and Admin Sockets. You can create a Ceph development environment with the 28 | Chef automation tools: https://github.com/bloomberg/chef-bcs or with ceph-ansible. Chef-bcs uses the ceph-chef cookbook 29 | created and manage at github.com/ceph/ceph-chef. It will build out a full Ceph environment which you can then use 30 | for development etc. See README.md for details. 31 | """ 32 | edition = "2018" 33 | 34 | [dependencies] 35 | bitflags = "1.2.1" 36 | byteorder = "1" 37 | libc = "~0.2" 38 | nom = "6" 39 | serde_derive = "1" 40 | serde = "1" 41 | serde_json = "1" 42 | uuid = { version = "~0.8", features = ["serde"] } 43 | nix = "0.29" 44 | tracing = "0.1" 45 | 46 | [features] 47 | default = [] 48 | rados_striper = [] 49 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM buildpack-deps:focal 2 | 3 | ENV RUSTUP_HOME=/usr/local/rustup \ 4 | CARGO_HOME=/usr/local/cargo \ 5 | PATH=/usr/local/cargo/bin:$PATH \ 6 | RUST_VERSION=1.46.0 7 | 8 | RUN set -eux; \ 9 | dpkgArch="$(dpkg --print-architecture)"; \ 10 | case "${dpkgArch##*-}" in \ 11 | amd64) rustArch='x86_64-unknown-linux-gnu';; \ 12 | armhf) rustArch='armv7-unknown-linux-gnueabihf';; \ 13 | arm64) rustArch='aarch64-unknown-linux-gnu';; \ 14 | i386) rustArch='i686-unknown-linux-gnu';; \ 15 | *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \ 16 | esac; \ 17 | url="https://static.rust-lang.org/rustup/archive/1.22.1/${rustArch}/rustup-init"; \ 18 | wget "$url"; \ 19 | wget "$url.sha256"; \ 20 | sed -i 's/target.*/rustup-init/g' rustup-init.sha256; \ 21 | sha256sum -c rustup-init.sha256; \ 22 | chmod +x rustup-init; \ 23 | ./rustup-init -y --no-modify-path --default-toolchain $RUST_VERSION; \ 24 | rm rustup-init; \ 25 | chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ 26 | rustup --version; \ 27 | cargo --version; \ 28 | rustc --version; 29 | 30 | RUN apt-get update \ 31 | && apt-get install apt-transport-https \ 32 | && wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add - \ 33 | && echo "deb https://download.ceph.com/debian-octopus/ focal main" > /etc/apt/sources.list.d/ceph.list \ 34 | && apt-get update \ 35 | && apt-get install -y --no-install-recommends \ 36 | uuid-runtime \ 37 | ceph-mgr ceph-mon ceph-osd ceph-mds \ 38 | librados-dev libradosstriper-dev 39 | 40 | # update crates.io index 41 | RUN cargo search --limit 0 42 | 43 | WORKDIR /ceph-rust 44 | 45 | COPY micro-osd.sh / 46 | COPY setup-micro-osd.sh / 47 | COPY entrypoint.sh / 48 | 49 | CMD /entrypoint.sh 50 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | DOCKER_CI_IMAGE = ceph-rust-ci 2 | 3 | build: 4 | cargo build 5 | fmt: 6 | cargo fmt 7 | test: 8 | cargo test 9 | 10 | test-docker: .build-docker 11 | docker run --rm -it -v $(CURDIR):/ceph-rust $(DOCKER_CI_IMAGE) 12 | 13 | shell-docker: .build-docker 14 | docker run --rm -it -v $(CURDIR):/ceph-rust $(DOCKER_CI_IMAGE) bash 15 | # Now you can run 16 | # . /setup-micro-osd.sh 17 | # cargo build 18 | 19 | .build-docker: 20 | docker build -t $(DOCKER_CI_IMAGE) . 21 | @docker inspect -f '{{.Id}}' $(DOCKER_CI_IMAGE) > .build-docker 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Ceph Rust 2 | ### Official Ceph Rust interface 3 | 4 | [![Build Status](https://github.com/ceph/ceph-rust/workflows/CI/badge.svg)](https://github.com/ceph/ceph-rust/actions?query=workflow%3ACI) 5 | [![Version info](https://img.shields.io/crates/v/ceph.svg)](https://crates.io/crates/ceph) 6 | [![slack](https://img.shields.io/badge/slack-Join%20us!-brightgreen.svg?logo=slack)](https://join.slack.com/t/ceph-storage/shared_invite/zt-2ptxrb851-FzpqR7ShQcvlkI4JCWeoEw) 7 | 8 | Official Ceph Rust-lang interface. Contributions welcomed! 9 | 10 | This library is the core librados Rust interface for Ceph. It also supports Admin Socket commands. 11 | 12 | ### Build requirements 13 | 14 | Librados must be installed. 15 | 16 | On CentOS/RHEL - Ceph Hammer librados is located in /usr/lib64. So, to get rust to see it you need to create a new symlink: 17 | `sudo ln -s /usr/lib64/librados.so.2.0.0 /usr/lib64/librados.so` 18 | 19 | On Ubuntu - Ceph Hammer librados is located in /usr/lib. So, to get rust to see it you need to create a new symlink: 20 | `sudo ln -s /usr/lib/librados.so.2.0.0 /usr/lib/librados.so` 21 | 22 | There may be another way to change the link name in rust without having to create a symlink. 23 | 24 | On MacOS, you can install librados via homebrew: 25 | 26 | ```shell 27 | $ brew tap zeichenanonym/ceph-client 28 | $ brew install ceph-client 29 | ``` 30 | 31 | ### Ceph 32 | Create a Ceph development environment or use an existing Ceph environment. 33 | 34 | If creating a Ceph environment then use the following. It will generate a 4 node Virtual Box Ceph system with one 35 | node being a bootstrap node that controls the other. The remaining 3 nodes are Ceph nodes (Mons, OSDs, RGWs, APIs). 36 | 37 | Created and manage github.com/ceph/ceph-chef (Chef cookbooks for Ceph) and the Bloomberg github.com link below for chef-bcs. Chef-bcs uses ceph-chef. These are the same tools at Bloomberg. 38 | 39 | Requirements for Mac OSX: 40 | 1. VirtualBox 41 | 2. git 42 | 3. Locate an area where you would like to install the Ceph build environment 43 | 4. git clone https://github.com/bloomberg/chef-bcs.git 44 | 45 | ```shell 46 | $ cd chef-bcs 47 | $ cd /bootstrap/vms/vagrant 48 | $ ./CEPH_UP 49 | ``` 50 | 51 | **NOTE: If using the latest version of chef-bcs, you can enable an automatic development environment to be built with all of the development tools. See the project for details. It does it by default for Vagrant build.** 52 | 53 | This will take about 30 minutes to build out. It installs CentOS 7.3, downloads all of the parts required to get Ceph up and running with good options. 54 | 55 | Once complete you can then login to the first node: 56 | 57 | `$ vagrant ssh ceph-vm1` 58 | 59 | Run `ceph -s` to make sure you see Ceph running. Now you can install the development environment and Rust. 60 | 61 | ### Rust 62 | (In ceph-vm1 node) 63 | ``` 64 | curl -sSf https://static.rust-lang.org/rustup.sh | sh 65 | ``` 66 | OR 67 | ``` 68 | curl https://sh.rustup.rs -sSf | sh 69 | ``` 70 | 71 | ### Yum 72 | (In ceph-vm1 node) - Note: This is automatically done for you if you installed the environment vi Chef-bcs as noted above. 73 | 74 | ``` 75 | mkdir -p projects/lambdastack 76 | cd projects/lambdastack 77 | 78 | Requirements for development: 79 | sudo yum install -y git cmake 80 | sudo yum install -y openssl openssl-devel 81 | ``` 82 | 83 | Clone ceph-rust project: 84 | ``` 85 | git clone https://github.com/lambdastackio/ceph-rust.git 86 | ``` 87 | 88 | NOTE: Make sure you have setup your favorite editor. Vim is automatically installed. 89 | 90 | ### AWS S3 Object Store 91 | Crate (library): aws-sdk-rust at https://github.com/lambdastackio/aws-sdk-rust 92 | 93 | ### AWS S3 CLI Utility 94 | Crate (binary): s3lsio at https://github.com/lambdastackio/s3lsio 95 | 96 | ### Ceph Admin Commands 97 | 98 | An example of finding a mon socket in a generic like environment. 99 | ``` 100 | ceph-conf --name mon.$(hostname -s) --show-config-value admin_socket 101 | ``` 102 | 103 | The raw admin_socket commands can be found in: 104 | /src/ceph_admin_socket_mon_commands.json 105 | /src/ceph_admin_socket_osd_commands.json 106 | /src/ceph_admin_socket_client_commands.json 107 | 108 | A number of them are the same. 109 | 110 | ------------ 111 | Portions originated from Chris Holcombe at https://github.com/cholcombe973 112 | -------------------------------------------------------------------------------- /docs/COPYRIGHT.txt: -------------------------------------------------------------------------------- 1 | These documentation pages include resources by third parties. This copyright 2 | file applies only to those resources. The following third party resources are 3 | included, and carry their own copyright notices and license terms: 4 | 5 | * Fira Sans (FiraSans-Regular.woff, FiraSans-Medium.woff): 6 | 7 | Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ 8 | with Reserved Font Name Fira Sans. 9 | 10 | Copyright (c) 2014, Telefonica S.A. 11 | 12 | Licensed under the SIL Open Font License, Version 1.1. 13 | See FiraSans-LICENSE.txt. 14 | 15 | * Heuristica (Heuristica-Italic.woff): 16 | 17 | Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved. 18 | Utopia is either a registered trademark or trademark of Adobe Systems 19 | Incorporated in the United States and/or other countries. Used under 20 | license. 21 | 22 | Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net 23 | 24 | Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru), 25 | with Reserved Font Name Heuristica. 26 | 27 | Licensed under the SIL Open Font License, Version 1.1. 28 | See Heuristica-LICENSE.txt. 29 | 30 | * rustdoc.css, main.js, and playpen.js: 31 | 32 | Copyright 2015 The Rust Developers. 33 | Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or 34 | the MIT license (LICENSE-MIT.txt) at your option. 35 | 36 | * normalize.css: 37 | 38 | Copyright (c) Nicolas Gallagher and Jonathan Neal. 39 | Licensed under the MIT license (see LICENSE-MIT.txt). 40 | 41 | * Source Code Pro (SourceCodePro-Regular.woff, SourceCodePro-Semibold.woff): 42 | 43 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), 44 | with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark 45 | of Adobe Systems Incorporated in the United States and/or other countries. 46 | 47 | Licensed under the SIL Open Font License, Version 1.1. 48 | See SourceCodePro-LICENSE.txt. 49 | 50 | * Source Serif Pro (SourceSerifPro-Regular.woff, SourceSerifPro-Bold.woff): 51 | 52 | Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with 53 | Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of 54 | Adobe Systems Incorporated in the United States and/or other countries. 55 | 56 | Licensed under the SIL Open Font License, Version 1.1. 57 | See SourceSerifPro-LICENSE.txt. 58 | 59 | This copyright file is intended to be distributed with rustdoc output. 60 | -------------------------------------------------------------------------------- /docs/FiraSans-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ 2 | with Reserved Font Name Fira Sans. 3 | 4 | Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ 5 | with Reserved Font Name Fira Mono. 6 | 7 | Copyright (c) 2014, Telefonica S.A. 8 | 9 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 10 | This license is copied below, and is also available with a FAQ at: 11 | http://scripts.sil.org/OFL 12 | 13 | 14 | ----------------------------------------------------------- 15 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 16 | ----------------------------------------------------------- 17 | 18 | PREAMBLE 19 | The goals of the Open Font License (OFL) are to stimulate worldwide 20 | development of collaborative font projects, to support the font creation 21 | efforts of academic and linguistic communities, and to provide a free and 22 | open framework in which fonts may be shared and improved in partnership 23 | with others. 24 | 25 | The OFL allows the licensed fonts to be used, studied, modified and 26 | redistributed freely as long as they are not sold by themselves. The 27 | fonts, including any derivative works, can be bundled, embedded, 28 | redistributed and/or sold with any software provided that any reserved 29 | names are not used by derivative works. The fonts and derivatives, 30 | however, cannot be released under any other type of license. The 31 | requirement for fonts to remain under this license does not apply 32 | to any document created using the fonts or their derivatives. 33 | 34 | DEFINITIONS 35 | "Font Software" refers to the set of files released by the Copyright 36 | Holder(s) under this license and clearly marked as such. This may 37 | include source files, build scripts and documentation. 38 | 39 | "Reserved Font Name" refers to any names specified as such after the 40 | copyright statement(s). 41 | 42 | "Original Version" refers to the collection of Font Software components as 43 | distributed by the Copyright Holder(s). 44 | 45 | "Modified Version" refers to any derivative made by adding to, deleting, 46 | or substituting -- in part or in whole -- any of the components of the 47 | Original Version, by changing formats or by porting the Font Software to a 48 | new environment. 49 | 50 | "Author" refers to any designer, engineer, programmer, technical 51 | writer or other person who contributed to the Font Software. 52 | 53 | PERMISSION & CONDITIONS 54 | Permission is hereby granted, free of charge, to any person obtaining 55 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 56 | redistribute, and sell modified and unmodified copies of the Font 57 | Software, subject to the following conditions: 58 | 59 | 1) Neither the Font Software nor any of its individual components, 60 | in Original or Modified Versions, may be sold by itself. 61 | 62 | 2) Original or Modified Versions of the Font Software may be bundled, 63 | redistributed and/or sold with any software, provided that each copy 64 | contains the above copyright notice and this license. These can be 65 | included either as stand-alone text files, human-readable headers or 66 | in the appropriate machine-readable metadata fields within text or 67 | binary files as long as those fields can be easily viewed by the user. 68 | 69 | 3) No Modified Version of the Font Software may use the Reserved Font 70 | Name(s) unless explicit written permission is granted by the corresponding 71 | Copyright Holder. This restriction only applies to the primary font name as 72 | presented to the users. 73 | 74 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 75 | Software shall not be used to promote, endorse or advertise any 76 | Modified Version, except to acknowledge the contribution(s) of the 77 | Copyright Holder(s) and the Author(s) or with their explicit written 78 | permission. 79 | 80 | 5) The Font Software, modified or unmodified, in part or in whole, 81 | must be distributed entirely under this license, and must not be 82 | distributed under any other license. The requirement for fonts to 83 | remain under this license does not apply to any document created 84 | using the Font Software. 85 | 86 | TERMINATION 87 | This license becomes null and void if any of the above conditions are 88 | not met. 89 | 90 | DISCLAIMER 91 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 92 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 93 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 94 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 95 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 96 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 97 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 98 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 99 | OTHER DEALINGS IN THE FONT SOFTWARE. 100 | -------------------------------------------------------------------------------- /docs/FiraSans-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/FiraSans-Medium.woff -------------------------------------------------------------------------------- /docs/FiraSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/FiraSans-Regular.woff -------------------------------------------------------------------------------- /docs/Heuristica-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/Heuristica-Italic.woff -------------------------------------------------------------------------------- /docs/LICENSE-MIT.txt: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /docs/SourceCodePro-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | 5 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /docs/SourceCodePro-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/SourceCodePro-Regular.woff -------------------------------------------------------------------------------- /docs/SourceCodePro-Semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/SourceCodePro-Semibold.woff -------------------------------------------------------------------------------- /docs/SourceSerifPro-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/SourceSerifPro-Bold.woff -------------------------------------------------------------------------------- /docs/SourceSerifPro-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | 5 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /docs/SourceSerifPro-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ceph/ceph-rust/6c97a41a758a0946b014a9e224c0974571dda7c2/docs/SourceSerifPro-Regular.woff -------------------------------------------------------------------------------- /docs/ceph/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 28 | 29 | 33 | 34 | 44 | 45 |
46 |

Crate ceph 47 | 48 | [] 49 | 50 | [src]

51 |
52 | 53 | 54 | 55 | 56 | 101 | 102 | 103 | 104 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({}); -------------------------------------------------------------------------------- /docs/ceph_rust/JsonData.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.JsonData.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/JsonValue.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.JsonValue.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/error/RadosError.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to enum.RadosError.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/error/RadosResult.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.RadosResult.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/error/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"enum":[["RadosError","Custom error handling for the library"]],"type":[["RadosResult",""]]}); -------------------------------------------------------------------------------- /docs/ceph_rust/json/json_as_string.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to fn.json_as_string.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/json/json_data.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to fn.json_data.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/json/json_find.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to fn.json_find.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/json/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"fn":[["json_as_string","More specific String cast of an individual JsonData object."],["json_data","First json call that takes a JSON formatted string and converts it to JsonData object that can then be traversed using `json_find` via the key path."],["json_find","Looks for the parent object first and then the 'child' object. If the parent object is None then it only looks for the 'child' object. The parent object is used for situations where there may be 'child' objects with the same name."]]}); -------------------------------------------------------------------------------- /docs/ceph_rust/rados/AllocFlags.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.AllocFlags.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_EQ.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_EQ.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_GT.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_GT.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_GTE.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_GTE.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_LT.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_LT.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_LTE.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_LTE.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_CMPXATTR_OP_NE.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_CMPXATTR_OP_NE.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_BALANCE_READS.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_BALANCE_READS.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_IGNORE_CACHE.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_IGNORE_CACHE.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_IGNORE_OVERLAY.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_IGNORE_OVERLAY.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_LOCALIZE_READS.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_LOCALIZE_READS.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_NOFLAG.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_NOFLAG.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_ORDER_READS_WRITES.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_ORDER_READS_WRITES.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OPERATION_SKIPRWLOCKS.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OPERATION_SKIPRWLOCKS.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_EXCL.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_EXCL.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FADVISE_DONTNEED.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FADVISE_DONTNEED.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FADVISE_NOCACHE.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FADVISE_NOCACHE.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FADVISE_RANDOM.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FADVISE_RANDOM.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FADVISE_WILLNEED.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FADVISE_WILLNEED.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/LIBRADOS_OP_FLAG_FAILOK.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to constant.LIBRADOS_OP_FLAG_FAILOK.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/OperationFlags.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.OperationFlags.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/Struct_rados_cluster_stat_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.Struct_rados_cluster_stat_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/Struct_rados_pool_stat_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.Struct_rados_pool_stat_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/XattrFlags.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.XattrFlags.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_EQ.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_EQ - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_EQ 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_EQ: XattrFlags = XattrFlags{bits: 1,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_GT.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_GT - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_GT 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_GT: XattrFlags = XattrFlags{bits: 3,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_GTE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_GTE - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_GTE 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_GTE: XattrFlags = XattrFlags{bits: 4,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_LT.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_LT - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_LT 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_LT: XattrFlags = XattrFlags{bits: 5,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_LTE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_LTE - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_LTE 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_LTE: XattrFlags = XattrFlags{bits: 6,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_CMPXATTR_OP_NE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_CMPXATTR_OP_NE - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_CMPXATTR_OP_NE 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_CMPXATTR_OP_NE: XattrFlags = XattrFlags{bits: 2,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_OPERATION_NOFLAG.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_OPERATION_NOFLAG - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_OPERATION_NOFLAG 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_OPERATION_NOFLAG: OperationFlags = OperationFlags{bits: 0,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_OP_FLAG_EXCL.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_OP_FLAG_EXCL - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_OP_FLAG_EXCL 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_OP_FLAG_EXCL: AllocFlags = AllocFlags{bits: 1,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/constant.LIBRADOS_OP_FLAG_FAILOK.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::LIBRADOS_OP_FLAG_FAILOK - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Constant ceph_rust::rados::LIBRADOS_OP_FLAG_FAILOK 48 | 49 | [] 50 | 51 |

52 |
pub const LIBRADOS_OP_FLAG_FAILOK: AllocFlags = AllocFlags{bits: 2,}
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_callback_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_callback_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_completion_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_completion_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_config_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_config_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_ioctx_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_ioctx_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_list_ctx_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_list_ctx_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_log_callback_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_log_callback_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_omap_iter_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_omap_iter_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_read_op_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_read_op_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_snap_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_snap_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_watchcb2_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_watchcb2_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_watchcb_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_watchcb_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_watcherrcb_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_watcherrcb_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_write_op_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_write_op_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/rados_xattrs_iter_t.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to type.rados_xattrs_iter_t.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"constant":[["LIBRADOS_CMPXATTR_OP_EQ",""],["LIBRADOS_CMPXATTR_OP_GT",""],["LIBRADOS_CMPXATTR_OP_GTE",""],["LIBRADOS_CMPXATTR_OP_LT",""],["LIBRADOS_CMPXATTR_OP_LTE",""],["LIBRADOS_CMPXATTR_OP_NE",""],["LIBRADOS_OPERATION_BALANCE_READS",""],["LIBRADOS_OPERATION_IGNORE_CACHE",""],["LIBRADOS_OPERATION_IGNORE_OVERLAY",""],["LIBRADOS_OPERATION_LOCALIZE_READS",""],["LIBRADOS_OPERATION_NOFLAG",""],["LIBRADOS_OPERATION_ORDER_READS_WRITES",""],["LIBRADOS_OPERATION_SKIPRWLOCKS",""],["LIBRADOS_OP_FLAG_EXCL",""],["LIBRADOS_OP_FLAG_FADVISE_DONTNEED",""],["LIBRADOS_OP_FLAG_FADVISE_NOCACHE",""],["LIBRADOS_OP_FLAG_FADVISE_RANDOM",""],["LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL",""],["LIBRADOS_OP_FLAG_FADVISE_WILLNEED",""],["LIBRADOS_OP_FLAG_FAILOK",""]],"struct":[["AllocFlags",""],["OperationFlags",""],["Struct_rados_cluster_stat_t",""],["Struct_rados_pool_stat_t",""],["XattrFlags",""]],"type":[["rados_callback_t",""],["rados_completion_t",""],["rados_config_t",""],["rados_ioctx_t",""],["rados_list_ctx_t",""],["rados_log_callback_t",""],["rados_omap_iter_t",""],["rados_read_op_t",""],["rados_snap_t",""],["rados_t",""],["rados_watchcb2_t",""],["rados_watchcb_t",""],["rados_watcherrcb_t",""],["rados_write_op_t",""],["rados_xattrs_iter_t",""]]}); -------------------------------------------------------------------------------- /docs/ceph_rust/rados/type.rados_snap_t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::rados_snap_t - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Type Definition ceph_rust::rados::rados_snap_t 48 | 49 | [] 50 | 51 | [src]

52 |
type rados_snap_t = uint64_t;
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/rados/type.rados_t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::rados::rados_t - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Type Definition ceph_rust::rados::rados_t 48 | 49 | [] 50 | 51 | [src]

52 |
type rados_t = *mut c_void;
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"mod":[["error",""],["json",""],["rados",""],["status",""],["utils",""]],"type":[["JsonData",""],["JsonValue",""]]}); -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatus.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatus.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealth.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealth.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealth2.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealth2.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthDetail.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthDetail.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthMons.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthMons.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthServices.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthServices.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthServicesMon.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthServicesMon.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthServicesMonStats.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthServicesMonStats.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthSummary.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthSummary.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusHealthTimeChecks.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusHealthTimeChecks.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusMDSMap.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusMDSMap.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusMDSRank.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusMDSRank.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusMonMap.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusMonMap.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusMonRank.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusMonRank.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusOSDMapH.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusOSDMapH.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusOSDMapL.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusOSDMapL.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusPGMap.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusPGMap.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/CephStatusPGState.t.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to struct.CephStatusPGState.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/status/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"struct":[["CephStatus",""],["CephStatusHealth",""],["CephStatusHealth2",""],["CephStatusHealthDetail",""],["CephStatusHealthMons",""],["CephStatusHealthServices",""],["CephStatusHealthServicesMon",""],["CephStatusHealthServicesMonStats",""],["CephStatusHealthSummary",""],["CephStatusHealthTimeChecks",""],["CephStatusMDSMap",""],["CephStatusMDSRank",""],["CephStatusMonMap",""],["CephStatusMonRank",""],["CephStatusOSDMapH",""],["CephStatusOSDMapL",""],["CephStatusPGMap",""],["CephStatusPGState",""]]}); -------------------------------------------------------------------------------- /docs/ceph_rust/type.JsonData.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::JsonData - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Type Definition ceph_rust::JsonData 48 | 49 | [] 50 | 51 | [src]

52 |
type JsonData = Json;
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/type.JsonValue.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ceph_rust::JsonValue - Rust 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 34 | 35 | 45 | 46 |
47 |

Type Definition ceph_rust::JsonValue 48 | 49 | [] 50 | 51 | [src]

52 |
type JsonValue = Json;
53 | 54 | 55 | 56 | 57 | 102 | 103 | 104 | 105 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /docs/ceph_rust/utils/run_args.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to fn.run_args.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/utils/run_cli.v.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Redirecting to fn.run_cli.html...

8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/ceph_rust/utils/sidebar-items.js: -------------------------------------------------------------------------------- 1 | initSidebarItems({"fn":[["run_cli","run_cli - pass in a String of a normal command line"]]}); -------------------------------------------------------------------------------- /docs/implementors/core/clone/trait.Clone.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Clone for AllocFlags","impl Clone for XattrFlags","impl Clone for OperationFlags","impl Clone for Struct_rados_pool_stat_t","impl Clone for Struct_rados_cluster_stat_t",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/cmp/trait.Eq.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Eq for AllocFlags","impl Eq for XattrFlags","impl Eq for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/cmp/trait.Ord.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Ord for AllocFlags","impl Ord for XattrFlags","impl Ord for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/cmp/trait.PartialEq.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl PartialEq for AllocFlags","impl PartialEq for XattrFlags","impl PartialEq for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/cmp/trait.PartialOrd.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl PartialOrd for AllocFlags","impl PartialOrd for XattrFlags","impl PartialOrd for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/convert/trait.From.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl From<ParseError> for RadosError","impl From<NulError> for RadosError","impl From<FromUtf8Error> for RadosError","impl From<IntoStringError> for RadosError","impl From<Error> for RadosError",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/default/trait.Default.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Default for Struct_rados_pool_stat_t","impl Default for Struct_rados_cluster_stat_t",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/fmt/trait.Debug.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Debug for AllocFlags","impl Debug for XattrFlags","impl Debug for OperationFlags","impl Debug for Struct_rados_pool_stat_t","impl Debug for Struct_rados_cluster_stat_t","impl Debug for RadosError",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/fmt/trait.Display.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Display for RadosError",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/hash/trait.Hash.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Hash for AllocFlags","impl Hash for XattrFlags","impl Hash for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/iter/traits/trait.Extend.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Extend<AllocFlags> for AllocFlags","impl Extend<XattrFlags> for XattrFlags","impl Extend<OperationFlags> for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/iter/traits/trait.FromIterator.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl FromIterator<AllocFlags> for AllocFlags","impl FromIterator<XattrFlags> for XattrFlags","impl FromIterator<OperationFlags> for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/marker/trait.Copy.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Copy for AllocFlags","impl Copy for XattrFlags","impl Copy for OperationFlags","impl Copy for Struct_rados_pool_stat_t","impl Copy for Struct_rados_cluster_stat_t",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitAnd.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitAnd for AllocFlags","impl BitAnd for XattrFlags","impl BitAnd for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitAndAssign.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitAndAssign for AllocFlags","impl BitAndAssign for XattrFlags","impl BitAndAssign for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitOr.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitOr for AllocFlags","impl BitOr for XattrFlags","impl BitOr for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitOrAssign.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitOrAssign for AllocFlags","impl BitOrAssign for XattrFlags","impl BitOrAssign for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitXor.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitXor for AllocFlags","impl BitXor for XattrFlags","impl BitXor for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.BitXorAssign.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl BitXorAssign for AllocFlags","impl BitXorAssign for XattrFlags","impl BitXorAssign for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.Not.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Not for AllocFlags","impl Not for XattrFlags","impl Not for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.Sub.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl Sub for AllocFlags","impl Sub for XattrFlags","impl Sub for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/core/ops/trait.SubAssign.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl SubAssign for AllocFlags","impl SubAssign for XattrFlags","impl SubAssign for OperationFlags",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/implementors/std/error/trait.Error.js: -------------------------------------------------------------------------------- 1 | (function() {var implementors = {}; 2 | implementors["ceph_rust"] = ["impl StdError for RadosError",]; 3 | 4 | if (window.register_implementors) { 5 | window.register_implementors(implementors); 6 | } else { 7 | window.pending_implementors = implementors; 8 | } 9 | 10 | })() 11 | -------------------------------------------------------------------------------- /docs/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} 2 | -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | . /setup-micro-osd.sh 4 | 5 | set -e 6 | 7 | cargo test --features rados_striper 8 | 9 | cargo run --features rados_striper --example rados_striper 10 | -------------------------------------------------------------------------------- /examples/rados_striper.rs: -------------------------------------------------------------------------------- 1 | #[cfg(feature = "rados_striper")] 2 | use { 3 | ceph::ceph as ceph_helpers, 4 | ceph::error::{Errno, RadosError}, 5 | std::env, 6 | std::str, 7 | std::sync::Arc, 8 | }; 9 | 10 | #[cfg(not(feature = "rados_striper"))] 11 | fn main() {} 12 | 13 | #[cfg(feature = "rados_striper")] 14 | fn main() { 15 | let user_id = "admin"; 16 | let config_file = env::var("CEPH_CONF").unwrap_or("/etc/ceph/ceph.conf".to_string()); 17 | let pool_name = "ceph-rust-test"; 18 | 19 | println!("Connecting to ceph"); 20 | let cluster = Arc::new(ceph_helpers::connect_to_ceph(user_id, &config_file).unwrap()); 21 | 22 | println!("Creating pool {}", pool_name); 23 | match cluster.rados_create_pool(pool_name) { 24 | Ok(_) => {} 25 | Err(RadosError::ApiError(Errno::EEXIST)) => { 26 | cluster.rados_delete_pool(pool_name).unwrap(); 27 | cluster.rados_create_pool(pool_name).unwrap(); 28 | } 29 | Err(err) => panic!("{:?}", err), 30 | } 31 | 32 | let object_name = "ceph-rust-test-object"; 33 | 34 | { 35 | println!("Creating ioctx"); 36 | let ioctx = cluster.get_rados_ioctx(pool_name).unwrap(); 37 | 38 | println!("Creating rados striper"); 39 | let rados_striper = ioctx.get_rados_striper().unwrap(); 40 | 41 | println!("Writing test object"); 42 | rados_striper 43 | .rados_object_write(object_name, "lorem".as_bytes(), 0) 44 | .unwrap(); 45 | rados_striper 46 | .rados_object_write(object_name, " ipsum".as_bytes(), 5) 47 | .unwrap(); 48 | } 49 | 50 | { 51 | println!("Creating ioctx"); 52 | let ioctx = cluster.get_rados_ioctx(pool_name).unwrap(); 53 | 54 | println!("Creating rados striper"); 55 | let rados_striper = ioctx.get_rados_striper().unwrap(); 56 | 57 | println!("Getting test object stat"); 58 | let (size, _) = rados_striper.rados_object_stat(object_name).unwrap(); 59 | 60 | let mut read_buf = vec![0; size as usize]; 61 | 62 | println!("Reading test object"); 63 | rados_striper 64 | .rados_object_read(object_name, &mut read_buf, 0) 65 | .unwrap(); 66 | 67 | let read_buf_str = str::from_utf8(&read_buf).unwrap(); 68 | 69 | assert_eq!(read_buf_str, "lorem ipsum"); 70 | } 71 | 72 | println!("Deleting pool {}", pool_name); 73 | cluster.rados_delete_pool(pool_name).unwrap(); 74 | } 75 | -------------------------------------------------------------------------------- /examples/status.rs: -------------------------------------------------------------------------------- 1 | extern crate ceph; 2 | 3 | use ceph::CephClient; 4 | 5 | pub fn main() { 6 | let ceph_client = CephClient::new("admin", "/etc/ceph/ceph.conf").unwrap(); 7 | println!("Status: {}", ceph_client.status().unwrap()); 8 | } 9 | -------------------------------------------------------------------------------- /gen_docs.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Copyright 2016 LambdaStack All rights reserved. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | cargo doc --no-deps 18 | rm -rf docs/ 19 | mkdir docs 20 | cp -r target/doc/* docs/ 21 | -------------------------------------------------------------------------------- /micro-osd.sh: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2013,2014 Loic Dachary 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU Affero General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU Affero General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU Affero General Public License 15 | # along with this program. If not, see . 16 | # 17 | set -e 18 | set -x 19 | set -u 20 | 21 | DIR=${1} 22 | 23 | # reset 24 | pkill ceph || true 25 | rm -rf ${DIR}/* 26 | LOG_DIR=${DIR}/log 27 | MON_DATA=${DIR}/mon 28 | MDS_DATA=${DIR}/mds 29 | MOUNTPT=${MDS_DATA}/mnt 30 | OSD_DATA=${DIR}/osd 31 | mkdir ${LOG_DIR} ${MON_DATA} ${OSD_DATA} ${MDS_DATA} ${MOUNTPT} 32 | MDS_NAME="Z" 33 | MON_NAME="a" 34 | MGR_NAME="x" 35 | 36 | # cluster wide parameters 37 | cat >> ${DIR}/ceph.conf <: get the config value" 37 | }, 38 | "cmd005": { 39 | "sig": [ 40 | "config", 41 | "set", 42 | { 43 | "name": "var", 44 | "type": "CephString" 45 | }, 46 | { 47 | "n": "N", 48 | "name": "val", 49 | "type": "CephString" 50 | } 51 | ], 52 | "help": "config set [ ...]: set a config variable" 53 | }, 54 | "cmd006": { 55 | "sig": [ 56 | "config", 57 | "show" 58 | ], 59 | "help": "dump current config settings" 60 | }, 61 | "cmd007": { 62 | "sig": [ 63 | "get_command_descriptions" 64 | ], 65 | "help": "list available commands" 66 | }, 67 | "cmd008": { 68 | "sig": [ 69 | "git_version" 70 | ], 71 | "help": "get git sha1" 72 | }, 73 | "cmd009": { 74 | "sig": [ 75 | "help" 76 | ], 77 | "help": "list available commands" 78 | }, 79 | "cmd010": { 80 | "sig": [ 81 | "log", 82 | "dump" 83 | ], 84 | "help": "dump recent log entries to log file" 85 | }, 86 | "cmd011": { 87 | "sig": [ 88 | "log", 89 | "flush" 90 | ], 91 | "help": "flush log entries to log file" 92 | }, 93 | "cmd012": { 94 | "sig": [ 95 | "log", 96 | "reopen" 97 | ], 98 | "help": "reopen log file" 99 | }, 100 | "cmd013": { 101 | "sig": [ 102 | "objecter_requests" 103 | ], 104 | "help": "show in-progress osd requests" 105 | }, 106 | "cmd014": { 107 | "sig": [ 108 | "perf", 109 | "dump", 110 | { 111 | "name": "logger", 112 | "req": "false", 113 | "type": "CephString" 114 | }, 115 | { 116 | "name": "counter", 117 | "req": "false", 118 | "type": "CephString" 119 | } 120 | ], 121 | "help": "dump perfcounters value" 122 | }, 123 | "cmd015": { 124 | "sig": [ 125 | "perf", 126 | "reset", 127 | { 128 | "name": "var", 129 | "type": "CephString" 130 | } 131 | ], 132 | "help": "perf reset : perf reset all or one perfcounter name" 133 | }, 134 | "cmd016": { 135 | "sig": [ 136 | "perf", 137 | "schema" 138 | ], 139 | "help": "dump perfcounters schema" 140 | }, 141 | "cmd017": { 142 | "sig": [ 143 | "perfcounters_dump" 144 | ], 145 | "help": "" 146 | }, 147 | "cmd018": { 148 | "sig": [ 149 | "perfcounters_schema" 150 | ], 151 | "help": "" 152 | }, 153 | "cmd019": { 154 | "sig": [ 155 | "version" 156 | ], 157 | "help": "get ceph version" 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /sample_files/ceph_admin_socket_mon_commands.json: -------------------------------------------------------------------------------- 1 | { 2 | "cmd000": { 3 | "sig": [ 4 | "0" 5 | ], 6 | "help": "" 7 | }, 8 | "cmd001": { 9 | "sig": [ 10 | "1" 11 | ], 12 | "help": "" 13 | }, 14 | "cmd002": { 15 | "sig": [ 16 | "2" 17 | ], 18 | "help": "" 19 | }, 20 | "cmd003": { 21 | "sig": [ 22 | "add_bootstrap_peer_hint", 23 | { 24 | "name": "addr", 25 | "type": "CephIPAddr" 26 | } 27 | ], 28 | "help": "add peer address as potential bootstrap peer for cluster bringup" 29 | }, 30 | "cmd004": { 31 | "sig": [ 32 | "config", 33 | "diff" 34 | ], 35 | "help": "dump diff of current config and default config" 36 | }, 37 | "cmd005": { 38 | "sig": [ 39 | "config", 40 | "get", 41 | { 42 | "name": "var", 43 | "type": "CephString" 44 | } 45 | ], 46 | "help": "config get : get the config value" 47 | }, 48 | "cmd006": { 49 | "sig": [ 50 | "config", 51 | "set", 52 | { 53 | "name": "var", 54 | "type": "CephString" 55 | }, 56 | { 57 | "n": "N", 58 | "name": "val", 59 | "type": "CephString" 60 | } 61 | ], 62 | "help": "config set [ ...]: set a config variable" 63 | }, 64 | "cmd007": { 65 | "sig": [ 66 | "config", 67 | "show" 68 | ], 69 | "help": "dump current config settings" 70 | }, 71 | "cmd008": { 72 | "sig": [ 73 | "get_command_descriptions" 74 | ], 75 | "help": "list available commands" 76 | }, 77 | "cmd009": { 78 | "sig": [ 79 | "git_version" 80 | ], 81 | "help": "get git sha1" 82 | }, 83 | "cmd010": { 84 | "sig": [ 85 | "help" 86 | ], 87 | "help": "list available commands" 88 | }, 89 | "cmd011": { 90 | "sig": [ 91 | "log", 92 | "dump" 93 | ], 94 | "help": "dump recent log entries to log file" 95 | }, 96 | "cmd012": { 97 | "sig": [ 98 | "log", 99 | "flush" 100 | ], 101 | "help": "flush log entries to log file" 102 | }, 103 | "cmd013": { 104 | "sig": [ 105 | "log", 106 | "reopen" 107 | ], 108 | "help": "reopen log file" 109 | }, 110 | "cmd014": { 111 | "sig": [ 112 | "mon_status" 113 | ], 114 | "help": "show current monitor status" 115 | }, 116 | "cmd015": { 117 | "sig": [ 118 | "perf", 119 | "dump", 120 | { 121 | "name": "logger", 122 | "req": "false", 123 | "type": "CephString" 124 | }, 125 | { 126 | "name": "counter", 127 | "req": "false", 128 | "type": "CephString" 129 | } 130 | ], 131 | "help": "dump perfcounters value" 132 | }, 133 | "cmd016": { 134 | "sig": [ 135 | "perf", 136 | "reset", 137 | { 138 | "name": "var", 139 | "type": "CephString" 140 | } 141 | ], 142 | "help": "perf reset : perf reset all or one perfcounter name" 143 | }, 144 | "cmd017": { 145 | "sig": [ 146 | "perf", 147 | "schema" 148 | ], 149 | "help": "dump perfcounters schema" 150 | }, 151 | "cmd018": { 152 | "sig": [ 153 | "perfcounters_dump" 154 | ], 155 | "help": "" 156 | }, 157 | "cmd019": { 158 | "sig": [ 159 | "perfcounters_schema" 160 | ], 161 | "help": "" 162 | }, 163 | "cmd020": { 164 | "sig": [ 165 | "quorum", 166 | "enter" 167 | ], 168 | "help": "force monitor back into quorum" 169 | }, 170 | "cmd021": { 171 | "sig": [ 172 | "quorum", 173 | "exit" 174 | ], 175 | "help": "force monitor out of the quorum" 176 | }, 177 | "cmd022": { 178 | "sig": [ 179 | "quorum_status" 180 | ], 181 | "help": "show current quorum status" 182 | }, 183 | "cmd023": { 184 | "sig": [ 185 | "sync_force", 186 | { 187 | "name": "validate", 188 | "strings": "--yes-i-really-mean-it", 189 | "type": "CephChoices" 190 | } 191 | ], 192 | "help": "force sync of and clear monitor store" 193 | }, 194 | "cmd024": { 195 | "sig": [ 196 | "version" 197 | ], 198 | "help": "get ceph version" 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /sample_files/ceph_status_format_json.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": { 3 | "health": { 4 | "health_services": [ 5 | { 6 | "mons": [ 7 | { 8 | "name": "ceph-vm1", 9 | "kb_total": 40313620, 10 | "kb_used": 3439440, 11 | "kb_avail": 36874180, 12 | "avail_percent": 91, 13 | "last_updated": "2017-02-03 22:28:59.768212", 14 | "store_stats": { 15 | "bytes_total": 16068874, 16 | "bytes_sst": 15436945, 17 | "bytes_log": 458752, 18 | "bytes_misc": 173177, 19 | "last_updated": "0.000000" 20 | }, 21 | "health": "HEALTH_OK" 22 | }, 23 | { 24 | "name": "ceph-vm2", 25 | "kb_total": 40313620, 26 | "kb_used": 2983396, 27 | "kb_avail": 37330224, 28 | "avail_percent": 92, 29 | "last_updated": "2017-02-03 22:28:59.794621", 30 | "store_stats": { 31 | "bytes_total": 16069158, 32 | "bytes_sst": 15436954, 33 | "bytes_log": 458752, 34 | "bytes_misc": 173452, 35 | "last_updated": "0.000000" 36 | }, 37 | "health": "HEALTH_OK" 38 | }, 39 | { 40 | "name": "ceph-vm3", 41 | "kb_total": 40313620, 42 | "kb_used": 2974132, 43 | "kb_avail": 37339488, 44 | "avail_percent": 92, 45 | "last_updated": "2017-02-03 22:29:02.924132", 46 | "store_stats": { 47 | "bytes_total": 16594271, 48 | "bytes_sst": 15437604, 49 | "bytes_log": 983040, 50 | "bytes_misc": 173627, 51 | "last_updated": "0.000000" 52 | }, 53 | "health": "HEALTH_OK" 54 | } 55 | ] 56 | } 57 | ] 58 | }, 59 | "timechecks": { 60 | "epoch": 14, 61 | "round": 202, 62 | "round_status": "finished", 63 | "mons": [ 64 | { 65 | "name": "ceph-vm1", 66 | "skew": 0, 67 | "latency": 0, 68 | "health": "HEALTH_OK" 69 | }, 70 | { 71 | "name": "ceph-vm2", 72 | "skew": 0.024771, 73 | "latency": 0.001161, 74 | "health": "HEALTH_OK" 75 | }, 76 | { 77 | "name": "ceph-vm3", 78 | "skew": 0, 79 | "latency": 0.001089, 80 | "health": "HEALTH_OK" 81 | } 82 | ] 83 | }, 84 | "summary": [ 85 | 86 | ], 87 | "overall_status": "HEALTH_OK", 88 | "detail": [ 89 | 90 | ] 91 | }, 92 | "fsid": "094a460e-98bd-4231-9f16-57c9a5782989", 93 | "election_epoch": 14, 94 | "quorum": [ 95 | 0, 96 | 1, 97 | 2 98 | ], 99 | "quorum_names": [ 100 | "ceph-vm1", 101 | "ceph-vm2", 102 | "ceph-vm3" 103 | ], 104 | "monmap": { 105 | "epoch": 2, 106 | "fsid": "094a460e-98bd-4231-9f16-57c9a5782989", 107 | "modified": "2017-02-02 17:33:27.433593", 108 | "created": "0.000000", 109 | "mons": [ 110 | { 111 | "rank": 0, 112 | "name": "ceph-vm1", 113 | "addr": "10.0.100.21:6789\/0" 114 | }, 115 | { 116 | "rank": 1, 117 | "name": "ceph-vm2", 118 | "addr": "10.0.100.22:6789\/0" 119 | }, 120 | { 121 | "rank": 2, 122 | "name": "ceph-vm3", 123 | "addr": "10.0.100.23:6789\/0" 124 | } 125 | ] 126 | }, 127 | "osdmap": { 128 | "osdmap": { 129 | "epoch": 268, 130 | "num_osds": 12, 131 | "num_up_osds": 12, 132 | "num_in_osds": 12, 133 | "full": false, 134 | "nearfull": false, 135 | "num_remapped_pgs": 0 136 | } 137 | }, 138 | "pgmap": { 139 | "pgs_by_state": [ 140 | { 141 | "state_name": "active+clean", 142 | "count": 1408 143 | } 144 | ], 145 | "version": 2602, 146 | "num_pgs": 1408, 147 | "data_bytes": 1964, 148 | "bytes_used": 565907456, 149 | "bytes_avail": 256993472512, 150 | "bytes_total": 257559379968 151 | }, 152 | "mdsmap": { 153 | "epoch": 1, 154 | "up": 0, 155 | "in": 0, 156 | "max": 0, 157 | "by_rank": [ 158 | 159 | ] 160 | } 161 | } 162 | -------------------------------------------------------------------------------- /setup-micro-osd.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | rm -rf /tmp/ceph 6 | mkdir /tmp/ceph 7 | /micro-osd.sh /tmp/ceph 8 | export CEPH_CONF=/tmp/ceph/ceph.conf 9 | 10 | set +e 11 | -------------------------------------------------------------------------------- /src/admin_sockets.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2017 LambdaStack All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #![cfg(unix)] 16 | 17 | use byteorder::{BigEndian, ReadBytesExt}; 18 | 19 | use crate::error::{RadosError, RadosResult}; 20 | use std::io::{Cursor, Read, Write}; 21 | use std::net::Shutdown; 22 | use std::os::unix::net::UnixStream; 23 | use std::str; 24 | 25 | /// This is a helper function that builds a raw command from the actual 26 | /// command. You just pass 27 | /// in a command like "help". The returned `String` will be a JSON String. 28 | pub fn admin_socket_command(cmd: &str, socket: &str) -> RadosResult { 29 | let raw_cmd = json!({ 30 | "prefix": cmd, 31 | }); 32 | admin_socket_raw_command(&raw_cmd.to_string(), socket) 33 | } 34 | 35 | /// This function supports a raw command in the format of something like: 36 | /// `{"prefix": "help"}`. 37 | /// The returned `String` will be a JSON String. 38 | #[allow(unused_variables)] 39 | pub fn admin_socket_raw_command(cmd: &str, socket: &str) -> RadosResult { 40 | let mut buffer = vec![0; 4]; // Should return 4 bytes with size or indicator. 41 | let cmd = &format!("{}\0", cmd); // Terminator so don't add one to commands. 42 | 43 | let mut stream = UnixStream::connect(socket)?; 44 | let wb = stream.write(cmd.as_bytes())?; 45 | let ret_val = stream.read(&mut buffer)?; 46 | if ret_val < 4 { 47 | stream.shutdown(Shutdown::Both)?; 48 | return Err(RadosError::new( 49 | "Admin socket: Invalid command or socket did not return any data".to_string(), 50 | )); 51 | } 52 | // The first 4 bytes are Big Endian unsigned int 53 | let mut rdr = Cursor::new(buffer); 54 | let len = rdr.read_u32::()?; 55 | let mut output_buffer = vec![0; len as usize]; 56 | stream.read_exact(&mut output_buffer)?; 57 | stream.shutdown(Shutdown::Both)?; 58 | 59 | Ok(String::from_utf8_lossy(&output_buffer).into_owned()) 60 | } 61 | -------------------------------------------------------------------------------- /src/ceph_version.rs: -------------------------------------------------------------------------------- 1 | use std::str::FromStr; 2 | 3 | use crate::error::RadosError; 4 | 5 | #[cfg(test)] 6 | mod 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)] 26 | pub 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 | Quincy, 44 | Reef, 45 | Squid, 46 | } 47 | 48 | impl FromStr for CephVersion { 49 | type Err = RadosError; 50 | 51 | /// Expects an input in the form that the `ceph --version` command, or the 52 | /// rados version commands give them: 53 | /// `ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)` 54 | fn from_str(s: &str) -> Result { 55 | use crate::CephVersion::*; 56 | let mut parts = s.split(' '); 57 | if let (Some(_ceph), Some(_version), Some(version_str)) = 58 | (parts.next(), parts.next(), parts.next()) 59 | { 60 | let mut version_parts = version_str.split('.'); 61 | if let (Some(major), Some(minor), Some(_patch)) = ( 62 | version_parts.next(), 63 | version_parts.next(), 64 | version_parts.next(), 65 | ) { 66 | match major { 67 | "19" => return Ok(Squid), 68 | "18" => return Ok(Reef), 69 | "17" => return Ok(Quincy), 70 | "16" => return Ok(Pacific), 71 | "15" => return Ok(Octopus), 72 | "14" => return Ok(Nautilus), 73 | "13" => return Ok(Mimic), 74 | "12" => return Ok(Luminous), 75 | "11" => return Ok(Kraken), 76 | "10" => return Ok(Jewel), 77 | "9" => return Ok(Infernalis), 78 | "0" => match minor { 79 | "94" => return Ok(Hammer), 80 | "97" => return Ok(Giant), 81 | "80" => return Ok(Firefly), 82 | "72" => return Ok(Emperor), 83 | "67" => return Ok(Dumpling), 84 | "61" => return Ok(Cuttlefish), 85 | "56" => return Ok(Bobtail), 86 | "48" => return Ok(Argonaut), 87 | _ => {} 88 | }, 89 | _ => {} 90 | } 91 | } 92 | } 93 | Err(RadosError::Parse(s.into())) 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/json.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2017 LambdaStack All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | use std::str; 16 | 17 | use serde_json; 18 | 19 | use crate::JsonData; 20 | // use JsonValue; 21 | 22 | /// First json call that takes a JSON formatted string and converts it to 23 | /// JsonData object that can then be traversed using `json_find` via the key 24 | /// path. 25 | pub fn json_data(json_str: &str) -> Option { 26 | match serde_json::from_str(json_str) { 27 | Ok(json_data) => Some(json_data), 28 | Err(_) => None, 29 | } 30 | } 31 | 32 | /// Looks for the parent object first and then the 'child' object. If the 33 | /// parent object is None then it only looks for the 'child' object. The parent 34 | /// object is used for situations where there may be 'child' objects with the 35 | /// same name. 36 | pub fn json_find(json_data: JsonData, keys: &[&str]) -> Option { 37 | let mut value = json_data; 38 | for key in keys { 39 | match value.get(key) { 40 | Some(v) => value = v.clone(), 41 | None => return None, 42 | } 43 | } 44 | 45 | Some(value) 46 | } 47 | 48 | /// More specific String cast of an individual JsonData object. 49 | pub fn json_as_string(json_data: &JsonData) -> String { 50 | json_data.to_string() 51 | } 52 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2016 LambdaStack All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | // NOTE: This attribute only needs to be set once. 16 | #![doc( 17 | html_logo_url = "https://lambdastackio.github.io/static/images/lambdastack-200x200.png", 18 | html_favicon_url = "https://lambdastackio.github.io/static/images/favicon.ico", 19 | html_root_url = "https://lambdastackio.github.io/aws-sdk-rust/ceph-rust/ceph_rust/index.html" 20 | )] 21 | 22 | //! Ceph-rust is a thin layer over the librados C interface. A little higher 23 | //! abstraction layer will 24 | //! be coming next that will encapsulate all of the "C" specific features so 25 | //! that only pure Rust will be needed. 26 | //! 27 | //! Only works on Linux 28 | //! The documentation for librados can be found: 29 | //! http://docs.ceph.com/docs/master/rados/api/librados/ 30 | //! 31 | //! By default Ceph names librados as the following for the given platforms: 32 | //! Hammer release: 33 | //! RHEL/CentOS: 34 | //! /usr/lib64/librados.so.2.0.0 35 | //! 36 | //! Ubuntu: 37 | //! /usr/lib/librados.so.2.0.0 38 | //! 39 | //! You will need to do a symlink of the above link to the following: 40 | //! RHEL/CentOS: 41 | //! sudo ln -s /usr/lib64/librados.so.2.0.0 /usr/lib64/librados.so 42 | //! 43 | //! Ubuntu: 44 | //! sudo ln -s /usr/lib/librados.so.2.0.0 /usr/lib/librados.so 45 | //! 46 | //! NOTE: If someone know of another way for Rust to find the librados file 47 | //! then please issue 48 | //! a PR for it. Thanks! 49 | //! 50 | //! See the /examples/ceph.rs for how to use the library. 51 | 52 | #[macro_use] 53 | extern crate bitflags; 54 | extern crate byteorder; 55 | extern crate libc; 56 | #[macro_use] 57 | extern crate tracing; 58 | #[macro_use] 59 | extern crate nom; 60 | extern crate serde; 61 | #[macro_use] 62 | extern crate serde_derive; 63 | #[macro_use] 64 | extern crate serde_json; 65 | extern crate uuid; 66 | 67 | pub mod admin_sockets; 68 | pub mod ceph; 69 | pub mod ceph_volume; 70 | pub mod cmd; 71 | pub mod error; 72 | pub mod json; 73 | pub mod rados; 74 | #[cfg(feature = "rados_striper")] 75 | pub mod rados_striper; 76 | pub mod status; 77 | pub mod utils; 78 | 79 | mod ceph_client; 80 | mod ceph_version; 81 | mod mon_command; 82 | 83 | pub use crate::ceph_client::CephClient; 84 | pub use crate::ceph_version::CephVersion; 85 | pub use crate::cmd::{OsdOption, PoolOption}; 86 | pub use crate::mon_command::MonCommand; 87 | 88 | pub type JsonData = serde_json::Value; 89 | pub type JsonValue = serde_json::Value; 90 | -------------------------------------------------------------------------------- /src/mon_command.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use serde_json; 4 | 5 | #[cfg(test)] 6 | mod tests { 7 | use super::*; 8 | 9 | #[test] 10 | fn it_builds_a_mon_command() { 11 | let command = MonCommand::new() 12 | .with_prefix("osd set") 13 | .with("key", "osdout"); 14 | 15 | let actual: HashMap = serde_json::from_str(&command.as_json()).unwrap(); 16 | let expected: HashMap = 17 | serde_json::from_str(r#"{"prefix":"osd set","format":"json","key":"osdout"}"#).unwrap(); 18 | 19 | assert_eq!(expected, actual); 20 | } 21 | } 22 | 23 | pub struct MonCommand<'a> { 24 | map: HashMap<&'a str, &'a str>, 25 | } 26 | 27 | impl<'a> Default for MonCommand<'a> { 28 | fn default() -> Self { 29 | MonCommand { 30 | map: { 31 | let mut map = HashMap::new(); 32 | map.insert("format", "json"); 33 | map 34 | }, 35 | } 36 | } 37 | } 38 | 39 | impl<'a> MonCommand<'a> { 40 | pub fn new() -> MonCommand<'a> { 41 | MonCommand::default() 42 | } 43 | 44 | pub fn with_format(self, format: &'a str) -> MonCommand<'a> { 45 | self.with("format", format) 46 | } 47 | 48 | pub fn with_name(self, name: &'a str) -> MonCommand<'a> { 49 | self.with("name", name) 50 | } 51 | 52 | pub fn with_prefix(self, prefix: &'a str) -> MonCommand<'a> { 53 | self.with("prefix", prefix) 54 | } 55 | 56 | pub fn with(mut self, name: &'a str, value: &'a str) -> MonCommand<'a> { 57 | self.map.insert(name, value); 58 | self 59 | } 60 | 61 | pub fn as_json(&self) -> String { 62 | serde_json::to_string(&self.map).unwrap() 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/status.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2017 LambdaStack All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #[derive(Deserialize, Serialize)] 16 | pub struct CephStatus { 17 | health: CephStatusHealth, 18 | fsid: String, 19 | election_epoch: u32, 20 | quorum: Vec, 21 | quorum_names: Vec, 22 | monmap: CephStatusMonMap, 23 | osdmap: CephStatusOSDMapH, 24 | pgmap: CephStatusPGMap, 25 | mdsmap: CephStatusMDSMap, 26 | } 27 | 28 | #[derive(Deserialize, Serialize)] 29 | pub struct CephStatusHealth { 30 | health: CephStatusHealth2, 31 | timechecks: CephStatusHealthTimeChecks, 32 | summary: Vec, 33 | overall_status: String, 34 | detail: Vec, 35 | } 36 | 37 | #[derive(Deserialize, Serialize)] 38 | pub struct CephStatusHealth2 { 39 | health: Vec, 40 | } 41 | 42 | #[derive(Deserialize, Serialize)] 43 | pub struct CephStatusHealthServices { 44 | mons: Vec, 45 | } 46 | 47 | #[derive(Deserialize, Serialize)] 48 | pub struct CephStatusHealthServicesMon { 49 | name: String, 50 | kb_total: u32, 51 | kb_used: u32, 52 | kb_avail: u32, 53 | avail_percent: u16, 54 | last_updated: String, 55 | store_stats: CephStatusHealthServicesMonStats, 56 | health: String, 57 | } 58 | 59 | #[derive(Deserialize, Serialize)] 60 | pub struct CephStatusHealthServicesMonStats { 61 | bytes_total: u64, 62 | bytes_sst: u64, 63 | bytes_log: u64, 64 | bytes_misc: u64, 65 | last_updated: String, 66 | } 67 | 68 | #[derive(Deserialize, Serialize)] 69 | pub struct CephStatusHealthTimeChecks { 70 | epoch: u32, 71 | round: u32, 72 | round_status: String, 73 | mons: Vec, 74 | } 75 | 76 | #[derive(Deserialize, Serialize)] 77 | pub struct CephStatusHealthMons { 78 | name: String, 79 | skew: f32, 80 | latency: f32, 81 | health: String, 82 | } 83 | 84 | #[derive(Deserialize, Serialize)] 85 | pub struct CephStatusHealthSummary { 86 | severity: String, 87 | summary: String, 88 | } 89 | 90 | #[derive(Deserialize, Serialize)] 91 | pub struct CephStatusHealthDetail { 92 | dummy: String, 93 | } 94 | 95 | #[derive(Deserialize, Serialize)] 96 | pub struct CephStatusMonMap { 97 | epoch: u32, 98 | fsid: String, 99 | modified: String, 100 | created: String, 101 | mons: Vec, 102 | } 103 | 104 | #[derive(Deserialize, Serialize)] 105 | pub struct CephStatusMonRank { 106 | rank: u16, 107 | name: String, 108 | addr: String, 109 | } 110 | 111 | #[derive(Deserialize, Serialize)] 112 | pub struct CephStatusOSDMapH { 113 | osdmap: CephStatusOSDMapL, 114 | } 115 | 116 | #[derive(Deserialize, Serialize)] 117 | pub struct CephStatusOSDMapL { 118 | epoch: u32, 119 | num_osds: u32, 120 | num_up_osds: u32, 121 | num_in_osds: u32, 122 | full: bool, 123 | nearfull: bool, 124 | num_remapped_pgs: u32, 125 | } 126 | 127 | #[derive(Deserialize, Serialize)] 128 | pub struct CephStatusPGMap { 129 | pgs_by_state: Vec, 130 | version: u32, 131 | num_pgs: u32, 132 | data_bytes: u64, 133 | bytes_used: u64, 134 | bytes_avail: u64, 135 | bytes_total: u64, 136 | } 137 | 138 | #[derive(Deserialize, Serialize)] 139 | pub struct CephStatusPGState { 140 | state_name: String, 141 | count: u32, 142 | } 143 | 144 | #[derive(Deserialize, Serialize)] 145 | pub struct CephStatusMDSMap { 146 | epoch: u32, 147 | up: u32, 148 | _in: u32, 149 | max: u32, 150 | by_rank: Vec, 151 | } 152 | 153 | #[derive(Deserialize, Serialize)] 154 | pub struct CephStatusMDSRank { 155 | rank: u16, 156 | name: String, 157 | addr: String, 158 | } 159 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2017 LambdaStack All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | use std::io::Result; 16 | 17 | use std::process::{Command, Output}; 18 | 19 | /// run_cli - pass in a String of a normal command line 20 | /// 21 | /// The function will split the options into words to supply to the low_level 22 | /// std::process::Command 23 | /// which returns Result<(Output)> 24 | /// # Example 25 | /// 26 | /// ``` 27 | /// use ceph::utils::run_cli; 28 | /// run_cli("ps aux"); 29 | /// ``` 30 | 31 | // NOTE: Add Into so a "" can also be passed in... 32 | pub fn run_cli(cmd_line: &str) -> Result { 33 | let output = Command::new("sh").arg("-c").arg(cmd_line).output()?; 34 | Ok(output) 35 | } 36 | -------------------------------------------------------------------------------- /tests/ceph_health-jewel: -------------------------------------------------------------------------------- 1 | {"health":{"health_services":[{"mons":[{"name":"ceph02","kb_total":19478204,"kb_used":3221192,"kb_avail":15244532,"avail_percent":78,"last_updated":"2017-11-28 09:40:17.893062","store_stats":{"bytes_total":15697550,"bytes_sst":0,"bytes_log":642962,"bytes_misc":15054588,"last_updated":"0.000000"},"health":"HEALTH_OK"},{"name":"ceph01","kb_total":19478204,"kb_used":3218720,"kb_avail":15247004,"avail_percent":78,"last_updated":"2017-11-28 09:39:32.586626","store_stats":{"bytes_total":16022093,"bytes_sst":0,"bytes_log":964810,"bytes_misc":15057283,"last_updated":"0.000000"},"health":"HEALTH_OK"},{"name":"ceph03","kb_total":19478204,"kb_used":3213940,"kb_avail":15251784,"avail_percent":78,"last_updated":"2017-11-28 09:39:47.820551","store_stats":{"bytes_total":16021442,"bytes_sst":0,"bytes_log":964810,"bytes_misc":15056632,"last_updated":"0.000000"},"health":"HEALTH_OK"}]}]},"timechecks":{"epoch":30,"round":58,"round_status":"finished","mons":[{"name":"ceph02","skew":0.000000,"latency":0.000000,"health":"HEALTH_OK"},{"name":"ceph01","skew":-0.002781,"latency":0.001351,"health":"HEALTH_OK"},{"name":"ceph03","skew":0.000000,"latency":0.001239,"health":"HEALTH_OK"}]},"summary":[],"overall_status":"HEALTH_OK","detail":[]} 2 | -------------------------------------------------------------------------------- /tests/integration_tests.rs: -------------------------------------------------------------------------------- 1 | extern crate ceph; 2 | extern crate serde; 3 | extern crate serde_json; 4 | 5 | use ceph::cmd::{ClusterHealth, CrushTree, MonStatus}; 6 | use std::fs::File; 7 | use std::io::Read; 8 | 9 | #[test] 10 | fn test_ceph_health_jewel() { 11 | let json = { 12 | let mut buff = String::new(); 13 | let mut f = File::open("tests/ceph_health-jewel").unwrap(); 14 | f.read_to_string(&mut buff).unwrap(); 15 | buff 16 | }; 17 | let status: ClusterHealth = serde_json::from_str(&json).unwrap(); 18 | println!("cluster_health: {:#?}", status); 19 | } 20 | 21 | #[test] 22 | fn test_mon_status_hammer() { 23 | let json = { 24 | let mut buff = String::new(); 25 | let mut f = File::open("tests/mon_status-hammer").unwrap(); 26 | f.read_to_string(&mut buff).unwrap(); 27 | buff 28 | }; 29 | let status: MonStatus = serde_json::from_str(&json).unwrap(); 30 | println!("mon_status: {:#?}", status); 31 | } 32 | 33 | #[test] 34 | fn test_mon_status_jewel() { 35 | let json = { 36 | let mut buff = String::new(); 37 | let mut f = File::open("tests/mon_status-jewel").unwrap(); 38 | f.read_to_string(&mut buff).unwrap(); 39 | buff 40 | }; 41 | let status: MonStatus = serde_json::from_str(&json).unwrap(); 42 | println!("mon_status: {:#?}", status); 43 | } 44 | 45 | #[test] 46 | fn test_mon_status_nautilus() { 47 | let json = { 48 | let mut buff = String::new(); 49 | let mut f = File::open("tests/mon_status-nautilus").unwrap(); 50 | f.read_to_string(&mut buff).unwrap(); 51 | buff 52 | }; 53 | let status: MonStatus = serde_json::from_str(&json).unwrap(); 54 | println!("mon_status: {:#?}", status); 55 | } 56 | 57 | #[test] 58 | fn test_osd_tree_hammer() { 59 | let json = { 60 | let mut buff = String::new(); 61 | let mut f = File::open("tests/osd_tree-hammer").unwrap(); 62 | f.read_to_string(&mut buff).unwrap(); 63 | buff 64 | }; 65 | let tree: CrushTree = serde_json::from_str(&json).unwrap(); 66 | println!("osd_tree: {:#?}", tree); 67 | } 68 | 69 | #[test] 70 | fn test_osd_tree_jewel() { 71 | let json = { 72 | let mut buff = String::new(); 73 | let mut f = File::open("tests/osd_tree-jewel").unwrap(); 74 | f.read_to_string(&mut buff).unwrap(); 75 | buff 76 | }; 77 | let tree: CrushTree = serde_json::from_str(&json).unwrap(); 78 | println!("osd_tree: {:#?}", tree); 79 | } 80 | -------------------------------------------------------------------------------- /tests/mon_status-hammer: -------------------------------------------------------------------------------- 1 | {"name":"ceph02","rank":0,"state":"leader","election_epoch":22,"quorum":[0,1,2],"outside_quorum":[],"extra_probe_peers":[],"sync_provider":[],"monmap":{"epoch":2,"fsid":"ebec4dc1-3b8a-46d2-a2b6-69491a79ac8b","modified":"2017-11-24 09:05:18.428304","created":"0.000000","mons":[{"rank":0,"name":"ceph02","addr":"182.168.1.176:6789\/0"},{"rank":1,"name":"ceph01","addr":"182.168.1.177:6789\/0"},{"rank":2,"name":"ceph03","addr":"182.168.1.209:6789\/0"}]}} 2 | -------------------------------------------------------------------------------- /tests/mon_status-jewel: -------------------------------------------------------------------------------- 1 | {"name":"ceph03","rank":2,"state":"peon","election_epoch":24,"quorum":[0,1,2],"outside_quorum":[],"extra_probe_peers":[],"sync_provider":[],"monmap":{"epoch":2,"fsid":"e4f16f95-413f-484e-a646-76cbf9c6b996","modified":"2017-11-16 15:22:11.240181","created":"2017-11-16 15:21:57.138295","mons":[{"rank":0,"name":"ceph02","addr":"182.168.1.176:6789\/0"},{"rank":1,"name":"ceph01","addr":"182.168.1.177:6789\/0"},{"rank":2,"name":"ceph03","addr":"182.168.1.209:6789\/0"}]}} 2 | -------------------------------------------------------------------------------- /tests/mon_status-nautilus: -------------------------------------------------------------------------------- 1 | { 2 | "name":"ceph-01", 3 | "rank":0, 4 | "state":"leader", 5 | "election_epoch":4, 6 | "quorum":[ 7 | 0, 8 | 1, 9 | 2 10 | ], 11 | "quorum_age":503681, 12 | "features":{ 13 | "required_con":"2449958747315912708", 14 | "required_mon":[ 15 | "kraken", 16 | "luminous", 17 | "mimic", 18 | "osdmap-prune", 19 | "nautilus" 20 | ], 21 | "quorum_con":"4611087854031667199", 22 | "quorum_mon":[ 23 | "kraken", 24 | "luminous", 25 | "mimic", 26 | "osdmap-prune", 27 | "nautilus" 28 | ] 29 | }, 30 | "outside_quorum":[ 31 | 32 | ], 33 | "extra_probe_peers":[ 34 | { 35 | "addrvec":[ 36 | { 37 | "type":"v2", 38 | "addr":"0.0.0.0:3300", 39 | "nonce":0 40 | }, 41 | { 42 | "type":"v1", 43 | "addr":"0.0.0.0:6789", 44 | "nonce":0 45 | } 46 | ] 47 | }, 48 | { 49 | "addrvec":[ 50 | { 51 | "type":"v2", 52 | "addr":"0.0.0.0:3300", 53 | "nonce":0 54 | }, 55 | { 56 | "type":"v1", 57 | "addr":"0.0.0.0:6789", 58 | "nonce":0 59 | } 60 | ] 61 | } 62 | ], 63 | "sync_provider":[ 64 | 65 | ], 66 | "monmap":{ 67 | "epoch":1, 68 | "fsid":"32364ce8-7ff6-11ea-97db-13e058aad2af", 69 | "modified":"2020-04-01 23:14:27.469657", 70 | "created":"2020-04-01 23:14:27.469657", 71 | "min_mon_release":14, 72 | "min_mon_release_name":"nautilus", 73 | "features":{ 74 | "persistent":[ 75 | "kraken", 76 | "luminous", 77 | "mimic", 78 | "osdmap-prune", 79 | "nautilus" 80 | ], 81 | "optional":[ 82 | 83 | ] 84 | }, 85 | "mons":[ 86 | { 87 | "rank":0, 88 | "name":"ceph-01", 89 | "public_addrs":{ 90 | "addrvec":[ 91 | { 92 | "type":"v2", 93 | "addr":"0.0.0.0:3300", 94 | "nonce":0 95 | }, 96 | { 97 | "type":"v1", 98 | "addr":"0.0.0.0:6789", 99 | "nonce":0 100 | } 101 | ] 102 | }, 103 | "addr":"0.0.0.0:6789/0", 104 | "public_addr":"0.0.0.0:6789/0" 105 | }, 106 | { 107 | "rank":1, 108 | "name":"ceph-03", 109 | "public_addrs":{ 110 | "addrvec":[ 111 | { 112 | "type":"v2", 113 | "addr":"0.0.0.0:3300", 114 | "nonce":0 115 | }, 116 | { 117 | "type":"v1", 118 | "addr":"0.0.0.0:6789", 119 | "nonce":0 120 | } 121 | ] 122 | }, 123 | "addr":"0.0.0.0:6789/0", 124 | "public_addr":"0.0.0.0:6789/0" 125 | }, 126 | { 127 | "rank":2, 128 | "name":"ceph-02", 129 | "public_addrs":{ 130 | "addrvec":[ 131 | { 132 | "type":"v2", 133 | "addr":"0.0.0.0:3300", 134 | "nonce":0 135 | }, 136 | { 137 | "type":"v1", 138 | "addr":"0.0.0.0:6789", 139 | "nonce":0 140 | } 141 | ] 142 | }, 143 | "addr":"0.0.0.0:6789/0", 144 | "public_addr":"0.0.0.0:6789/0" 145 | } 146 | ] 147 | }, 148 | "feature_map":{ 149 | "mon":[ 150 | { 151 | "features":"0x3ffddff8ffacffff", 152 | "release":"luminous", 153 | "num":1 154 | } 155 | ], 156 | "osd":[ 157 | { 158 | "features":"0x3ffddff8ffacffff", 159 | "release":"luminous", 160 | "num":7 161 | } 162 | ], 163 | "client":[ 164 | { 165 | "features":"0x3ffddff8ffacffff", 166 | "release":"luminous", 167 | "num":2 168 | } 169 | ], 170 | "mgr":[ 171 | { 172 | "features":"0x3ffddff8ffacffff", 173 | "release":"luminous", 174 | "num":1 175 | } 176 | ] 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /tests/osd_tree-hammer: -------------------------------------------------------------------------------- 1 | {"nodes":[{"id":-1,"name":"default","type":"root","type_id":10,"children":[-4,-3,-2]},{"id":-2,"name":"ceph01","type":"host","type_id":1,"children":[0]},{"id":0,"name":"osd.0","type":"osd","type_id":0,"crush_weight":1.000000,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000},{"id":-3,"name":"ceph02","type":"host","type_id":1,"children":[1]},{"id":1,"name":"osd.1","type":"osd","type_id":0,"crush_weight":1.000000,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000},{"id":-4,"name":"ceph03","type":"host","type_id":1,"children":[2]},{"id":2,"name":"osd.2","type":"osd","type_id":0,"crush_weight":1.000000,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000}],"stray":[]} 2 | -------------------------------------------------------------------------------- /tests/osd_tree-jewel: -------------------------------------------------------------------------------- 1 | {"nodes":[{"id":-1,"name":"default","type":"root","type_id":10,"children":[-4,-3,-2]},{"id":-2,"name":"ceph01","type":"host","type_id":1,"children":[0]},{"id":0,"name":"osd.0","type":"osd","type_id":0,"crush_weight":0.014587,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000},{"id":-3,"name":"ceph02","type":"host","type_id":1,"children":[1]},{"id":1,"name":"osd.1","type":"osd","type_id":0,"crush_weight":0.014587,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000},{"id":-4,"name":"ceph03","type":"host","type_id":1,"children":[2]},{"id":2,"name":"osd.2","type":"osd","type_id":0,"crush_weight":0.014587,"depth":2,"exists":1,"status":"up","reweight":1.000000,"primary_affinity":1.000000}],"stray":[]} 2 | --------------------------------------------------------------------------------