Files
python-brick-cinderclient-ext/brick_cinderclient_ext/__init__.py
Walter A. Boring IV 3a8b113926 Add new v3 attach/detach workflow
This patch adds the ability to use the new v 3.27 microversioned
attach/detach workflow that was added to Cinder.  Since this is an extension
to the cinderclient, the code checks to make sure the client version and the
cinder API version are capable of executing the new v3.27 attach/detach
workflow, before using it.

Change-Id: I4c3fdc841108020ee310ddc0424a44480010fda1
2017-06-05 19:20:07 +00:00

179 lines
5.9 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Command-line interface to the os-brick.
"""
from __future__ import print_function
import json
import socket
from cinderclient import utils
import pbr.version
from brick_cinderclient_ext import brick_utils
from brick_cinderclient_ext import client as brick_client
__version__ = pbr.version.VersionInfo(
'python-brick-cinderclient-ext').version_string()
VOLUME_ID_HELP_MESSAGE = 'Name or other Identifier for existing volume'
MULTIPATH_HELP_MESSAGE = ('Set True if connector wants to use multipath.'
'Default value is False.')
ENFORCE_MULTIPATH_HELP_MESSAGE = (
'If enforce_multipath=True is specified too, an exception is thrown when '
'multipathd is not running. Otherwise, it falls back to multipath=False '
'and only the first path shown up is used.')
NETWORK_INTERFACE_HELP_MESSAGE = ('Use a specific network interface to '
'determine IP address.')
LOCAL_ATTACH_NIC_HELP_MESSAGE = ('Use a specific network interface for '
'connector during attach operation.')
@utils.arg('--multipath',
metavar='<multipath>',
default=False,
help=MULTIPATH_HELP_MESSAGE)
@utils.arg('--enforce_multipath',
metavar='<enforce_multipath>',
default=False,
help=ENFORCE_MULTIPATH_HELP_MESSAGE)
@utils.arg('--nic',
metavar='<nic>',
default=None,
help=NETWORK_INTERFACE_HELP_MESSAGE)
@brick_utils.require_root
def do_get_connector(client, args):
"""Get the connection properties for all protocols."""
brickclient = brick_client.Client(client)
connector = brickclient.get_connector(args.multipath,
args.enforce_multipath,
args.nic)
utils.print_dict(connector)
@utils.arg('identifier',
metavar='<identifier>',
help=VOLUME_ID_HELP_MESSAGE)
@utils.arg('--hostname',
metavar='<hostname>',
default=socket.gethostname(),
help='hostname')
@utils.arg('--mountpoint',
metavar='<mountpoint>',
default=None,
help='mountpoint')
@utils.arg('--mode',
metavar='<mode>',
default='rw',
help='mode')
@utils.arg('--multipath',
metavar='<multipath>',
default=False,
help=MULTIPATH_HELP_MESSAGE)
@utils.arg('--enforce_multipath',
metavar='<enforce_multipath>',
default=False,
help=ENFORCE_MULTIPATH_HELP_MESSAGE)
@utils.arg('--nic',
metavar='<nic>',
default=None,
help=LOCAL_ATTACH_NIC_HELP_MESSAGE)
@brick_utils.require_root
def do_local_attach(client, args):
hostname = args.hostname
volume = args.identifier
brickclient = brick_client.Client(client)
device_info = brickclient.attach(volume,
hostname,
args.mountpoint,
args.mode,
args.multipath,
args.enforce_multipath,
args.nic)
utils.print_dict(device_info)
@utils.arg('identifier',
metavar='<identifier>',
help=VOLUME_ID_HELP_MESSAGE)
@utils.arg('--attachment_uuid',
metavar='<attachment_uuid>',
default=None,
help='The uuid of the volume attachment.')
@utils.arg('--multipath',
metavar='<multipath>',
default=False,
help=MULTIPATH_HELP_MESSAGE)
@utils.arg('--enforce_multipath',
metavar='<enforce_multipath>',
default=False,
help=ENFORCE_MULTIPATH_HELP_MESSAGE)
@utils.arg('--device_info',
metavar='<device_info>',
default=None,
help='The device_info is returned from connect_volume.')
@brick_utils.require_root
def do_local_detach(client, args):
volume = args.identifier
brickclient = brick_client.Client(client)
device_info = None
if args.device_info:
device_info = json.loads(args.device_info)
brickclient.detach(volume, args.attachment_uuid, args.multipath,
args.enforce_multipath, device_info)
@utils.arg('identifier',
metavar='<identifier>',
help=VOLUME_ID_HELP_MESSAGE)
@utils.arg('--multipath',
metavar='<multipath>',
default=False,
help=MULTIPATH_HELP_MESSAGE)
@brick_utils.require_root
def do_get_volume_paths(client, args):
"""Get volume paths for a volume."""
volume = args.identifier
brickclient = brick_client.Client(client)
paths = brickclient.get_volume_paths(volume, args.multipath)
if paths:
print('\n'.join(paths))
@utils.arg('--multipath',
metavar='<multipath>',
default=False,
help=MULTIPATH_HELP_MESSAGE)
@utils.arg('--protocol',
metavar='<protocol>',
default='ISCSI',
help='Connection protocol. ISCSI, FIBRE_CHANNEL, etc.')
@brick_utils.require_root
def do_get_all_volume_paths(client, args):
"""Get all volume paths for a protocol."""
brickclient = brick_client.Client(client)
paths = brickclient.get_all_volume_paths(args.protocol, args.multipath)
if paths:
print('\n'.join(paths))
manager_class = brick_client.Client
name = 'brick_local_volume_management'