Calamari API 13 Gap analysis¶
Summary of API coverage vs CLI feature set¶
RADOS
ubuntu@vpm061:~$ ceph --help 2>&1 | grep -E "^[a-z]+" | sed '1d;2d' | wc -l
42 / 147 contains at least 10 duplicates
~30%
We have most of OSD commands implemented with the exception of creating, removal, tiering and erasure coding.
Pool commands done well, need to update when we have support in crush for EC and tier
Some Monitor commands implemented
PG ??
None of auth
MDS
None
RBD
0/30
None
RGW
0/63
None
CephFS
None
Auth¶
auth add <entity> {<caps> [<caps>...]} add auth info for <entity> from input
file, or random key if no input given,
and/or any caps specified in the
command
auth caps <entity> <caps> [<caps>...] update caps for <name> from caps
specified in the command
auth del <entity> delete all caps for <name>
auth export {<entity>} write keyring for requested entity, or
master keyring if none given
auth get <entity> write keyring file with requested key
auth get-key <entity> display requested key
auth get-or-create <entity> {<caps> add auth info for <entity> from input
[<caps>...]} file, or random key if no input given,
and/or any caps specified in the
command
auth get-or-create-key <entity> {<caps> get, or add, key for <name> from
[<caps>...]} system/caps pairs specified in the
command. If key already exists, any
given caps must match the existing
caps for that key.
auth import auth import: read keyring file from -i
<file>
auth list list authentication state
auth print-key <entity> display requested key
Monitor¶
compact cause compaction of monitor's leveldb
storage
config-key del <key> delete <key>
config-key exists <key> check for <key>'s existence
config-key get <key> get <key>
config-key list list keys
config-key put <key> {<val>} put <key>, value <val>
df {detail} show cluster free space stats
fsid show cluster FSID/UUID
health {detail} show cluster health
log <logtext> [<logtext>...] log supplied text to the monitor log
mon add <name> <IPaddr[:port]> add new monitor named <name> at <addr>
mon dump {<int[0-]>} dump formatted monmap (optionally from
epoch)
mon getmap {<int[0-]>} get monmap
mon remove <name> remove monitor named <name>
mon stat summarize monitor status
mon_status report status of monitors
quorum enter|exit enter or exit quorum
quorum_status report status of monitor quorum
report {<tags> [<tags>...]} report full status of cluster,
optional title tag strings
scrub scrub the monitor stores
status show cluster status
sync force {--yes-i-really-mean-it} {-- force sync of and clear monitor store
i-know-what-i-am-doing}
MDS¶
mds add_data_pool <pool> add data pool <pool>
mds cluster_down take MDS cluster down
mds cluster_up bring MDS cluster up
mds compat rm_compat <int[0-]> remove compatible feature
mds compat rm_incompat <int[0-]> remove incompatible feature
mds compat show show mds compatibility settings
mds deactivate <who> stop mds
mds dump {<int[0-]>} dump info, optionally from epoch
mds fail <who> force mds to status failed
mds getmap {<int[0-]>} get MDS map, optionally from epoch
mds newfs <int[0-]> <int[0-]> {--yes-i- make new filesystom using pools
really-mean-it} <metadata> and <data>
mds remove_data_pool <pool> remove data pool <>
mds rm <int[0-]> <name (type.id)> remove nonactive mds
mds rmfailed <int[0-]> remove failed mds
mds set max_mds|max_file_size|allow_new_ set mds parameter <var> to <val>
snaps|inline_data <val> {<confirm>}
mds set max_mds|max_file_size <val> set mds parameter <var> to <val>
mds set_max_mds <int[0-]> set max MDS index
mds set_state <int[0-]> <int[0-20]> set mds state of <gid> to <numeric-
state>
mds setmap <int[0-]> set mds map; must supply correct epoch
number
mds stat show MDS status
mds stop <who> stop mds
mds tell <who> <args> [<args>...] send command to particular mds
mds unset allow_new_snaps {<sure>} unset <key>
OSDs¶
osd blacklist add|rm <EntityAddr> add (optionally until <expire> seconds
{<float[0.0-]>} from now) or remove <addr> from
blacklist
osd blacklist ls show blacklisted clients
osd create {<uuid>} create new osd (with optional UUID)
osd deep-scrub <who> initiate deep scrub on osd <who>
osd down <ids> [<ids>...] set osd(s) <id> [<id>...] down
osd dump {<int[0-]>} print summary of OSD map
osd getmap {<int[0-]>} get OSD map
osd getmaxosd show largest OSD id
osd in <ids> [<ids>...] set osd(s) <id> [<id>...] in
osd lost <int[0-]> {--yes-i-really-mean- mark osd as permanently lost. THIS
it} DESTROYS DATA IF NO MORE REPLICAS
EXIST, BE CAREFUL
osd ls {<int[0-]>} show all OSD ids
osd metadata <int[0-]> fetch metadata for osd <id>
osd out <ids> [<ids>...] set osd(s) <id> [<id>...] out
osd pause pause osd
osd perf print dump of OSD perf summary stats
osd repair <who> initiate repair on osd <who>
osd reweight <int[0-]> <float[0.0-1.0]> reweight osd to 0.0 < <weight> < 1.0
osd reweight-by-utilization {<int[100- reweight OSDs by utilization [overload-
]>} percentage-for-consideration, default
120]
osd rm <ids> [<ids>...] remove osd(s) <id> [<id>...] in
osd scrub <who> initiate scrub on osd <who>
osd set pause|noup|nodown|noout|noin|
nobackfill|norecover|noscrub|nodeep-
scrub|notieragent set <key>
osd setmaxosd <int[0-]> set new maximum osd value
osd stat print summary of OSD map
osd thrash <int[0-]> thrash OSDs for <num_epochs>
osd unpause unpause osd
osd unset pause|noup|nodown|noout|noin|nobackfill|norecover|noscrub|nodeep-scrub|notieragent unset <key>
CRUSH¶
osd crush add <osdname (id|osd.id)> add or update crushmap position and
<float[0.0-]> <args> [<args>...] weight for <name> with <weight> and
location <args>
osd crush add-bucket <name> <type> add no-parent (probably root) crush
bucket <name> of type <type>
osd crush create-or-move <osdname (id| create entry or move existing entry
osd.id)> <float[0.0-]> <args> [<args>.. for <name> <weight> at/to location
.] <args>
osd crush dump dump crush map
osd crush link <name> <args> [<args>...] link existing entry for <name> under
location <args>
osd crush move <name> <args> [<args>...] move existing entry for <name> to
location <args>
osd crush remove <name> {<ancestor>} remove <name> from crush map (
everywhere, or just at <ancestor>)
osd crush reweight <name> <float[0.0-]> change <name>'s weight to <weight> in
crush map
osd crush rm <name> {<ancestor>} remove <name> from crush map (
everywhere, or just at <ancestor>)
osd crush rule create-erasure <name> create crush rule <name> for erasure
{<profile>} coded pool created with <profile> (
default default
osd crush rule create-simple <name> create crush rule <name> to start from
<root> <type> {firstn|indep} <root>, replicate across buckets of
type <type>, using a choose mode of
<firstn|indep> (default firstn; indep
best for erasure pools)
osd crush rule dump {<name>} dump crush rule <name> (default all)
osd crush rule list list crush rules
osd crush rule ls list crush rules
osd crush rule rm <name> remove crush rule <name>
osd crush set set crush map from input file
osd crush set <osdname (id|osd.id)> update crushmap position and weight
<float[0.0-]> <args> [<args>...] for <name> to <weight> with location
<args>
osd crush show-tunables show current crush tunables
osd crush tunables legacy|argonaut| set crush tunables values to <profile>
bobtail|firefly|optimal|default
osd crush unlink <name> {<ancestor>} unlink <name> from crush map (
everywhere, or just at <ancestor>)
osd find <int[0-]> find osd <id> in the CRUSH map and
show its location
osd getcrushmap {<int[0-]>} get CRUSH map
osd setcrushmap set crush map from input file
osd tree {<int[0-]>} print OSD tree
Erasure Code
osd erasure-code-profile get <name> get erasure code profile <name>
osd erasure-code-profile ls list all erasure code profiles
osd erasure-code-profile rm <name> remove erasure code profile <name>
osd erasure-code-profile set <name> create erasure code profile <name>
{<profile> [<profile>...]} with [<key[=value]> ...] pairs. Add a
--force at the end to override an
existing profile (VERY DANGEROUS)
Pool¶
osd lspools {<int>} list pools
osd pool create <poolname> <int[0-]> create pool
{<int[0-]>} {replicated|erasure}
{<erasure_code_profile>} {<ruleset>}
osd pool delete <poolname> {<poolname>} delete pool
{--yes-i-really-really-mean-it}
osd pool get <poolname> size|min_size| get pool parameter <var>
crash_replay_interval|pg_num|pgp_num|
crush_ruleset|hit_set_type|hit_set_
period|hit_set_count|hit_set_fpp|auid
osd pool mksnap <poolname> <snap> make snapshot <snap> in <pool>
osd pool rename <poolname> <poolname> rename <srcpool> to <destpool>
osd pool rmsnap <poolname> <snap> remove snapshot <snap> from <pool>
osd pool set <poolname> size|min_size| set pool parameter <var> to <val>
crash_replay_interval|pg_num|pgp_num|
crush_ruleset|hashpspool|hit_set_type|
hit_set_period|hit_set_count|hit_set_
fpp|debug_fake_ec_pool|target_max_
bytes|target_max_objects|cache_target_
dirty_ratio|cache_target_full_ratio|
cache_min_flush_age|cache_min_evict_
age|auid <val> {--yes-i-really-mean-it}
osd pool set-quota <poolname> max_ set object or byte limit on pool
objects|max_bytes <val>
osd pool stats {<name>} obtain stats from all pools, or from
specified pool
osd primary-affinity <osdname (id|osd. adjust osd primary-affinity from 0.0 <=
id)> <float[0.0-1.0]> <weight> <= 1.0
osd primary-temp <pgid> <id> set primary_temp mapping pgid:<id>|-1 (
developers only)
osd tier add <poolname> <poolname> {-- add the tier <tierpool> (the second
force-nonempty} one) to base pool <pool> (the first
one)
osd tier add-cache <poolname> add a cache <tierpool> (the second one)
<poolname> <int[0-]> of size <size> to existing pool
<pool> (the first one)
osd tier cache-mode <poolname> none| specify the caching mode for cache
writeback|invalidate+forward|readonly tier <pool>
osd tier remove <poolname> <poolname> remove the tier <tierpool> from base
pool <pool>
osd tier remove-overlay <poolname> remove the overlay pool for base pool
<pool>
osd tier set-overlay <poolname> set the overlay pool for base pool
<poolname> <pool> to be <overlaypool>
osd map <poolname> <objectname> find pg for <object> in <pool>
osd pg-temp <pgid> {<id> [<id>...]} set pg_temp mapping pgid:[<id> [<id>...
]] (developers only)
pg debug unfound_objects_exist|degraded_ show debug info about pgs
pgs_exist
pg deep-scrub <pgid> start deep-scrub on <pgid>
pg dump {all|summary|sum|delta|pools| show human-readable versions of pg map
osds|pgs|pgs_brief [all|summary|sum| (only 'all' valid with plain)
delta|pools|osds|pgs|pgs_brief...]}
pg dump_json {all|summary|sum|pools| show human-readable version of pg map
osds|pgs [all|summary|sum|pools|osds| in json only
pgs...]}
pg dump_pools_json show pg pools info in json only
pg dump_stuck {inactive|unclean|stale show information about stuck pgs
[inactive|unclean|stale...]} {<int>}
pg force_create_pg <pgid> force creation of pg <pgid>
pg getmap get binary pg map to -o/stdout
pg map <pgid> show mapping of pg to osds
pg repair <pgid> start repair on <pgid>
pg scrub <pgid> start scrub on <pgid>
pg send_pg_creates trigger pg creates to be issued
pg set_full_ratio <float[0.0-1.0]> set ratio at which pgs are considered
full
pg set_nearfull_ratio <float[0.0-1.0]> set ratio at which pgs are considered
nearly full
pg stat show placement group status.
Misc¶
heap dump|start_profiler|stop_profiler| show heap usage info (available only
release|stats if compiled with tcmalloc)
injectargs <injected_args> [<injected_ inject config arguments into monitor
args>...]
tell <name (type.id)> <args> [<args>...] send a command to a specific daemon
RBD¶
(ls | list) [-l | --long ] [pool-name] list rbd images
(-l includes snapshots/clones)
info <image-name> show information about image size,
striping, etc.
create [--order <bits>] --size <MB> <name> create an empty image
clone [--order <bits>] <parentsnap> <clonename>
clone a snapshot into a COW
child image
children <snap-name> display children of snapshot
flatten <image-name> fill clone with parent data
(make it independent)
resize --size <MB> <image-name> resize (expand or contract) image
rm <image-name> delete an image
export <image-name> <path> export image to file
"-" for stdout
import <path> <image-name> import image from file
(dest defaults
as the filename part of file)
"-" for stdin
diff <image-name> [--from-snap <snap-name>] print extents that differ since
a previous snap, or image creation
export-diff <image-name> [--from-snap <snap-name>] <path>
export an incremental diff to
path, or "-" for stdout
import-diff <path> <image-name> import an incremental diff from
path or "-" for stdin
(cp | copy) <src> <dest> copy src image to dest
(mv | rename) <src> <dest> rename src image to dest
snap ls <image-name> dump list of image snapshots
snap create <snap-name> create a snapshot
snap rollback <snap-name> rollback image to snapshot
snap rm <snap-name> deletes a snapshot
snap purge <image-name> deletes all snapshots
snap protect <snap-name> prevent a snapshot from being deleted
snap unprotect <snap-name> allow a snapshot to be deleted
watch <image-name> watch events on image
map <image-name> map image to a block device
using the kernel
unmap <device> unmap a rbd device that was
mapped by the kernel
showmapped show the rbd images mapped
by the kernel
lock list <image-name> show locks held on an image
lock add <image-name> <id> [--shared <tag>] take a lock called id on an image
lock remove <image-name> <id> <locker> release a lock on an image
bench-write <image-name> simple write benchmark
--io-size <bytes> write size
--io-threads <num> ios in flight
--io-total <bytes> total bytes to write
--io-pattern <seq|rand> write pattern
RGW¶
$ ./radosgw-admin --help
usage: radosgw-admin <cmd> [options...]
commands:
user create create a new user
user modify modify user
user info get user info
user rm remove user
user suspend suspend a user
user enable re-enable user after suspension
user check check user info
user stats show user stats as accounted by quota subsystem
caps add add user capabilities
caps rm remove user capabilities
subuser create create a new subuser
subuser modify modify subuser
subuser rm remove subuser
key create create access key
key rm remove access key
bucket list list buckets
bucket link link bucket to specified user
bucket unlink unlink bucket from specified user
bucket stats returns bucket statistics
bucket rm remove bucket
bucket check check bucket index
object rm remove object
object unlink unlink object from bucket index
quota set set quota params
quota enable enable quota
quota disable disable quota
region get show region info
regions list list all regions set on this cluster
region set set region info (requires infile)
region default set default region
region-map get show region-map
region-map set set region-map (requires infile)
zone get show zone cluster params
zone set set zone cluster params (requires infile)
zone list list all zones set on this cluster
pool add add an existing pool for data placement
pool rm remove an existing pool from data placement set
pools list list placement active set
policy read bucket/object policy
log list list log objects
log show dump a log from specific object or (bucket + date
+ bucket-id)
log rm remove log object
usage show show usage (by user, date range)
usage trim trim usage (by user, date range)
temp remove remove temporary objects that were created up to
specified date (and optional time)
gc list dump expired garbage collection objects (specify
--include-all to list all entries, including unexpired)
gc process manually process garbage
metadata get get metadata info
metadata put put metadata info
metadata rm remove metadata info
metadata list list metadata info
mdlog list list metadata log
mdlog trim trim metadata log
bilog list list bucket index log
bilog trim trim bucket index log (use start-marker, end-marker)
datalog list list data log
datalog trim trim data log
opstate list list stateful operations entries (use client_id,
op_id, object)
opstate set set state on an entry (use client_id, op_id, object, state)
opstate renew renew state on an entry (use client_id, op_id, object)
opstate rm remove entry (use client_id, op_id, object)
replicalog get get replica metadata log entry
replicalog delete delete replica metadata log entry
options:
--uid=<id> user id
--subuser=<name> subuser name
--access-key=<key> S3 access key
--email=<email>
--secret=<key> specify secret key
--gen-access-key generate random access key (for S3)
--gen-secret generate random secret key
--key-type=<type> key type, options are: swift, s3
--temp-url-key[-2]=<key> temp url key
--access=<access> Set access permissions for sub-user, should be one
of read, write, readwrite, full
--display-name=<name>
--system set the system flag on the user
--bucket=<bucket>
--pool=<pool>
--object=<object>
--date=<date>
--start-date=<date>
--end-date=<date>
--bucket-id=<bucket-id>
--shard-id=<shard-id> optional for mdlog list
required for:
mdlog trim
replica mdlog get/delete
replica datalog get/delete
--metadata-key=<key> key to retrieve metadata from with metadata get
--rgw-region=<region> region in which radosgw is running
--rgw-zone=<zone> zone in which radosgw is running
--fix besides checking bucket index, will also fix it
--check-objects bucket check: rebuilds bucket index according to
actual objects state
--format=<format> specify output format for certain operations: xml,
json
--purge-data when specified, user removal will also purge all the
user data
--purge-keys when specified, subuser removal will also purge all the
subuser keys
--purge-objects remove a bucket's objects before deleting it
(NOTE: required to delete a non-empty bucket)
--sync-stats option to 'user stats', update user stats with current
stats reported by user's buckets indexes
--show-log-entries=<flag> enable/disable dump of log entries on log show
--show-log-sum=<flag> enable/disable dump of log summation on log show
--skip-zero-entries log show only dumps entries that don't have zero value
in one of the numeric field
--infile specify a file to read in when setting data
--state=<state string> specify a state for the opstate set command
--replica-log-type replica log type (metadata, data, bucket), required for
replica log operations
--categories=<list> comma separated list of categories, used in usage show
--caps=<caps> list of caps (e.g., "usage=read, write; user=read"
--yes-i-really-mean-it required for certain operations
Quota options:
--bucket specified bucket for quota command
--max-objects specify max objects (negative value to disable)
--max-size specify max size (in bytes, negative value to disable)
--quota-scope scope of quota (bucket, user)
--conf/-c FILE read configuration from the given configuration file
--id/-i ID set ID portion of my name
--name/-n TYPE.ID set name
--cluster NAME set cluster name (default: ceph)
--version show version and quit