Skip to content

Commit d292458

Browse files
authored
Implement custom cluster metadata decorator with support of global cluster_size parametrization (#8464)
1 parent 90a8695 commit d292458

File tree

13 files changed

+198
-29
lines changed

13 files changed

+198
-29
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one or more
2+
# contributor license agreements. See the NOTICE file distributed with
3+
# this work for additional information regarding copyright ownership.
4+
# The ASF licenses this file to You under the Apache License, Version 2.0
5+
# (the "License"); you may not use this file except in compliance with
6+
# the License. You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
"""
17+
Checks custom cluster metadata decorator.
18+
"""
19+
20+
from unittest.mock import Mock
21+
22+
import pytest
23+
from ducktape.cluster.cluster_spec import ClusterSpec, LINUX
24+
from ducktape.mark.mark_expander import MarkedFunctionExpander
25+
26+
from ignitetest.utils._mark import cluster, ParametrizableClusterMetadata, CLUSTER_SIZE_KEYWORD, CLUSTER_SPEC_KEYWORD
27+
28+
29+
def expand_function(*, func, sess_ctx):
30+
"""
31+
Inject parameters into function and generate context list.
32+
"""
33+
assert hasattr(func, "marks")
34+
assert next(filter(lambda x: isinstance(x, ParametrizableClusterMetadata), func.marks), None)
35+
36+
return MarkedFunctionExpander(session_context=sess_ctx, function=func).expand()
37+
38+
39+
def mock_session_ctx(*, cluster_size=None):
40+
"""
41+
Create mock of session context.
42+
"""
43+
sess_ctx = Mock()
44+
sess_ctx.globals = {"cluster_size": cluster_size} if cluster_size is not None else {}
45+
46+
return sess_ctx
47+
48+
49+
# pylint: disable=no-self-use
50+
class CheckClusterParametrization:
51+
"""
52+
Checks custom @cluster parametrization.
53+
"""
54+
def check_num_nodes(self):
55+
""""
56+
Check num_nodes.
57+
"""
58+
@cluster(num_nodes=10)
59+
def function():
60+
return 0
61+
62+
test_context_list = expand_function(func=function, sess_ctx=mock_session_ctx())
63+
assert len(test_context_list) == 1
64+
assert test_context_list[0].cluster_use_metadata[CLUSTER_SIZE_KEYWORD] == 10
65+
66+
test_context_list = expand_function(func=function,
67+
sess_ctx=mock_session_ctx(cluster_size="100"))
68+
assert len(test_context_list) == 1
69+
assert test_context_list[0].cluster_use_metadata[CLUSTER_SIZE_KEYWORD] == 100
70+
71+
def check_cluster_spec(self):
72+
""""
73+
Check cluster_spec.
74+
"""
75+
@cluster(cluster_spec=ClusterSpec.simple_linux(10))
76+
def function():
77+
return 0
78+
79+
test_context_list = expand_function(func=function, sess_ctx=mock_session_ctx())
80+
assert len(test_context_list) == 1
81+
inserted_spec = test_context_list[0].cluster_use_metadata[CLUSTER_SPEC_KEYWORD]
82+
83+
assert inserted_spec.size() == 10
84+
for node in inserted_spec.nodes:
85+
assert node.operating_system == LINUX
86+
87+
test_context_list = expand_function(func=function,
88+
sess_ctx=mock_session_ctx(cluster_size="100"))
89+
assert len(test_context_list) == 1
90+
inserted_spec = test_context_list[0].cluster_use_metadata[CLUSTER_SPEC_KEYWORD]
91+
92+
assert inserted_spec.size() == 100
93+
for node in inserted_spec.nodes:
94+
assert node.operating_system == LINUX
95+
96+
def check_invalid_global_param(self):
97+
"""Check handle of invalid params."""
98+
@cluster(num_nodes=10)
99+
def function():
100+
return 0
101+
102+
invalid_vals = ["abc", "-10", "1.5", "0", 1.6, -7, 0]
103+
104+
for val in invalid_vals:
105+
with pytest.raises(Exception):
106+
expand_function(func=function, sess_ctx=mock_session_ctx(cluster_size=val))

modules/ducktests/tests/checks/utils/check_marks.py renamed to modules/ducktests/tests/checks/utils/check_parametrized.py

File renamed without changes.

modules/ducktests/tests/ignitetest/tests/add_node_rebalance_test.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717
Module contains node rebalance tests.
1818
"""
1919

20-
from ducktape.mark.resource import cluster
21-
2220
from ignitetest.services.ignite import IgniteService
2321
from ignitetest.services.ignite_app import IgniteApplicationService
2422
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
2523
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
26-
from ignitetest.utils import ignite_versions
24+
from ignitetest.utils import ignite_versions, cluster
2725
from ignitetest.utils.ignite_test import IgniteTest
2826
from ignitetest.utils.version import DEV_BRANCH, IgniteVersion, LATEST
2927

modules/ducktests/tests/ignitetest/tests/cellular_affinity_test.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,14 @@
1919
from enum import IntEnum
2020

2121
from ducktape.mark import matrix
22-
from ducktape.mark.resource import cluster
2322
from jinja2 import Template
2423

2524
from ignitetest.services.ignite import IgniteService
2625
from ignitetest.services.ignite_app import IgniteApplicationService
2726
from ignitetest.services.utils.control_utility import ControlUtility
2827
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration, IgniteClientConfiguration
2928
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
30-
from ignitetest.utils import ignite_versions, version_if
29+
from ignitetest.utils import ignite_versions, version_if, cluster
3130
from ignitetest.utils.ignite_test import IgniteTest
3231
from ignitetest.utils.version import DEV_BRANCH, IgniteVersion, LATEST_2_8
3332

modules/ducktests/tests/ignitetest/tests/client_test.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,13 @@
1919
import time
2020

2121
from ducktape.mark import parametrize
22-
from ducktape.mark.resource import cluster
2322

2423
from ignitetest.services.ignite import IgniteService
2524
from ignitetest.services.ignite_app import IgniteApplicationService
2625
from ignitetest.services.utils.control_utility import ControlUtility
2726
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
2827
from ignitetest.services.utils.ignite_configuration.cache import CacheConfiguration
29-
from ignitetest.utils import ignite_versions
28+
from ignitetest.utils import ignite_versions, cluster
3029
from ignitetest.utils.ignite_test import IgniteTest
3130
from ignitetest.utils.version import DEV_BRANCH, V_2_8_1, IgniteVersion
3231

@@ -49,8 +48,8 @@ class ClientTest(IgniteTest):
4948
JAVA_CLIENT_CLASS_NAME = "org.apache.ignite.internal.ducktest.tests.client_test.IgniteCachePutClient"
5049

5150
# pylint: disable=R0913
52-
@ignite_versions(str(V_2_8_1), str(DEV_BRANCH))
5351
@cluster(num_nodes=7)
52+
@ignite_versions(str(V_2_8_1), str(DEV_BRANCH))
5453
@parametrize(num_nodes=7, static_clients=2, temp_client=3, iteration_count=3, client_work_time=30)
5554
def test_ignite_start_stop_nodes(self, ignite_version, num_nodes, static_clients, temp_client, iteration_count,
5655
client_work_time):
@@ -62,8 +61,8 @@ def test_ignite_start_stop_nodes(self, ignite_version, num_nodes, static_clients
6261
temp_client, iteration_count, client_work_time)
6362

6463
# pylint: disable=R0913
65-
@ignite_versions(str(V_2_8_1), str(DEV_BRANCH))
6664
@cluster(num_nodes=7)
65+
@ignite_versions(str(V_2_8_1), str(DEV_BRANCH))
6766
@parametrize(num_nodes=7, static_clients=2, temp_client=3, iteration_count=3, client_work_time=30)
6867
def test_ignite_kill_start_nodes(self, ignite_version, num_nodes, static_clients, temp_client, iteration_count,
6968
client_work_time):

modules/ducktests/tests/ignitetest/tests/control_utility/baseline_test.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@
1717
This module contains manipulating baseline test through control utility.
1818
"""
1919

20-
from ducktape.mark.resource import cluster
2120
from ducktape.utils.util import wait_until
2221

2322
from ignitetest.services.ignite import IgniteService
2423
from ignitetest.services.utils.control_utility import ControlUtility, ControlUtilityError
2524
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration, DataStorageConfiguration
2625
from ignitetest.services.utils.ignite_configuration.data_storage import DataRegionConfiguration
2726
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
28-
from ignitetest.utils import version_if, ignite_versions
27+
from ignitetest.utils import version_if, ignite_versions, cluster
2928
from ignitetest.utils.ignite_test import IgniteTest
3029
from ignitetest.utils.version import DEV_BRANCH, LATEST_2_8, IgniteVersion, V_2_8_0
3130

modules/ducktests/tests/ignitetest/tests/control_utility/tx_test.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,16 @@
1717
"""
1818
This module contains transactions manipulation test through control utility.
1919
"""
20-
import random
2120

22-
from ducktape.mark.resource import cluster
21+
import random
2322

2423
from ignitetest.services.ignite import IgniteService
2524
from ignitetest.services.ignite_app import IgniteApplicationService
2625
from ignitetest.services.utils.control_utility import ControlUtility
2726
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
2827
from ignitetest.services.utils.ignite_configuration.cache import CacheConfiguration
2928
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
30-
from ignitetest.utils import ignite_versions
29+
from ignitetest.utils import ignite_versions, cluster
3130
from ignitetest.utils.ignite_test import IgniteTest
3231
from ignitetest.utils.version import DEV_BRANCH, LATEST_2_8, IgniteVersion
3332

modules/ducktests/tests/ignitetest/tests/discovery_test.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
from typing import NamedTuple
2626

2727
from ducktape.mark import matrix
28-
from ducktape.mark.resource import cluster
2928

3029
from ignitetest.services.ignite import IgniteAwareService, IgniteService, get_event_time, node_failed_event_pattern
3130
from ignitetest.services.ignite_app import IgniteApplicationService
@@ -35,7 +34,7 @@
3534
TcpDiscoverySpi
3635
from ignitetest.services.utils.time_utils import epoch_mills
3736
from ignitetest.services.zk.zookeeper import ZookeeperService, ZookeeperSettings
38-
from ignitetest.utils import ignite_versions, version_if
37+
from ignitetest.utils import ignite_versions, version_if, cluster
3938
from ignitetest.utils.ignite_test import IgniteTest
4039
from ignitetest.utils.version import DEV_BRANCH, LATEST_2_8, V_2_8_0, IgniteVersion
4140

modules/ducktests/tests/ignitetest/tests/pme_free_switch_test.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,14 @@
2020
import time
2121

2222
from ducktape.mark import matrix
23-
from ducktape.mark.resource import cluster
2423

2524
from ignitetest.services.ignite import IgniteService
2625
from ignitetest.services.ignite_app import IgniteApplicationService
2726
from ignitetest.services.utils.control_utility import ControlUtility
2827
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
2928
from ignitetest.services.utils.ignite_configuration.cache import CacheConfiguration
3029
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
31-
from ignitetest.utils import ignite_versions
30+
from ignitetest.utils import ignite_versions, cluster
3231
from ignitetest.utils.ignite_test import IgniteTest
3332
from ignitetest.utils.version import DEV_BRANCH, LATEST_2_7, V_2_8_0, IgniteVersion
3433

@@ -61,7 +60,8 @@ def test(self, ignite_version, long_txs):
6160

6261
config = IgniteConfiguration(version=IgniteVersion(ignite_version), caches=caches, cluster_state="INACTIVE")
6362

64-
ignites = IgniteService(self.test_context, config, num_nodes=self.NUM_NODES)
63+
num_nodes = len(self.test_context.cluster) - 2
64+
ignites = IgniteService(self.test_context, config, num_nodes=num_nodes)
6565

6666
ignites.start()
6767

@@ -71,7 +71,7 @@ def test(self, ignite_version, long_txs):
7171
ControlUtility(ignites, self.test_context).activate()
7272

7373
client_config = config._replace(client_mode=True,
74-
discovery_spi=from_ignite_cluster(ignites, slice(0, self.NUM_NODES - 1)))
74+
discovery_spi=from_ignite_cluster(ignites, slice(0, num_nodes - 1)))
7575

