Fix export location used for extend/shrink tests

Instead of using the first export location, use the first export
location matching the address family (IPv4 or IPv6) to be used
for the mount.

Closes-Bug: #1848278
Change-Id: Ia2a0fefc34085e21e521acb7ccfdeecef7fda186
This commit is contained in:
Tom Barron 2019-10-15 17:26:41 -04:00
parent a096815be9
commit 645e4eb092
5 changed files with 75 additions and 65 deletions

View File

@ -377,6 +377,13 @@ class ShareScenarioTest(manager.NetworkScenarioTest):
locations = [x['path'] for x in exports]
return locations
def _get_snapshot_export_locations(self, snapshot):
exports = (self.shares_v2_client.
list_snapshot_export_locations(snapshot['id']))
locations = [x['path'] for x in exports]
return locations
def _get_ipv6_server_ip(self, instance):
ipv6_addrs = []
for network_name, nic_list in instance['addresses'].items():
@ -579,3 +586,51 @@ class ShareScenarioTest(manager.NetworkScenarioTest):
LOG.info('Creating Glance image using the downloaded image file')
return self._image_create('centos', 'bare', imagepath, 'qcow2')
def get_share_export_location_for_mount(self, share):
exports = self.get_user_export_locations(
share=share,
error_on_invalid_ip_version=True)
return exports[0]
def get_user_export_locations(self, share=None, snapshot=None,
error_on_invalid_ip_version=False):
locations = None
if share:
locations = self.get_share_export_locations(share)
elif snapshot:
locations = self._get_snapshot_export_locations(snapshot)
self.assertNotEmpty(locations)
locations = self._get_export_locations_according_to_ip_version(
locations, error_on_invalid_ip_version)
self.assertNotEmpty(locations)
return locations
def _get_export_locations_according_to_ip_version(
self, all_locations, error_on_invalid_ip_version):
locations = [
x for x in all_locations
if self.get_ip_and_version_from_export_location(
x)[1] == self.ip_version]
if len(locations) == 0 and not error_on_invalid_ip_version:
message = ("Configured backend does not support "
"ip_version %s" % self.ip_version)
raise self.skipException(message)
return locations
def get_ip_and_version_from_export_location(self, export):
export = export.replace('[', '').replace(']', '')
if self.protocol == 'nfs' and ':/' in export:
ip = export.split(':/')[0]
version = 6 if ip.count(':') > 1 else 4
elif self.protocol == 'cifs' and export.startswith(r'\\'):
ip = export.split('\\')[2]
version = 6 if (ip.count(':') > 1 or
ip.endswith('ipv6-literal.net')) else 4
else:
message = ("Protocol %s is not supported" % self.protocol)
raise self.skipException(message)
return ip, version

View File

