2
# Copyright (c) 2010-2012 OpenStack, LLC.
4
# Licensed under the Apache License, Version 2.0 (the "License");
5
# you may not use this file except in compliance with the License.
6
# You may obtain a copy of the License at
8
# http://www.apache.org/licenses/LICENSE-2.0
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
14
# See the License for the specific language governing permissions and
15
# limitations under the License.
19
from signal import SIGTERM
20
from subprocess import Popen
21
from time import sleep
23
from swift.common import client, direct_client
24
from test.probe.common import get_to_final_state, kill_pids, reset_environment
27
class TestAccountFailures(unittest.TestCase):
30
self.pids, self.port2server, self.account_ring, self.container_ring, \
31
self.object_ring, self.url, self.token, self.account = \
38
container1 = 'container1'
39
client.put_container(self.url, self.token, container1)
40
container2 = 'container2'
41
client.put_container(self.url, self.token, container2)
42
headers, containers = client.get_account(self.url, self.token)
43
self.assertEquals(headers['x-account-container-count'], '2')
44
self.assertEquals(headers['x-account-object-count'], '0')
45
self.assertEquals(headers['x-account-bytes-used'], '0')
49
if c['name'] == container1:
51
self.assertEquals(c['count'], 0)
52
self.assertEquals(c['bytes'], 0)
53
elif c['name'] == container2:
55
self.assertEquals(c['count'], 0)
56
self.assertEquals(c['bytes'], 0)
60
client.put_object(self.url, self.token, container2, 'object1', '1234')
61
headers, containers = client.get_account(self.url, self.token)
62
self.assertEquals(headers['x-account-container-count'], '2')
63
self.assertEquals(headers['x-account-object-count'], '0')
64
self.assertEquals(headers['x-account-bytes-used'], '0')
68
if c['name'] == container1:
70
self.assertEquals(c['count'], 0)
71
self.assertEquals(c['bytes'], 0)
72
elif c['name'] == container2:
74
self.assertEquals(c['count'], 0)
75
self.assertEquals(c['bytes'], 0)
80
headers, containers = client.get_account(self.url, self.token)
81
self.assertEquals(headers['x-account-container-count'], '2')
82
self.assertEquals(headers['x-account-object-count'], '1')
83
self.assertEquals(headers['x-account-bytes-used'], '4')
87
if c['name'] == container1:
89
self.assertEquals(c['count'], 0)
90
self.assertEquals(c['bytes'], 0)
91
elif c['name'] == container2:
93
self.assertEquals(c['count'], 1)
94
self.assertEquals(c['bytes'], 4)
98
apart, anodes = self.account_ring.get_nodes(self.account)
99
kill(self.pids[self.port2server[anodes[0]['port']]], SIGTERM)
101
client.delete_container(self.url, self.token, container1)
102
client.put_object(self.url, self.token, container2, 'object2', '12345')
103
headers, containers = client.get_account(self.url, self.token)
104
self.assertEquals(headers['x-account-container-count'], '1')
105
self.assertEquals(headers['x-account-object-count'], '1')
106
self.assertEquals(headers['x-account-bytes-used'], '4')
110
if c['name'] == container1:
112
elif c['name'] == container2:
114
self.assertEquals(c['count'], 1)
115
self.assertEquals(c['bytes'], 4)
116
self.assert_(not found1)
120
for n in xrange(1, 5):
121
ps.append(Popen(['swift-container-updater',
122
'/etc/swift/container-server/%d.conf' % n,
126
headers, containers = client.get_account(self.url, self.token)
127
self.assertEquals(headers['x-account-container-count'], '1')
128
self.assertEquals(headers['x-account-object-count'], '2')
129
self.assertEquals(headers['x-account-bytes-used'], '9')
133
if c['name'] == container1:
135
elif c['name'] == container2:
137
self.assertEquals(c['count'], 2)
138
self.assertEquals(c['bytes'], 9)
139
self.assert_(not found1)
142
self.pids[self.port2server[anodes[0]['port']]] = \
143
Popen(['swift-account-server',
144
'/etc/swift/account-server/%d.conf' %
145
((anodes[0]['port'] - 6002) / 10)]).pid
147
# This is the earlier counts and bytes because the first node doesn't
148
# have the newest udpates yet.
149
headers, containers = \
150
direct_client.direct_get_account(anodes[0], apart, self.account)
151
self.assertEquals(headers['x-account-container-count'], '2')
152
self.assertEquals(headers['x-account-object-count'], '1')
153
self.assertEquals(headers['x-account-bytes-used'], '4')
157
if c['name'] == container1:
159
elif c['name'] == container2:
161
# This is the earlier count and bytes because the first node
162
# doesn't have the newest udpates yet.
163
self.assertEquals(c['count'], 1)
164
self.assertEquals(c['bytes'], 4)
165
# This okay because the first node hasn't got the update that
166
# container1 was deleted yet.
171
headers, containers = \
172
direct_client.direct_get_account(anodes[0], apart, self.account)
173
self.assertEquals(headers['x-account-container-count'], '1')
174
self.assertEquals(headers['x-account-object-count'], '2')
175
self.assertEquals(headers['x-account-bytes-used'], '9')
179
if c['name'] == container1:
181
elif c['name'] == container2:
183
self.assertEquals(c['count'], 2)
184
self.assertEquals(c['bytes'], 9)
185
self.assert_(not found1)
189
if __name__ == '__main__':