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:
parent
0d2aff4c0f
commit
ac5f0ac8b4
@ -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:
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user