David Moreau Simard

5 minute read

I learned that there was a Ceph REST API and I experimented with it a bit.

I said the documentation was lacking and I take that back, I didn’t catch on that the API documentation was built into the application. I opened a pull request to make the documentation a bit more explicit about that: https://github.com/ceph/ceph/pull/1026

Here’s what the API documentation currently looks like:

Possible commandsMethodDescription
auth/add?entity=entity(<string>)&caps={c
aps(<string>) [<string>...]}
PUTadd 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=entity(<string>)&caps=c
aps(<string>) [<string>...]
PUTupdate caps for <name> from caps specified in the command
auth/del?entity=entity(<string>)PUTdelete all caps for <name>
auth/export?entity={entity(<string>)}GETwrite keyring for requested entity, or master keyring if none given
auth/get?entity=entity(<string>)GETwrite keyring file with requested key
auth/get-key?entity=entity(<string>)GETdisplay requested key
auth/get-or-create?entity=entity(<string
>)&caps={caps(<string>) [<string>...]}
PUTadd auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command
auth/get-or-create-key?entity=entity(<st
ring>)&caps={caps(<string>)
[<string>...]}
PUTget, or add, key for <name> from system/caps pairs specified in the command. If key already exists, any given caps must match the existing caps for that key.
auth/importPUTauth import: read keyring file from -i <file>
auth/listGETlist authentication state
auth/print-key?entity=entity(<string>)GETdisplay requested key
auth/print_key?entity=entity(<string>)GETdisplay requested key
tell/<osdid-or-pgid>/bench?count={count(
<int>)}&size={size(<int>)}
PUTOSD benchmark: write <count> <size>-byte objects, (default 1G size 4MB). Results in log.
compactPUTcause compaction of monitor's leveldb storage
config-key/del?key=key(<string>)PUTdelete <key>
config-key/exists?key=key(<string>)GETcheck for <key>'s existence
config-key/get?key=key(<string>)GETget <key>
config-key/listGETlist keys
config-key/put?key=key(<string>)&val={va
l(<string>)}
PUTput <key>, value <val>
tell/<osdid-or-
pgid>/cpu_profiler?arg=arg(status|flush)
PUTrun cpu profiling on daemon
tell/<osdid-or-pgid>/debug/kick_recovery
_wq?delay=delay(<int[0-]>)
PUTset osd_recovery_delay_start to <val>
tell/<osdid-or-pgid>/debug_dump_missing?
filename=filename(<outfilename>)
GETdump missing objects to a named file
df?detail={detail}GETshow cluster free space stats
tell/<osdid-or-
pgid>/dump_pg_recovery_stats
GETdump pg recovery statistics
tell/<osdid-or-pgid>/flush_pg_statsPUTflush pg stats
fsidGETshow cluster FSID/UUID
health?detail={detail}GETshow cluster health
tell/<osdid-or-pgid>/heap?heapcmd=heapcm
d(dump|start_profiler|stop_profiler|rele
ase|stats)
PUTshow heap usage info (available only if compiled with tcmalloc)
heap?heapcmd=heapcmd(dump|start_profiler
|stop_profiler|release|stats)
PUTshow heap usage info (available only if compiled with tcmalloc)
tell/<osdid-or-pgid>/injectargs?injected
_args=injected_args(<string>)
[<string>...]
PUTinject configuration arguments into running OSD
injectargs?injected_args=injected_args(<
string>) [<string>...]
PUTinject config arguments into monitor
tell/<osdid-or-pgid>/list_missing?offset
={offset(<string>)}
GETlist missing objects on this pg, perhaps starting at an offset given in JSON
tell/<osdid-or-pgid>/list_missing?offset
={offset(<string>)}
PUTlist missing objects on this pg, perhaps starting at an offset given in JSON
log?logtext=logtext(<string>)
[<string>...]
PUTlog supplied text to the monitor log
tell/<osdid-or-
pgid>/mark_unfound_lost?mulcmd=revert
PUTmark all unfound objects in this pg as lost, either removing or reverting to a prior version if one is available
tell/<osdid-or-pgid>/mark_unfound_lost/r
evert?mulcmd=revert
PUTmark all unfound objects in this pg as lost, either removing or reverting to a prior version if one is available
mds/add_data_pool?pool=pool(<string>)PUTadd data pool <pool>
mds/cluster_downPUTtake MDS cluster down
mds/cluster_upPUTbring MDS cluster up
mds/compat/rm_compat?feature=feature(<in
t[0-]>)
PUTremove compatible feature
mds/compat/rm_incompat?feature=feature(<
int[0-]>)
PUTremove incompatible feature
mds/compat/showGETshow mds compatibility settings
mds/deactivate?who=who(<string>)PUTstop mds
mds/dump?epoch={epoch(<int[0-]>)}GETdump info, optionally from epoch
mds/fail?who=who(<string>)PUTforce mds to status failed
mds/getmap?epoch={epoch(<int[0-]>)}GETget MDS map, optionally from epoch
mds/newfs?metadata=metadata(<int[0-]>)&d
ata=data(<int[0-]>)&sure={--yes-i
-really-mean-it}
PUTmake new filesystom using pools <metadata> and <data>
mds/remove_data_pool?pool=pool(<string>)PUTremove data pool <pool>
mds/rm?gid=gid(<int[0-]>)&who=who(<name
(type.id)>)
PUTremove nonactive mds
mds/rmfailed?who=who(<int[0-]>)PUTremove failed mds
mds/set?key=allow_new_snaps&sure={sure(<
string>)}
Unknownset <key>
mds/set_max_mds?maxmds=maxmds(<int[0-]>)PUTset max MDS index
mds/set_state?gid=gid(<int[0-]>)&state=s
tate(<int[0-20]>)
PUTset mds state of <gid> to <numeric-state>
mds/setmap?epoch=epoch(<int[0-]>)PUTset mds map; must supply correct epoch number
mds/statGETshow MDS status
mds/stop?who=who(<string>)PUTstop mds
mds/tell?who=who(<string>)&args=args(<st
ring>) [<string>...]
PUTsend command to particular mds
mds/unset?key=allow_new_snaps&sure={sure
(<string>)}
Unknownunset <key>
mon/add?name=name(<string>)&addr=addr(<I
Paddr[:port]>)
PUTadd new monitor named <name> at <addr>
mon/dump?epoch={epoch(<int[0-]>)}GETdump formatted monmap (optionally from epoch)
mon/getmap?epoch={epoch(<int[0-]>)}GETget monmap
mon/remove?name=name(<string>)PUTremove monitor named <name>
mon/statGETsummarize monitor status
mon_statusGETreport status of monitors
osd/blacklist?blacklistop=blacklistop(ad
d|rm)&addr=addr(<EntityAddr>)&expire={ex
pire(<float[0.0-]>)}
PUTadd (optionally until <expire> seconds from now) or remove <addr> from blacklist
osd/blacklist/lsGETshow blacklisted clients
osd/create?uuid={uuid(<uuid>)}PUTcreate new osd (with optional UUID)
osd/crush/add?id=id(<osdname (id|osd.id)
>)&weight=weight(<float[0.0-]>)&args=arg
s(<string(goodchars [A-Za-z0-9-_.=])>)
[<string(goodchars [A-Za-z0-9-_.=])>...]
PUTadd or update crushmap position and weight for <name> with <weight> and location <args>
osd/crush/add-
bucket?name=name(<string(goodchars
[A-Za-z0-9-_.])>)&type=type(<string>)
PUTadd no-parent (probably root) crush bucket <name> of type <type>
osd/crush/create-or-move?id=id(<osdname
(id|osd.id)>)&weight=weight(<float[0.0-]
>)&args=args(<string(goodchars
[A-Za-z0-9-_.=])>) [<string(goodchars
[A-Za-z0-9-_.=])>...]
PUTcreate entry or move existing entry for <name> <weight> at/to location <args>
osd/crush/dumpGETdump crush map
osd/crush/link?name=name(<string>)&args=
args(<string(goodchars
[A-Za-z0-9-_.=])>) [<string(goodchars
[A-Za-z0-9-_.=])>...]
PUTlink existing entry for <name> under location <args>
osd/crush/move?name=name(<string(goodcha
rs [A-Za-z0-9-_.])>)&args=args(<string(g
oodchars [A-Za-z0-9-_.=])>)
[<string(goodchars [A-Za-z0-9-_.=])>...]
PUTmove existing entry for <name> to location <args>
osd/crush/remove?name=name(<string(goodc
hars [A-Za-z0-9-_.])>)&ancestor={ancesto
r(<string(goodchars [A-Za-z0-9-_.])>)}
PUTremove <name> from crush map (everywhere, or just at <ancestor>
osd/crush/reweight?name=name(<string(goo
dchars [A-Za-z0-9-_.])>)&weight=weight(<
float[0.0-]>)
PUTchange <name>'s weight to <weight> in crush map
osd/crush/rm?name=name(<string(goodchars
[A-Za-z0-9-_.])>)&ancestor={ancestor(<st
ring(goodchars [A-Za-z0-9-_.])>)}
PUTremove <name> from crush map (everywhere, or just at <ancestor>
osd/crush/rule/create-
simple?name=name(<string(goodchars [A-Za
-z0-9-_.])>)&root=root(<string(goodchars
[A-Za-z0-9-_.])>)&type=type(<string(good
chars [A-Za-z0-9-_.])>)
PUTcreate crush rule <name> in <root> of type <type>
osd/crush/rule/dumpGETdump crush rules
osd/crush/rule/listGETlist crush rules
osd/crush/rule/lsGETlist crush rules
osd/crush/rule/rm?name=name(<string(good
chars [A-Za-z0-9-_.])>)
PUTremove crush rule <name>
osd/crush/setPUTset crush map from input file
osd/crush/set?id=id(<osdname (id|osd.id)
>)&weight=weight(<float[0.0-]>)&args=arg
s(<string(goodchars [A-Za-z0-9-_.=])>)
[<string(goodchars [A-Za-z0-9-_.=])>...]
PUTupdate crushmap position and weight for <name> to <weight> with location <args>
osd/crush/tunables?profile=profile(legac
y|argonaut|bobtail|optimal|default)
PUTset crush tunables values to <profile>
osd/crush/unlink?name=name(<string(goodc
hars [A-Za-z0-9-_.])>)&ancestor={ancesto
r(<string(goodchars [A-Za-z0-9-_.])>)}
PUTunlink <name> from crush map (everywhere, or just at <ancestor>
osd/deep-scrub?who=who(<string>)PUTinitiate deep scrub on osd <who>
osd/down?ids=ids(<string>) [<string>...]PUTset osd(s) <id> [<id>...] down
osd/dump?epoch={epoch(<int[0-]>)}GETprint summary of OSD map
osd/find?id=id(<int[0-]>)GETfind osd <id> in the CRUSH map and show its location
osd/getcrushmap?epoch={epoch(<int[0-]>)}GETget CRUSH map
osd/getmap?epoch={epoch(<int[0-]>)}GETget OSD map
osd/getmaxosdGETshow largest OSD id
osd/in?ids=ids(<string>) [<string>...]PUTset osd(s) <id> [<id>...] in
osd/lost?id=id(<int[0-]>)&sure={--yes-i
-really-mean-it}
PUTmark osd as permanently lost. THIS DESTROYS DATA IF NO MORE REPLICAS EXIST, BE CAREFUL
osd/ls?epoch={epoch(<int[0-]>)}GETshow all OSD ids
osd/lspools?auid={auid(<int>)}GETlist pools
osd/map?pool=pool(<poolname>)&object=obj
ect(<objectname>)
GETfind pg for <object> in <pool>
osd/out?ids=ids(<string>) [<string>...]PUTset osd(s) <id> [<id>...] out
osd/pausePUTpause osd
osd/perfGETprint dump of OSD perf summary stats
osd/pool/create?pool=pool(<poolname>)&pg
_num=pg_num(<int[0-]>)&pgp_num={pgp_num(
<int[0-]>)}&properties={properties(<stri
ng(goodchars [A-Za-z0-9-_.=])>)
[<string(goodchars
[A-Za-z0-9-_.=])>...]}
PUTcreate pool
osd/pool/delete?pool=pool(<poolname>)&po
ol2={pool2(<poolname>)}&sure={--yes-i
-really-really-mean-it}
PUTdelete pool
osd/pool/get?pool=pool(<poolname>)&var=v
ar(size|min_size|crash_replay_interval|p
g_num|pgp_num|crush_ruleset)
GETget pool parameter <var>
osd/pool/mksnap?pool=pool(<poolname>)&sn
ap=snap(<string>)
PUTmake snapshot <snap> in <pool>
osd/pool/rename?srcpool=srcpool(<poolnam
e>)&destpool=destpool(<poolname>)
PUTrename <srcpool> to <destpool>
osd/pool/rmsnap?pool=pool(<poolname>)&sn
ap=snap(<string>)
PUTremove snapshot <snap> from <pool>
osd/pool/set?pool=pool(<poolname>)&var=v
ar(size|min_size|crash_replay_interval|p
g_num|pgp_num|crush_ruleset|hashpspool)&
val=val(<int>)
PUTset pool parameter <var> to <val>
osd/pool/set-quota?pool=pool(<poolname>)
&field=field(max_objects|max_bytes)&val=
val(<string>)
PUTset object or byte limit on pool
osd/pool/stats?name={name(<string>)}GETobtain stats from all pools, or from specified pool
osd/repair?who=who(<string>)PUTinitiate repair on osd <who>
osd/reweight?id=id(<int[0-]>)&weight=wei
ght(<float[0.0-1.0]>)
PUTreweight osd to 0.0 < <weight> < 1.0
osd/reweight-by-
utilization?oload={oload(<int[100-]>)}
PUTreweight OSDs by utilization [overload-percentage-for-consideration, default 120]
osd/rm?ids=ids(<string>) [<string>...]PUTremove osd(s) <id> [<id>...] in
osd/scrub?who=who(<string>)PUTinitiate scrub on osd <who>
osd/set?key=key(pause|noup|nodown|noout|
noin|nobackfill|norecover|noscrub
|nodeep-scrub)
PUTset <key>
osd/setcrushmapPUTset crush map from input file
osd/setmaxosd?newmax=newmax(<int[0-]>)PUTset new maximum osd value
osd/statGETprint summary of OSD map
osd/thrash?num_epochs=num_epochs(<int[0-
]>)
PUTthrash OSDs for <num_epochs>
osd/tier/add?pool=pool(<poolname>)&tierp
ool=tierpool(<poolname>)
PUTadd the tier <tierpool> to base pool <pool>
osd/tier/cache-mode?pool=pool(<poolname>
)&mode=mode(none|writeback|invalidate+fo
rward|readonly)
PUTspecify the caching mode for cache tier <pool>
osd/tier/remove?pool=pool(<poolname>)&ti
erpool=tierpool(<poolname>)
PUTremove the tier <tierpool> from base pool <pool>
osd/tier/remove-
overlay?pool=pool(<poolname>)
PUTremove the overlay pool for base pool <pool>
osd/tier/set-overlay?pool=pool(<poolname
>)&overlaypool=overlaypool(<poolname>)
PUTset the overlay pool for base pool <pool> to be <overlaypool>
osd/tree?epoch={epoch(<int[0-]>)}GETprint OSD tree
osd/unpausePUTunpause osd
osd/unset?key=key(pause|noup|nodown|noou
t|noin|nobackfill|norecover|noscrub
|nodeep-scrub)
PUTunset <key>
pg/debug?debugop=debugop(unfound_objects
_exist|degraded_pgs_exist)
GETshow debug info about pgs
pg/deep-scrub?pgid=pgid(<pgid>)PUTstart deep-scrub on <pgid>
pg/dump?dumpcontents={dumpcontents(all|s
ummary|sum|delta|pools|osds|pgs|pgs_brie
f) [all|summary|sum|delta|pools|osds|pgs
|pgs_brief...]}
GETshow human-readable versions of pg map (only 'all' valid with plain)
pg/dump_json?dumpcontents={dumpcontents(
all|summary|sum|pools|osds|pgs)
[all|summary|sum|pools|osds|pgs...]}
GETshow human-readable version of pg map in json only
pg/dump_pools_jsonGETshow pg pools info in json only
pg/dump_stuck?stuckops={stuckops(inactiv
e|unclean|stale) [inactive|unclean|stale
...]}&threshold={threshold(<int>)}
GETshow information about stuck pgs
pg/force_create_pg?pgid=pgid(<pgid>)PUTforce creation of pg <pgid>
pg/getmapGETget binary pg map to -o/stdout
pg/map?pgid=pgid(<pgid>)GETshow mapping of pg to osds
pg/repair?pgid=pgid(<pgid>)PUTstart repair on <pgid>
pg/scrub?pgid=pgid(<pgid>)PUTstart scrub on <pgid>
pg/send_pg_createsPUTtrigger pg creates to be issued
pg/set_full_ratio?ratio=ratio(<float[0.0
-1.0]>)
PUTset ratio at which pgs are considered full
pg/set_nearfull_ratio?ratio=ratio(<float
[0.0-1.0]>)
PUTset ratio at which pgs are considered nearly full
pg/statGETshow placement group status.
tell/<osdid-or-pgid>/queryGETshow details of a specific pg
tell/<osdid-or-pgid>/queryGETshow details of a specific pg
quorum?quorumcmd=quorumcmd(enter|exit)PUTenter or exit quorum
quorum_statusGETreport status of monitor quorum
report?tags={tags(<string>)
[<string>...]}
GETreport full status of cluster, optional title tag strings
tell/<osdid-or-
pgid>/reset_pg_recovery_stats
PUTreset pg recovery statistics
scrubPUTscrub the monitor stores
statusGETshow cluster status
sync/force?validate1={--yes-i-really-
mean-it}&validate2={--i-know-what-i-am-
doing}
PUTforce sync of and clear monitor store
tell?target=target(<name
(type.id)>)&args=args(<string>)
[<string>...]
PUTsend a command to a specific daemon
tell/<osdid-or-pgid>/versionGETreport version of OSD

Enjoy !