1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright (c) 2012 NetApp, Inc.
4
# Copyright (c) 2012 OpenStack LLC.
7
# Licensed under the Apache License, Version 2.0 (the "License"); you may
8
# not use this file except in compliance with the License. You may obtain
9
# a copy of the License at
11
# http://www.apache.org/licenses/LICENSE-2.0
13
# Unless required by applicable law or agreed to in writing, software
14
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
# License for the specific language governing permissions and limitations
19
Utilities for NetApp drivers.
21
This module contains common utilities to be used by one or more
22
NetApp drivers to achieve the desired functionality.
28
from cinder.openstack.common import log as logging
29
from cinder.openstack.common import timeutils
30
from cinder.volume.drivers.netapp.api import NaApiError
31
from cinder.volume.drivers.netapp.api import NaElement
33
LOG = logging.getLogger(__name__)
36
def provide_ems(requester, server, stats, netapp_backend,
37
server_type="cluster"):
38
"""Provide ems with volume stats for the requester.
40
:param server_type: cluster or 7mode.
42
def _create_ems(stats, netapp_backend, server_type):
43
"""Create ems api request."""
44
ems_log = NaElement('ems-autosupport-log')
45
host = socket.getfqdn() or 'Cinder_node'
46
dest = "cluster node" if server_type == "cluster"\
47
else "7 mode controller"
48
ems_log.add_new_child('computer-name', host)
49
ems_log.add_new_child('event-id', '0')
50
ems_log.add_new_child('event-source',
51
'Cinder driver %s' % netapp_backend)
52
ems_log.add_new_child('app-version', stats.get('driver_version',
54
ems_log.add_new_child('category', 'provisioning')
55
ems_log.add_new_child('event-description',
56
'OpenStack volume created on %s' % dest)
57
ems_log.add_new_child('log-level', '6')
58
ems_log.add_new_child('auto-support', 'true')
62
"""Create vs_get api request."""
63
vs_get = NaElement('vserver-get-iter')
64
vs_get.add_new_child('max-records', '1')
65
query = NaElement('query')
66
query.add_node_with_children('vserver-info',
67
**{'vserver-type': 'node'})
68
vs_get.add_child_elem(query)
69
desired = NaElement('desired-attributes')
70
desired.add_node_with_children(
71
'vserver-info', **{'vserver-name': '', 'vserver-type': ''})
72
vs_get.add_child_elem(desired)
75
def _get_cluster_node(na_server):
76
"""Get the cluster node for ems."""
77
na_server.set_vserver(None)
78
vs_get = _create_vs_get()
79
res = na_server.invoke_successfully(vs_get)
80
if (res.get_child_content('num-records') and
81
int(res.get_child_content('num-records')) > 0):
82
attr_list = res.get_child_by_name('attributes-list')
83
vs_info = attr_list.get_child_by_name('vserver-info')
84
vs_name = vs_info.get_child_content('vserver-name')
86
raise NaApiError(code='Not found', message='No records found')
89
if hasattr(requester, 'last_ems'):
91
if not (timeutils.is_older_than(requester.last_ems, sec_limit) or
92
timeutils.is_older_than(requester.last_ems, sec_limit - 59)):
95
na_server = copy.copy(server)
96
na_server.set_timeout(25)
97
ems = _create_ems(stats, netapp_backend, server_type)
99
if server_type == "cluster":
100
node = _get_cluster_node(na_server)
101
na_server.set_vserver(node)
103
na_server.set_vfiler(None)
104
na_server.invoke_successfully(ems, True)
105
requester.last_ems = timeutils.utcnow()
106
LOG.debug(_("ems executed successfully."))
107
except NaApiError as e:
108
LOG.debug(_("Failed to invoke ems. Message : %s") % e)
111
def validate_instantiation(**kwargs):
112
"""Checks if a driver is instantiated other than by the unified driver.
114
Helps check direct instantiation of netapp drivers.
115
Call this function in every netapp block driver constructor.
117
if kwargs and kwargs.get('netapp_mode') == 'proxy':
119
LOG.warn(_("It is not the recommended way to use drivers by NetApp. "
120
"Please use NetAppDriver to achieve the functionality."))