if isinstance(cmd, list):
self.cmd = ' '.join(cmd)
else:
- 'cmd needs to be either a list or a str'
assert isinstance(cmd, string) or isinstance(cmd, unicode), \
+ 'cmd needs to be either a list or a str'
self.cmd = cmd
self.cmd = str(self.cmd)
self.ret = int(ret)
def __str__(self):
return repr('{c}: expected return {e}, got {r} ({o})'.format(
- c=self.cmd, e=self.expected, r=self.ret, o=self.msg))
+ c=self.cmd, e=self.expected, r=self.ret, o=self.msg))
+
def call(cmd):
if isinstance(cmd, list):
print('call: {0}'.format(args))
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- (procout,procerr) = proc.communicate(None)
+ procout, procerr = proc.communicate(None)
- return (proc.returncode, procout, procerr)
+ return proc.returncode, procout, procerr
-def expect(cmd, expected_ret):
+def expect(cmd, expected_ret):
try:
(r, out, err) = call(cmd)
except ValueError as e:
j = json.loads(out)
return j
-def main():
+def main():
quorum_status = get_quorum_status()
mon_names = [mon['name'] for mon in quorum_status['monmap']['mons']]
reply = json.loads(out)
assert reply['mon_status']['name'] == m, \
- 'reply obtained from mon.{0}, expected mon.{1}'.format(
- reply['mon_status']['name'], m)
+ 'reply obtained from mon.{0}, expected mon.{1}'.format(
+ reply['mon_status']['name'], m)
print('test out-of-quorum reply')
for m in mon_names:
quorum_status = get_quorum_status()
assert m not in quorum_status['quorum_names'], \
- 'mon.{0} was not supposed to be in quorum ({1})'.format(
- m, quorum_status['quorum_names'])
+ 'mon.{0} was not supposed to be in quorum ({1})'.format(
+ m, quorum_status['quorum_names'])
out = expect('ceph ping mon.{0}'.format(m), 0)
reply = json.loads(out)
mon_status = reply['mon_status']
assert mon_status['name'] == m, \
- 'reply obtained from mon.{0}, expected mon.{1}'.format(
- mon_status['name'], m)
+ 'reply obtained from mon.{0}, expected mon.{1}'.format(
+ mon_status['name'], m)
assert mon_status['state'] == 'electing', \
- 'mon.{0} is in state {1}, expected electing'.format(
- m,mon_status['state'])
+ 'mon.{0} is in state {1}, expected electing'.format(
+ m, mon_status['state'])
expect('ceph daemon mon.{0} quorum enter'.format(m), 0)
# License version 2.1, as published by the Free Software
# Foundation. See file COPYING.
#
-import sys
-import os
+import argparse
import base64
-import time
import errno
+import logging
+import os
import random
-import subprocess
import string
-import logging
-import argparse
-
+import subprocess
+import sys
+import time
#
# Accepted Environment variables:
#
-LOG = logging.getLogger(os.path.basename(sys.argv[0].replace('.py','')))
+LOG = logging.getLogger(os.path.basename(sys.argv[0].replace('.py', '')))
SIZES = [
(0, 0),
(4096, 0),
(4097, -errno.EFBIG),
(8192, -errno.EFBIG)
- ]
+]
OPS = {
- 'put':['existing','new'],
- 'del':['existing','enoent'],
- 'exists':['existing','enoent'],
- 'get':['existing','enoent']
- }
+ 'put': ['existing', 'new'],
+ 'del': ['existing', 'enoent'],
+ 'exists': ['existing', 'enoent'],
+ 'get': ['existing', 'enoent']
+}
+
+CONFIG_PUT = [] # list: keys
+CONFIG_DEL = [] # list: keys
+CONFIG_EXISTING = {} # map: key -> size
-CONFIG_PUT = [] #list: keys
-CONFIG_DEL = [] #list: keys
-CONFIG_EXISTING = {} #map: key -> size
def run_cmd(cmd, expects=0):
- full_cmd = [ 'ceph', 'config-key' ] + cmd
+ full_cmd = ['ceph', 'config-key'] + cmd
if expects < 0:
expects = -expects
cmdlog.debug('{fc}'.format(fc=' '.join(full_cmd)))
proc = subprocess.Popen(full_cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
stdout = []
stderr = []
while True:
try:
- (out, err) = proc.communicate()
+ out, err = proc.communicate()
if out is not None:
stdout += out.decode().split('\n')
cmdlog.debug('stdout: {s}'.format(s=out))
if ret != expects:
cmdlog.error('cmd > {cmd}'.format(cmd=full_cmd))
- cmdlog.error('expected return \'{expected}\' got \'{got}\''.format(
- expected=expects,got=ret))
+ cmdlog.error("expected return '{expected}' got '{got}'".format(
+ expected=expects, got=ret))
cmdlog.error('stdout')
for i in stdout:
cmdlog.error('{x}'.format(x=i))
for i in stderr:
cmdlog.error('{x}'.format(x=i))
-#end run_cmd
+
+# end run_cmd
def gen_data(size, rnd):
chars = string.ascii_letters + string.digits
- return ''.join(rnd.choice(chars) for i in range(size))
+ return ''.join(rnd.choice(chars) for _ in range(size))
+
def gen_key(rnd):
return gen_data(20, rnd)
+
def gen_tmp_file_path(rnd):
file_name = gen_data(20, rnd)
- file_path = os.path.join('/tmp', 'ceph-test.'+file_name)
+ file_path = os.path.join('/tmp', 'ceph-test.' + file_name)
return file_path
+
def destroy_tmp_file(fpath):
if os.path.exists(fpath) and os.path.isfile(fpath):
os.unlink(fpath)
+
def write_data_file(data, rnd):
file_path = gen_tmp_file_path(rnd)
data_file = open(file_path, 'a+')
data_file.write(data)
data_file.close()
return file_path
-#end write_data_file
+
+
+# end write_data_file
def choose_random_op(rnd):
op = rnd.choice(
list(OPS.keys())
)
sop = rnd.choice(OPS[op])
- return (op, sop)
+ return op, sop
def parse_args(args):
parser = argparse.ArgumentParser(
- description='Test the monitor\'s \'config-key\' API',
- )
+ description="Test the monitor's 'config-key' API",
+ )
parser.add_argument(
'-v', '--verbose',
action='store_true',
help='be more verbose',
- )
+ )
parser.add_argument(
'-s', '--seed',
metavar='SEED',
help='use SEED instead of generating it in run-time',
- )
+ )
parser.add_argument(
'-d', '--duration',
metavar='SECS',
help='run test for SECS seconds (default: 300)',
- )
+ )
parser.set_defaults(
seed=None,
duration=300,
verbose=False,
- )
+ )
return parser.parse_args(args)
-def main():
+def main():
args = parse_args(sys.argv[1:])
verbose = args.verbose
if verbose:
loglevel = logging.DEBUG
- logging.basicConfig(level=loglevel,)
+ logging.basicConfig(level=loglevel)
LOG.info('seed: {s}'.format(s=seed))
via_file = (rnd.uniform(0, 100) < 50.0)
expected = 0
- cmd = [ 'put' ]
+ cmd = ['put']
key = None
if sop == 'existing':
continue
key = rnd.choice(CONFIG_PUT)
assert key in CONFIG_EXISTING, \
- 'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+ "key '{k_}' not in CONFIG_EXISTING".format(k_=key)
- expected = 0 # the store just overrides the value if the key exists
- #end if sop == 'existing'
+ expected = 0 # the store just overrides the value if the key exists
+ # end if sop == 'existing'
elif sop == 'new':
for x in range(0, 10):
key = gen_key(rnd)
assert key is not None, \
'key must be != None'
- cmd += [ key ]
+ cmd += [key]
(size, error) = rnd.choice(SIZES)
if size > 25:
via_file = True
data = gen_data(size, rnd)
- if error == 0: # only add if we expect the put to be successful
+
+ if error == 0: # only add if we expect the put to be successful
if sop == 'new':
CONFIG_PUT.append(key)
CONFIG_EXISTING[key] = size
if via_file:
data_file = write_data_file(data, rnd)
- cmd += [ '-i', data_file ]
+ cmd += ['-i', data_file]
else:
- cmd += [ data ]
+ cmd += [data]
op_log.debug('size: {sz}, via: {v}'.format(
sz=size,
v='file: {f}'.format(f=data_file) if via_file == True else 'cli')
- )
+ )
run_cmd(cmd, expects=expected)
if via_file:
destroy_tmp_file(data_file)
elif op == 'del':
expected = 0
- cmd = [ 'del' ]
+ cmd = ['del']
key = None
if sop == 'existing':
continue
key = rnd.choice(CONFIG_PUT)
assert key in CONFIG_EXISTING, \
- 'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+ "key '{k_}' not in CONFIG_EXISTING".format(k_=key)
if sop == 'enoent':
for x in range(0, 10):
assert key is not None, \
'key must be != None'
- cmd += [ key ]
+ cmd += [key]
op_log.debug('key: {k}'.format(k=key))
run_cmd(cmd, expects=expected)
if sop == 'existing':
elif op == 'exists':
expected = 0
- cmd = [ 'exists' ]
+ cmd = ['exists']
key = None
if sop == 'existing':
continue
key = rnd.choice(CONFIG_PUT)
assert key in CONFIG_EXISTING, \
- 'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+ "key '{k_}' not in CONFIG_EXISTING".format(k_=key)
if sop == 'enoent':
for x in range(0, 10):
assert key is not None, \
'key must be != None'
- cmd += [ key ]
+ cmd += [key]
op_log.debug('key: {k}'.format(k=key))
run_cmd(cmd, expects=expected)
continue
elif op == 'get':
expected = 0
- cmd = [ 'get' ]
+ cmd = ['get']
key = None
if sop == 'existing':
continue
key = rnd.choice(CONFIG_PUT)
assert key in CONFIG_EXISTING, \
- 'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+ "key '{k_}' not in CONFIG_EXISTING".format(k_=key)
if sop == 'enoent':
for x in range(0, 10):
'key must be != None'
file_path = gen_tmp_file_path(rnd)
- cmd += [ key, '-o', file_path ]
+ cmd += [key, '-o', file_path]
op_log.debug('key: {k}'.format(k=key))
run_cmd(cmd, expects=expected)
if sop == 'existing':
except IOError as err:
if err.errno == errno.ENOENT:
assert CONFIG_EXISTING[key] == 0, \
- 'error opening \'{fp}\': {e}'.format(fp=file_path,e=err)
+ "error opening '{fp}': {e}".format(fp=file_path, e=err)
continue
else:
assert False, \
break
cnt += len(read_data)
assert cnt == CONFIG_EXISTING[key], \
- 'wrong size from store for key \'{k}\': {sz}, expected {es}'.format(
- k=key,sz=cnt,es=CONFIG_EXISTING[key])
+ "wrong size from store for key '{k}': {sz}, expected {es}".format(
+ k=key, sz=cnt, es=CONFIG_EXISTING[key])
destroy_tmp_file(file_path)
continue
else: