diff --git a/ironic/common/swift.py b/ironic/common/swift.py index 8168870eef..4f1488ca59 100644 --- a/ironic/common/swift.py +++ b/ironic/common/swift.py @@ -55,6 +55,11 @@ class SwiftAPI(object): # with swift is initialized. Since v3.2.0 swiftclient supports # instantiating the API client from keystoneauth session. params = {'session': _get_swift_session()} + + if CONF.swift.endpoint_override: + params['os_options'] = { + 'object_storage_url': CONF.swift.endpoint_override} + self.connection = swift_client.Connection(**params) def create_object(self, container, obj, filename, diff --git a/ironic/conf/swift.py b/ironic/conf/swift.py index 66a0b1f5c9..6e1a287b06 100644 --- a/ironic/conf/swift.py +++ b/ironic/conf/swift.py @@ -20,6 +20,9 @@ from ironic.common.i18n import _ from ironic.conf import auth opts = [ + cfg.StrOpt('endpoint_override', + help=_('Always use this endpoint URL for requests to Swift. ' + 'It also controls base URL used for image TempURLs.')), cfg.IntOpt('swift_max_retries', default=2, help=_('Maximum number of times to retry a Swift request, ' diff --git a/ironic/tests/unit/common/test_swift.py b/ironic/tests/unit/common/test_swift.py index f9b07e4baa..f5d3dd3640 100644 --- a/ironic/tests/unit/common/test_swift.py +++ b/ironic/tests/unit/common/test_swift.py @@ -47,6 +47,17 @@ class SwiftTestCase(base.TestCase): connection_mock.assert_called_once_with( session=keystone_mock.return_value) + def test___init___endpoint(self, connection_mock, keystone_mock): + """Check if client is properly initialized with endpoint override""" + + CONF.swift.endpoint_override = 'dummy_override_url' + + swift.SwiftAPI() + connection_mock.assert_called_once_with( + session=keystone_mock.return_value, + os_options={'object_storage_url': 'dummy_override_url'} + ) + def test___init___radosgw(self, connection_mock, swift_session_mock): """Check if client is properly initialized with radosgw""" diff --git a/releasenotes/notes/swift-endpoint-override-4151d2fbb159950d.yaml b/releasenotes/notes/swift-endpoint-override-4151d2fbb159950d.yaml new file mode 100644 index 0000000000..79013e424b --- /dev/null +++ b/releasenotes/notes/swift-endpoint-override-4151d2fbb159950d.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - Adds ``[swift]/endpoint_override`` option to explicitly set the endpoint + URL used for Swift. Ironic uses the Swift connection URL as a base for + generation of some TempURLs. Added parameter enables operators to fix + the problem when image is attached (via TempURL) as vmedia (e.g. in iLO + driver) and BMC doesn't have connectivity to public network. + By default this parameter is not set for backward compatibility.