Do not try to create temporary URLs with zero lifetime

A new option is introduced for that, which defaults to the deploy timeout
if it is set and to 1800 seconds if it is not.

Change-Id: I10e02919e40d25bd4411f2b6f98f9317d1cfb187
Story: #1653112
Task: #9707
This commit is contained in:
Dmitry Tantsur 2019-04-01 16:49:21 +02:00
parent 00342d997c
commit 2039138cfe
4 changed files with 73 additions and 1 deletions

View File

@ -3606,7 +3606,10 @@ def _store_configdrive(node, configdrive):
if CONF.deploy.configdrive_use_object_store: if CONF.deploy.configdrive_use_object_store:
# NOTE(lucasagomes): No reason to use a different timeout than # NOTE(lucasagomes): No reason to use a different timeout than
# the one used for deploying the node # the one used for deploying the node
timeout = CONF.conductor.deploy_callback_timeout timeout = (CONF.conductor.configdrive_swift_temp_url_duration
or CONF.conductor.deploy_callback_timeout
# The documented default in ironic.conf.conductor
or 1800)
container = CONF.conductor.configdrive_swift_container container = CONF.conductor.configdrive_swift_container
object_name = _get_configdrive_obj_name(node) object_name = _get_configdrive_obj_name(node)

View File

@ -139,6 +139,13 @@ opts = [
help=_('Name of the Swift container to store config drive ' help=_('Name of the Swift container to store config drive '
'data. Used when configdrive_use_object_store is ' 'data. Used when configdrive_use_object_store is '
'True.')), 'True.')),
cfg.IntOpt('configdrive_swift_temp_url_duration',
min=60,
help=_('The timeout (in seconds) after which a configdrive '
'temporary URL becomes invalid. Defaults to '
'deploy_callback_timeout if it is set, otherwise to '
'1800 seconds. Used when '
'configdrive_use_object_store is True.')),
cfg.IntOpt('inspect_wait_timeout', cfg.IntOpt('inspect_wait_timeout',
default=1800, default=1800,
help=_('Timeout (seconds) for waiting for node inspection. ' help=_('Timeout (seconds) for waiting for node inspection. '

View File

@ -7544,6 +7544,61 @@ class StoreConfigDriveTestCase(db_base.DbTestCase):
self.node.refresh() self.node.refresh()
self.assertEqual(expected_instance_info, self.node.instance_info) self.assertEqual(expected_instance_info, self.node.instance_info)
def test_store_configdrive_swift_no_deploy_timeout(self, mock_swift):
container_name = 'foo_container'
expected_obj_name = 'configdrive-%s' % self.node.uuid
expected_obj_header = {'X-Delete-After': '1200'}
expected_instance_info = {'configdrive': 'http://1.2.3.4'}
# set configs and mocks
CONF.set_override('configdrive_use_object_store', True,
group='deploy')
CONF.set_override('configdrive_swift_container', container_name,
group='conductor')
CONF.set_override('configdrive_swift_temp_url_duration', 1200,
group='conductor')
CONF.set_override('deploy_callback_timeout', 0,
group='conductor')
mock_swift.return_value.get_temp_url.return_value = 'http://1.2.3.4'
manager._store_configdrive(self.node, b'foo')
mock_swift.assert_called_once_with()
mock_swift.return_value.create_object.assert_called_once_with(
container_name, expected_obj_name, mock.ANY,
object_headers=expected_obj_header)
mock_swift.return_value.get_temp_url.assert_called_once_with(
container_name, expected_obj_name, 1200)
self.node.refresh()
self.assertEqual(expected_instance_info, self.node.instance_info)
def test_store_configdrive_swift_no_deploy_timeout_fallback(self,
mock_swift):
container_name = 'foo_container'
expected_obj_name = 'configdrive-%s' % self.node.uuid
expected_obj_header = {'X-Delete-After': '1800'}
expected_instance_info = {'configdrive': 'http://1.2.3.4'}
# set configs and mocks
CONF.set_override('configdrive_use_object_store', True,
group='deploy')
CONF.set_override('configdrive_swift_container', container_name,
group='conductor')
CONF.set_override('deploy_callback_timeout', 0,
group='conductor')
mock_swift.return_value.get_temp_url.return_value = 'http://1.2.3.4'
manager._store_configdrive(self.node, b'foo')
mock_swift.assert_called_once_with()
mock_swift.return_value.create_object.assert_called_once_with(
container_name, expected_obj_name, mock.ANY,
object_headers=expected_obj_header)
mock_swift.return_value.get_temp_url.assert_called_once_with(
container_name, expected_obj_name, 1800)
self.node.refresh()
self.assertEqual(expected_instance_info, self.node.instance_info)
@mgr_utils.mock_record_keepalive @mgr_utils.mock_record_keepalive
class NodeInspectHardware(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase): class NodeInspectHardware(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):

View File

@ -0,0 +1,7 @@
---
fixes:
- |
No longer tries to create a temporary URL with zero lifetime if the
``deploy_callback_timeout`` option is set to zero. The default of 1800
seconds is used in that case. Use the new
``configdrive_swift_temp_url_duration`` option to override.