7676
long_tx_streamer = IgniteApplicationService(
7777
self.test_context,
@@ -93,7 +93,7 @@ def test(self, ignite_version, long_txs):
9393

9494
single_key_tx_streamer.start()
9595

96-
ignites.stop_node(ignites.nodes[self.NUM_NODES - 1])
96+
ignites.stop_node(ignites.nodes[num_nodes - 1])
9797

9898
if long_txs:
9999
long_tx_streamer.await_event("Node left topology", 60, from_the_beginning=True)
@@ -109,5 +109,6 @@ def test(self, ignite_version, long_txs):
109109
data["Worst latency (ms)"] = single_key_tx_streamer.extract_result("WORST_LATENCY")
110110
data["Streamed txs"] = single_key_tx_streamer.extract_result("STREAMED")
111111
data["Measure duration (ms)"] = single_key_tx_streamer.extract_result("MEASURE_DURATION")
112+
data["Server nodes"] = num_nodes
112113

113114
return data

modules/ducktests/tests/ignitetest/tests/self_test.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@
1717
This module contains smoke tests that checks that ducktape works as expected
1818
"""
1919

20-
from ducktape.mark.resource import cluster
21-
2220
from ignitetest.services.ignite import IgniteService
2321
from ignitetest.services.ignite_app import IgniteApplicationService
2422
from ignitetest.services.ignite_execution_exception import IgniteExecutionException
2523
from ignitetest.services.utils.ignite_configuration import IgniteConfiguration, IgniteClientConfiguration
2624
from ignitetest.services.utils.ignite_configuration.discovery import from_ignite_cluster
27-
from ignitetest.utils import ignite_versions
25+
from ignitetest.utils import ignite_versions, cluster
2826
from ignitetest.utils.ignite_test import IgniteTest
2927
from ignitetest.utils.version import DEV_BRANCH, IgniteVersion
3028

0 commit comments

Comments
 (0)