Merge "Fix update of backend details in cmode driver"

This commit is contained in:
Jenkins 2014-09-10 16:00:58 +00:00 committed by Gerrit Code Review
commit 7d79a8cc5b
2 changed files with 181 additions and 2 deletions

View File

@ -27,6 +27,7 @@ from oslo.config import cfg
from oslo.utils import units
import six
from manila import context
from manila import exception
from manila.openstack.common import excutils
from manila.openstack.common import log
@ -83,8 +84,9 @@ def ensure_vserver(f):
vserver_name = server['backend_details'].get('vserver_name') if \
server.get('backend_details') else None
if not vserver_name:
raise exception.NetAppException(_('Vserver name missing in '
'backend details.'))
msg = _('Vserver name is absent in backend details. Please '
'check whether vserver was created properly or not.')
raise exception.NetAppException(msg)
if not self._vserver_exists(vserver_name):
raise exception.VserverUnavailable(vserver=vserver_name)
return f(self, *args, **kwargs)
@ -378,6 +380,12 @@ class NetAppClusteredShareDriver(driver.ShareDriver):
"""Creates vserver if not exists with given parameters."""
vserver_name = (self.configuration.netapp_vserver_name_template %
network_info['server_id'])
context_adm = context.get_admin_context()
self.db.share_server_backend_details_set(
context_adm,
network_info['server_id'],
{'vserver_name': vserver_name},
)
vserver_client = NetAppApiClient(
self.api_version, vserver=vserver_name,
configuration=self.configuration)

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
import hashlib
import mock
@ -23,6 +24,7 @@ from manila.share import configuration
from manila.share.drivers.netapp import api as naapi
from manila.share.drivers.netapp import cluster_mode as driver
from manila import test
from manila import utils
class NetAppClusteredDrvTestCase(test.TestCase):
@ -70,6 +72,17 @@ class NetAppClusteredDrvTestCase(test.TestCase):
self.driver._helpers = {'FAKE': self.helper}
self.driver._licenses = ['fake']
self.network_info = {
'server_id': 'fake_server_id',
'cidr': '10.0.0.0/24',
'security_services': ['fake_ldap', 'fake_kerberos', 'fake_ad', ],
'segmentation_id': '1000',
'network_allocations': [
{'id': 'fake_na_id_1', 'ip_address': 'fake_ip_1', },
{'id': 'fake_na_id_2', 'ip_address': 'fake_ip_2', },
],
}
def test_create_vserver(self):
res = naapi.NaElement('fake')
res.add_new_child('aggregate-name', 'aggr')
@ -142,6 +155,164 @@ class NetAppClusteredDrvTestCase(test.TestCase):
result = self.driver.setup_server({'server_id': 'fake_vserver'})
self.assertEqual(result, {'vserver_name': 'fake_vserver'})
def test_vserver_create_if_not_exists_1(self):
# server exists, lifs ok, all sec services
nodes = ['fake_node_1', 'fake_node_2', ]
port = 'fake_port'
ip1 = self.network_info['network_allocations'][0]['ip_address']
ip2 = self.network_info['network_allocations'][1]['ip_address']
vserver_name = \
self.driver.configuration.netapp_vserver_name_template % \
self.network_info['server_id']
self.stubs.Set(self.driver.db, 'share_server_backend_details_set',
mock.Mock())
self.stubs.Set(self.driver, '_vserver_exists',
mock.Mock(return_value=True))
self.stubs.Set(self.driver, '_get_cluster_nodes',
mock.Mock(return_value=nodes))
self.stubs.Set(self.driver, '_get_node_data_port',
mock.Mock(return_value=port))
self.stubs.Set(self.driver, '_create_lif_if_not_exists', mock.Mock())
self.stubs.Set(self.driver, '_enable_nfs', mock.Mock())
self.stubs.Set(self.driver, '_setup_security_services', mock.Mock())
returned_data = self.driver._vserver_create_if_not_exists(
self.network_info)
self.assertEqual(returned_data, vserver_name)
self.driver.db.share_server_backend_details_set.assert_has_calls([
mock.call(utils.IsAMatcher(context.RequestContext),
self.network_info['server_id'],
{'vserver_name': vserver_name}),
])
self.driver._vserver_exists.assert_has_calls([mock.call(vserver_name)])
self.driver._get_cluster_nodes.assert_has_calls([])
self.driver._get_node_data_port.assert_has_calls([
mock.call(nodes[0]),
mock.call(nodes[1]),
])
self.driver._create_lif_if_not_exists.assert_has_calls([
mock.call(vserver_name,
self.network_info['network_allocations'][0]['id'],
self.network_info['segmentation_id'],
nodes[0], port, ip1, '255.255.255.0', mock.ANY),
mock.call(vserver_name,
self.network_info['network_allocations'][1]['id'],
self.network_info['segmentation_id'],
nodes[1], port, ip2, '255.255.255.0', mock.ANY),
])
self.driver._enable_nfs.assert_has_calls([mock.call(mock.ANY)])
self.driver._setup_security_services.assert_has_calls([
mock.call(self.network_info.get('security_services'),
mock.ANY, vserver_name),
])
def test_vserver_create_if_not_exists_2(self):
# server does not exist, lifs ok, no sec services
network_info = copy.deepcopy(self.network_info)
network_info['security_services'] = []
nodes = ['fake_node_1', 'fake_node_2', ]
port = 'fake_port'
ip1 = network_info['network_allocations'][0]['ip_address']
ip2 = network_info['network_allocations'][1]['ip_address']
vserver_name = \
self.driver.configuration.netapp_vserver_name_template % \
network_info['server_id']
self.stubs.Set(self.driver.db, 'share_server_backend_details_set',
mock.Mock())
self.stubs.Set(self.driver, '_vserver_exists',
mock.Mock(return_value=False))
self.stubs.Set(self.driver, '_create_vserver', mock.Mock())
self.stubs.Set(self.driver, '_get_cluster_nodes',
mock.Mock(return_value=nodes))
self.stubs.Set(self.driver, '_get_node_data_port',
mock.Mock(return_value=port))
self.stubs.Set(self.driver, '_create_lif_if_not_exists', mock.Mock())
self.stubs.Set(self.driver, '_enable_nfs', mock.Mock())
returned_data = self.driver._vserver_create_if_not_exists(network_info)
self.assertEqual(returned_data, vserver_name)
self.driver.db.share_server_backend_details_set.assert_has_calls([
mock.call(utils.IsAMatcher(context.RequestContext),
self.network_info['server_id'],
{'vserver_name': vserver_name}),
])
self.driver._vserver_exists.assert_has_calls([mock.call(vserver_name)])
self.driver._create_vserver.assert_has_calls([mock.call(vserver_name)])
self.driver._get_cluster_nodes.assert_has_calls([])
self.driver._get_node_data_port.assert_has_calls([
mock.call(nodes[0]),
mock.call(nodes[1]),
])
self.driver._create_lif_if_not_exists.assert_has_calls([
mock.call(vserver_name,
network_info['network_allocations'][0]['id'],
network_info['segmentation_id'],
nodes[0], port, ip1, '255.255.255.0', mock.ANY),
mock.call(vserver_name,
network_info['network_allocations'][1]['id'],
network_info['segmentation_id'],
nodes[1], port, ip2, '255.255.255.0', mock.ANY),
])
self.driver._enable_nfs.assert_has_calls([mock.call(mock.ANY)])
def test_vserver_create_if_not_exists_3(self):
# server does not exist, lifs ok, one sec service
network_info = copy.deepcopy(self.network_info)
network_info['security_services'] = self.network_info[
'security_services'][0]
nodes = ['fake_node_1', 'fake_node_2', ]
port = 'fake_port'
ip1 = network_info['network_allocations'][0]['ip_address']
ip2 = network_info['network_allocations'][1]['ip_address']
vserver_name = \
self.driver.configuration.netapp_vserver_name_template % \
network_info['server_id']
self.stubs.Set(self.driver.db, 'share_server_backend_details_set',
mock.Mock())
self.stubs.Set(self.driver, '_vserver_exists',
mock.Mock(return_value=False))
self.stubs.Set(self.driver, '_create_vserver', mock.Mock())
self.stubs.Set(self.driver, '_get_cluster_nodes',
mock.Mock(return_value=nodes))
self.stubs.Set(self.driver, '_get_node_data_port',
mock.Mock(return_value=port))
self.stubs.Set(self.driver, '_create_lif_if_not_exists', mock.Mock())
self.stubs.Set(self.driver, '_enable_nfs', mock.Mock())
self.stubs.Set(self.driver, '_setup_security_services', mock.Mock())
returned_data = self.driver._vserver_create_if_not_exists(network_info)
self.assertEqual(returned_data, vserver_name)
self.driver.db.share_server_backend_details_set.assert_has_calls([
mock.call(utils.IsAMatcher(context.RequestContext),
self.network_info['server_id'],
{'vserver_name': vserver_name}),
])
self.driver._vserver_exists.assert_has_calls([mock.call(vserver_name)])
self.driver._create_vserver.assert_has_calls([mock.call(vserver_name)])
self.driver._get_cluster_nodes.assert_has_calls([])
self.driver._get_node_data_port.assert_has_calls([
mock.call(nodes[0]),
mock.call(nodes[1]),
])
self.driver._create_lif_if_not_exists.assert_has_calls([
mock.call(vserver_name,
network_info['network_allocations'][0]['id'],
network_info['segmentation_id'],
nodes[0], port, ip1, '255.255.255.0', mock.ANY),
mock.call(vserver_name,
network_info['network_allocations'][1]['id'],
network_info['segmentation_id'],
nodes[1], port, ip2, '255.255.255.0', mock.ANY),
])
self.driver._enable_nfs.assert_has_calls([mock.call(mock.ANY)])
self.driver._setup_security_services.assert_has_calls([
mock.call(network_info.get('security_services'),
mock.ANY, vserver_name),
])
def test_setup_security_services(self):
fake_sevice_ldap = {'type': 'ldap'}
fake_sevice_krb = {'type': 'kerberos'}