components/openstack/cinder/files/solaris/solarisfc.py
author saurabh.vyas@oracle.com
Wed, 25 May 2016 14:31:44 -0700
branchs11u3-sru
changeset 7787 26bcbec7afce
parent 6035 c9748fcc32de
permissions -rw-r--r--
23294485 Cinder ZFSFCDriver fails to find the right target wwn 23072471 nova driver need to accept multiple target_wwn entries in connection_info
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     2
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
     3
# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     4
#
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     5
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     6
#    not use this file except in compliance with the License. You may obtain
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     7
#    a copy of the License at
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     8
#
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
     9
#         http://www.apache.org/licenses/LICENSE-2.0
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    10
#
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    11
#    Unless required by applicable law or agreed to in writing, software
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    12
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    13
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    14
#    License for the specific language governing permissions and limitations
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    15
#    under the License.
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    16
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    17
"""Generic Solaris Fibre Channel utilities."""
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    18
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    19
import os
4937
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
    20
import platform
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    21
import time
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    22
6035
c9748fcc32de PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 4937
diff changeset
    23
from oslo_concurrency import processutils as putils
c9748fcc32de PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 4937
diff changeset
    24
from oslo_log import log as logging
c9748fcc32de PSARC 2015/535 OpenStack service updates for Kilo
Devjani Ray <devjani.ray@oracle.com>
parents: 4937
diff changeset
    25
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    26
from cinder.brick import exception
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    27
from cinder.openstack.common.gettextutils import _
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    28
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    29
LOG = logging.getLogger(__name__)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    30
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    31
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    32
class SolarisFibreChannel(object):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    33
    def __init__(self, *args, **kwargs):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    34
        self.execute = putils.execute
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    35
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    36
    def _get_fc_hbas(self):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    37
        """Get Fibre Channel HBA information."""
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    38
        out = None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    39
        try:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    40
            out, err = self.execute('/usr/sbin/fcinfo', 'hba-port')
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    41
        except putils.ProcessExecutionError as err:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    42
            return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    43
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    44
        if out is None:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    45
            LOG.info(_("Cannot find any Fibre Channel HBAs"))
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    46
            return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    47
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    48
        hbas = []
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    49
        hba = {}
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    50
        for line in out.splitlines():
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    51
            line = line.strip()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    52
            # Collect the following hba-port data:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    53
            # 1: Port WWN
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    54
            # 2: State (online|offline)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    55
            # 3: Node WWN
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    56
            if line.startswith("HBA Port WWN:"):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    57
                # New HBA port entry
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    58
                hba = {}
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    59
                wwpn = line.split()[-1]
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    60
                hba['port_name'] = wwpn
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    61
                continue
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    62
            elif line.startswith("Port Mode:"):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    63
                mode = line.split()[-1]
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    64
                # Skip Target mode ports
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    65
                if mode != 'Initiator':
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    66
                    break
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    67
            elif line.startswith("State:"):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    68
                state = line.split()[-1]
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    69
                hba['port_state'] = state
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    70
                continue
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    71
            elif line.startswith("Node WWN:"):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    72
                wwnn = line.split()[-1]
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    73
                hba['node_name'] = wwnn
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    74
                continue
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    75
            if len(hba) == 3:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    76
                hbas.append(hba)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    77
                hba = {}
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    78
        return hbas
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    79
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    80
    def get_fc_wwnns(self):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    81
        """Get Fibre Channel WWNNs from the system, if any."""
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    82
        hbas = self._get_fc_hbas()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    83
        if hbas is None:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    84
            return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    85
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    86
        wwnns = []
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    87
        for hba in hbas:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    88
            if hba['port_state'] == 'online':
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    89
                wwnn = hba['node_name']
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    90
                wwnns.append(wwnn)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    91
        return wwnns
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    92
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    93
    def get_fc_wwpns(self):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    94
        """Get Fibre Channel WWPNs from the system, if any."""
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    95
        hbas = self._get_fc_hbas()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    96
        if hbas is None:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    97
            return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    98
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
    99
        wwpns = []
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   100
        for hba in hbas:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   101
            if hba['port_state'] == 'online':
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   102
                wwpn = hba['port_name']
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   103
                wwpns.append(wwpn)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   104
        return wwpns
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   105
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   106
    def _refresh_connection(self):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   107
        """Force the link reinitialization to make the LUN present."""
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   108
        wwpns = self.get_fc_wwpns()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   109
        for wwpn in wwpns:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   110
            self.execute('/usr/sbin/fcadm', 'force-lip', wwpn)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   111
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   112
    def _get_device_path(self, wwn, target_lun):
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   113
        """Get the Device path for the specified LUN.
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   114
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   115
        The output of CMD below is like this:
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   116
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   117
        OS Device Name: /dev/rdsk/c0t600C0FF0000000000036223AE73EB705d0s2
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   118
               HBA Port WWN: 210100e08b27a8a1
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   119
                       Remote Port WWN: 256000c0ffc03622
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   120
                               LUN: 0
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   121
                       Remote Port WWN: 216000c0ff803622
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   122
                               LUN: 0
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   123
               HBA Port WWN: 210000e08b07a8a1
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   124
                       Remote Port WWN: 256000c0ffc03622
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   125
                               LUN: 0
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   126
                       Remote Port WWN: 216000c0ff803622
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   127
                               LUN: 0
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   128
               Vendor: SUN
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   129
               Product: StorEdge 3510
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   130
               Device Type: Disk device
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   131
        ......
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   132
        """
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   133
        try:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   134
            out, err = self.execute('/usr/sbin/fcinfo', 'logical-unit', '-v')
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   135
        except putils.ProcessExecutionError as err:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   136
            return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   137
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   138
        host_device = None
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   139
        remote_port = None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   140
        if out is not None:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   141
            for line in [l.strip() for l in out.splitlines()]:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   142
                if line.startswith("OS Device Name:"):
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   143
                    host_device = line.split()[-1]
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   144
                if line.startswith("Remote Port WWN:"):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   145
                    remote_port = line.split()[-1]
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   146
                if line.startswith("LUN:"):
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   147
                    lun = line.split()[-1]
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   148
                    if remote_port.upper() == wwn and \
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   149
                       int(lun) == int(target_lun):
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   150
                        return host_device
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   151
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   152
        return None
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   153
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   154
    def connect_volume(self, connection_properties, scan_tries):
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   155
        """Attach the volume to instance_name.
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   156
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   157
        connection_properties for Fibre Channel must include:
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   158
        target_wwn - Specified port WWNs
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   159
        target_lun - LUN id of the volume
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   160
        """
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   161
        device_info = {'type': 'block'}
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   162
        target_wwn = connection_properties['target_wwn']
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   163
        target_lun = connection_properties['target_lun']
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   164
        wwns = []
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   165
        if isinstance(target_wwn, list):
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   166
            wwns = target_wwn
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   167
        else:
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   168
            wwns.append(target_wwn)
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   169
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   170
        # The scsi_vhci disk node is not always present immediately.
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   171
        # Sometimes we need to reinitialize the connection to trigger
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   172
        # a refresh.
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   173
        for i in range(1, scan_tries):
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   174
            # initiator needs time to refresh the LU list
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   175
            time.sleep(i * 2)
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   176
            host_device = self._get_device_path(wwns[0], target_lun)
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   177
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   178
            if host_device is not None and os.path.exists(host_device):
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   179
                break
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   180
            else:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   181
                self._refresh_connection()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   182
        else:
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   183
            msg = _("Fibre Channel volume device not found.")
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   184
            LOG.error(msg)
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   185
            raise exception.NoFibreChannelVolumeDeviceFound()
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   186
4937
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   187
        # Set the label EFI to the disk on SPARC before it is accessed and
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   188
        # make sure the correct device path with slice 0
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   189
        # (like '/dev/rdsk/c0t600xxxd0s0').
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   190
        if platform.processor() == 'sparc':
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   191
            tmp_dev_name = host_device.rsplit('s', 1)
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   192
            disk_name = tmp_dev_name[0].split('/')[-1]
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   193
            (out, _err) = self.execute('/usr/sbin/format', '-L', 'efi', '-d',
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   194
                                       disk_name)
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   195
            host_device = '%ss0' % tmp_dev_name[0]
8f0976d7e40e PSARC 2015/289 OpenStack Cinder Enhancements
Qiang Strony Zhang <strony.zhang@oracle.com>
parents: 4072
diff changeset
   196
7787
26bcbec7afce 23294485 Cinder ZFSFCDriver fails to find the right target wwn
saurabh.vyas@oracle.com
parents: 6035
diff changeset
   197
        device_info['path'] = host_device
4072
db0cec748ec0 PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff changeset
   198
        return device_info