Skip to content
Snippets Groups Projects
Commit 49f08a85 authored by Georgy Moshkin's avatar Georgy Moshkin :speech_balloon:
Browse files

test: add int test for failure domains

parent f7d2ceab
No related branches found
No related tags found
1 merge request!166feature: implement failure domains
......@@ -165,6 +165,7 @@ class Instance:
color: Callable[[str], str]
failure_domain: dict[str, str] = field(default_factory=dict)
env: dict[str, str] = field(default_factory=dict)
process: subprocess.Popen | None = None
raft_id: int = INVALID_RAFT_ID
......@@ -188,7 +189,8 @@ class Instance:
"--instance-id", self.instance_id,
"--data-dir", self.data_dir,
"--listen", self.listen,
"--peer", ','.join(self.peers)
"--peer", ','.join(self.peers),
*(f"--failure-domain={k}={v}" for k, v in self.failure_domain.items()),
]
# fmt: on
......@@ -393,10 +395,13 @@ class Cluster:
) -> list[Instance]:
assert not self.instances, "Already deployed"
if not generate_instance_id:
args = dict(instance_id="")
else:
args = dict()
for i in range(instance_count):
self.add_instance(
wait_ready=False, generate_instance_id=generate_instance_id
)
self.add_instance(wait_ready=False, **args)
for instance in self.instances:
instance.start()
......@@ -408,19 +413,26 @@ class Cluster:
return self.instances
def add_instance(
self, wait_ready=True, peers=None, generate_instance_id=True
self,
wait_ready=True,
peers=None,
instance_id=None,
failure_domain=dict(),
) -> Instance:
i = 1 + len(self.instances)
instance_id = instance_id if instance_id is not None else f"i{i}"
instance = Instance(
binary_path=self.binary_path,
cluster_id=self.id,
instance_id=f"i{i}" if generate_instance_id else "",
instance_id=instance_id,
data_dir=f"{self.data_dir}/i{i}",
host=self.base_host,
port=self.base_port + i,
peers=peers or [f"{self.base_host}:{self.base_port + 1}"],
color=CLUSTER_COLORS[len(self.instances) % len(CLUSTER_COLORS)],
failure_domain=failure_domain,
)
assert self.base_port <= instance.port <= self.max_port
......
......@@ -22,7 +22,11 @@ def cluster3(cluster: Cluster):
def raft_join(
peer: Instance, cluster_id: str, instance_id: str, timeout_seconds: float | int
peer: Instance,
cluster_id: str,
instance_id: str,
timeout_seconds: float | int,
failure_domain: dict[str, str] = dict(),
):
replicaset_id = None
# Workaround slow address resolving. Intentionally use
......@@ -35,11 +39,17 @@ def raft_join(
instance_id,
replicaset_id,
address,
dict(), # failure_domains
failure_domain,
timeout=timeout_seconds,
)
def replicaset_id(instance: Instance):
return instance.eval(
"return box.space.raft_group:get(...).replicaset_id", instance.instance_id
)
def test_request_follower(cluster2: Cluster):
_, i2 = cluster2.instances
i2.assert_raft_status("Follower")
......@@ -204,3 +214,35 @@ def test_join_without_explicit_instance_id(cluster: Cluster):
assert i1.instance_id == "i1"
i2.assert_raft_status("Follower")
assert i2.instance_id == "i2"
def test_failure_domains(cluster: Cluster):
i1 = cluster.add_instance(failure_domain=dict(planet="Earth"))
i1.assert_raft_status("Leader")
assert replicaset_id(i1) == "r1"
with pytest.raises(TarantoolError, match="missing failure domain names: PLANET"):
raft_join(
peer=i1,
cluster_id=i1.cluster_id,
instance_id="x1",
failure_domain=dict(os="Arch"),
timeout_seconds=1,
)
i2 = cluster.add_instance(failure_domain=dict(planet="Mars", os="Arch"))
i2.assert_raft_status("Follower", leader_id=i1.raft_id)
assert replicaset_id(i2) == "r1"
with pytest.raises(TarantoolError, match="missing failure domain names: OS"):
raft_join(
peer=i1,
cluster_id=i1.cluster_id,
instance_id="x1",
failure_domain=dict(planet="Venus"),
timeout_seconds=1,
)
i3 = cluster.add_instance(failure_domain=dict(planet="Venus", os="BSD"))
i3.assert_raft_status("Follower", leader_id=i1.raft_id)
assert replicaset_id(i3) == "r2"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment