Files
trove/trove/tests/unittests/guestagent/test_couchdb_manager.py
T
Petr Malik c45eb67018 Unittests patch 'CONF.datastore_manager'
Unittests do not have 'CONF.datastore_manager' set (None).

As the result all datastore manager/app tests that access
configuration by the manager name get the default 'mysql' values.
Apart from not testing the production configuration this
also makes it difficult to test dynamically looked up
datastore-specific properties which do not exist in the mysql
group at all.

This patch set adds a helper method for patching any given
configuration property and also adds a simple interface for
patching the manager name to the base TestCase.

All existing manager/app tests were updated to properly patch the manager
property.
The base test patches the manager name to 'mysql' so that
all unittests run with this manager unless explicitly overriden.

It's now safe to remove the manager parameter from the
'cfg.get_configuration_property()' function. It was there
to work around this issue in unittests.

Change-Id: I903a0fb1ede8ad6614d2b5a8fc1a256f74412496
2016-05-27 21:15:35 +00:00

315 lines
14 KiB
Python

# Copyright 2015 IBM Corp.
#
# 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.
import os
from mock import MagicMock
from mock import patch
from oslo_utils import netutils
from testtools.matchers import Is, Equals, Not
from trove.common.instance import ServiceStatuses
from trove.guestagent import backup
from trove.guestagent.datastore.experimental.couchdb import (
manager as couchdb_manager)
from trove.guestagent.datastore.experimental.couchdb import (
service as couchdb_service)
from trove.guestagent import pkg as pkg
from trove.guestagent import volume
from trove.tests.unittests.guestagent.test_datastore_manager import \
DatastoreManagerTest
class GuestAgentCouchDBManagerTest(DatastoreManagerTest):
def setUp(self):
super(GuestAgentCouchDBManagerTest, self).setUp('couchdb')
self.real_status = couchdb_service.CouchDBAppStatus.set_status
class FakeInstanceServiceStatus(object):
status = ServiceStatuses.NEW
def save(self):
pass
couchdb_service.CouchDBAppStatus.set_status = MagicMock(
return_value=FakeInstanceServiceStatus())
self.manager = couchdb_manager.Manager()
self.pkg = couchdb_service.packager
self.real_db_app_status = couchdb_service.CouchDBAppStatus
self.origin_os_path_exists = os.path.exists
self.origin_format = volume.VolumeDevice.format
self.origin_migrate_data = volume.VolumeDevice.migrate_data
self.origin_mount = volume.VolumeDevice.mount
self.origin_mount_points = volume.VolumeDevice.mount_points
self.origin_stop_db = couchdb_service.CouchDBApp.stop_db
self.origin_start_db = couchdb_service.CouchDBApp.start_db
self.original_get_ip = netutils.get_my_ipv4
self.orig_make_host_reachable = (
couchdb_service.CouchDBApp.make_host_reachable)
self.orig_backup_restore = backup.restore
self.orig_create_users = couchdb_service.CouchDBAdmin.create_user
self.orig_delete_user = couchdb_service.CouchDBAdmin.delete_user
self.orig_list_users = couchdb_service.CouchDBAdmin.list_users
self.orig_get_user = couchdb_service.CouchDBAdmin.get_user
self.orig_grant_access = couchdb_service.CouchDBAdmin.grant_access
self.orig_revoke_access = couchdb_service.CouchDBAdmin.revoke_access
self.orig_list_access = couchdb_service.CouchDBAdmin.list_access
self.orig_enable_root = couchdb_service.CouchDBAdmin.enable_root
self.orig_is_root_enabled = (
couchdb_service.CouchDBAdmin.is_root_enabled)
self.orig_create_databases = (
couchdb_service.CouchDBAdmin.create_database)
self.orig_list_databases = couchdb_service.CouchDBAdmin.list_databases
self.orig_delete_database = (
couchdb_service.CouchDBAdmin.delete_database)
def tearDown(self):
super(GuestAgentCouchDBManagerTest, self).tearDown()
couchdb_service.packager = self.pkg
couchdb_service.CouchDBAppStatus.set_status = self.real_db_app_status
os.path.exists = self.origin_os_path_exists
volume.VolumeDevice.format = self.origin_format
volume.VolumeDevice.migrate_data = self.origin_migrate_data
volume.VolumeDevice.mount = self.origin_mount
volume.VolumeDevice.mount_points = self.origin_mount_points
couchdb_service.CouchDBApp.stop_db = self.origin_stop_db
couchdb_service.CouchDBApp.start_db = self.origin_start_db
netutils.get_my_ipv4 = self.original_get_ip
couchdb_service.CouchDBApp.make_host_reachable = (
self.orig_make_host_reachable)
backup.restore = self.orig_backup_restore
couchdb_service.CouchDBAdmin.create_user = self.orig_create_users
couchdb_service.CouchDBAdmin.delete_user = self.orig_delete_user
couchdb_service.CouchDBAdmin.list_users = self.orig_list_users
couchdb_service.CouchDBAdmin.get_user = self.orig_get_user
couchdb_service.CouchDBAdmin.grant_access = self.orig_grant_access
couchdb_service.CouchDBAdmin.revoke_access = self.orig_revoke_access
couchdb_service.CouchDBAdmin.list_access = self.orig_list_access
couchdb_service.CouchDBAdmin.enable_root = self.orig_enable_root
couchdb_service.CouchDBAdmin.is_root_enabled = (
self.orig_is_root_enabled)
couchdb_service.CouchDBAdmin.create_database = (
self.orig_create_databases)
couchdb_service.CouchDBAdmin.list_databases = self.orig_list_databases
couchdb_service.CouchDBAdmin.delete_database = (
self.orig_delete_database)
def test_update_status(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
self.manager.update_status(self.context)
mock_status.update.assert_any_call()
def _prepare_dynamic(self, packages=None, databases=None,
config_content=None, device_path='/dev/vdb',
is_db_installed=True, backup_id=None,
overrides=None):
mock_status = MagicMock()
mock_app = MagicMock()
self.manager.appStatus = mock_status
self.manager.app = mock_app
mount_point = '/var/lib/couchdb'
mock_status.begin_install = MagicMock(return_value=None)
mock_app.install_if_needed = MagicMock(return_value=None)
mock_app.make_host_reachable = MagicMock(return_value=None)
mock_app.restart = MagicMock(return_value=None)
mock_app.start_db = MagicMock(return_value=None)
mock_app.stop_db = MagicMock(return_value=None)
os.path.exists = MagicMock(return_value=True)
volume.VolumeDevice.format = MagicMock(return_value=None)
volume.VolumeDevice.migrate_data = MagicMock(return_value=None)
volume.VolumeDevice.mount = MagicMock(return_value=None)
volume.VolumeDevice.mount_points = MagicMock(return_value=[])
backup.restore = MagicMock(return_value=None)
backup_info = {'id': backup_id,
'location': 'fake-location',
'type': 'CouchDBBackup',
'checksum': 'fake-checksum'} if backup_id else None
couchdb_service.CouchDBAdmin.create_database = MagicMock(
return_value=None)
couchdb_service.CouchDBAdmin.create_user = MagicMock(return_value=None)
with patch.object(pkg.Package, 'pkg_is_installed',
return_value=MagicMock(
return_value=is_db_installed)):
self.manager.prepare(context=self.context, packages=packages,
config_contents=config_content,
databases=databases,
memory_mb='2048', users=None,
device_path=device_path,
mount_point=mount_point,
backup_info=backup_info,
overrides=None,
cluster_config=None)
# verification/assertion
mock_status.begin_install.assert_any_call()
mock_app.install_if_needed.assert_any_call(packages)
mock_app.make_host_reachable.assert_any_call()
mock_app.change_permissions.assert_any_call()
if backup_id:
backup.restore.assert_any_call(self.context,
backup_info,
mount_point)
def test_prepare_pkg(self):
self._prepare_dynamic(['couchdb'])
def test_prepare_no_pkg(self):
self._prepare_dynamic([])
def test_prepare_from_backup(self):
self._prepare_dynamic(['couchdb'], backup_id='123abc456')
def test_prepare_database(self):
self._prepare_dynamic(databases=['db1'])
def test_restart(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
with patch.object(couchdb_service.CouchDBApp, 'restart',
return_value=None):
# invocation
self.manager.restart(self.context)
# verification/assertion
couchdb_service.CouchDBApp.restart.assert_any_call()
def test_stop_db(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBApp.stop_db = MagicMock(return_value=None)
# invocation
self.manager.stop_db(self.context)
# verification/assertion
couchdb_service.CouchDBApp.stop_db.assert_any_call(
do_not_start_on_reboot=False)
def test_reset_configuration(self):
try:
configuration = {'config_contents': 'some junk'}
self.manager.reset_configuration(self.context, configuration)
except Exception:
self.fail("reset_configuration raised exception unexpectedly.")
def test_rpc_ping(self):
output = self.manager.rpc_ping(self.context)
self.assertTrue(output)
def test_create_user(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.create_user = MagicMock(return_value=None)
self.manager.create_user(self.context, ['user1'])
couchdb_service.CouchDBAdmin.create_user.assert_any_call(['user1'])
def test_delete_user(self):
user = ['user1']
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.delete_user = MagicMock(return_value=None)
self.manager.delete_user(self.context, user)
couchdb_service.CouchDBAdmin.delete_user.assert_any_call(user)
def test_list_users(self):
couchdb_service.CouchDBAdmin.list_users = MagicMock(
return_value=['user1'])
users = self.manager.list_users(self.context)
self.assertThat(users, Equals(['user1']))
couchdb_service.CouchDBAdmin.list_users.assert_any_call(
None, None, False)
def test_get_user(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.get_user = MagicMock(
return_value=['user1'])
self.manager.get_user(self.context, 'user1', None)
couchdb_service.CouchDBAdmin.get_user.assert_any_call(
'user1', None)
def test_grant_access(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.grant_access = MagicMock(
return_value=None)
self.manager.grant_access(self.context, 'user1', None, ['db1'])
couchdb_service.CouchDBAdmin.grant_access.assert_any_call(
'user1', ['db1'])
def test_revoke_access(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.revoke_access = MagicMock(
return_value=None)
self.manager.revoke_access(self.context, 'user1', None, ['db1'])
couchdb_service.CouchDBAdmin.revoke_access.assert_any_call(
'user1', ['db1'])
def test_list_access(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.list_access = MagicMock(
return_value=['user1'])
self.manager.list_access(self.context, 'user1', None)
couchdb_service.CouchDBAdmin.list_access.assert_any_call(
'user1', None)
def test_enable_root(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.enable_root = MagicMock(
return_value=True)
result = self.manager.enable_root(self.context)
self.assertThat(result, Equals(True))
def test_is_root_enabled(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.is_root_enabled = MagicMock(
return_value=True)
result = self.manager.is_root_enabled(self.context)
self.assertThat(result, Equals(True))
def test_create_databases(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.create_database = MagicMock(
return_value=None)
self.manager.create_database(self.context, ['db1'])
couchdb_service.CouchDBAdmin.create_database.assert_any_call(['db1'])
def test_delete_database(self):
databases = ['db1']
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.delete_database = MagicMock(
return_value=None)
self.manager.delete_database(self.context, databases)
couchdb_service.CouchDBAdmin.delete_database.assert_any_call(
databases)
def test_list_databases(self):
mock_status = MagicMock()
self.manager.appStatus = mock_status
couchdb_service.CouchDBAdmin.list_databases = MagicMock(
return_value=['database1'])
databases = self.manager.list_databases(self.context)
self.assertThat(databases, Not(Is(None)))
self.assertThat(databases, Equals(['database1']))
couchdb_service.CouchDBAdmin.list_databases.assert_any_call(
None, None, False)