Use unittest.mock instead of third party mock
Now that we no longer support py27, we can use the standard library unittest.mock module instead of the third party mock lib. Change-Id: I44ac9a021a0bc3249b86f252b53cee3c8059f185 Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
This commit is contained in:
parent
429c39890e
commit
74895a5cbe
@ -12,7 +12,6 @@ WebTest>=2.0.27 # MIT
|
|||||||
wsgi-intercept>=1.4.1 # MIT License
|
wsgi-intercept>=1.4.1 # MIT License
|
||||||
proboscis>=1.2.5.3 # Apache-2.0
|
proboscis>=1.2.5.3 # Apache-2.0
|
||||||
python-troveclient>=2.2.0 # Apache-2.0
|
python-troveclient>=2.2.0 # Apache-2.0
|
||||||
mock>=2.0.0 # BSD
|
|
||||||
testtools>=2.2.0 # MIT
|
testtools>=2.2.0 # MIT
|
||||||
pymongo!=3.1,>=3.0.2 # Apache-2.0
|
pymongo!=3.1,>=3.0.2 # Apache-2.0
|
||||||
redis>=2.10.0 # MIT
|
redis>=2.10.0 # MIT
|
||||||
|
@ -13,9 +13,10 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
|
||||||
from novaclient.exceptions import BadRequest
|
from novaclient.exceptions import BadRequest
|
||||||
from novaclient.v2.servers import Server
|
from novaclient.v2.servers import Server
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from oslo_messaging._drivers.common import RPCException
|
from oslo_messaging._drivers.common import RPCException
|
||||||
from proboscis import test
|
from proboscis import test
|
||||||
from testtools import TestCase
|
from testtools import TestCase
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
|
||||||
from novaclient.v2.servers import Server
|
from novaclient.v2.servers import Server
|
||||||
from proboscis import after_class
|
from proboscis import after_class
|
||||||
from proboscis.asserts import assert_equal
|
from proboscis.asserts import assert_equal
|
||||||
@ -20,6 +19,7 @@ from proboscis.asserts import assert_raises
|
|||||||
from proboscis import before_class
|
from proboscis import before_class
|
||||||
from proboscis import SkipTest
|
from proboscis import SkipTest
|
||||||
from proboscis import test
|
from proboscis import test
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from trove.backup import models as backup_models
|
from trove.backup import models as backup_models
|
||||||
from trove.backup import state
|
from trove.backup import state
|
||||||
|
@ -13,9 +13,10 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
import mock
|
|
||||||
import os
|
import os
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from six.moves import configparser as config_parser
|
from six.moves import configparser as config_parser
|
||||||
|
|
||||||
import trove
|
import trove
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import mock
|
|
||||||
import os
|
import os
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from mock import Mock, MagicMock, patch, ANY, DEFAULT, call
|
from mock import Mock, MagicMock, patch, ANY, DEFAULT, call
|
||||||
from oslo_utils import netutils
|
from oslo_utils import netutils
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from novaclient import exceptions as nova_exceptions
|
from novaclient import exceptions as nova_exceptions
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common import cfg
|
from trove.common import cfg
|
||||||
from trove.common.rpc import conductor_guest_serializer as gsz
|
from trove.common.rpc import conductor_guest_serializer as gsz
|
||||||
|
@ -14,8 +14,9 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
|
||||||
import os
|
import os
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from trove.common import crypto_utils
|
from trove.common import crypto_utils
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common.db import models
|
from trove.common.db import models
|
||||||
from trove.tests.unittests import trove_testtools
|
from trove.tests.unittests import trove_testtools
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common.rpc import serializer
|
from trove.common.rpc import serializer
|
||||||
from trove.tests.unittests import trove_testtools
|
from trove.tests.unittests import trove_testtools
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common import clients
|
from trove.common import clients
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
|
@ -12,7 +12,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
from eventlet import Timeout
|
from eventlet import Timeout
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
import oslo_messaging as messaging
|
import oslo_messaging as messaging
|
||||||
from oslo_messaging.rpc.client import RemoteError
|
from oslo_messaging.rpc.client import RemoteError
|
||||||
from testtools.matchers import Is
|
from testtools.matchers import Is
|
||||||
|
@ -12,18 +12,21 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
|
||||||
import os
|
import os
|
||||||
from mock import ANY, call, DEFAULT, Mock, patch, PropertyMock
|
from unittest import mock
|
||||||
|
from unittest.mock import ANY
|
||||||
|
from unittest.mock import call
|
||||||
|
from unittest.mock import DEFAULT
|
||||||
|
from unittest.mock import Mock
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
from testtools.testcase import ExpectedException
|
from testtools.testcase import ExpectedException
|
||||||
|
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
from trove.common import utils
|
from trove.common import utils
|
||||||
from trove.guestagent.common import configuration
|
from trove.guestagent.common import configuration
|
||||||
from trove.guestagent.common.configuration import ImportOverrideStrategy
|
from trove.guestagent.common.configuration import ImportOverrideStrategy
|
||||||
from trove.guestagent.common import operating_system
|
from trove.guestagent.common import operating_system
|
||||||
from trove.guestagent.datastore.experimental.cassandra import (
|
|
||||||
service as cass_service
|
|
||||||
)
|
|
||||||
from trove.guestagent.datastore.experimental.db2 import (
|
from trove.guestagent.datastore.experimental.db2 import (
|
||||||
service as db2_service)
|
service as db2_service)
|
||||||
from trove.guestagent.datastore.experimental.redis.service import RedisApp
|
from trove.guestagent.datastore.experimental.redis.service import RedisApp
|
||||||
@ -555,199 +558,6 @@ class GuestAgentBackupTest(trove_testtools.TestCase):
|
|||||||
restr.restore_cmd)
|
restr.restore_cmd)
|
||||||
|
|
||||||
|
|
||||||
class CassandraBackupTest(trove_testtools.TestCase):
|
|
||||||
|
|
||||||
_BASE_BACKUP_CMD = ('sudo tar --transform="s#snapshots/%s/##" -cpPf - '
|
|
||||||
'-C "%s" "%s"')
|
|
||||||
_BASE_RESTORE_CMD = 'sudo tar -xpPf - -C "%(restore_location)s"'
|
|
||||||
_DATA_DIR = 'data_dir'
|
|
||||||
_SNAPSHOT_NAME = 'snapshot_name'
|
|
||||||
_SNAPSHOT_FILES = {'foo.db', 'bar.db'}
|
|
||||||
_RESTORE_LOCATION = {'restore_location': '/var/lib/cassandra'}
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(CassandraBackupTest, self).setUp()
|
|
||||||
self.app_status_patcher = patch(
|
|
||||||
'trove.guestagent.datastore.experimental.cassandra.service.'
|
|
||||||
'CassandraAppStatus')
|
|
||||||
self.addCleanup(self.app_status_patcher.stop)
|
|
||||||
self.app_status_patcher.start()
|
|
||||||
self.get_data_dirs_patcher = patch.object(
|
|
||||||
cass_service.CassandraApp, 'cassandra_data_dir',
|
|
||||||
new_callable=PropertyMock)
|
|
||||||
self.addCleanup(self.get_data_dirs_patcher.stop)
|
|
||||||
data_dir_mock = self.get_data_dirs_patcher.start()
|
|
||||||
data_dir_mock.return_value = self._DATA_DIR
|
|
||||||
self.os_list_patcher = patch.object(
|
|
||||||
operating_system, 'list_files_in_directory',
|
|
||||||
return_value=self._SNAPSHOT_FILES)
|
|
||||||
self.addCleanup(self.os_list_patcher.stop)
|
|
||||||
self.os_list_patcher.start()
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(CassandraBackupTest, self).tearDown()
|
|
||||||
|
|
||||||
@patch('trove.guestagent.datastore.experimental.cassandra.service.LOG')
|
|
||||||
def test_backup_encrypted_zipped_nodetoolsnapshot_command(self, _):
|
|
||||||
bkp = self._build_backup_runner(True, True)
|
|
||||||
bkp._run_pre_backup()
|
|
||||||
self.assertIsNotNone(bkp)
|
|
||||||
self.assertEqual(self._BASE_BACKUP_CMD % (
|
|
||||||
self._SNAPSHOT_NAME,
|
|
||||||
self._DATA_DIR,
|
|
||||||
'" "'.join(self._SNAPSHOT_FILES)
|
|
||||||
) + PIPE + ZIP + PIPE + ENCRYPT, bkp.command)
|
|
||||||
self.assertIn(".gz.enc", bkp.manifest)
|
|
||||||
|
|
||||||
@patch('trove.guestagent.datastore.experimental.cassandra.service.LOG')
|
|
||||||
def test_backup_not_encrypted_not_zipped_nodetoolsnapshot_command(self, _):
|
|
||||||
bkp = self._build_backup_runner(False, False)
|
|
||||||
bkp._run_pre_backup()
|
|
||||||
self.assertIsNotNone(bkp)
|
|
||||||
self.assertEqual(self._BASE_BACKUP_CMD % (
|
|
||||||
self._SNAPSHOT_NAME,
|
|
||||||
self._DATA_DIR,
|
|
||||||
'" "'.join(self._SNAPSHOT_FILES)
|
|
||||||
), bkp.command)
|
|
||||||
self.assertNotIn(".gz.enc", bkp.manifest)
|
|
||||||
|
|
||||||
@patch('trove.guestagent.datastore.experimental.cassandra.service.LOG')
|
|
||||||
def test_backup_not_encrypted_but_zipped_nodetoolsnapshot_command(self, _):
|
|
||||||
bkp = self._build_backup_runner(False, True)
|
|
||||||
bkp._run_pre_backup()
|
|
||||||
self.assertIsNotNone(bkp)
|
|
||||||
self.assertEqual(self._BASE_BACKUP_CMD % (
|
|
||||||
self._SNAPSHOT_NAME,
|
|
||||||
self._DATA_DIR,
|
|
||||||
'" "'.join(self._SNAPSHOT_FILES)
|
|
||||||
) + PIPE + ZIP, bkp.command)
|
|
||||||
self.assertIn(".gz", bkp.manifest)
|
|
||||||
self.assertNotIn(".enc", bkp.manifest)
|
|
||||||
|
|
||||||
@patch('trove.guestagent.datastore.experimental.cassandra.service.LOG')
|
|
||||||
def test_backup_encrypted_but_not_zipped_nodetoolsnapshot_command(self, _):
|
|
||||||
bkp = self._build_backup_runner(True, False)
|
|
||||||
bkp._run_pre_backup()
|
|
||||||
self.assertIsNotNone(bkp)
|
|
||||||
self.assertEqual(self._BASE_BACKUP_CMD % (
|
|
||||||
self._SNAPSHOT_NAME,
|
|
||||||
self._DATA_DIR,
|
|
||||||
'" "'.join(self._SNAPSHOT_FILES)
|
|
||||||
) + PIPE + ENCRYPT, bkp.command)
|
|
||||||
self.assertIn(".enc", bkp.manifest)
|
|
||||||
self.assertNotIn(".gz", bkp.manifest)
|
|
||||||
|
|
||||||
@mock.patch.object(ImportOverrideStrategy, '_initialize_import_directory')
|
|
||||||
@patch('trove.guestagent.datastore.experimental.cassandra.service.LOG')
|
|
||||||
def test_restore_encrypted_but_not_zipped_nodetoolsnapshot_command(
|
|
||||||
self, mock_logging, _):
|
|
||||||
restoreBase.RestoreRunner.is_zipped = False
|
|
||||||
restoreBase.RestoreRunner.is_encrypted = True
|
|
||||||
restoreBase.RestoreRunner.decrypt_key = CRYPTO_KEY
|
|
||||||
RunnerClass = utils.import_class(RESTORE_NODETOOLSNAPSHOT_CLS)
|
|
||||||
rstr = RunnerClass(None, restore_location=self._RESTORE_LOCATION,
|
|
||||||
location="filename", checksum="md5")
|
|
||||||
self.assertIsNotNone(rstr)
|
|
||||||
self.assertEqual(self._BASE_RESTORE_CMD % self._RESTORE_LOCATION,
|
|
||||||
rstr.base_restore_cmd % self._RESTORE_LOCATION)
|
|
||||||
|
|
||||||
@mock.patch.object(ImportOverrideStrategy, '_initialize_import_directory')
|
|
||||||
def _build_backup_runner(self, is_encrypted, is_zipped, _):
|
|
||||||
backupBase.BackupRunner.is_zipped = is_zipped
|
|
||||||
backupBase.BackupRunner.is_encrypted = is_encrypted
|
|
||||||
backupBase.BackupRunner.encrypt_key = CRYPTO_KEY
|
|
||||||
RunnerClass = utils.import_class(BACKUP_NODETOOLSNAPSHOT_CLS)
|
|
||||||
runner = RunnerClass(self._SNAPSHOT_NAME)
|
|
||||||
runner._remove_snapshot = mock.MagicMock()
|
|
||||||
runner._snapshot_all_keyspaces = mock.MagicMock()
|
|
||||||
runner._find_in_subdirectories = mock.MagicMock(
|
|
||||||
return_value=self._SNAPSHOT_FILES
|
|
||||||
)
|
|
||||||
|
|
||||||
return runner
|
|
||||||
|
|
||||||
|
|
||||||
class CouchbaseBackupTests(trove_testtools.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(CouchbaseBackupTests, self).setUp()
|
|
||||||
self.exec_timeout_patch = patch.object(utils, 'execute_with_timeout',
|
|
||||||
return_value=('0', ''))
|
|
||||||
self.exec_timeout_patch.start()
|
|
||||||
self.backup_runner = utils.import_class(BACKUP_CBBACKUP_CLS)
|
|
||||||
self.backup_runner_patch = patch.multiple(
|
|
||||||
self.backup_runner, _run=DEFAULT,
|
|
||||||
_run_pre_backup=DEFAULT, _run_post_backup=DEFAULT)
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(CouchbaseBackupTests, self).tearDown()
|
|
||||||
self.backup_runner_patch.stop()
|
|
||||||
self.exec_timeout_patch.stop()
|
|
||||||
|
|
||||||
def test_backup_success(self):
|
|
||||||
backup_runner_mocks = self.backup_runner_patch.start()
|
|
||||||
with self.backup_runner(12345):
|
|
||||||
pass
|
|
||||||
|
|
||||||
backup_runner_mocks['_run_pre_backup'].assert_called_once_with()
|
|
||||||
backup_runner_mocks['_run'].assert_called_once_with()
|
|
||||||
backup_runner_mocks['_run_post_backup'].assert_called_once_with()
|
|
||||||
|
|
||||||
def test_backup_failed_due_to_run_backup(self):
|
|
||||||
backup_runner_mocks = self.backup_runner_patch.start()
|
|
||||||
backup_runner_mocks['_run'].configure_mock(
|
|
||||||
side_effect=exception.TroveError('test')
|
|
||||||
)
|
|
||||||
with ExpectedException(exception.TroveError, 'test'):
|
|
||||||
with self.backup_runner(12345):
|
|
||||||
pass
|
|
||||||
|
|
||||||
backup_runner_mocks['_run_pre_backup'].assert_called_once_with()
|
|
||||||
backup_runner_mocks['_run'].assert_called_once_with()
|
|
||||||
self.assertEqual(0, backup_runner_mocks['_run_post_backup'].call_count)
|
|
||||||
|
|
||||||
|
|
||||||
class CouchbaseRestoreTests(trove_testtools.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(CouchbaseRestoreTests, self).setUp()
|
|
||||||
|
|
||||||
self.restore_runner = utils.import_class(
|
|
||||||
RESTORE_CBBACKUP_CLS)(
|
|
||||||
'swift', location='http://some.where',
|
|
||||||
checksum='True_checksum',
|
|
||||||
restore_location='/tmp/somewhere')
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(CouchbaseRestoreTests, self).tearDown()
|
|
||||||
|
|
||||||
def test_restore_success(self):
|
|
||||||
expected_content_length = 123
|
|
||||||
self.restore_runner._run_restore = mock.Mock(
|
|
||||||
return_value=expected_content_length)
|
|
||||||
self.restore_runner.pre_restore = mock.Mock()
|
|
||||||
self.restore_runner.post_restore = mock.Mock()
|
|
||||||
actual_content_length = self.restore_runner.restore()
|
|
||||||
self.assertEqual(
|
|
||||||
expected_content_length, actual_content_length)
|
|
||||||
|
|
||||||
def test_restore_failed_due_to_pre_restore(self):
|
|
||||||
self.restore_runner.post_restore = mock.Mock()
|
|
||||||
self.restore_runner.pre_restore = mock.Mock(
|
|
||||||
side_effect=exception.ProcessExecutionError('Error'))
|
|
||||||
self.restore_runner._run_restore = mock.Mock()
|
|
||||||
self.assertRaises(exception.ProcessExecutionError,
|
|
||||||
self.restore_runner.restore)
|
|
||||||
|
|
||||||
def test_restore_failed_due_to_run_restore(self):
|
|
||||||
self.restore_runner.pre_restore = mock.Mock()
|
|
||||||
self.restore_runner._run_restore = mock.Mock(
|
|
||||||
side_effect=exception.ProcessExecutionError('Error'))
|
|
||||||
self.restore_runner.post_restore = mock.Mock()
|
|
||||||
self.assertRaises(exception.ProcessExecutionError,
|
|
||||||
self.restore_runner.restore)
|
|
||||||
|
|
||||||
|
|
||||||
class MongodbBackupTests(trove_testtools.TestCase):
|
class MongodbBackupTests(trove_testtools.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
import tempfile
|
import tempfile
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
import mock
|
|
||||||
from mock import DEFAULT
|
from mock import DEFAULT
|
||||||
from mock import MagicMock
|
from mock import MagicMock
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from eventlet import Timeout
|
from eventlet import Timeout
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
import trove.common.context as context
|
import trove.common.context as context
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
|
||||||
import pycodestyle
|
import pycodestyle
|
||||||
import textwrap
|
import textwrap
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from trove.hacking import checks as tc
|
from trove.hacking import checks as tc
|
||||||
from trove.tests.unittests import trove_testtools
|
from trove.tests.unittests import trove_testtools
|
||||||
|
@ -14,9 +14,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import mock
|
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
from mock import patch
|
from mock import patch
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common import context
|
from trove.common import context
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
|
@ -13,11 +13,11 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
import os
|
import os
|
||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from cinderclient import exceptions as cinder_exceptions
|
from cinderclient import exceptions as cinder_exceptions
|
||||||
import cinderclient.v2.client as cinderclient
|
import cinderclient.v2.client as cinderclient
|
||||||
from cinderclient.v2 import volumes as cinderclient_volumes
|
from cinderclient.v2 import volumes as cinderclient_volumes
|
||||||
import mock
|
|
||||||
from mock import Mock, MagicMock, patch, PropertyMock, call
|
from mock import Mock, MagicMock, patch, PropertyMock, call
|
||||||
import neutronclient.v2_0.client as neutronclient
|
import neutronclient.v2_0.client as neutronclient
|
||||||
from novaclient import exceptions as nova_exceptions
|
from novaclient import exceptions as nova_exceptions
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
import mock
|
|
||||||
import testtools
|
import testtools
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common import cfg
|
from trove.common import cfg
|
||||||
from trove.common.context import TroveContext
|
from trove.common.context import TroveContext
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.common import clients
|
from trove.common import clients
|
||||||
from trove.tests.unittests import trove_testtools
|
from trove.tests.unittests import trove_testtools
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
|
|
||||||
import mock
|
from unittest import mock
|
||||||
|
|
||||||
from trove.tests.unittests import trove_testtools
|
from trove.tests.unittests import trove_testtools
|
||||||
from trove.volume_type import views
|
from trove.volume_type import views
|
||||||
|
Loading…
Reference in New Issue
Block a user