From b2c2677359f71c3feddd8bcfeafabe009338ca0e Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Thu, 22 Jan 2015 09:45:05 +1300 Subject: [PATCH] Always fetch temp URL key before generation SwiftClientPlugin.get_temp_url has the potential to race with itself when storing a new tempurl key to the swift account, leading to tempurls being built with a key that has been overridden. This change always fetches the key from swift before creating a temp URL. Change-Id: Id5897fdd834cc5d3b74fda8d2317d084a5564c51 Closes-Bug: #1413366 --- heat/engine/clients/os/swift.py | 11 ++++++----- heat/tests/test_swift_client.py | 16 +++++++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/heat/engine/clients/os/swift.py b/heat/engine/clients/os/swift.py index 79a3086029..0eed2dd840 100644 --- a/heat/engine/clients/os/swift.py +++ b/heat/engine/clients/os/swift.py @@ -88,11 +88,12 @@ class SwiftClientPlugin(client_plugin.ClientPlugin): Return a Swift TempURL. ''' key_header = 'x-account-meta-temp-url-key' - if key_header in self.client().head_account(): - key = self.client().head_account()[key_header] - else: - key = hashlib.sha224(str(random.getrandbits(256))).hexdigest()[:32] - self.client().post_account({key_header: key}) + if key_header not in self.client().head_account(): + self.client().post_account({ + key_header: hashlib.sha224( + str(random.getrandbits(256))).hexdigest()[:32]}) + + key = self.client().head_account()[key_header] path = '/v1/AUTH_%s/%s/%s' % (self.context.tenant_id, container_name, obj_name) diff --git a/heat/tests/test_swift_client.py b/heat/tests/test_swift_client.py index fe72d1ec96..5930079f6b 100644 --- a/heat/tests/test_swift_client.py +++ b/heat/tests/test_swift_client.py @@ -82,17 +82,23 @@ class SwiftUtilsTests(SwiftClientPluginTestCase): def test_get_temp_url_no_account_key(self): self.swift_client.url = ("http://fake-host.com:8080/v1/" - "AUTH_test_tenant_id") - self.swift_client.head_account = mock.Mock(return_value={}) - self.swift_client.post_account = mock.Mock() - self.assertFalse(self.swift_client.post_account.called) + "AUTH_demo") + head_account = {} + + def post_account(data): + head_account.update(data) + + self.swift_client.head_account = mock.Mock(return_value=head_account) + self.swift_client.post_account = post_account container_name = '1234' # from stack.id stack_name = 'test' handle_name = 'foo' obj_name = '%s-%s' % (stack_name, handle_name) + + self.assertNotIn('x-account-meta-temp-url-key', head_account) self.swift_plugin.get_temp_url(container_name, obj_name) - self.assertTrue(self.swift_client.post_account.called) + self.assertIn('x-account-meta-temp-url-key', head_account) def test_get_signal_url(self): self.swift_client.url = ("http://fake-host.com:8080/v1/"