Ver Fonte

[TEST] Pick random version from backwards directory

The upgrade tests required to specify the lower and the upper version
that it should run against. This commit adds support for random picks
if either the lower or the upper or both are not specified.
Simon Willnauer há 11 anos atrás
pai
commit
dc696e6fc8
1 ficheiros alterados com 43 adições e 6 exclusões
  1. 43 6
      dev-tools/upgrade-tests.py

+ 43 - 6
dev-tools/upgrade-tests.py

@@ -23,6 +23,7 @@ import time
 import argparse
 import logging
 import sys
+import re
 
 from datetime import datetime
 try:
@@ -159,6 +160,41 @@ def run_basic_asserts(es, index_name, type, num_docs):
                     ]
                   }))
 
+
+# picks a random version or and entire random version tuple from the directory
+# to run the backwards tests against.
+def pick_random_upgrade_version(directory, lower_version=None, upper_version=None):
+  if lower_version and upper_version:
+    return lower_version, upper_version
+  assert os.path.isdir(directory), 'No such directory %s' % directory
+  versions = []
+  for version in map(lambda x : x[len('elasticsearch-'):], filter(lambda x : re.match(r'^elasticsearch-\d+[.]\d+[.]\d+$', x), os.listdir(directory))):
+    if not version in BLACK_LIST:
+      versions.append(build_tuple(version))
+  versions.sort()
+
+  if lower_version: # lower version is set - picking a higher one
+    versions = filter(lambda x : x > build_tuple(lower_version), versions)
+    assert len(versions) >= 1, 'Expected at least 1 higher version than %s version in %s ' % (lower_version, directory)
+    random.shuffle(versions)
+    return lower_version, build_version(versions[0])
+  if upper_version:
+    versions = filter(lambda x : x < build_tuple(upper_version), versions)
+    assert len(versions) >= 1, 'Expected at least 1 lower version than %s version in %s ' % (upper_version, directory)
+    random.shuffle(versions)
+    return build_version(versions[0]), upper_version
+  assert len(versions) >= 2, 'Expected at least 2 different version in %s but found %s' % (directory, len(versions))
+  random.shuffle(versions)
+  versions = versions[0:2]
+  versions.sort()
+  return build_version(versions[0]), build_version(versions[1])
+
+def build_version(version_tuple):
+  return '.'.join([str(x) for x in version_tuple])
+
+def build_tuple(version_string):
+  return [int(x) for x in version_string.split('.')]
+
 # returns a new elasticsearch client and ensures the all nodes have joined the cluster
 # this method waits at most 30 seconds for all nodes to join
 def new_es_instance(num_nodes, http_port, timeout = 30):
@@ -187,9 +223,8 @@ def assert_versions(bwc_version, current_version, node_dir):
     dir = os.path.join(node_dir, 'elasticsearch-%s' % current_version)
     assert os.path.isdir(dir), 'Expected elasticsearch-%s install directory does not exists: %s' % (version, dir)
 
-def full_cluster_restart(node_dir, current_version, bwc_version, seed, tcp_port, http_port):
+def full_cluster_restart(node_dir, current_version, bwc_version, tcp_port, http_port):
   assert_versions(bwc_version, current_version, node_dir)
-  random.seed(seed)
   num_nodes = random.randint(2, 3)
   nodes = []
   data_dir = tempfile.mkdtemp()
@@ -240,7 +275,7 @@ def full_cluster_restart(node_dir, current_version, bwc_version, seed, tcp_port,
     # by running the indexing again we try to catch possible mapping problems after the upgrade
     index_documents(es, 'test_index', 'test_type', num_docs)
     run_basic_asserts(es, 'test_index', 'test_type', num_docs)
-    logging.info("[SUCCESSS] - all test passed upgrading from version [%s] to version [%s]" % (bwc_version, current_version))
+    logging.info("[SUCCESS] - all test passed upgrading from version [%s] to version [%s]" % (bwc_version, current_version))
   finally:
     for node in nodes:
       node.terminate()
@@ -254,9 +289,9 @@ if __name__ == '__main__':
   logging.getLogger('urllib3').setLevel(logging.WARN)
   parser = argparse.ArgumentParser(description='Tests Full Cluster Restarts across major version')
   parser.add_argument('--version.backwards', '-b', dest='backwards_version', metavar='V',
-                      help='The elasticsearch version to upgrade from', required=True)
+                      help='The elasticsearch version to upgrade from')
   parser.add_argument('--version.current', '-c', dest='current_version', metavar='V',
-                      help='The elasticsearch version to upgrade to', required=True)
+                      help='The elasticsearch version to upgrade to')
   parser.add_argument('--seed', '-s', dest='seed', metavar='N', type=int,
                       help='The random seed to use')
   parser.add_argument('--backwards.dir', '-d', dest='bwc_directory', default='backwards', metavar='dir',
@@ -274,10 +309,12 @@ if __name__ == '__main__':
   current_version = args.current_version
   bwc_version = args.backwards_version
   seed = args.seed
+  random.seed(seed)
+  bwc_version, current_version = pick_random_upgrade_version(node_dir, bwc_version, current_version)
   tcp_port = args.tcp_port
   http_port = args.http_port
   try:
-    full_cluster_restart(node_dir, current_version, bwc_version, seed, tcp_port, http_port)
+    full_cluster_restart(node_dir, current_version, bwc_version, tcp_port, http_port)
   except:
     logging.warn('REPRODUCE WITH: \n\t`python %s --version.backwards %s --version.current %s --seed %s --tcp.port %s --http.port %s`'
                    % (sys.argv[0], bwc_version, current_version, seed, tcp_port, http_port))