From 65b688e12d30d1ac49ac4c088dd2e5d7933aae7b Mon Sep 17 00:00:00 2001 From: Sugu Sougoumarane Date: Sat, 17 Jan 2015 21:29:44 -0800 Subject: [PATCH] test cleanup I've consolidated the action of bringing up (and down) a keyspace into keyspace_util. I think many tests can be simplified if we used this. For now, I've only rewritten vtgatev3_test to use it. --- test/keyspace_util.py | 80 ++++++++++++++++++++ test/utils.py | 7 ++ test/vtgatev3_test.py | 171 ++++++++++++++++++------------------------ 3 files changed, 158 insertions(+), 100 deletions(-) create mode 100644 test/keyspace_util.py diff --git a/test/keyspace_util.py b/test/keyspace_util.py new file mode 100644 index 0000000000..d934f2e874 --- /dev/null +++ b/test/keyspace_util.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2015, Google Inc. All rights reserved. +# Use of this source code is governed by a BSD-style license that can +# be found in the LICENSE file. +""" +This module allows you to bring up and tear down keyspaces. +""" + +import os + +import environment +import tablet +import utils + +class TestEnv(object): + def __init__(self): + self.tablet_map={} + + def launch(self, keyspace, shards=None, replica_count=0, rdonly_count=0, ddls=None): + self.tablets=[] + utils.run_vtctl(['CreateKeyspace', keyspace]) + if not shards or shards[0] == "0": + shards = ["0"] + else: + utils.run_vtctl(['SetKeyspaceShardingInfo', '-force', keyspace, 'keyspace_id', 'uint64']) + + for shard in shards: + procs = [] + procs.append(self._start_tablet(keyspace, shard, "master", None)) + for i in xrange(replica_count): + procs.append(self._start_tablet(keyspace, shard, "replica", i)) + for i in xrange(rdonly_count): + procs.append(self._start_tablet(keyspace, shard, "rdonly", i)) + utils.wait_procs(procs) + + utils.run_vtctl(['RebuildKeyspaceGraph', keyspace], auto_log=True) + + for t in self.tablets: + t.create_db('vt_' + keyspace) + t.start_vttablet( + wait_for_state=None, + extra_args=['-queryserver-config-schema-reload-time', '1'], + ) + for t in self.tablets: + t.wait_for_vttablet_state('SERVING') + for t in self.tablets: + if t.tablet_type == "master": + utils.run_vtctl(['ReparentShard', '-force', keyspace+'/'+t.shard, t.tablet_alias], auto_log=True) + # Force read-write even if there are no replicas. + utils.run_vtctl(['SetReadWrite', t.tablet_alias], auto_log=True) + + utils.run_vtctl(['RebuildKeyspaceGraph', keyspace], auto_log=True) + + for ddl in ddls: + fname = os.path.join(environment.tmproot, "ddl.sql") + with open(fname, "w") as f: + f.write(ddl) + utils.run_vtctl(['ApplySchemaKeyspace', '-simple', '-sql-file', fname, keyspace]) + + def teardown(self): + all_tablets = self.tablet_map.values() + tablet.kill_tablets(all_tablets) + teardown_procs = [t.teardown_mysql() for t in all_tablets] + utils.wait_procs(teardown_procs, raise_on_error=False) + for t in all_tablets: + t.remove_tree() + + def _start_tablet(self, keyspace, shard, tablet_type, index): + t = tablet.Tablet() + self.tablets.append(t) + if tablet_type == "master": + key = "%s.%s.%s" %(keyspace, shard, tablet_type) + else: + key = "%s.%s.%s.%s" %(keyspace, shard, tablet_type, index) + self.tablet_map[key] = t + proc = t.init_mysql() + t.init_tablet(tablet_type, keyspace=keyspace, shard=shard) + return proc diff --git a/test/utils.py b/test/utils.py index 82eb932f2c..454d45a892 100644 --- a/test/utils.py +++ b/test/utils.py @@ -196,6 +196,7 @@ def run(cmd, trap_output=False, raise_on_error=True, **kargs): stdout, stderr = proc.communicate() if proc.returncode: if raise_on_error: + pause("cmd fail: %s, pausing..." % (args)) raise TestError('cmd fail:', args, stdout, stderr) else: logging.debug('cmd fail: %s %s %s', str(args), stdout, stderr) @@ -320,6 +321,12 @@ def wait_for_vars(name, port, var=None): break timeout = wait_step('waiting for /debug/vars of %s' % name, timeout) +def apply_vschema(vschema): + fname = os.path.join(environment.tmproot, "vschema.json") + with open(fname, "w") as f: + f.write(vschema) + run_vtctl(['ApplyVSchema', "-vschema_file", fname]) + # vtgate helpers, assuming it always restarts on the same port def vtgate_start(vtport=None, cell='test_nj', retry_delay=1, retry_count=1, topo_impl=None, tablet_bson_encrypted=False, cache_ttl='1s', diff --git a/test/vtgatev3_test.py b/test/vtgatev3_test.py index 417d3de39b..102856e375 100755 --- a/test/vtgatev3_test.py +++ b/test/vtgatev3_test.py @@ -13,6 +13,7 @@ import unittest import urllib import environment +import keyspace_util import tablet import utils @@ -20,17 +21,13 @@ from vtdb import cursorv3 from vtdb import dbexceptions from vtdb import vtgatev3 -conn_class = vtgatev3 - shard_0_master = tablet.Tablet() shard_1_master = tablet.Tablet() lookup_master = tablet.Tablet() vtgate_server = None vtgate_port = None - -USER_KEYSACE = 'user_keyspace' -LOOKUP_KEYSPACE = 'lookup_keyspace' +keyspace_env = None create_vt_user = '''create table vt_user ( id bigint, @@ -83,7 +80,7 @@ primary key (music_id) schema = '''{ "Keyspaces": { - "user_keyspace": { + "user": { "Sharded": true, "Vindexes": { "user_index": { @@ -175,7 +172,7 @@ schema = '''{ "vt_music_extra": "vt_music_extra" } }, - "lookup_keyspace": { + "lookup": { "Sharded": false, "Tables": { "vt_user_idx": "", @@ -191,92 +188,66 @@ json.loads(schema) def setUpModule(): + global keyspace_env + global shard_0_master + global shard_1_master + global lookup_master + global vtgate_server + global vtgate_port logging.debug("in setUpModule") + try: environment.topo_server().setup() + logging.debug("Setting up tablets") + keyspace_env = keyspace_util.TestEnv() + keyspace_env.launch( + "user", + shards=["-80", "80-"], + ddls=[ + create_vt_user, + create_vt_user2, + create_vt_user_extra, + create_vt_music, + create_vt_music_extra, + ], + ) + keyspace_env.launch( + "lookup", + ddls=[ + create_vt_user_idx, + create_music_user_map, + create_name_user2_map, + ], + ) + shard_0_master = keyspace_env.tablet_map["user.-80.master"] + shard_1_master = keyspace_env.tablet_map["user.80-.master"] + lookup_master = keyspace_env.tablet_map["lookup.0.master"] - # start mysql instance external to the test - setup_procs = [shard_0_master.init_mysql(), - shard_1_master.init_mysql(), - lookup_master.init_mysql(), - ] - utils.wait_procs(setup_procs) - setup_tablets() + utils.apply_vschema(schema) + vtgate_server, vtgate_port = utils.vtgate_start() except: tearDownModule() raise def tearDownModule(): - global vtgate_server logging.debug("in tearDownModule") if utils.options.skip_teardown: return logging.debug("Tearing down the servers and setup") utils.vtgate_kill(vtgate_server) - tablet.kill_tablets([shard_0_master, shard_1_master, lookup_master]) - teardown_procs = [shard_0_master.teardown_mysql(), - shard_1_master.teardown_mysql(), - lookup_master.teardown_mysql(), - ] - utils.wait_procs(teardown_procs, raise_on_error=False) + keyspace_env.teardown() environment.topo_server().teardown() utils.kill_sub_processes() utils.remove_tmp_files() - shard_0_master.remove_tree() - shard_1_master.remove_tree() - lookup_master.remove_tree() - -def setup_tablets(): - global vtgate_server - global vtgate_port - - # Start up a master mysql and vttablet - logging.debug("Setting up tablets") - utils.run_vtctl(['CreateKeyspace', USER_KEYSACE]) - utils.run_vtctl(['CreateKeyspace', LOOKUP_KEYSPACE]) - utils.run_vtctl(['SetKeyspaceShardingInfo', '-force', USER_KEYSACE, - 'keyspace_id', 'uint64']) - shard_0_master.init_tablet('master', keyspace=USER_KEYSACE, shard='-80') - shard_1_master.init_tablet('master', keyspace=USER_KEYSACE, shard='80-') - lookup_master.init_tablet('master', keyspace=LOOKUP_KEYSPACE, shard='0') - - for t in [shard_0_master, shard_1_master]: - t.create_db('vt_user_keyspace') - t.mquery('vt_user_keyspace', create_vt_user) - t.mquery('vt_user_keyspace', create_vt_user2) - t.mquery('vt_user_keyspace', create_vt_user_extra) - t.mquery('vt_user_keyspace', create_vt_music) - t.mquery('vt_user_keyspace', create_vt_music_extra) - t.start_vttablet(wait_for_state='SERVING') - utils.run_vtctl(['SetReadWrite', t.tablet_alias]) - lookup_master.create_db('vt_lookup_keyspace') - lookup_master.mquery('vt_lookup_keyspace', create_vt_user_idx) - lookup_master.mquery('vt_lookup_keyspace', create_music_user_map) - lookup_master.mquery('vt_lookup_keyspace', create_name_user2_map) - lookup_master.start_vttablet(wait_for_state='SERVING') - utils.run_vtctl(['SetReadWrite', lookup_master.tablet_alias]) - - utils.run_vtctl(['RebuildKeyspaceGraph', USER_KEYSACE], auto_log=True) - utils.run_vtctl(['RebuildKeyspaceGraph', LOOKUP_KEYSPACE], auto_log=True) - - fname = os.path.join(environment.tmproot, "vschema.json") - with open(fname, "w") as f: - f.write(schema) - utils.run_vtctl(['ApplyVSchema', "-vschema_file", fname]) - vtgate_server, vtgate_port = utils.vtgate_start() - def get_connection(user=None, password=None): global vtgate_port timeout = 10.0 - conn = None - vtgate_addrs = {"_vt": ["localhost:%s" % (vtgate_port),]} - conn = conn_class.connect(vtgate_addrs, timeout, + return vtgatev3.connect("localhost:%s" % (vtgate_port), timeout, user=user, password=password) - return conn class TestVTGateFunctions(unittest.TestCase): @@ -319,11 +290,11 @@ class TestVTGateFunctions(unittest.TestCase): vtgate_conn.commit() # Verify values in db - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_0_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((1L, 'test 1'), (2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_1_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((4L, 'test 4'), (6L, 'test 6'), (7L, 'test 7'))) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from vt_user_idx") + result = lookup_master.mquery("vt_lookup", "select * from vt_user_idx") self.assertEqual(result, ((1L,), (2L,), (3L,), (4L,), (6L,), (7L,))) # Test IN clause @@ -373,9 +344,9 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_0_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((1L, 'test one'), (2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_1_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((4L, 'test four'), (6L, 'test 6'), (7L, 'test 7'))) # Test deletes @@ -391,11 +362,11 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_0_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user") + result = shard_1_master.mquery("vt_user", "select * from vt_user") self.assertEqual(result, ((6L, 'test 6'), (7L, 'test 7'))) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from vt_user_idx") + result = lookup_master.mquery("vt_lookup", "select * from vt_user_idx") self.assertEqual(result, ((2L,), (3L,), (6L,), (7L,))) def test_user2(self): @@ -418,11 +389,11 @@ class TestVTGateFunctions(unittest.TestCase): 'master') self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user2") + result = shard_0_master.mquery("vt_user", "select * from vt_user2") self.assertEqual(result, ((1L, 'name1'), (2L, 'name2'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user2") + result = shard_1_master.mquery("vt_user", "select * from vt_user2") self.assertEqual(result, ((7L, 'name1'),)) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from name_user2_map") + result = lookup_master.mquery("vt_lookup", "select * from name_user2_map") self.assertEqual(result, (('name1', 1L), ('name1', 7L), ('name2', 2L))) # Test select by id @@ -455,11 +426,11 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user2") + result = shard_0_master.mquery("vt_user", "select * from vt_user2") self.assertEqual(result, ()) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user2") + result = shard_1_master.mquery("vt_user", "select * from vt_user2") self.assertEqual(result, ((7L, 'name1'),)) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from name_user2_map") + result = lookup_master.mquery("vt_lookup", "select * from name_user2_map") self.assertEqual(result, (('name1', 7L),)) def test_user_extra(self): @@ -479,9 +450,9 @@ class TestVTGateFunctions(unittest.TestCase): i = x+1 result = vtgate_conn._execute("select * from vt_user_extra where user_id = :user_id", {'user_id': i}, 'master') self.assertEqual(result, ([(i, "test %s" % i)], 1L, 0, [('user_id', 8L), ('email', 253L)])) - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ((1L, 'test 1'), (2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_1_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ((4L, 'test 4'),)) vtgate_conn.begin() @@ -496,9 +467,9 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ((1L, 'test one'), (2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_1_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ((4L, 'test four'),)) vtgate_conn.begin() @@ -513,9 +484,9 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ((2L, 'test 2'), (3L, 'test 3'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_user_extra") + result = shard_1_master.mquery("vt_user", "select * from vt_user_extra") self.assertEqual(result, ()) def test_music(self): @@ -552,11 +523,11 @@ class TestVTGateFunctions(unittest.TestCase): 'master') self.assertEqual(result, ([], 1L, 8L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_0_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((1L, 1L, 'test 1'), (2L, 2L, 'test 2'), (3L, 3L, 'test 3'), (5L, 6L, 'test 6'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_1_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((4L, 4L, 'test 4'), (6L, 7L, 'test 7'), (6L, 8L, 'test 8'))) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from music_user_map") + result = lookup_master.mquery("vt_lookup", "select * from music_user_map") self.assertEqual(result, ((1L, 1L), (2L, 2L), (3L, 3L), (4L, 4L), (6L, 5L), (7L, 6L), (8L, 6L))) vtgate_conn.begin() @@ -571,9 +542,9 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 1L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_0_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((1L, 1L, 'test 1'), (2L, 2L, 'test 2'), (3L, 3L, 'test 3'), (5L, 6L, 'test six'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_1_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((4L, 4L, 'test 4'), (6L, 7L, 'test seven'), (6L, 8L, 'test 8'))) vtgate_conn.begin() @@ -588,11 +559,11 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 2L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_0_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((1L, 1L, 'test 1'), (2L, 2L, 'test 2'), (5L, 6L, 'test six'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_music") + result = shard_1_master.mquery("vt_user", "select * from vt_music") self.assertEqual(result, ((4L, 4L, 'test 4'),)) - result = lookup_master.mquery("vt_lookup_keyspace", "select * from music_user_map") + result = lookup_master.mquery("vt_lookup", "select * from music_user_map") self.assertEqual(result, ((1L, 1L), (2L, 2L), (4L, 4L), (6L, 5L))) def test_music_extra(self): @@ -612,9 +583,9 @@ class TestVTGateFunctions(unittest.TestCase): vtgate_conn.commit() result = vtgate_conn._execute("select * from vt_music_extra where music_id = :music_id", {'music_id': 6}, 'master') self.assertEqual(result, ([(6L, 5L, "test 6")], 1, 0, [('music_id', 8L), ('user_id', 8L), ('artist', 253L)])) - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_music_extra") self.assertEqual(result, ((1L, 1L, 'test 1'), (6L, 5L, 'test 6'))) - result = shard_1_master.mquery("vt_user_keyspace", "select * from vt_music_extra") + result = shard_1_master.mquery("vt_user", "select * from vt_music_extra") self.assertEqual(result, ()) vtgate_conn.begin() @@ -629,7 +600,7 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 0L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_music_extra") self.assertEqual(result, ((1L, 1L, 'test 1'), (6L, 5L, 'test six'))) vtgate_conn.begin() @@ -644,7 +615,7 @@ class TestVTGateFunctions(unittest.TestCase): "master") self.assertEqual(result, ([], 0L, 0L, [])) vtgate_conn.commit() - result = shard_0_master.mquery("vt_user_keyspace", "select * from vt_music_extra") + result = shard_0_master.mquery("vt_user", "select * from vt_music_extra") self.assertEqual(result, ((1L, 1L, 'test 1'),)) def test_insert_value_required(self):