diff options
author | Zuul <zuul@review.opendev.org> | 2021-03-29 15:44:44 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2021-03-29 15:44:44 +0000 |
commit | cd75c7dc708b6a67bb53d791b05723eefaa68a9f (patch) | |
tree | 486ba0faf046aaddd3c1e77547bc15e5c6b242ae /ironic/tests/unit/common | |
parent | 1caaa0c5075d10810dcd143f1bb41c6a034e3023 (diff) | |
parent | d913ef639691f1811775e4493985339c3421203e (diff) | |
download | ironic-cd75c7dc708b6a67bb53d791b05723eefaa68a9f.tar.gz |
Merge "Move configuration mold utilities"
Diffstat (limited to 'ironic/tests/unit/common')
-rw-r--r-- | ironic/tests/unit/common/test_molds.py | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/ironic/tests/unit/common/test_molds.py b/ironic/tests/unit/common/test_molds.py new file mode 100644 index 000000000..53c0ad0ac --- /dev/null +++ b/ironic/tests/unit/common/test_molds.py @@ -0,0 +1,291 @@ +# Copyright (c) 2021 Dell Inc. or its subsidiaries. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from unittest import mock + +from oslo_config import cfg +import requests + +from ironic.common import exception +from ironic.common import molds +from ironic.common import swift +from ironic.conductor import task_manager +from ironic.tests.unit.db import base as db_base +from ironic.tests.unit.objects import utils as obj_utils + + +class ConfigurationMoldTestCase(db_base.DbTestCase): + + def setUp(self): + super(ConfigurationMoldTestCase, self).setUp() + self.node = obj_utils.create_test_node(self.context) + + @mock.patch.object(swift, 'get_swift_session', autospec=True) + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_swift(self, mock_put, mock_swift): + mock_session = mock.Mock() + mock_session.get_token.return_value = 'token' + mock_swift.return_value = mock_session + cfg.CONF.molds.storage = 'swift' + url = 'https://example.com/file1' + data = {'key': 'value'} + + with task_manager.acquire(self.context, self.node.uuid) as task: + molds.save_configuration(task, url, data) + + mock_put.assert_called_once_with(url, '{\n "key": "value"\n}', + headers={'X-Auth-Token': 'token'}) + + @mock.patch.object(swift, 'get_swift_session', autospec=True) + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_swift_noauth(self, mock_put, mock_swift): + mock_session = mock.Mock() + mock_session.get_token.return_value = None + mock_swift.return_value = mock_session + cfg.CONF.molds.storage = 'swift' + url = 'https://example.com/file1' + data = {'key': 'value'} + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + exception.IronicException, + molds.save_configuration, + task, url, data) + + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_http(self, mock_put): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + url = 'https://example.com/file1' + data = {'key': 'value'} + + with task_manager.acquire(self.context, self.node.uuid) as task: + molds.save_configuration(task, url, data) + + mock_put.assert_called_once_with( + url, '{\n "key": "value"\n}', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_http_noauth(self, mock_put): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = None + cfg.CONF.molds.password = None + url = 'https://example.com/file1' + data = {'key': 'value'} + + with task_manager.acquire(self.context, self.node.uuid) as task: + molds.save_configuration(task, url, data) + mock_put.assert_called_once_with( + url, '{\n "key": "value"\n}', + headers=None) + + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_http_error(self, mock_put): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + response = mock.MagicMock() + response.status_code = 404 + response.raise_for_status.side_effect = requests.exceptions.HTTPError + mock_put.return_value = response + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + requests.exceptions.HTTPError, + molds.save_configuration, + task, + 'https://example.com/file2', + {'key': 'value'}) + mock_put.assert_called_once_with( + 'https://example.com/file2', '{\n "key": "value"\n}', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_connection_error(self, mock_put): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + cfg.CONF.molds.retry_interval = 0 + cfg.CONF.molds.retry_attempts = 3 + response = mock.MagicMock() + mock_put.side_effect = [ + requests.exceptions.ConnectTimeout, + requests.exceptions.ConnectionError, + response] + + with task_manager.acquire(self.context, self.node.uuid) as task: + molds.save_configuration( + task, 'https://example.com/file2', {'key': 'value'}) + mock_put.assert_called_with( + 'https://example.com/file2', '{\n "key": "value"\n}', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + self.assertEqual(mock_put.call_count, 3) + + @mock.patch.object(requests, 'put', autospec=True) + def test_save_configuration_connection_error_exceeded(self, mock_put): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + cfg.CONF.molds.retry_interval = 0 + cfg.CONF.molds.retry_attempts = 2 + mock_put.side_effect = [ + requests.exceptions.ConnectTimeout, + requests.exceptions.ConnectionError] + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + requests.exceptions.ConnectionError, + molds.save_configuration, + task, + 'https://example.com/file2', + {'key': 'value'}) + mock_put.assert_called_with( + 'https://example.com/file2', '{\n "key": "value"\n}', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + self.assertEqual(mock_put.call_count, 2) + + @mock.patch.object(swift, 'get_swift_session', autospec=True) + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_swift(self, mock_get, mock_swift): + mock_session = mock.Mock() + mock_session.get_token.return_value = 'token' + mock_swift.return_value = mock_session + cfg.CONF.molds.storage = 'swift' + response = mock.MagicMock() + response.status_code = 200 + response.json.return_value = {'key': 'value'} + mock_get.return_value = response + url = 'https://example.com/file1' + + with task_manager.acquire(self.context, self.node.uuid) as task: + result = molds.get_configuration(task, url) + + mock_get.assert_called_once_with( + url, headers={'X-Auth-Token': 'token'}) + self.assertJsonEqual({'key': 'value'}, result) + + @mock.patch.object(swift, 'get_swift_session', autospec=True) + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_swift_noauth(self, mock_get, mock_swift): + mock_session = mock.Mock() + mock_session.get_token.return_value = None + mock_swift.return_value = mock_session + cfg.CONF.molds.storage = 'swift' + url = 'https://example.com/file1' + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + exception.IronicException, + molds.get_configuration, + task, url) + + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_http(self, mock_get): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + response = mock.MagicMock() + response.status_code = 200 + response.json.return_value = {'key': 'value'} + mock_get.return_value = response + url = 'https://example.com/file2' + + with task_manager.acquire(self.context, self.node.uuid) as task: + result = molds.get_configuration(task, url) + + mock_get.assert_called_once_with( + url, headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + self.assertJsonEqual({"key": "value"}, result) + + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_http_noauth(self, mock_get): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = None + cfg.CONF.molds.password = None + response = mock.MagicMock() + response.status_code = 200 + response.json.return_value = {'key': 'value'} + mock_get.return_value = response + url = 'https://example.com/file2' + + with task_manager.acquire(self.context, self.node.uuid) as task: + result = molds.get_configuration(task, url) + + mock_get.assert_called_once_with(url, headers=None) + self.assertJsonEqual({"key": "value"}, result) + + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_http_error(self, mock_get): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + response = mock.MagicMock() + response.status_code = 404 + response.raise_for_status.side_effect = requests.exceptions.HTTPError + mock_get.return_value = response + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + requests.exceptions.HTTPError, + molds.get_configuration, + task, + 'https://example.com/file2') + mock_get.assert_called_once_with( + 'https://example.com/file2', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_connection_error(self, mock_get): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + cfg.CONF.molds.retry_interval = 0 + cfg.CONF.molds.retry_attempts = 3 + response = mock.MagicMock() + mock_get.side_effect = [ + requests.exceptions.ConnectTimeout, + requests.exceptions.ConnectionError, + response] + + with task_manager.acquire(self.context, self.node.uuid) as task: + molds.get_configuration( + task, 'https://example.com/file2') + mock_get.assert_called_with( + 'https://example.com/file2', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + self.assertEqual(mock_get.call_count, 3) + + @mock.patch.object(requests, 'get', autospec=True) + def test_get_configuration_mold_connection_error_exceeded(self, mock_get): + cfg.CONF.molds.storage = 'http' + cfg.CONF.molds.user = 'user' + cfg.CONF.molds.password = 'password' + cfg.CONF.molds.retry_interval = 0 + cfg.CONF.molds.retry_attempts = 2 + mock_get.side_effect = [ + requests.exceptions.ConnectTimeout, + requests.exceptions.ConnectionError] + + with task_manager.acquire(self.context, self.node.uuid) as task: + self.assertRaises( + requests.exceptions.ConnectionError, + molds.get_configuration, + task, + 'https://example.com/file2') + mock_get.assert_called_with( + 'https://example.com/file2', + headers={'Authorization': 'Basic dXNlcjpwYXNzd29yZA=='}) + self.assertEqual(mock_get.call_count, 2) |