Retry if Swift objects are not available yet

Swift objects may not be immediately available after creation due to
Swift consistency issues.  Check if the objects are being returned and
retry if not.

Change-Id: I499389940a06965d213fcec458dfa388af47231e
Closes-Bug: #1493522
This commit is contained in:
Jason Dunsmore 2015-09-08 15:47:34 -05:00
parent 0d2aff4c0f
commit ac5f0ac8b4
2 changed files with 38 additions and 3 deletions

View File

@ -235,11 +235,14 @@ class SwiftSignal(resource.Resource):
container = self.client().get_container(self.stack.id)
except Exception as exc:
self.client_plugin().ignore_not_found(exc)
return
LOG.debug("Swift container %s was not found" % self.stack.id)
return []
index = container[1]
if not index: # Swift objects were deleted by user
return None
if not index:
LOG.debug("Swift objects in container %s were not found" %
self.stack.id)
return []
# Remove objects in that are for other handle resources, since
# multiple SwiftSignalHandle resources in the same stack share
@ -313,6 +316,8 @@ class SwiftSignal(resource.Resource):
raise SwiftSignalTimeout(self)
statuses = self.get_status()
if not statuses:
return False
for status in statuses:
if status == self.STATUS_FAILURE:

View File

@ -828,6 +828,36 @@ class SwiftSignalTest(common.HeatTestCase):
wc = st['test_wait_condition']
self.assertEqual("null", wc.FnGetAtt('data'))
@mock.patch.object(swift.SwiftClientPlugin, '_create')
@mock.patch.object(resource.Resource, 'physical_resource_name')
def test_swift_objects_invisible(self, mock_name, mock_swift):
st = create_stack(swiftsignal_template)
handle = st['test_wait_condition_handle']
mock_swift_object = mock.Mock()
mock_swift.return_value = mock_swift_object
mock_swift_object.url = "http://fake-host.com:8080/v1/AUTH_1234"
mock_swift_object.head_account.return_value = {
'x-account-meta-temp-url-key': '123456'
}
obj_name = "%s-%s-abcdefghijkl" % (st.name, handle.name)
mock_name.return_value = obj_name
mock_swift_object.get_container.side_effect = (
(container_header, []), # Just-created objects aren't visible yet
(container_header, []),
(container_header, []),
(container_header, []),
cont_index(obj_name, 1),
)
mock_swift_object.get_object.side_effect = (
(obj_header, json.dumps({'id': 1})),
(obj_header, json.dumps({'id': 2})),
)
st.create()
self.assertEqual(('CREATE', 'COMPLETE'), st.state)
@mock.patch.object(swift.SwiftClientPlugin, '_create')
@mock.patch.object(resource.Resource, 'physical_resource_name')
def test_swift_container_deleted(self, mock_name, mock_swift):