utilities/ceph/python-cephclient/python-cephclient/US92424-Ceph-Rebase-Update-...

1063 lines
44 KiB
Diff

--- a/cephclient/wrapper.py 2017-02-16 14:59:35.589795141 +0200
+++ b/cephclient/wrapper.py 2017-02-16 20:15:47.543896397 +0200
@@ -25,9 +25,6 @@ class CephWrapper(client.CephClient):
super(CephWrapper, self).__init__(**params)
self.user_agent = 'python-cephclient-wrapper'
- ###
- # root GET calls
- ###
def df(self, detail=None, **kwargs):
if detail is not None:
return self.get('df?detail={0}'
@@ -61,9 +58,6 @@ class CephWrapper(client.CephClient):
def version(self, **kwargs):
return self.get('version', **kwargs)
- ###
- # root PUT calls
- ###
def compact(self, **kwargs):
return self.put('compact', **kwargs)
@@ -72,10 +66,14 @@ class CephWrapper(client.CephClient):
.format(heapcmd), **kwargs)
def injectargs(self, injected_args, **kwargs):
+ if isinstance(injected_args, list):
+ injected_args = '&injected_args='.join(injected_args)
return self.put('injectargs?injected_args={0}'
.format(injected_args), **kwargs)
def log(self, logtext, **kwargs):
+ if isinstance(logtext, list):
+ logtext = '&logtext='.join(logtext)
return self.put('log?logtext={0}'
.format(logtext), **kwargs)
@@ -87,22 +85,25 @@ class CephWrapper(client.CephClient):
return self.put('scrub', **kwargs)
def sync(self, validate1=None, validate2=None, **kwargs):
+ return self.sync_force(validate1, validate2, **kwargs)
+
+ def sync_force(self, validate1=None, validate2=None, **kwargs):
request = []
request.append('sync/force')
if validate1 is not None:
- request.append('?validate1={0}'.format(validate1))
+ request.append('validate1={0}'.format(validate1))
if validate2 is not None:
request.append('validate2={0}'.format(validate2))
-
- return self.put(''.join(request), **kwargs)
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
def tell(self, target, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('tell?target={0}&args={1}'
.format(target, args), **kwargs)
- ###
- # auth GET calls
- ###
def auth_export(self, entity=None, **kwargs):
if entity is not None:
return self.get('auth/export?entity={0}'
@@ -125,9 +126,10 @@ class CephWrapper(client.CephClient):
return self.get('auth/print-key?entity={0}'
.format(entity), **kwargs)
- ###
- # auth PUT calls
- ###
+ def auth_print_key(self, entity, **kwargs):
+ return self.get('auth/print_key?entity={0}'
+ .format(entity), **kwargs)
+
"""
caps dictionary format:
caps = {
@@ -136,62 +138,50 @@ class CephWrapper(client.CephClient):
...
}
"""
- def auth_add(self, entity, caps={}, file=None, **kwargs):
- # XXX-TODO: Implement file input
- full_caps = list()
+ def auth_add(self, entity, caps={}, **kwargs):
if caps:
- for key in caps:
- permissions = caps[key].replace(' ', '+')
- full_caps.append('&caps={0}&caps={1}'
- .format(key, permissions))
-
- return self.put('auth/add?entity={0}{1}'
- .format(entity, ''.join(full_caps)), **kwargs)
+ caps = '&caps='.join(['{}&caps={}'.format(k, v) for (k, v) in caps.items()]).replace(' ', '+')
+ return self.put('auth/add?entity={0}&caps={1}'
+ .format(entity, caps), **kwargs)
+ else:
+ return self.put('auth/add?entity={0}'
+ .format(entity), **kwargs)
- def auth_caps(self, entity, caps={}, **kwargs):
- full_caps = list()
+ def auth_caps(self, entity, caps, **kwargs):
if caps:
- for key in caps:
- permissions = caps[key].replace(' ', '+')
- full_caps.append('&caps={0}&caps={1}'
- .format(key, permissions))
-
- return self.put('auth/caps?entity={0}{1}'
- .format(entity, ''.join(full_caps)), **kwargs)
+ caps = '&caps='.join(['{}&caps={}'.format(k, v) for (k, v) in caps.items()]).replace(' ', '+')
+ return self.put('auth/caps?entity={0}&caps={1}'
+ .format(entity, caps), **kwargs)
def auth_del(self, entity, **kwargs):
return self.put('auth/del?entity={0}'
.format(entity), **kwargs)
- def auth_get_or_create(self, entity, caps={}, file=None, **kwargs):
- # XXX-TODO: Implement file input
- full_caps = list()
+ def auth_get_or_create(self, entity, caps={}, **kwargs):
if caps:
- for key in caps:
- permissions = caps[key].replace(' ', '+')
- full_caps.append('&caps={0}&caps={1}'.format(key, permissions))
-
- return self.put('auth/get-or-create?entity={0}{1}'
- .format(entity, ''.join(full_caps)), **kwargs)
+ caps = '&caps='.join(['{}&caps={}'.format(k, v) for (k, v) in caps.items()]).replace(' ', '+')
+ return self.put('auth/get-or-create?entity={0}&caps={1}'
+ .format(entity, caps), **kwargs)
+ else:
+ return self.put('auth/get-or-create?entity={0}'
+ .format(entity), **kwargs)
def auth_get_or_create_key(self, entity, caps={}, **kwargs):
- # XXX-TODO: Implement file input
- full_caps = list()
- if caps:
- for key in caps:
- permissions = caps[key].replace(' ', '+')
- full_caps.append('&caps={0}&caps={1}'.format(key, permissions))
-
- return self.put('auth/get-or-create-key?entity={0}{1}'
- .format(entity, ''.join(full_caps)), **kwargs)
-
- def auth_import(self, file):
- # XXX-TODO: Implement file input
- raise exceptions.FunctionNotImplemented()
-
- ###
- # config-key GET calls
- ###
+ if caps is not None:
+ caps = '&caps='.join(['{}&caps={}'.format(k, v) for (k, v) in caps.items()]).replace(' ', '+')
+ return self.put('auth/get-or-create-key?entity={0}&caps={1}'
+ .format(entity, caps), **kwargs)
+ else:
+ return self.put('auth/get-or-create-key?entity={0}'
+ .format(entity), **kwargs)
+
+ def auth_import(self, **kwargs):
+ return self.put('auth/import', **kwargs)
+
+ def auth_rm(self, entity, **kwargs):
+ return self.put('auth/rm?entity={0}'
+ .format(entity), **kwargs)
+
def config_key_exists(self, key, **kwargs):
return self.get('config-key/exists?key={0}'
.format(key), **kwargs)
@@ -203,47 +193,84 @@ class CephWrapper(client.CephClient):
def config_key_list(self, **kwargs):
return self.get('config-key/list', **kwargs)
- ###
- # config-key PUT calls
- ###
def config_key_del(self, key, **kwargs):
return self.put('config-key/del?key={0}'
.format(key), **kwargs)
- def config_key_put(self, key, val, **kwargs):
- return self.put('config-key/put?key={0}&val={1}'
- .format(key, val), **kwargs)
-
- ###
- # fs GET calls
- ###
+ def config_key_put(self, key, val=None, **kwargs):
+ if val is not None:
+ return self.put('config-key/put?key={0}&val={1}'
+ .format(key, val), **kwargs)
+ else:
+ return self.put('config-key/put?key={0}'
+ .format(key), **kwargs)
+
+ def config_key_rm(self, key, **kwargs):
+ return self.put('config-key/rm?key={0}'
+ .format(key), **kwargs)
+
def fs_ls(self, **kwargs):
return self.get('fs/ls', **kwargs)
- ###
- # fs PUT calls
- ###
def fs_new(self, fs_name, metadata, data, **kwargs):
return self.put('fs/new?fs_name={0}&metadata={1}&data={2}'
.format(fs_name, metadata, data), **kwargs)
def fs_reset(self, fs_name, sure=None, **kwargs):
- request = []
- request.append('fs/reset?fs_name={0}'.format(fs_name))
if sure is not None:
- request.append('&sure={0}'.format(sure))
- return self.put(''.join(request), **kwargs)
+ return self.put('fs/reset?fs_name={0}&sure={1}'
+ .format(fs_name, sure), **kwargs)
+ else:
+ return self.put('fs/reset?fs_name={0}'
+ .format(fs_name), **kwargs)
def fs_rm(self, fs_name, sure=None, **kwargs):
- request = []
- request.append('fs/rm?fs_name={0}'.format(fs_name))
if sure is not None:
- request.append('&sure={0}'.format(sure))
- return self.put(''.join(request), **kwargs)
+ return self.put('fs/rm?fs_name={0}&sure={1}'
+ .format(fs_name, sure), **kwargs)
+ else:
+ return self.put('fs/rm?fs_name={0}'
+ .format(fs_name), **kwargs)
+
+ def fs_add_data_pool(self, fs_name, pool, **kwargs):
+ return self.put('fs/add_data_pool?fs_name={0}&pool={1}'
+ .format(fs_name, pool), **kwargs)
+
+ def fs_dump(self, epoch=None, **kwargs):
+ if epoch is not None:
+ return self.get('fs/dump?epoch={0}'
+ .format(epoch), **kwargs)
+ else:
+ return self.get('fs/dump', **kwargs)
+
+ def fs_flag_set(self, flag_name, val, confirm=None, **kwargs):
+ if confirm is not None:
+ return self.put('fs/flag/set?flag_name={0}&val={1}&confirm={2}'
+ .format(flag_name, val, confirm), **kwargs)
+ else:
+ return self.put('fs/flag/set?flag_name={0}&val={1}'
+ .format(flag_name, val), **kwargs)
+
+ def fs_get(self, fs_name, **kwargs):
+ return self.get('fs/get?fs_name={0}'
+ .format(fs_name), **kwargs)
+
+ def fs_rm_data_pool(self, fs_name, pool, **kwargs):
+ return self.put('fs/rm_data_pool?fs_name={0}&pool={1}'
+ .format(fs_name, pool), **kwargs)
+
+ def fs_set(self, fs_name, var, val, confirm=None, **kwargs):
+ if confirm is not None:
+ return self.put('fs/set?fs_name={0}&var={1}&val={2}&confirm={3}'
+ .format(fs_name, var, val, confirm), **kwargs)
+ else:
+ return self.put('fs/set?fs_name={0}&var={1}&val={2}'
+ .format(fs_name, var, val), **kwargs)
+
+ def fs_set_default(self, fs_name, **kwargs):
+ return self.put('fs/set_default?fs_name={0}'
+ .format(fs_name), **kwargs)
- ###
- # mds GET calls
- ###
def mds_compat_show(self, **kwargs):
return self.get('mds/compat/show', **kwargs)
@@ -266,9 +293,6 @@ class CephWrapper(client.CephClient):
def mds_stat(self, **kwargs):
return self.get('mds/stat', **kwargs)
- ###
- # mds PUT calls
- ###
def mds_add_data_pool(self, pool, **kwargs):
return self.put('mds/add_data_pool?pool={0}'
.format(pool), **kwargs)
@@ -307,63 +331,69 @@ class CephWrapper(client.CephClient):
return self.put('mds/remove_data_pool?pool={0}'
.format(pool), **kwargs)
- def mds_rm(self, gid, who, **kwargs):
- return self.put('mds/rm?gid={0}&who={1}'
- .format(gid, who), **kwargs)
+ def mds_rm(self, gid, **kwargs):
+ return self.put('mds/rm?gid={0}'
+ .format(gid), **kwargs)
- def mds_rmfailed(self, who, **kwargs):
- return self.put('mds/rmfailed?who={0}'
- .format(who), **kwargs)
-
- def mds_set_max_file_size(self, val, confirm=None, **kwargs):
+ def mds_rmfailed(self, who, confirm=None, **kwargs):
if confirm is not None:
- return self.put('mds/set?var=max_file_size?val={0}&confirm={1}'
- .format(val, confirm), **kwargs)
+ return self.put('mds/rmfailed?who={0}&confirm={1}'
+ .format(who, confirm), **kwargs)
else:
- return self.put('mds/set?var=max_file_size?val={0}'
- .format(val), **kwargs)
+ return self.put('mds/rmfailed?who={0}'
+ .format(who), **kwargs)
+
+ def mds_set_max_file_size(self, val, confirm=None, **kwargs):
+ return self.mds_set(self, 'max_file_size', val, confirm=None, **kwargs)
def mds_set_allow_new_snaps(self, val, confirm=None, **kwargs):
- if confirm is not None:
- return self.put('mds/set?var=allow_new_snaps?val={0}&confirm={1}'
- .format(val, confirm), **kwargs)
- else:
- return self.put('mds/set?var=allow_new_snaps?val={0}'
- .format(val), **kwargs)
+ return self.mds_set(self, 'allow_new_snaps', val, confirm=None, **kwargs)
def mds_set_inline_data(self, val, confirm=None, **kwargs):
- if confirm is not None:
- return self.put('mds/set?var=inline_data?val={0}&confirm={1}'
- .format(val, confirm), **kwargs)
- else:
- return self.put('mds/set?var=inline_data?val={0}'
- .format(val), **kwargs)
+ return self.mds_set(self, 'inline_data', val, confirm=None, **kwargs)
def mds_set_max_mds(self, maxmds, **kwargs):
return self.put('mds/set_max_mds?maxmds={0}'
.format(maxmds), **kwargs)
- def mds_setmap(self, epoch, **kwargs):
- return self.put('mds/setmap?epoch={0}'
- .format(epoch), **kwargs)
+ # mds_setmap() not defined in new api
def mds_stop(self, who, **kwargs):
return self.put('mds/stop?who={0}'
.format(who), **kwargs)
def mds_tell(self, who, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('mds/tell?who={0}&args={1}'
.format(who, args), **kwargs)
- def mds_unset_allow_new_snaps(self, sure, **kwargs):
- """
- mds/unset?key=allow_new_snaps&sure=
- """
- raise exceptions.FunctionNotImplemented()
-
- ###
- # mon GET calls
- ###
+ # mds_unset_allow_new_snaps() not defined in new api
+
+ def mds_metadata(self, who, **kwargs):
+ return self.get('mds/metadata?who={0}'
+ .format(who), **kwargs)
+
+ def mds_repaired(self, rank, **kwargs):
+ return self.put('mds/repaired?rank={0}'
+ .format(rank), **kwargs)
+
+ def mds_rm_data_pool(self, pool, **kwargs):
+ return self.put('mds/rm_data_pool?pool={0}'
+ .format(pool), **kwargs)
+
+ def mds_set(self, var, val, confirm=None, **kwargs):
+ if confirm is not None:
+ return self.put('mds/set?var={0}&val={1}&confirm={2}'
+ .format(var, val, confirm), **kwargs)
+ else:
+ return self.put('mds/set?var={0}&val={1}'
+ .format(var, val), **kwargs)
+
+ def mds_set_state(self, gid, state, **kwargs):
+ return self.put('mds/set_state?gid={0}&state={1}'
+ .format(gid, state), **kwargs)
+
def mon_dump(self, epoch=None, **kwargs):
if epoch is not None:
return self.get('mon/dump?epoch={0}'
@@ -388,9 +418,6 @@ class CephWrapper(client.CephClient):
def mon_status(self, **kwargs):
return self.get('mon_status', **kwargs)
- ###
- # mon PUT calls
- ###
def mon_add(self, name, addr, **kwargs):
return self.put('mon/add?name={0}&addr={1}'
.format(name, addr), **kwargs)
@@ -399,9 +426,38 @@ class CephWrapper(client.CephClient):
return self.put('mon/remove?name={0}'
.format(name), **kwargs)
- ###
- # osd GET calls
- ###
+ def mon_compact(self, **kwargs):
+ return self.put('mon/compact', **kwargs)
+
+ def mon_metadata(self, id, **kwargs):
+ return self.get('mon/metadata?id={0}'
+ .format(id), **kwargs)
+
+ def mon_rm(self, name, **kwargs):
+ return self.put('mon/rm?name={0}'
+ .format(name), **kwargs)
+
+ def mon_scrub(self, **kwargs):
+ return self.put('mon/scrub', **kwargs)
+
+ def mon_sync_force(self, validate1=None, validate2=None, **kwargs):
+ request = []
+ request.append('mon/sync/force')
+ if validate1 is not None:
+ request.append('validate1={0}'.format(validate1))
+ if validate2 is not None:
+ request.append('validate2={0}'.format(validate2))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
+
+ def node_ls(self, type=None, **kwargs):
+ if type is not None:
+ return self.get('node/ls?type={0}'
+ .format(type), **kwargs)
+ else:
+ return self.get('node/ls', **kwargs)
+
def osd_blacklist_ls(self, **kwargs):
return self.get('osd/blacklist/ls', **kwargs)
@@ -490,20 +546,26 @@ class CephWrapper(client.CephClient):
else:
return self.get('osd/lspools', **kwargs)
- def osd_map(self, pool, object, **kwargs):
- return self.get('osd/map?pool={0}&object={1}'
- .format(pool, object), **kwargs)
+ def osd_map(self, pool, object, nspace=None, **kwargs):
+ if nspace is not None:
+ return self.get('osd/map?pool={0}&object={1}&nspace={2}'
+ .format(pool, object, nspace), **kwargs)
+ else:
+ return self.get('osd/map?pool={0}&object={1}'
+ .format(pool, object), **kwargs)
- def osd_metadata(self, id, **kwargs):
- return self.get('osd/metadata?id={0}'
- .format(id), **kwargs)
+ def osd_metadata(self, id=None, **kwargs):
+ if id is not None:
+ return self.get('osd/metadata?id={0}'
+ .format(id), **kwargs)
+ else:
+ return self.get('osd/metadata', **kwargs)
def osd_perf(self, **kwargs):
return self.get('osd/perf', **kwargs)
def osd_get_pool_param(self, pool, var, **kwargs):
- return self.get('osd/pool/get?pool={0}&var={1}'
- .format(pool, var), **kwargs)
+ return self.osd_pool_get(pool, var, **kwargs)
def osd_pool_get(self, pool, var, **kwargs):
return self.get('osd/pool/get?pool={0}&var={1}'
@@ -517,6 +579,9 @@ class CephWrapper(client.CephClient):
return self.get('osd/pool/stats', **kwargs)
def osd_get_pool_quota(self, pool, **kwargs):
+ return self.osd_pool_get_quota(pool, **kwargs)
+
+ def osd_pool_get_quota(self, pool, **kwargs):
return self.get('osd/pool/get-quota?pool={0}'
.format(pool), **kwargs)
@@ -537,18 +602,28 @@ class CephWrapper(client.CephClient):
else:
return self.get('osd/tree', **kwargs)
- ###
- # osd PUT calls
- ###
- def osd_blacklist(self, blacklistop, addr, expire, **kwargs):
- return self.put('osd/blacklist?blacklistop={0}&addr={1}&expire={2}'
- .format(blacklistop, addr, expire), **kwargs)
-
- def osd_create(self, uuid, **kwargs):
- return self.put('osd/create?uuid={0}'
- .format(uuid), **kwargs)
+ def osd_blacklist(self, blacklistop, addr, expire=None, **kwargs):
+ if expire is not None:
+ return self.put('osd/blacklist?blacklistop={0}&addr={1}&expire={2}'
+ .format(blacklistop, addr, expire), **kwargs)
+ else:
+ return self.put('osd/blacklist?blacklistop={0}&addr={1}'
+ .format(blacklistop, addr), **kwargs)
+
+ def osd_create(self, uuid=None, id=None, **kwargs):
+ request = []
+ request.append('osd/create')
+ if uuid is not None:
+ request.append('uuid={0}'.format(uuid))
+ if id is not None:
+ request.append('id={0}'.format(id))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
def osd_crush_add(self, id, weight, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('osd/crush/add?id={0}&weight={1}&args={2}'
.format(id, weight, args), **kwargs)
@@ -557,6 +632,8 @@ class CephWrapper(client.CephClient):
.format(name, type), **kwargs)
def osd_crush_create_or_move(self, id, weight, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('osd/crush/create-or-move?id={0}&weight={1}&args={2}'
.format(id, weight, args), **kwargs)
@@ -565,10 +642,14 @@ class CephWrapper(client.CephClient):
.format(tunable), **kwargs)
def osd_crush_link(self, name, args, **kwargs):
- return self.put('osd/crush/link?name={0}&args={2}'
+ if isinstance(args, list):
+ args = '&args='.join(args)
+ return self.put('osd/crush/link?name={0}&args={1}'
.format(name, args), **kwargs)
def osd_crush_move(self, name, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('osd/crush/move?name={0}&args={1}'
.format(name, args), **kwargs)
@@ -595,7 +676,7 @@ class CephWrapper(client.CephClient):
return self.put('osd/crush/reweight-subtree?name={0}&weight={1}'
.format(name, weight), **kwargs)
- def osd_crush_rm(self, name, ancestor, **kwargs):
+ def osd_crush_rm(self, name, ancestor=None, **kwargs):
if ancestor is not None:
return self.put('osd/crush/rm?name={0}&ancestor={1}'
.format(name, ancestor), **kwargs)
@@ -603,33 +684,35 @@ class CephWrapper(client.CephClient):
return self.put('osd/crush/rm?name={0}'
.format(name), **kwargs)
- def osd_crush_rule_create_erasure(self, name, profile, **kwargs):
- return self.put(
- 'osd/crush/rule/create-erasure?name={0}&profile={1}'
- .format(name, profile), **kwargs)
+ def osd_crush_rule_create_erasure(self, name, profile=None, **kwargs):
+ if profile is not None:
+ return self.put('osd/crush/rule/create-erasure?name={0}&profile={1}'
+ .format(name, profile), **kwargs)
+ else:
+ return self.put('osd/crush/rule/create-erasure?name={0}'
+ .format(name), **kwargs)
- def osd_crush_rule_create_simple(self, name, root,
- type, mode=None, **kwargs):
+ def osd_crush_rule_create_simple(self, name, root, type, mode=None, **kwargs):
if mode is not None:
- return self.put(
- 'osd/crush/rule/create-simple?name={0}&root={1}&type={2}'
- '&mode={3}'.format(name, root, type, mode), **kwargs)
- else:
- return self.put(
- 'osd/crush/rule/create-simple?name={0}&root={1}&type={2}'
- .format(name, root, type), **kwargs)
+ return self.put('osd/crush/rule/create-simple?name={0}&root={1}&type={2}&mode={3}'
+ .format(name, root, type, mode), **kwargs)
+ else:
+ return self.put('osd/crush/rule/create-simple?name={0}&root={1}&type={2}'
+ .format(name, root, type), **kwargs)
def osd_crush_rule_rm(self, name, **kwargs):
return self.put('osd/crush/rule/rm?name={0}'
.format(name), **kwargs)
def osd_crush_set(self, id, weight, args, **kwargs):
+ if isinstance(args, list):
+ args = '&args='.join(args)
return self.put('osd/crush/set?id={0}&weight={1}&args={2}'
.format(id, weight, args), **kwargs)
def osd_crush_set_tunable(self, tunable, value, **kwargs):
return self.put('osd/crush/set-tunable?tunable={0}&value={1}'
- .format(tunable), **kwargs)
+ .format(tunable, value), **kwargs)
def osd_crush_tunables(self, profile, **kwargs):
return self.put('osd/crush/tunables?profile={0}'
@@ -648,6 +731,8 @@ class CephWrapper(client.CephClient):
.format(who), **kwargs)
def osd_down(self, ids, **kwargs):
+ if isinstance(ids, list):
+ ids = '&ids='.join(ids)
return self.put('osd/down?ids={0}'
.format(ids), **kwargs)
@@ -664,6 +749,8 @@ class CephWrapper(client.CephClient):
.format(name), **kwargs)
def osd_in(self, ids, **kwargs):
+ if isinstance(ids, list):
+ ids = '&ids='.join(ids)
return self.put('osd/in?ids={0}'
.format(ids), **kwargs)
@@ -676,6 +763,8 @@ class CephWrapper(client.CephClient):
.format(id), **kwargs)
def osd_out(self, ids, **kwargs):
+ if isinstance(ids, list):
+ ids = '&ids='.join(ids)
return self.put('osd/out?ids={0}'
.format(ids), **kwargs)
@@ -690,32 +779,29 @@ class CephWrapper(client.CephClient):
return self.put('osd/pg-temp?pgid={0}'
.format(pgid), **kwargs)
- def osd_pool_create(self, pool, pg_num, pgp_num, pool_type=None,
- erasure_code_profile=None, ruleset=None,
- expected_num_objects=None, **kwargs):
+ def osd_pool_create(self, pool, pg_num, pgp_num=None, pool_type=None, erasure_code_profile=None, ruleset=None, expected_num_objects=None, **kwargs):
request = []
- request.append('osd/pool/create?pool={0}&pg_num={1}&pgp_num={2}'
- .format(pool, pg_num, pgp_num))
+ request.append('osd/pool/create?pool={0}&pg_num={1}'.format(pool, pg_num))
+ if pgp_num is not None:
+ request.append('pgp_num={0}'.format(pgp_num))
if pool_type is not None:
- request.append('&pool_type={0}'.format(pool_type))
+ request.append('pool_type={0}'.format(pool_type))
if erasure_code_profile is not None:
- request.append('&erasure_code_profile={0}'
- .format(erasure_code_profile))
+ request.append('erasure_code_profile={0}'.format(erasure_code_profile))
if ruleset is not None:
- request.append('&ruleset={0}'.format(ruleset))
+ request.append('ruleset={0}'.format(ruleset))
if expected_num_objects is not None:
- request.append('&expected_num_objects={0}'
- .format(expected_num_objects))
- return self.put(''.join(request), **kwargs)
+ request.append('expected_num_objects={0}'.format(expected_num_objects))
+ return self.put('&'.join(request), **kwargs)
def osd_pool_delete(self, pool, pool2=None, sure=None, **kwargs):
request = []
request.append('osd/pool/delete?pool={0}'.format(pool))
if pool2 is not None:
- request.append('&pool2={0}'.format(pool2))
+ request.append('pool2={0}'.format(pool2))
if sure is not None:
- request.append('&sure={0}'.format(sure))
- return self.put(''.join(request), **kwargs)
+ request.append('sure={0}'.format(sure))
+ return self.put('&'.join(request), **kwargs)
def osd_pool_mksnap(self, pool, snap, **kwargs):
return self.put('osd/pool/mksnap?pool={0}&snap={1}'
@@ -730,12 +816,7 @@ class CephWrapper(client.CephClient):
.format(pool, snap), **kwargs)
def osd_set_pool_param(self, pool, var, val, force=None, **kwargs):
- if force is not None:
- return self.put('osd/pool/set?pool={0}&var={1}&val={2}&force={3}'
- .format(pool, var, val, force), **kwargs)
- else:
- return self.put('osd/pool/set?pool={0}&var={1}&val={2}'
- .format(pool, var, val), **kwargs)
+ return self.osd_pool_set(pool, var, val, force, **kwargs)
def osd_pool_set(self, pool, var, val, force=None, **kwargs):
if force is not None:
@@ -754,26 +835,57 @@ class CephWrapper(client.CephClient):
.format(pgid, id), **kwargs)
def osd_set_pool_quota(self, pool, field, val, **kwargs):
+ return self.osd_pool_set_quota(pool, field, val, **kwargs)
+
+ def osd_pool_set_quota(self, pool, field, val, **kwargs):
return self.put('osd/pool/set-quota?pool={0}&field={1}&val={2}'
.format(pool, field, val), **kwargs)
- def osd_repair(self, pool, who, **kwargs):
+
+ def osd_repair(self, who, **kwargs):
return self.put('osd/repair?who={0}'
- .format(pool, who), **kwargs)
+ .format(who), **kwargs)
def osd_reweight(self, id, weight, **kwargs):
return self.put('osd/reweight?id={0}&weight={1}'
.format(id, weight), **kwargs)
- def osd_reweight_by_pg(self, oload, pools, **kwargs):
- return self.put('osd/reweight-by-pg?oload={0}&pools={1}'
- .format(oload, pools), **kwargs)
-
- def osd_reweight_by_utilization(self, oload, **kwargs):
- return self.put('osd/reweight-by-utilization?oload={0}'
- .format(oload), **kwargs)
+ def osd_reweight_by_pg(self, oload=None, max_change=None, max_osds=None, pools=None, **kwargs):
+ request = []
+ request.append('osd/reweight-by-pg')
+ if oload is not None:
+ request.append('oload={0}'.format(oload))
+ if max_change is not None:
+ request.append('max_change={0}'.format(max_change))
+ if max_osds is not None:
+ request.append('max_osds={0}'.format(max_osds))
+ if pools is not None:
+ request.append('pools={0}'.format(pools))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
+
+ def osd_reweight_by_utilization(self, oload=None, max_change=None, max_osds=None, no_increasing=None, **kwargs):
+ request = []
+ request.append('osd/reweight-by-utilization')
+ if oload is not None:
+ request.append('oload={0}'.format(oload))
+ if max_change is not None:
+ request.append('max_change={0}'.format(max_change))
+ if max_osds is not None:
+ request.append('max_osds={0}'.format(max_osds))
+ if no_increasing is not None:
+ request.append('no_increasing={0}'.format(no_increasing))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
def osd_remove(self, ids, **kwargs):
+ return self.osd_rm(ids, **kwargs)
+
+ def osd_rm(self, ids, **kwargs):
+ if isinstance(ids, list):
+ ids = '&ids='.join(ids)
return self.put('osd/rm?ids={0}'
.format(ids), **kwargs)
@@ -782,14 +894,9 @@ class CephWrapper(client.CephClient):
.format(who), **kwargs)
def osd_set_key(self, key, **kwargs):
- return self.put('osd/set?key={0}'
- .format(key), **kwargs)
+ return self.osd_set(key, **kwargs)
- def osd_crushmap(self, **kwargs):
- """
- osd/crushmap
- """
- raise exceptions.FunctionNotImplemented()
+ # osd_crushmap() not defined in new api
def osd_setmaxosd(self, newmax, **kwargs):
return self.put('osd/setmaxosd?newmax={0}'
@@ -801,21 +908,18 @@ class CephWrapper(client.CephClient):
def osd_tier_add(self, pool, tierpool, force_nonempty=None, **kwargs):
if force_nonempty is not None:
- return self.put('osd/tier/add?pool={0}&tierpool={1}'
- '&force_nonempty={2}'
+ return self.put('osd/tier/add?pool={0}&tierpool={1}&force_nonempty={2}'
.format(pool, tierpool, force_nonempty), **kwargs)
else:
return self.put('osd/tier/add?pool={0}&tierpool={1}'
.format(pool, tierpool), **kwargs)
def osd_tier_add_cache(self, pool, tierpool, size, **kwargs):
- return self.put('osd/tier/add-cache?pool={0}&tierpool={1}'
- '&size={2}'
+ return self.put('osd/tier/add-cache?pool={0}&tierpool={1}&size={2}'
.format(pool, tierpool, size), **kwargs)
def osd_tier_cachemode(self, pool, mode, **kwargs):
- return self.put('osd/tier/cache-mode?pool={0}&mode={1}'
- .format(pool, mode), **kwargs)
+ return self.osd_tier_cache_mode(pool, mode, **kwargs)
def osd_tier_remove(self, pool, tierpool, **kwargs):
return self.put('osd/tier/remove?pool={0}&tierpool={1}'
@@ -829,16 +933,81 @@ class CephWrapper(client.CephClient):
return self.put('osd/tier/set-overlay?pool={0}&overlaypool={1}'
.format(pool, overlaypool), **kwargs)
- def osd_unpause(self, key, **kwargs):
+ def osd_unpause(self, **kwargs):
return self.put('osd/unpause', **kwargs)
def osd_unset(self, key, **kwargs):
return self.put('osd/unset?key={0}'
.format(key), **kwargs)
- ###
- # pg GET calls
- ###
+ def osd_blacklist_clear(self, **kwargs):
+ return self.put('osd/blacklist/clear', **kwargs)
+
+ def osd_pool_rm(self, pool, pool2=None, sure=None, **kwargs):
+ request = []
+ request.append('osd/pool/rm?pool={0}'.format(pool))
+ if pool2 is not None:
+ request.append('pool2={0}'.format(pool2))
+ if sure is not None:
+ request.append('sure={0}'.format(sure))
+ return self.put('&'.join(request), **kwargs)
+
+ def osd_set(self, key, **kwargs):
+ return self.put('osd/set?key={0}'
+ .format(key), **kwargs)
+
+ def osd_setcrushmap(self, **kwargs):
+ return self.put('osd/setcrushmap', **kwargs)
+
+ def osd_test_reweight_by_pg(self, oload=None, max_change=None, max_osds=None, pools=None, **kwargs):
+ request = []
+ request.append('osd/test-reweight-by-pg')
+ if oload is not None:
+ request.append('oload={0}'.format(oload))
+ if max_change is not None:
+ request.append('max_change={0}'.format(max_change))
+ if max_osds is not None:
+ request.append('max_osds={0}'.format(max_osds))
+ if pools is not None:
+ request.append('pools={0}'.format(pools))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
+
+ def osd_test_reweight_by_utilization(self, oload=None, max_change=None, max_osds=None, no_increasing=None, **kwargs):
+ request = []
+ request.append('osd/test-reweight-by-utilization')
+ if oload is not None:
+ request.append('oload={0}'.format(oload))
+ if max_change is not None:
+ request.append('max_change={0}'.format(max_change))
+ if max_osds is not None:
+ request.append('max_osds={0}'.format(max_osds))
+ if no_increasing is not None:
+ request.append('no_increasing={0}'.format(no_increasing))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
+
+ def osd_tier_cache_mode(self, pool, mode, sure=None, **kwargs):
+ if sure is not None:
+ return self.put('osd/tier/cache-mode?pool={0}&mode={1}&sure={2}'
+ .format(pool, mode, sure), **kwargs)
+ else:
+ return self.put('osd/tier/cache-mode?pool={0}&mode={1}'
+ .format(pool, mode), **kwargs)
+
+ def osd_tier_rm(self, pool, tierpool, **kwargs):
+ return self.put('osd/tier/rm?pool={0}&tierpool={1}'
+ .format(pool, tierpool), **kwargs)
+
+ def osd_tier_rm_overlay(self, pool, **kwargs):
+ return self.put('osd/tier/rm-overlay?pool={0}'
+ .format(pool), **kwargs)
+
+ def osd_utilization(self, **kwargs):
+ return self.get('osd/utilization', **kwargs)
+
def pg_debug(self, debugop, **kwargs):
kwargs['supported_body_types'] = ['text', 'xml']
@@ -866,15 +1035,12 @@ class CephWrapper(client.CephClient):
request = []
request.append('pg/dump_stuck')
if stuckops is not None:
- request.append('?stuckops={0}'.format(stuckops))
+ request.append('stuckops={0}'.format(stuckops))
if threshold is not None:
- if stuckops is not None:
- request.append('&')
- else:
- request.append('?')
request.append('threshold={0}'.format(threshold))
-
- return self.get(''.join(request), **kwargs)
+ if len(request) == 1:
+ return self.get(request[0], **kwargs)
+ return self.get(request[0] + '?' + '&'.join(request[1:]), **kwargs)
def pg_getmap(self, **kwargs):
kwargs['supported_body_types'] = ['binary']
@@ -885,21 +1051,21 @@ class CephWrapper(client.CephClient):
request = []
request.append('pg/ls')
if pool is not None:
- request.append('?pool={0}'.format(pool))
+ request.append('pool={0}'.format(pool))
if states is not None:
request.append('states={0}'.format(states))
-
- return self.get(''.join(request), **kwargs)
+ if len(request) == 1:
+ return self.get(request[0], **kwargs)
+ return self.get(request[0] + '?' + '&'.join(request[1:]), **kwargs)
def pg_ls_by_osd(self, osd, pool=None, states=None, **kwargs):
request = []
request.append('pg/ls-by-osd?osd={0}'.format(osd))
if pool is not None:
- request.append('?pool={0}'.format(pool))
+ request.append('pool={0}'.format(pool))
if states is not None:
request.append('states={0}'.format(states))
-
- return self.get(''.join(request), **kwargs)
+ return self.get('&'.join(request), **kwargs)
def pg_ls_by_pool(self, poolstr, states=None, **kwargs):
if states is not None:
@@ -913,11 +1079,10 @@ class CephWrapper(client.CephClient):
request = []
request.append('pg/ls-by-primary?osd={0}'.format(osd))
if pool is not None:
- request.append('?pool={0}'.format(pool))
+ request.append('pool={0}'.format(pool))
if states is not None:
request.append('states={0}'.format(states))
-
- return self.get(''.join(request), **kwargs)
+ return self.get('&'.join(request), **kwargs)
def pg_map(self, pgid, **kwargs):
return self.get('pg/map?pgid={0}'
@@ -926,10 +1091,6 @@ class CephWrapper(client.CephClient):
def pg_stat(self, **kwargs):
return self.get('pg/stat', **kwargs)
- ###
- # pg PUT calls
- ###
-
def pg_deep_scrub(self, pgid, **kwargs):
return self.put('pg/deep-scrub?pgid={0}'
.format(pgid), **kwargs)
@@ -957,20 +1118,20 @@ class CephWrapper(client.CephClient):
return self.put('pg/set_nearfull_ratio?ratio={0}'
.format(ratio), **kwargs)
- ###
- # tell GET calls
- ###
def tell_debug_dump_missing(self, id, filename, **kwargs):
- return self.get('tell/{0}/debug_dump_missing?filename={1}'
+ return self.get('tell/{0}/debug/dump_missing?filename={1}'
.format(id, filename), **kwargs)
def tell_dump_pg_recovery_stats(self, id, **kwargs):
return self.get('tell/{0}/dump_pg_recovery_stats'
.format(id), **kwargs)
- def tell_list_missing(self, id, offset, **kwargs):
- return self.get('tell/{0}/list_missing?offset={1}'
- .format(id, offset), **kwargs)
+ def tell_list_missing(self, id, offset=None, **kwargs):
+ if offset is not None:
+ return self.get('tell/{0}/list_missing?offset={1}'
+ .format(id, offset), **kwargs)
+ else:
+ return self.get('tell/{0}/list_missing', **kwargs)
def tell_query(self, id, **kwargs):
return self.get('tell/{0}/query'
@@ -979,3 +1140,55 @@ class CephWrapper(client.CephClient):
def tell_version(self, id, **kwargs):
return self.get('tell/{0}/version'
.format(id), **kwargs)
+
+ def tell_bench(self, id, count=None, size=None, object_size=None, object_num=None, **kwargs):
+ request = []
+ request.append('tell/{0}/bench'.format(id))
+ if count is not None:
+ request.append('count={0}'.format(count))
+ if size is not None:
+ request.append('size={0}'.format(size))
+ if object_size is not None:
+ request.append('object_size={0}'.format(object_size))
+ if object_num is not None:
+ request.append('object_num={0}'.format(object_num))
+ if len(request) == 1:
+ return self.put(request[0], **kwargs)
+ return self.put(request[0] + '?' + '&'.join(request[1:]), **kwargs)
+
+ def tell_cluster_log(self, id, level, message, **kwargs):
+ if isinstance(message, list):
+ message = '&message='.join(message)
+ return self.put('tell/{0}/cluster_log?level={1}&message={2}'
+ .format(id, level, message), **kwargs)
+
+ def tell_cpu_profiler(self, id, arg, **kwargs):
+ return self.put('tell/{0}/cpu_profiler?arg={1}'
+ .format(id, arg), **kwargs)
+
+ def tell_debug_kick_recovery_wq(self, id, delay, **kwargs):
+ return self.put('tell/{0}/debug/kick_recovery_wq?delay={1}'
+ .format(id, delay), **kwargs)
+
+ def tell_flush_pg_stats(self, id, **kwargs):
+ return self.put('tell/{0}/flush_pg_stats'
+ .format(id), **kwargs)
+
+ def tell_heap(self, id, heapcmd, **kwargs):
+ return self.put('tell/{0}/heap?heapcmd={1}'
+ .format(id, heapcmd), **kwargs)
+
+ def tell_injectargs(self, id, injected_args, **kwargs):
+ if isinstance(injected_args, list):
+ injected_args = '&injected_args='.join(injected_args)
+ return self.put('tell/{0}/injectargs?injected_args={1}'
+ .format(id, injected_args), **kwargs)
+
+ def tell_mark_unfound_lost(self, id, mulcmd, **kwargs):
+ return self.put('tell/{0}/mark_unfound_lost?mulcmd={1}'
+ .format(id, mulcmd), **kwargs)
+
+ def tell_reset_pg_recovery_stats(self, id, **kwargs):
+ return self.put('tell/{0}/reset_pg_recovery_stats'
+ .format(id), **kwargs)
+