26
27
class TestRingData(unittest.TestCase):
30
self.testdir = os.path.join(os.path.dirname(__file__), 'ring_data')
31
rmtree(self.testdir, ignore_errors=1)
32
os.mkdir(self.testdir)
35
rmtree(self.testdir, ignore_errors=1)
37
def assert_ring_data_equal(self, rd_expected, rd_got):
38
self.assertEquals(rd_expected._replica2part2dev_id,
39
rd_got._replica2part2dev_id)
40
self.assertEquals(rd_expected.devs, rd_got.devs)
41
self.assertEquals(rd_expected._part_shift, rd_got._part_shift)
28
43
def test_attrs(self):
29
44
r2p2d = [[0, 1, 0, 1], [0, 1, 0, 1]]
30
45
d = [{'id': 0, 'zone': 0}, {'id': 1, 'zone': 1}]
34
49
self.assertEquals(rd.devs, d)
35
50
self.assertEquals(rd._part_shift, s)
37
def test_pickleable(self):
52
def test_can_load_pickled_ring_data(self):
38
53
rd = ring.RingData([[0, 1, 0, 1], [0, 1, 0, 1]],
39
54
[{'id': 0, 'zone': 0}, {'id': 1, 'zone': 1}], 30)
55
ring_fname = os.path.join(self.testdir, 'foo.ring.gz')
40
56
for p in xrange(pickle.HIGHEST_PROTOCOL):
41
pickle.loads(pickle.dumps(rd, protocol=p))
57
pickle.dump(rd, GzipFile(ring_fname, 'wb'), protocol=p)
58
ring_data = ring.RingData.load(ring_fname)
59
self.assert_ring_data_equal(rd, ring_data)
61
def test_roundtrip_serialization(self):
62
ring_fname = os.path.join(self.testdir, 'foo.ring.gz')
64
[array.array('H', [0, 1, 0, 1]), array.array('H',[0, 1, 0, 1])],
65
[{'id': 0, 'zone': 0}, {'id': 1, 'zone': 1}], 30)
67
rd2 = ring.RingData.load(ring_fname)
68
self.assert_ring_data_equal(rd, rd2)
44
71
class TestRing(unittest.TestCase):
49
76
rmtree(self.testdir, ignore_errors=1)
50
77
os.mkdir(self.testdir)
51
78
self.testgz = os.path.join(self.testdir, 'whatever.ring.gz')
52
self.intended_replica2part2dev_id = [[0, 1, 0, 1],
79
self.intended_replica2part2dev_id = [
80
array.array('H', [0, 1, 0, 1]),
81
array.array('H', [0, 1, 0, 1]),
82
array.array('H', [3, 4, 3, 4])]
55
83
self.intended_devs = [{'id': 0, 'zone': 0, 'weight': 1.0,
56
84
'ip': '10.1.1.1', 'port': 6000},
57
85
{'id': 1, 'zone': 0, 'weight': 1.0,
63
91
'ip': '10.1.2.2', 'port': 6000}]
64
92
self.intended_part_shift = 30
65
93
self.intended_reload_time = 15
66
pickle.dump(ring.RingData(self.intended_replica2part2dev_id,
67
self.intended_devs, self.intended_part_shift),
68
GzipFile(self.testgz, 'wb'))
94
ring.RingData(self.intended_replica2part2dev_id,
95
self.intended_devs, self.intended_part_shift).save(self.testgz)
69
96
self.ring = ring.Ring(self.testdir,
70
97
reload_time=self.intended_reload_time, ring_name='whatever')
78
105
self.assertEquals(self.ring._part_shift, self.intended_part_shift)
79
106
self.assertEquals(self.ring.devs, self.intended_devs)
80
107
self.assertEquals(self.ring.reload_time, self.intended_reload_time)
81
self.assertEquals(self.ring.pickle_gz_path, self.testgz)
108
self.assertEquals(self.ring.serialized_path, self.testgz)
82
109
# test invalid endcap
83
110
_orig_hash_path_suffix = utils.HASH_PATH_SUFFIX
99
126
orig_mtime = self.ring._mtime
100
127
self.assertEquals(len(self.ring.devs), 5)
101
128
self.intended_devs.append({'id': 3, 'zone': 3, 'weight': 1.0})
102
pickle.dump(ring.RingData(self.intended_replica2part2dev_id,
103
self.intended_devs, self.intended_part_shift),
104
GzipFile(self.testgz, 'wb'))
129
ring.RingData(self.intended_replica2part2dev_id,
130
self.intended_devs, self.intended_part_shift).save(self.testgz)
106
132
self.ring.get_nodes('a')
107
133
self.assertEquals(len(self.ring.devs), 6)
113
139
orig_mtime = self.ring._mtime
114
140
self.assertEquals(len(self.ring.devs), 6)
115
141
self.intended_devs.append({'id': 5, 'zone': 4, 'weight': 1.0})
116
pickle.dump(ring.RingData(self.intended_replica2part2dev_id,
117
self.intended_devs, self.intended_part_shift),
118
GzipFile(self.testgz, 'wb'))
142
ring.RingData(self.intended_replica2part2dev_id,
143
self.intended_devs, self.intended_part_shift).save(self.testgz)
120
145
self.ring.get_part_nodes(0)
121
146
self.assertEquals(len(self.ring.devs), 7)
128
153
part, nodes = self.ring.get_nodes('a')
129
154
self.assertEquals(len(self.ring.devs), 7)
130
155
self.intended_devs.append({'id': 6, 'zone': 5, 'weight': 1.0})
131
pickle.dump(ring.RingData(self.intended_replica2part2dev_id,
132
self.intended_devs, self.intended_part_shift),
133
GzipFile(self.testgz, 'wb'))
156
ring.RingData(self.intended_replica2part2dev_id,
157
self.intended_devs, self.intended_part_shift).save(self.testgz)
135
159
self.ring.get_more_nodes(part).next()
136
160
self.assertEquals(len(self.ring.devs), 8)
142
166
orig_mtime = self.ring._mtime
143
167
self.assertEquals(len(self.ring.devs), 8)
144
168
self.intended_devs.append({'id': 5, 'zone': 4, 'weight': 1.0})
145
pickle.dump(ring.RingData(self.intended_replica2part2dev_id,
146
self.intended_devs, self.intended_part_shift),
147
GzipFile(self.testgz, 'wb'))
169
ring.RingData(self.intended_replica2part2dev_id,
170
self.intended_devs, self.intended_part_shift).save(self.testgz)
149
172
self.assertEquals(len(self.ring.devs), 9)
150
173
self.assertNotEquals(self.ring._mtime, orig_mtime)