Added swift version to recon cli

Show swift version and check if the same on hosts by using
`swift-recon --swift-version`.

Ex:
$ swift-recon --swift-versions

Versions matched (2.7.1.dev144), 0 error[s] while checking hosts.

or if differs

Versions not matched (2.7.1.dev144, 2.7.1.dev145),
0 error[s] while checking hosts.

Change-Id: I3c2e569f0c44168333251bb58bab4b5582e15a45
This commit is contained in:
Peter Lisák 2016-12-20 16:27:36 +01:00 committed by John Dickinson
parent b808c806b4
commit 206f674014
2 changed files with 100 additions and 1 deletions

View File

@ -906,6 +906,41 @@ class SwiftRecon(object):
matches, len(hosts), errors))
print("=" * 79)
def version_check(self, hosts):
"""
Check OS Swift version of hosts. Inform if differs.
:param hosts: set of hosts to check. in the format of:
set([('127.0.0.1', 6020), ('127.0.0.2', 6030)])
"""
versions = set()
errors = 0
print("[%s] Checking versions" % self._ptime())
recon = Scout("version", self.verbose, self.suppress_errors,
self.timeout)
for url, response, status, ts_start, ts_end in self.pool.imap(
recon.scout, hosts):
if status != 200:
errors = errors + 1
continue
versions.add(response['version'])
if self.verbose:
print("-> %s installed version %s" % (
url, response['version']))
if not len(versions):
print("No hosts returned valid data.")
elif len(versions) == 1:
print("Versions matched (%s), "
"%s error[s] while checking hosts." % (
versions.pop(), errors))
else:
print("Versions not matched (%s), "
"%s error[s] while checking hosts." % (
", ".join(sorted(versions)), errors))
print("=" * 79)
def _get_ring_names(self, policy=None):
"""
Retrieve name of ring files.
@ -982,6 +1017,8 @@ class SwiftRecon(object):
help="Check time synchronization")
args.add_option('--jitter', type="float", default=0.0,
help="Maximal allowed time jitter")
args.add_option('--swift-versions', action="store_true",
help="Check swift versions")
args.add_option('--top', type='int', metavar='COUNT', default=0,
help='Also show the top COUNT entries in rank order.')
args.add_option('--lowest', type='int', metavar='COUNT', default=0,
@ -990,7 +1027,7 @@ class SwiftRecon(object):
args.add_option('--all', action="store_true",
help="Perform all checks. Equal to \t\t\t-arudlqT "
"--md5 --sockstat --auditor --updater --expirer "
"--driveaudit --validate-servers")
"--driveaudit --validate-servers --swift-versons")
args.add_option('--region', type="int",
help="Only query servers in specified region")
args.add_option('--zone', '-z', type="int",
@ -1063,6 +1100,7 @@ class SwiftRecon(object):
self.server_type_check(hosts)
self.driveaudit_check(hosts)
self.time_check(hosts, options.jitter)
self.version_check(hosts)
else:
if options.async:
if self.server_type == 'object':
@ -1112,6 +1150,8 @@ class SwiftRecon(object):
self.driveaudit_check(hosts)
if options.time:
self.time_check(hosts, options.jitter)
if options.swift_versions:
self.version_check(hosts)
def main():

View File

@ -1092,6 +1092,37 @@ class TestReconCommands(unittest.TestCase):
# that is returned from the recon middleware, thus can't rely on it
mock_print.assert_has_calls(default_calls, any_order=True)
@mock.patch('six.moves.builtins.print')
def test_version_check(self, mock_print):
version = "2.7.1.dev144"
def dummy_request(*args, **kwargs):
return [
('http://127.0.0.1:6010/recon/version',
{'version': version},
200,
0,
0),
('http://127.0.0.1:6020/recon/version',
{'version': version},
200,
0,
0),
]
cli = recon.SwiftRecon()
cli.pool.imap = dummy_request
default_calls = [
mock.call("Versions matched (%s), "
"0 error[s] while checking hosts." % version)
]
cli.version_check([('127.0.0.1', 6010), ('127.0.0.1', 6020)])
# We need any_order=True because the order of calls depends on the dict
# that is returned from the recon middleware, thus can't rely on it
mock_print.assert_has_calls(default_calls, any_order=True)
@mock.patch('six.moves.builtins.print')
@mock.patch('time.time')
def test_time_check_jitter_mismatch(self, mock_now, mock_print):
@ -1126,7 +1157,35 @@ class TestReconCommands(unittest.TestCase):
]
cli.time_check([('127.0.0.1', 6010), ('127.0.0.1', 6020)], 3)
# We need any_order=True because the order of calls depends on the dict
# that is returned from the recon middleware, thus can't rely on it
mock_print.assert_has_calls(default_calls, any_order=True)
@mock.patch('six.moves.builtins.print')
def test_version_check_differs(self, mock_print):
def dummy_request(*args, **kwargs):
return [
('http://127.0.0.1:6010/recon/version',
{'version': "2.7.1.dev144"},
200,
0,
0),
('http://127.0.0.1:6020/recon/version',
{'version': "2.7.1.dev145"},
200,
0,
0),
]
cli = recon.SwiftRecon()
cli.pool.imap = dummy_request
default_calls = [
mock.call("Versions not matched (2.7.1.dev144, 2.7.1.dev145), "
"0 error[s] while checking hosts.")
]
cli.version_check([('127.0.0.1', 6010), ('127.0.0.1', 6020)])
# We need any_order=True because the order of calls depends on the dict
# that is returned from the recon middleware, thus can't rely on it
mock_print.assert_has_calls(default_calls, any_order=True)