components/openstack/cinder/files/solaris/zfs.py
author Laszlo Peter <laszlo.peter@oracle.com>
Wed, 07 Sep 2016 14:48:41 -0700
changeset 6849 f9a2279efa0d
parent 6070 87daa7413b2d
permissions -rw-r--r--
24465600 Update Cinder for the Mitaka release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     2
# Copyright (c) 2012 OpenStack LLC.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     3
# All Rights Reserved.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     4
#
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
     5
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     6
#
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     7
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     8
#    not use this file except in compliance with the License. You may obtain
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
     9
#    a copy of the License at
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    10
#
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    11
#         http://www.apache.org/licenses/LICENSE-2.0
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    12
#
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    13
#    Unless required by applicable law or agreed to in writing, software
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    14
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    15
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    16
#    License for the specific language governing permissions and limitations
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    17
#    under the License.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    18
"""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    19
Drivers for Solaris ZFS operations in local and iSCSI modes
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    20
"""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    21
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    22
import abc
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
    23
import fcntl
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
    24
import os
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
    25
import subprocess
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
    26
import time
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    27
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    28
from eventlet.green.OpenSSL import SSL
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    29
from eventlet.green import socket
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    30
from oslo_concurrency import processutils
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    31
from oslo_config import cfg
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    32
from oslo_log import log as logging
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
    33
import paramiko
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    34
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    35
from cinder import exception
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    36
from cinder.i18n import _, _LE, _LI
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    37
from cinder.image import image_utils
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    38
from cinder.volume import driver
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
    39
from cinder.volume.drivers.san.san import SanDriver
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    40
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    41
import rad.auth as rada
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    42
import rad.bindings.com.oracle.solaris.rad.zfsmgr_1 as zfsmgr
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    43
import rad.client as radc
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    44
import rad.connect as radcon
1912
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
    45
from solaris_install.target.size import Size
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
    46
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    47
CONF = cfg.CONF
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    48
LOG = logging.getLogger(__name__)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    49
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    50
solaris_zfs_opts = [
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    51
    cfg.StrOpt('zfs_volume_base',
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    52
               default='rpool/cinder',
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
    53
               help='The base dataset for ZFS volumes.'),
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
    54
    cfg.StrOpt('zfs_target_group',
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
    55
               default='tgt-grp',
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
    56
               help='iSCSI target group name.'), ]
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    57
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
    58
CONF.register_opts(solaris_zfs_opts)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    59
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
    60
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    61
def connect_tls(host, port=12302, locale=None, ca_certs=None):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    62
    """Connect to a RAD instance over TLS.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    63
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    64
    Arguments:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    65
    host     string, target host
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    66
    port     int, target port (RAD_PORT_TLS = 12302)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    67
    locale   string, locale
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    68
    ca_certs string, path to file containing CA certificates
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    69
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    70
    Returns:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    71
    RadConnection: a connection to RAD
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    72
    """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    73
    # We don't want SSL 2.0, SSL 3.0 nor TLS 1.0 in RAD
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    74
    context = SSL.Context(SSL.SSLv23_METHOD)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    75
    context.set_options(SSL.OP_NO_SSLv2)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    76
    context.set_options(SSL.OP_NO_SSLv3)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    77
    context.set_options(SSL.OP_NO_TLSv1)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    78
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    79
    if ca_certs is not None:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    80
        context.set_verify(SSL.VERIFY_PEER, _tls_verify_cb)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    81
        context.load_verify_locations(ca_certs)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    82
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    83
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    84
    sock = SSL.Connection(context, sock)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    85
    sock.connect((host, port))
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    86
    sock.do_handshake()
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    87
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    88
    return radcon.RadConnection(sock, locale=locale)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    89
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    90
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
    91
