blob: f778cea422e807f5681df4b05fc3ed85c7ecd0d9 [file] [log] [blame]
import pytest
import logging
from dtest import Tester
from tools.assertions import assert_all
since = pytest.mark.since
logger = logging.getLogger(__name__)
@pytest.mark.upgrade_test
class TestCompatibilityFlag(Tester):
"""
Test 30 protocol compatibility flag
@jira CASSANDRA-13004
"""
def _compatibility_flag_off_with_30_node_test(self, from_version):
"""
Test compatibility with 30 protocol version: if the flag is unset, schema agreement can not be reached
"""
cluster = self.cluster
cluster.populate(2)
node1, node2 = cluster.nodelist()
cluster.set_install_dir(version=from_version)
self.fixture_dtest_setup.reinitialize_cluster_for_different_version()
cluster.start()
node1.drain()
node1.watch_log_for("DRAINED")
node1.stop(wait_other_notice=False)
logger.debug("Upgrading to current version")
self.set_node_to_current_version(node1)
node1.start(wait_for_binary_proto=True)
node1.watch_log_for("Not pulling schema because versions match or shouldPullSchemaFrom returned false", filename='debug.log')
node2.watch_log_for("Not pulling schema because versions match or shouldPullSchemaFrom returned false", filename='debug.log')
def _compatibility_flag_on_with_30_test(self, from_version):
"""
Test compatibility with 30 protocol version: if the flag is set, schema agreement can be reached
"""
cluster = self.cluster
cluster.populate(2)
node1, node2 = cluster.nodelist()
cluster.set_install_dir(version=from_version)
self.fixture_dtest_setup.reinitialize_cluster_for_different_version()
cluster.start()
node1.drain()
node1.watch_log_for("DRAINED")
node1.stop(wait_other_notice=False)
logger.debug("Upgrading to current version")
self.set_node_to_current_version(node1)
node1.start(jvm_args=["-Dcassandra.force_3_0_protocol_version=true"], wait_for_binary_proto=True)
session = self.patient_cql_connection(node1)
self._run_test(session)
def test__compatibility_flag_on_3014(self):
"""
Test compatibility between post-13004 nodes, one of which is in compatibility mode
"""
cluster = self.cluster
cluster.populate(2)
node1, node2 = cluster.nodelist()
node1.start(wait_for_binary_proto=True)
node2.start(jvm_args=["-Dcassandra.force_3_0_protocol_version=true"], wait_for_binary_proto=True)
session = self.patient_cql_connection(node1)
self._run_test(session)
def test__compatibility_flag_off_3014(self):
"""
Test compatibility between post-13004 nodes
"""
cluster = self.cluster
cluster.populate(2)
node1, node2 = cluster.nodelist()
node1.start(wait_for_binary_proto=True)
node2.start(wait_for_binary_proto=True)
session = self.patient_cql_connection(node1)
self._run_test(session)
def _run_test(self, session):
# Make sure the system_auth table will get replicated to the node that we're going to replace
session.execute("CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '2'} ;")
session.execute("CREATE TABLE test.test (a text PRIMARY KEY, b text, c text);")
for i in range(1, 6):
session.execute("INSERT INTO test.test (a, b, c) VALUES ('{}', '{}', '{}');".format(i, i + 1, i + 2))
assert_all(session,
"SELECT * FROM test.test",
[[str(i), str(i + 1), str(i + 2)] for i in range(1, 6)], ignore_order=True)
assert_all(session,
"SELECT a,c FROM test.test",
[[str(i), str(i + 2)] for i in range(1, 6)], ignore_order=True)
@since('3.0.14', max_version='3.0.x')
class CompatibilityFlag30XTest(TestCompatibilityFlag):
def test_compatibility_flag_off_with_30_node(self):
self._compatibility_flag_off_with_30_node_test('3.0.12')
def test_compatibility_flag_on_with_3_0(self):
self._compatibility_flag_on_with_30_test('3.0.12')
def test_compatibility_flag_on_3014(self):
self._compatibility_flag_on_3014_test()
def test_compatibility_flag_off_3014(self):
self._compatibility_flag_off_3014_test()
@since('3.11', max_version='4')
class CompatibilityFlag3XTest(TestCompatibilityFlag):
def test_compatibility_flag_off_with_30_node(self):
self._compatibility_flag_off_with_30_node_test('3.10')
def test_compatibility_flag_on_with_3_0(self):
self._compatibility_flag_on_with_30_test('3.10')
def test_compatibility_flag_on_3014(self):
self._compatibility_flag_on_3014_test()
def test_compatibility_flag_off_3014(self):
self._compatibility_flag_off_3014_test()