Extend volume's local attach feature using --nic

Change-Id: I47a40a33f14f926fd40ca5177a0dc891e2eccd3f
This commit is contained in:
Michael Dovgal 2017-02-22 15:47:58 +02:00
parent 769140c088
commit 4e143040f6
5 changed files with 45 additions and 15 deletions

View File

@ -39,6 +39,8 @@ ENFORCE_MULTIPATH_HELP_MESSAGE = (
'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',
@ -86,6 +88,10 @@ def do_get_connector(client, args):
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
@ -96,8 +102,8 @@ def do_local_attach(client, args):
args.mountpoint,
args.mode,
args.multipath,
args.enforce_multipath)
args.enforce_multipath,
args.nic)
utils.print_dict(device_info)

View File

@ -66,8 +66,7 @@ class Client(object):
return conn_prop
def attach(self, volume_id, hostname, mountpoint=None, mode='rw',
multipath=False, enforce_multipath=False):
multipath=False, enforce_multipath=False, nic=None):
# Check protocol type of storage backend.
with actions.VerifyProtocol(self.volumes_client, volume_id) as cmd:
# Retrieve vol-host attribute of volume.
@ -84,7 +83,8 @@ class Client(object):
with actions.InitializeConnection(
self.volumes_client, volume_id) as cmd:
connection = cmd.initialize(self, multipath, enforce_multipath)
connection = cmd.initialize(self, multipath, enforce_multipath,
nic)
with actions.ConnectVolume(self.volumes_client, volume_id) as cmd:
brick_connector = self._brick_get_connector(
@ -95,14 +95,15 @@ class Client(object):
return device_info
def detach(self, volume_id, attachment_uuid=None, multipath=False,
enforce_multipath=False, device_info=None):
enforce_multipath=False, device_info=None, nic=None):
with actions.BeginDetach(self.volumes_client, volume_id) as cmd:
cmd.reserve()
with actions.InitializeConnectionForDetach(
self.volumes_client, volume_id) as cmd:
connection = cmd.initialize(self, multipath, enforce_multipath)
connection = cmd.initialize(self, multipath, enforce_multipath,
nic)
brick_connector = self._brick_get_connector(
connection['driver_volume_type'], do_local_attach=True)

View File

@ -12,6 +12,7 @@
import ddt
import mock
import netifaces
from cinderclient import exceptions as cinder_exceptions
from os_brick import exception
@ -47,14 +48,32 @@ class TestVolumeActions(base.BaseTestCase):
self.v_client.volumes.reserve.assert_called_once_with(self.volume_id)
def test_initialize_connection(self):
self.brick_client.get_connector.return_value = None
with volume_actions.InitializeConnection(*self.command_args) as cmd:
cmd.initialize(self.brick_client, False, False)
@mock.patch('netifaces.ifaddresses',
return_value={netifaces.AF_INET: [{'addr': '127.0.0.1'}]})
@mock.patch('netifaces.interfaces', return_value=['eth1'])
@mock.patch('brick_cinderclient_ext.brick_utils.get_my_ip',
return_value='1.0.0.0')
@ddt.data((None, {'ip': '1.0.0.0'}),
('eth1', {'ip': '127.0.0.1'}))
@ddt.unpack
def test_initialize_connection(self, _nic, _conn_prop,
_fake_my_ip, _fake_interfaces,
_fake_ifaddresses):
"""Test calling initialize_connection with different input params.
self.brick_client.get_connector.assert_called_once_with(False, False)
Contains next initialize connection test cases:
1. Without any additional parameters in request;
2. Using --nic as a parameter;
TODO (mdovgal): add other test cases;
"""
self.brick_client.get_connector.return_value = _conn_prop
with volume_actions.InitializeConnection(*self.command_args) as cmd:
cmd.initialize(self.brick_client, False, False, _nic)
self.brick_client.get_connector.assert_called_once_with(False, False,
_nic)
self.v_client.volumes.initialize_connection.assert_called_once_with(
self.volume_id, None)
self.volume_id, _conn_prop)
@ddt.data('iscsi', 'iSCSI', 'ISCSI', 'rbd', 'RBD')
def test_verify_protocol(self, protocol):

View File

@ -35,8 +35,9 @@ class Reserve(VolumeAction):
class InitializeConnection(VolumeAction):
def initialize(self, brick_client, multipath, enforce_multipath):
conn_prop = brick_client.get_connector(multipath, enforce_multipath)
def initialize(self, brick_client, multipath, enforce_multipath, nic):
conn_prop = brick_client.get_connector(multipath, enforce_multipath,
nic)
return self.volumes_client.volumes.initialize_connection(
self.volume_id, conn_prop)

View File

@ -0,0 +1,3 @@
---
features:
- Added attribute --nic to local-attach command.