components/openstack/cinder/files/solaris/nfs.py
author Laszlo Peter <laszlo.peter@oracle.com>
Wed, 07 Sep 2016 14:48:41 -0700
changeset 6849 f9a2279efa0d
parent 5405 66fd59fecd68
permissions -rw-r--r--
24465600 Update Cinder for the Mitaka release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     2
# Copyright (c) 2012 OpenStack LLC.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     3
# All Rights Reserved.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     4
#
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
     5
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     6
#
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     7
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     8
#    not use this file except in compliance with the License. You may obtain
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
     9
#    a copy of the License at
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    10
#
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    11
#         http://www.apache.org/licenses/LICENSE-2.0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    12
#
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    13
#    Unless required by applicable law or agreed to in writing, software
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    14
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    15
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    16
#    License for the specific language governing permissions and limitations
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    17
#    under the License.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    18
"""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    19
Volume driver for Solaris ZFS NFS storage
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    20
"""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    21
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    22
import os
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    23
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    24
from oslo_config import cfg
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    25
from oslo_log import log as logging
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    26
from oslo_utils import units
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    27
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    28
from cinder import exception
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
    29
from cinder.i18n import _, _LI
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    30
from cinder.volume.drivers import nfs
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    31
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    32
ZFS_NFS_VERSION = '1.0.0'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    33
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    34
LOG = logging.getLogger(__name__)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    35
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    36
solaris_zfs_nfs_opts = [
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    37
    cfg.BoolOpt('nfs_round_robin',
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    38
                default=True,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    39
                help=('Schedule volumes round robin across NFS shares.')),
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    40
]
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    41
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    42
CONF = cfg.CONF
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    43
CONF.register_opts(solaris_zfs_nfs_opts)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    44
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    45
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    46
class ZfsNfsVolumeDriver(nfs.NfsDriver):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    47
    """Local ZFS NFS volume operations."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    48
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    49
    driver_volume_type = 'nfs'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    50
    driver_prefix = 'nfs'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    51
    volume_backend_name = 'Solaris_NFS'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    52
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    53
    def __init__(self, *args, **kwargs):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    54
        super(ZfsNfsVolumeDriver, self).__init__(*args, **kwargs)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    55
        self.configuration.append_config_values(solaris_zfs_nfs_opts)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    56
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    57
        self.last_rr_pos = None
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    58
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    59
        if self.configuration.nfs_mount_options:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    60
            LOG.warning(_("Solaris NFS driver ignores mount options"))
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    61
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    62
    def _update_volume_stats(self):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    63
        """Retrieve volume status info."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    64
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    65
        stats = {}
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    66
        backend_name = self.configuration.safe_get('volume_backend_name')
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    67
        stats["volume_backend_name"] = backend_name or self.__class__.__name__
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    68
        stats["driver_version"] = ZFS_NFS_VERSION
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    69
        stats["vendor_name"] = 'Oracle'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    70
        stats['storage_protocol'] = self.driver_volume_type
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    71
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    72
        self._ensure_shares_mounted()
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    73
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    74
        global_capacity = 0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    75
        global_free = 0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    76
        for share in self._mounted_shares:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    77
            capacity, free, used = self._get_capacity_info(share)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    78
            global_capacity += capacity
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    79
            global_free += free
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    80
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    81
        stats['total_capacity_gb'] = global_capacity / float(units.Gi)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    82
        stats['free_capacity_gb'] = global_free / float(units.Gi)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    83
        stats['reserved_percentage'] = 0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    84
        stats['QoS_support'] = False
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    85
        self._stats = stats
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    86
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    87
    def _create_sparsed_file(self, path, size):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    88
        """Creates a sparse file of a given size in GiB."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    89
        self._execute('/usr/bin/truncate', '-s', '%sG' % size, path)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    90
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    91
    def _create_regular_file(self, path, size):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    92
        """Creates a regular file of given size in GiB."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    93
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    94
        block_size_mb = 1
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    95
        block_count = size * units.Gi / (block_size_mb * units.Mi)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    96
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    97
        self._execute('/usr/bin/dd', 'if=/dev/zero', 'of=%s' % path,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    98
                      'bs=%dM' % block_size_mb,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
    99
                      'count=%d' % block_count)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   100
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   101
    def _set_rw_permissions(self, path):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   102
        """Sets access permissions for given NFS path.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   103
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   104
        :param path: the volume file path.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   105
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   106
        os.chmod(path, 0o660)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   107
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   108
    def _set_rw_permissions_for_all(self, path):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   109
        """Sets 666 permissions for the path."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   110
        mode = os.stat(path).st_mode
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   111
        os.chmod(path, mode | 0o666)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   112
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   113
    def _set_rw_permissions_for_owner(self, path):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   114
        """Sets read-write permissions to the owner for the path."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   115
        mode = os.stat(path).st_mode
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   116
        os.chmod(path, mode | 0o600)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   117
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   118
    def _delete(self, path):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   119
        os.unlink(path)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   120
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   121
    def _get_capacity_info(self, nfs_share):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   122
        """Calculate available space on the NFS share.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   123
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   124
        :param nfs_share: example 172.18.194.100:/var/nfs
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   125
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   126
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   127
        mount_point = self._get_mount_point_for_share(nfs_share)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   128
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   129
        st = os.statvfs(mount_point)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   130
        total_available = st.f_frsize * st.f_bavail
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   131
        total_size = st.f_frsize * st.f_blocks
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   132
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   133
        du, _ = self._execute('/usr/bin/gdu', '-sb', '--apparent-size',
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   134
                              '--exclude', '*snapshot*', mount_point)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   135
        total_allocated = float(du.split()[0])
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   136
        return total_size, total_available, total_allocated
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   137
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   138
    def _round_robin(self, sharelist):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   139
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   140
        Implement a round robin generator for share list
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   141
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   142
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   143
        mylen = len(sharelist)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   144
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   145
        if self.last_rr_pos is None:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   146
            start_pos = 0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   147
        else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   148
            start_pos = (self.last_rr_pos + 1) % mylen
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   149
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   150
        pos = start_pos
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   151
        while True:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   152
            yield sharelist[pos], pos
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   153
            pos = (pos + 1) % mylen
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   154
            if pos == start_pos:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   155
                break
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   156
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   157
    def _find_share(self, volume_size_in_gib):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   158
        """Choose NFS share among available ones for given volume size.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   159
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   160
        For instances with more than one share that meets the criteria, the
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   161
        share with the least "allocated" space will be selected.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   162
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   163
        :param volume_size_in_gib: int size in GB
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   164
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   165
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   166
        if not self._mounted_shares:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   167
            raise exception.NfsNoSharesMounted()
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   168
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   169
        target_share = None
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   170
        if self.configuration.nfs_round_robin:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   171
            # Round Robin volume placement on shares
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   172
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   173
            LOG.debug(_("_find_share using round robin"))
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   174
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   175
            for nfs_share, pos in self._round_robin(self._mounted_shares):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   176
                if not self._is_share_eligible(nfs_share, volume_size_in_gib):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   177
                    continue
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   178
                target_share = nfs_share
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   179
                self.last_rr_pos = pos
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   180
                break
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   181
        else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   182
            # Place volume on share with the most free space.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   183
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   184
            LOG.debug(_("_find_share using select most free"))
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   185
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   186
            target_share_reserved = 0
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   187
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   188
            for nfs_share in self._mounted_shares:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   189
                if not self._is_share_eligible(nfs_share, volume_size_in_gib):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   190
                    continue
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   191
                total_size, total_available, total_allocated = \
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   192
                    self._get_capacity_info(nfs_share)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   193
                if target_share is not None:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   194
                    if target_share_reserved > total_allocated:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   195
                        target_share = nfs_share
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   196
                        target_share_reserved = total_allocated
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   197
                else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   198
                    target_share = nfs_share
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   199
                    target_share_reserved = total_allocated
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   200
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   201
        if target_share is None:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   202
            raise exception.NfsNoSuitableShareFound(
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   203
                volume_size=volume_size_in_gib)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   204
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   205
        LOG.debug('Selected %s as target nfs share.', target_share)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   206
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   207
        return target_share
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   208
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   209
    def extend_volume(self, volume, new_size):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   210
        """Extend an existing volume to the new size."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   211
        LOG.info(_LI('Extending volume %s.'), volume['id'])
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   212
        extend_by = int(new_size) - volume['size']
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   213
        if not self._is_share_eligible(volume['provider_location'],
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   214
                                       extend_by):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   215
            raise exception.ExtendVolumeError(reason='Insufficient space to'
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   216
                                              ' extend volume %s to %sG'
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   217
                                              % (volume['id'], new_size))
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   218
        path = self.local_path(volume)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   219
        LOG.info(_LI('Resizing file to %sG.'), new_size)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   220
        self._execute('/usr/bin/truncate', '-s', '%sG' % new_size, path)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 5405
diff changeset
   221
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   222
    def set_nas_security_options(self, is_new_cinder_install):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   223
        """Secure NAS options.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   224
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   225
        For Solaris we always operate in a secure mode and do not
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   226
        rely on root or any rootwrap utilities.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   227
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   228
        With RBAC we can do what we need as the cinder user.  We
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   229
        set the nas_secure_file.XXX to be true by default.  We ignore
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   230
        any conf file setting for these string vars.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   231
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   232
        We don't ever use these nas_secure_file_XXX vars in this driver
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   233
        but we still set the value to true.  This might prevent admin/users
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   234
        from opening bugs stating we are not running in a secure mode.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   235
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   236
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   237
        self.configuration.nas_secure_file_operations = 'true'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   238
        self.configuration.nas_secure_file_permissions = 'true'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   239
        self._execute_as_root = False
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   240
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   241
        LOG.debug('NAS variable secure_file_permissions setting is: %s' %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   242
                  self.configuration.nas_secure_file_permissions)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   243
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   244
        LOG.debug('NAS variable secure_file_operations setting is: %s' %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents:
diff changeset
   245
                  self.configuration.nas_secure_file_operations)