-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblockade_random_partitions-rabbitmq-test.py
54 lines (42 loc) · 1.59 KB
/
blockade_random_partitions-rabbitmq-test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
'''
simulates blockade's --random partitioning.
@see http://blockade.readthedocs.io/en/latest/commands.html#partition
'''
from rabbitmq_test import test
import random
from blockade.errors import BlockadeError
import logging
def random_partition(containers):
'''
taken from https://github.com/dcm-oss/blockade/blob/master/blockade/core.py#L411
:param containers:
:return:
@see https://github.com/dcm-oss/blockade/blob/master/blockade/core.py#L411
'''
if not containers:
return []
num_containers = len(containers)
num_partitions = random.randint(2, num_containers)
pick = lambda: containers.pop(random.randint(0, len(containers) - 1))
# pick at least one container for each partition
partitions = [[pick()] for _ in xrange(num_partitions)]
# distribute the rest of the containers among the partitions
for _ in xrange(len(containers)):
random_partition = random.randint(0, num_partitions - 1)
partitions[random_partition].append(pick())
return partitions
def blockade_random_partition_strategy(nodes, nemesis):
for num_att in range(5):
partitions = [','.join(p) for p in random_partition(nodes[:])]
if len(partitions) > 0:
break
if not partitions:
raise Exception("failed to create a partition for %s" % str(nodes))
try:
nemesis.partition(partitions)
nemesis.status()
except BlockadeError as e:
logging.error('failed to create partition for %s', str(nodes))
logging.exception(e)
if __name__ == '__main__':
test(blockade_random_partition_strategy)