~ubuntu-branches/ubuntu/saucy/cinder/saucy-proposed

« back to all changes in this revision

Viewing changes to cinder/volume/drivers/netapp/utils.py

  • Committer: Package Import Robot
  • Author(s): James Page, Chuck Short, Adam Gandelman, James Page
  • Date: 2013-07-19 14:14:40 UTC
  • mfrom: (1.1.17)
  • Revision ID: package-import@ubuntu.com-20130719141440-brarmy8wxm3vosaf
Tags: 1:2013.2~b2-0ubuntu1
[ Chuck Short ]
* debian/patches/avoid_paramiko_vers_depends.patch: Refreshed
* debian/control: Add missing testrepostory.
* debian/rules: Use testr directly.

[ Adam Gandelman ]
* debian/control:
  - Add minimum requirement python-anyjson (>= 0.3.3).
  - Add minimum requirement python-keystoneclient (>= 0.2.3).
  - Add minimum requirement python-kombu (>= 2.5.12).

[ James Page ]
* New upstream release.
* d/control: Update VCS fields for new branch locations.
* d/rules: Run unit tests in parallel.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 
2
 
 
3
# Copyright (c) 2012 NetApp, Inc.
 
4
# Copyright (c) 2012 OpenStack LLC.
 
5
# All Rights Reserved.
 
6
#
 
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
 
10
#
 
11
#         http://www.apache.org/licenses/LICENSE-2.0
 
12
#
 
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
 
17
#    under the License.
 
18
"""
 
19
Utilities for NetApp drivers.
 
20
 
 
21
This module contains common utilities to be used by one or more
 
22
NetApp drivers to achieve the desired functionality.
 
23
"""
 
24
 
 
25
import copy
 
26
import socket
 
27
 
 
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
 
32
 
 
33
LOG = logging.getLogger(__name__)
 
34
 
 
35
 
 
36
def provide_ems(requester, server, stats, netapp_backend,
 
37
                server_type="cluster"):
 
38
    """Provide ems with volume stats for the requester.
 
39
 
 
40
    :param server_type: cluster or 7mode.
 
41
    """
 
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',
 
53
                              'Undefined'))
 
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')
 
59
        return ems_log
 
60
 
 
61
    def _create_vs_get():
 
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)
 
73
        return vs_get
 
74
 
 
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')
 
85
            return vs_name
 
86
        raise NaApiError(code='Not found', message='No records found')
 
87
 
 
88
    do_ems = True
 
89
    if hasattr(requester, 'last_ems'):
 
90
        sec_limit = 604800
 
91
        if not (timeutils.is_older_than(requester.last_ems, sec_limit) or
 
92
                timeutils.is_older_than(requester.last_ems, sec_limit - 59)):
 
93
            do_ems = False
 
94
    if do_ems:
 
95
        na_server = copy.copy(server)
 
96
        na_server.set_timeout(25)
 
97
        ems = _create_ems(stats, netapp_backend, server_type)
 
98
        try:
 
99
            if server_type == "cluster":
 
100
                node = _get_cluster_node(na_server)
 
101
                na_server.set_vserver(node)
 
102
            else:
 
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)
 
109
 
 
110
 
 
111
def validate_instantiation(**kwargs):
 
112
    """Checks if a driver is instantiated other than by the unified driver.
 
113
 
 
114
    Helps check direct instantiation of netapp drivers.
 
115
    Call this function in every netapp block driver constructor.
 
116
    """
 
117
    if kwargs and kwargs.get('netapp_mode') == 'proxy':
 
118
        return
 
119
    LOG.warn(_("It is not the recommended way to use drivers by NetApp. "
 
120
               "Please use NetAppDriver to achieve the functionality."))