@ -52,20 +52,6 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
cls.protocol)
raise cls.skipException(message)
def get_ip_and_version_from_export_location(self, export):
export = export.replace('[', '').replace(']', '')
if self.protocol == 'nfs' and ':/' in export:
ip = export.split(':/')[0]
version = 6 if ip.count(':') > 1 else 4
elif self.protocol == 'cifs' and export.startswith(r'\\'):
ip = export.split('\\')[2]
version = 6 if (ip.count(':') > 1 or
ip.endswith('ipv6-literal.net')) else 4
else:
message = ("Protocol %s is not supported" % self.protocol)
raise self.skipException(message)
return ip, version
def _ping_host_from_export_location(self, export, remote_client):
ip, version = self.get_ip_and_version_from_export_location(export)
if version == 6:
@ -73,46 +59,11 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
else:
remote_client.exec_command("ping -c 5 %s" % ip)
def _get_export_locations_according_to_ip_version(
self, all_locations, error_on_invalid_ip_version):
locations = [
x for x in all_locations
if self.get_ip_and_version_from_export_location(
x)[1] == self.ip_version]
if len(locations) == 0 and not error_on_invalid_ip_version:
message = ("Configured backend does not support "
"ip_version %s" % self.ip_version)
raise self.skipException(message)
return locations
def _get_user_export_locations(self, share=None, snapshot=None,
error_on_invalid_ip_version=False):
locations = None
if share:
locations = self.get_share_export_locations(share)
elif snapshot:
locations = self._get_snapshot_export_locations(snapshot)
self.assertNotEmpty(locations)
locations = self._get_export_locations_according_to_ip_version(
locations, error_on_invalid_ip_version)
self.assertNotEmpty(locations)
return locations
def _get_snapshot_export_locations(self, snapshot):
exports = (self.shares_v2_client.
list_snapshot_export_locations(snapshot['id']))
locations = [x['path'] for x in exports]
return locations
@tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
def test_mount_share_one_vm(self):
instance = self.boot_instance(wait_until="BUILD")
self.create_share()
locations = self._get_user_export_locations(self.share)
locations = self.get_user_export_locations(self.share)
instance = self.wait_for_active_instance(instance["id"])
remote_client = self.init_remote_client(instance)
self.provide_access_to_auxiliary_instance(instance)
@ -128,7 +79,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
instance = self.boot_instance(wait_until="BUILD")
self.create_share()
location = self._get_user_export_locations(self.share)[0]
location = self.get_user_export_locations(self.share)[0]
instance = self.wait_for_active_instance(instance["id"])
remote_client_inst = self.init_remote_client(instance)
@ -156,7 +107,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
instance1 = self.boot_instance(wait_until="BUILD")
instance2 = self.boot_instance(wait_until="BUILD")
self.create_share()
location = self._get_user_export_locations(self.share)[0]
location = self.get_user_export_locations(self.share)[0]
instance1 = self.wait_for_active_instance(instance1["id"])
instance2 = self.wait_for_active_instance(instance2["id"])
@ -213,7 +164,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
instance = self.boot_instance(wait_until="BUILD")
self.create_share()
exports = self._get_user_export_locations(self.share)
exports = self.get_user_export_locations(self.share)
instance = self.wait_for_active_instance(instance["id"])
self.share = self.shares_admin_v2_client.get_share(self.share['id'])
@ -269,7 +220,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
self.share = self.migration_complete(self.share['id'], dest_pool)
new_exports = self._get_user_export_locations(
new_exports = self.get_user_export_locations(
self.share, error_on_invalid_ip_version=True)
self.assertEqual(dest_pool, self.share['host'])
@ -307,7 +258,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
self.provide_access_to_auxiliary_instance(instance, parent_share)
# 5 - Try mount S1 to UVM, ok, mounted
user_export_location = self._get_user_export_locations(parent_share)[0]
user_export_location = self.get_user_export_locations(parent_share)[0]
parent_share_dir = "/mnt/parent"
remote_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
@ -329,7 +280,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
# 10 - Try mount S2 - fail, access denied. We test that child share
# did not get access rules from parent share.
user_export_location = self._get_user_export_locations(child_share)[0]
user_export_location = self.get_user_export_locations(child_share)[0]
child_share_dir = "/mnt/child"
remote_client.exec_command("sudo mkdir -p %s" % child_share_dir)
@ -391,7 +342,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
self.provide_access_to_auxiliary_instance(instance, parent_share)
# 5 - Try mount S1 to UVM, ok, mounted
user_export_location = self._get_user_export_locations(parent_share)[0]
user_export_location = self.get_user_export_locations(parent_share)[0]
parent_share_dir = "/mnt/parent"
snapshot_dir = "/mnt/snapshot_dir"
remote_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
@ -414,7 +365,7 @@ class ShareBasicOpsBase(manager.ShareScenarioTest):
self.provide_access_to_auxiliary_instance(instance, snapshot=snapshot)
# 10 - Mount SS1
user_export_location = self._get_user_export_locations(
user_export_location = self.get_user_export_locations(
snapshot=snapshot)[0]
self.mount_share(user_export_location, remote_client, snapshot_dir)
self.addCleanup(self.unmount_share, remote_client, snapshot_dir)

View File

@ -71,10 +71,9 @@ class ShareExtendBase(manager.ShareScenarioTest):
LOG.debug('Step 4 - grant access')
self.provide_access_to_auxiliary_instance(instance, share=share)
locations = self.get_share_export_locations(share)
LOG.debug('Step 5 - mount')
self.mount_share(locations[0], remote_client)
location = self.get_share_export_location_for_mount(share)
self.mount_share(location, remote_client)
total_blocks = (units.Ki * default_share_size) / 64
three_quarter_blocks = (total_blocks / 4) * 3
@ -107,7 +106,7 @@ class ShareExtendBase(manager.ShareScenarioTest):
self.assertEqual(extended_share_size, int(share["size"]))
LOG.debug('Step 8 - writing more data, should succeed')
self.write_data_with_remount(locations[0], remote_client, '/mnt/t3',
self.write_data_with_remount(location, remote_client, '/mnt/t3',
'64M', over_one_quarter_blocks)
ls_result = remote_client.exec_command("sudo ls -lAh /mnt/")
LOG.debug(ls_result)

View File

@ -74,10 +74,9 @@ class ShareShrinkBase(manager.ShareScenarioTest):
LOG.debug('Step 4 - grant access')
self.provide_access_to_auxiliary_instance(instance)
locations = self.get_share_export_locations(share)
LOG.debug('Step 5 - mount')
self.mount_share(locations[0], remote_client)
location = self.get_share_export_location_for_mount(share)
self.mount_share(location, remote_client)
total_blocks = (1024 * default_share_size) / 64
blocks = total_blocks + 4

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Instead of using the first export location, use the first export location
matching the address family (IPv4 or IPv6) matching that to be used for the
mount.