"Fossies" - the Fresh Open Source Software Archive 
Member "manila-8.1.4/manila/share/drivers/dell_emc/common/enas/utils.py" (19 Nov 2020, 5822 Bytes) of package /linux/misc/openstack/manila-8.1.4.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the latest
Fossies "Diffs" side-by-side code changes report for "utils.py":
8.1.3_vs_8.1.4.
1 # Copyright (c) 2014 EMC Corporation.
2 # All Rights Reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License"); you may
5 # not use this file except in compliance with the License. You may obtain
6 # a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 # License for the specific language governing permissions and limitations
14 # under the License.
15
16 import types
17
18 from oslo_config import cfg
19 from oslo_log import log
20 from oslo_utils import fnmatch
21 from oslo_utils import netutils
22 from oslo_utils import timeutils
23 from oslo_utils import units
24 import ssl
25
26 CONF = cfg.CONF
27 LOG = log.getLogger(__name__)
28
29
30 def decorate_all_methods(decorator, debug_only=False):
31 if debug_only and not CONF.debug:
32 return lambda cls: cls
33
34 def _decorate_all_methods(cls):
35 for attr_name, attr_val in cls.__dict__.items():
36 if (isinstance(attr_val, types.FunctionType) and
37 not attr_name.startswith("_")):
38 setattr(cls, attr_name, decorator(attr_val))
39 return cls
40
41 return _decorate_all_methods
42
43
44 def log_enter_exit(func):
45 if not CONF.debug:
46 return func
47
48 def inner(self, *args, **kwargs):
49 LOG.debug("Entering %(cls)s.%(method)s.",
50 {'cls': self.__class__.__name__,
51 'method': func.__name__})
52 start = timeutils.utcnow()
53 ret = func(self, *args, **kwargs)
54 end = timeutils.utcnow()
55 LOG.debug("Exiting %(cls)s.%(method)s. "
56 "Spent %(duration)s sec. "
57 "Return %(return)s.",
58 {'cls': self.__class__.__name__,
59 'duration': timeutils.delta_seconds(start, end),
60 'method': func.__name__,
61 'return': ret})
62 return ret
63
64 return inner
65
66
67 def do_match_any(full, matcher_list):
68 """Finds items that match any of the matchers.
69
70 :param full: Full item list
71 :param matcher_list: The list of matchers. Each matcher supports
72 Unix shell-style wildcards
73 :return: The matched items set and the unmatched items set
74 """
75 matched = set()
76 not_matched = set()
77
78 full = set([item.strip() for item in full])
79 matcher_list = set([item.strip() for item in matcher_list])
80
81 for matcher in matcher_list:
82 for item in full:
83 if fnmatch.fnmatchcase(item, matcher):
84 matched.add(item)
85 not_matched = full - matched
86 return matched, not_matched
87
88
89 def create_ssl_context(configuration):
90 """Create context for ssl verification.
91
92 .. note:: starting from python 2.7.9 ssl adds create_default_context.
93 We need to keep compatibility with previous python as well.
94 """
95 try:
96 if configuration.emc_ssl_cert_verify:
97 context = ssl.create_default_context(
98 capath=configuration.emc_ssl_cert_path)
99 else:
100 context = ssl.create_default_context()
101 context.check_hostname = False
102 context.verify_mode = ssl.CERT_NONE
103 except AttributeError:
104 LOG.warning('Creating ssl context is not supported on this '
105 'version of Python, ssl verification is disabled.')
106 context = None
107 return context
108
109
110 def parse_ipaddr(text):
111 """Parse the output of VNX server_export command, get IPv4/IPv6 addresses.
112
113 Example:
114 input: 192.168.100.102:[fdf8:f53b:82e4::57]:[fdf8:f53b:82e4::54]
115 output: ['192.168.100.102', '[fdf8:f53b:82e4::57]', '[fdf8:f53b:82e4::54]']
116
117 :param text: The output of VNX server_export command.
118 :return: The list of IPv4/IPv6 addresses. The IPv6 address enclosed by [].
119 """
120 rst = []
121 stk = []
122
123 ipaddr = ''
124 it = iter(text)
125
126 try:
127 while True:
128 i = next(it)
129 if i == ':' and not stk and ipaddr:
130 rst.append(ipaddr)
131 ipaddr = ''
132 elif i == ':' and not ipaddr:
133 continue
134 elif i == '[':
135 stk.append(i)
136 elif i == ']':
137 rst.append('[%s]' % ipaddr)
138 stk.pop()
139 ipaddr = ''
140 else:
141 ipaddr += i
142 except StopIteration:
143 if ipaddr:
144 rst.append(ipaddr)
145
146 return rst
147
148
149 def convert_ipv6_format_if_needed(ip_addr):
150 """Convert IPv6 address format if needed. The IPv6 address enclosed by [].
151
152 For the invalid IPv6 cidr, its format will not be changed.
153
154 :param ip_addr: IPv6 address.
155 :return: Converted IPv6 address.
156 """
157 if netutils.is_valid_ipv6_cidr(ip_addr):
158 ip_addr = '[%s]' % ip_addr
159 return ip_addr
160
161
162 def export_unc_path(ip_addr):
163 """Convert IPv6 address to valid UNC path.
164
165 In Microsoft Windows OS, UNC (Uniform Naming Convention) specifies a
166 common syntax to describe the location of a network resource.
167
168 The colon which used by IPv6 is an illegal character in a UNC path name.
169 So the IPv6 address need to be converted to valid UNC path.
170
171 References:
172 - https://en.wikipedia.org/wiki/IPv6_address
173 #Literal_IPv6_addresses_in_UNC_path_names
174 - https://en.wikipedia.org/wiki/Path_(computing)#Uniform_Naming_Convention
175
176 :param ip_addr: IPv6 address.
177 :return: UNC path.
178 """
179 unc_suffix = '.ipv6-literal.net'
180 if netutils.is_valid_ipv6(ip_addr):
181 ip_addr = ip_addr.replace(':', '-') + unc_suffix
182 return ip_addr
183
184
185 def bytes_to_gb(size):
186 return round(float(size) / units.Gi, 2)
187
188
189 def mb_to_gb(size):
190 return bytes_to_gb(size * units.Mi)