class ZFSVolumeDriver(SanDriver):
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    92
    """OpenStack Cinder ZFS volume driver for generic ZFS volumes.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    93
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    94
    Version history:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    95
        1.0.0 - Initial driver with basic functionalities in Havana
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    96
        1.1.0 - Support SAN for the remote storage nodes access in Juno
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    97
        1.1.1 - Add support for the volume backup
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    98
        1.1.2 - Add support for the volume migration
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
    99
        1.2.0 - Add support for the volume management in Kilo
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   100
        1.2.1 - Enable the connect_tls by importing eventlet.green.socket
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   101
        1.2.2 - Introduce the ZFS RAD for volume migration enhancement
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   102
        1.2.3 - Replace volume-specific targets with one shared target in
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   103
                the ZFSISCSIDriver
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   104
        1.3.0 - Support the option iscsi_secondary_ip_addresses and then
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   105
                return target_iqns, target_portals, target_luns in Mitaka
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   106
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   107
    """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   108
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   109
    version = "1.3.0"
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   110
    protocol = 'local'
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   111
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   112
    def __init__(self, *args, **kwargs):
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   113
        super(ZFSVolumeDriver, self).__init__(execute=self.solaris_execute,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   114
                                              *args, **kwargs)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   115
        self.configuration.append_config_values(solaris_zfs_opts)
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   116
        self.run_local = self.configuration.san_is_local
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   117
        self.hostname = socket.gethostname()
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   118
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   119
    def solaris_execute(self, *cmd, **kwargs):
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   120
        """Execute the command locally or remotely."""
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   121
        if self.run_local:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   122
            return processutils.execute(*cmd, **kwargs)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   123
        else:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   124
            return super(ZFSVolumeDriver, self)._run_ssh(cmd,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   125
                                                         check_exit_code=True)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   126
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   127
    def check_for_setup_error(self):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   128
        """Check the setup error."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   129
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   130
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   131
    def create_volume(self, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   132
        """Create a volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   133
        size = '%sG' % volume['size']
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   134
        zfs_volume = self._get_zfs_volume_name(volume['name'])
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   135
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   136
        # Create a ZFS volume
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   137
        cmd = ['/usr/sbin/zfs', 'create', '-V', size, zfs_volume]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   138
        self._execute(*cmd)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   139
        LOG.debug(_("Created ZFS volume '%s'") % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   140
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   141
    def create_volume_from_snapshot(self, volume, snapshot):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   142
        """Create a cloned volume from a snapshot."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   143
        if volume['size'] != snapshot['volume_size']:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   144
            exception_message = (_("Could not create volume '%s' because "
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   145
                                   "its volume size of '%s' is different "
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   146
                                   "from that of the snapshot, '%s'.")
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   147
                                 % (volume['name'], volume['size'],
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   148
                                    snapshot['volume_size']))
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   149
            raise exception.InvalidInput(reason=exception_message)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   150
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   151
        # Create a ZFS clone
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   152
        zfs_snapshot = self._get_zfs_snap_name(snapshot)
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   153
        zfs_volume = self._get_zfs_volume_name(volume['name'])
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   154
        cmd = ['/usr/sbin/zfs', 'clone', zfs_snapshot, zfs_volume]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   155
        self._execute(*cmd)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   156
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   157
        LOG.debug(_("Created cloned volume '%s'") % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   158
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   159
    def create_cloned_volume(self, volume, src_vref):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   160
        """Create a clone of the specified volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   161
        if volume['size'] != src_vref['size']:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   162
            exception_message = (_("Could not clone volume '%s' because "
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   163
                                   "its volume size of '%s' is different "
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   164
                                   "from that of the source volume, '%s'.")
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   165
                                 % (volume['name'], volume['size'],
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   166
                                    src_vref['size']))
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   167
            raise exception.VolumeBackendAPIException(data=exception_message)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   168
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   169
        self._zfs_send_recv(src_vref,
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   170
                            self._get_zfs_volume_name(volume['name']))
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   171
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   172
        LOG.debug(_("Created cloned volume '%s' from source volume '%s'")
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   173
                  % (volume['name'], src_vref['name']))
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   174
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   175
    def delete_volume(self, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   176
        """Delete a volume.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   177
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   178
        Firstly, the volume should be checked if it is a cloned one. If yes,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   179
        its parent snapshot with prefix 'tmp-snapshot-' should be deleted as
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   180
        well after it is removed.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   181
        """
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   182
        zvol = self._get_zvol_path(volume)
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   183
        try:
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   184
            (out, _err) = self._execute('/usr/bin/ls', zvol)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   185
        except processutils.ProcessExecutionError:
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   186
            LOG.debug(_("The volume path '%s' doesn't exist") % zvol)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   187
            return
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   188
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   189
        zfs_volume = self._get_zfs_volume_name(volume['name'])
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   190
        origin_snapshot = self._get_zfs_property('origin', zfs_volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   191
        tmp_cloned_vol = False
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   192
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   193
        # Check if it is the temporary snapshot created for the cloned volume
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   194
        if origin_snapshot.startswith(self.configuration.zfs_volume_base):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   195
            prop_type = self._get_zfs_property('type', origin_snapshot)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   196
            tmp_snap_prefix = 'tmp-snapshot-%s' % volume['id']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   197
            if prop_type == 'snapshot' and tmp_snap_prefix in origin_snapshot:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   198
                tmp_cloned_vol = True
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   199
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   200
        cmd = ['/usr/sbin/zfs', 'destroy', zfs_volume]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   201
        self._execute(*cmd)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   202
        LOG.debug(_("Deleted volume '%s'") % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   203
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   204
        if tmp_cloned_vol:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   205
            self._execute('/usr/sbin/zfs', 'destroy', origin_snapshot)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   206
            LOG.debug(_("Deleted parent snapshot '%s' of volume '%s'")
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   207
                      % (origin_snapshot, volume['name']))
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   208
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   209
    def create_snapshot(self, snapshot):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   210
        """Create a snapshot."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   211
        cmd = ['/usr/sbin/zfs', 'snapshot', self._get_zfs_snap_name(snapshot)]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   212
        self._execute(*cmd)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   213
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   214
        LOG.debug(_("Created snapshot '%s'") % snapshot['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   215
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   216
    def delete_snapshot(self, snapshot):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   217
        """Delete a snapshot."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   218
        cmd = ['/usr/sbin/zfs', 'destroy', self._get_zfs_snap_name(snapshot)]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   219
        self._execute(*cmd)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   220
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   221
        LOG.debug(_("Deleted snapshot '%s'") % snapshot['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   222
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   223
    def ensure_export(self, context, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   224
        """Synchronously recreate an export for a logical volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   225
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   226
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   227
    def create_export(self, context, volume, connector):
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   228
        """Export the volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   229
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   230
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   231
    def remove_export(self, context, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   232
        """Remove an export for a volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   233
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   234
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   235
    def initialize_connection(self, volume, connector):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   236
        """Initialize the connection and returns connection info."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   237
        volume_path = '%s/volume-%s' % (self.configuration.zfs_volume_base,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   238
                                        volume['id'])
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   239
        properties = {}
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   240
        properties['device_path'] = self._get_zvol_path(volume)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   241
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   242
        return {
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   243
            'driver_volume_type': 'local',
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   244
            'volume_path': volume_path,
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   245
            'data': properties
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   246
        }
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   247
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   248
    def terminate_connection(self, volume, connector, **kwargs):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   249
        """Disconnection from the connector."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   250
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   251
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   252
    def attach_volume(self, context, volume, instance_uuid, host_name,
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   253
                      mountpoint):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   254
        """Callback for volume attached to instance or host."""
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   255
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   256
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   257
    def detach_volume(self, context, volume, attachment):
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   258
        """ Callback for volume detached."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   259
        pass
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   260
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   261
    def get_volume_stats(self, refresh=False):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   262
        """Get volume status."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   263
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   264
        if refresh:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   265
            self._update_volume_stats()
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   266
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   267
        return self._stats
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   268
1912
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   269
    def _get_zfs_property(self, prop, dataset):
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   270
        """Get the value of property for the dataset."""
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   271
        try:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   272
            (out, _err) = self._execute('/usr/sbin/zfs', 'get', '-H', '-o',
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   273
                                        'value', prop, dataset)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   274
            return out.rstrip()
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   275
        except processutils.ProcessExecutionError:
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   276
            LOG.info(_LI("Failed to get the property '%s' of the dataset '%s'")
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   277
                     % (prop, dataset))
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   278
            return None
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   279
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   280
    def _get_zfs_snap_name(self, snapshot):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   281
        """Get the snapshot path."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   282
        return "%s/%s@%s" % (self.configuration.zfs_volume_base,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   283
                             snapshot['volume_name'], snapshot['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   284
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   285
    def _get_zfs_volume_name(self, volume_name):
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   286
        """Add the pool name to get the ZFS volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   287
        return "%s/%s" % (self.configuration.zfs_volume_base,
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   288
                          volume_name)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   289
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   290
    def _remote_piped_execute(self, cmd1, cmd2, ip, username, password):
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   291
        """Piped execute on a remote host."""
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   292
        LOG.debug(_("Piping cmd1='%s' into cmd='%s' on host '%s'") %
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   293
                  (' '.join(cmd1), ' '.join(cmd2), ip))
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   294
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   295
        client = paramiko.SSHClient()
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   296
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   297
        client.connect(ip, username=username, password=password)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   298
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   299
        cmd = ' '.join(cmd1) + '|' + ' '.join(cmd2)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   300
        stdin, stdout, stderr = client.exec_command(cmd)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   301
        channel = stdout.channel
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   302
        exit_status = channel.recv_exit_status()
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   303
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   304
        if exit_status != 0:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   305
            LOG.error(_("_remote_piped_execute: failed to host '%s' with "
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   306
                        "stdout '%s' and stderr '%s'")
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   307
                      % (ip, stdout.read(), stderr.read()))
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   308
            msg = (_("Remote piped execution failed to host '%s'.") % ip)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   309
            raise exception.VolumeBackendAPIException(data=msg)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   310
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   311
    def _piped_execute(self, cmd1, cmd2):
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   312
        """Pipe output of cmd1 into cmd2."""
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   313
        LOG.debug(_("Piping cmd1='%s' into cmd2='%s'") %
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   314
                  (' '.join(cmd1), ' '.join(cmd2)))
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   315
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   316
        try:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   317
            p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   318
                                  stderr=subprocess.PIPE)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   319
        except:
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   320
            LOG.error(_LE("_piped_execute '%s' failed.") % (cmd1))
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   321
            raise
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   322
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   323
        # Set the pipe to be blocking because evenlet.green.subprocess uses
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   324
        # the non-blocking pipe.
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   325
        flags = fcntl.fcntl(p1.stdout, fcntl.F_GETFL) & (~os.O_NONBLOCK)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   326
        fcntl.fcntl(p1.stdout, fcntl.F_SETFL, flags)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   327
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   328
        p2 = subprocess.Popen(cmd2, stdin=p1.stdout,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   329
                              stdout=subprocess.PIPE,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   330
                              stderr=subprocess.PIPE)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   331
        p1.stdout.close()
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   332
        stdout, stderr = p2.communicate()
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   333
        if p2.returncode:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   334
            msg = (_("_piped_execute failed with the info '%s' and '%s'.") %
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   335
                   (stdout, stderr))
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   336
            raise exception.VolumeBackendAPIException(data=msg)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   337
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   338
    def _zfs_send_recv(self, src, dst):
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   339
        """Replicate the ZFS dataset by calling zfs send/recv cmd"""
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   340
        src_snapshot = {'volume_name': src['name'],
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   341
                        'name': 'tmp-snapshot-%s' % src['id']}
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   342
        src_snapshot_name = self._get_zfs_snap_name(src_snapshot)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   343
        prop_type = self._get_zfs_property('type', src_snapshot_name)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   344
        # Delete the temporary snapshot if it already exists
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   345
        if prop_type == 'snapshot':
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   346
            self.delete_snapshot(src_snapshot)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   347
        # Create a temporary snapshot of volume
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   348
        self.create_snapshot(src_snapshot)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   349
        src_snapshot_name = self._get_zfs_snap_name(src_snapshot)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   350
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   351
        cmd1 = ['/usr/sbin/zfs', 'send', src_snapshot_name]
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   352
        cmd2 = ['/usr/sbin/zfs', 'receive', dst]
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   353
        # Due to pipe injection protection in the ssh utils method,
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   354
        # cinder.utils.check_ssh_injection(), the piped commands must be passed
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   355
        # through via paramiko. These commands take no user defined input
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   356
        # other than the names of the zfs datasets which are already protected
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   357
        # against the special characters of concern.
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   358
        if not self.run_local:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   359
            ip = self.configuration.san_ip
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   360
            username = self.configuration.san_login
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   361
            password = self.configuration.san_password
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   362
            self._remote_piped_execute(cmd1, cmd2, ip, username, password)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   363
        else:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   364
            self._piped_execute(cmd1, cmd2)
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   365
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   366
        # Delete the temporary src snapshot and dst snapshot
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   367
        self.delete_snapshot(src_snapshot)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   368
        dst_snapshot_name = "%s@tmp-snapshot-%s" % (dst, src['id'])
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   369
        cmd = ['/usr/sbin/zfs', 'destroy', dst_snapshot_name]
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   370
        self._execute(*cmd)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   371
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   372
    def _get_rc_connect(self, san_info=None):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   373
        """Connect the RAD server."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   374
        if san_info is not None:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   375
            san_ip = san_info.split(';')[0]
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   376
            san_login = san_info.split(';')[1]
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   377
            san_password = san_info.split(';')[2]
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   378
        else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   379
            san_ip = self.configuration.san_ip
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   380
            san_login = self.configuration.san_login
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   381
            san_password = self.configuration.san_password
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   382
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   383
        rc = connect_tls(san_ip)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   384
        auth = rada.RadAuth(rc)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   385
        auth.pam_login(san_login, san_password)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   386
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   387
        return rc
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   388
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   389
    def _rad_zfs_send_recv(self, src, dst, dst_san_info=None):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   390
        """Replicate the ZFS dataset stream."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   391
        src_snapshot = {'volume_name': src['name'],
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   392
                        'name': 'tmp-send-snapshot-%s' % src['id']}
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   393
        src_snapshot_name = self._get_zfs_snap_name(src_snapshot)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   394
        prop_type = self._get_zfs_property('type', src_snapshot_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   395
        # Delete the temporary snapshot if it already exists
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   396
        if prop_type == 'snapshot':
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   397
            self.delete_snapshot(src_snapshot)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   398
        # Create the temporary snapshot of src volume
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   399
        self.create_snapshot(src_snapshot)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   400
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   401
        try:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   402
            src_rc = self._get_rc_connect()
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   403
            dst_rc = self._get_rc_connect(dst_san_info)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   404
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   405
            src_pat = self._get_zfs_volume_name(src['name'])
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   406
            src_vol_obj = src_rc.get_object(zfsmgr.ZfsDataset(),
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   407
                                            radc.ADRGlobPattern({"name":
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   408
                                                                src_pat}))
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   409
            dst_pat = dst.rsplit('/', 1)[0]
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   410
            dst_vol_obj = dst_rc.get_object(zfsmgr.ZfsDataset(),
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   411
                                            radc.ADRGlobPattern({"name":
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   412
                                                                dst_pat}))
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   413
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   414
            send_sock_info = src_vol_obj.get_send_socket(
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   415
                name=src_snapshot_name, socket_type=zfsmgr.SocketType.AF_INET)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   416
            send_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   417
            send_sock.connect((self.hostname, int(send_sock_info.socket)))
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   418
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   419
            dst_san_ip = dst_san_info.split(';')[0]
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   420
            remote_host, alias, addresslist = socket.gethostbyaddr(dst_san_ip)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   421
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   422
            recv_sock_info = dst_vol_obj.get_receive_socket(
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   423
                name=dst, socket_type=zfsmgr.SocketType.AF_INET,
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   424
                name_options=zfsmgr.ZfsRecvNameOptions.use_provided_name)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   425
            recv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   426
            recv_sock.connect((remote_host, int(recv_sock_info.socket)))
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   427
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   428
            # Set 4mb buffer size
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   429
            buf_size = 4194304
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   430
            while True:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   431
                # Read the data from the send stream
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   432
                buf = send_sock.recv(buf_size)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   433
                if not buf:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   434
                    break
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   435
                # Write the data to the receive steam
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   436
                recv_sock.send(buf)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   437
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   438
            recv_sock.close()
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   439
            send_sock.close()
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   440
            time.sleep(1)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   441
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   442
            # Delete the temporary dst snapshot
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   443
            pat = radc.ADRGlobPattern({"name": dst})
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   444
            dst_zvol_obj = dst_rc.get_object(zfsmgr.ZfsDataset(), pat)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   445
            snapshot_list = dst_zvol_obj.get_snapshots()
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   446
            for snap in snapshot_list:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   447
                if 'tmp-send-snapshot'in snap:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   448
                    dst_zvol_obj.destroy_snapshot(snap)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   449
                    break
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   450
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   451
        finally:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   452
            # Delete the temporary src snapshot
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   453
            self.delete_snapshot(src_snapshot)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   454
            LOG.debug(("Transfered src'%s' to dst'%s' on the host'%s'") %
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   455
                      (src_snapshot_name, dst, self.hostname))
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   456
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   457
            src_rc.close()
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   458
            dst_rc.close()
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   459
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   460
    def _get_zvol_path(self, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   461
        """Get the ZFS volume path."""
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   462
        return "/dev/zvol/rdsk/%s" % self._get_zfs_volume_name(volume['name'])
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   463
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   464
    def _update_volume_stats(self):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   465
        """Retrieve volume status info."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   466
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   467
        LOG.debug(_("Updating volume status"))
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   468
        stats = {}
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   469
        backend_name = self.configuration.safe_get('volume_backend_name')
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   470
        stats["volume_backend_name"] = backend_name or self.__class__.__name__
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   471
        stats["storage_protocol"] = self.protocol
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   472
        stats["driver_version"] = self.version
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   473
        stats["vendor_name"] = 'Oracle'
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   474
        stats['QoS_support'] = False
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   475
1912
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   476
        dataset = self.configuration.zfs_volume_base
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   477
        used_size = self._get_zfs_property('used', dataset)
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   478
        avail_size = self._get_zfs_property('avail', dataset)
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   479
        stats['total_capacity_gb'] = \
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   480
            (Size(used_size) + Size(avail_size)).get(Size.gb_units)
b0c17ef05b75 18658040 zfs.py can't handle terabyte pools
Strony <strony.zhang@oracle.com>
parents: 1760
diff changeset
   481
        stats['free_capacity_gb'] = Size(avail_size).get(Size.gb_units)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   482
        stats['reserved_percentage'] = self.configuration.reserved_percentage
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   483
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   484
        stats['location_info'] =\
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   485
            ('ZFSVolumeDriver:%(hostname)s:%(zfs_volume_base)s:local' %
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   486
             {'hostname': self.hostname,
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   487
              'zfs_volume_base': self.configuration.zfs_volume_base})
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   488
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   489
        self._stats = stats
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   490
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   491
    def extend_volume(self, volume, new_size):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   492
        """Extend an existing volume's size."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   493
        volsize_str = 'volsize=%sg' % new_size
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   494
        zfs_volume = self._get_zfs_volume_name(volume['name'])
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   495
        try:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   496
            self._execute('/usr/sbin/zfs', 'set', volsize_str, zfs_volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   497
        except Exception:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   498
            msg = (_("Failed to extend volume size to %(new_size)s GB.")
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   499
                   % {'new_size': new_size})
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   500
            raise exception.VolumeBackendAPIException(data=msg)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   501
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   502
    def rename_volume(self, src, dst):
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   503
        """Rename the volume from src to dst in the same zpool."""
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   504
        cmd = ['/usr/sbin/zfs', 'rename', src, dst]
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   505
        self._execute(*cmd)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   506
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   507
        LOG.debug(_("Rename the volume '%s' to '%s'") % (src, dst))
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   508
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   509
    def _get_existing_volume_ref_name(self, existing_ref):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   510
        """Returns the volume name of an existing reference.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   511
        And Check if an existing volume reference has a source-name
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   512
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   513
        if 'source-name' in existing_ref:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   514
            vol_name = existing_ref['source-name']
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   515
            return vol_name
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   516
        else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   517
            reason = _("Reference must contain source-name.")
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   518
            raise exception.ManageExistingInvalidReference(
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   519
                existing_ref=existing_ref,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   520
                reason=reason)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   521
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   522
    def manage_existing_get_size(self, volume, existing_ref):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   523
        """Return size of volume to be managed by manage_existing.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   524
        existing_ref is a dictionary of the form:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   525
        {'source-name': <name of the volume>}
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   526
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   527
        target_vol_name = self._get_existing_volume_ref_name(existing_ref)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   528
        volsize = self._get_zfs_property('volsize', target_vol_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   529
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   530
        return Size(volsize).get(Size.gb_units)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   531
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   532
    def manage_existing(self, volume, existing_ref):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   533
        """Brings an existing zfs volume object under Cinder management.
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   534
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   535
        :param volume:       Cinder volume to manage
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   536
        :param existing_ref: Driver-specific information used to identify a
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   537
        volume
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   538
        """
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   539
        # Check the existence of the ZFS volume
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   540
        target_vol_name = self._get_existing_volume_ref_name(existing_ref)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   541
        prop_type = self._get_zfs_property('type', target_vol_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   542
        if prop_type != 'volume':
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   543
            msg = (_("Failed to identify the volume '%s'.")
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   544
                   % target_vol_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   545
            raise exception.InvalidInput(reason=msg)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   546
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   547
        if volume['name']:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   548
            volume_name = volume['name']
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   549
        else:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   550
            volume_name = 'new_zvol'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   551
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   552
        # rename the volume
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   553
        dst_volume = "%s/%s" % (self.configuration.zfs_volume_base,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   554
                                volume_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   555
        self.rename_volume(target_vol_name, dst_volume)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   556
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   557
    def unmanage(self, volume):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   558
        """Removes the specified volume from Cinder management."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   559
        # Rename the volume's name to cinder-unm-* format.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   560
        volume_name = self._get_zfs_volume_name(volume['name'])
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   561
        tmp_volume_name = "cinder-unm-%s" % volume['name']
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   562
        new_volume_name = "%s/%s" % (self.configuration.zfs_volume_base,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   563
                                     tmp_volume_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   564
        self.rename_volume(volume_name, new_volume_name)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   565
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   566
    def migrate_volume(self, context, volume, host):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   567
        """Migrate the volume from one backend to another one.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   568
        The backends should be in the same volume type.
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   569
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   570
        :param context: context
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   571
        :param volume: a dictionary describing the volume to migrate
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   572
        :param host: a dictionary describing the host to migrate to
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   573
        """
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   574
        false_ret = (False, None)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   575
        if volume['status'] != 'available':
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   576
            LOG.debug(_("Status of volume '%s' is '%s', not 'available'.") %
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   577
                      (volume['name'], volume['status']))
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   578
            return false_ret
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   579
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   580
        if 'capabilities' not in host:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   581
            LOG.debug(("No 'capabilities' is reported in the host'%s'") %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   582
                      host['host'])
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   583
            return false_ret
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   584
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   585
        if 'location_info' not in host['capabilities']:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   586
            LOG.debug(("No 'location_info' is reported in the host'%s'") %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   587
                      host['host'])
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   588
            return false_ret
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   589
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   590
        info = host['capabilities']['location_info']
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   591
        dst_volume = "%s/%s" % (info.split(':')[2], volume['name'])
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   592
        src_volume = self._get_zfs_volume_name(volume['name'])
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   593
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   594
        # check if the src and dst volume are under the same zpool
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   595
        dst_san_info = info.split(':')[3]
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   596
        if dst_san_info == 'local':
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   597
            self._zfs_send_recv(volume, dst_volume)
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   598
        else:
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   599
            self._rad_zfs_send_recv(volume, dst_volume, dst_san_info)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   600
        # delete the source volume
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   601
        self.delete_volume(volume)
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   602
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   603
        provider_location = {}
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   604
        return (True, provider_location)
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   605
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   606
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   607
class STMFDriver(ZFSVolumeDriver):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   608
    """Abstract base class for common COMSTAR operations."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   609
    __metaclass__ = abc.ABCMeta
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   610
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   611
    def __init__(self, *args, **kwargs):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   612
        super(STMFDriver, self).__init__(*args, **kwargs)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   613
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   614
    def _stmf_execute(self, *cmd):
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   615
        """Handle the possible race during the local execution."""
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   616
        tries = 0
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   617
        while True:
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   618
            try:
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   619
                self._execute(*cmd)
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   620
                return
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   621
            except processutils.ProcessExecutionError as ex:
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   622
                tries = tries + 1
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   623
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   624
                if tries >= self.configuration.num_shell_tries or \
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   625
                        'resource busy' not in ex.stderr:
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   626
                    raise
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   627
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   628
                time.sleep(tries ** 2)
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   629
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   630
    def _check_target(self, target, protocol):
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   631
        """Verify the target and check its status."""
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   632
        try:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   633
            (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-target',
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   634
                                        '-v', target)
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   635
            tmp_protocol = None
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   636
            status = None
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   637
            for line in [l.strip() for l in out.splitlines()]:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   638
                if line.startswith("Operational"):
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   639
                    status = line.split()[-1]
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   640
                if line.startswith("Protocol"):
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   641
                    tmp_protocol = line.split()[-1]
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   642
                    break
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   643
            if tmp_protocol == protocol:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   644
                return status
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   645
            else:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   646
                err_msg = (_("'%s' does not match the listed protocol '%s'"
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   647
                             " for target '%s'.")
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   648
                           % (protocol, tmp_protocol, target))
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   649
        except processutils.ProcessExecutionError as error:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   650
            if 'not found' in error.stderr:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   651
                LOG.debug(_("The target '%s' is not found.") % target)
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   652
                return None
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   653
            else:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   654
                err_msg = (_("Failed to list the target '%s': '%s'")
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   655
                           % (target, error.stderr))
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   656
        raise exception.VolumeBackendAPIException(data=err_msg)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   657
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   658
    def _online_target(self, target, protocol):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   659
        """Online the target in the offline state."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   660
        self._execute('/usr/sbin/stmfadm', 'online-target',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   661
                      target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   662
        assert self._check_target(target, protocol) == 'Online'
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   663
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   664
    def _check_tg(self, tg):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   665
        """Check if the target group exists."""
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   666
        try:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   667
            self._execute('/usr/sbin/stmfadm', 'list-tg', tg)
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   668
            return True
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   669
        except processutils.ProcessExecutionError as error:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   670
            if 'not found' in error.stderr:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   671
                LOG.debug(_("The target group '%s' is not found.") % tg)
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   672
                return False
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   673
            else:
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   674
                err_msg = (_("Failed to list the target group '%s': '%s'")
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   675
                           % (tg, error.stderr))
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   676
            raise exception.VolumeBackendAPIException(data=err_msg)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   677
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   678
    def _get_luid(self, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   679
        """Get the LU corresponding to the volume."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   680
        zvol = self._get_zvol_path(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   681
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   682
        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-lu', '-v')
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   683
        luid = None
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   684
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   685
        for line in [l.strip() for l in out.splitlines()]:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   686
            if line.startswith("LU Name:"):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   687
                luid = line.split()[-1]
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   688
            if line.startswith("Alias") and line.split()[-1] == zvol:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   689
                break
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   690
        else:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   691
            luid = None
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   692
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   693
        if luid is not None:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   694
            LOG.debug(_("Got the LU '%s'") % luid)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   695
        else:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   696
            LOG.debug(_("Failed to get LU for volume '%s'")
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   697
                      % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   698
        return luid
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   699
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   700
    def _get_view_and_lun(self, lu):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   701
        """Check the view entry of the LU and then get the lun and view."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   702
        view_and_lun = {}
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   703
        view_and_lun['view'] = view_and_lun['lun'] = None
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   704
        try:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   705
            (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-view',
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   706
                                        '-l', lu, '-v')
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   707
        except processutils.ProcessExecutionError as error:
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   708
            if 'no views found' in error.stderr:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   709
                LOG.debug(_("No view is found for LU '%s'") % lu)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   710
                return view_and_lun
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   711
            else:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   712
                raise
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   713
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   714
        for line in [l.strip() for l in out.splitlines()]:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   715
            if line.startswith("View Entry:"):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   716
                view_and_lun['view'] = line.split()[-1]
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   717
            if line.startswith("LUN") and 'Auto' not in line.split()[-1]:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   718
                view_and_lun['lun'] = int(line.split()[-1])
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   719
                break
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   720
            if line.startswith("Lun"):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   721
                view_and_lun['lun'] = int(line.split()[2])
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   722
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   723
        if view_and_lun['view'] is None or view_and_lun['lun'] is None:
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   724
            err_msg = (_("Failed to get the view_entry or LUN of the LU '%s'.")
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   725
                       % lu)
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   726
            raise exception.VolumeBackendAPIException(data=err_msg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   727
        else:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   728
            LOG.debug(_("The view_entry and LUN of LU '%s' are '%s' and '%d'.")
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   729
                      % (lu, view_and_lun['view'], view_and_lun['lun']))
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   730
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   731
        return view_and_lun
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   732
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   733
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   734
class ZFSISCSIDriver(STMFDriver, driver.ISCSIDriver):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   735
    """ZFS volume operations in iSCSI mode."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   736
    protocol = 'iSCSI'
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   737
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   738
    def __init__(self, *args, **kwargs):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   739
        super(ZFSISCSIDriver, self).__init__(*args, **kwargs)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   740
        if not self.configuration.san_is_local:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   741
            self.hostname, alias, addresslist = \
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   742
                socket.gethostbyaddr(self.configuration.san_ip)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   743
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   744
    def get_volume_stats(self, refresh=False):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   745
        """Get volume status."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   746
        status = super(ZFSISCSIDriver, self).get_volume_stats(refresh)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   747
        status["storage_protocol"] = self.protocol
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   748
        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: 5178
diff changeset
   749
        status["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: 5178
diff changeset
   750
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   751
        if not self.configuration.san_is_local:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   752
            san_info = "%s;%s;%s" % (self.configuration.san_ip,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   753
                                     self.configuration.san_login,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   754
                                     self.configuration.san_password)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   755
            status['location_info'] = \
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   756
                ('ZFSISCSIDriver:%(hostname)s:%(zfs_volume_base)s:'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   757
                 '%(san_info)s' %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   758
                 {'hostname': self.hostname,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   759
                  'zfs_volume_base': self.configuration.zfs_volume_base,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   760
                  'san_info': san_info})
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   761
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
   762
        return status
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   763
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   764
    def _add_tg_member(self, target, tg, tpg):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   765
        """Create the target and then add it to the target group."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   766
        self._stmf_execute('/usr/sbin/itadm', 'create-target', '-n',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   767
                           target, '-t', tpg)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   768
        self._stmf_execute('/usr/sbin/stmfadm', 'offline-target',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   769
                           target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   770
        self._stmf_execute('/usr/sbin/stmfadm', 'add-tg-member', '-g',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   771
                           tg, target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   772
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   773
    def _get_target_portal(self, target):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   774
        """Get the current target IP address."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   775
        (out, _err) = self._execute('/usr/sbin/itadm', 'list-target',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   776
                                    '-v', target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   777
        portal = None
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   778
        for line in [l.strip() for l in out.splitlines()]:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   779
            if line.startswith("Target Address:"):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   780
                portal = line.split()[-1]
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   781
                break
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   782
        return portal
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   783
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   784
    def _check_tpg(self, tpg):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   785
        """Verify the tpg."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   786
        try:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   787
            (out, _err) = self._execute('/usr/sbin/itadm', 'list-tpg',
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   788
                                        '-v', tpg)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   789
            return True
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   790
        except processutils.ProcessExecutionError as error:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   791
            if 'not found' in error.stderr:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   792
                return False
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   793
            else:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   794
                err_msg = (_("Failed to list the tpg '%s': '%s'")
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   795
                           % (tpg, error.stderr))
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   796
            raise exception.VolumeBackendAPIException(data=err_msg)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   797
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   798
    def _create_tpg(self, tpg, ip):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   799
        """Create the TPG for the IP address."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   800
        try:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   801
            self._execute('/usr/sbin/itadm', 'create-tpg', tpg, ip)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   802
        except processutils.ProcessExecutionError as error:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   803
            err_msg = (_("Failed to create the tpg '%s': '%s'") %
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   804
                        (tpg, error.stderr))
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   805
            raise exception.VolumeBackendAPIException(data=err_msg)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   806
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   807
    def _setup_targets(self, target_ips, target_group):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   808
        """Setup targets for the IP addresses."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   809
        for ip in target_ips:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   810
            tpg_name = "tpg-%s" % ip
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   811
            if not self._check_tpg(tpg_name):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   812
                self._create_tpg(tpg_name, ip)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   813
            target_name = '%s%s-%s-%s-target' % \
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   814
                          (self.configuration.iscsi_target_prefix,
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   815
                           self.hostname,
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   816
                           tpg_name,
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   817
                           target_group)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   818
            target_status = self._check_target(target_name, 'iSCSI')
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   819
            if target_status == 'Online':
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   820
                continue
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   821
            if target_status is None:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   822
                self._add_tg_member(target_name, target_group, tpg_name)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   823
            self._online_target(target_name, 'iSCSI')
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   824
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   825
    def do_setup(self, context):
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   826
        """Setup the target and target group."""
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   827
        target_group = self.configuration.zfs_target_group
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   828
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   829
        if not self._check_tg(target_group):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   830
            self._stmf_execute('/usr/sbin/stmfadm', 'create-tg', target_group)
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   831
        target_name = '%s%s-%s-target' % \
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   832
                      (self.configuration.iscsi_target_prefix,
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   833
                       self.hostname,
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   834
                       target_group)
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   835
        target_status = self._check_target(target_name, 'iSCSI')
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   836
        secondary_interfaces = self.configuration.iscsi_secondary_ip_addresses
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   837
        if target_status == 'Online' and not secondary_interfaces:
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   838
            return
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   839
        if target_status is None:
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   840
            # Create the primary target
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   841
            if self.configuration.san_is_local:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   842
                primary_ip = self.configuration.iscsi_ip_address
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   843
            else:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   844
                primary_ip = self.configuration.san_ip
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   845
            tpg_name = "tpg-%s" % primary_ip
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   846
            if not self._check_tpg(tpg_name):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   847
                self._create_tpg(tpg_name, primary_ip)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   848
            self._add_tg_member(target_name, target_group, tpg_name)
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   849
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   850
        # Online the target from the 'Offline' status
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   851
        self._online_target(target_name, 'iSCSI')
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   852
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   853
        if secondary_interfaces:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   854
            secondary_ips = [ip for ip in secondary_interfaces if ip.strip()]
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   855
            self._setup_targets(secondary_ips, target_group)
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   856
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   857
    def _get_tg_secondary_members(self, primary_target):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   858
        """Get target members of the target group."""
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   859
        tg = self.configuration.zfs_target_group
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   860
        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg', '-v', tg)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   861
        targets = []
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   862
        target_portals = []
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   863
        for line in [l.strip() for l in out.splitlines()]:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   864
            if line.startswith("Member:"):
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   865
                target = line.split()[-1]
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   866
                if target == primary_target:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   867
                    continue
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   868
                targets.append(target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   869
                target_portal = self._get_target_portal(target)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   870
                if target_portal:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   871
                    target_portals.append(target_portal)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   872
        return targets, target_portals
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   873
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   874
    def create_export(self, context, volume, conncetor):
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   875
        """Export the volume."""
4982
df1be607c345 18595100 nova resize does not work
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4545
diff changeset
   876
        # If the volume is already exported there is nothing to do, as we
df1be607c345 18595100 nova resize does not work
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4545
diff changeset
   877
        # simply export volumes and they are universally available.
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   878
        luid = self._get_luid(volume)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   879
        if luid:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   880
            view_lun = self._get_view_and_lun(luid)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   881
            if view_lun['view'] is not None:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   882
                return
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   883
            else:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   884
                msg = (_("Failed to create logical unit for volume '%s' due "
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   885
                         "to an existing LU id but no view.") % volume['name'])
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
   886
                raise exception.VolumeBackendAPIException(data=msg)
4982
df1be607c345 18595100 nova resize does not work
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4545
diff changeset
   887
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   888
        zvol = self._get_zvol_path(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   889
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   890
        # Create a Logical Unit (LU)
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   891
        self._stmf_execute('/usr/sbin/stmfadm', 'create-lu', zvol)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   892
        luid = self._get_luid(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   893
        if not luid:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   894
            msg = (_("Failed to create LU for volume '%s'")
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   895
                   % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   896
            raise exception.VolumeBackendAPIException(data=msg)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   897
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   898
        # Add a view entry to the logical unit
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   899
        target_group = self.configuration.zfs_target_group
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   900
        self._stmf_execute('/usr/sbin/stmfadm', 'add-view',
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   901
                           '-t', target_group, luid)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   902
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   903
    def remove_export(self, context, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   904
        """Remove an export for a volume.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   905
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   906
        All of the related elements about the volume, including the
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   907
        target, target group, view entry and lu, are deleted.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   908
        """
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   909
        luid = self._get_luid(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   910
5112
8ba7598c0426 22161814 cinder can do 'stmfadm delete-lu' twice leaving volumes in error
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5087
diff changeset
   911
        # Remove the LU
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   912
        if luid is not None:
5112
8ba7598c0426 22161814 cinder can do 'stmfadm delete-lu' twice leaving volumes in error
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5087
diff changeset
   913
            self._stmf_execute('/usr/sbin/stmfadm', 'delete-lu', luid)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   914
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   915
        # Remove the target and its target group if they were created by
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   916
        # earlier versions of the volume driver
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   917
        target_group = 'tg-%s' % volume['name']
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   918
        target_name = '%s%s' % (self.configuration.iscsi_target_prefix,
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   919
                                volume['name'])
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   920
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   921
        if self._check_target(target_name, 'iSCSI') is not None:
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   922
            self._stmf_execute('/usr/sbin/itadm', 'delete-target', '-f',
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   923
                               target_name)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   924
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   925
        if self._check_tg(target_group):
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   926
            self._stmf_execute('/usr/sbin/stmfadm', 'delete-tg', target_group)
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   927
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   928
    def _get_iscsi_properties(self, volume):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   929
        """Get iSCSI configuration
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   930
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   931
        Now we use the discovery address as the default approach to add
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   932
        objects into the initiator. A discovery address is an IP address:port
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   933
        combination used in a SendTargets discovery session in the initiator.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   934
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   935
        :target_discovered:    boolean indicating whether discovery was used
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   936
        :target_iqn:           the IQN of the iSCSI target
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   937
        :target_portal:        the portal of the iSCSI target
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   938
        :target_lun:           the lun of the iSCSI target
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   939
        :volume_id:            the id of the volume
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   940
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   941
        :auth_method:, :auth_username:, :auth_password:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   942
            the authentication details. Right now, either auth_method is not
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   943
            present meaning no authentication, or auth_method == `CHAP`
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   944
            meaning use CHAP with the specified credentials.
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   945
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   946
        If multiple IP addresses are configured, the returns will include
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   947
        :target_iqns, :target_portals, :target_luns, which contain lists of
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   948
        multiple values. The main portal information is also returned in
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   949
        :target_iqn, :target_portal, :target_lun for backward compatibility.
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   950
        """
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   951
        luid = self._get_luid(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   952
        if not luid:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   953
            msg = (_("Failed to get LU for volume '%s'") % volume['name'])
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   954
            raise exception.VolumeBackendAPIException(data=msg)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   955
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   956
        old_target_name = True
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   957
        target_name = '%s%s' % (self.configuration.iscsi_target_prefix,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   958
                                volume['name'])
5178
39289ddbd44e 22270883 iSCSI driver setup fails when the target is offline
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5112
diff changeset
   959
        if self._check_target(target_name, 'iSCSI') is None:
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   960
            target_name = '%s%s-%s-target' % \
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   961
                          (self.configuration.iscsi_target_prefix,
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   962
                           self.hostname,
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   963
                           self.configuration.zfs_target_group)
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   964
            old_target_name = False
5087
e31e1e575df4 22031461 volume attachment failed
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4983
diff changeset
   965
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   966
        properties = {}
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   967
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   968
        properties['target_discovered'] = True
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   969
        properties['target_iqn'] = target_name
3998
5bd484384122 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents: 2162
diff changeset
   970
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   971
        # Here the san_is_local means that the cinder-volume runs in the
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   972
        # iSCSI target with iscsi_ip_address.
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   973
        if self.configuration.san_is_local:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   974
            target_ip = self.configuration.iscsi_ip_address
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   975
        else:
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   976
            target_ip = self.configuration.san_ip
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   977
        properties['target_portal'] = ('%s:%d' %
4545
538c0aeae836 PSARC 2015/289 OpenStack Cinder Enhancements
Strony <strony.zhang@oracle.com>
parents: 3998
diff changeset
   978
                                       (target_ip,
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
   979
                                        self.configuration.iscsi_port))
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   980
        view_lun = self._get_view_and_lun(luid)
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
   981
        if view_lun['lun'] is not None:
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   982
            properties['target_lun'] = view_lun['lun']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   983
        properties['volume_id'] = volume['id']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
   984
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   985
        secondary_ifs = self.configuration.iscsi_secondary_ip_addresses
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   986
        # The multipathing doesn't apply to the old volume-specific target
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   987
        if not old_target_name and secondary_ifs:
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   988
            target_portals = []
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   989
            target_iqns = []
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   990
            target_luns = []
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   991
            target_portals.append(properties['target_portal'])
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   992
            target_iqns.append(properties['target_iqn'])
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   993
            target_luns.append(properties['target_lun'])
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   994
            secondary_iqns, secondary_portals = self._get_tg_secondary_members(
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   995
                                                target_name)
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   996
            properties['target_portals'] = target_portals + secondary_portals
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   997
            properties['target_iqns'] = target_iqns + secondary_iqns
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   998
            properties['target_luns'] = (len(secondary_iqns) + 1) * target_luns
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
   999
1760
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1000
        auth = volume['provider_auth']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1001
        if auth:
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1002
            (auth_method, auth_username, auth_secret) = auth.split()
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1003
            properties['auth_method'] = auth_method
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1004
            properties['auth_username'] = auth_username
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1005
            properties['auth_password'] = auth_secret
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1006
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1007
        return properties
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1008
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1009
    def initialize_connection(self, volume, connector):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1010
        """Initialize the connection and returns connection info.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1011
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1012
        The iSCSI driver returns a driver_volume_type of 'iscsi'.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1013
        The format of the driver data is defined in _get_iscsi_properties.
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1014
        Example return value::
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1015
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1016
        {
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1017
            'driver_volume_type': 'iscsi'
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1018
            'data': {
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1019
                'target_discovered': True,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1020
                'target_iqn':
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1021
                'iqn.1986-03.com.sun:02:200720c6-9bca-cb8f-c061-d427d7ab978f',
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1022
                'target_portal': '127.0.0.1:3260',
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1023
                'volume_id': 1,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1024
            }
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1025
        }
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1026
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1027
        """
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1028
        initiator_name = connector['initiator']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1029
        volume_name = volume['name']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1030
        LOG.debug(_('Connecting the initiator %(initiator_name)s '
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1031
                    'for volume %(volume_name)s')
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1032
                  % {'initiator_name': initiator_name,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1033
                     'volume_name': volume_name})
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1034
        iscsi_properties = self._get_iscsi_properties(volume)
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1035
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1036
        return {
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1037
            'driver_volume_type': 'iscsi',
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1038
            'data': iscsi_properties
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1039
        }
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1040
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1041
    def terminate_connection(self, volume, connector, **kwargs):
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1042
        """Disconnection from the connector."""
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1043
        initiator_name = connector['initiator']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1044
        volume_name = volume['name']
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1045
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1046
        LOG.debug(_('Disconnecting the initiator %(initiator_name)s '
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1047
                    'for volume %(volume_name)s')
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1048
                  % {'initiator_name': initiator_name,
353323c7bdc1 PSARC/2013/350 OpenStack for Solaris (Umbrella)
Drew Fisher <drew.fisher@oracle.com>
parents:
diff changeset
  1049
                     'volume_name': volume_name})
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1050
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1051
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1052
class ZFSFCDriver(STMFDriver, driver.FibreChannelDriver):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1053
    """ZFS volume operations in FC mode."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1054
    protocol = 'FC'
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1055
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1056
    def __init__(self, *args, **kwargs):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1057
        super(ZFSFCDriver, self).__init__(*args, **kwargs)
5405
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1058
        if not self.configuration.san_is_local:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1059
            self.hostname, alias, addresslist = \
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1060
                socket.gethostbyaddr(self.configuration.san_ip)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1061
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1062
    def get_volume_stats(self, refresh=False):
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1063
        """Get volume status."""
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1064
        status = super(ZFSFCDriver, self).get_volume_stats(refresh)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1065
        status["storage_protocol"] = self.protocol
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1066
        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: 5178
diff changeset
  1067
        status["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: 5178
diff changeset
  1068
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1069
        if not self.configuration.san_is_local:
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1070
            san_info = "%s;%s;%s" % (self.configuration.san_ip,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1071
                                     self.configuration.san_login,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1072
                                     self.configuration.san_password)
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1073
            status['location_info'] = \
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1074
                ('ZFSFCDriver:%(hostname)s:%(zfs_volume_base)s:'
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1075
                 '%(san_info)s' %
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1076
                 {'hostname': self.hostname,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1077
                  'zfs_volume_base': self.configuration.zfs_volume_base,
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1078
                  'san_info': san_info})
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1079
66fd59fecd68 PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 5178
diff changeset
  1080
        return status
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1081
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1082
    def do_setup(self, context):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1083
        """Check wwns and setup the target group."""
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1084
        self.wwns = self._get_wwns()
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1085
        if not self.wwns:
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1086
            msg = (_("Could not determine fibre channel world wide "
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1087
                     "node names."))
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1088
            raise exception.VolumeBackendAPIException(data=msg)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1089
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1090
        self.tg = 'tg-wwn-%s' % self.wwns[0]
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1091
        if not self._check_tg(self.tg):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1092
            self._setup_tg(self.tg)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1093
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1094
    def _get_wwns(self):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1095
        """Get the FC port WWNs of the host."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1096
        (out, _err) = self._execute('/usr/sbin/fcinfo', 'hba-port', '-t')
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1097
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1098
        wwns = []
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1099
        for line in [l.strip() for l in out.splitlines()]:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1100
            if line.startswith("HBA Port WWN:"):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1101
                wwn = line.split()[-1]
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1102
                LOG.debug(_("Got the FC port WWN '%s'") % wwn)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1103
                wwns.append(wwn)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1104
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1105
        return wwns
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1106
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1107
    def _get_target_wwns(self, tg):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1108
        """Get the target members in the tg."""
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1109
        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg',
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1110
                                    '-v', tg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1111
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1112
        wwns = []
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1113
        for line in [l.strip() for l in out.splitlines()]:
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1114
            if line.startswith("Member:"):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1115
                wwn = line.split()[-1]
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1116
                target_wwn = wwn.split('.')[-1]
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1117
                wwns.append(target_wwn)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1118
        return wwns
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1119
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1120
    def _setup_tg(self, tg):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1121
        """Setup the target group."""
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1122
        self._stmf_execute('/usr/sbin/stmfadm', 'create-tg', tg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1123
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1124
        # Add free target wwns into the target group
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1125
        for wwn in self.wwns:
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1126
            if not self._target_in_tg(wwn, None):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1127
                target_wwn = 'wwn.%s' % wwn
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1128
                try:
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1129
                    self._stmf_execute('/usr/sbin/stmfadm', 'offline-target',
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1130
                                       target_wwn)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1131
                    self._stmf_execute('/usr/sbin/stmfadm', 'add-tg-member',
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1132
                                       '-g', tg, target_wwn)
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
  1133
                    self._online_target(target_wwn, 'Channel')
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1134
                except:
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1135
                    LOG.error(_LE("Failed to add and online the target '%s'.")
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1136
                              % (target_wwn))
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1137
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1138
        target_wwns = self._get_target_wwns(tg)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1139
        if not target_wwns:
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1140
            msg = (_("No target members exist in the target group '%s'.")
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1141
                   % tg)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1142
            raise exception.VolumeBackendAPIException(data=msg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1143
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1144
    def _only_lu(self, lu):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1145
        """Check if the LU is the only one."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1146
        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-lu', '-v')
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1147
        linecount = 0
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1148
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1149
        for line in [l.strip() for l in out.splitlines()]:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1150
            if line.startswith("LU Name:"):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1151
                luid = line.split()[-1]
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1152
                linecount += 1
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1153
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1154
        if linecount == 1 and luid == lu:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1155
            LOG.debug(_("The LU '%s' is the only one.") % lu)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1156
            return True
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1157
        else:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1158
            return False
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1159
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1160
    def _target_in_tg(self, wwn, tg):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1161
        """Check if the target has been added into a target group."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1162
        target = 'wwn.%s' % wwn.upper()
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1163
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1164
        if tg is not None:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1165
            (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg',
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1166
                                        '-v', tg)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1167
        else:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1168
            (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg', '-v')
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1169
        for line in [l.strip() for l in out.splitlines()]:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1170
            if line.startswith("Member:") and target in line:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1171
                return True
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1172
        LOG.debug(_("The target '%s' is not in %s target group.") %
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1173
                  (target, tg if tg else 'any'))
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1174
        return False
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1175
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1176
    def _force_lip_wwn(self):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1177
        """Force the link to reinitialize."""
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1178
        target_wwns = self._get_target_wwns(self.tg)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1179
        for target_wwn in target_wwns:
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1180
            self._stmf_execute('/usr/sbin/fcadm', 'force-lip', target_wwn)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1181
6849
f9a2279efa0d 24465600 Update Cinder for the Mitaka release
Laszlo Peter <laszlo.peter@oracle.com>
parents: 6070
diff changeset
  1182
    def create_export(self, context, volume, connector):
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1183
        """Export the volume."""
4983
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1184
        # If the volume is already exported there is nothing to do, as we
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1185
        # simply export volumes and they are universally available.
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1186
        luid = self._get_luid(volume)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1187
        if luid:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1188
            view_lun = self._get_view_and_lun(luid)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1189
            if view_lun['view'] is not None:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1190
                return
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1191
            else:
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1192
                msg = (_("Failed to create logical unit for volume '%s' due "
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1193
                         "to an existing LU id but no view.") % volume['name'])
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1194
                raise exception.VolumeBackendAPIException(data=msg)
db2589571faa 21480249 create --source-volid should clone the volume w/o blocking the delete of source
Sean Wilcox <sean.wilcox@oracle.com>
parents: 4982
diff changeset
  1195
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1196
        zvol = self._get_zvol_path(volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1197
        # Create a Logical Unit (LU)
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1198
        self._stmf_execute('/usr/sbin/stmfadm', 'create-lu', zvol)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1199
        luid = self._get_luid(volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1200
        if not luid:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1201
            msg = (_("Failed to create logic unit for volume '%s'")
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1202
                   % volume['name'])
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1203
            raise exception.VolumeBackendAPIException(data=msg)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1204
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1205
        # setup the target group if it doesn't exist.
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1206
        if not self._check_tg(self.tg):
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1207
            self._setup_tg(self.tg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1208
        # Add a logical unit view entry
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1209
        self._stmf_execute('/usr/sbin/stmfadm', 'add-view', '-t',
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1210
                           self.tg, luid)
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1211
        self._force_lip_wwn()
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1212
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1213
    def remove_export(self, context, volume):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1214
        """Remove an export for a volume."""
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1215
        luid = self._get_luid(volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1216
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1217
        if luid is not None:
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1218
            target_group = self.tg
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1219
            view_lun = self._get_view_and_lun(luid)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1220
            if view_lun['view']:
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1221
                self._stmf_execute('/usr/sbin/stmfadm', 'remove-view', '-l',
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1222
                                   luid, view_lun['view'])
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1223
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1224
            # Remove the target group when the LU to be deleted is last one
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1225
            # exposed by the target group.
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1226
            if self._only_lu(luid):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1227
                if self._check_tg(target_group):
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1228
                    self._stmf_execute('/usr/sbin/stmfadm', 'delete-tg',
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1229
                                       target_group)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1230
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1231
            # Remove the LU
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1232
            self._stmf_execute('/usr/sbin/stmfadm', 'delete-lu', luid)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1233
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1234
    def _get_fc_properties(self, volume):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1235
        """Get Fibre Channel configuration.
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1236
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1237
        :target_discovered:    boolean indicating whether discovery was used
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1238
        :target_wwn:           the world wide name of the FC port target
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1239
        :target_lun:           the lun assigned to the LU for the view entry
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1240
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1241
        """
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1242
        luid = self._get_luid(volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1243
        if not luid:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1244
            msg = (_("Failed to get logic unit for volume '%s'")
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1245
                   % volume['name'])
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1246
            raise exception.VolumeBackendAPIException(data=msg)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1247
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1248
        properties = {}
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1249
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1250
        properties['target_discovered'] = True
6070
87daa7413b2d 23294485 Cinder ZFSFCDriver fails to find the right target wwn
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 5405
diff changeset
  1251
        properties['target_wwn'] = self._get_target_wwns(self.tg)
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1252
        view_lun = self._get_view_and_lun(luid)
2162
0fee3eccf153 19596691 instance failed to launch, cinder hit resource busy in stmfadm
Strony <strony.zhang@oracle.com>
parents: 1944
diff changeset
  1253
        if view_lun['lun'] is not None:
1944
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1254
            properties['target_lun'] = view_lun['lun']
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1255
        return properties
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1256
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1257
    def initialize_connection(self, volume, connector):
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1258
        """Initializes the connection and returns connection info.
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1259
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1260
        The  driver returns a driver_volume_type of 'fibre_channel'.
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1261
        The target_wwn can be a single entry or a list of wwns that
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1262
        correspond to the list of remote wwn(s) that will export the volume.
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1263
        Example return values:
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1264
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1265
            {
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1266
                'driver_volume_type': 'fibre_channel'
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1267
                'data': {
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1268
                    'target_discovered': True,
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1269
                    'target_lun': 1,
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1270
                    'target_wwn': '1234567890123',
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1271
                }
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1272
            }
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1273
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1274
            or
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1275
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1276
             {
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1277
                'driver_volume_type': 'fibre_channel'
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1278
                'data': {
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1279
                    'target_discovered': True,
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1280
                    'target_lun': 1,
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1281
                    'target_wwn': ['1234567890123', '0987654321321'],
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1282
                }
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1283
            }
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1284
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1285
        """
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1286
        fc_properties = self._get_fc_properties(volume)
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1287
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1288
        return {
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1289
            'driver_volume_type': 'fibre_channel',
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1290
            'data': fc_properties
56ac2df1785b PSARC/2014/207 OpenStack Glance Update to Havana
Drew Fisher <drew.fisher@oracle.com>
parents: 1912
diff changeset
  1291
        }