Coverage for manila/share/drivers/netapp/common.py: 100%
54 statements
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2026-02-18 22:19 +0000
1# Copyright (c) 2015 Clinton Knight. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14"""
15Unified driver for NetApp storage systems.
17Supports multiple storage systems of different families and driver modes.
18"""
20from oslo_log import log
21from oslo_utils import importutils
23from manila import exception
24from manila.i18n import _
25from manila.share import driver
26from manila.share.drivers.netapp import options
27from manila.share.drivers.netapp import utils as na_utils
30LOG = log.getLogger(__name__)
32MULTI_SVM = 'multi_svm'
33SINGLE_SVM = 'single_svm'
34DATAONTAP_CMODE_PATH = 'manila.share.drivers.netapp.dataontap.cluster_mode'
36# Add new drivers here, no other code changes required.
37NETAPP_UNIFIED_DRIVER_REGISTRY = {
38 'ontap_cluster':
39 {
40 MULTI_SVM: DATAONTAP_CMODE_PATH +
41 '.drv_multi_svm.NetAppCmodeMultiSvmShareDriver',
42 SINGLE_SVM: DATAONTAP_CMODE_PATH +
43 '.drv_single_svm.NetAppCmodeSingleSvmShareDriver',
44 },
45}
46NETAPP_UNIFIED_DRIVER_DEFAULT_MODE = {
47 'ontap_cluster': MULTI_SVM,
48}
51class NetAppDriver(object):
52 """"NetApp unified share storage driver.
54 Acts as a factory to create NetApp storage drivers based on the
55 storage family and driver mode configured.
56 """
58 REQUIRED_FLAGS = ['netapp_storage_family', 'driver_handles_share_servers']
60 def __new__(cls, *args, **kwargs):
62 config = kwargs.get('configuration', None)
63 if not config:
64 raise exception.InvalidInput(
65 reason=_('Required configuration not found.'))
67 config.append_config_values(driver.share_opts)
68 config.append_config_values(options.netapp_proxy_opts)
69 na_utils.check_flags(NetAppDriver.REQUIRED_FLAGS, config)
71 app_version = na_utils.OpenStackInfo().info()
72 LOG.info('OpenStack OS Version Info: %s', app_version)
73 kwargs['app_version'] = app_version
75 driver_mode = NetAppDriver._get_driver_mode(
76 config.netapp_storage_family, config.driver_handles_share_servers)
78 return NetAppDriver._create_driver(config.netapp_storage_family,
79 driver_mode,
80 *args, **kwargs)
82 @staticmethod
83 def _get_driver_mode(storage_family, driver_handles_share_servers):
85 if driver_handles_share_servers is None:
86 driver_mode = NETAPP_UNIFIED_DRIVER_DEFAULT_MODE.get(
87 storage_family.lower())
89 if driver_mode:
90 LOG.debug('Default driver mode %s selected.', driver_mode)
91 else:
92 raise exception.InvalidInput(
93 reason=_('Driver mode was not specified and a default '
94 'value could not be determined from the '
95 'specified storage family.'))
96 elif driver_handles_share_servers:
97 driver_mode = MULTI_SVM
98 else:
99 driver_mode = SINGLE_SVM
101 return driver_mode
103 @staticmethod
104 def _create_driver(storage_family, driver_mode, *args, **kwargs):
105 """"Creates an appropriate driver based on family and mode."""
107 storage_family = storage_family.lower()
109 fmt = {'storage_family': storage_family, 'driver_mode': driver_mode}
110 LOG.info('Requested unified config: %(storage_family)s and '
111 '%(driver_mode)s.', fmt)
113 family_meta = NETAPP_UNIFIED_DRIVER_REGISTRY.get(storage_family)
114 if family_meta is None:
115 raise exception.InvalidInput(
116 reason=_('Storage family %s is not supported.')
117 % storage_family)
119 driver_loc = family_meta.get(driver_mode)
120 if driver_loc is None:
121 raise exception.InvalidInput(
122 reason=_('Driver mode %(driver_mode)s is not supported '
123 'for storage family %(storage_family)s.') % fmt)
125 kwargs['netapp_mode'] = 'proxy'
126 driver = importutils.import_object(driver_loc, *args, **kwargs)
127 LOG.info('NetApp driver of family %(storage_family)s and mode '
128 '%(driver_mode)s loaded.', fmt)
129 driver.ipv6_implemented = True
130 return driver