Remove mockito, and replace with mock
There are unit tests in trove which are dependent on mockito. This fixes them to use the standard mock library which is a part of global_requirements. Co-Authored-By: Justin Hopper <justin.hopper@hp.com> Implements-bp: remove-mockito Change-Id: Ic030cc846d9e7d0c9077240b0fac90f4f66a5a42
This commit is contained in:
parent
45a868aa63
commit
3668abcca1
@ -18,4 +18,3 @@ mox>=0.5.3
|
||||
testtools>=0.9.32
|
||||
discover
|
||||
testrepository>=0.0.17
|
||||
mockito
|
||||
|
@ -1,10 +1,3 @@
|
||||
import uuid
|
||||
import logging
|
||||
from mockito import when, any
|
||||
import swiftclient.client as swift_client
|
||||
import swiftclient
|
||||
|
||||
|
||||
# Copyright (C) 2012 Hewlett-Packard Development Company, L.P.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@ -24,7 +17,12 @@ import httplib
|
||||
import json
|
||||
import os
|
||||
import socket
|
||||
import uuid
|
||||
import logging
|
||||
import swiftclient.client as swift_client
|
||||
import swiftclient
|
||||
from hashlib import md5
|
||||
from mock import MagicMock
|
||||
|
||||
from swiftclient import client as swift
|
||||
|
||||
@ -260,10 +258,6 @@ class SwiftClientStub(object):
|
||||
|
||||
def __init__(self):
|
||||
self._connection = swift_client.Connection()
|
||||
# simulate getting an unknown container
|
||||
when(swift_client.Connection).get_container(any()).thenRaise(
|
||||
swiftclient.ClientException('Resource Not Found', http_status=404))
|
||||
|
||||
self._containers = {}
|
||||
self._containers_list = []
|
||||
self._objects = {}
|
||||
@ -302,7 +296,7 @@ class SwiftClientStub(object):
|
||||
'content-type': 'application/json; charset=utf-8',
|
||||
'x-account-object-count': '0'}, self._containers_list)
|
||||
|
||||
when(swift_client.Connection).get_auth().thenReturn((
|
||||
swift_client.Connection.get_auth = MagicMock(return_value=(
|
||||
u"http://127.0.0.1:8080/v1/AUTH_c7b038976df24d96bf1980f5da17bd89",
|
||||
u'MIINrwYJKoZIhvcNAQcCoIINoDCCDZwCAQExCTAHBgUrDgMCGjCCDIgGCSqGSIb3'
|
||||
u'DQEHAaCCDHkEggx1eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAi'
|
||||
@ -312,7 +306,8 @@ class SwiftClientStub(object):
|
||||
u'ZWRkd2FyZiIsICJpZCI6ICJjN2IwMzg5NzZkZjI0ZDk2YmYxOTgwZjVkYTE3YmQ4'
|
||||
u'OSJ9fSwgInNlcnZpY2VDYXRhbG9nIjogW3siZW5kcG9pbnRzIjogW3siYWRtaW5')
|
||||
)
|
||||
when(swift_client.Connection).get_account().thenReturn(account_resp())
|
||||
swift_client.Connection.get_account = MagicMock(
|
||||
return_value=account_resp())
|
||||
return self
|
||||
|
||||
def _create_container(self, container_name):
|
||||
@ -356,12 +351,19 @@ class SwiftClientStub(object):
|
||||
self._objects[container])
|
||||
|
||||
# if this is called multiple times then nothing happens
|
||||
when(swift_client.Connection).put_container(container_name).thenReturn(
|
||||
None)
|
||||
swift_client.Connection.put_container = MagicMock(return_value=None)
|
||||
|
||||
def side_effect_func(*args, **kwargs):
|
||||
if args[0] in self._containers:
|
||||
return container_resp(args[0])
|
||||
else:
|
||||
raise swiftclient.ClientException('Resource Not Found',
|
||||
http_status=404)
|
||||
|
||||
self._create_container(container_name)
|
||||
# return container headers
|
||||
when(swift_client.Connection).get_container(container_name).thenReturn(
|
||||
container_resp(container_name))
|
||||
swift_client.Connection.get_container = MagicMock(
|
||||
side_effect=side_effect_func)
|
||||
|
||||
return self
|
||||
|
||||
@ -384,12 +386,6 @@ class SwiftClientStub(object):
|
||||
"""
|
||||
# first ensure container
|
||||
self._ensure_container_exists(container)
|
||||
# allow one call to get container and then throw exceptions (may need
|
||||
# to be revised
|
||||
when(swift_client.Connection).delete_container(container).thenRaise(
|
||||
swiftclient.ClientException("Resource Not Found", http_status=404))
|
||||
when(swift_client.Connection).get_container(container).thenRaise(
|
||||
swiftclient.ClientException("Resource Not Found", http_status=404))
|
||||
self._delete_container(container)
|
||||
return self
|
||||
|
||||
@ -415,24 +411,35 @@ class SwiftClientStub(object):
|
||||
:param contents: the contents of the object
|
||||
"""
|
||||
|
||||
self._connection.get_container(container)
|
||||
when(swift_client.Connection).put_object(container, name,
|
||||
contents).thenReturn(
|
||||
uuid.uuid1())
|
||||
when(swift_client.Connection).get_object(container, name).thenReturn(
|
||||
({'content-length': len(contents), 'accept-ranges': 'bytes',
|
||||
'last-modified': 'Mon, 10 Mar 2013 01:06:34 GMT',
|
||||
'etag': 'eb15a6874ce265e2c3eb1b4891567bab',
|
||||
'x-timestamp': '1363568794.67584',
|
||||
'x-trans-id': 'txef3aaf26c897420c8e77c9750ce6a501',
|
||||
'date': 'Mon, 10 Mar 2013 05:35:14 GMT',
|
||||
'content-type': 'application/octet-stream'}, contents)
|
||||
)
|
||||
swift_client.Connection.put_object = MagicMock(
|
||||
return_value=uuid.uuid1())
|
||||
|
||||
def side_effect_func(*args, **kwargs):
|
||||
if (args[0] in self._containers and
|
||||
args[1] in map(lambda x: x['name'],
|
||||
self._objects[args[0]])):
|
||||
return (
|
||||
{'content-length': len(contents), 'accept-ranges': 'bytes',
|
||||
'last-modified': 'Mon, 10 Mar 2013 01:06:34 GMT',
|
||||
'etag': 'eb15a6874ce265e2c3eb1b4891567bab',
|
||||
'x-timestamp': '1363568794.67584',
|
||||
'x-trans-id': 'txef3aaf26c897420c8e77c9750ce6a501',
|
||||
'date': 'Mon, 10 Mar 2013 05:35:14 GMT',
|
||||
'content-type': 'application/octet-stream'},
|
||||
[obj for obj in self._objects[args[0]]
|
||||
if obj['name'] == args[1]][0]['contents'])
|
||||
else:
|
||||
raise swiftclient.ClientException('Resource Not Found',
|
||||
http_status=404)
|
||||
|
||||
swift_client.Connection.get_object = MagicMock(
|
||||
side_effect=side_effect_func)
|
||||
|
||||
self._remove_object(name, self._objects[container])
|
||||
self._objects[container].append(
|
||||
{'bytes': 13, 'last_modified': '2013-03-15T22:10:49.361950',
|
||||
'hash': 'ccc55aefbf92aa66f42b638802c5e7f6', 'name': name,
|
||||
'content_type': 'application/octet-stream'})
|
||||
'content_type': 'application/octet-stream', 'contents': contents})
|
||||
return self
|
||||
|
||||
def without_object(self, container, name):
|
||||
@ -455,13 +462,18 @@ class SwiftClientStub(object):
|
||||
"""
|
||||
self._ensure_container_exists(container)
|
||||
self._ensure_object_exists(container, name)
|
||||
# throw exception if someone calls get object
|
||||
when(swift_client.Connection).get_object(container, name).thenRaise(
|
||||
swiftclient.ClientException('Resource Not found', http_status=404))
|
||||
when(swift_client.Connection).delete_object(
|
||||
container, name).thenReturn(None).thenRaise(
|
||||
swiftclient.ClientException('Resource Not Found',
|
||||
http_status=404))
|
||||
|
||||
def side_effect_func(*args, **kwargs):
|
||||
if not [obj for obj in self._objects[args[0]]
|
||||
if obj['name'] == [args[1]]]:
|
||||
raise swiftclient.ClientException('Resource Not found',
|
||||
http_status=404)
|
||||
else:
|
||||
return None
|
||||
|
||||
swift_client.Connection.delete_object = MagicMock(
|
||||
side_effect=side_effect_func)
|
||||
|
||||
self._remove_object(name, self._objects[container])
|
||||
return self
|
||||
|
||||
|
@ -23,7 +23,7 @@ from trove.quota.models import Quota
|
||||
import testtools
|
||||
import webob
|
||||
|
||||
from mockito import when, mock, any
|
||||
from mock import Mock, MagicMock
|
||||
from trove.common import limits
|
||||
from trove.common.limits import Limit
|
||||
from trove.limits import views
|
||||
@ -55,9 +55,10 @@ class LimitsControllerTest(BaseLimitTestSuite):
|
||||
def test_limit_index_empty(self):
|
||||
limit_controller = LimitsController()
|
||||
|
||||
req = mock()
|
||||
req = MagicMock()
|
||||
req.environ = {}
|
||||
when(QUOTAS).get_all_quotas_by_tenant(any()).thenReturn({})
|
||||
|
||||
QUOTAS.get_all_quotas_by_tenant = MagicMock(return_value={})
|
||||
|
||||
view = limit_controller.index(req, "test_tenant_id")
|
||||
expected = {'limits': [{'verb': 'ABSOLUTE'}]}
|
||||
@ -118,10 +119,11 @@ class LimitsControllerTest(BaseLimitTestSuite):
|
||||
resource="volumes",
|
||||
hard_limit=55)}
|
||||
|
||||
req = mock()
|
||||
req = MagicMock()
|
||||
req.environ = {"trove.limits": limits}
|
||||
|
||||
when(QUOTAS).get_all_quotas_by_tenant(tenant_id).thenReturn(abs_limits)
|
||||
QUOTAS.get_all_quotas_by_tenant = MagicMock(return_value=abs_limits)
|
||||
|
||||
view = limit_controller.index(req, tenant_id)
|
||||
|
||||
expected = {
|
||||
@ -239,7 +241,8 @@ class LimitTest(BaseLimitTestSuite):
|
||||
def test_GET_no_delay(self):
|
||||
# Test a limit handles 1 GET per second.
|
||||
limit = Limit("GET", "*", ".*", 1, 1)
|
||||
when(limit)._get_time().thenReturn(0.0)
|
||||
|
||||
limit._get_time = MagicMock(return_value=0.0)
|
||||
delay = limit("GET", "/anything")
|
||||
self.assertEqual(None, delay)
|
||||
self.assertEqual(0, limit.next_request)
|
||||
@ -248,7 +251,7 @@ class LimitTest(BaseLimitTestSuite):
|
||||
def test_GET_delay(self):
|
||||
# Test two calls to 1 GET per second limit.
|
||||
limit = Limit("GET", "*", ".*", 1, 1)
|
||||
when(limit)._get_time().thenReturn(0.0)
|
||||
limit._get_time = MagicMock(return_value=0.0)
|
||||
|
||||
delay = limit("GET", "/anything")
|
||||
self.assertEqual(None, delay)
|
||||
@ -258,7 +261,7 @@ class LimitTest(BaseLimitTestSuite):
|
||||
self.assertEqual(1, limit.next_request)
|
||||
self.assertEqual(0, limit.last_request)
|
||||
|
||||
when(limit)._get_time().thenReturn(4.0)
|
||||
limit._get_time = MagicMock(return_value=4.0)
|
||||
|
||||
delay = limit("GET", "/anything")
|
||||
self.assertEqual(None, delay)
|
||||
@ -337,17 +340,16 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
Tests for the in-memory `limits.Limiter` class.
|
||||
"""
|
||||
|
||||
def update_limits(self, delay):
|
||||
for l in TEST_LIMITS:
|
||||
when(l)._get_time().thenReturn(delay)
|
||||
def update_limits(self, delay, limit_list):
|
||||
for ln in limit_list:
|
||||
ln._get_time = Mock(return_value=delay)
|
||||
|
||||
def setUp(self):
|
||||
"""Run before each test."""
|
||||
super(LimiterTest, self).setUp()
|
||||
userlimits = {'user:user3': ''}
|
||||
|
||||
self.update_limits(0.0)
|
||||
|
||||
self.update_limits(0.0, TEST_LIMITS)
|
||||
self.limiter = limits.Limiter(TEST_LIMITS, **userlimits)
|
||||
|
||||
def _check(self, num, verb, url, username=None):
|
||||
@ -413,7 +415,7 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
# Advance time
|
||||
self.update_limits(6.0)
|
||||
self.update_limits(6.0, self.limiter.levels[None])
|
||||
|
||||
expected = [None, 6.0]
|
||||
results = list(self._check(2, "PUT", "/anything"))
|
||||
@ -425,7 +427,7 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
results = list(self._check(20, "PUT", "/anything"))
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
self.update_limits(1.0)
|
||||
self.update_limits(1.0, self.limiter.levels[None])
|
||||
|
||||
expected = [5.0] * 10
|
||||
results = list(self._check(10, "PUT", "/anything"))
|
||||
@ -438,7 +440,7 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
def test_multiple_users(self):
|
||||
# Tests involving multiple users.
|
||||
# User1
|
||||
self.update_limits(0.0)
|
||||
self.update_limits(0.0, self.limiter.levels["user1"])
|
||||
expected = [None] * 10 + [6.0] * 10
|
||||
results = list(self._check(20, "PUT", "/anything", "user1"))
|
||||
self.assertEqual(expected, results)
|
||||
@ -453,15 +455,14 @@ class LimiterTest(BaseLimitTestSuite):
|
||||
results = list(self._check(20, "PUT", "/anything", "user3"))
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
self.update_limits(1.0)
|
||||
# User1 again
|
||||
self.update_limits(1.0, self.limiter.levels["user1"])
|
||||
expected = [5.0] * 10
|
||||
results = list(self._check(10, "PUT", "/anything", "user1"))
|
||||
self.assertEqual(expected, results)
|
||||
|
||||
self.update_limits(2.0)
|
||||
|
||||
# User1 again
|
||||
# User2 again
|
||||
self.update_limits(2.0, self.limiter.levels["user2"])
|
||||
expected = [4.0] * 5
|
||||
results = list(self._check(5, "PUT", "/anything", "user2"))
|
||||
self.assertEqual(expected, results)
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
|
||||
import datetime
|
||||
from mockito import mock, when, unstub, any
|
||||
from mock import MagicMock, patch
|
||||
import testtools
|
||||
|
||||
from trove.backup import models
|
||||
@ -48,65 +48,76 @@ class BackupCreateTest(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(BackupCreateTest, self).tearDown()
|
||||
unstub()
|
||||
if self.created:
|
||||
models.DBBackup.find_by(
|
||||
tenant_id=self.context.tenant).delete()
|
||||
|
||||
def test_create(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(instance).validate_can_perform_action().thenReturn(None)
|
||||
when(models.Backup).validate_can_perform_action(
|
||||
any(), any()).thenReturn(None)
|
||||
when(models.Backup).verify_swift_auth_token(any()).thenReturn(
|
||||
None)
|
||||
when(api.API).create_backup(any()).thenReturn(None)
|
||||
instance = MagicMock()
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
return_value=None)
|
||||
with patch.object(models.Backup, 'validate_can_perform_action',
|
||||
return_value=None):
|
||||
with patch.object(models.Backup, 'verify_swift_auth_token',
|
||||
return_value=None):
|
||||
api.API.create_backup = MagicMock(return_value=None)
|
||||
bu = models.Backup.create(self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
self.created = True
|
||||
|
||||
bu = models.Backup.create(self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
self.created = True
|
||||
self.assertEqual(BACKUP_NAME, bu.name)
|
||||
self.assertEqual(BACKUP_DESC, bu.description)
|
||||
self.assertEqual(self.instance_id, bu.instance_id)
|
||||
self.assertEqual(models.BackupState.NEW, bu.state)
|
||||
|
||||
self.assertEqual(BACKUP_NAME, bu.name)
|
||||
self.assertEqual(BACKUP_DESC, bu.description)
|
||||
self.assertEqual(self.instance_id, bu.instance_id)
|
||||
self.assertEqual(models.BackupState.NEW, bu.state)
|
||||
|
||||
db_record = models.DBBackup.find_by(id=bu.id)
|
||||
self.assertEqual(bu.id, db_record['id'])
|
||||
self.assertEqual(BACKUP_NAME, db_record['name'])
|
||||
self.assertEqual(BACKUP_DESC, db_record['description'])
|
||||
self.assertEqual(self.instance_id, db_record['instance_id'])
|
||||
self.assertEqual(models.BackupState.NEW, db_record['state'])
|
||||
db_record = models.DBBackup.find_by(id=bu.id)
|
||||
self.assertEqual(bu.id, db_record['id'])
|
||||
self.assertEqual(BACKUP_NAME, db_record['name'])
|
||||
self.assertEqual(BACKUP_DESC, db_record['description'])
|
||||
self.assertEqual(self.instance_id,
|
||||
db_record['instance_id'])
|
||||
self.assertEqual(models.BackupState.NEW,
|
||||
db_record['state'])
|
||||
|
||||
def test_create_incremental(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
parent = mock(models.DBBackup)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(instance).validate_can_perform_action().thenReturn(None)
|
||||
when(models.Backup).validate_can_perform_action(
|
||||
any(), any()).thenReturn(None)
|
||||
when(models.Backup).verify_swift_auth_token(any()).thenReturn(
|
||||
None)
|
||||
when(api.API).create_backup(any()).thenReturn(None)
|
||||
when(models.Backup).get_by_id(any(), any()).thenReturn(
|
||||
parent)
|
||||
instance = MagicMock()
|
||||
parent = MagicMock(spec=models.DBBackup)
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
return_value=None)
|
||||
with patch.object(models.Backup, 'validate_can_perform_action',
|
||||
return_value=None):
|
||||
with patch.object(models.Backup, 'verify_swift_auth_token',
|
||||
return_value=None):
|
||||
api.API.create_backup = MagicMock(return_value=None)
|
||||
with patch.object(models.Backup, 'get_by_id',
|
||||
return_value=parent):
|
||||
|
||||
incremental = models.Backup.create(self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC,
|
||||
parent_id='parent_uuid')
|
||||
incremental = models.Backup.create(
|
||||
self.context,
|
||||
self.instance_id,
|
||||
BACKUP_NAME,
|
||||
BACKUP_DESC,
|
||||
parent_id='parent_uuid')
|
||||
|
||||
self.created = True
|
||||
self.created = True
|
||||
|
||||
db_record = models.DBBackup.find_by(id=incremental.id)
|
||||
self.assertEqual(incremental.id, db_record['id'])
|
||||
self.assertEqual(BACKUP_NAME, db_record['name'])
|
||||
self.assertEqual(BACKUP_DESC, db_record['description'])
|
||||
self.assertEqual(self.instance_id, db_record['instance_id'])
|
||||
self.assertEqual(models.BackupState.NEW, db_record['state'])
|
||||
self.assertEqual('parent_uuid', db_record['parent_id'])
|
||||
db_record = models.DBBackup.find_by(id=incremental.id)
|
||||
self.assertEqual(incremental.id,
|
||||
db_record['id'])
|
||||
self.assertEqual(BACKUP_NAME,
|
||||
db_record['name'])
|
||||
self.assertEqual(BACKUP_DESC,
|
||||
db_record['description'])
|
||||
self.assertEqual(self.instance_id,
|
||||
db_record['instance_id'])
|
||||
self.assertEqual(models.BackupState.NEW,
|
||||
db_record['state'])
|
||||
self.assertEqual('parent_uuid',
|
||||
db_record['parent_id'])
|
||||
|
||||
def test_create_instance_not_found(self):
|
||||
self.assertRaises(exception.NotFound, models.Backup.create,
|
||||
@ -114,52 +125,60 @@ class BackupCreateTest(testtools.TestCase):
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
|
||||
def test_create_incremental_not_found(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(instance).validate_can_perform_action().thenReturn(None)
|
||||
when(models.Backup).validate_can_perform_action(
|
||||
any(), any()).thenReturn(None)
|
||||
when(models.Backup).verify_swift_auth_token(any()).thenReturn(
|
||||
None)
|
||||
self.assertRaises(exception.NotFound, models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC, parent_id='BAD')
|
||||
instance = MagicMock()
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
return_value=None)
|
||||
with patch.object(models.Backup, 'validate_can_perform_action',
|
||||
return_value=None):
|
||||
with patch.object(models.Backup, 'verify_swift_auth_token',
|
||||
return_value=None):
|
||||
self.assertRaises(exception.NotFound, models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC,
|
||||
parent_id='BAD')
|
||||
|
||||
def test_create_instance_not_active(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(instance).validate_can_perform_action().thenRaise(
|
||||
exception.UnprocessableEntity)
|
||||
self.assertRaises(exception.UnprocessableEntity, models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
instance = MagicMock()
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
side_effect=exception.UnprocessableEntity)
|
||||
self.assertRaises(exception.UnprocessableEntity,
|
||||
models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
|
||||
def test_create_backup_swift_token_invalid(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(instance).validate_can_perform_action().thenReturn(None)
|
||||
when(models.Backup).validate_can_perform_action(
|
||||
any(), any()).thenReturn(None)
|
||||
when(models.Backup).verify_swift_auth_token(any()).thenRaise(
|
||||
exception.SwiftAuthError)
|
||||
self.assertRaises(exception.SwiftAuthError, models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
instance = MagicMock()
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
return_value=None)
|
||||
with patch.object(models.Backup, 'validate_can_perform_action',
|
||||
return_value=None):
|
||||
with patch.object(models.Backup, 'verify_swift_auth_token',
|
||||
side_effect=exception.SwiftAuthError):
|
||||
self.assertRaises(exception.SwiftAuthError,
|
||||
models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
|
||||
def test_create_backup_datastore_operation_not_supported(self):
|
||||
instance = mock(instance_models.Instance)
|
||||
when(instance_models.BuiltInstance).load(any(), any()).thenReturn(
|
||||
instance)
|
||||
when(models.Backup).validate_can_perform_action(
|
||||
any(), any()).thenRaise(
|
||||
exception.DatastoreOperationNotSupported)
|
||||
self.assertRaises(exception.DatastoreOperationNotSupported,
|
||||
models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
instance = MagicMock()
|
||||
with patch.object(instance_models.BuiltInstance, 'load',
|
||||
return_value=instance):
|
||||
instance.validate_can_perform_action = MagicMock(
|
||||
return_value=None)
|
||||
with patch.object(
|
||||
models.Backup, 'validate_can_perform_action',
|
||||
side_effect=exception.DatastoreOperationNotSupported
|
||||
):
|
||||
self.assertRaises(exception.DatastoreOperationNotSupported,
|
||||
models.Backup.create,
|
||||
self.context, self.instance_id,
|
||||
BACKUP_NAME, BACKUP_DESC)
|
||||
|
||||
|
||||
class BackupDeleteTest(testtools.TestCase):
|
||||
@ -170,27 +189,27 @@ class BackupDeleteTest(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(BackupDeleteTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_delete_backup_not_found(self):
|
||||
self.assertRaises(exception.NotFound, models.Backup.delete,
|
||||
self.context, 'backup-id')
|
||||
|
||||
def test_delete_backup_is_running(self):
|
||||
backup = mock()
|
||||
backup = MagicMock()
|
||||
backup.is_running = True
|
||||
when(models.Backup).get_by_id(any(), any()).thenReturn(backup)
|
||||
self.assertRaises(exception.UnprocessableEntity,
|
||||
models.Backup.delete, self.context, 'backup_id')
|
||||
with patch.object(models.Backup, 'get_by_id', return_value=backup):
|
||||
self.assertRaises(exception.UnprocessableEntity,
|
||||
models.Backup.delete, self.context, 'backup_id')
|
||||
|
||||
def test_delete_backup_swift_token_invalid(self):
|
||||
backup = mock()
|
||||
backup = MagicMock()
|
||||
backup.is_running = False
|
||||
when(models.Backup).get_by_id(any(), any()).thenReturn(backup)
|
||||
when(models.Backup).verify_swift_auth_token(any()).thenRaise(
|
||||
exception.SwiftAuthError)
|
||||
self.assertRaises(exception.SwiftAuthError, models.Backup.delete,
|
||||
self.context, 'backup_id')
|
||||
with patch.object(models.Backup, 'get_by_id', return_value=backup):
|
||||
with patch.object(models.Backup, 'verify_swift_auth_token',
|
||||
side_effect=exception.SwiftAuthError):
|
||||
self.assertRaises(exception.SwiftAuthError,
|
||||
models.Backup.delete,
|
||||
self.context, 'backup_id')
|
||||
|
||||
|
||||
class BackupORMTest(testtools.TestCase):
|
||||
@ -209,7 +228,6 @@ class BackupORMTest(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(BackupORMTest, self).tearDown()
|
||||
unstub()
|
||||
if not self.deleted:
|
||||
models.DBBackup.find_by(tenant_id=self.context.tenant).delete()
|
||||
|
||||
@ -304,7 +322,6 @@ class PaginationTests(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(PaginationTests, self).tearDown()
|
||||
unstub()
|
||||
query = models.DBBackup.query()
|
||||
query.filter_by(instance_id=self.instance_id).delete()
|
||||
|
||||
@ -378,7 +395,6 @@ class OrderingTests(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(OrderingTests, self).tearDown()
|
||||
unstub()
|
||||
query = models.DBBackup.query()
|
||||
query.filter_by(instance_id=self.instance_id).delete()
|
||||
|
||||
|
@ -12,8 +12,7 @@
|
||||
#See the License for the specific language governing permissions and
|
||||
#limitations under the License.
|
||||
|
||||
from mock import Mock
|
||||
from mockito import when, unstub, any
|
||||
from mock import Mock, MagicMock, patch, ANY
|
||||
from webob.exc import HTTPNotFound
|
||||
|
||||
import hashlib
|
||||
@ -160,14 +159,12 @@ class MockStats:
|
||||
class BackupAgentTest(testtools.TestCase):
|
||||
def setUp(self):
|
||||
super(BackupAgentTest, self).setUp()
|
||||
when(mysql_impl).get_auth_password().thenReturn('123')
|
||||
when(backupagent).get_storage_strategy(any(), any()).thenReturn(
|
||||
MockSwift)
|
||||
when(os).statvfs(any()).thenReturn(MockStats)
|
||||
mysql_impl.get_auth_password = MagicMock(return_value='123')
|
||||
backupagent.get_storage_strategy = MagicMock(return_value=MockSwift)
|
||||
os.statvfs = MagicMock(return_value=MockStats)
|
||||
|
||||
def tearDown(self):
|
||||
super(BackupAgentTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_backup_impl_MySQLDump(self):
|
||||
"""This test is for
|
||||
@ -243,24 +240,24 @@ class BackupAgentTest(testtools.TestCase):
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
state=BackupState.NEW))
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
size=any(),
|
||||
size=ANY,
|
||||
state=BackupState.BUILDING))
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
checksum=any(),
|
||||
location=any(),
|
||||
note=any(),
|
||||
checksum=ANY,
|
||||
location=ANY,
|
||||
note=ANY,
|
||||
backup_type=backup_info['type'],
|
||||
state=BackupState.COMPLETED))
|
||||
|
||||
@ -278,47 +275,49 @@ class BackupAgentTest(testtools.TestCase):
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
state=BackupState.NEW))
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
size=any(),
|
||||
size=ANY,
|
||||
state=BackupState.BUILDING))
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
checksum=any(),
|
||||
location=any(),
|
||||
note=any(),
|
||||
checksum=ANY,
|
||||
location=ANY,
|
||||
note=ANY,
|
||||
backup_type=backup_info['type'],
|
||||
state=BackupState.FAILED))
|
||||
|
||||
def test_execute_lossy_backup(self):
|
||||
"""This test verifies that incomplete writes to swift will fail."""
|
||||
when(MockSwift).save(any(), any()).thenReturn((False, 'Error', 'y',
|
||||
'z'))
|
||||
agent = backupagent.BackupAgent()
|
||||
with patch.object(MockSwift, 'save',
|
||||
return_value=(False, 'Error', 'y', 'z')):
|
||||
|
||||
backup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
self.assertRaises(backupagent.BackupError, agent.execute_backup,
|
||||
context=None, backup_info=backup_info,
|
||||
runner=MockLossyBackup)
|
||||
agent = backupagent.BackupAgent()
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
any(),
|
||||
backup_id=backup_info['id'],
|
||||
state=BackupState.FAILED))
|
||||
backup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
|
||||
self.assertRaises(backupagent.BackupError, agent.execute_backup,
|
||||
context=None, backup_info=backup_info,
|
||||
runner=MockLossyBackup)
|
||||
|
||||
self.assertTrue(
|
||||
conductor_api.API.update_backup.called_once_with(
|
||||
ANY,
|
||||
backup_id=backup_info['id'],
|
||||
state=BackupState.FAILED))
|
||||
|
||||
def test_execute_restore(self):
|
||||
"""This test should ensure backup agent
|
||||
@ -327,79 +326,86 @@ class BackupAgentTest(testtools.TestCase):
|
||||
transfers/downloads data and invokes the restore module
|
||||
reports status
|
||||
"""
|
||||
when(backupagent).get_storage_strategy(any(), any()).thenReturn(
|
||||
MockStorage)
|
||||
when(backupagent).get_restore_strategy(
|
||||
'InnoBackupEx', any()).thenReturn(MockRestoreRunner)
|
||||
with patch.object(backupagent, 'get_storage_strategy',
|
||||
return_value=MockStorage):
|
||||
|
||||
agent = backupagent.BackupAgent()
|
||||
with patch.object(backupagent, 'get_restore_strategy',
|
||||
return_value=MockRestoreRunner):
|
||||
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
agent.execute_restore(TroveContext(), bkup_info, '/var/lib/mysql')
|
||||
agent = backupagent.BackupAgent()
|
||||
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
agent.execute_restore(TroveContext(),
|
||||
bkup_info,
|
||||
'/var/lib/mysql')
|
||||
|
||||
def test_restore_unknown(self):
|
||||
when(backupagent).get_restore_strategy(
|
||||
'foo', any()).thenRaise(ImportError)
|
||||
with patch.object(backupagent, 'get_restore_strategy',
|
||||
side_effect=ImportError):
|
||||
|
||||
agent = backupagent.BackupAgent()
|
||||
agent = backupagent.BackupAgent()
|
||||
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'foo',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
self.assertRaises(UnknownBackupType, agent.execute_restore,
|
||||
context=None, backup_info=bkup_info,
|
||||
restore_location='/var/lib/mysql')
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'foo',
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
|
||||
self.assertRaises(UnknownBackupType, agent.execute_restore,
|
||||
context=None, backup_info=bkup_info,
|
||||
restore_location='/var/lib/mysql')
|
||||
|
||||
def test_backup_incremental_metadata(self):
|
||||
when(backupagent).get_storage_strategy(any(), any()).thenReturn(
|
||||
MockSwift)
|
||||
MockStorage.save_metadata = Mock()
|
||||
when(MockSwift).load_metadata(any(), any()).thenReturn(
|
||||
{'lsn': '54321'})
|
||||
with patch.object(backupagent, 'get_storage_strategy',
|
||||
return_value=MockSwift):
|
||||
MockStorage.save_metadata = Mock()
|
||||
with patch.object(MockSwift, 'load_metadata',
|
||||
return_value={'lsn': '54321'}):
|
||||
meta = {
|
||||
'lsn': '12345',
|
||||
'parent_location': 'fake',
|
||||
'parent_checksum': 'md5',
|
||||
}
|
||||
|
||||
meta = {
|
||||
'lsn': '12345',
|
||||
'parent_location': 'fake',
|
||||
'parent_checksum': 'md5',
|
||||
}
|
||||
when(mysql_impl.InnoBackupExIncremental).metadata().thenReturn(meta)
|
||||
when(mysql_impl.InnoBackupExIncremental).run().thenReturn(True)
|
||||
when(mysql_impl.InnoBackupExIncremental).__exit__().thenReturn(True)
|
||||
mysql_impl.InnoBackupExIncremental.metadata = MagicMock(
|
||||
return_value=meta)
|
||||
mysql_impl.InnoBackupExIncremental.check_process = MagicMock(
|
||||
return_value=True)
|
||||
|
||||
agent = backupagent.BackupAgent()
|
||||
agent = backupagent.BackupAgent()
|
||||
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
'parent': {'location': 'fake', 'checksum': 'md5'}
|
||||
}
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
'parent': {'location': 'fake', 'checksum': 'md5'}
|
||||
}
|
||||
|
||||
agent.execute_backup(TroveContext(), bkup_info, '/var/lib/mysql')
|
||||
agent.execute_backup(TroveContext(),
|
||||
bkup_info,
|
||||
'/var/lib/mysql')
|
||||
|
||||
self.assertTrue(MockStorage.save_metadata.called_once_with(
|
||||
any(),
|
||||
meta))
|
||||
self.assertTrue(MockStorage.save_metadata.called_once_with(
|
||||
ANY,
|
||||
meta))
|
||||
|
||||
def test_backup_incremental_bad_metadata(self):
|
||||
when(backupagent).get_storage_strategy(any(), any()).thenReturn(
|
||||
MockSwift)
|
||||
with patch.object(backupagent, 'get_storage_strategy',
|
||||
return_value=MockSwift):
|
||||
|
||||
agent = backupagent.BackupAgent()
|
||||
agent = backupagent.BackupAgent()
|
||||
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
'parent': {'location': 'fake', 'checksum': 'md5'}
|
||||
}
|
||||
bkup_info = {'id': '123',
|
||||
'location': 'fake-location',
|
||||
'type': 'InnoBackupEx',
|
||||
'checksum': 'fake-checksum',
|
||||
'parent': {'location': 'fake', 'checksum': 'md5'}
|
||||
}
|
||||
|
||||
self.assertRaises(
|
||||
AttributeError,
|
||||
agent.execute_backup, TroveContext(), bkup_info, 'location')
|
||||
self.assertRaises(
|
||||
AttributeError,
|
||||
agent.execute_backup, TroveContext(), bkup_info, 'location')
|
||||
|
@ -13,8 +13,7 @@
|
||||
#limitations under the License.
|
||||
|
||||
import testtools
|
||||
from mock import Mock
|
||||
from mockito import when, unstub, any
|
||||
from mock import Mock, MagicMock, patch
|
||||
import hashlib
|
||||
|
||||
from trove.common.context import TroveContext
|
||||
@ -36,7 +35,6 @@ class SwiftStorageSaveChecksumTests(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(SwiftStorageSaveChecksumTests, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_swift_checksum_save(self):
|
||||
"""This tests that SwiftStorage.save returns the swift checksum"""
|
||||
@ -46,16 +44,17 @@ class SwiftStorageSaveChecksumTests(testtools.TestCase):
|
||||
password = 'password'
|
||||
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
storage_strategy = SwiftStorage(context)
|
||||
with patch.object(swift, 'create_swift_client',
|
||||
return_value=swift_client):
|
||||
storage_strategy = SwiftStorage(context)
|
||||
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
|
||||
self.assertTrue(success, "The backup should have been successful.")
|
||||
self.assertIsNotNone(note, "A note should have been returned.")
|
||||
@ -75,16 +74,17 @@ class SwiftStorageSaveChecksumTests(testtools.TestCase):
|
||||
password = 'password'
|
||||
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
storage_strategy = SwiftStorage(context)
|
||||
with patch.object(swift, 'create_swift_client',
|
||||
return_value=swift_client):
|
||||
storage_strategy = SwiftStorage(context)
|
||||
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
|
||||
self.assertFalse(success, "The backup should have failed!")
|
||||
self.assertTrue(note.startswith("Error saving data to Swift!"))
|
||||
@ -107,16 +107,17 @@ class SwiftStorageSaveChecksumTests(testtools.TestCase):
|
||||
password = 'password'
|
||||
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
storage_strategy = SwiftStorage(context)
|
||||
with patch.object(swift, 'create_swift_client',
|
||||
return_value=swift_client):
|
||||
storage_strategy = SwiftStorage(context)
|
||||
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
with MockBackupRunner(filename=backup_id,
|
||||
user=user,
|
||||
password=password) as runner:
|
||||
(success,
|
||||
note,
|
||||
checksum,
|
||||
location) = storage_strategy.save(runner.manifest, runner)
|
||||
|
||||
self.assertFalse(success, "The backup should have failed!")
|
||||
self.assertTrue(note.startswith("Error saving data to Swift!"))
|
||||
@ -134,7 +135,7 @@ class SwiftStorageUtils(testtools.TestCase):
|
||||
super(SwiftStorageUtils, self).setUp()
|
||||
context = TroveContext()
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
swift.create_swift_client = MagicMock(return_value=swift_client)
|
||||
self.swift = SwiftStorage(context)
|
||||
|
||||
def tearDown(self):
|
||||
@ -168,7 +169,6 @@ class SwiftStorageLoad(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(SwiftStorageLoad, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_run_verify_checksum(self):
|
||||
"""This tests that swift download cmd runs if original backup checksum
|
||||
@ -180,10 +180,11 @@ class SwiftStorageLoad(testtools.TestCase):
|
||||
backup_checksum = "fake-md5-sum"
|
||||
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
with patch.object(swift, 'create_swift_client',
|
||||
return_value=swift_client):
|
||||
|
||||
storage_strategy = SwiftStorage(context)
|
||||
download_stream = storage_strategy.load(location, backup_checksum)
|
||||
storage_strategy = SwiftStorage(context)
|
||||
download_stream = storage_strategy.load(location, backup_checksum)
|
||||
self.assertIsNotNone(download_stream)
|
||||
|
||||
def test_run_verify_checksum_mismatch(self):
|
||||
@ -197,9 +198,9 @@ class SwiftStorageLoad(testtools.TestCase):
|
||||
backup_checksum = "checksum_different_then_fake_swift_etag"
|
||||
|
||||
swift_client = FakeSwiftConnection()
|
||||
when(swift).create_swift_client(context).thenReturn(swift_client)
|
||||
|
||||
storage_strategy = SwiftStorage(context)
|
||||
with patch.object(swift, 'create_swift_client',
|
||||
return_value=swift_client):
|
||||
storage_strategy = SwiftStorage(context)
|
||||
|
||||
self.assertRaises(SwiftDownloadIntegrityError,
|
||||
storage_strategy.load,
|
||||
@ -274,13 +275,11 @@ class SwiftMetadataTests(testtools.TestCase):
|
||||
super(SwiftMetadataTests, self).setUp()
|
||||
self.swift_client = FakeSwiftConnection()
|
||||
self.context = TroveContext()
|
||||
when(swift).create_swift_client(self.context).thenReturn(
|
||||
self.swift_client)
|
||||
swift.create_swift_client = MagicMock(return_value=self.swift_client)
|
||||
self.swift = SwiftStorage(self.context)
|
||||
|
||||
def tearDown(self):
|
||||
super(SwiftMetadataTests, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test__get_attr(self):
|
||||
normal_header = self.swift._get_attr('content-type')
|
||||
@ -302,10 +301,9 @@ class SwiftMetadataTests(testtools.TestCase):
|
||||
'etag': '"fake-md5-sum"',
|
||||
'x-object-meta-lsn': '1234567'
|
||||
}
|
||||
when(self.swift_client).head_object(any(), any()).thenReturn(
|
||||
headers)
|
||||
|
||||
metadata = self.swift.load_metadata(location, 'fake-md5-sum')
|
||||
with patch.object(self.swift_client, 'head_object',
|
||||
return_value=headers):
|
||||
metadata = self.swift.load_metadata(location, 'fake-md5-sum')
|
||||
self.assertEqual({'lsn': '1234567'}, metadata)
|
||||
|
||||
def test_save_metadata(self):
|
||||
|
@ -16,7 +16,7 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from mockito import mock, when, unstub
|
||||
from mock import MagicMock
|
||||
import testtools
|
||||
from testtools import matchers
|
||||
|
||||
@ -33,17 +33,16 @@ class TestRemote(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(TestRemote, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_creation(self):
|
||||
when(swiftclient.client.Connection).get_auth().thenReturn(None)
|
||||
swiftclient.client.Connection.get_auth = MagicMock(return_value=None)
|
||||
conn = swiftclient.client.Connection()
|
||||
self.assertIsNone(conn.get_auth())
|
||||
|
||||
def test_create_swift_client(self):
|
||||
mock_resp = mock(dict)
|
||||
when(swiftclient.client.Connection).get_container('bob').thenReturn(
|
||||
["text", mock_resp])
|
||||
mock_resp = MagicMock()
|
||||
swiftclient.client.Connection.get_container = MagicMock(
|
||||
return_value=["text", mock_resp])
|
||||
client = remote.create_swift_client(TroveContext(tenant='123'))
|
||||
headers, container = client.get_container('bob')
|
||||
self.assertIs(headers, "text")
|
||||
@ -132,7 +131,8 @@ class TestRemote(testtools.TestCase):
|
||||
self.assertThat(obj_1, matchers.Equals(
|
||||
{'bytes': 13, 'last_modified': '2013-03-15T22:10:49.361950',
|
||||
'hash': 'ccc55aefbf92aa66f42b638802c5e7f6', 'name': 'test',
|
||||
'content_type': 'application/octet-stream'}))
|
||||
'content_type': 'application/octet-stream',
|
||||
'contents': 'test_contents'}))
|
||||
# test object api - not much to do here
|
||||
self.assertThat(conn.get_object('bob', 'test')[1],
|
||||
matchers.Is('test_contents'))
|
||||
@ -140,7 +140,6 @@ class TestRemote(testtools.TestCase):
|
||||
# test remove object
|
||||
swift_stub.without_object('bob', 'test')
|
||||
# interact
|
||||
conn.delete_object('bob', 'test')
|
||||
with testtools.ExpectedException(swiftclient.ClientException):
|
||||
conn.delete_object('bob', 'test')
|
||||
self.assertThat(len(conn.get_container('bob')[1]), matchers.Is(0))
|
||||
@ -169,14 +168,14 @@ class TestRemote(testtools.TestCase):
|
||||
self.assertThat(cont_info[1][0], matchers.Equals(
|
||||
{'bytes': 13, 'last_modified': '2013-03-15T22:10:49.361950',
|
||||
'hash': 'ccc55aefbf92aa66f42b638802c5e7f6', 'name': 'test',
|
||||
'content_type': 'application/octet-stream'}))
|
||||
'content_type': 'application/octet-stream',
|
||||
'contents': 'test_contents'}))
|
||||
self.assertThat(conn.get_object('bob', 'test')[1],
|
||||
matchers.Is('test_contents'))
|
||||
self.assertThat(conn.get_object('bob', 'test2')[1],
|
||||
matchers.Is('test_contents2'))
|
||||
|
||||
swift_stub.without_object('bob', 'test')
|
||||
conn.delete_object('bob', 'test')
|
||||
with testtools.ExpectedException(swiftclient.ClientException):
|
||||
conn.delete_object('bob', 'test')
|
||||
self.assertThat(len(conn.get_container('bob')[1]), matchers.Is(1))
|
||||
|
@ -13,7 +13,6 @@
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
from mockito import unstub
|
||||
from trove.backup import models as bkup_models
|
||||
from trove.common import exception as t_exception
|
||||
from trove.common import utils
|
||||
@ -39,7 +38,6 @@ class ConductorMethodTests(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(ConductorMethodTests, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def _create_iss(self):
|
||||
new_id = utils.generate_uuid()
|
||||
|
@ -15,9 +15,7 @@ import testtools
|
||||
from designateclient.v1.domains import Domain
|
||||
from designateclient.v1.records import Record
|
||||
from trove.dns.designate import driver
|
||||
from mockito import any
|
||||
from mockito import mock
|
||||
from mockito import when
|
||||
from mock import MagicMock
|
||||
import base64
|
||||
import hashlib
|
||||
|
||||
@ -87,9 +85,9 @@ class DesignateDriverTest(testtools.TestCase):
|
||||
|
||||
def test_get_entries_by_name(self):
|
||||
zone = driver.DesignateDnsZone('123', 'www.example.com')
|
||||
when(driver).create_designate_client().thenReturn(None)
|
||||
when(driver.DesignateDriver)._get_records(any()).thenReturn(
|
||||
self.records)
|
||||
driver.create_designate_client = MagicMock(return_value=None)
|
||||
driver.DesignateDriver._get_records = MagicMock(
|
||||
return_value=self.records)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
entries = dns_driver.get_entries_by_name('record2', zone)
|
||||
self.assertTrue(len(entries) == 1, 'More than one record found')
|
||||
@ -105,18 +103,18 @@ class DesignateDriverTest(testtools.TestCase):
|
||||
|
||||
def test_get_entries_by_name_not_found(self):
|
||||
zone = driver.DesignateDnsZone('123', 'www.example.com')
|
||||
when(driver).create_designate_client().thenReturn(None)
|
||||
when(driver.DesignateDriver)._get_records(any()).thenReturn(
|
||||
self.records)
|
||||
driver.create_designate_client = MagicMock(return_value=None)
|
||||
driver.DesignateDriver._get_records = MagicMock(
|
||||
return_value=self.records)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
entries = dns_driver.get_entries_by_name('record_not_found', zone)
|
||||
self.assertTrue(len(entries) == 0, 'Some records were returned')
|
||||
|
||||
def test_get_entries_by_content(self):
|
||||
zone = driver.DesignateDnsZone('123', 'www.example.com')
|
||||
when(driver).create_designate_client().thenReturn(None)
|
||||
when(driver.DesignateDriver)._get_records(any()).thenReturn(
|
||||
self.records)
|
||||
driver.create_designate_client = MagicMock(return_value=None)
|
||||
driver.DesignateDriver._get_records = MagicMock(
|
||||
return_value=self.records)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
entries = dns_driver.get_entries_by_content('10.0.0.1', zone)
|
||||
self.assertTrue(len(entries) == 1, 'More than one record found')
|
||||
@ -132,19 +130,17 @@ class DesignateDriverTest(testtools.TestCase):
|
||||
|
||||
def test_get_entries_by_content_not_found(self):
|
||||
zone = driver.DesignateDnsZone('123', 'www.example.com')
|
||||
when(driver).create_designate_client().thenReturn(None)
|
||||
when(driver.DesignateDriver)._get_records(any()).thenReturn(
|
||||
self.records)
|
||||
driver.create_designate_client = MagicMock(return_value=None)
|
||||
driver.DesignateDriver._get_records = MagicMock(
|
||||
return_value=self.records)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
entries = dns_driver.get_entries_by_content('127.0.0.1', zone)
|
||||
self.assertTrue(len(entries) == 0, 'Some records were returned')
|
||||
|
||||
def test_get_dnz_zones(self):
|
||||
|
||||
client = mock()
|
||||
client.domains = mock()
|
||||
when(driver).create_designate_client().thenReturn(client)
|
||||
when(client.domains).list().thenReturn(self.domains)
|
||||
client = MagicMock()
|
||||
driver.create_designate_client = MagicMock(return_value=client)
|
||||
client.domains.list = MagicMock(return_value=self.domains)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
zones = dns_driver.get_dns_zones()
|
||||
self.assertTrue(len(zones) == 3)
|
||||
@ -152,20 +148,18 @@ class DesignateDriverTest(testtools.TestCase):
|
||||
self.assertDomainsAreEqual(self.domains[x], zones[x])
|
||||
|
||||
def test_get_dnz_zones_by_name(self):
|
||||
client = mock()
|
||||
client.domains = mock()
|
||||
when(driver).create_designate_client().thenReturn(client)
|
||||
when(client.domains).list().thenReturn(self.domains)
|
||||
client = MagicMock()
|
||||
driver.create_designate_client = MagicMock(return_value=client)
|
||||
client.domains.list = MagicMock(return_value=self.domains)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
zones = dns_driver.get_dns_zones('www.trove.com')
|
||||
self.assertTrue(len(zones) == 1)
|
||||
self.assertDomainsAreEqual(self.domains[1], zones[0])
|
||||
|
||||
def test_get_dnz_zones_not_found(self):
|
||||
client = mock()
|
||||
client.domains = mock()
|
||||
when(driver).create_designate_client().thenReturn(client)
|
||||
when(client.domains).list().thenReturn(self.domains)
|
||||
client = MagicMock()
|
||||
driver.create_designate_client = MagicMock(return_value=client)
|
||||
client.domains.list = MagicMock(return_value=self.domains)
|
||||
dns_driver = driver.DesignateDriver()
|
||||
zones = dns_driver.get_dns_zones('www.notfound.com')
|
||||
self.assertTrue(len(zones) == 0)
|
||||
|
@ -11,21 +11,15 @@
|
||||
# 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 mockito import when
|
||||
from mockito import any
|
||||
from mockito import verify
|
||||
from mockito import unstub
|
||||
from mockito import mock
|
||||
from mockito import verifyZeroInteractions
|
||||
from mockito import never
|
||||
import mockito.matchers
|
||||
import mock
|
||||
import testtools
|
||||
from testtools.matchers import KeysEqual, Is
|
||||
from trove.guestagent import models as agent_models
|
||||
import trove.db.models as db_models
|
||||
|
||||
import trove.common.context as context
|
||||
from trove.common import exception
|
||||
from trove.guestagent import api
|
||||
import trove.openstack.common.rpc as rpc
|
||||
import trove.common.rpc as trove_rpc
|
||||
|
||||
|
||||
def _mock_call_pwd_change(cmd, users=None):
|
||||
@ -47,23 +41,12 @@ def _mock_call(cmd, timerout, username=None, hostname=None,
|
||||
class ApiTest(testtools.TestCase):
|
||||
def setUp(self):
|
||||
super(ApiTest, self).setUp()
|
||||
self.guest = api.API('mock_content', 0)
|
||||
self.context = context.TroveContext()
|
||||
self.guest = api.API(self.context, 0)
|
||||
self.guest._cast = _mock_call_pwd_change
|
||||
self.guest._call = _mock_call
|
||||
self.FAKE_ID = 'instance-id-x23d2d'
|
||||
self.api = api.API(mock(), self.FAKE_ID)
|
||||
when(rpc).call(any(), any(), any(), any(int)).thenRaise(
|
||||
ValueError('Unexpected Rpc Invocation'))
|
||||
when(rpc).cast(any(), any(), any()).thenRaise(
|
||||
ValueError('Unexpected Rpc Invocation'))
|
||||
|
||||
def tearDown(self):
|
||||
super(ApiTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_delete_queue(self):
|
||||
self.skipTest("find out if this delete_queue function is needed "
|
||||
"anymore, Bug#1097482")
|
||||
self.api = api.API(self.context, self.FAKE_ID)
|
||||
|
||||
def test_change_passwords(self):
|
||||
self.assertIsNone(self.guest.change_passwords("dummy"))
|
||||
@ -85,285 +68,311 @@ class ApiTest(testtools.TestCase):
|
||||
self.assertEqual('guestagent.' + self.FAKE_ID,
|
||||
self.api._get_routing_key())
|
||||
|
||||
def test_check_for_heartbeat_positive(self):
|
||||
when(db_models.DatabaseModelBase).find_by(
|
||||
instance_id=any()).thenReturn('agent')
|
||||
when(agent_models.AgentHeartBeat).is_active('agent').thenReturn(True)
|
||||
@mock.patch('trove.guestagent.models.AgentHeartBeat')
|
||||
def test_check_for_heartbeat_positive(self, mock_agent):
|
||||
self.assertTrue(self.api._check_for_hearbeat())
|
||||
|
||||
def test_check_for_heartbeat_exception(self):
|
||||
@mock.patch('trove.guestagent.models.AgentHeartBeat')
|
||||
def test_check_for_heartbeat_exception(self, mock_agent):
|
||||
# TODO(juice): maybe it would be ok to extend the test to validate
|
||||
# the is_active method on the heartbeat
|
||||
when(db_models.DatabaseModelBase).find_by(instance_id=any()).thenRaise(
|
||||
exception.ModelNotFoundError)
|
||||
when(agent_models.AgentHeartBeat).is_active(any()).thenReturn(None)
|
||||
|
||||
mock_agent.find_by.side_effect = exception.ModelNotFoundError("Uh Oh!")
|
||||
# execute
|
||||
self.assertRaises(exception.GuestTimeout, self.api._check_for_hearbeat)
|
||||
# validate
|
||||
self.assertEqual(mock_agent.is_active.call_count, 0)
|
||||
|
||||
verify(agent_models.AgentHeartBeat, times=0).is_active(any())
|
||||
|
||||
def test_check_for_heartbeat_negative(self):
|
||||
@mock.patch('trove.guestagent.models.AgentHeartBeat')
|
||||
def test_check_for_heartbeat_negative(self, mock_agent):
|
||||
# TODO(juice): maybe it would be ok to extend the test to validate
|
||||
# the is_active method on the heartbeat
|
||||
when(db_models.DatabaseModelBase).find_by(
|
||||
instance_id=any()).thenReturn('agent')
|
||||
when(agent_models.AgentHeartBeat).is_active(any()).thenReturn(False)
|
||||
mock_agent.is_active.return_value = False
|
||||
self.assertRaises(exception.GuestTimeout, self.api._check_for_hearbeat)
|
||||
|
||||
def test_delete_queue(self):
|
||||
trove_rpc.delete_queue = mock.Mock()
|
||||
# execute
|
||||
self.api.delete_queue()
|
||||
# verify
|
||||
trove_rpc.delete_queue.assert_called_with(self.context, mock.ANY)
|
||||
|
||||
def test_create_user(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('create_user', 'users')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
self.api.create_user('test_user')
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_rpc_cast_exception(self):
|
||||
rpc.cast = mock.Mock(side_effect=IOError('host down'))
|
||||
exp_msg = RpcMsgMatcher('create_user', 'users')
|
||||
when(rpc).cast(any(), any(), exp_msg).thenRaise(IOError('host down'))
|
||||
|
||||
# execute
|
||||
with testtools.ExpectedException(exception.GuestError, '.* host down'):
|
||||
self.api.create_user('test_user')
|
||||
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_list_users(self):
|
||||
exp_resp = ['user1', 'user2', 'user3']
|
||||
rpc.call = mock.Mock(return_value=exp_resp)
|
||||
exp_msg = RpcMsgMatcher('list_users', 'limit', 'marker',
|
||||
'include_marker')
|
||||
exp_resp = ['user1', 'user2', 'user3']
|
||||
self._mock_rpc_call(exp_msg, exp_resp)
|
||||
# execute
|
||||
act_resp = self.api.list_users()
|
||||
# verify
|
||||
self.assertThat(act_resp, Is(exp_resp))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_rpc_call_exception(self):
|
||||
rpc.call = mock.Mock(side_effect=IOError('host_down'))
|
||||
exp_msg = RpcMsgMatcher('list_users', 'limit', 'marker',
|
||||
'include_marker')
|
||||
when(rpc).call(any(), any(), exp_msg, any(int)).thenRaise(
|
||||
IOError('host down'))
|
||||
|
||||
# execute
|
||||
with testtools.ExpectedException(exception.GuestError,
|
||||
'An error occurred.*'):
|
||||
self.api.list_users()
|
||||
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_delete_user(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('delete_user', 'user')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.delete_user('test_user')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_create_database(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('create_database', 'databases')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.create_database(['db1', 'db2', 'db3'])
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_list_databases(self):
|
||||
exp_resp = ['db1', 'db2', 'db3']
|
||||
rpc.call = mock.Mock(return_value=exp_resp)
|
||||
exp_msg = RpcMsgMatcher('list_databases', 'limit', 'marker',
|
||||
'include_marker')
|
||||
exp_resp = ['db1', 'db2', 'db3']
|
||||
self._mock_rpc_call(exp_msg, exp_resp)
|
||||
# execute
|
||||
resp = self.api.list_databases(limit=1, marker=2,
|
||||
include_marker=False)
|
||||
# verify
|
||||
self.assertThat(resp, Is(exp_resp))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_delete_database(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('delete_database', 'database')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.delete_database('test_database_name')
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_enable_root(self):
|
||||
rpc.call = mock.Mock(return_value=True)
|
||||
exp_msg = RpcMsgMatcher('enable_root')
|
||||
self._mock_rpc_call(exp_msg, True)
|
||||
# execute
|
||||
self.assertThat(self.api.enable_root(), Is(True))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_disable_root(self):
|
||||
rpc.call = mock.Mock(return_value=True)
|
||||
exp_msg = RpcMsgMatcher('disable_root')
|
||||
self._mock_rpc_call(exp_msg, True)
|
||||
# execute
|
||||
self.assertThat(self.api.disable_root(), Is(True))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_is_root_enabled(self):
|
||||
rpc.call = mock.Mock(return_value=False)
|
||||
exp_msg = RpcMsgMatcher('is_root_enabled')
|
||||
self._mock_rpc_call(exp_msg, False)
|
||||
# execute
|
||||
self.assertThat(self.api.is_root_enabled(), Is(False))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_get_hwinfo(self):
|
||||
rpc.call = mock.Mock(return_value='[blah]')
|
||||
exp_msg = RpcMsgMatcher('get_hwinfo')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
self.api.get_hwinfo()
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.assertThat(self.api.get_hwinfo(), Is('[blah]'))
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_get_diagnostics(self):
|
||||
rpc.call = mock.Mock(spec=rpc, return_value='[all good]')
|
||||
exp_msg = RpcMsgMatcher('get_diagnostics')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
self.api.get_diagnostics()
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.assertThat(self.api.get_diagnostics(), Is('[all good]'))
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_restart(self):
|
||||
rpc.call = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('restart')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.api.restart()
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_start_db_with_conf_changes(self):
|
||||
rpc.call = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('start_db_with_conf_changes',
|
||||
'config_contents')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.api.start_db_with_conf_changes(None)
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_stop_db(self):
|
||||
rpc.call = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('stop_db', 'do_not_start_on_reboot')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.api.stop_db(do_not_start_on_reboot=False)
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_get_volume_info(self):
|
||||
fake_resp = {'fake': 'resp'}
|
||||
rpc.call = mock.Mock(return_value=fake_resp)
|
||||
exp_msg = RpcMsgMatcher('get_filesystem_stats', 'fs_path')
|
||||
self._mock_rpc_call(exp_msg, fake_resp)
|
||||
# execute
|
||||
self.assertThat(self.api.get_volume_info(), Is(fake_resp))
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_update_guest(self):
|
||||
rpc.call = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('update_guest')
|
||||
self._mock_rpc_call(exp_msg)
|
||||
# execute
|
||||
self.api.update_guest()
|
||||
self._verify_rpc_call(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_call(exp_msg, rpc.call)
|
||||
|
||||
def test_create_backup(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('create_backup', 'backup_info')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.create_backup({'id': '123'})
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_update_overrides(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('update_overrides', 'overrides', 'remove')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.update_overrides('123')
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def test_apply_overrides(self):
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('apply_overrides', 'overrides')
|
||||
self._mock_rpc_cast(exp_msg)
|
||||
# execute
|
||||
self.api.apply_overrides('123')
|
||||
self._verify_rpc_cast(exp_msg)
|
||||
# verify
|
||||
self._verify_rpc_cast(exp_msg, rpc.cast)
|
||||
|
||||
def _verify_rpc_connection_and_cast(self, rpc, mock_conn, exp_msg):
|
||||
verify(rpc).create_connection(new=True)
|
||||
verify(mock_conn).create_consumer(self.api._get_routing_key(), None,
|
||||
fanout=False)
|
||||
verify(rpc).cast(any(), any(), exp_msg)
|
||||
rpc.create_connection.assert_called_with(new=True)
|
||||
mock_conn.create_consumer.assert_called_with(
|
||||
self.api._get_routing_key(), None, fanout=False)
|
||||
rpc.cast.assert_called_with(mock.ANY, mock.ANY, exp_msg)
|
||||
|
||||
def test_prepare(self):
|
||||
mock_conn = mock()
|
||||
when(rpc).create_connection(new=True).thenReturn(mock_conn)
|
||||
when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)
|
||||
mock_conn = mock.Mock()
|
||||
rpc.create_connection = mock.Mock(return_value=mock_conn)
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('prepare', 'memory_mb', 'packages',
|
||||
'databases', 'users', 'device_path',
|
||||
'mount_point', 'backup_info',
|
||||
'config_contents', 'root_password',
|
||||
'overrides')
|
||||
when(rpc).cast(any(), any(), exp_msg).thenReturn(None)
|
||||
|
||||
# execute
|
||||
self.api.prepare('2048', 'package1', 'db1', 'user1', '/dev/vdt',
|
||||
'/mnt/opt', 'bkup-1232', 'cont', '1-2-3-4',
|
||||
'override')
|
||||
|
||||
# verify
|
||||
self._verify_rpc_connection_and_cast(rpc, mock_conn, exp_msg)
|
||||
|
||||
def test_prepare_with_backup(self):
|
||||
mock_conn = mock()
|
||||
when(rpc).create_connection(new=True).thenReturn(mock_conn)
|
||||
when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)
|
||||
mock_conn = mock.Mock()
|
||||
rpc.create_connection = mock.Mock(return_value=mock_conn)
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('prepare', 'memory_mb', 'packages',
|
||||
'databases', 'users', 'device_path',
|
||||
'mount_point', 'backup_info',
|
||||
'config_contents', 'root_password',
|
||||
'overrides')
|
||||
when(rpc).cast(any(), any(), exp_msg).thenReturn(None)
|
||||
bkup = {'id': 'backup_id_123'}
|
||||
|
||||
# execute
|
||||
self.api.prepare('2048', 'package1', 'db1', 'user1', '/dev/vdt',
|
||||
'/mnt/opt', bkup, 'cont', '1-2-3-4',
|
||||
'overrides')
|
||||
# verify
|
||||
self._verify_rpc_connection_and_cast(rpc, mock_conn, exp_msg)
|
||||
|
||||
def test_upgrade(self):
|
||||
mock_conn = mock()
|
||||
when(rpc).create_connection(new=True).thenReturn(mock_conn)
|
||||
when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)
|
||||
mock_conn = mock.Mock()
|
||||
rpc.create_connection = mock.Mock(return_value=mock_conn)
|
||||
rpc.cast = mock.Mock()
|
||||
exp_msg = RpcMsgMatcher('upgrade')
|
||||
when(rpc).cast(any(), any(), exp_msg).thenReturn(None)
|
||||
|
||||
# execute
|
||||
self.api.upgrade()
|
||||
|
||||
# verify
|
||||
self._verify_rpc_connection_and_cast(rpc, mock_conn, exp_msg)
|
||||
|
||||
def test_rpc_cast_with_consumer_exception(self):
|
||||
mock_conn = mock()
|
||||
when(rpc).create_connection(new=True).thenRaise(IOError('host down'))
|
||||
exp_msg = RpcMsgMatcher('prepare', 'memory_mb', 'packages',
|
||||
'databases', 'users', 'device_path',
|
||||
'mount_point')
|
||||
|
||||
mock_conn = mock.Mock()
|
||||
rpc.create_connection = mock.Mock(side_effect=IOError('host down'))
|
||||
rpc.cast = mock.Mock()
|
||||
# execute
|
||||
with testtools.ExpectedException(exception.GuestError, '.* host down'):
|
||||
self.api.prepare('2048', 'package1', 'db1', 'user1', '/dev/vdt',
|
||||
'/mnt/opt')
|
||||
# verify
|
||||
rpc.create_connection.assert_called_with(new=True)
|
||||
self.assertThat(mock_conn.call_count, Is(0))
|
||||
self.assertThat(rpc.cast.call_count, Is(0))
|
||||
|
||||
verify(rpc).create_connection(new=True)
|
||||
verifyZeroInteractions(mock_conn)
|
||||
verify(rpc, never).cast(any(), any(), exp_msg)
|
||||
def _verify_rpc_call(self, exp_msg, mock_call=None):
|
||||
mock_call.assert_called_with(self.context, mock.ANY, exp_msg,
|
||||
mock.ANY)
|
||||
|
||||
def _mock_rpc_call(self, exp_msg, resp=None):
|
||||
rpc.common = mock()
|
||||
when(rpc).call(any(), any(), exp_msg, any(int)).thenReturn(resp)
|
||||
|
||||
def _verify_rpc_call(self, exp_msg):
|
||||
verify(rpc).call(any(), any(), exp_msg, any(int))
|
||||
|
||||
def _mock_rpc_cast(self, exp_msg):
|
||||
when(rpc).cast(any(), any(), exp_msg).thenReturn(None)
|
||||
|
||||
def _verify_rpc_cast(self, exp_msg):
|
||||
verify(rpc).cast(any(), any(), exp_msg)
|
||||
def _verify_rpc_cast(self, exp_msg, mock_cast=None):
|
||||
mock_cast.assert_called_with(mock.ANY,
|
||||
mock.ANY, exp_msg)
|
||||
|
||||
|
||||
class CastWithConsumerTest(testtools.TestCase):
|
||||
def setUp(self):
|
||||
super(CastWithConsumerTest, self).setUp()
|
||||
self.api = api.API(mock(), 'instance-id-x23d2d')
|
||||
|
||||
def tearDown(self):
|
||||
super(CastWithConsumerTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test__cast_with_consumer(self):
|
||||
mock_conn = mock()
|
||||
when(rpc).create_connection(new=True).thenReturn(mock_conn)
|
||||
when(mock_conn).create_consumer(any(), any(), any()).thenReturn(None)
|
||||
when(rpc).cast(any(), any(), any()).thenReturn(None)
|
||||
self.context = context.TroveContext()
|
||||
self.api = api.API(self.context, 'instance-id-x23d2d')
|
||||
|
||||
def test_cast_with_consumer(self):
|
||||
mock_conn = mock.Mock()
|
||||
rpc.create_connection = mock.Mock(return_value=mock_conn)
|
||||
rpc.cast = mock.Mock()
|
||||
# execute
|
||||
self.api._cast_with_consumer('fake_method_name', fake_param=1)
|
||||
|
||||
verify(rpc).create_connection(new=True)
|
||||
verify(mock_conn).create_consumer(any(), None, fanout=False)
|
||||
verify(rpc).cast(any(), any(), any())
|
||||
# verify
|
||||
rpc.create_connection.assert_called_with(new=True)
|
||||
mock_conn.create_consumer.assert_called_with(mock.ANY, None,
|
||||
fanout=False)
|
||||
rpc.cast.assert_called_with(self.context, mock.ANY, mock.ANY)
|
||||
|
||||
|
||||
class RpcMsgMatcher(mockito.matchers.Matcher):
|
||||
class RpcMsgMatcher(object):
|
||||
def __init__(self, method, *args_dict):
|
||||
self.wanted_method = method
|
||||
self.wanted_dict = KeysEqual('version', 'method', 'args', 'namespace')
|
||||
args_dict = args_dict or [{}]
|
||||
self.args_dict = KeysEqual(*args_dict)
|
||||
|
||||
def matches(self, arg):
|
||||
def __eq__(self, arg):
|
||||
if self.wanted_method != arg['method']:
|
||||
raise Exception("Method does not match: %s != %s" %
|
||||
(self.wanted_method, arg['method']))
|
||||
|
@ -15,15 +15,14 @@
|
||||
import os
|
||||
|
||||
import testtools
|
||||
from mock import Mock
|
||||
from mockito import verify, when, unstub, any, mock
|
||||
from mock import MagicMock
|
||||
from trove.common.context import TroveContext
|
||||
from trove.common.instance import ServiceStatuses
|
||||
from trove.guestagent import volume
|
||||
from trove.guestagent.common import operating_system
|
||||
from trove.guestagent.datastore.cassandra import service as cass_service
|
||||
from trove.guestagent.datastore.cassandra import manager as cass_manager
|
||||
from trove.guestagent import pkg
|
||||
from trove.guestagent import pkg as pkg
|
||||
|
||||
|
||||
class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
@ -38,7 +37,7 @@ class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
def save(self):
|
||||
pass
|
||||
|
||||
cass_service.CassandraAppStatus.set_status = Mock(
|
||||
cass_service.CassandraAppStatus.set_status = MagicMock(
|
||||
return_value=FakeInstanceServiceStatus())
|
||||
self.context = TroveContext()
|
||||
self.manager = cass_manager.Manager()
|
||||
@ -69,13 +68,12 @@ class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
operating_system.get_ip_address = self.original_get_ip
|
||||
cass_service.CassandraApp.make_host_reachable = (
|
||||
self.orig_make_host_reachable)
|
||||
unstub()
|
||||
|
||||
def test_update_status(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
self.manager.update_status(self.context)
|
||||
verify(mock_status).update()
|
||||
mock_status.update.assert_any_call()
|
||||
|
||||
def test_prepare_pkg(self):
|
||||
self._prepare_dynamic(['cassandra'])
|
||||
@ -91,7 +89,7 @@ class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
is_db_installed=True)
|
||||
|
||||
def _prepare_dynamic(self, packages,
|
||||
config_content=any(), device_path='/dev/vdb',
|
||||
config_content='MockContent', device_path='/dev/vdb',
|
||||
is_db_installed=True, backup_id=None,
|
||||
is_root_enabled=False,
|
||||
overrides=None):
|
||||
@ -103,25 +101,22 @@ class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
'checksum': 'fake-checksum',
|
||||
}
|
||||
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
mock_app = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
when(mock_status).begin_install().thenReturn(None)
|
||||
|
||||
mock_app = mock()
|
||||
self.manager.app = mock_app
|
||||
|
||||
when(mock_app).install_if_needed(packages).thenReturn(None)
|
||||
(when(pkg.Package).pkg_is_installed(any()).
|
||||
thenReturn(is_db_installed))
|
||||
when(mock_app).init_storage_structure(any()).thenReturn(None)
|
||||
when(mock_app).write_config(config_content).thenReturn(None)
|
||||
when(mock_app).make_host_reachable().thenReturn(None)
|
||||
when(mock_app).restart().thenReturn(None)
|
||||
when(os.path).exists(any()).thenReturn(True)
|
||||
|
||||
when(volume.VolumeDevice).format().thenReturn(None)
|
||||
when(volume.VolumeDevice).migrate_data(any()).thenReturn(None)
|
||||
when(volume.VolumeDevice).mount().thenReturn(None)
|
||||
mock_status.begin_install = MagicMock(return_value=None)
|
||||
mock_app.install_if_needed = MagicMock(return_value=None)
|
||||
pkg.Package.pkg_is_installed = MagicMock(return_value=is_db_installed)
|
||||
mock_app.init_storage_structure = MagicMock(return_value=None)
|
||||
mock_app.write_config = MagicMock(return_value=None)
|
||||
mock_app.make_host_reachable = MagicMock(return_value=None)
|
||||
mock_app.restart = 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)
|
||||
|
||||
# invocation
|
||||
self.manager.prepare(context=self.context, packages=packages,
|
||||
@ -132,9 +127,10 @@ class GuestAgentCassandraDBManagerTest(testtools.TestCase):
|
||||
mount_point="/var/lib/cassandra",
|
||||
backup_info=backup_info,
|
||||
overrides=None)
|
||||
|
||||
# verification/assertion
|
||||
verify(mock_status).begin_install()
|
||||
verify(mock_app).install_if_needed(packages)
|
||||
verify(mock_app).init_storage_structure(any())
|
||||
verify(mock_app).make_host_reachable()
|
||||
verify(mock_app).restart()
|
||||
mock_status.begin_install.assert_any_call()
|
||||
mock_app.install_if_needed.assert_any_call(packages)
|
||||
mock_app.init_storage_structure.assert_any_call('/var/lib/cassandra')
|
||||
mock_app.make_host_reachable.assert_any_call()
|
||||
mock_app.restart.assert_any_call()
|
||||
|
@ -13,8 +13,7 @@
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
from mock import Mock
|
||||
from mockito import verify, when, unstub, any, mock
|
||||
from mock import MagicMock
|
||||
from trove.common.context import TroveContext
|
||||
from trove.guestagent import volume
|
||||
from trove.guestagent.common import operating_system
|
||||
@ -34,7 +33,11 @@ class GuestAgentCouchbaseManagerTest(testtools.TestCase):
|
||||
self.origin_mount = volume.VolumeDevice.mount
|
||||
self.origin_stop_db = couch_service.CouchbaseApp.stop_db
|
||||
self.origin_start_db = couch_service.CouchbaseApp.start_db
|
||||
operating_system.get_ip_address = Mock()
|
||||
self.origin_restart = couch_service.CouchbaseApp.restart
|
||||
self.origin_install_if = couch_service.CouchbaseApp.install_if_needed
|
||||
self.origin_complete_install = \
|
||||
couch_service.CouchbaseApp.complete_install_or_restart
|
||||
operating_system.get_ip_address = MagicMock()
|
||||
|
||||
def tearDown(self):
|
||||
super(GuestAgentCouchbaseManagerTest, self).tearDown()
|
||||
@ -43,53 +46,60 @@ class GuestAgentCouchbaseManagerTest(testtools.TestCase):
|
||||
volume.VolumeDevice.mount = self.origin_mount
|
||||
couch_service.CouchbaseApp.stop_db = self.origin_stop_db
|
||||
couch_service.CouchbaseApp.start_db = self.origin_start_db
|
||||
unstub()
|
||||
couch_service.CouchbaseApp.restart = self.origin_restart
|
||||
couch_service.CouchbaseApp.install_if_needed = self.origin_install_if
|
||||
couch_service.CouchbaseApp.complete_install_or_restart = \
|
||||
self.origin_complete_install
|
||||
|
||||
def test_update_status(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
self.manager.update_status(self.context)
|
||||
verify(mock_status).update()
|
||||
mock_status.update.assert_any_call()
|
||||
|
||||
def test_prepare_device_path_true(self):
|
||||
self._prepare_dynamic()
|
||||
|
||||
def _prepare_dynamic(self, device_path='/dev/vdb', is_db_installed=True,
|
||||
backup_info=None):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
when(mock_status).begin_install().thenReturn(None)
|
||||
when(volume.VolumeDevice).format().thenReturn(None)
|
||||
when(volume.VolumeDevice).mount().thenReturn(None)
|
||||
when(couch_service.CouchbaseApp).install_if_needed().thenReturn(None)
|
||||
when(couch_service.CouchbaseApp).complete_install_or_restart(
|
||||
any()).thenReturn(None)
|
||||
|
||||
mock_status.begin_install = MagicMock(return_value=None)
|
||||
volume.VolumeDevice.format = MagicMock(return_value=None)
|
||||
volume.VolumeDevice.mount = MagicMock(return_value=None)
|
||||
couch_service.CouchbaseApp.install_if_needed = MagicMock(
|
||||
return_value=None)
|
||||
couch_service.CouchbaseApp.complete_install_or_restart = MagicMock(
|
||||
return_value=None)
|
||||
|
||||
#invocation
|
||||
self.manager.prepare(self.context, self.packages, None, 2048,
|
||||
None, device_path=device_path,
|
||||
mount_point='/var/lib/couchbase',
|
||||
backup_info=backup_info)
|
||||
#verification/assertion
|
||||
verify(mock_status).begin_install()
|
||||
verify(couch_service.CouchbaseApp).install_if_needed(self.packages)
|
||||
verify(couch_service.CouchbaseApp).complete_install_or_restart()
|
||||
mock_status.begin_install.assert_any_call()
|
||||
couch_service.CouchbaseApp.install_if_needed.assert_any_call(
|
||||
self.packages)
|
||||
couch_service.CouchbaseApp.complete_install_or_restart.\
|
||||
assert_any_call()
|
||||
|
||||
def test_restart(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
when(couch_service.CouchbaseApp).restart().thenReturn(None)
|
||||
couch_service.CouchbaseApp.restart = MagicMock(return_value=None)
|
||||
#invocation
|
||||
self.manager.restart(self.context)
|
||||
#verification/assertion
|
||||
verify(couch_service.CouchbaseApp).restart()
|
||||
couch_service.CouchbaseApp.restart.assert_any_call()
|
||||
|
||||
def test_stop_db(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
when(couch_service.CouchbaseApp).stop_db(
|
||||
do_not_start_on_reboot=False).thenReturn(None)
|
||||
couch_service.CouchbaseApp.stop_db = MagicMock(return_value=None)
|
||||
#invocation
|
||||
self.manager.stop_db(self.context)
|
||||
#verification/assertion
|
||||
verify(couch_service.CouchbaseApp).stop_db(
|
||||
couch_service.CouchbaseApp.stop_db.assert_any_call(
|
||||
do_not_start_on_reboot=False)
|
||||
|
@ -17,14 +17,8 @@ from uuid import uuid4
|
||||
import time
|
||||
from mock import Mock
|
||||
from mock import MagicMock
|
||||
from mockito import mock
|
||||
from mockito import when
|
||||
from mockito import any
|
||||
from mockito import unstub
|
||||
from mockito import verify
|
||||
from mockito import contains
|
||||
from mockito import never
|
||||
from mockito import matchers
|
||||
from mock import patch
|
||||
from mock import ANY
|
||||
import sqlalchemy
|
||||
import testtools
|
||||
from testtools.matchers import Is
|
||||
@ -115,8 +109,8 @@ class DbaasTest(testtools.TestCase):
|
||||
self.assertRaises(RuntimeError, dbaas.get_auth_password)
|
||||
|
||||
def test_service_discovery(self):
|
||||
when(os.path).isfile(any()).thenReturn(True)
|
||||
mysql_service = dbaas.operating_system.service_discovery(["mysql"])
|
||||
with patch.object(os.path, 'isfile', return_value=True):
|
||||
mysql_service = dbaas.operating_system.service_discovery(["mysql"])
|
||||
self.assertIsNotNone(mysql_service['cmd_start'])
|
||||
self.assertIsNotNone(mysql_service['cmd_enable'])
|
||||
|
||||
@ -125,10 +119,10 @@ class DbaasTest(testtools.TestCase):
|
||||
output = "mysqld would've been started with the these args:\n"\
|
||||
"--user=mysql --port=3306 --basedir=/usr "\
|
||||
"--tmpdir=/tmp --skip-external-locking"
|
||||
when(os.path).isfile(any()).thenReturn(True)
|
||||
dbaas.utils.execute = Mock(return_value=(output, None))
|
||||
|
||||
options = dbaas.load_mysqld_options()
|
||||
with patch.object(os.path, 'isfile', return_value=True):
|
||||
dbaas.utils.execute = Mock(return_value=(output, None))
|
||||
options = dbaas.load_mysqld_options()
|
||||
|
||||
self.assertEqual(5, len(options))
|
||||
self.assertEqual(options["user"], "mysql")
|
||||
@ -164,18 +158,16 @@ class MySqlAdminMockTest(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(MySqlAdminMockTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_list_databases(self):
|
||||
mock_conn = mock_admin_sql_connection()
|
||||
mock_conn = mock_sql_connection()
|
||||
|
||||
when(mock_conn).execute(
|
||||
TextClauseMatcher('schema_name as name')).thenReturn(
|
||||
ResultSetStub([('db1', 'utf8', 'utf8_bin'),
|
||||
('db2', 'utf8', 'utf8_bin'),
|
||||
('db3', 'utf8', 'utf8_bin')]))
|
||||
|
||||
databases, next_marker = MySqlAdmin().list_databases(limit=10)
|
||||
with patch.object(mock_conn, 'execute',
|
||||
return_value=ResultSetStub(
|
||||
[('db1', 'utf8', 'utf8_bin'),
|
||||
('db2', 'utf8', 'utf8_bin'),
|
||||
('db3', 'utf8', 'utf8_bin')])):
|
||||
databases, next_marker = MySqlAdmin().list_databases(limit=10)
|
||||
|
||||
self.assertThat(next_marker, Is(None))
|
||||
self.assertThat(len(databases), Is(3))
|
||||
@ -681,11 +673,13 @@ class MySqlAppInstallTest(MySqlAppTest):
|
||||
super(MySqlAppInstallTest, self).setUp()
|
||||
self.orig_create_engine = sqlalchemy.create_engine
|
||||
self.orig_pkg_version = dbaas.packager.pkg_version
|
||||
self.orig_utils_execute_with_timeout = utils.execute_with_timeout
|
||||
|
||||
def tearDown(self):
|
||||
super(MySqlAppInstallTest, self).tearDown()
|
||||
sqlalchemy.create_engine = self.orig_create_engine
|
||||
dbaas.packager.pkg_version = self.orig_pkg_version
|
||||
utils.execute_with_timeout = self.orig_utils_execute_with_timeout
|
||||
|
||||
def test_install(self):
|
||||
|
||||
@ -752,113 +746,103 @@ class MySqlAppInstallTest(MySqlAppTest):
|
||||
self.assert_reported_status(rd_instance.ServiceStatuses.NEW)
|
||||
|
||||
|
||||
class TextClauseMatcher(matchers.Matcher):
|
||||
class TextClauseMatcher(object):
|
||||
def __init__(self, text):
|
||||
self.contains = contains(text)
|
||||
self.text = text
|
||||
|
||||
def __repr__(self):
|
||||
return "TextClause(%s)" % self.contains.sub
|
||||
return "TextClause(%s)" % self.text
|
||||
|
||||
def matches(self, arg):
|
||||
def __eq__(self, arg):
|
||||
print("Matching %s" % arg.text)
|
||||
return self.contains.matches(arg.text)
|
||||
return self.text in arg.text
|
||||
|
||||
|
||||
def mock_sql_connection():
|
||||
mock_engine = mock()
|
||||
when(sqlalchemy).create_engine("mysql://root:@localhost:3306",
|
||||
echo=True).thenReturn(mock_engine)
|
||||
mock_conn = mock()
|
||||
when(dbaas.LocalSqlClient).__enter__().thenReturn(mock_conn)
|
||||
when(dbaas.LocalSqlClient).__exit__(any(), any(), any()).thenReturn(None)
|
||||
return mock_conn
|
||||
|
||||
|
||||
def mock_admin_sql_connection():
|
||||
when(utils).execute_with_timeout("sudo", "awk", any(), any()).thenReturn(
|
||||
['fake_password', None])
|
||||
mock_engine = mock()
|
||||
when(sqlalchemy).create_engine("mysql://root:@localhost:3306",
|
||||
pool_recycle=any(), echo=True,
|
||||
listeners=[any()]).thenReturn(mock_engine)
|
||||
mock_conn = mock()
|
||||
when(dbaas.LocalSqlClient).__enter__().thenReturn(mock_conn)
|
||||
when(dbaas.LocalSqlClient).__exit__(any(), any(), any()).thenReturn(None)
|
||||
utils.execute_with_timeout = MagicMock(return_value=['fake_password',
|
||||
None])
|
||||
mock_engine = MagicMock()
|
||||
sqlalchemy.create_engine = MagicMock(return_value=mock_engine)
|
||||
mock_conn = MagicMock()
|
||||
dbaas.LocalSqlClient.__enter__ = MagicMock(return_value=mock_conn)
|
||||
dbaas.LocalSqlClient.__exit__ = MagicMock(return_value=None)
|
||||
return mock_conn
|
||||
|
||||
|
||||
class MySqlAppMockTest(testtools.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(MySqlAppMockTest, self).setUp()
|
||||
self.orig_utils_execute_with_timeout = utils.execute_with_timeout
|
||||
|
||||
def tearDown(self):
|
||||
super(MySqlAppMockTest, self).tearDown()
|
||||
unstub()
|
||||
utils.execute_with_timeout = self.orig_utils_execute_with_timeout
|
||||
|
||||
def test_secure_keep_root(self):
|
||||
mock_conn = mock_sql_connection()
|
||||
|
||||
when(mock_conn).execute(any()).thenReturn(None)
|
||||
when(utils).execute_with_timeout("sudo", any(str), "stop").thenReturn(
|
||||
None)
|
||||
# skip writing the file for now
|
||||
when(os.path).isfile(any()).thenReturn(False)
|
||||
when(utils).execute_with_timeout(
|
||||
"sudo", "chmod", any(), any()).thenReturn(None)
|
||||
mock_status = mock()
|
||||
when(mock_status).wait_for_real_status_to_change_to(
|
||||
any(), any(), any()).thenReturn(True)
|
||||
when(dbaas).clear_expired_password().thenReturn(None)
|
||||
app = MySqlApp(mock_status)
|
||||
when(app)._write_mycnf(any(), any()).thenReturn(True)
|
||||
when(app).start_mysql().thenReturn(None)
|
||||
when(app).stop_db().thenReturn(None)
|
||||
app.secure('foo', None)
|
||||
verify(mock_conn, never).execute(TextClauseMatcher('root'))
|
||||
with patch.object(mock_conn, 'execute', return_value=None):
|
||||
utils.execute_with_timeout = MagicMock(return_value=None)
|
||||
# skip writing the file for now
|
||||
with patch.object(os.path, 'isfile', return_value=False):
|
||||
mock_status = MagicMock()
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=True)
|
||||
dbaas.clear_expired_password = MagicMock(return_value=None)
|
||||
app = MySqlApp(mock_status)
|
||||
app._write_mycnf = MagicMock(return_value=True)
|
||||
app.start_mysql = MagicMock(return_value=None)
|
||||
app.stop_db = MagicMock(return_value=None)
|
||||
app.secure('foo', None)
|
||||
self.assertTrue(mock_conn.execute.called)
|
||||
|
||||
|
||||
class MySqlRootStatusTest(testtools.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(MySqlRootStatusTest, self).setUp()
|
||||
self.orig_utils_execute_with_timeout = utils.execute_with_timeout
|
||||
|
||||
def tearDown(self):
|
||||
super(MySqlRootStatusTest, self).tearDown()
|
||||
unstub()
|
||||
utils.execute_with_timeout = self.orig_utils_execute_with_timeout
|
||||
|
||||
def test_root_is_enabled(self):
|
||||
mock_conn = mock_admin_sql_connection()
|
||||
mock_conn = mock_sql_connection()
|
||||
|
||||
mock_rs = mock()
|
||||
mock_rs = MagicMock()
|
||||
mock_rs.rowcount = 1
|
||||
when(mock_conn).execute(
|
||||
TextClauseMatcher(
|
||||
"User = 'root' AND Host != 'localhost'")).thenReturn(mock_rs)
|
||||
|
||||
self.assertThat(MySqlRootAccess().is_root_enabled(), Is(True))
|
||||
with patch.object(mock_conn, 'execute', return_value=mock_rs):
|
||||
self.assertThat(MySqlRootAccess().is_root_enabled(), Is(True))
|
||||
|
||||
def test_root_is_not_enabled(self):
|
||||
mock_conn = mock_admin_sql_connection()
|
||||
mock_conn = mock_sql_connection()
|
||||
|
||||
mock_rs = mock()
|
||||
mock_rs = MagicMock()
|
||||
mock_rs.rowcount = 0
|
||||
when(mock_conn).execute(
|
||||
TextClauseMatcher(
|
||||
"User = 'root' AND Host != 'localhost'")).thenReturn(mock_rs)
|
||||
|
||||
self.assertThat(MySqlRootAccess.is_root_enabled(), Equals(False))
|
||||
with patch.object(mock_conn, 'execute', return_value=mock_rs):
|
||||
self.assertThat(MySqlRootAccess.is_root_enabled(), Equals(False))
|
||||
|
||||
def test_enable_root(self):
|
||||
mock_conn = mock_admin_sql_connection()
|
||||
when(mock_conn).execute(any()).thenReturn(None)
|
||||
# invocation
|
||||
user_ser = MySqlRootAccess.enable_root()
|
||||
# verification
|
||||
self.assertThat(user_ser, Not(Is(None)))
|
||||
verify(mock_conn).execute(TextClauseMatcher('CREATE USER'),
|
||||
user='root', host='%')
|
||||
verify(mock_conn).execute(TextClauseMatcher(
|
||||
'GRANT ALL PRIVILEGES ON *.*'))
|
||||
verify(mock_conn).execute(TextClauseMatcher('UPDATE mysql.user'))
|
||||
mock_conn = mock_sql_connection()
|
||||
|
||||
with patch.object(mock_conn, 'execute', return_value=None):
|
||||
# invocation
|
||||
user_ser = MySqlRootAccess.enable_root()
|
||||
# verification
|
||||
self.assertThat(user_ser, Not(Is(None)))
|
||||
mock_conn.execute.assert_any_call(TextClauseMatcher('CREATE USER'),
|
||||
user='root', host='%')
|
||||
mock_conn.execute.assert_any_call(TextClauseMatcher(
|
||||
'GRANT ALL PRIVILEGES ON *.*'))
|
||||
mock_conn.execute.assert_any_call(TextClauseMatcher(
|
||||
'UPDATE mysql.user'))
|
||||
|
||||
def test_enable_root_failed(self):
|
||||
when(models.MySQLUser)._is_valid_user_name(any()).thenReturn(False)
|
||||
self.assertRaises(ValueError, MySqlAdmin().enable_root)
|
||||
with patch.object(models.MySQLUser, '_is_valid_user_name',
|
||||
return_value=False):
|
||||
self.assertRaises(ValueError, MySqlAdmin().enable_root)
|
||||
|
||||
|
||||
class MockStats:
|
||||
@ -871,7 +855,6 @@ class InterrogatorTest(testtools.TestCase):
|
||||
|
||||
def tearDown(self):
|
||||
super(InterrogatorTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_to_gb(self):
|
||||
result = to_gb(123456789)
|
||||
@ -882,8 +865,8 @@ class InterrogatorTest(testtools.TestCase):
|
||||
self.assertEqual(result, 0.0)
|
||||
|
||||
def test_get_filesystem_volume_stats(self):
|
||||
when(os).statvfs(any()).thenReturn(MockStats)
|
||||
result = get_filesystem_volume_stats('/some/path/')
|
||||
with patch.object(os, 'statvfs', return_value=MockStats):
|
||||
result = get_filesystem_volume_stats('/some/path/')
|
||||
|
||||
self.assertEqual(result['block_size'], 4096)
|
||||
self.assertEqual(result['total_blocks'], 1048576)
|
||||
@ -893,10 +876,10 @@ class InterrogatorTest(testtools.TestCase):
|
||||
self.assertEqual(result['used'], 2.0)
|
||||
|
||||
def test_get_filesystem_volume_stats_error(self):
|
||||
when(os).statvfs(any()).thenRaise(OSError)
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
get_filesystem_volume_stats, '/nonexistent/path')
|
||||
with patch.object(os, 'statvfs', side_effect=OSError):
|
||||
self.assertRaises(
|
||||
RuntimeError,
|
||||
get_filesystem_volume_stats, '/nonexistent/path')
|
||||
|
||||
|
||||
class ServiceRegistryTest(testtools.TestCase):
|
||||
@ -1226,175 +1209,161 @@ class TestRedisApp(testtools.TestCase):
|
||||
utils.execute_with_timeout = self.orig_utils_execute_with_timeout
|
||||
rservice.utils.execute_with_timeout = \
|
||||
self.orig_utils_execute_with_timeout
|
||||
unstub()
|
||||
|
||||
def test_install_if_needed_installed(self):
|
||||
when(pkg.Package).pkg_is_installed(any()).thenReturn(True)
|
||||
when(RedisApp)._install_redis('bar').thenReturn(None)
|
||||
self.app.install_if_needed('bar')
|
||||
verify(pkg.Package).pkg_is_installed('bar')
|
||||
verify(RedisApp, times=0)._install_redis('bar')
|
||||
with patch.object(pkg.Package, 'pkg_is_installed', return_value=True):
|
||||
with patch.object(RedisApp, '_install_redis', return_value=None):
|
||||
self.app.install_if_needed('bar')
|
||||
pkg.Package.pkg_is_installed.assert_any_call('bar')
|
||||
self.assertEqual(RedisApp._install_redis.call_count, 0)
|
||||
|
||||
def test_install_if_needed_not_installed(self):
|
||||
when(pkg.Package).pkg_is_installed(any()).thenReturn(False)
|
||||
when(RedisApp)._install_redis('asdf').thenReturn(None)
|
||||
self.app.install_if_needed('asdf')
|
||||
verify(pkg.Package).pkg_is_installed('asdf')
|
||||
verify(RedisApp)._install_redis('asdf')
|
||||
with patch.object(pkg.Package, 'pkg_is_installed', return_value=False):
|
||||
with patch.object(RedisApp, '_install_redis', return_value=None):
|
||||
self.app.install_if_needed('asdf')
|
||||
pkg.Package.pkg_is_installed.assert_any_call('asdf')
|
||||
RedisApp._install_redis.assert_any_call('asdf')
|
||||
|
||||
def test_install_redis(self):
|
||||
when(utils).execute_with_timeout(any())
|
||||
when(pkg.Package).pkg_install('redis', {}, 1200).thenReturn(None)
|
||||
when(RedisApp).start_redis().thenReturn(None)
|
||||
self.app._install_redis('redis')
|
||||
verify(utils).execute_with_timeout(any())
|
||||
verify(pkg.Package).pkg_install('redis', {}, 1200)
|
||||
verify(RedisApp).start_redis()
|
||||
with patch.object(utils, 'execute_with_timeout'):
|
||||
with patch.object(pkg.Package, 'pkg_install', return_value=None):
|
||||
with patch.object(RedisApp, 'start_redis', return_value=None):
|
||||
self.app._install_redis('redis')
|
||||
pkg.Package.pkg_install.assert_any_call('redis', {}, 1200)
|
||||
RedisApp.start_redis.assert_any_call()
|
||||
self.assertTrue(utils.execute_with_timeout.called)
|
||||
|
||||
def test_enable_redis_on_boot_without_upstart(self):
|
||||
when(os.path).isfile(RedisSystem.REDIS_INIT).thenReturn(False)
|
||||
when(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_ENABLE,
|
||||
shell=True).thenReturn(None)
|
||||
self.app._enable_redis_on_boot()
|
||||
verify(os.path).isfile(RedisSystem.REDIS_INIT)
|
||||
verify(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_ENABLE,
|
||||
shell=True)
|
||||
with patch.object(os.path, 'isfile', return_value=False):
|
||||
with patch.object(utils, 'execute_with_timeout',
|
||||
return_value=None):
|
||||
self.app._enable_redis_on_boot()
|
||||
os.path.isfile.assert_any_call(RedisSystem.REDIS_INIT)
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'sudo ' + RedisSystem.REDIS_CMD_ENABLE,
|
||||
shell=True)
|
||||
|
||||
def test_enable_redis_on_boot_with_upstart(self):
|
||||
when(os.path).isfile(RedisSystem.REDIS_INIT).thenReturn(True)
|
||||
when(utils).execute_with_timeout("sudo sed -i '/^manual$/d' " +
|
||||
RedisSystem.REDIS_INIT,
|
||||
shell=True).thenReturn(None)
|
||||
self.app._enable_redis_on_boot()
|
||||
verify(os.path).isfile(RedisSystem.REDIS_INIT)
|
||||
verify(utils).execute_with_timeout("sudo sed -i '/^manual$/d' " +
|
||||
RedisSystem.REDIS_INIT,
|
||||
shell=True)
|
||||
with patch.object(os.path, 'isfile', return_value=True):
|
||||
with patch.object(utils, 'execute_with_timeout',
|
||||
return_value=None):
|
||||
self.app._enable_redis_on_boot()
|
||||
os.path.isfile.assert_any_call(RedisSystem.REDIS_INIT)
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
"sudo sed -i '/^manual$/d' " + RedisSystem.REDIS_INIT,
|
||||
shell=True)
|
||||
|
||||
def test_disable_redis_on_boot_with_upstart(self):
|
||||
when(os.path).isfile(RedisSystem.REDIS_INIT).thenReturn(True)
|
||||
when(utils).execute_with_timeout('echo',
|
||||
"'manual'",
|
||||
'>>',
|
||||
RedisSystem.REDIS_INIT,
|
||||
run_as_root=True,
|
||||
root_helper='sudo').thenReturn(None)
|
||||
self.app._disable_redis_on_boot()
|
||||
verify(os.path).isfile(RedisSystem.REDIS_INIT)
|
||||
verify(utils).execute_with_timeout('echo',
|
||||
"'manual'",
|
||||
'>>',
|
||||
RedisSystem.REDIS_INIT,
|
||||
run_as_root=True,
|
||||
root_helper='sudo')
|
||||
with patch.object(os.path, 'isfile', return_value=True):
|
||||
with patch.object(utils, 'execute_with_timeout',
|
||||
return_value=None):
|
||||
self.app._disable_redis_on_boot()
|
||||
os.path.isfile.assert_any_call(RedisSystem.REDIS_INIT)
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'echo',
|
||||
"'manual'",
|
||||
'>>',
|
||||
RedisSystem.REDIS_INIT,
|
||||
run_as_root=True,
|
||||
root_helper='sudo')
|
||||
|
||||
def test_disable_redis_on_boot_without_upstart(self):
|
||||
when(os.path).isfile(RedisSystem.REDIS_INIT).thenReturn(False)
|
||||
when(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_DISABLE,
|
||||
shell=True).thenReturn(None)
|
||||
self.app._disable_redis_on_boot()
|
||||
verify(os.path).isfile(RedisSystem.REDIS_INIT)
|
||||
verify(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_DISABLE,
|
||||
shell=True)
|
||||
with patch.object(os.path, 'isfile', return_value=False):
|
||||
with patch.object(utils, 'execute_with_timeout',
|
||||
return_value=None):
|
||||
self.app._disable_redis_on_boot()
|
||||
os.path.isfile.assert_any_call(RedisSystem.REDIS_INIT)
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'sudo ' + RedisSystem.REDIS_CMD_DISABLE,
|
||||
shell=True)
|
||||
|
||||
def test_stop_db_without_fail(self):
|
||||
mock_status = mock()
|
||||
when(mock_status).wait_for_real_status_to_change_to(
|
||||
any(), any(), any()).thenReturn(True)
|
||||
mock_status = MagicMock()
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=True)
|
||||
app = RedisApp(mock_status, state_change_wait_time=0)
|
||||
when(RedisApp)._disable_redis_on_boot().thenReturn(None)
|
||||
when(utils).execute_with_timeout('sudo ' + RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True).thenReturn(None)
|
||||
when(mock_status).wait_for_real_status_to_change_to(
|
||||
any(),
|
||||
any(),
|
||||
any()).thenReturn(True)
|
||||
app.stop_db(do_not_start_on_reboot=True)
|
||||
verify(RedisApp)._disable_redis_on_boot()
|
||||
verify(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True)
|
||||
verify(mock_status).wait_for_real_status_to_change_to(
|
||||
any(),
|
||||
any(),
|
||||
any())
|
||||
RedisApp._disable_redis_on_boot = MagicMock(
|
||||
return_value=None)
|
||||
|
||||
with patch.object(utils, 'execute_with_timeout', return_value=None):
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=True)
|
||||
app.stop_db(do_not_start_on_reboot=True)
|
||||
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'sudo ' + RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True)
|
||||
self.assertTrue(RedisApp._disable_redis_on_boot.called)
|
||||
self.assertTrue(
|
||||
mock_status.wait_for_real_status_to_change_to.called)
|
||||
|
||||
def test_stop_db_with_failure(self):
|
||||
mock_status = mock()
|
||||
when(mock_status).wait_for_real_status_to_change_to(
|
||||
any(), any(), any()).thenReturn(True)
|
||||
mock_status = MagicMock()
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=True)
|
||||
app = RedisApp(mock_status, state_change_wait_time=0)
|
||||
when(RedisApp)._disable_redis_on_boot().thenReturn(None)
|
||||
when(utils).execute_with_timeout('sudo ' + RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True).thenReturn(None)
|
||||
when(mock_status).wait_for_real_status_to_change_to(
|
||||
any(),
|
||||
any(),
|
||||
any()).thenReturn(False)
|
||||
app.stop_db(do_not_start_on_reboot=True)
|
||||
verify(RedisApp)._disable_redis_on_boot()
|
||||
verify(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True)
|
||||
verify(mock_status).wait_for_real_status_to_change_to(
|
||||
any(),
|
||||
any(),
|
||||
any())
|
||||
verify(mock_status).end_install_or_restart()
|
||||
RedisApp._disable_redis_on_boot = MagicMock(
|
||||
return_value=None)
|
||||
|
||||
with patch.object(utils, 'execute_with_timeout', return_value=None):
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=False)
|
||||
app.stop_db(do_not_start_on_reboot=True)
|
||||
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'sudo ' + RedisSystem.REDIS_CMD_STOP,
|
||||
shell=True)
|
||||
self.assertTrue(RedisApp._disable_redis_on_boot.called)
|
||||
self.assertTrue(mock_status.end_install_or_restart.called)
|
||||
self.assertTrue(
|
||||
mock_status.wait_for_real_status_to_change_to.called)
|
||||
|
||||
def test_restart(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
app = RedisApp(mock_status, state_change_wait_time=0)
|
||||
when(mock_status).begin_restart().thenReturn(None)
|
||||
when(RedisApp).stop_db().thenReturn(None)
|
||||
when(RedisApp).start_redis().thenReturn(None)
|
||||
when(mock_status).end_install_or_restart().thenReturn(None)
|
||||
app.restart()
|
||||
verify(mock_status).begin_restart()
|
||||
verify(RedisApp).stop_db()
|
||||
verify(RedisApp).start_redis()
|
||||
verify(mock_status).end_install_or_restart()
|
||||
mock_status.begin_restart = MagicMock(return_value=None)
|
||||
with patch.object(RedisApp, 'stop_db', return_value=None):
|
||||
with patch.object(RedisApp, 'start_redis', return_value=None):
|
||||
mock_status.end_install_or_restart = MagicMock(
|
||||
return_value=None)
|
||||
app.restart()
|
||||
mock_status.begin_restart.assert_any_call()
|
||||
RedisApp.stop_db.assert_any_call()
|
||||
RedisApp.start_redis.assert_any_call()
|
||||
mock_status.end_install_or_restart.assert_any_call()
|
||||
|
||||
def test_start_redis(self):
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
app = RedisApp(mock_status, state_change_wait_time=0)
|
||||
when(RedisApp)._enable_redis_on_boot().thenReturn(None)
|
||||
when(utils).execute_with_timeout('sudo ' + RedisSystem.REDIS_CMD_START,
|
||||
shell=True).thenReturn(None)
|
||||
when(mock_status).wait_for_real_status_to_change_to(any(),
|
||||
any(),
|
||||
any()).thenReturn(
|
||||
None)
|
||||
when(utils).execute_with_timeout('pkill', '-9',
|
||||
'redis-server',
|
||||
run_as_root=True,
|
||||
root_helper='sudo').thenReturn(None)
|
||||
when(mock_status).end_install_or_restart().thenReturn(None)
|
||||
app.start_redis()
|
||||
verify(RedisApp)._enable_redis_on_boot()
|
||||
verify(utils).execute_with_timeout('sudo ' +
|
||||
RedisSystem.REDIS_CMD_START,
|
||||
shell=True)
|
||||
verify(mock_status).wait_for_real_status_to_change_to(any(),
|
||||
any(),
|
||||
any())
|
||||
verify(utils).execute_with_timeout('pkill', '-9',
|
||||
'redis-server',
|
||||
run_as_root=True,
|
||||
root_helper='sudo')
|
||||
verify(mock_status).end_install_or_restart()
|
||||
with patch.object(RedisApp, '_enable_redis_on_boot',
|
||||
return_value=None):
|
||||
with patch.object(utils, 'execute_with_timeout',
|
||||
return_value=None):
|
||||
mock_status.wait_for_real_status_to_change_to = MagicMock(
|
||||
return_value=None)
|
||||
mock_status.end_install_or_restart = MagicMock(
|
||||
return_value=None)
|
||||
app.start_redis()
|
||||
|
||||
utils.execute_with_timeout.assert_any_call(
|
||||
'sudo ' + RedisSystem.REDIS_CMD_START,
|
||||
shell=True)
|
||||
utils.execute_with_timeout.assert_any_call('pkill', '-9',
|
||||
'redis-server',
|
||||
run_as_root=True,
|
||||
root_helper='sudo')
|
||||
self.assertTrue(RedisApp._enable_redis_on_boot.called)
|
||||
self.assertTrue(mock_status.end_install_or_restart.called)
|
||||
self.assertTrue(
|
||||
mock_status.wait_for_real_status_to_change_to.callled)
|
||||
|
||||
|
||||
class CassandraDBAppTest(testtools.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(CassandraDBAppTest, self).setUp()
|
||||
self.utils_execute_with_timeout = (cass_service .
|
||||
utils.execute_with_timeout)
|
||||
self.utils_execute_with_timeout = (
|
||||
cass_service.utils.execute_with_timeout)
|
||||
self.sleep = time.sleep
|
||||
self.pkg_version = cass_service.packager.pkg_version
|
||||
self.pkg = cass_service.packager
|
||||
@ -1765,16 +1734,16 @@ class MongoDBAppTest(testtools.TestCase):
|
||||
Mock())
|
||||
|
||||
def test_install_when_db_installed(self):
|
||||
packager_mock = mock()
|
||||
when(packager_mock).pkg_is_installed(any()).thenReturn(True)
|
||||
packager_mock = MagicMock()
|
||||
packager_mock.pkg_is_installed = MagicMock(return_value=True)
|
||||
mongo_system.PACKAGER = packager_mock
|
||||
self.mongoDbApp.install_if_needed(['package'])
|
||||
self.assert_reported_status(rd_instance.ServiceStatuses.NEW)
|
||||
|
||||
def test_install_when_db_not_installed(self):
|
||||
packager_mock = mock()
|
||||
when(packager_mock).pkg_is_installed(any()).thenReturn(False)
|
||||
packager_mock = MagicMock()
|
||||
packager_mock.pkg_is_installed = MagicMock(return_value=False)
|
||||
mongo_system.PACKAGER = packager_mock
|
||||
self.mongoDbApp.install_if_needed(['package'])
|
||||
verify(packager_mock).pkg_install(any(), {}, any())
|
||||
packager_mock.pkg_install.assert_any_call(ANY, {}, ANY)
|
||||
self.assert_reported_status(rd_instance.ServiceStatuses.NEW)
|
||||
|
@ -15,7 +15,7 @@
|
||||
import os
|
||||
|
||||
import testtools
|
||||
from mockito import verify, when, unstub, any, mock
|
||||
from mock import MagicMock
|
||||
from trove.common.context import TroveContext
|
||||
from trove.guestagent import volume
|
||||
from trove.guestagent.datastore.mongodb import service as mongo_service
|
||||
@ -46,12 +46,11 @@ class GuestAgentMongoDBManagerTest(testtools.TestCase):
|
||||
volume.VolumeDevice.mount = self.origin_mount
|
||||
mongo_service.MongoDBApp.stop_db = self.origin_stop_db
|
||||
mongo_service.MongoDBApp.start_db = self.origin_start_db
|
||||
unstub()
|
||||
|
||||
def test_update_status(self):
|
||||
self.manager.status = mock()
|
||||
self.manager.status = MagicMock()
|
||||
self.manager.update_status(self.context)
|
||||
verify(self.manager.status).update()
|
||||
self.manager.status.update.assert_any_call()
|
||||
|
||||
def test_prepare_from_backup(self):
|
||||
self._prepare_dynamic(backup_id='backup_id_123abc')
|
||||
@ -65,20 +64,20 @@ class GuestAgentMongoDBManagerTest(testtools.TestCase):
|
||||
'type': 'MongoDBDump',
|
||||
'checksum': 'fake-checksum'} if backup_id else None
|
||||
|
||||
mock_status = mock()
|
||||
mock_status = MagicMock()
|
||||
mock_app = MagicMock()
|
||||
self.manager.status = mock_status
|
||||
when(mock_status).begin_install().thenReturn(None)
|
||||
|
||||
when(VolumeDevice).format().thenReturn(None)
|
||||
when(VolumeDevice).migrate_data(any()).thenReturn(None)
|
||||
when(VolumeDevice).mount().thenReturn(None)
|
||||
|
||||
mock_app = mock()
|
||||
self.manager.app = mock_app
|
||||
when(mock_app).stop_db().thenReturn(None)
|
||||
when(mock_app).start_db().thenReturn(None)
|
||||
when(mock_app).clear_storage().thenReturn(None)
|
||||
when(os.path).exists(any()).thenReturn(is_db_installed)
|
||||
|
||||
mock_status.begin_install = MagicMock(return_value=None)
|
||||
volume.VolumeDevice.format = MagicMock(return_value=None)
|
||||
volume.VolumeDevice.migrate_data = MagicMock(return_value=None)
|
||||
volume.VolumeDevice.mount = MagicMock(return_value=None)
|
||||
|
||||
mock_app.stop_db = MagicMock(return_value=None)
|
||||
mock_app.start_db = MagicMock(return_value=None)
|
||||
mock_app.clear_storage = MagicMock(return_value=None)
|
||||
os.path.exists = MagicMock(return_value=is_db_installed)
|
||||
|
||||
# invocation
|
||||
self.manager.prepare(context=self.context, databases=None,
|
||||
@ -87,9 +86,10 @@ class GuestAgentMongoDBManagerTest(testtools.TestCase):
|
||||
device_path=device_path,
|
||||
mount_point='/var/lib/mongodb',
|
||||
backup_info=backup_info)
|
||||
|
||||
# verification/assertion
|
||||
verify(mock_status).begin_install()
|
||||
verify(VolumeDevice).format()
|
||||
verify(mock_app).stop_db()
|
||||
verify(VolumeDevice).migrate_data(any())
|
||||
verify(mock_app).install_if_needed(any())
|
||||
mock_status.begin_install.assert_any_call()
|
||||
mock_app.install_if_needed.assert_any_call(['package'])
|
||||
mock_app.stop_db.assert_any_call()
|
||||
VolumeDevice.format.assert_any_call()
|
||||
VolumeDevice.migrate_data.assert_any_call('/var/lib/mongodb')
|
||||
|
@ -15,7 +15,7 @@
|
||||
import os
|
||||
|
||||
import testtools
|
||||
from mockito import verify, when, unstub, any, mock, never
|
||||
from mock import MagicMock
|
||||
from testtools.matchers import Is, Equals, Not
|
||||
from trove.common.context import TroveContext
|
||||
from trove.guestagent import volume
|
||||
@ -23,7 +23,7 @@ from trove.guestagent.datastore.mysql.manager import Manager
|
||||
import trove.guestagent.datastore.mysql.service as dbaas
|
||||
from trove.guestagent import backup
|
||||
from trove.guestagent.volume import VolumeDevice
|
||||
from trove.guestagent import pkg
|
||||
from trove.guestagent import pkg as pkg
|
||||
|
||||
|
||||
class GuestAgentManagerTest(testtools.TestCase):
|
||||
@ -52,94 +52,89 @@ class GuestAgentManagerTest(testtools.TestCase):
|
||||
dbaas.MySqlApp.start_mysql = self.origin_start_mysql
|
||||
pkg.Package.pkg_is_installed = self.origin_pkg_is_installed
|
||||
os.path.exists = self.origin_os_path_exists
|
||||
unstub()
|
||||
|
||||
def test_update_status(self):
|
||||
mock_status = mock()
|
||||
when(dbaas.MySqlAppStatus).get().thenReturn(mock_status)
|
||||
mock_status = MagicMock()
|
||||
dbaas.MySqlAppStatus.get = MagicMock(return_value=mock_status)
|
||||
self.manager.update_status(self.context)
|
||||
verify(dbaas.MySqlAppStatus).get()
|
||||
verify(mock_status).update()
|
||||
dbaas.MySqlAppStatus.get.assert_any_call()
|
||||
mock_status.update.assert_any_call()
|
||||
|
||||
def test_create_database(self):
|
||||
when(dbaas.MySqlAdmin).create_database(['db1']).thenReturn(None)
|
||||
dbaas.MySqlAdmin.create_database = MagicMock(return_value=None)
|
||||
self.manager.create_database(self.context, ['db1'])
|
||||
verify(dbaas.MySqlAdmin).create_database(['db1'])
|
||||
dbaas.MySqlAdmin.create_database.assert_any_call(['db1'])
|
||||
|
||||
def test_create_user(self):
|
||||
when(dbaas.MySqlAdmin).create_user(['user1']).thenReturn(None)
|
||||
dbaas.MySqlAdmin.create_user = MagicMock(return_value=None)
|
||||
self.manager.create_user(self.context, ['user1'])
|
||||
verify(dbaas.MySqlAdmin).create_user(['user1'])
|
||||
dbaas.MySqlAdmin.create_user.assert_any_call(['user1'])
|
||||
|
||||
def test_delete_database(self):
|
||||
databases = ['db1']
|
||||
when(dbaas.MySqlAdmin).delete_database(databases).thenReturn(None)
|
||||
dbaas.MySqlAdmin.delete_database = MagicMock(return_value=None)
|
||||
self.manager.delete_database(self.context, databases)
|
||||
verify(dbaas.MySqlAdmin).delete_database(databases)
|
||||
dbaas.MySqlAdmin.delete_database.assert_any_call(databases)
|
||||
|
||||
def test_delete_user(self):
|
||||
user = ['user1']
|
||||
when(dbaas.MySqlAdmin).delete_user(user).thenReturn(None)
|
||||
dbaas.MySqlAdmin.delete_user = MagicMock(return_value=None)
|
||||
self.manager.delete_user(self.context, user)
|
||||
verify(dbaas.MySqlAdmin).delete_user(user)
|
||||
dbaas.MySqlAdmin.delete_user.assert_any_call(user)
|
||||
|
||||
def test_grant_access(self):
|
||||
username = "test_user"
|
||||
hostname = "test_host"
|
||||
databases = ["test_database"]
|
||||
when(dbaas.MySqlAdmin).grant_access(username,
|
||||
hostname,
|
||||
databases).thenReturn(None)
|
||||
|
||||
dbaas.MySqlAdmin.grant_access = MagicMock(return_value=None)
|
||||
self.manager.grant_access(self.context,
|
||||
username,
|
||||
hostname,
|
||||
databases)
|
||||
|
||||
verify(dbaas.MySqlAdmin).grant_access(username, hostname, databases)
|
||||
dbaas.MySqlAdmin.grant_access.assert_any_call(username,
|
||||
hostname,
|
||||
databases)
|
||||
|
||||
def test_list_databases(self):
|
||||
when(dbaas.MySqlAdmin).list_databases(None, None,
|
||||
False).thenReturn(['database1'])
|
||||
dbaas.MySqlAdmin.list_databases = MagicMock(return_value=['database1'])
|
||||
databases = self.manager.list_databases(self.context)
|
||||
self.assertThat(databases, Not(Is(None)))
|
||||
self.assertThat(databases, Equals(['database1']))
|
||||
verify(dbaas.MySqlAdmin).list_databases(None, None, False)
|
||||
dbaas.MySqlAdmin.list_databases.assert_any_call(None, None, False)
|
||||
|
||||
def test_list_users(self):
|
||||
when(dbaas.MySqlAdmin).list_users(None, None,
|
||||
False).thenReturn(['user1'])
|
||||
dbaas.MySqlAdmin.list_users = MagicMock(return_value=['user1'])
|
||||
users = self.manager.list_users(self.context)
|
||||
self.assertThat(users, Equals(['user1']))
|
||||
verify(dbaas.MySqlAdmin).list_users(None, None, False)
|
||||
dbaas.MySqlAdmin.list_users.assert_any_call(None, None, False)
|
||||
|
||||
def test_get_users(self):
|
||||
username = ['user1']
|
||||
hostname = ['host']
|
||||
when(dbaas.MySqlAdmin).get_user(username,
|
||||
hostname).thenReturn(['user1'])
|
||||
dbaas.MySqlAdmin.get_user = MagicMock(return_value=['user1'])
|
||||
users = self.manager.get_user(self.context, username, hostname)
|
||||
self.assertThat(users, Equals(['user1']))
|
||||
verify(dbaas.MySqlAdmin).get_user(username, hostname)
|
||||
dbaas.MySqlAdmin.get_user.assert_any_call(username, hostname)
|
||||
|
||||
def test_enable_root(self):
|
||||
when(dbaas.MySqlAdmin).enable_root().thenReturn('user_id_stuff')
|
||||
dbaas.MySqlAdmin.enable_root = MagicMock(return_value='user_id_stuff')
|
||||
user_id = self.manager.enable_root(self.context)
|
||||
self.assertThat(user_id, Is('user_id_stuff'))
|
||||
verify(dbaas.MySqlAdmin).enable_root()
|
||||
dbaas.MySqlAdmin.enable_root.assert_any_call()
|
||||
|
||||
def test_is_root_enabled(self):
|
||||
when(dbaas.MySqlAdmin).is_root_enabled().thenReturn(True)
|
||||
dbaas.MySqlAdmin.is_root_enabled = MagicMock(return_value=True)
|
||||
is_enabled = self.manager.is_root_enabled(self.context)
|
||||
self.assertThat(is_enabled, Is(True))
|
||||
verify(dbaas.MySqlAdmin).is_root_enabled()
|
||||
dbaas.MySqlAdmin.is_root_enabled.assert_any_call()
|
||||
|
||||
def test_create_backup(self):
|
||||
when(backup).backup(self.context, 'backup_id_123').thenReturn(None)
|
||||
backup.backup = MagicMock(return_value=None)
|
||||
# entry point
|
||||
Manager().create_backup(self.context, 'backup_id_123')
|
||||
# assertions
|
||||
verify(backup).backup(self.context, 'backup_id_123')
|
||||
backup.backup.assert_any_call(self.context, 'backup_id_123')
|
||||
|
||||
def test_prepare_device_path_true(self):
|
||||
self._prepare_dynamic()
|
||||
@ -171,27 +166,27 @@ class GuestAgentManagerTest(testtools.TestCase):
|
||||
}
|
||||
|
||||
# TODO(juice): this should stub an instance of the MySqlAppStatus
|
||||
mock_status = mock()
|
||||
when(dbaas.MySqlAppStatus).get().thenReturn(mock_status)
|
||||
when(mock_status).begin_install().thenReturn(None)
|
||||
when(VolumeDevice).format().thenReturn(None)
|
||||
when(VolumeDevice).migrate_data(any()).thenReturn(None)
|
||||
when(VolumeDevice).mount().thenReturn(None)
|
||||
when(dbaas.MySqlApp).stop_db().thenReturn(None)
|
||||
when(dbaas.MySqlApp).start_mysql().thenReturn(None)
|
||||
when(dbaas.MySqlApp).install_if_needed(any()).thenReturn(None)
|
||||
when(backup).restore(self.context,
|
||||
backup_info,
|
||||
'/var/lib/mysql').thenReturn(None)
|
||||
when(dbaas.MySqlApp).secure(any()).thenReturn(None)
|
||||
when(dbaas.MySqlApp).secure_root(any()).thenReturn(None)
|
||||
(when(pkg.Package).pkg_is_installed(any()).
|
||||
thenReturn(is_mysql_installed))
|
||||
when(dbaas.MySqlAdmin).is_root_enabled().thenReturn(is_root_enabled)
|
||||
when(dbaas.MySqlAdmin).create_user().thenReturn(None)
|
||||
when(dbaas.MySqlAdmin).create_database().thenReturn(None)
|
||||
mock_status = MagicMock()
|
||||
|
||||
when(os.path).exists(any()).thenReturn(True)
|
||||
dbaas.MySqlAppStatus.get = MagicMock(return_value=mock_status)
|
||||
mock_status.begin_install = MagicMock(return_value=None)
|
||||
VolumeDevice.format = MagicMock(return_value=None)
|
||||
VolumeDevice.migrate_data = MagicMock(return_value=None)
|
||||
VolumeDevice.mount = MagicMock(return_value=None)
|
||||
dbaas.MySqlApp.stop_db = MagicMock(return_value=None)
|
||||
dbaas.MySqlApp.start_mysql = MagicMock(return_value=None)
|
||||
dbaas.MySqlApp.install_if_needed = MagicMock(return_value=None)
|
||||
backup.restore = MagicMock(return_value=None)
|
||||
dbaas.MySqlApp.secure = MagicMock(return_value=None)
|
||||
dbaas.MySqlApp.secure_root = MagicMock(return_value=None)
|
||||
pkg.Package.pkg_is_installed = MagicMock(
|
||||
return_value=is_mysql_installed)
|
||||
dbaas.MySqlAdmin.is_root_enabled = MagicMock(
|
||||
return_value=is_root_enabled)
|
||||
dbaas.MySqlAdmin.create_user = MagicMock(return_value=None)
|
||||
dbaas.MySqlAdmin.create_database = MagicMock(return_value=None)
|
||||
|
||||
os.path.exists = MagicMock(return_value=True)
|
||||
# invocation
|
||||
self.manager.prepare(context=self.context,
|
||||
packages=None,
|
||||
@ -202,18 +197,21 @@ class GuestAgentManagerTest(testtools.TestCase):
|
||||
mount_point='/var/lib/mysql',
|
||||
backup_info=backup_info,
|
||||
overrides=overrides)
|
||||
# verification/assertion
|
||||
verify(mock_status).begin_install()
|
||||
|
||||
verify(VolumeDevice, times=COUNT).format()
|
||||
verify(dbaas.MySqlApp, times=COUNT).stop_db()
|
||||
verify(VolumeDevice, times=COUNT).migrate_data(
|
||||
any())
|
||||
# verification/assertion
|
||||
mock_status.begin_install.assert_any_call()
|
||||
|
||||
self.assertEqual(VolumeDevice.format.call_count, COUNT)
|
||||
self.assertEqual(VolumeDevice.migrate_data.call_count, COUNT)
|
||||
self.assertEqual(dbaas.MySqlApp.stop_db.call_count, COUNT)
|
||||
if backup_info:
|
||||
verify(backup).restore(self.context, backup_info, '/var/lib/mysql')
|
||||
verify(dbaas.MySqlApp).install_if_needed(any())
|
||||
backup.restore.assert_any_call(self.context,
|
||||
backup_info,
|
||||
'/var/lib/mysql')
|
||||
dbaas.MySqlApp.install_if_needed.assert_any_call(None)
|
||||
# We dont need to make sure the exact contents are there
|
||||
verify(dbaas.MySqlApp).secure(any(), overrides)
|
||||
verify(dbaas.MySqlAdmin, never).create_database()
|
||||
verify(dbaas.MySqlAdmin, never).create_user()
|
||||
verify(dbaas.MySqlApp).secure_root(secure_remote_root=any())
|
||||
dbaas.MySqlApp.secure.assert_any_call(None, None)
|
||||
self.assertFalse(dbaas.MySqlAdmin.create_database.called)
|
||||
self.assertFalse(dbaas.MySqlAdmin.create_user.called)
|
||||
dbaas.MySqlApp.secure_root.assert_any_call(
|
||||
secure_remote_root=not is_root_enabled)
|
||||
|
@ -14,8 +14,7 @@
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
from mock import Mock
|
||||
from mockito import when, any
|
||||
from mock import Mock, MagicMock
|
||||
import pexpect
|
||||
from trove.common import utils
|
||||
from trove.guestagent import pkg
|
||||
@ -58,15 +57,12 @@ class PkgDEBInstallTestCase(testtools.TestCase):
|
||||
|
||||
def test_pkg_is_instaled_yes(self):
|
||||
packages = "package1=1.0 package2"
|
||||
when(self.pkg).pkg_version("package1").thenReturn("1.0")
|
||||
when(self.pkg).pkg_version("package2").thenReturn("2.0")
|
||||
self.pkg.pkg_version = MagicMock(side_effect=["1.0", "2.0"])
|
||||
self.assertTrue(self.pkg.pkg_is_installed(packages))
|
||||
|
||||
def test_pkg_is_instaled_no(self):
|
||||
packages = "package1=1.0 package2 package3=3.1"
|
||||
when(self.pkg).pkg_version("package1").thenReturn("1.0")
|
||||
when(self.pkg).pkg_version("package2").thenReturn("2.0")
|
||||
when(self.pkg).pkg_version("package3").thenReturn("3.0")
|
||||
self.pkg.pkg_version = MagicMock(side_effect=["1.0", "2.0", "3.0"])
|
||||
self.assertFalse(self.pkg.pkg_is_installed(packages))
|
||||
|
||||
def test_success_install(self):
|
||||
@ -311,13 +307,14 @@ class PkgRPMInstallTestCase(testtools.TestCase):
|
||||
|
||||
def test_pkg_is_instaled_yes(self):
|
||||
packages = "package1=1.0 package2"
|
||||
when(commands).getstatusoutput(any()).thenReturn({1: "package1=1.0\n"
|
||||
"package2=2.0"})
|
||||
commands.getstatusoutput = MagicMock(return_value={1: "package1=1.0\n"
|
||||
"package2=2.0"})
|
||||
self.assertTrue(self.pkg.pkg_is_installed(packages))
|
||||
|
||||
def test_pkg_is_instaled_no(self):
|
||||
packages = "package1=1.0 package2 package3=3.0"
|
||||
when(commands).getstatusoutput({1: "package1=1.0\npackage2=2.0"})
|
||||
commands.getstatusoutput = MagicMock(return_value={1: "package1=1.0\n"
|
||||
"package2=2.0"})
|
||||
self.assertFalse(self.pkg.pkg_is_installed(packages))
|
||||
|
||||
def test_permission_error(self):
|
||||
|
@ -13,7 +13,7 @@
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
from mockito import verify, when, unstub, any, mock
|
||||
from mock import MagicMock
|
||||
from trove.common.context import TroveContext
|
||||
from trove.guestagent.datastore.redis.manager import Manager as RedisManager
|
||||
import trove.guestagent.datastore.redis.service as redis_service
|
||||
@ -29,9 +29,17 @@ class RedisGuestAgentManagerTest(testtools.TestCase):
|
||||
self.manager = RedisManager()
|
||||
self.packages = 'redis-server'
|
||||
self.origin_RedisAppStatus = redis_service.RedisAppStatus
|
||||
self.origin_stop_redis = redis_service.RedisApp.stop_db
|
||||
self.origin_start_redis = redis_service.RedisApp.start_redis
|
||||
self.origin_stop_redis = redis_service.RedisApp.stop_db
|
||||
self.origin_install_redis = redis_service.RedisApp._install_redis
|
||||
self.origin_write_config = redis_service.RedisApp.write_config
|
||||
self.origin_install_if_needed = \
|
||||
redis_service.RedisApp.install_if_needed
|
||||
self.origin_complete_install_or_restart = \
|
||||
redis_service.RedisApp.complete_install_or_restart
|
||||
self.origin_format = VolumeDevice.format
|
||||
self.origin_mount = VolumeDevice.mount
|
||||
self.origin_restore = backup.restore
|
||||
|
||||
def tearDown(self):
|
||||
super(RedisGuestAgentManagerTest, self).tearDown()
|
||||
@ -39,14 +47,22 @@ class RedisGuestAgentManagerTest(testtools.TestCase):
|
||||
redis_service.RedisApp.stop_db = self.origin_stop_redis
|
||||
redis_service.RedisApp.start_redis = self.origin_start_redis
|
||||
redis_service.RedisApp._install_redis = self.origin_install_redis
|
||||
unstub()
|
||||
redis_service.RedisApp.write_config = self.origin_write_config
|
||||
redis_service.RedisApp.install_if_needed = \
|
||||
self.origin_install_if_needed
|
||||
redis_service.RedisApp.complete_install_or_restart = \
|
||||
self.origin_complete_install_or_restart
|
||||
VolumeDevice.format = self.origin_format
|
||||
VolumeDevice.mount = self.origin_mount
|
||||
backup.restore = self.origin_restore
|
||||
|
||||
def test_update_status(self):
|
||||
mock_status = mock()
|
||||
when(redis_service.RedisAppStatus).get().thenReturn(mock_status)
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
redis_service.RedisAppStatus.get = MagicMock(return_value=mock_status)
|
||||
self.manager.update_status(self.context)
|
||||
verify(redis_service.RedisAppStatus).get()
|
||||
verify(mock_status).update()
|
||||
redis_service.RedisAppStatus.get.assert_any_call()
|
||||
mock_status.update.assert_any_call()
|
||||
|
||||
def test_prepare_redis_not_installed(self):
|
||||
self._prepare_dynamic(is_redis_installed=False)
|
||||
@ -56,42 +72,46 @@ class RedisGuestAgentManagerTest(testtools.TestCase):
|
||||
mount_point='var/lib/redis'):
|
||||
|
||||
# covering all outcomes is starting to cause trouble here
|
||||
mock_status = mock()
|
||||
when(redis_service.RedisAppStatus).get().thenReturn(mock_status)
|
||||
when(mock_status).begin_install().thenReturn(None)
|
||||
when(VolumeDevice).format().thenReturn(None)
|
||||
when(VolumeDevice).mount().thenReturn(None)
|
||||
when(redis_service.RedisApp).start_redis().thenReturn(None)
|
||||
when(redis_service.RedisApp).install_if_needed().thenReturn(None)
|
||||
when(backup).restore(self.context, backup_info).thenReturn(None)
|
||||
when(redis_service.RedisApp).write_config(any()).thenReturn(None)
|
||||
when(redis_service.RedisApp).complete_install_or_restart(
|
||||
any()).thenReturn(None)
|
||||
mock_status = MagicMock()
|
||||
redis_service.RedisAppStatus.get = MagicMock(return_value=mock_status)
|
||||
redis_service.RedisApp.start_redis = MagicMock(return_value=None)
|
||||
redis_service.RedisApp.install_if_needed = MagicMock(return_value=None)
|
||||
redis_service.RedisApp.write_config = MagicMock(return_value=None)
|
||||
redis_service.RedisApp.complete_install_or_restart = MagicMock(
|
||||
return_value=None)
|
||||
mock_status.begin_install = MagicMock(return_value=None)
|
||||
VolumeDevice.format = MagicMock(return_value=None)
|
||||
VolumeDevice.mount = MagicMock(return_value=None)
|
||||
backup.restore = MagicMock(return_value=None)
|
||||
|
||||
self.manager.prepare(self.context, self.packages,
|
||||
None, '2048',
|
||||
None, device_path=device_path,
|
||||
mount_point='/var/lib/redis',
|
||||
backup_info=backup_info)
|
||||
verify(redis_service.RedisAppStatus, times=2).get()
|
||||
verify(mock_status).begin_install()
|
||||
verify(VolumeDevice).format()
|
||||
verify(redis_service.RedisApp).install_if_needed(self.packages)
|
||||
verify(redis_service.RedisApp).write_config(None)
|
||||
verify(redis_service.RedisApp).complete_install_or_restart()
|
||||
|
||||
self.assertEqual(redis_service.RedisAppStatus.get.call_count, 2)
|
||||
mock_status.begin_install.assert_any_call()
|
||||
VolumeDevice.format.assert_any_call()
|
||||
redis_service.RedisApp.install_if_needed.assert_any_call(self.packages)
|
||||
redis_service.RedisApp.write_config.assert_any_call(None)
|
||||
redis_service.RedisApp.complete_install_or_restart.assert_any_call()
|
||||
|
||||
def test_restart(self):
|
||||
mock_status = mock()
|
||||
when(redis_service.RedisAppStatus).get().thenReturn(mock_status)
|
||||
when(redis_service.RedisApp).restart().thenReturn(None)
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
redis_service.RedisAppStatus.get = MagicMock(return_value=mock_status)
|
||||
redis_service.RedisApp.restart = MagicMock(return_value=None)
|
||||
self.manager.restart(self.context)
|
||||
verify(redis_service.RedisAppStatus).get()
|
||||
verify(redis_service.RedisApp).restart()
|
||||
redis_service.RedisAppStatus.get.assert_any_call()
|
||||
redis_service.RedisApp.restart.assert_any_call()
|
||||
|
||||
def test_stop_db(self):
|
||||
mock_status = mock()
|
||||
when(redis_service.RedisAppStatus).get().thenReturn(mock_status)
|
||||
when(redis_service.RedisApp).stop_db(do_not_start_on_reboot=
|
||||
False).thenReturn(None)
|
||||
mock_status = MagicMock()
|
||||
self.manager.appStatus = mock_status
|
||||
redis_service.RedisAppStatus.get = MagicMock(return_value=mock_status)
|
||||
redis_service.RedisApp.stop_db = MagicMock(return_value=None)
|
||||
self.manager.stop_db(self.context)
|
||||
verify(redis_service.RedisAppStatus).get()
|
||||
verify(redis_service.RedisApp).stop_db(do_not_start_on_reboot=False)
|
||||
redis_service.RedisAppStatus.get.assert_any_call()
|
||||
redis_service.RedisApp.stop_db.assert_any_call(
|
||||
do_not_start_on_reboot=False)
|
||||
|
@ -13,14 +13,14 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
from mockito import mock, when, verify, unstub, any
|
||||
from mock import MagicMock, patch, ANY
|
||||
from testtools import TestCase
|
||||
from testtools.matchers import Equals, Is, Not
|
||||
|
||||
from novaclient.v1_1 import Client
|
||||
from novaclient.v1_1.flavors import FlavorManager, Flavor
|
||||
from novaclient.v1_1.servers import Server, ServerManager
|
||||
from oslo.config.cfg import ConfigOpts
|
||||
from oslo.config import cfg
|
||||
from trove.backup.models import Backup
|
||||
from trove.common.context import TroveContext
|
||||
from trove.common import instance as rd_instance
|
||||
@ -34,28 +34,27 @@ from trove.openstack.common.notifier import api as notifier
|
||||
from trove.common import remote
|
||||
from trove.tests.util import test_config
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class MockMgmtInstanceTest(TestCase):
|
||||
def setUp(self):
|
||||
super(MockMgmtInstanceTest, self).setUp()
|
||||
self.context = TroveContext()
|
||||
self.context.auth_token = 'some_secret_password'
|
||||
self.client = mock(Client)
|
||||
self.server_mgr = mock(ServerManager)
|
||||
self.client = MagicMock(spec=Client)
|
||||
self.server_mgr = MagicMock(spec=ServerManager)
|
||||
self.client.servers = self.server_mgr
|
||||
self.flavor_mgr = mock(FlavorManager)
|
||||
self.flavor_mgr = MagicMock(spec=FlavorManager)
|
||||
self.client.flavors = self.flavor_mgr
|
||||
when(remote).create_admin_nova_client(self.context).thenReturn(
|
||||
self.client)
|
||||
when(ConfigOpts)._get('host').thenReturn('test_host')
|
||||
when(ConfigOpts)._get('exists_notification_ticks').thenReturn(1)
|
||||
when(ConfigOpts)._get('report_interval').thenReturn(20)
|
||||
when(ConfigOpts)._get('notification_service_id').thenReturn(
|
||||
{'mysql': '123'})
|
||||
remote.create_admin_nova_client = MagicMock(return_value=self.client)
|
||||
CONF.set_override('host', 'test_host')
|
||||
CONF.set_override('exists_notification_ticks', 1)
|
||||
CONF.set_override('report_interval', 20)
|
||||
CONF.set_override('notification_service_id', {'mysql': '123'})
|
||||
|
||||
def tearDown(self):
|
||||
super(MockMgmtInstanceTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
@staticmethod
|
||||
def build_db_instance(status, task_status=InstanceTasks.DELETING):
|
||||
@ -73,37 +72,44 @@ class MockMgmtInstanceTest(TestCase):
|
||||
|
||||
|
||||
class TestNotificationTransformer(MockMgmtInstanceTest):
|
||||
|
||||
def test_tranformer(self):
|
||||
transformer = mgmtmodels.NotificationTransformer(context=self.context)
|
||||
status = rd_instance.ServiceStatuses.BUILDING.api_status
|
||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||
status, InstanceTasks.BUILDING)
|
||||
|
||||
when(DatabaseModelBase).find_all(deleted=False).thenReturn(
|
||||
[db_instance])
|
||||
stub_dsv_db_info = mock(datastore_models.DBDatastoreVersion)
|
||||
stub_dsv_db_info.id = "test_datastore_version"
|
||||
stub_dsv_db_info.datastore_id = "mysql_test_version"
|
||||
stub_dsv_db_info.name = "test_datastore_name"
|
||||
stub_dsv_db_info.image_id = "test_datastore_image_id"
|
||||
stub_dsv_db_info.packages = "test_datastore_pacakges"
|
||||
stub_dsv_db_info.active = 1
|
||||
stub_dsv_db_info.manager = "mysql"
|
||||
stub_datastore_version = datastore_models.DatastoreVersion(
|
||||
stub_dsv_db_info)
|
||||
when(DatabaseModelBase).find_by(id=any()).thenReturn(
|
||||
stub_datastore_version)
|
||||
with patch.object(DatabaseModelBase, 'find_all',
|
||||
return_value=[db_instance]):
|
||||
stub_dsv_db_info = MagicMock(
|
||||
spec=datastore_models.DBDatastoreVersion)
|
||||
stub_dsv_db_info.id = "test_datastore_version"
|
||||
stub_dsv_db_info.datastore_id = "mysql_test_version"
|
||||
stub_dsv_db_info.name = "test_datastore_name"
|
||||
stub_dsv_db_info.image_id = "test_datastore_image_id"
|
||||
stub_dsv_db_info.packages = "test_datastore_pacakges"
|
||||
stub_dsv_db_info.active = 1
|
||||
stub_dsv_db_info.manager = "mysql"
|
||||
stub_datastore_version = datastore_models.DatastoreVersion(
|
||||
stub_dsv_db_info)
|
||||
|
||||
when(DatabaseModelBase).find_by(instance_id='1').thenReturn(
|
||||
InstanceServiceStatus(rd_instance.ServiceStatuses.BUILDING))
|
||||
def side_effect_func(*args, **kwargs):
|
||||
if 'instance_id' in kwargs:
|
||||
return InstanceServiceStatus(
|
||||
rd_instance.ServiceStatuses.BUILDING)
|
||||
else:
|
||||
return stub_datastore_version
|
||||
|
||||
payloads = transformer()
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'], Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
with patch.object(DatabaseModelBase, 'find_by',
|
||||
side_effect=side_effect_func):
|
||||
payloads = transformer()
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
|
||||
def test_get_service_id(self):
|
||||
id_map = {
|
||||
@ -126,31 +132,33 @@ class TestNotificationTransformer(MockMgmtInstanceTest):
|
||||
|
||||
class TestNovaNotificationTransformer(MockMgmtInstanceTest):
|
||||
def test_transformer_cache(self):
|
||||
flavor = mock(Flavor)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
transformer2 = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
self.assertThat(transformer._flavor_cache,
|
||||
Not(Is(transformer2._flavor_cache)))
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
transformer2 = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
self.assertThat(transformer._flavor_cache,
|
||||
Not(Is(transformer2._flavor_cache)))
|
||||
|
||||
def test_lookup_flavor(self):
|
||||
flavor = mock(Flavor)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'flav_1'
|
||||
when(self.flavor_mgr).get('1').thenReturn(flavor)
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
self.assertThat(transformer._lookup_flavor('1'), Equals(flavor.name))
|
||||
self.assertThat(transformer._lookup_flavor('2'), Equals('unknown'))
|
||||
with patch.object(self.flavor_mgr, 'get', side_effect=[flavor, None]):
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
self.assertThat(transformer._lookup_flavor('1'),
|
||||
Equals(flavor.name))
|
||||
self.assertThat(transformer._lookup_flavor('2'),
|
||||
Equals('unknown'))
|
||||
|
||||
def test_tranformer(self):
|
||||
status = rd_instance.ServiceStatuses.BUILDING.api_status
|
||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||
status, task_status=InstanceTasks.BUILDING)
|
||||
|
||||
stub_dsv_db_info = mock(datastore_models.DBDatastoreVersion)
|
||||
stub_dsv_db_info = MagicMock(spec=datastore_models.DBDatastoreVersion)
|
||||
stub_dsv_db_info.id = "test_datastore_version"
|
||||
stub_dsv_db_info.datastore_id = "mysql_test_version"
|
||||
stub_dsv_db_info.name = "test_datastore_name"
|
||||
@ -160,118 +168,129 @@ class TestNovaNotificationTransformer(MockMgmtInstanceTest):
|
||||
stub_dsv_db_info.manager = "mysql"
|
||||
stub_datastore_version = datastore_models.DatastoreVersion(
|
||||
stub_dsv_db_info)
|
||||
when(DatabaseModelBase).find_by(id=any()).thenReturn(
|
||||
stub_datastore_version)
|
||||
|
||||
server = mock(Server)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
|
||||
server = MagicMock(spec=Server)
|
||||
server.user_id = 'test_user_id'
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertions
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'], Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'], Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'], Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'], Equals('test_user_id'))
|
||||
self.assertThat(payload['service_id'], Equals('123'))
|
||||
with patch.object(DatabaseModelBase, 'find_by',
|
||||
return_value=stub_datastore_version):
|
||||
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
|
||||
# assertions
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'],
|
||||
Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'],
|
||||
Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'], Equals('test_user_id'))
|
||||
self.assertThat(payload['service_id'], Equals('123'))
|
||||
|
||||
def test_tranformer_invalid_datastore_manager(self):
|
||||
status = rd_instance.ServiceStatuses.BUILDING.api_status
|
||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||
status, task_status=InstanceTasks.BUILDING)
|
||||
|
||||
server = mock(Server)
|
||||
server = MagicMock(spec=Server)
|
||||
server.user_id = 'test_user_id'
|
||||
stub_datastore_version = mock()
|
||||
stub_datastore_version = MagicMock()
|
||||
stub_datastore_version.id = "stub_datastore_version"
|
||||
stub_datastore_version.manager = "m0ng0"
|
||||
when(datastore_models.
|
||||
DatastoreVersion).load(any(), any()).thenReturn(
|
||||
stub_datastore_version)
|
||||
when(datastore_models.
|
||||
DatastoreVersion).load_by_uuid(any()).thenReturn(
|
||||
stub_datastore_version)
|
||||
|
||||
stub_datastore = mock()
|
||||
stub_datastore = MagicMock()
|
||||
stub_datastore.default_datastore_version = "stub_datastore_version"
|
||||
when(datastore_models.
|
||||
Datastore).load(any()).thenReturn(stub_datastore)
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertions
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'], Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'], Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'], Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'], Equals('test_user_id'))
|
||||
self.assertThat(payload['service_id'],
|
||||
Equals('unknown-service-id-error'))
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
|
||||
with patch.object(datastore_models.DatastoreVersion, 'load',
|
||||
return_value=stub_datastore_version):
|
||||
with patch.object(datastore_models.DatastoreVersion,
|
||||
'load_by_uuid',
|
||||
return_value=stub_datastore_version):
|
||||
with patch.object(datastore_models.Datastore, 'load',
|
||||
return_value=stub_datastore):
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
with patch.object(self.flavor_mgr,
|
||||
'get', return_value=flavor):
|
||||
|
||||
# invocation
|
||||
transformer = (
|
||||
mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
)
|
||||
|
||||
payloads = transformer()
|
||||
# assertions
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['state'],
|
||||
Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'],
|
||||
Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'],
|
||||
Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'],
|
||||
Equals('test_user_id'))
|
||||
self.assertThat(payload['service_id'],
|
||||
Equals('unknown-service-id-error'))
|
||||
|
||||
def test_tranformer_shutdown_instance(self):
|
||||
status = rd_instance.ServiceStatuses.SHUTDOWN.api_status
|
||||
db_instance = self.build_db_instance(status)
|
||||
|
||||
server = mock(Server)
|
||||
server = MagicMock(spec=Server)
|
||||
server.user_id = 'test_user_id'
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
when(Backup).running('1').thenReturn(None)
|
||||
self.assertThat(mgmt_instance.status, Equals('SHUTDOWN'))
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertion that SHUTDOWN instances are not reported
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(0))
|
||||
|
||||
with patch.object(Backup, 'running', return_value=None):
|
||||
self.assertThat(mgmt_instance.status, Equals('SHUTDOWN'))
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertion that SHUTDOWN instances are not reported
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(0))
|
||||
|
||||
def test_tranformer_no_nova_instance(self):
|
||||
status = rd_instance.ServiceStatuses.SHUTDOWN.api_status
|
||||
@ -281,59 +300,57 @@ class TestNovaNotificationTransformer(MockMgmtInstanceTest):
|
||||
db_instance,
|
||||
None,
|
||||
None)
|
||||
when(Backup).running('1').thenReturn(None)
|
||||
self.assertThat(mgmt_instance.status, Equals('SHUTDOWN'))
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertion that SHUTDOWN instances are not reported
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(0))
|
||||
|
||||
with patch.object(Backup, 'running', return_value=None):
|
||||
self.assertThat(mgmt_instance.status, Equals('SHUTDOWN'))
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
# invocation
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
payloads = transformer()
|
||||
# assertion that SHUTDOWN instances are not reported
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(0))
|
||||
|
||||
def test_tranformer_flavor_cache(self):
|
||||
status = rd_instance.ServiceStatuses.BUILDING.api_status
|
||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||
status, InstanceTasks.BUILDING)
|
||||
|
||||
server = mock(Server)
|
||||
server = MagicMock(spec=Server)
|
||||
server.user_id = 'test_user_id'
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
transformer()
|
||||
# call twice ensure client.flavor invoked once
|
||||
payloads = transformer()
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'], Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'], Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'], Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'], Equals('test_user_id'))
|
||||
# ensure cache was used to get flavor second time
|
||||
verify(self.flavor_mgr).get('flavor_1')
|
||||
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
transformer = mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context)
|
||||
transformer()
|
||||
# call twice ensure client.flavor invoked once
|
||||
payloads = transformer()
|
||||
self.assertIsNotNone(payloads)
|
||||
self.assertThat(len(payloads), Equals(1))
|
||||
payload = payloads[0]
|
||||
self.assertThat(payload['audit_period_beginning'],
|
||||
Not(Is(None)))
|
||||
self.assertThat(payload['audit_period_ending'], Not(Is(None)))
|
||||
self.assertThat(payload['state'], Equals(status.lower()))
|
||||
self.assertThat(payload['instance_type'], Equals('db.small'))
|
||||
self.assertThat(payload['instance_type_id'],
|
||||
Equals('flavor_1'))
|
||||
self.assertThat(payload['user_id'], Equals('test_user_id'))
|
||||
# ensure cache was used to get flavor second time
|
||||
self.flavor_mgr.get.assert_any_call('flavor_1')
|
||||
|
||||
|
||||
class TestMgmtInstanceTasks(MockMgmtInstanceTest):
|
||||
@ -342,34 +359,31 @@ class TestMgmtInstanceTasks(MockMgmtInstanceTest):
|
||||
db_instance = MockMgmtInstanceTest.build_db_instance(
|
||||
status, task_status=InstanceTasks.BUILDING)
|
||||
|
||||
server = mock(Server)
|
||||
server = MagicMock(spec=Server)
|
||||
server.user_id = 'test_user_id'
|
||||
mgmt_instance = mgmtmodels.SimpleMgmtInstance(self.context,
|
||||
db_instance,
|
||||
server,
|
||||
None)
|
||||
when(mgmtmodels).load_mgmt_instances(
|
||||
self.context,
|
||||
deleted=False,
|
||||
client=self.client).thenReturn(
|
||||
[mgmt_instance, mgmt_instance])
|
||||
flavor = mock(Flavor)
|
||||
|
||||
flavor = MagicMock(spec=Flavor)
|
||||
flavor.name = 'db.small'
|
||||
when(self.flavor_mgr).get('flavor_1').thenReturn(flavor)
|
||||
self.assertThat(self.context.auth_token, Is('some_secret_password'))
|
||||
when(notifier).notify(self.context,
|
||||
any(str),
|
||||
'trove.instance.exists',
|
||||
'INFO',
|
||||
any(dict)).thenReturn(None)
|
||||
# invocation
|
||||
mgmtmodels.publish_exist_events(
|
||||
mgmtmodels.NovaNotificationTransformer(context=self.context),
|
||||
self.context)
|
||||
# assertion
|
||||
verify(notifier, times=2).notify(self.context,
|
||||
any(str),
|
||||
'trove.instance.exists',
|
||||
'INFO',
|
||||
any(dict))
|
||||
self.assertThat(self.context.auth_token, Is(None))
|
||||
|
||||
with patch.object(mgmtmodels, 'load_mgmt_instances',
|
||||
return_value=[mgmt_instance]):
|
||||
with patch.object(self.flavor_mgr, 'get', return_value=flavor):
|
||||
self.assertThat(self.context.auth_token,
|
||||
Is('some_secret_password'))
|
||||
with patch.object(notifier, 'notify', return_value=None):
|
||||
# invocation
|
||||
mgmtmodels.publish_exist_events(
|
||||
mgmtmodels.NovaNotificationTransformer(
|
||||
context=self.context),
|
||||
self.context)
|
||||
# assertion
|
||||
notifier.notify.assert_any_call(self.context,
|
||||
'test_host',
|
||||
'trove.instance.exists',
|
||||
'INFO',
|
||||
ANY)
|
||||
self.assertThat(self.context.auth_token, Is(None))
|
||||
|
@ -12,8 +12,7 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
import testtools
|
||||
from mockito import mock, when, unstub, any, verify, never
|
||||
from mock import Mock
|
||||
from mock import Mock, MagicMock, patch
|
||||
from trove.quota.quota import DbQuotaDriver
|
||||
from trove.quota.models import Resource
|
||||
from trove.quota.models import Quota
|
||||
@ -82,17 +81,16 @@ class QuotaControllerTest(testtools.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(QuotaControllerTest, self).setUp()
|
||||
context = mock()
|
||||
context = MagicMock()
|
||||
context.is_admin = True
|
||||
req = mock()
|
||||
req.environ = mock()
|
||||
when(req.environ).get(any()).thenReturn(context)
|
||||
req = MagicMock()
|
||||
req.environ = MagicMock()
|
||||
req.environ.get = MagicMock(return_value=context)
|
||||
self.req = req
|
||||
self.controller = QuotaController()
|
||||
|
||||
def tearDown(self):
|
||||
super(QuotaControllerTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_update_unknown_resource(self):
|
||||
body = {'quotas': {'unknown_resource': 5}}
|
||||
@ -101,47 +99,46 @@ class QuotaControllerTest(testtools.TestCase):
|
||||
FAKE_TENANT1, FAKE_TENANT2)
|
||||
|
||||
def test_update_resource_no_value(self):
|
||||
quota = mock(Quota)
|
||||
when(DatabaseModelBase).find_by(tenant_id=FAKE_TENANT2,
|
||||
resource='instances').thenReturn(quota)
|
||||
body = {'quotas': {'instances': None}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
verify(quota, never).save()
|
||||
self.assertEqual(200, result.status)
|
||||
quota = MagicMock(spec=Quota)
|
||||
with patch.object(DatabaseModelBase, 'find_by', return_value=quota):
|
||||
body = {'quotas': {'instances': None}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
self.assertEqual(quota.save.call_count, 0)
|
||||
self.assertEqual(200, result.status)
|
||||
|
||||
def test_update_resource_instance(self):
|
||||
instance_quota = mock(Quota)
|
||||
when(DatabaseModelBase).find_by(
|
||||
tenant_id=FAKE_TENANT2,
|
||||
resource='instances').thenReturn(instance_quota)
|
||||
body = {'quotas': {'instances': 2}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
verify(instance_quota, times=1).save()
|
||||
self.assertTrue('instances' in result._data['quotas'])
|
||||
self.assertEqual(200, result.status)
|
||||
self.assertEqual(2, result._data['quotas']['instances'])
|
||||
instance_quota = MagicMock(spec=Quota)
|
||||
with patch.object(DatabaseModelBase, 'find_by',
|
||||
return_value=instance_quota):
|
||||
body = {'quotas': {'instances': 2}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
self.assertEqual(instance_quota.save.call_count, 1)
|
||||
self.assertTrue('instances' in result._data['quotas'])
|
||||
self.assertEqual(200, result.status)
|
||||
self.assertEqual(2, result._data['quotas']['instances'])
|
||||
|
||||
@testtools.skipIf(not CONF.trove_volume_support,
|
||||
'Volume support is not enabled')
|
||||
def test_update_resource_volume(self):
|
||||
instance_quota = mock(Quota)
|
||||
when(DatabaseModelBase).find_by(
|
||||
tenant_id=FAKE_TENANT2,
|
||||
resource='instances').thenReturn(instance_quota)
|
||||
volume_quota = mock(Quota)
|
||||
when(DatabaseModelBase).find_by(
|
||||
tenant_id=FAKE_TENANT2,
|
||||
resource='volumes').thenReturn(volume_quota)
|
||||
body = {'quotas': {'instances': None, 'volumes': 10}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
verify(instance_quota, never).save()
|
||||
self.assertFalse('instances' in result._data['quotas'])
|
||||
verify(volume_quota, times=1).save()
|
||||
self.assertEqual(200, result.status)
|
||||
self.assertEqual(10, result._data['quotas']['volumes'])
|
||||
instance_quota = MagicMock(spec=Quota)
|
||||
volume_quota = MagicMock(spec=Quota)
|
||||
|
||||
def side_effect_func(*args, **kwargs):
|
||||
return (instance_quota if kwargs['resource'] == 'instances'
|
||||
else volume_quota)
|
||||
|
||||
with patch.object(DatabaseModelBase, 'find_by',
|
||||
side_effect=side_effect_func):
|
||||
body = {'quotas': {'instances': None, 'volumes': 10}}
|
||||
result = self.controller.update(self.req, body, FAKE_TENANT1,
|
||||
FAKE_TENANT2)
|
||||
self.assertEqual(instance_quota.save.call_count, 0)
|
||||
self.assertFalse('instances' in result._data['quotas'])
|
||||
self.assertEqual(volume_quota.save.call_count, 1)
|
||||
self.assertEqual(200, result.status)
|
||||
self.assertEqual(10, result._data['quotas']['volumes'])
|
||||
|
||||
|
||||
class DbQuotaDriverTest(testtools.TestCase):
|
||||
@ -336,8 +333,12 @@ class DbQuotaDriverTest(testtools.TestCase):
|
||||
in_use=0,
|
||||
reserved=0)]
|
||||
|
||||
def side_effect_func(*args, **kwargs):
|
||||
return (FAKE_QUOTAS[0] if kwargs['resource'] == 'instances'
|
||||
else FAKE_QUOTAS[1])
|
||||
|
||||
self.mock_usage_result.all = Mock(return_value=[])
|
||||
QuotaUsage.create = Mock(side_effect=FAKE_QUOTAS)
|
||||
QuotaUsage.create = Mock(side_effect=side_effect_func)
|
||||
|
||||
usages = self.driver.get_all_quota_usages_by_tenant(FAKE_TENANT1,
|
||||
resources.keys())
|
||||
|
@ -16,7 +16,6 @@ import testtools
|
||||
import uuid
|
||||
import trove.common.remote
|
||||
from mock import Mock
|
||||
from mockito import mock, unstub
|
||||
from trove.common import exception
|
||||
from trove.tests.fakes import nova
|
||||
from trove.extensions.security_group import models as sec_mod
|
||||
@ -103,8 +102,8 @@ class SecurityGroupDeleteTest(testtools.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(SecurityGroupDeleteTest, self).setUp()
|
||||
inst_model.CONF = mock()
|
||||
self.context = mock()
|
||||
inst_model.CONF = Mock()
|
||||
self.context = Mock()
|
||||
self. original_find_by = (sec_mod.
|
||||
SecurityGroupInstanceAssociation.
|
||||
find_by)
|
||||
@ -119,7 +118,6 @@ class SecurityGroupDeleteTest(testtools.TestCase):
|
||||
find_by) = self.original_find_by
|
||||
(sec_mod.SecurityGroupInstanceAssociation.
|
||||
delete) = self.original_delete
|
||||
unstub()
|
||||
|
||||
def _raise(self, ex):
|
||||
raise ex
|
||||
|
@ -14,9 +14,8 @@
|
||||
import datetime
|
||||
|
||||
import testtools
|
||||
from mock import Mock
|
||||
from mock import Mock, MagicMock, patch
|
||||
from testtools.matchers import Equals, Is
|
||||
from mockito import mock, when, unstub, any, verify, never
|
||||
from cinderclient import exceptions as cinder_exceptions
|
||||
import novaclient.v1_1.servers
|
||||
import novaclient.v1_1.flavors
|
||||
@ -102,6 +101,7 @@ class fake_InstanceServiceStatus(object):
|
||||
|
||||
def __init__(self):
|
||||
self.deleted = False
|
||||
self.status = None
|
||||
pass
|
||||
|
||||
def set_status(self, status):
|
||||
@ -163,23 +163,25 @@ class fake_DBInstance(object):
|
||||
class FreshInstanceTasksTest(testtools.TestCase):
|
||||
def setUp(self):
|
||||
super(FreshInstanceTasksTest, self).setUp()
|
||||
mock_instance = patch('trove.instance.models.FreshInstance')
|
||||
mock_instance.start()
|
||||
self.addCleanup(mock_instance.stop)
|
||||
mock_instance.id = Mock(return_value='instance_id')
|
||||
mock_instance.tenant_id = Mock(return_value="tenant_id")
|
||||
mock_instance.hostname = Mock(return_value="hostname")
|
||||
mock_instance.name = Mock(return_value='name')
|
||||
mock_instance.nova_client = Mock(
|
||||
return_value=fake_nova_client())
|
||||
mock_datastore_v = patch(
|
||||
'trove.datastore.models.DatastoreVersion')
|
||||
mock_datastore_v.start()
|
||||
self.addCleanup(mock_datastore_v.stop)
|
||||
mock_datastore = patch(
|
||||
'trove.datastore.models.Datastore')
|
||||
mock_datastore.start()
|
||||
self.addCleanup(mock_datastore.stop)
|
||||
|
||||
when(taskmanager_models.FreshInstanceTasks).id().thenReturn(
|
||||
"instance_id")
|
||||
when(taskmanager_models.FreshInstanceTasks).tenant_id().thenReturn(
|
||||
"tenant_id")
|
||||
when(taskmanager_models.FreshInstanceTasks).hostname().thenReturn(
|
||||
"hostname")
|
||||
when(taskmanager_models.FreshInstanceTasks).name().thenReturn(
|
||||
'name')
|
||||
when(datastore_models.
|
||||
DatastoreVersion).load(any(), any()).thenReturn(mock())
|
||||
when(datastore_models.
|
||||
DatastoreVersion).load_by_uuid(any()).thenReturn(mock())
|
||||
when(datastore_models.
|
||||
Datastore).load(any()).thenReturn(mock())
|
||||
taskmanager_models.FreshInstanceTasks.nova_client = fake_nova_client()
|
||||
taskmanager_models.CONF = mock()
|
||||
self.orig_ISS_find_by = InstanceServiceStatus.find_by
|
||||
self.orig_DBI_find_by = DBInstance.find_by
|
||||
self.userdata = "hello moto"
|
||||
@ -191,7 +193,7 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
self.guestconfig = f.name
|
||||
f.write(self.guestconfig_content)
|
||||
self.freshinstancetasks = taskmanager_models.FreshInstanceTasks(
|
||||
None, mock(), None, None)
|
||||
None, Mock(), None, None)
|
||||
|
||||
def tearDown(self):
|
||||
super(FreshInstanceTasksTest, self).tearDown()
|
||||
@ -199,55 +201,74 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
os.remove(self.guestconfig)
|
||||
InstanceServiceStatus.find_by = self.orig_ISS_find_by
|
||||
DBInstance.find_by = self.orig_DBI_find_by
|
||||
unstub()
|
||||
|
||||
def test_create_instance_userdata(self):
|
||||
when(taskmanager_models.CONF).get(any()).thenReturn('')
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_create_instance_userdata(self, mock_conf):
|
||||
cloudinit_location = os.path.dirname(self.cloudinit)
|
||||
datastore_manager = os.path.splitext(os.path.basename(self.
|
||||
cloudinit))[0]
|
||||
when(taskmanager_models.CONF).get("cloudinit_location").thenReturn(
|
||||
cloudinit_location)
|
||||
|
||||
def fake_conf_getter(*args, **kwargs):
|
||||
if args[0] == 'cloudinit_location':
|
||||
return cloudinit_location
|
||||
else:
|
||||
return ''
|
||||
mock_conf.get.side_effect = fake_conf_getter
|
||||
|
||||
server = self.freshinstancetasks._create_server(
|
||||
None, None, None, datastore_manager, None, None, None)
|
||||
self.assertEqual(server.userdata, self.userdata)
|
||||
|
||||
def test_create_instance_guestconfig(self):
|
||||
when(taskmanager_models.CONF).get(any()).thenReturn('')
|
||||
when(taskmanager_models.CONF).get("guest_config").thenReturn(
|
||||
self.guestconfig)
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_create_instance_guestconfig(self, mock_conf):
|
||||
def fake_conf_getter(*args, **kwargs):
|
||||
if args[0] == 'guest_config':
|
||||
return self.guestconfig
|
||||
else:
|
||||
return ''
|
||||
mock_conf.get.side_effect = fake_conf_getter
|
||||
# execute
|
||||
server = self.freshinstancetasks._create_server(
|
||||
None, None, None, "test", None, None, None)
|
||||
# verify
|
||||
self.assertTrue('/etc/trove-guestagent.conf' in server.files)
|
||||
self.assertEqual(server.files['/etc/trove-guestagent.conf'],
|
||||
self.guestconfig_content)
|
||||
|
||||
def test_create_instance_with_az_kwarg(self):
|
||||
when(taskmanager_models.CONF).get(any()).thenReturn('')
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_create_instance_with_az_kwarg(self, mock_conf):
|
||||
mock_conf.get.return_value = ''
|
||||
# execute
|
||||
server = self.freshinstancetasks._create_server(
|
||||
None, None, None, None, None, availability_zone='nova', nics=None)
|
||||
|
||||
# verify
|
||||
self.assertIsNotNone(server)
|
||||
|
||||
def test_create_instance_with_az(self):
|
||||
when(taskmanager_models.CONF).get(any()).thenReturn('')
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_create_instance_with_az(self, mock_conf):
|
||||
mock_conf.get.return_value = ''
|
||||
# execute
|
||||
server = self.freshinstancetasks._create_server(
|
||||
None, None, None, None, None, 'nova', None)
|
||||
|
||||
# verify
|
||||
self.assertIsNotNone(server)
|
||||
|
||||
def test_create_instance_with_az_none(self):
|
||||
when(taskmanager_models.CONF).get(any()).thenReturn('')
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_create_instance_with_az_none(self, mock_conf):
|
||||
mock_conf.get.return_value = ''
|
||||
# execute
|
||||
server = self.freshinstancetasks._create_server(
|
||||
None, None, None, None, None, None, None)
|
||||
|
||||
# verify
|
||||
self.assertIsNotNone(server)
|
||||
|
||||
def test_update_status_of_intance_failure(self):
|
||||
|
||||
@patch('trove.taskmanager.models.CONF')
|
||||
def test_update_status_of_intance_failure(self, mock_conf):
|
||||
mock_conf.get.return_value = ''
|
||||
InstanceServiceStatus.find_by = Mock(
|
||||
return_value=fake_InstanceServiceStatus.find_by())
|
||||
DBInstance.find_by = Mock(return_value=fake_DBInstance.find_by())
|
||||
DBInstance.find_by = Mock(
|
||||
return_value=fake_DBInstance.find_by())
|
||||
self.freshinstancetasks.update_statuses_on_time_out()
|
||||
self.assertEqual(fake_InstanceServiceStatus.find_by().get_status(),
|
||||
ServiceStatuses.FAILED_TIMEOUT_GUESTAGENT)
|
||||
@ -260,7 +281,8 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
Mock(return_value={'id': uuid.uuid4(),
|
||||
'name': uuid.uuid4()}))
|
||||
taskmanager_models.CONF.get = Mock(return_value=FakeOptGroup())
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = (
|
||||
Mock())
|
||||
self.freshinstancetasks._create_secgroup(datastore_manager)
|
||||
self.assertEqual(2, taskmanager_models.SecurityGroupRule.
|
||||
create_sec_group_rule.call_count)
|
||||
@ -273,7 +295,8 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
taskmanager_models.CONF.get = Mock(
|
||||
return_value=FakeOptGroup(tcp_ports=['3306', '-3306']))
|
||||
self.freshinstancetasks.update_db = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = (
|
||||
Mock())
|
||||
self.assertRaises(MalformedSecurityGroupRuleError,
|
||||
self.freshinstancetasks._create_secgroup,
|
||||
datastore_manager)
|
||||
@ -286,7 +309,8 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
taskmanager_models.CONF.get = Mock(
|
||||
return_value=FakeOptGroup(tcp_ports=['3306', '33060-3306']))
|
||||
self.freshinstancetasks.update_db = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = (
|
||||
Mock())
|
||||
self.assertRaises(MalformedSecurityGroupRuleError,
|
||||
self.freshinstancetasks._create_secgroup,
|
||||
datastore_manager)
|
||||
@ -299,7 +323,8 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
taskmanager_models.CONF.get = Mock(
|
||||
return_value=FakeOptGroup(
|
||||
tcp_ports=['3306', '3306', '3306-3307', '3306-3307']))
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = Mock()
|
||||
taskmanager_models.SecurityGroupRule.create_sec_group_rule = (
|
||||
Mock())
|
||||
self.freshinstancetasks.update_db = Mock()
|
||||
self.freshinstancetasks._create_secgroup(datastore_manager)
|
||||
self.assertEqual(2, taskmanager_models.SecurityGroupRule.
|
||||
@ -308,7 +333,8 @@ class FreshInstanceTasksTest(testtools.TestCase):
|
||||
def test_create_sg_rules_exception_with_malformed_ports_or_range(self):
|
||||
datastore_manager = 'mysql'
|
||||
taskmanager_models.SecurityGroup.create_for_instance = (
|
||||
Mock(return_value={'id': uuid.uuid4(), 'name': uuid.uuid4()}))
|
||||
Mock(return_value={'id': uuid.uuid4(),
|
||||
'name': uuid.uuid4()}))
|
||||
taskmanager_models.CONF.get = Mock(
|
||||
return_value=FakeOptGroup(tcp_ports=['A', 'B-C']))
|
||||
self.freshinstancetasks.update_db = Mock()
|
||||
@ -372,7 +398,8 @@ class ResizeVolumeTest(testtools.TestCase):
|
||||
self.instance.reset_mock()
|
||||
|
||||
def test_resize_volume_verify_extend_no_volume(self):
|
||||
self.instance.volume_client.volumes.get = Mock(return_value=None)
|
||||
self.instance.volume_client.volumes.get = Mock(
|
||||
return_value=None)
|
||||
self.assertRaises(cinder_exceptions.ClientException,
|
||||
self.action._verify_extend)
|
||||
self.instance.reset_mock()
|
||||
@ -410,36 +437,30 @@ class ResizeVolumeTest(testtools.TestCase):
|
||||
|
||||
class BuiltInstanceTasksTest(testtools.TestCase):
|
||||
|
||||
def stub_inst_service_status(self, status_id, statuses):
|
||||
def get_inst_service_status(self, status_id, statuses):
|
||||
answers = []
|
||||
for i, status in enumerate(statuses):
|
||||
inst_svc_status = InstanceServiceStatus(status,
|
||||
id="%s-%s" % (status_id,
|
||||
i))
|
||||
when(inst_svc_status).save().thenReturn(None)
|
||||
inst_svc_status.save = MagicMock(return_value=None)
|
||||
answers.append(inst_svc_status)
|
||||
|
||||
when(trove.db.models.DatabaseModelBase).find_by(
|
||||
instance_id=any()).thenReturn(*answers)
|
||||
return answers
|
||||
|
||||
def _stub_volume_client(self):
|
||||
self.instance_task._volume_client = mock(cinderclient.Client)
|
||||
stub_volume_mgr = mock(cinderclient.volumes.VolumeManager)
|
||||
self.instance_task._volume_client = MagicMock(spec=cinderclient.Client)
|
||||
stub_volume_mgr = MagicMock(spec=cinderclient.volumes.VolumeManager)
|
||||
self.instance_task.volume_client.volumes = stub_volume_mgr
|
||||
stub_volume = cinderclient.volumes.Volume(stub_volume_mgr,
|
||||
{'status': 'available'},
|
||||
True)
|
||||
when(stub_volume_mgr).extend(VOLUME_ID, 2).thenReturn(None)
|
||||
stub_volume_mgr.extend = MagicMock(return_value=None)
|
||||
stub_new_volume = cinderclient.volumes.Volume(
|
||||
stub_volume_mgr, {'status': 'available', 'size': 2}, True)
|
||||
when(stub_volume_mgr).get(any()).thenReturn(
|
||||
stub_volume).thenReturn(stub_new_volume)
|
||||
when(stub_volume_mgr).attach(any(), VOLUME_ID).thenReturn(None)
|
||||
stub_volume_mgr.get = MagicMock(return_value=stub_new_volume)
|
||||
stub_volume_mgr.attach = MagicMock(return_value=None)
|
||||
|
||||
def setUp(self):
|
||||
super(BuiltInstanceTasksTest, self).setUp()
|
||||
self.new_flavor = {'id': 8, 'ram': 768, 'name': 'bigger_flavor'}
|
||||
stub_nova_server = mock(novaclient.v1_1.servers.Server)
|
||||
stub_nova_server = MagicMock()
|
||||
db_instance = DBInstance(InstanceTasks.NONE,
|
||||
id=INST_ID,
|
||||
name='resize-inst-name',
|
||||
@ -453,13 +474,14 @@ class BuiltInstanceTasksTest(testtools.TestCase):
|
||||
tenant_id='testresize-tenant-id',
|
||||
volume_size='1',
|
||||
volume_id=VOLUME_ID)
|
||||
|
||||
# this is used during the final check of whether the resize successful
|
||||
db_instance.server_status = 'ACTIVE'
|
||||
self.db_instance = db_instance
|
||||
when(datastore_models.DatastoreVersion).load_by_uuid(any()).thenReturn(
|
||||
datastore_models.DatastoreVersion(db_instance))
|
||||
when(datastore_models.Datastore).load('id-1').thenReturn(
|
||||
datastore_models.Datastore(db_instance))
|
||||
datastore_models.DatastoreVersion.load_by_uuid = MagicMock(
|
||||
return_value=datastore_models.DatastoreVersion(db_instance))
|
||||
datastore_models.Datastore.load = MagicMock(
|
||||
return_value=datastore_models.Datastore(db_instance))
|
||||
|
||||
self.instance_task = taskmanager_models.BuiltInstanceTasks(
|
||||
trove.common.context.TroveContext(),
|
||||
@ -468,47 +490,59 @@ class BuiltInstanceTasksTest(testtools.TestCase):
|
||||
InstanceServiceStatus(ServiceStatuses.RUNNING,
|
||||
id='inst-stat-id-0'))
|
||||
|
||||
self.instance_task._guest = mock(trove.guestagent.api.API)
|
||||
self.instance_task._nova_client = mock(novaclient.v1_1.Client)
|
||||
self.stub_server_mgr = mock(novaclient.v1_1.servers.ServerManager)
|
||||
self.stub_running_server = mock(novaclient.v1_1.servers.Server)
|
||||
self.instance_task._guest = MagicMock(spec=trove.guestagent.api.API)
|
||||
self.instance_task._nova_client = MagicMock(
|
||||
spec=novaclient.v1_1.Client)
|
||||
self.stub_server_mgr = MagicMock(
|
||||
spec=novaclient.v1_1.servers.ServerManager)
|
||||
self.stub_running_server = MagicMock(
|
||||
spec=novaclient.v1_1.servers.Server)
|
||||
self.stub_running_server.status = 'ACTIVE'
|
||||
self.stub_running_server.flavor = {'id': 6, 'ram': 512}
|
||||
self.stub_verifying_server = mock(novaclient.v1_1.servers.Server)
|
||||
self.stub_verifying_server = MagicMock(
|
||||
spec=novaclient.v1_1.servers.Server)
|
||||
self.stub_verifying_server.status = 'VERIFY_RESIZE'
|
||||
self.stub_verifying_server.flavor = {'id': 8, 'ram': 768}
|
||||
when(self.stub_server_mgr).get(any()).thenReturn(
|
||||
self.stub_verifying_server)
|
||||
self.stub_server_mgr.get = MagicMock(
|
||||
return_value=self.stub_verifying_server)
|
||||
self.instance_task._nova_client.servers = self.stub_server_mgr
|
||||
stub_flavor_manager = mock(novaclient.v1_1.flavors.FlavorManager)
|
||||
stub_flavor_manager = MagicMock(
|
||||
spec=novaclient.v1_1.flavors.FlavorManager)
|
||||
self.instance_task._nova_client.flavors = stub_flavor_manager
|
||||
|
||||
nova_flavor = novaclient.v1_1.flavors.Flavor(stub_flavor_manager,
|
||||
self.new_flavor,
|
||||
True)
|
||||
when(stub_flavor_manager).get(any()).thenReturn(nova_flavor)
|
||||
stub_flavor_manager.get = MagicMock(return_value=nova_flavor)
|
||||
|
||||
self.stub_inst_service_status('inst_stat-id',
|
||||
[ServiceStatuses.SHUTDOWN,
|
||||
ServiceStatuses.RUNNING,
|
||||
ServiceStatuses.RUNNING])
|
||||
answers = (status for status in
|
||||
self.get_inst_service_status('inst_stat-id',
|
||||
[ServiceStatuses.SHUTDOWN,
|
||||
ServiceStatuses.RUNNING,
|
||||
ServiceStatuses.RUNNING,
|
||||
ServiceStatuses.RUNNING]))
|
||||
|
||||
when(template).SingleInstanceConfigTemplate(
|
||||
any(), any(), any()).thenReturn(
|
||||
mock(template.SingleInstanceConfigTemplate))
|
||||
def side_effect_func(*args, **kwargs):
|
||||
if 'instance_id' in kwargs:
|
||||
return answers.next()
|
||||
elif ('id' in kwargs and 'deleted' in kwargs
|
||||
and not kwargs['deleted']):
|
||||
return db_instance
|
||||
else:
|
||||
return MagicMock()
|
||||
trove.db.models.DatabaseModelBase.find_by = MagicMock(
|
||||
side_effect=side_effect_func)
|
||||
|
||||
when(trove.db.models.DatabaseModelBase).find_by(
|
||||
id=any(), deleted=False).thenReturn(db_instance)
|
||||
when(db_instance).save().thenReturn(None)
|
||||
|
||||
when(trove.backup.models.Backup).running(any()).thenReturn(None)
|
||||
template.SingleInstanceConfigTemplate = MagicMock(
|
||||
spec=template.SingleInstanceConfigTemplate)
|
||||
db_instance.save = MagicMock(return_value=None)
|
||||
trove.backup.models.Backup.running = MagicMock(return_value=None)
|
||||
|
||||
if 'volume' in self._testMethodName:
|
||||
self._stub_volume_client()
|
||||
|
||||
def tearDown(self):
|
||||
super(BuiltInstanceTasksTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_resize_flavor(self):
|
||||
orig_server = self.instance_task.server
|
||||
@ -516,27 +550,31 @@ class BuiltInstanceTasksTest(testtools.TestCase):
|
||||
self.new_flavor)
|
||||
# verify
|
||||
self.assertIsNot(self.instance_task.server, orig_server)
|
||||
verify(self.instance_task._guest).stop_db(do_not_start_on_reboot=True)
|
||||
verify(orig_server).resize(self.new_flavor['id'])
|
||||
self.instance_task._guest.stop_db.assert_any_call(
|
||||
do_not_start_on_reboot=True)
|
||||
orig_server.resize.assert_any_call(self.new_flavor['id'])
|
||||
self.assertThat(self.db_instance.task_status, Is(InstanceTasks.NONE))
|
||||
verify(self.stub_server_mgr, times=1).get(any())
|
||||
self.assertEqual(self.stub_server_mgr.get.call_count, 1)
|
||||
self.assertThat(self.db_instance.flavor_id, Is(self.new_flavor['id']))
|
||||
|
||||
def test_resize_flavor_resize_failure(self):
|
||||
orig_server = self.instance_task.server
|
||||
self.stub_verifying_server.status = 'ERROR'
|
||||
when(self.instance_task._nova_client.servers).get(any()).thenReturn(
|
||||
self.stub_verifying_server)
|
||||
# execute
|
||||
self.assertRaises(TroveError, self.instance_task.resize_flavor,
|
||||
{'id': 1, 'ram': 512}, self.new_flavor)
|
||||
# verify
|
||||
verify(self.stub_server_mgr, times=1).get(any())
|
||||
self.assertIs(self.instance_task.server, self.stub_verifying_server)
|
||||
verify(self.instance_task._guest).stop_db(do_not_start_on_reboot=True)
|
||||
verify(orig_server).resize(self.new_flavor['id'])
|
||||
self.assertThat(self.db_instance.task_status, Is(InstanceTasks.NONE))
|
||||
self.assertThat(self.db_instance.flavor_id, Is('6'))
|
||||
with patch.object(self.instance_task._nova_client.servers, 'get',
|
||||
return_value=self.stub_verifying_server):
|
||||
# execute
|
||||
self.assertRaises(TroveError, self.instance_task.resize_flavor,
|
||||
{'id': 1, 'ram': 512}, self.new_flavor)
|
||||
# verify
|
||||
self.assertTrue(self.stub_server_mgr.get.called)
|
||||
self.assertIs(self.instance_task.server,
|
||||
self.stub_verifying_server)
|
||||
self.instance_task._guest.stop_db.assert_any_call(
|
||||
do_not_start_on_reboot=True)
|
||||
orig_server.resize.assert_any_call(self.new_flavor['id'])
|
||||
self.assertThat(self.db_instance.task_status,
|
||||
Is(InstanceTasks.NONE))
|
||||
self.assertThat(self.db_instance.flavor_id, Is('6'))
|
||||
|
||||
|
||||
class BackupTasksTest(testtools.TestCase):
|
||||
@ -556,62 +594,58 @@ class BackupTasksTest(testtools.TestCase):
|
||||
[{'name': 'first'},
|
||||
{'name': 'second'},
|
||||
{'name': 'third'}])
|
||||
when(backup_models.Backup).delete(any()).thenReturn(None)
|
||||
when(backup_models.Backup).get_by_id(
|
||||
any(), self.backup.id).thenReturn(self.backup)
|
||||
when(backup_models.DBBackup).save(any()).thenReturn(self.backup)
|
||||
when(self.backup).delete(any()).thenReturn(None)
|
||||
self.swift_client = mock()
|
||||
when(remote).create_swift_client(
|
||||
any()).thenReturn(self.swift_client)
|
||||
when(self.swift_client).head_container(
|
||||
any()).thenRaise(ClientException("foo"))
|
||||
when(self.swift_client).head_object(
|
||||
any(), any()).thenRaise(ClientException("foo"))
|
||||
when(self.swift_client).get_container(any()).thenReturn(
|
||||
self.container_content)
|
||||
when(self.swift_client).delete_object(any(), any()).thenReturn(None)
|
||||
when(self.swift_client).delete_container(any()).thenReturn(None)
|
||||
backup_models.Backup.delete = MagicMock(return_value=None)
|
||||
backup_models.Backup.get_by_id = MagicMock(return_value=self.backup)
|
||||
backup_models.DBBackup.save = MagicMock(return_value=self.backup)
|
||||
self.backup.delete = MagicMock(return_value=None)
|
||||
self.swift_client = MagicMock()
|
||||
remote.create_swift_client = MagicMock(return_value=self.swift_client)
|
||||
|
||||
self.swift_client.head_container = MagicMock(
|
||||
side_effect=ClientException("foo"))
|
||||
self.swift_client.head_object = MagicMock(
|
||||
side_effect=ClientException("foo"))
|
||||
self.swift_client.get_container = MagicMock(
|
||||
return_value=self.container_content)
|
||||
self.swift_client.delete_object = MagicMock(return_value=None)
|
||||
self.swift_client.delete_container = MagicMock(return_value=None)
|
||||
|
||||
def tearDown(self):
|
||||
super(BackupTasksTest, self).tearDown()
|
||||
unstub()
|
||||
|
||||
def test_delete_backup_nolocation(self):
|
||||
self.backup.location = ''
|
||||
taskmanager_models.BackupTasks.delete_backup('dummy context',
|
||||
self.backup.id)
|
||||
verify(self.backup).delete()
|
||||
self.backup.delete.assert_any_call()
|
||||
|
||||
def test_delete_backup_fail_delete_manifest(self):
|
||||
filename = self.backup.location[self.backup.location.rfind("/") + 1:]
|
||||
when(self.swift_client).delete_object(
|
||||
any(),
|
||||
filename).thenRaise(ClientException("foo"))
|
||||
when(self.swift_client).head_object(any(), any()).thenReturn({})
|
||||
self.assertRaises(
|
||||
TroveError,
|
||||
taskmanager_models.BackupTasks.delete_backup,
|
||||
'dummy context', self.backup.id)
|
||||
verify(backup_models.Backup, never).delete(self.backup.id)
|
||||
self.assertEqual(
|
||||
backup_models.BackupState.DELETE_FAILED,
|
||||
self.backup.state,
|
||||
"backup should be in DELETE_FAILED status")
|
||||
with patch.object(self.swift_client, 'delete_object',
|
||||
side_effect=ClientException("foo")):
|
||||
with patch.object(self.swift_client, 'head_object',
|
||||
return_value={}):
|
||||
self.assertRaises(
|
||||
TroveError,
|
||||
taskmanager_models.BackupTasks.delete_backup,
|
||||
'dummy context', self.backup.id)
|
||||
self.assertFalse(backup_models.Backup.delete.called)
|
||||
self.assertEqual(
|
||||
backup_models.BackupState.DELETE_FAILED,
|
||||
self.backup.state,
|
||||
"backup should be in DELETE_FAILED status")
|
||||
|
||||
def test_delete_backup_fail_delete_segment(self):
|
||||
when(self.swift_client).delete_object(
|
||||
any(),
|
||||
'second').thenRaise(ClientException("foo"))
|
||||
self.assertRaises(
|
||||
TroveError,
|
||||
taskmanager_models.BackupTasks.delete_backup,
|
||||
'dummy context', self.backup.id)
|
||||
verify(backup_models.Backup, never).delete(self.backup.id)
|
||||
self.assertEqual(
|
||||
backup_models.BackupState.DELETE_FAILED,
|
||||
self.backup.state,
|
||||
"backup should be in DELETE_FAILED status")
|
||||
with patch.object(self.swift_client, 'delete_object',
|
||||
side_effect=ClientException("foo")):
|
||||
self.assertRaises(
|
||||
TroveError,
|
||||
taskmanager_models.BackupTasks.delete_backup,
|
||||
'dummy context', self.backup.id)
|
||||
self.assertFalse(backup_models.Backup.delete.called)
|
||||
self.assertEqual(
|
||||
backup_models.BackupState.DELETE_FAILED,
|
||||
self.backup.state,
|
||||
"backup should be in DELETE_FAILED status")
|
||||
|
||||
def test_parse_manifest(self):
|
||||
manifest = 'container/prefix'
|
||||
|
Loading…
x
Reference in New Issue
Block a user