Merge "NetApp bug fix for multibackend scenario."

This commit is contained in:
Jenkins 2013-03-08 05:02:50 +00:00 committed by Gerrit Code Review
commit 8d038a0f59
4 changed files with 125 additions and 101 deletions

View File

@ -30,7 +30,9 @@ from lxml import etree
from cinder.exception import VolumeBackendAPIException from cinder.exception import VolumeBackendAPIException
from cinder.openstack.common import log as logging from cinder.openstack.common import log as logging
from cinder import test from cinder import test
from cinder.volume import configuration as conf
from cinder.volume.drivers.netapp import iscsi from cinder.volume.drivers.netapp import iscsi
from cinder.volume.drivers.netapp.iscsi import netapp_opts
LOG = logging.getLogger("cinder.volume.driver") LOG = logging.getLogger("cinder.volume.driver")
@ -596,6 +598,12 @@ iter_count = 0
iter_table = {} iter_table = {}
def create_configuration():
configuration = conf.Configuration(None)
configuration.append_config_values(netapp_opts)
return configuration
class FakeDfmServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): class FakeDfmServerHandler(BaseHTTPServer.BaseHTTPRequestHandler):
"""HTTP handler that fakes enough stuff to allow the driver to run.""" """HTTP handler that fakes enough stuff to allow the driver to run."""
@ -979,7 +987,7 @@ class NetAppDriverTestCase(test.TestCase):
super(NetAppDriverTestCase, self).setUp() super(NetAppDriverTestCase, self).setUp()
self.tempdir = tempfile.mkdtemp() self.tempdir = tempfile.mkdtemp()
self.flags(lock_path=self.tempdir) self.flags(lock_path=self.tempdir)
driver = iscsi.NetAppISCSIDriver() driver = iscsi.NetAppISCSIDriver(configuration=create_configuration())
self.stubs.Set(httplib, 'HTTPConnection', FakeHTTPConnection) self.stubs.Set(httplib, 'HTTPConnection', FakeHTTPConnection)
driver._create_client(wsdl_url='http://localhost:8088/dfm.wsdl', driver._create_client(wsdl_url='http://localhost:8088/dfm.wsdl',
login='root', password='password', login='root', password='password',
@ -1403,7 +1411,8 @@ class NetAppCmodeISCSIDriverTestCase(test.TestCase):
self._custom_setup() self._custom_setup()
def _custom_setup(self): def _custom_setup(self):
driver = iscsi.NetAppCmodeISCSIDriver() driver = iscsi.NetAppCmodeISCSIDriver(
configuration=create_configuration())
self.stubs.Set(httplib, 'HTTPConnection', FakeCmodeHTTPConnection) self.stubs.Set(httplib, 'HTTPConnection', FakeCmodeHTTPConnection)
driver._create_client(wsdl_url='http://localhost:8080/ntap_cloud.wsdl', driver._create_client(wsdl_url='http://localhost:8080/ntap_cloud.wsdl',
login='root', password='password', login='root', password='password',
@ -1849,7 +1858,8 @@ class NetAppDirectCmodeISCSIDriverTestCase(NetAppCmodeISCSIDriverTestCase):
super(NetAppDirectCmodeISCSIDriverTestCase, self).setUp() super(NetAppDirectCmodeISCSIDriverTestCase, self).setUp()
def _custom_setup(self): def _custom_setup(self):
driver = iscsi.NetAppDirectCmodeISCSIDriver() driver = iscsi.NetAppDirectCmodeISCSIDriver(
configuration=create_configuration())
self.stubs.Set(httplib, 'HTTPConnection', self.stubs.Set(httplib, 'HTTPConnection',
FakeDirectCmodeHTTPConnection) FakeDirectCmodeHTTPConnection)
driver._create_client(transport_type='http', driver._create_client(transport_type='http',
@ -2280,7 +2290,8 @@ class NetAppDirect7modeISCSIDriverTestCase_NV(
super(NetAppDirect7modeISCSIDriverTestCase_NV, self).setUp() super(NetAppDirect7modeISCSIDriverTestCase_NV, self).setUp()
def _custom_setup(self): def _custom_setup(self):
driver = iscsi.NetAppDirect7modeISCSIDriver() driver = iscsi.NetAppDirect7modeISCSIDriver(
configuration=create_configuration())
self.stubs.Set(httplib, self.stubs.Set(httplib,
'HTTPConnection', FakeDirect7modeHTTPConnection) 'HTTPConnection', FakeDirect7modeHTTPConnection)
driver._create_client(transport_type='http', driver._create_client(transport_type='http',
@ -2320,7 +2331,8 @@ class NetAppDirect7modeISCSIDriverTestCase_WV(
super(NetAppDirect7modeISCSIDriverTestCase_WV, self).setUp() super(NetAppDirect7modeISCSIDriverTestCase_WV, self).setUp()
def _custom_setup(self): def _custom_setup(self):
driver = iscsi.NetAppDirect7modeISCSIDriver() driver = iscsi.NetAppDirect7modeISCSIDriver(
configuration=create_configuration())
self.stubs.Set(httplib, 'HTTPConnection', self.stubs.Set(httplib, 'HTTPConnection',
FakeDirect7modeHTTPConnection) FakeDirect7modeHTTPConnection)
driver._create_client(transport_type='http', driver._create_client(transport_type='http',

View File

@ -22,7 +22,6 @@ from cinder import test
from cinder.volume import configuration as conf from cinder.volume import configuration as conf
from cinder.volume.drivers.netapp import api from cinder.volume.drivers.netapp import api
from cinder.volume.drivers.netapp import iscsi
from cinder.volume.drivers.netapp import nfs as netapp_nfs from cinder.volume.drivers.netapp import nfs as netapp_nfs
from cinder.volume.drivers import nfs from cinder.volume.drivers import nfs
from lxml import etree from lxml import etree
@ -81,7 +80,7 @@ class NetappNfsDriverTestCase(test.TestCase):
def setUp(self): def setUp(self):
self._mox = mox.Mox() self._mox = mox.Mox()
self._driver = netapp_nfs.NetAppNFSDriver( self._driver = netapp_nfs.NetAppNFSDriver(
configuration=create_configuration()) configuration=create_configuration())
def tearDown(self): def tearDown(self):
self._mox.UnsetStubs() self._mox.UnsetStubs()
@ -95,13 +94,17 @@ class NetappNfsDriverTestCase(test.TestCase):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
# set required flags
for flag in required_flags:
setattr(drv.configuration, flag, None)
# check exception raises when flags are not set # check exception raises when flags are not set
self.assertRaises(exception.CinderException, self.assertRaises(exception.CinderException,
drv.check_for_setup_error) drv.check_for_setup_error)
# set required flags # set required flags
for flag in required_flags: for flag in required_flags:
setattr(iscsi.FLAGS, flag, 'val') setattr(drv.configuration, flag, 'val')
mox.StubOutWithMock(nfs.NfsDriver, 'check_for_setup_error') mox.StubOutWithMock(nfs.NfsDriver, 'check_for_setup_error')
nfs.NfsDriver.check_for_setup_error() nfs.NfsDriver.check_for_setup_error()
@ -113,17 +116,17 @@ class NetappNfsDriverTestCase(test.TestCase):
# restore initial FLAGS # restore initial FLAGS
for flag in required_flags: for flag in required_flags:
delattr(iscsi.FLAGS, flag) delattr(drv.configuration, flag)
def test_do_setup(self): def test_do_setup(self):
mox = self._mox mox = self._mox
drv = self._driver drv = self._driver
mox.StubOutWithMock(drv, 'check_for_setup_error') mox.StubOutWithMock(drv, 'check_for_setup_error')
mox.StubOutWithMock(netapp_nfs.NetAppNFSDriver, '_get_client') mox.StubOutWithMock(drv, '_get_client')
drv.check_for_setup_error() drv.check_for_setup_error()
netapp_nfs.NetAppNFSDriver._get_client() drv._get_client()
mox.ReplayAll() mox.ReplayAll()
@ -240,7 +243,8 @@ class NetappNfsDriverTestCase(test.TestCase):
def test_successfull_clone_volume(self): def test_successfull_clone_volume(self):
drv = self._driver drv = self._driver
mox = self._prepare_clone_mock('passed') mox = self._prepare_clone_mock('passed')
# set required flags
setattr(drv.configuration, 'synchronous_snapshot_create', False)
mox.ReplayAll() mox.ReplayAll()
volume_name = 'volume_name' volume_name = 'volume_name'
@ -287,7 +291,7 @@ class NetappCmodeNfsDriverTestCase(test.TestCase):
def _custom_setup(self): def _custom_setup(self):
self._driver = netapp_nfs.NetAppCmodeNfsDriver( self._driver = netapp_nfs.NetAppCmodeNfsDriver(
configuration=create_configuration()) configuration=create_configuration())
def tearDown(self): def tearDown(self):
self._mox.UnsetStubs() self._mox.UnsetStubs()
@ -302,13 +306,16 @@ class NetappCmodeNfsDriverTestCase(test.TestCase):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
# set required flags
for flag in required_flags:
setattr(drv.configuration, flag, None)
# check exception raises when flags are not set # check exception raises when flags are not set
self.assertRaises(exception.CinderException, self.assertRaises(exception.CinderException,
drv.check_for_setup_error) drv.check_for_setup_error)
# set required flags # set required flags
for flag in required_flags: for flag in required_flags:
setattr(iscsi.FLAGS, flag, 'val') setattr(drv.configuration, flag, 'val')
mox.ReplayAll() mox.ReplayAll()
@ -318,17 +325,17 @@ class NetappCmodeNfsDriverTestCase(test.TestCase):
# restore initial FLAGS # restore initial FLAGS
for flag in required_flags: for flag in required_flags:
delattr(iscsi.FLAGS, flag) delattr(drv.configuration, flag)
def test_do_setup(self): def test_do_setup(self):
mox = self._mox mox = self._mox
drv = self._driver drv = self._driver
mox.StubOutWithMock(drv, 'check_for_setup_error') mox.StubOutWithMock(drv, 'check_for_setup_error')
mox.StubOutWithMock(netapp_nfs.NetAppCmodeNfsDriver, '_get_client') mox.StubOutWithMock(drv, '_get_client')
drv.check_for_setup_error() drv.check_for_setup_error()
netapp_nfs.NetAppCmodeNfsDriver._get_client() drv._get_client()
mox.ReplayAll() mox.ReplayAll()
@ -470,7 +477,7 @@ class NetappDirectCmodeNfsDriverTestCase(NetappCmodeNfsDriverTestCase):
"""Test direct NetApp C Mode driver""" """Test direct NetApp C Mode driver"""
def _custom_setup(self): def _custom_setup(self):
self._driver = netapp_nfs.NetAppDirectCmodeNfsDriver( self._driver = netapp_nfs.NetAppDirectCmodeNfsDriver(
configuration=create_configuration()) configuration=create_configuration())
def test_check_for_setup_error(self): def test_check_for_setup_error(self):
mox = self._mox mox = self._mox
@ -482,13 +489,16 @@ class NetappDirectCmodeNfsDriverTestCase(NetappCmodeNfsDriverTestCase):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
# set required flags
for flag in required_flags:
setattr(drv.configuration, flag, None)
# check exception raises when flags are not set # check exception raises when flags are not set
self.assertRaises(exception.CinderException, self.assertRaises(exception.CinderException,
drv.check_for_setup_error) drv.check_for_setup_error)
# set required flags # set required flags
for flag in required_flags: for flag in required_flags:
setattr(iscsi.FLAGS, flag, 'val') setattr(drv.configuration, flag, 'val')
mox.ReplayAll() mox.ReplayAll()
@ -498,19 +508,18 @@ class NetappDirectCmodeNfsDriverTestCase(NetappCmodeNfsDriverTestCase):
# restore initial FLAGS # restore initial FLAGS
for flag in required_flags: for flag in required_flags:
delattr(iscsi.FLAGS, flag) delattr(drv.configuration, flag)
def test_do_setup(self): def test_do_setup(self):
mox = self._mox mox = self._mox
drv = self._driver drv = self._driver
mox.StubOutWithMock(drv, 'check_for_setup_error') mox.StubOutWithMock(drv, 'check_for_setup_error')
mox.StubOutWithMock(netapp_nfs.NetAppDirectCmodeNfsDriver, mox.StubOutWithMock(drv, '_get_client')
'_get_client')
mox.StubOutWithMock(drv, '_do_custom_setup') mox.StubOutWithMock(drv, '_do_custom_setup')
drv.check_for_setup_error() drv.check_for_setup_error()
netapp_nfs.NetAppDirectNfsDriver._get_client() drv._get_client()
drv._do_custom_setup(IgnoreArg()) drv._do_custom_setup(IgnoreArg())
mox.ReplayAll() mox.ReplayAll()
@ -590,7 +599,7 @@ class NetappDirect7modeNfsDriverTestCase(NetappDirectCmodeNfsDriverTestCase):
"""Test direct NetApp C Mode driver""" """Test direct NetApp C Mode driver"""
def _custom_setup(self): def _custom_setup(self):
self._driver = netapp_nfs.NetAppDirect7modeNfsDriver( self._driver = netapp_nfs.NetAppDirect7modeNfsDriver(
configuration=create_configuration()) configuration=create_configuration())
def test_check_for_setup_error(self): def test_check_for_setup_error(self):
mox = self._mox mox = self._mox
@ -602,13 +611,16 @@ class NetappDirect7modeNfsDriverTestCase(NetappDirectCmodeNfsDriverTestCase):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
# set required flags
for flag in required_flags:
setattr(drv.configuration, flag, None)
# check exception raises when flags are not set # check exception raises when flags are not set
self.assertRaises(exception.CinderException, self.assertRaises(exception.CinderException,
drv.check_for_setup_error) drv.check_for_setup_error)
# set required flags # set required flags
for flag in required_flags: for flag in required_flags:
setattr(iscsi.FLAGS, flag, 'val') setattr(drv.configuration, flag, 'val')
mox.ReplayAll() mox.ReplayAll()
@ -618,19 +630,18 @@ class NetappDirect7modeNfsDriverTestCase(NetappDirectCmodeNfsDriverTestCase):
# restore initial FLAGS # restore initial FLAGS
for flag in required_flags: for flag in required_flags:
delattr(iscsi.FLAGS, flag) delattr(drv.configuration, flag)
def test_do_setup(self): def test_do_setup(self):
mox = self._mox mox = self._mox
drv = self._driver drv = self._driver
mox.StubOutWithMock(drv, 'check_for_setup_error') mox.StubOutWithMock(drv, 'check_for_setup_error')
mox.StubOutWithMock(netapp_nfs.NetAppDirect7modeNfsDriver, mox.StubOutWithMock(drv, '_get_client')
'_get_client')
mox.StubOutWithMock(drv, '_do_custom_setup') mox.StubOutWithMock(drv, '_do_custom_setup')
drv.check_for_setup_error() drv.check_for_setup_error()
netapp_nfs.NetAppDirectNfsDriver._get_client() drv._get_client()
drv._do_custom_setup(IgnoreArg()) drv._do_custom_setup(IgnoreArg())
mox.ReplayAll() mox.ReplayAll()

View File

@ -32,7 +32,6 @@ from suds import client
from suds.sax import text from suds.sax import text
from cinder import exception from cinder import exception
from cinder import flags
from cinder.openstack.common import lockutils from cinder.openstack.common import lockutils
from cinder.openstack.common import log as logging from cinder.openstack.common import log as logging
from cinder.volume import driver from cinder.volume import driver
@ -85,9 +84,6 @@ netapp_opts = [
help='Comma separated eligible volumes for provisioning on' help='Comma separated eligible volumes for provisioning on'
' 7 mode'), ] ' 7 mode'), ]
FLAGS = flags.FLAGS
FLAGS.register_opts(netapp_opts)
class DfmDataset(object): class DfmDataset(object):
def __init__(self, id, name, project, type): def __init__(self, id, name, project, type):
@ -114,6 +110,7 @@ class NetAppISCSIDriver(driver.ISCSIDriver):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(NetAppISCSIDriver, self).__init__(*args, **kwargs) super(NetAppISCSIDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(netapp_opts)
self.discovered_luns = [] self.discovered_luns = []
self.discovered_datasets = [] self.discovered_datasets = []
self.lun_table = {} self.lun_table = {}
@ -168,10 +165,10 @@ class NetAppISCSIDriver(driver.ISCSIDriver):
required_flags = ['netapp_wsdl_url', 'netapp_login', 'netapp_password', required_flags = ['netapp_wsdl_url', 'netapp_login', 'netapp_password',
'netapp_server_hostname', 'netapp_server_port'] 'netapp_server_hostname', 'netapp_server_port']
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
raise exception.InvalidInput(reason=_('%s is not set') % flag) raise exception.InvalidInput(reason=_('%s is not set') % flag)
if not (FLAGS.netapp_storage_service or if not (self.configuration.netapp_storage_service or
FLAGS.netapp_storage_service_prefix): self.configuration.netapp_storage_service_prefix):
raise exception.InvalidInput( raise exception.InvalidInput(
reason=_('Either ' reason=_('Either '
'netapp_storage_service or ' 'netapp_storage_service or '
@ -187,13 +184,15 @@ class NetAppISCSIDriver(driver.ISCSIDriver):
""" """
self._check_flags() self._check_flags()
self._create_client( self._create_client(
wsdl_url=FLAGS.netapp_wsdl_url, wsdl_url=self.configuration.netapp_wsdl_url,
login=FLAGS.netapp_login, password=FLAGS.netapp_password, login=self.configuration.netapp_login,
hostname=FLAGS.netapp_server_hostname, password=self.configuration.netapp_password,
port=FLAGS.netapp_server_port, cache=True) hostname=self.configuration.netapp_server_hostname,
self._set_storage_service(FLAGS.netapp_storage_service) port=self.configuration.netapp_server_port, cache=True)
self._set_storage_service_prefix(FLAGS.netapp_storage_service_prefix) self._set_storage_service(self.configuration.netapp_storage_service)
self._set_vfiler(FLAGS.netapp_vfiler) self._set_storage_service_prefix(
self.configuration.netapp_storage_service_prefix)
self._set_vfiler(self.configuration.netapp_vfiler)
def check_for_setup_error(self): def check_for_setup_error(self):
"""Check that the driver is working and can communicate. """Check that the driver is working and can communicate.
@ -1154,6 +1153,7 @@ class NetAppCmodeISCSIDriver(driver.ISCSIDriver):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(NetAppCmodeISCSIDriver, self).__init__(*args, **kwargs) super(NetAppCmodeISCSIDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(netapp_opts)
self.lun_table = {} self.lun_table = {}
def _create_client(self, **kwargs): def _create_client(self, **kwargs):
@ -1178,7 +1178,7 @@ class NetAppCmodeISCSIDriver(driver.ISCSIDriver):
required_flags = ['netapp_wsdl_url', 'netapp_login', 'netapp_password', required_flags = ['netapp_wsdl_url', 'netapp_login', 'netapp_password',
'netapp_server_hostname', 'netapp_server_port'] 'netapp_server_hostname', 'netapp_server_port']
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
msg = _('%s is not set') % flag msg = _('%s is not set') % flag
raise exception.InvalidInput(data=msg) raise exception.InvalidInput(data=msg)
@ -1191,10 +1191,11 @@ class NetAppCmodeISCSIDriver(driver.ISCSIDriver):
""" """
self._check_flags() self._check_flags()
self._create_client( self._create_client(
wsdl_url=FLAGS.netapp_wsdl_url, wsdl_url=self.configuration.netapp_wsdl_url,
login=FLAGS.netapp_login, password=FLAGS.netapp_password, login=self.configuration.netapp_login,
hostname=FLAGS.netapp_server_hostname, password=self.configuration.netapp_password,
port=FLAGS.netapp_server_port, cache=True) hostname=self.configuration.netapp_server_hostname,
port=self.configuration.netapp_server_port, cache=True)
def check_for_setup_error(self): def check_for_setup_error(self):
"""Check that the driver is working and can communicate. """Check that the driver is working and can communicate.
@ -1504,6 +1505,7 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(NetAppDirectISCSIDriver, self).__init__(*args, **kwargs) super(NetAppDirectISCSIDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(netapp_opts)
self.lun_table = {} self.lun_table = {}
def _create_client(self, **kwargs): def _create_client(self, **kwargs):
@ -1532,7 +1534,7 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
"""Ensure that the flags we care about are set.""" """Ensure that the flags we care about are set."""
required_flags = self.required_flags required_flags = self.required_flags
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
msg = _('%s is not set') % flag msg = _('%s is not set') % flag
raise exception.InvalidInput(data=msg) raise exception.InvalidInput(data=msg)
@ -1545,10 +1547,11 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
""" """
self._check_flags() self._check_flags()
self._create_client( self._create_client(
transport_type=FLAGS.netapp_transport_type, transport_type=self.configuration.netapp_transport_type,
login=FLAGS.netapp_login, password=FLAGS.netapp_password, login=self.configuration.netapp_login,
hostname=FLAGS.netapp_server_hostname, password=self.configuration.netapp_password,
port=FLAGS.netapp_server_port) hostname=self.configuration.netapp_server_hostname,
port=self.configuration.netapp_server_port)
self._do_custom_setup() self._do_custom_setup()
def check_for_setup_error(self): def check_for_setup_error(self):
@ -1728,7 +1731,8 @@ class NetAppDirectISCSIDriver(driver.ISCSIDriver):
def _create_lun_on_eligible_vol(self, name, size, metadata): def _create_lun_on_eligible_vol(self, name, size, metadata):
"""Creates an actual lun on filer.""" """Creates an actual lun on filer."""
req_size = float(size) * float(FLAGS.netapp_size_multiplier) req_size = float(size) *\
float(self.configuration.netapp_size_multiplier)
volume = self._get_avl_volume_by_size(req_size) volume = self._get_avl_volume_by_size(req_size)
if not volume: if not volume:
msg = _('Failed to get vol with required size for volume: %s') msg = _('Failed to get vol with required size for volume: %s')
@ -1973,7 +1977,7 @@ class NetAppDirectCmodeISCSIDriver(NetAppDirectISCSIDriver):
def _do_custom_setup(self): def _do_custom_setup(self):
"""Does custom setup for ontap cluster.""" """Does custom setup for ontap cluster."""
self.vserver = FLAGS.netapp_vserver self.vserver = self.configuration.netapp_vserver
# Default values to run first api # Default values to run first api
self.client.set_api_version(1, 15) self.client.set_api_version(1, 15)
(major, minor) = self._get_ontapi_version() (major, minor) = self._get_ontapi_version()
@ -2264,8 +2268,8 @@ class NetAppDirect7modeISCSIDriver(NetAppDirectISCSIDriver):
def _do_custom_setup(self): def _do_custom_setup(self):
"""Does custom setup depending on the type of filer.""" """Does custom setup depending on the type of filer."""
self.vfiler = FLAGS.netapp_vfiler self.vfiler = self.configuration.netapp_vfiler
self.volume_list = FLAGS.netapp_volume_list self.volume_list = self.configuration.netapp_volume_list
if self.volume_list: if self.volume_list:
self.volume_list = self.volume_list.split(',') self.volume_list = self.volume_list.split(',')
self.volume_list = [el.strip() for el in self.volume_list] self.volume_list = [el.strip() for el in self.volume_list]
@ -2364,9 +2368,10 @@ class NetAppDirect7modeISCSIDriver(NetAppDirectISCSIDriver):
def _create_lun_handle(self, metadata): def _create_lun_handle(self, metadata):
"""Returns lun handle based on filer type.""" """Returns lun handle based on filer type."""
if self.vfiler: if self.vfiler:
owner = '%s:%s' % (FLAGS.netapp_server_hostname, self.vfiler) owner = '%s:%s' % (self.configuration.netapp_server_hostname,
self.vfiler)
else: else:
owner = FLAGS.netapp_server_hostname owner = self.configuration.netapp_server_hostname
return '%s:%s' % (owner, metadata['Path']) return '%s:%s' % (owner, metadata['Path'])
def _get_lun_list(self): def _get_lun_list(self):

View File

@ -26,7 +26,6 @@ import suds
from suds.sax import text from suds.sax import text
from cinder import exception from cinder import exception
from cinder import flags
from cinder.openstack.common import log as logging from cinder.openstack.common import log as logging
from cinder.volume.drivers.netapp.api import NaApiError from cinder.volume.drivers.netapp.api import NaApiError
from cinder.volume.drivers.netapp.api import NaElement from cinder.volume.drivers.netapp.api import NaElement
@ -41,10 +40,6 @@ netapp_nfs_opts = [
default=0, default=0,
help='Does snapshot creation call returns immediately')] help='Does snapshot creation call returns immediately')]
FLAGS = flags.FLAGS
FLAGS.register_opts(netapp_opts)
FLAGS.register_opts(netapp_nfs_opts)
class NetAppNFSDriver(nfs.NfsDriver): class NetAppNFSDriver(nfs.NfsDriver):
"""Executes commands relating to Volumes.""" """Executes commands relating to Volumes."""
@ -53,6 +48,8 @@ class NetAppNFSDriver(nfs.NfsDriver):
self._execute = None self._execute = None
self._context = None self._context = None
super(NetAppNFSDriver, self).__init__(*args, **kwargs) super(NetAppNFSDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(netapp_opts)
self.configuration.append_config_values(netapp_nfs_opts)
def set_execute(self, execute): def set_execute(self, execute):
self._execute = execute self._execute = execute
@ -60,11 +57,11 @@ class NetAppNFSDriver(nfs.NfsDriver):
def do_setup(self, context): def do_setup(self, context):
self._context = context self._context = context
self.check_for_setup_error() self.check_for_setup_error()
self._client = NetAppNFSDriver._get_client() self._client = self._get_client()
def check_for_setup_error(self): def check_for_setup_error(self):
"""Returns an error if prerequisites aren't met""" """Returns an error if prerequisites aren't met"""
NetAppNFSDriver._check_dfm_flags() self._check_dfm_flags()
super(NetAppNFSDriver, self).check_for_setup_error() super(NetAppNFSDriver, self).check_for_setup_error()
def create_volume_from_snapshot(self, volume, snapshot): def create_volume_from_snapshot(self, volume, snapshot):
@ -98,8 +95,7 @@ class NetAppNFSDriver(nfs.NfsDriver):
self._execute('rm', self._get_volume_path(nfs_mount, snapshot.name), self._execute('rm', self._get_volume_path(nfs_mount, snapshot.name),
run_as_root=True) run_as_root=True)
@staticmethod def _check_dfm_flags(self):
def _check_dfm_flags():
"""Raises error if any required configuration flag for OnCommand proxy """Raises error if any required configuration flag for OnCommand proxy
is missing.""" is missing."""
required_flags = ['netapp_wsdl_url', required_flags = ['netapp_wsdl_url',
@ -108,17 +104,18 @@ class NetAppNFSDriver(nfs.NfsDriver):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
raise exception.CinderException(_('%s is not set') % flag) raise exception.CinderException(_('%s is not set') % flag)
@staticmethod def _get_client(self):
def _get_client():
"""Creates SOAP _client for ONTAP-7 DataFabric Service.""" """Creates SOAP _client for ONTAP-7 DataFabric Service."""
client = suds.client.Client(FLAGS.netapp_wsdl_url, client = suds.client.Client(
username=FLAGS.netapp_login, self.configuration.netapp_wsdl_url,
password=FLAGS.netapp_password) username=self.configuration.netapp_login,
soap_url = 'http://%s:%s/apis/soap/v1' % (FLAGS.netapp_server_hostname, password=self.configuration.netapp_password)
FLAGS.netapp_server_port) soap_url = 'http://%s:%s/apis/soap/v1' % (
self.configuration.netapp_server_hostname,
self.configuration.netapp_server_port)
client.set_options(location=soap_url) client.set_options(location=soap_url)
return client return client
@ -148,7 +145,8 @@ class NetAppNFSDriver(nfs.NfsDriver):
resp = self._client.service.ApiProxy(Target=host_id, resp = self._client.service.ApiProxy(Target=host_id,
Request=request) Request=request)
if resp.Status == 'passed' and FLAGS.synchronous_snapshot_create: if (resp.Status == 'passed' and
self.configuration.synchronous_snapshot_create):
clone_id = resp.Results['clone-id'][0] clone_id = resp.Results['clone-id'][0]
clone_id_info = clone_id['clone-id-info'][0] clone_id_info = clone_id['clone-id-info'][0]
clone_operation_id = int(clone_id_info['clone-op-id'][0]) clone_operation_id = int(clone_id_info['clone-op-id'][0])
@ -251,7 +249,7 @@ class NetAppNFSDriver(nfs.NfsDriver):
return True return True
except exception.ProcessExecutionError: except exception.ProcessExecutionError:
tries = tries + 1 tries = tries + 1
if tries >= FLAGS.num_shell_tries: if tries >= self.configuration.num_shell_tries:
raise raise
LOG.exception(_("Recovering from a failed execute. " LOG.exception(_("Recovering from a failed execute. "
"Try number %s"), tries) "Try number %s"), tries)
@ -317,11 +315,11 @@ class NetAppCmodeNfsDriver (NetAppNFSDriver):
def do_setup(self, context): def do_setup(self, context):
self._context = context self._context = context
self.check_for_setup_error() self.check_for_setup_error()
self._client = NetAppCmodeNfsDriver._get_client() self._client = self._get_client()
def check_for_setup_error(self): def check_for_setup_error(self):
"""Returns an error if prerequisites aren't met""" """Returns an error if prerequisites aren't met"""
NetAppCmodeNfsDriver._check_flags() self._check_flags()
def _clone_volume(self, volume_name, clone_name, volume_id): def _clone_volume(self, volume_name, clone_name, volume_id):
"""Clones mounted volume with NetApp Cloud Services""" """Clones mounted volume with NetApp Cloud Services"""
@ -333,8 +331,7 @@ class NetAppCmodeNfsDriver (NetAppNFSDriver):
self._client.service.CloneNasFile(host_ip, export_path, self._client.service.CloneNasFile(host_ip, export_path,
volume_name, clone_name) volume_name, clone_name)
@staticmethod def _check_flags(self):
def _check_flags():
"""Raises error if any required configuration flag for NetApp Cloud """Raises error if any required configuration flag for NetApp Cloud
Webservices is missing.""" Webservices is missing."""
required_flags = ['netapp_wsdl_url', required_flags = ['netapp_wsdl_url',
@ -343,15 +340,15 @@ class NetAppCmodeNfsDriver (NetAppNFSDriver):
'netapp_server_hostname', 'netapp_server_hostname',
'netapp_server_port'] 'netapp_server_port']
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
raise exception.CinderException(_('%s is not set') % flag) raise exception.CinderException(_('%s is not set') % flag)
@staticmethod def _get_client(self):
def _get_client():
"""Creates SOAP _client for NetApp Cloud service.""" """Creates SOAP _client for NetApp Cloud service."""
client = suds.client.Client(FLAGS.netapp_wsdl_url, client = suds.client.Client(
username=FLAGS.netapp_login, self.configuration.netapp_wsdl_url,
password=FLAGS.netapp_password) username=self.configuration.netapp_login,
password=self.configuration.netapp_password)
return client return client
def get_volume_stats(self, refresh=False): def get_volume_stats(self, refresh=False):
@ -389,19 +386,18 @@ class NetAppDirectNfsDriver (NetAppNFSDriver):
def do_setup(self, context): def do_setup(self, context):
self._context = context self._context = context
self.check_for_setup_error() self.check_for_setup_error()
self._client = NetAppDirectNfsDriver._get_client() self._client = self._get_client()
self._do_custom_setup(self._client) self._do_custom_setup(self._client)
def check_for_setup_error(self): def check_for_setup_error(self):
"""Returns an error if prerequisites aren't met""" """Returns an error if prerequisites aren't met"""
NetAppDirectNfsDriver._check_flags() self._check_flags()
def _clone_volume(self, volume_name, clone_name, volume_id): def _clone_volume(self, volume_name, clone_name, volume_id):
"""Clones mounted volume on NetApp filer""" """Clones mounted volume on NetApp filer"""
raise NotImplementedError() raise NotImplementedError()
@staticmethod def _check_flags(self):
def _check_flags():
"""Raises error if any required configuration flag for NetApp """Raises error if any required configuration flag for NetApp
filer is missing.""" filer is missing."""
required_flags = ['netapp_login', required_flags = ['netapp_login',
@ -410,18 +406,18 @@ class NetAppDirectNfsDriver (NetAppNFSDriver):
'netapp_server_port', 'netapp_server_port',
'netapp_transport_type'] 'netapp_transport_type']
for flag in required_flags: for flag in required_flags:
if not getattr(FLAGS, flag, None): if not getattr(self.configuration, flag, None):
raise exception.CinderException(_('%s is not set') % flag) raise exception.CinderException(_('%s is not set') % flag)
@staticmethod def _get_client(self):
def _get_client():
"""Creates NetApp api client.""" """Creates NetApp api client."""
client = NaServer(host=FLAGS.netapp_server_hostname, client = NaServer(
server_type=NaServer.SERVER_TYPE_FILER, host=self.configuration.netapp_server_hostname,
transport_type=FLAGS.netapp_transport_type, server_type=NaServer.SERVER_TYPE_FILER,
style=NaServer.STYLE_LOGIN_PASSWORD, transport_type=self.configuration.netapp_transport_type,
username=FLAGS.netapp_login, style=NaServer.STYLE_LOGIN_PASSWORD,
password=FLAGS.netapp_password) username=self.configuration.netapp_login,
password=self.configuration.netapp_password)
return client return client
def _do_custom_setup(self, client): def _do_custom_setup(self, client):