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:
parent
c16feaea5e
commit
82d30f625a
|
@ -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,
|
||||
|
|
|
@ -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."""
|
||||
|
|
Loading…
Reference in New Issue