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

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. 

16 

17Supports multiple storage systems of different families and driver modes. 

18""" 

19 

20from oslo_log import log 

21from oslo_utils import importutils 

22 

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 

28 

29 

30LOG = log.getLogger(__name__) 

31 

32MULTI_SVM = 'multi_svm' 

33SINGLE_SVM = 'single_svm' 

34DATAONTAP_CMODE_PATH = 'manila.share.drivers.netapp.dataontap.cluster_mode' 

35 

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} 

49 

50 

51class NetAppDriver(object): 

52 """"NetApp unified share storage driver. 

53 

54 Acts as a factory to create NetApp storage drivers based on the 

55 storage family and driver mode configured. 

56 """ 

57 

58 REQUIRED_FLAGS = ['netapp_storage_family', 'driver_handles_share_servers'] 

59 

60 def __new__(cls, *args, **kwargs): 

61 

62 config = kwargs.get('configuration', None) 

63 if not config: 

64 raise exception.InvalidInput( 

65 reason=_('Required configuration not found.')) 

66 

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) 

70 

71 app_version = na_utils.OpenStackInfo().info() 

72 LOG.info('OpenStack OS Version Info: %s', app_version) 

73 kwargs['app_version'] = app_version 

74 

75 driver_mode = NetAppDriver._get_driver_mode( 

76 config.netapp_storage_family, config.driver_handles_share_servers) 

77 

78 return NetAppDriver._create_driver(config.netapp_storage_family, 

79 driver_mode, 

80 *args, **kwargs) 

81 

82 @staticmethod 

83 def _get_driver_mode(storage_family, driver_handles_share_servers): 

84 

85 if driver_handles_share_servers is None: 

86 driver_mode = NETAPP_UNIFIED_DRIVER_DEFAULT_MODE.get( 

87 storage_family.lower()) 

88 

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 

100 

101 return driver_mode 

102 

103 @staticmethod 

104 def _create_driver(storage_family, driver_mode, *args, **kwargs): 

105 """"Creates an appropriate driver based on family and mode.""" 

106 

107 storage_family = storage_family.lower() 

108 

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) 

112 

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) 

118 

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) 

124 

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