8 if sys.version_info[0] == 2:
11 elif sys.version_info[0] == 3:
16 class UnexpectedReturn(Exception):
17 def __init__(self, cmd, ret, expected, msg):
18 if isinstance(cmd, list):
19 self.cmd = ' '.join(cmd)
21 assert isinstance(cmd, string) or isinstance(cmd, unicode), \
22 'cmd needs to be either a list or a str'
24 self.cmd = str(self.cmd)
26 self.expected = int(expected)
30 return repr('{c}: expected return {e}, got {r} ({o})'.format(
31 c=self.cmd, e=self.expected, r=self.ret, o=self.msg))
35 if isinstance(cmd, list):
37 elif isinstance(cmd, string) or isinstance(cmd, unicode):
38 args = shlex.split(cmd)
40 assert False, 'cmd is not a string/unicode nor a list!'
42 print('call: {0}'.format(args))
43 proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
44 procout, procerr = proc.communicate(None)
46 return proc.returncode, procout, procerr
49 def expect(cmd, expected_ret):
51 (r, out, err) = call(cmd)
52 except ValueError as e:
54 'unable to run {c}: {err}'.format(c=repr(cmd), err=str(e))
57 raise UnexpectedReturn(repr(cmd), r, expected_ret, err)
59 return out.decode() if isinstance(out, bytes) else out
62 def get_quorum_status(timeout=300):
63 cmd = 'ceph quorum_status'
65 cmd += ' --connect-timeout {0}'.format(timeout)
73 quorum_status = get_quorum_status()
74 mon_names = [mon['name'] for mon in quorum_status['monmap']['mons']]
76 print('ping all monitors')
78 print('ping mon.{0}'.format(m))
79 out = expect('ceph ping mon.{0}'.format(m), 0)
80 reply = json.loads(out)
82 assert reply['mon_status']['name'] == m, \
83 'reply obtained from mon.{0}, expected mon.{1}'.format(
84 reply['mon_status']['name'], m)
86 print('test out-of-quorum reply')
88 print('testing mon.{0}'.format(m))
89 expect('ceph daemon mon.{0} quorum exit'.format(m), 0)
91 quorum_status = get_quorum_status()
92 assert m not in quorum_status['quorum_names'], \
93 'mon.{0} was not supposed to be in quorum ({1})'.format(
94 m, quorum_status['quorum_names'])
96 out = expect('ceph ping mon.{0}'.format(m), 0)
97 reply = json.loads(out)
98 mon_status = reply['mon_status']
100 assert mon_status['name'] == m, \
101 'reply obtained from mon.{0}, expected mon.{1}'.format(
102 mon_status['name'], m)
104 assert mon_status['state'] == 'electing', \
105 'mon.{0} is in state {1}, expected electing'.format(
106 m, mon_status['state'])
108 expect('ceph daemon mon.{0} quorum enter'.format(m), 0)
113 if __name__ == '__main__':