14
14
# See the License for the specific language governing permissions and
15
15
# limitations under the License.
19
from signal import SIGTERM
20
17
from subprocess import Popen
21
from time import sleep
18
from unittest import main, TestCase
23
20
from swiftclient import client
24
22
from swift.common import direct_client
25
from test.probe.common import get_to_final_state, kill_pids, reset_environment
28
class TestAccountFailures(unittest.TestCase):
23
from test.probe.common import get_to_final_state, kill_nonprimary_server, \
24
kill_server, kill_servers, reset_environment, start_server
27
class TestAccountFailures(TestCase):
31
self.pids, self.port2server, self.account_ring, self.container_ring, \
32
self.object_ring, self.url, self.token, self.account = \
30
(self.pids, self.port2server, self.account_ring, self.container_ring,
31
self.object_ring, self.url, self.token,
32
self.account) = reset_environment()
35
34
def tearDown(self):
35
kill_servers(self.port2server, self.pids)
38
37
def test_main(self):
38
# Create container1 and container2
39
# Assert account level sees them
40
# Create container2/object1
41
# Assert account level doesn't see it yet
43
# Assert account level now sees the container2/object1
44
# Kill account servers excepting two of the primaries
46
# Assert account level knows container1 is gone but doesn't know about
47
# container2/object2 yet
48
# Put container2/object2
49
# Run container updaters
50
# Assert account level now knows about container2/object2
51
# Restart other primary account server
52
# Assert that server doesn't know about container1's deletion or the
53
# new container2/object2 yet
55
# Assert that server is now up to date
39
57
container1 = 'container1'
40
58
client.put_container(self.url, self.token, container1)
41
59
container2 = 'container2'
46
64
self.assertEquals(headers['x-account-bytes-used'], '0')
50
if c['name'] == container1:
67
for container in containers:
68
if container['name'] == container1:
52
self.assertEquals(c['count'], 0)
53
self.assertEquals(c['bytes'], 0)
54
elif c['name'] == container2:
70
self.assertEquals(container['count'], 0)
71
self.assertEquals(container['bytes'], 0)
72
elif container['name'] == container2:
56
self.assertEquals(c['count'], 0)
57
self.assertEquals(c['bytes'], 0)
74
self.assertEquals(container['count'], 0)
75
self.assertEquals(container['bytes'], 0)
58
76
self.assert_(found1)
59
77
self.assert_(found2)
65
83
self.assertEquals(headers['x-account-bytes-used'], '0')
69
if c['name'] == container1:
86
for container in containers:
87
if container['name'] == container1:
71
self.assertEquals(c['count'], 0)
72
self.assertEquals(c['bytes'], 0)
73
elif c['name'] == container2:
89
self.assertEquals(container['count'], 0)
90
self.assertEquals(container['bytes'], 0)
91
elif container['name'] == container2:
75
self.assertEquals(c['count'], 0)
76
self.assertEquals(c['bytes'], 0)
93
self.assertEquals(container['count'], 0)
94
self.assertEquals(container['bytes'], 0)
77
95
self.assert_(found1)
78
96
self.assert_(found2)
84
102
self.assertEquals(headers['x-account-bytes-used'], '4')
88
if c['name'] == container1:
105
for container in containers:
106
if container['name'] == container1:
90
self.assertEquals(c['count'], 0)
91
self.assertEquals(c['bytes'], 0)
92
elif c['name'] == container2:
108
self.assertEquals(container['count'], 0)
109
self.assertEquals(container['bytes'], 0)
110
elif container['name'] == container2:
94
self.assertEquals(c['count'], 1)
95
self.assertEquals(c['bytes'], 4)
112
self.assertEquals(container['count'], 1)
113
self.assertEquals(container['bytes'], 4)
96
114
self.assert_(found1)
97
115
self.assert_(found2)
99
117
apart, anodes = self.account_ring.get_nodes(self.account)
100
kill(self.pids[self.port2server[anodes[0]['port']]], SIGTERM)
118
kill_nonprimary_server(anodes, self.port2server, self.pids)
119
kill_server(anodes[0]['port'], self.port2server, self.pids)
102
121
client.delete_container(self.url, self.token, container1)
103
122
client.put_object(self.url, self.token, container2, 'object2', '12345')
107
126
self.assertEquals(headers['x-account-bytes-used'], '4')
111
if c['name'] == container1:
129
for container in containers:
130
if container['name'] == container1:
113
elif c['name'] == container2:
132
elif container['name'] == container2:
115
self.assertEquals(c['count'], 1)
116
self.assertEquals(c['bytes'], 4)
134
self.assertEquals(container['count'], 1)
135
self.assertEquals(container['bytes'], 4)
117
136
self.assert_(not found1)
118
137
self.assert_(found2)
121
for n in xrange(1, 5):
122
ps.append(Popen(['swift-container-updater',
123
'/etc/swift/container-server/%d.conf' % n,
140
for node in xrange(1, 5):
141
processes.append(Popen([
142
'swift-container-updater',
143
'/etc/swift/container-server/%d.conf' % node,
145
for process in processes:
127
147
headers, containers = client.get_account(self.url, self.token)
128
148
self.assertEquals(headers['x-account-container-count'], '1')
129
149
self.assertEquals(headers['x-account-object-count'], '2')
130
150
self.assertEquals(headers['x-account-bytes-used'], '9')
134
if c['name'] == container1:
153
for container in containers:
154
if container['name'] == container1:
136
elif c['name'] == container2:
156
elif container['name'] == container2:
138
self.assertEquals(c['count'], 2)
139
self.assertEquals(c['bytes'], 9)
158
self.assertEquals(container['count'], 2)
159
self.assertEquals(container['bytes'], 9)
140
160
self.assert_(not found1)
141
161
self.assert_(found2)
143
self.pids[self.port2server[anodes[0]['port']]] = \
144
Popen(['swift-account-server',
145
'/etc/swift/account-server/%d.conf' %
146
((anodes[0]['port'] - 6002) / 10)]).pid
148
# This is the earlier counts and bytes because the first node doesn't
149
# have the newest udpates yet.
163
start_server(anodes[0]['port'], self.port2server, self.pids)
150
165
headers, containers = \
151
166
direct_client.direct_get_account(anodes[0], apart, self.account)
152
167
self.assertEquals(headers['x-account-container-count'], '2')
154
169
self.assertEquals(headers['x-account-bytes-used'], '4')
158
if c['name'] == container1:
172
for container in containers:
173
if container['name'] == container1:
160
elif c['name'] == container2:
175
elif container['name'] == container2:
162
# This is the earlier count and bytes because the first node
163
# doesn't have the newest udpates yet.
164
self.assertEquals(c['count'], 1)
165
self.assertEquals(c['bytes'], 4)
166
# This okay because the first node hasn't got the update that
167
# container1 was deleted yet.
177
self.assertEquals(container['count'], 1)
178
self.assertEquals(container['bytes'], 4)
168
179
self.assert_(found1)
169
180
self.assert_(found2)
176
187
self.assertEquals(headers['x-account-bytes-used'], '9')
180
if c['name'] == container1:
190
for container in containers:
191
if container['name'] == container1:
182
elif c['name'] == container2:
193
elif container['name'] == container2:
184
self.assertEquals(c['count'], 2)
185
self.assertEquals(c['bytes'], 9)
195
self.assertEquals(container['count'], 2)
196
self.assertEquals(container['bytes'], 9)
186
197
self.assert_(not found1)
187
198
self.assert_(found2)
190
201
if __name__ == '__main__':