Fix update of share with share-server-id

If for some reason share server was not created and fell to 'ERROR' state, then
share will not get share-server-id. We should know what server was expected
to be used with each share.

Change-Id: I967a48481b79c9e80eb57806fc103704db209bb4
Closes-Bug: #1352424
This commit is contained in:
vponomaryov 2014-08-07 13:26:31 +03:00 committed by Valeriy Ponomaryov
parent c16feaea5e
commit 82d30f625a
2 changed files with 86 additions and 23 deletions

View File

@ -118,22 +118,37 @@ class ShareManager(manager.SchedulerDependentManager):
@lockutils.synchronized(share_network_id)
def _provide_share_server_for_share():
exist = False
try:
share_server = \
self.db.share_server_get_by_host_and_share_net_valid(
context, self.host, share_network_id)
exist = True
except exception.ShareServerNotFound:
share_network = self.db.share_network_get(
context, share_network_id)
share_server = self._setup_server(context, share_network)
LOG.info(_("Share server created successfully."))
LOG.debug("Using share_server "
"%s for share %s" % (share_server['id'], share_id))
share_server = self.db.share_server_create(
context,
{
'host': self.host,
'share_network_id': share_network_id,
'status': constants.STATUS_CREATING
}
)
LOG.debug("Using share_server %s for share %s" % (
share_server['id'], share_id))
share_ref = self.db.share_update(
context,
share_id,
{'share_server_id': share_server['id']},
)
if not exist:
# Create share server on backend with data from db
share_server = self._setup_server(context, share_server)
LOG.info(_("Share server created successfully."))
else:
LOG.info(_("Used already existed share server '%(share_server"
"_id)s'") % {'share_server_id': share_server['id']})
return share_server, share_ref
return _provide_share_server_for_share()
@ -380,15 +395,9 @@ class ShareManager(manager.SchedulerDependentManager):
}
return network_info
def _setup_server(self, context, share_network, metadata=None):
share_server_val = {
'host': self.host,
'share_network_id': share_network['id'],
'status': constants.STATUS_CREATING
}
share_server = self.db.share_server_create(context,
share_server_val)
def _setup_server(self, context, share_server, metadata=None):
share_network = self.db.share_network_get(
context, share_server['share_network_id'])
try:
allocation_number = self.driver.get_network_allocations_number()
if allocation_number:
@ -396,8 +405,6 @@ class ShareManager(manager.SchedulerDependentManager):
context, share_server, share_network,
count=allocation_number)
share_network = self.db.share_network_get(context,
share_network['id'])
network_info = self._form_server_setup_info(context, share_server,
share_network)
server_info = self.driver.setup_server(network_info,

View File

@ -28,6 +28,7 @@ from manila.openstack.common import importutils
import manila.policy
from manila.share import manager
from manila import test
from manila import utils
CONF = cfg.CONF
@ -353,6 +354,57 @@ class ShareTestCase(test.TestCase):
self.assertEqual(share_id, db.share_get(context.get_admin_context(),
share_id).id)
def test_create_share_with_share_network_server_creation_failed(self):
fake_share = {'id': 'fake_share_id', 'share_network_id': 'fake_sn_id'}
fake_server = {'id': 'fake_srv_id'}
self.stubs.Set(db, 'share_server_create',
mock.Mock(return_value=fake_server))
self.stubs.Set(db, 'share_update',
mock.Mock(return_value=fake_share))
self.stubs.Set(db, 'share_get',
mock.Mock(return_value=fake_share))
def raise_share_server_not_found(*args, **kwargs):
raise exception.ShareServerNotFound(
share_server_id=fake_server['id'])
def raise_manila_exception(*args, **kwargs):
raise exception.ManilaException()
self.stubs.Set(db, 'share_server_get_by_host_and_share_net_valid',
mock.Mock(side_effect=raise_share_server_not_found))
self.stubs.Set(self.share_manager, '_setup_server',
mock.Mock(side_effect=raise_manila_exception))
self.assertRaises(
exception.ManilaException,
self.share_manager.create_share,
self.context,
fake_share['id'],
)
db.share_server_get_by_host_and_share_net_valid.\
assert_called_once_with(
utils.IsAMatcher(context.RequestContext),
self.share_manager.host,
fake_share['share_network_id'],
)
db.share_server_create.assert_called_once_with(
utils.IsAMatcher(context.RequestContext), mock.ANY)
db.share_update.assert_has_calls([
mock.call(
utils.IsAMatcher(context.RequestContext),
fake_share['id'],
{'share_server_id': fake_server['id']},
),
mock.call(
utils.IsAMatcher(context.RequestContext),
fake_share['id'],
{'status': 'error'},
)
])
self.share_manager._setup_server.assert_called_once_with(
utils.IsAMatcher(context.RequestContext), fake_server)
def test_create_share_with_share_network_not_found(self):
"""Test creation fails if share network not found."""
@ -395,20 +447,24 @@ class ShareTestCase(test.TestCase):
self._create_share_server(
share_network_id=share_net['id'], host=self.share_manager.host,
state='ERROR')
share_id = share['id']
fake_server = {'id': 'fake_srv_id'}
self.stubs.Set(db, 'share_server_create',
mock.Mock(return_value=fake_server))
self.stubs.Set(self.share_manager, '_setup_server',
mock.Mock(return_value=fake_server))
self.share_manager.driver = mock.Mock()
self.share_manager._setup_server = mock.Mock(
return_value={'id': 'fake_srv_id'})
self.share_manager.driver.create_share.return_value = "fake_location"
self.share_manager.create_share(self.context, share_id)
self.assertEqual(share_id, db.share_get(context.get_admin_context(),
share_id).id)
shr = db.share_get(self.context, share_id)
self.assertEqual(shr['status'], 'available')
self.assertEqual(shr['share_server_id'], 'fake_srv_id')
db.share_server_create.assert_called_once_with(
utils.IsAMatcher(context.RequestContext), mock.ANY)
self.share_manager._setup_server.assert_called_once_with(
utils.IsAMatcher(context.RequestContext), fake_server)
def test_create_delete_share_error(self):
"""Test share can be created and deleted with error."""