Files
nova-powervm/nova_powervm/tests/virt/powervm/volume/test_driver.py
esberglu c1a17ca319 Replace TestCase with NoDBTestCase
It was suggested that we replace TestCase with NoDBTestCase [1]. This
does two things. First it prevents the test case setup from running the
database schema migrations unnecessarily which should improve
performance. Second it will cause the test to fail if the code does
touch the DB when the developer is claiming that it shouldn't.

[1] https://review.openstack.org/#/c/409404/46/nova/tests/unit/virt/powervm/test_media.py

Change-Id: I8bcc9cbdcadd9fe89a4450ca405387899baa9fc3
2017-11-13 10:08:31 -06:00

139 lines
5.5 KiB
Python

# Copyright 2015 IBM Corp.
#
# All Rights Reserved.
#
# 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.
import mock
from pypowervm.wrappers import virtual_io_server as pvm_vios
import six
from nova import test
from nova_powervm.virt.powervm import volume
from nova_powervm.virt.powervm.volume import gpfs
from nova_powervm.virt.powervm.volume import iscsi
from nova_powervm.virt.powervm.volume import local
from nova_powervm.virt.powervm.volume import nfs
from nova_powervm.virt.powervm.volume import npiv
from nova_powervm.virt.powervm.volume import vscsi
class TestVolumeAdapter(test.NoDBTestCase):
def setUp(self):
super(TestVolumeAdapter, self).setUp()
# Enable passing through the can attach/detach checks
self.mock_get_inst_wrap_p = mock.patch('nova_powervm.virt.powervm.vm.'
'get_instance_wrapper')
self.mock_get_inst_wrap = self.mock_get_inst_wrap_p.start()
self.addCleanup(self.mock_get_inst_wrap_p.stop)
self.mock_inst_wrap = mock.MagicMock()
self.mock_inst_wrap.can_modify_io.return_value = (True, None)
self.mock_get_inst_wrap.return_value = self.mock_inst_wrap
class TestInitMethods(test.NoDBTestCase):
# Volume driver types to classes
volume_drivers = {
'iscsi': iscsi.IscsiVolumeAdapter,
'local': local.LocalVolumeAdapter,
'nfs': nfs.NFSVolumeAdapter,
'gpfs': gpfs.GPFSVolumeAdapter,
}
@mock.patch('pypowervm.tasks.hdisk.discover_iscsi_initiator')
@mock.patch('pypowervm.tasks.partition.get_mgmt_partition')
def test_get_iscsi_initiator(self, mock_mgmt, mock_iscsi_init):
# Set up mocks and clear out data that may have been set by other
# tests
mock_adpt = mock.Mock()
mock_mgmt.return_value = mock.Mock(spec=pvm_vios.VIOS)
mock_iscsi_init.return_value = 'test_initiator'
self.assertEqual('test_initiator',
volume.get_iscsi_initiator(mock_adpt))
# Make sure it gets set properly in the backend
self.assertEqual('test_initiator', volume._ISCSI_INITIATOR)
self.assertTrue(volume._ISCSI_LOOKUP_COMPLETE)
mock_mgmt.assert_called_once_with(mock_adpt)
self.assertEqual(1, mock_mgmt.call_count)
# Invoke again, make sure it doesn't call down to the mgmt part again
self.assertEqual('test_initiator',
volume.get_iscsi_initiator(mock_adpt))
self.assertEqual(1, mock_mgmt.call_count)
# Check if initiator returned does not have newline character
mock_iscsi_init.return_value = 'test_initiator\n'
self.assertEqual('test_initiator',
volume.get_iscsi_initiator(mock_adpt))
def test_get_volume_class(self):
for vol_type, class_type in six.iteritems(self.volume_drivers):
self.assertEqual(class_type, volume.get_volume_class(vol_type))
# Try the fibre as vscsi
self.flags(fc_attach_strategy='vscsi', group='powervm')
self.assertEqual(vscsi.PVVscsiFCVolumeAdapter,
volume.get_volume_class('fibre_channel'))
# Try the fibre as npiv
self.flags(fc_attach_strategy='npiv', group='powervm')
self.assertEqual(npiv.NPIVVolumeAdapter,
volume.get_volume_class('fibre_channel'))
def test_build_volume_driver(self):
for vol_type, class_type in six.iteritems(self.volume_drivers):
vdrv = volume.build_volume_driver(
mock.Mock(), "abc123", mock.Mock(uuid='abc1'),
{'driver_volume_type': vol_type})
self.assertIsInstance(vdrv, class_type)
# Try the fibre as vscsi
self.flags(fc_attach_strategy='vscsi', group='powervm')
vdrv = volume.build_volume_driver(
mock.Mock(), "abc123", mock.Mock(uuid='abc1'),
{'driver_volume_type': 'fibre_channel'})
self.assertIsInstance(vdrv, vscsi.PVVscsiFCVolumeAdapter)
# Try the fibre as npiv
self.flags(fc_attach_strategy='npiv', group='powervm')
vdrv = volume.build_volume_driver(
mock.Mock(), "abc123", mock.Mock(uuid='abc1'),
{'driver_volume_type': 'fibre_channel'})
self.assertIsInstance(vdrv, npiv.NPIVVolumeAdapter)
def test_hostname_for_volume(self):
self.flags(host='test_host')
mock_instance = mock.Mock()
mock_instance.name = 'instance'
# Try the fibre as vscsi
self.flags(fc_attach_strategy='vscsi', group='powervm')
self.assertEqual("test_host",
volume.get_hostname_for_volume(mock_instance))
# Try the fibre as npiv
self.flags(fc_attach_strategy='npiv', group='powervm')
self.assertEqual("test_host_instance",
volume.get_hostname_for_volume(mock_instance))
# NPIV with long host name
self.flags(host='really_long_host_name_too_long')
self.assertEqual("really_long_host_nam_instance",
volume.get_hostname_for_volume(mock_instance))