Merge "Move shared logic to base scenario test class"
diff --git a/manila_tempest_tests/tests/scenario/manager_share.py b/manila_tempest_tests/tests/scenario/manager_share.py
index 5c8cbbf..556123f 100644
--- a/manila_tempest_tests/tests/scenario/manager_share.py
+++ b/manila_tempest_tests/tests/scenario/manager_share.py
@@ -16,13 +16,20 @@
 from oslo_log import log
 import six
 
-from tempest import config
-from tempest.lib.common.utils import data_utils
-
 from manila_tempest_tests.common import constants
 from manila_tempest_tests.common import remote_client
+from manila_tempest_tests.tests.api import base
 from manila_tempest_tests.tests.scenario import manager
 
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import exceptions
+
+from tempfile import mkstemp
+from urllib2 import urlopen
+
 CONF = config.CONF
 LOG = log.getLogger(__name__)
 
@@ -31,6 +38,12 @@
     """Provide harness to do Manila scenario tests."""
 
     credentials = ('admin', 'primary')
+    protocol = None
+    ip_version = 4
+
+    @property
+    def ipv6_enabled(self):
+        return self.ip_version == 6
 
     @classmethod
     def resource_setup(cls):
@@ -48,6 +61,266 @@
         if not CONF.service_available.manila:
             raise cls.skipException("Manila support is required")
 
+    def setUp(self):
+        base.verify_test_has_appropriate_tags(self)
+        if self.ipv6_enabled and not CONF.share.run_ipv6_tests:
+            raise self.skipException("IPv6 tests are disabled")
+        if self.protocol not in CONF.share.enable_protocols:
+            message = "%s tests are disabled" % self.protocol
+            raise self.skipException(message)
+        if self.protocol not in CONF.share.enable_ip_rules_for_protocols:
+            message = ("%s tests for access rules other than IP are disabled" %
+                       self.protocol)
+            raise self.skipException(message)
+        super(ShareScenarioTest, self).setUp()
+
+        self.image_id = None
+        # Setup image and flavor the test instance
+        # Support both configured and injected values
+        self.floating_ips = {}
+
+        if not hasattr(self, 'flavor_ref'):
+            self.flavor_ref = CONF.share.client_vm_flavor_ref
+
+        if CONF.share.image_with_share_tools == 'centos':
+            self.image_ref = self._create_centos_based_glance_image()
+        elif CONF.share.image_with_share_tools:
+            images = self.compute_images_client.list_images()["images"]
+            for img in images:
+                if img["name"] == CONF.share.image_with_share_tools:
+                    self.image_id = img['id']
+                    break
+            if not self.image_id:
+                msg = ("Image %s not found. Expecting an image including "
+                       "required share tools." %
+                       CONF.share.image_with_share_tools)
+                raise exceptions.InvalidConfiguration(message=msg)
+        self.ssh_user = CONF.share.image_username
+        LOG.debug('Starting test for i:{image_id}, f:{flavor}. '
+                  'user: {ssh_user}'.format(image_id=self.image_id,
+                                            flavor=self.flavor_ref,
+                                            ssh_user=self.ssh_user))
+
+        self.security_group = self._create_security_group()
+        self.share_network = self.create_share_network()
+
+    def mount_share(self, location, remote_client, target_dir=None):
+        raise NotImplementedError
+
+    def umount_share(self, remote_client, target_dir=None):
+        target_dir = target_dir or "/mnt"
+        remote_client.exec_command("sudo umount %s" % target_dir)
+
+    def create_share_network(self):
+        self.net = self._create_network(namestart="manila-share")
+        self.subnet = self._create_subnet(
+            network=self.net,
+            namestart="manila-share-sub",
+            ip_version=self.ip_version,
+            use_default_subnetpool=self.ipv6_enabled)
+        router = self._get_router()
+        self._create_router_interface(subnet_id=self.subnet['id'],
+                                      router_id=router['id'])
+        share_network = self._create_share_network(
+            neutron_net_id=self.net['id'],
+            neutron_subnet_id=self.subnet['id'],
+            name=data_utils.rand_name("sn-name"))
+        return share_network
+
+    def boot_instance(self, wait_until="ACTIVE"):
+        self.keypair = self.create_keypair()
+        security_groups = [{'name': self.security_group['name']}]
+        create_kwargs = {
+            'key_name': self.keypair['name'],
+            'security_groups': security_groups,
+            'wait_until': wait_until,
+            'networks': [{'uuid': self.net['id']}, ],
+        }
+        instance = self.create_server(
+            image_id=self.image_id, flavor=self.flavor_ref, **create_kwargs)
+        return instance
+
+    def init_remote_client(self, instance):
+        if self.ipv6_enabled:
+            server_ip = self._get_ipv6_server_ip(instance)
+        else:
+            # Obtain a floating IP
+            floating_ip = (
+                self.compute_floating_ips_client.create_floating_ip()
+                ['floating_ip'])
+            self.floating_ips[instance['id']] = floating_ip
+            self.addCleanup(
+                test_utils.call_and_ignore_notfound_exc,
+                self.compute_floating_ips_client.delete_floating_ip,
+                floating_ip['id'])
+            # Attach a floating IP
+            self.compute_floating_ips_client.associate_floating_ip_to_server(
+                floating_ip['ip'], instance['id'])
+            server_ip = floating_ip['ip']
+        self.assertIsNotNone(server_ip)
+        # Check ssh
+        remote_client = self.get_remote_client(
+            server_or_ip=server_ip,
+            username=self.ssh_user,
+            private_key=self.keypair['private_key'])
+
+        # NOTE(u_glide): Workaround for bug #1465682
+        remote_client = remote_client.ssh_client
+
+        self.share = self.shares_client.get_share(self.share['id'])
+        return remote_client
+
+    def write_data_to_mounted_share(self, escaped_string, remote_client,
+                                    mount_point='/mnt/t1'):
+        remote_client.exec_command("echo \"{escaped_string}\" "
+                                   "| sudo tee {mount_point} && sudo sync"
+                                   .format(escaped_string=escaped_string,
+                                           mount_point=mount_point))
+
+    def read_data_from_mounted_share(self,
+                                     remote_client,
+                                     mount_point='/mnt/t1'):
+        data = remote_client.exec_command("sudo cat {mount_point}"
+                                          .format(mount_point=mount_point))
+        return data.rstrip()
+
+    def migrate_share(self, share_id, dest_host, status,
+                      force_host_assisted=False):
+        share = self._migrate_share(
+            share_id, dest_host, status, force_host_assisted,
+            self.shares_admin_v2_client)
+        return share
+
+    def migration_complete(self, share_id, dest_host):
+        return self._migration_complete(share_id, dest_host)
+
+    def create_share(self, **kwargs):
+        kwargs.update({
+            'share_protocol': self.protocol,
+        })
+        if not ('share_type_id' in kwargs or 'snapshot_id' in kwargs):
+            default_share_type_id = self._get_share_type()['id']
+            kwargs.update({'share_type_id': default_share_type_id})
+        if CONF.share.multitenancy_enabled:
+            kwargs.update({'share_network_id': self.share_net['id']})
+        self.share = self._create_share(**kwargs)
+        return self.share
+
+    def get_remote_client(self, *args, **kwargs):
+        if not CONF.share.image_with_share_tools:
+            return super(ShareScenarioTest,
+                         self).get_remote_client(*args, **kwargs)
+        # NOTE(u_glide): We need custom implementation of this method until
+        # original implementation depends on CONF.compute.ssh_auth_method
+        # option.
+        server_or_ip = kwargs['server_or_ip']
+        if isinstance(server_or_ip, six.string_types):
+            ip = server_or_ip
+        else:
+            addr = server_or_ip['addresses'][
+                CONF.validation.network_for_ssh][0]
+            ip = addr['addr']
+
+        # NOTE(u_glide): Both options (pkey and password) are required here to
+        # support service images without Nova metadata support
+        client_params = {
+            'username': kwargs['username'],
+            'password': CONF.share.image_password,
+            'pkey': kwargs.get('private_key'),
+        }
+
+        linux_client = remote_client.RemoteClient(ip, **client_params)
+        try:
+            linux_client.validate_authentication()
+        except Exception:
+            LOG.exception('Initializing SSH connection to %s failed', ip)
+            self._log_console_output()
+            raise
+
+        return linux_client
+
+    def allow_access_ip(self, share_id, ip=None, instance=None,
+                        access_level="rw", cleanup=True, snapshot=None):
+        if instance and not ip:
+            try:
+                net_addresses = instance['addresses']
+                first_address = net_addresses.values()[0][0]
+                ip = first_address['addr']
+            except Exception:
+                LOG.debug("Instance has no valid IP address: %s", instance)
+                # In case on an error ip will be still none
+                LOG.exception("Instance has no valid IP address. "
+                              "Falling back to default")
+        if not ip:
+            ip = '0.0.0.0/0'
+
+        if snapshot:
+            self._allow_access_snapshot(snapshot['id'], access_type='ip',
+                                        access_to=ip, cleanup=cleanup)
+        else:
+            return self._allow_access(share_id, access_type='ip',
+                                      access_level=access_level, access_to=ip,
+                                      cleanup=cleanup,
+                                      client=self.shares_v2_client)
+
+    def deny_access(self, share_id, access_rule_id, client=None):
+        """Deny share access
+
+        :param share_id: id of the share
+        :param access_rule_id: id of the rule that will be deleted
+        """
+        client = client or self.shares_client
+        client.delete_access_rule(share_id, access_rule_id)
+        self.shares_v2_client.wait_for_share_status(
+            share_id, "active", status_attr='access_rules_status')
+
+    def provide_access_to_auxiliary_instance(self, instance, share=None,
+                                             snapshot=None, access_level='rw'):
+        share = share or self.share
+        if self.protocol.lower() == 'cifs':
+            self.allow_access_ip(
+                share['id'], instance=instance, cleanup=False,
+                snapshot=snapshot, access_level=access_level)
+        elif not CONF.share.multitenancy_enabled:
+            if self.ipv6_enabled:
+                server_ip = self._get_ipv6_server_ip(instance)
+            else:
+                server_ip = (CONF.share.override_ip_for_nfs_access or
+                             self.floating_ips[instance['id']]['ip'])
+            self.assertIsNotNone(server_ip)
+            return self.allow_access_ip(
+                share['id'], ip=server_ip,
+                instance=instance, cleanup=False, snapshot=snapshot,
+                access_level=access_level)
+        elif (CONF.share.multitenancy_enabled and
+              self.protocol.lower() == 'nfs'):
+            return self.allow_access_ip(
+                share['id'], instance=instance, cleanup=False,
+                snapshot=snapshot, access_level=access_level)
+
+    def wait_for_active_instance(self, instance_id):
+        waiters.wait_for_server_status(
+            self.os_primary.servers_client, instance_id, "ACTIVE")
+        return self.os_primary.servers_client.show_server(
+            instance_id)["server"]
+
+    def _get_share_type(self):
+        if CONF.share.default_share_type_name:
+            return self.shares_client.get_share_type(
+                CONF.share.default_share_type_name)['share_type']
+        return self._create_share_type(
+            data_utils.rand_name("share_type"),
+            extra_specs={
+                'snapshot_support': CONF.share.capability_snapshot_support,
+                'driver_handles_share_servers': CONF.share.multitenancy_enabled
+            },)['share_type']
+
+    def _get_ipv6_server_ip(self, instance):
+        for net_list in instance['addresses'].values():
+            for net_data in net_list:
+                if net_data['version'] == 6:
+                    return net_data['addr']
+
     def _create_share(self, share_protocol=None, size=None, name=None,
                       snapshot_id=None, description=None, metadata=None,
                       share_network_id=None, share_type_id=None,
@@ -160,17 +433,6 @@
             self.addCleanup(client.delete_access_rule, share_id, access['id'])
         return access
 
-    def _deny_access(self, share_id, rule_id, client=None):
-        """Deny share access
-
-        :param share_id: id of the share
-        :param rule_id: id of the rule that will be deleted
-        """
-        client = client or self.shares_client
-        client.delete_access_rule(share_id, rule_id)
-        self.shares_v2_client.wait_for_share_status(
-            share_id, "active", status_attr='access_rules_status')
-
     def _allow_access_snapshot(self, snapshot_id, access_type="ip",
                                access_to="0.0.0.0/0", cleanup=True):
         """Allow snapshot access
@@ -206,39 +468,6 @@
         self.addCleanup(
             client.remove_router_interface, router_id, subnet_id=subnet_id)
 
-    def get_remote_client(self, *args, **kwargs):
-        if not CONF.share.image_with_share_tools:
-            return super(ShareScenarioTest,
-                         self).get_remote_client(*args, **kwargs)
-        # NOTE(u_glide): We need custom implementation of this method until
-        # original implementation depends on CONF.compute.ssh_auth_method
-        # option.
-        server_or_ip = kwargs['server_or_ip']
-        if isinstance(server_or_ip, six.string_types):
-            ip = server_or_ip
-        else:
-            addr = server_or_ip['addresses'][
-                CONF.validation.network_for_ssh][0]
-            ip = addr['addr']
-
-        # NOTE(u_glide): Both options (pkey and password) are required here to
-        # support service images without Nova metadata support
-        client_params = {
-            'username': kwargs['username'],
-            'password': CONF.share.image_password,
-            'pkey': kwargs.get('private_key'),
-        }
-
-        linux_client = remote_client.RemoteClient(ip, **client_params)
-        try:
-            linux_client.validate_authentication()
-        except Exception:
-            LOG.exception('Initializing SSH connection to %s failed', ip)
-            self._log_console_output()
-            raise
-
-        return linux_client
-
     def _migrate_share(self, share_id, dest_host, status, force_host_assisted,
                        client=None):
         client = client or self.shares_admin_v2_client
@@ -264,3 +493,21 @@
         self.addCleanup(self.shares_admin_v2_client.delete_share_type,
                         share_type['share_type']['id'])
         return share_type
+
+    def _create_centos_based_glance_image(self):
+        imagepath = mkstemp(suffix='.qcow2')[1]
+        imagefile = open(imagepath, 'wb+')
+        image_response = urlopen('http://cloud.centos.org/centos/7/images/' +
+                                 'CentOS-7-x86_64-GenericCloud.qcow2')
+
+        LOG.info('Downloading CentOS7 image')
+        while True:
+            imagecopy = image_response.read(100 * 1024 * 1024)
+            if imagecopy == '':
+                break
+            imagefile.write(imagecopy)
+
+        imagefile.close()
+
+        LOG.info('Creating Glance image using the downloaded image file')
+        return self._image_create('centos', 'bare', imagepath, 'qcow2')
diff --git a/manila_tempest_tests/tests/scenario/test_share_basic_ops.py b/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
index a72d538..32fd735 100644
--- a/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
+++ b/manila_tempest_tests/tests/scenario/test_share_basic_ops.py
@@ -16,10 +16,7 @@
 import ddt
 
 from oslo_log import log as logging
-from tempest.common import waiters
 from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib.common.utils import test_utils
 from tempest.lib import exceptions
 import testtools
 from testtools import testcase as tc
@@ -29,11 +26,7 @@
 from manila_tempest_tests.tests.scenario import manager_share as manager
 from manila_tempest_tests import utils
 
-from tempfile import mkstemp
-from urllib2 import urlopen
-
 CONF = config.CONF
-
 LOG = logging.getLogger(__name__)
 
 
@@ -50,225 +43,6 @@
      * Mount share
      * Terminate the instance
     """
-    protocol = None
-    ip_version = 4
-
-    @property
-    def use_ipv6(self):
-        return self.ip_version == 6
-
-    def setUp(self):
-        super(ShareBasicOpsBase, self).setUp()
-        if self.use_ipv6 and not CONF.share.run_ipv6_tests:
-            raise self.skipException("IPv6 tests are disabled")
-        base.verify_test_has_appropriate_tags(self)
-        self.image_ref = None
-        # Setup image and flavor the test instance
-        # Support both configured and injected values
-        self.floatings = {}
-        if self.protocol not in CONF.share.enable_protocols:
-            message = "%s tests are disabled" % self.protocol
-            raise self.skipException(message)
-        if self.protocol not in CONF.share.enable_ip_rules_for_protocols:
-            message = ("%s tests for access rules other than IP are disabled" %
-                       self.protocol)
-            raise self.skipException(message)
-        if not hasattr(self, 'flavor_ref'):
-            self.flavor_ref = CONF.share.client_vm_flavor_ref
-
-        if CONF.share.image_with_share_tools == 'centos':
-            self.image_ref = self._create_centos_based_glance_image()
-        elif CONF.share.image_with_share_tools:
-            images = self.compute_images_client.list_images()["images"]
-            for img in images:
-                if img["name"] == CONF.share.image_with_share_tools:
-                    self.image_ref = img['id']
-                    break
-            if not self.image_ref:
-                msg = ("Image %s not found" %
-                       CONF.share.image_with_share_tools)
-                raise exceptions.InvalidConfiguration(message=msg)
-        self.ssh_user = CONF.share.image_username
-        LOG.debug('Starting test for i:{image}, f:{flavor}. '
-                  'user: {ssh_user}'.format(
-                      image=self.image_ref, flavor=self.flavor_ref,
-                      ssh_user=self.ssh_user))
-        self.security_group = self._create_security_group()
-        self.create_share_network()
-
-    def boot_instance(self, wait_until="ACTIVE"):
-        self.keypair = self.create_keypair()
-        security_groups = [{'name': self.security_group['name']}]
-        create_kwargs = {
-            'key_name': self.keypair['name'],
-            'security_groups': security_groups,
-            'wait_until': wait_until,
-            'networks': [{'uuid': self.net['id']}, ],
-        }
-        instance = self.create_server(
-            image_id=self.image_ref, flavor=self.flavor_ref, **create_kwargs)
-        return instance
-
-    def init_ssh(self, instance):
-        if self.use_ipv6:
-            server_ip = self._get_ipv6_server_ip(instance)
-        else:
-            # Obtain a floating IP
-            floating_ip = (
-                self.compute_floating_ips_client.create_floating_ip()
-                ['floating_ip'])
-            self.floatings[instance['id']] = floating_ip
-            self.addCleanup(
-                test_utils.call_and_ignore_notfound_exc,
-                self.compute_floating_ips_client.delete_floating_ip,
-                floating_ip['id'])
-            # Attach a floating IP
-            self.compute_floating_ips_client.associate_floating_ip_to_server(
-                floating_ip['ip'], instance['id'])
-            server_ip = floating_ip['ip']
-        self.assertIsNotNone(server_ip)
-        # Check ssh
-        ssh_client = self.get_remote_client(
-            server_or_ip=server_ip,
-            username=self.ssh_user,
-            private_key=self.keypair['private_key'])
-
-        # NOTE(u_glide): Workaround for bug #1465682
-        ssh_client = ssh_client.ssh_client
-
-        self.share = self.shares_client.get_share(self.share['id'])
-        return ssh_client
-
-    def mount_share(self, location, ssh_client, target_dir=None):
-        raise NotImplementedError
-
-    def umount_share(self, ssh_client, target_dir=None):
-        target_dir = target_dir or "/mnt"
-        ssh_client.exec_command("sudo umount %s" % target_dir)
-
-    def write_data(self, data, ssh_client):
-        ssh_client.exec_command("echo \"%s\" | sudo tee /mnt/t1 && sudo sync" %
-                                data)
-
-    def read_data(self, ssh_client):
-        data = ssh_client.exec_command("sudo cat /mnt/t1")
-        return data.rstrip()
-
-    def migrate_share(self, share_id, dest_host, status, force_host_assisted):
-        share = self._migrate_share(
-            share_id, dest_host, status, force_host_assisted,
-            self.shares_admin_v2_client)
-        return share
-
-    def migration_complete(self, share_id, dest_host):
-        return self._migration_complete(share_id, dest_host)
-
-    def create_share_network(self):
-        self.net = self._create_network(namestart="manila-share")
-        self.subnet = self._create_subnet(
-            network=self.net,
-            namestart="manila-share-sub",
-            ip_version=self.ip_version,
-            use_default_subnetpool=self.use_ipv6)
-        router = self._get_router()
-        self._create_router_interface(subnet_id=self.subnet['id'],
-                                      router_id=router['id'])
-        self.share_net = self._create_share_network(
-            neutron_net_id=self.net['id'],
-            neutron_subnet_id=self.subnet['id'],
-            name=data_utils.rand_name("sn-name"))
-
-    def _get_ipv6_server_ip(self, instance):
-        for net_list in instance['addresses'].values():
-            for net_data in net_list:
-                if net_data['version'] == 6:
-                    return net_data['addr']
-
-    def _get_share_type(self):
-        if CONF.share.default_share_type_name:
-            return self.shares_client.get_share_type(
-                CONF.share.default_share_type_name)['share_type']
-        return self._create_share_type(
-            data_utils.rand_name("share_type"),
-            extra_specs={
-                'snapshot_support': CONF.share.capability_snapshot_support,
-                'driver_handles_share_servers': CONF.share.multitenancy_enabled
-            },)['share_type']
-
-    def create_share(self, **kwargs):
-        kwargs.update({
-            'share_protocol': self.protocol,
-        })
-        if not ('share_type_id' in kwargs or 'snapshot_id' in kwargs):
-            kwargs.update({'share_type_id': self._get_share_type()['id']})
-        if CONF.share.multitenancy_enabled:
-            kwargs.update({'share_network_id': self.share_net['id']})
-        self.share = self._create_share(**kwargs)
-        return self.share
-
-    def allow_access_ip(self, share_id, ip=None, instance=None,
-                        access_level="rw", cleanup=True, snapshot=None):
-        if instance and not ip:
-            try:
-                net_addresses = instance['addresses']
-                first_address = net_addresses.values()[0][0]
-                ip = first_address['addr']
-            except Exception:
-                LOG.debug("Instance: %s", instance)
-                # In case on an error ip will be still none
-                LOG.exception("Instance does not have a valid IP address."
-                              "Falling back to default")
-        if not ip:
-            ip = '0.0.0.0/0'
-
-        if snapshot:
-            self._allow_access_snapshot(snapshot['id'], access_type='ip',
-                                        access_to=ip, cleanup=cleanup)
-        else:
-            return self._allow_access(share_id, access_type='ip',
-                                      access_level=access_level, access_to=ip,
-                                      cleanup=cleanup,
-                                      client=self.shares_v2_client)
-
-    def deny_access(self, share_id, access_rule_id):
-        self._deny_access(share_id, access_rule_id)
-
-    def provide_access_to_auxiliary_instance(self, instance, share=None,
-                                             snapshot=None, access_level='rw'):
-        share = share or self.share
-        if self.protocol.lower() == 'cifs':
-            return self.allow_access_ip(
-                share['id'], instance=instance, cleanup=False,
-                snapshot=snapshot, access_level=access_level)
-        elif not CONF.share.multitenancy_enabled:
-            if self.use_ipv6:
-                server_ip = self._get_ipv6_server_ip(instance)
-            else:
-                server_ip = (CONF.share.override_ip_for_nfs_access or
-                             self.floatings[instance['id']]['ip'])
-            self.assertIsNotNone(server_ip)
-            return self.allow_access_ip(
-                share['id'], ip=server_ip,
-                instance=instance, cleanup=False, snapshot=snapshot,
-                access_level=access_level)
-        elif (CONF.share.multitenancy_enabled and
-              self.protocol.lower() == 'nfs'):
-            return self.allow_access_ip(
-                share['id'], instance=instance, cleanup=False,
-                snapshot=snapshot, access_level=access_level)
-
-    def wait_for_active_instance(self, instance_id):
-        waiters.wait_for_server_status(
-            self.os_primary.servers_client, instance_id, "ACTIVE")
-        return self.os_primary.servers_client.show_server(
-            instance_id)["server"]
-
-    def _ping_export_location(self, export, ssh_client):
-        ip, version = self.get_ip_and_version_from_export_location(export)
-        if version == 6:
-            ssh_client.exec_command("ping6 -c 1 %s" % ip)
-        else:
-            ssh_client.exec_command("ping -c 1 %s" % ip)
 
     def get_ip_and_version_from_export_location(self, export):
         export = export.replace('[', '').replace(']', '')
@@ -284,6 +58,13 @@
             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:
+            remote_client.exec_command("ping6 -c 1 %s" % ip)
+        else:
+            remote_client.exec_command("ping -c 1 %s" % ip)
+
     def _get_export_locations_according_to_ip_version(
             self, all_locations, error_on_invalid_ip_version):
         locations = [
@@ -297,6 +78,21 @@
             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_share_export_locations(self, share):
 
         if utils.is_microversion_lt(CONF.share.max_api_microversion, "2.9"):
@@ -308,23 +104,12 @@
 
         return locations
 
-    def _create_centos_based_glance_image(self):
-        imagepath = mkstemp(suffix='.qcow2')[1]
-        imagefile = open(imagepath, 'wb+')
-        image_response = urlopen('http://cloud.centos.org/centos/7/images/' +
-                                 'CentOS-7-x86_64-GenericCloud.qcow2')
+    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]
 
-        LOG.info('Downloading CentOS7 image')
-        while True:
-            imagecopy = image_response.read(100 * 1024 * 1024)
-            if imagecopy == '':
-                break
-            imagefile.write(imagecopy)
-
-        imagefile.close()
-
-        LOG.info('Creating Glance image using the downloaded image file')
-        return self._image_create('centos', 'bare', imagepath, 'qcow2')
+        return locations
 
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_mount_share_one_vm(self):
@@ -332,19 +117,12 @@
         self.create_share()
         locations = self._get_user_export_locations(self.share)
         instance = self.wait_for_active_instance(instance["id"])
-        ssh_client = self.init_ssh(instance)
+        remote_client = self.init_remote_client(instance)
         self.provide_access_to_auxiliary_instance(instance)
 
         for location in locations:
-            self.mount_share(location, ssh_client)
-            self.umount_share(ssh_client)
-
-    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
+            self.mount_share(location, remote_client)
+            self.umount_share(remote_client)
 
     @tc.attr(base.TAG_NEGATIVE, base.TAG_BACKEND)
     def test_write_with_ro_access(self):
@@ -356,20 +134,21 @@
         location = self._get_user_export_locations(self.share)[0]
         instance = self.wait_for_active_instance(instance["id"])
 
-        ssh_client_inst = self.init_ssh(instance)
+        remote_client_inst = self.init_remote_client(instance)
 
         # First, check if write works RW access.
         acc_rule_id = self.provide_access_to_auxiliary_instance(instance)['id']
-        self.mount_share(location, ssh_client_inst)
-        self.write_data(test_data, ssh_client_inst)
+        self.mount_share(location, remote_client_inst)
+        self.write_data_to_mounted_share(test_data, remote_client_inst)
         self.deny_access(self.share['id'], acc_rule_id)
 
         self.provide_access_to_auxiliary_instance(instance, access_level='ro')
-        self.addCleanup(self.umount_share, ssh_client_inst)
+        self.addCleanup(self.umount_share, remote_client_inst)
 
         # Test if write with RO access fails.
         self.assertRaises(exceptions.SSHExecCommandFailed,
-                          self.write_data, test_data, ssh_client_inst)
+                          self.write_data_to_mounted_share,
+                          test_data, remote_client_inst)
 
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     def test_read_write_two_vms(self):
@@ -385,23 +164,23 @@
         instance2 = self.wait_for_active_instance(instance2["id"])
 
         # Write data to first VM
-        ssh_client_inst1 = self.init_ssh(instance1)
+        remote_client_inst1 = self.init_remote_client(instance1)
         self.provide_access_to_auxiliary_instance(instance1)
 
-        self.mount_share(location, ssh_client_inst1)
+        self.mount_share(location, remote_client_inst1)
         self.addCleanup(self.umount_share,
-                        ssh_client_inst1)
-        self.write_data(test_data, ssh_client_inst1)
+                        remote_client_inst1)
+        self.write_data_to_mounted_share(test_data, remote_client_inst1)
 
         # Read from second VM
-        ssh_client_inst2 = self.init_ssh(instance2)
-        if not CONF.share.override_ip_for_nfs_access or self.use_ipv6:
+        remote_client_inst2 = self.init_remote_client(instance2)
+        if not CONF.share.override_ip_for_nfs_access or self.ipv6_enabled:
             self.provide_access_to_auxiliary_instance(instance2)
 
-        self.mount_share(location, ssh_client_inst2)
+        self.mount_share(location, remote_client_inst2)
         self.addCleanup(self.umount_share,
-                        ssh_client_inst2)
-        data = self.read_data(ssh_client_inst2)
+                        remote_client_inst2)
+        data = self.read_data_from_mounted_share(remote_client_inst2)
         self.assertEqual(test_data, data)
 
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
@@ -425,6 +204,10 @@
             raise self.skipException("Only NFS protocol supported "
                                      "at this moment.")
 
+        if self.ipv6_enabled:
+            raise self.skipException("Share Migration using IPv6 is not "
+                                     "supported at this moment.")
+
         pools = self.shares_admin_v2_client.list_pools(detail=True)['pools']
 
         if len(pools) < 2:
@@ -448,29 +231,29 @@
 
         dest_pool = dest_pool['name']
 
-        ssh_client = self.init_ssh(instance)
+        remote_client = self.init_remote_client(instance)
         self.provide_access_to_auxiliary_instance(instance)
 
-        self.mount_share(exports[0], ssh_client)
+        self.mount_share(exports[0], remote_client)
 
-        ssh_client.exec_command("sudo mkdir -p /mnt/f1")
-        ssh_client.exec_command("sudo mkdir -p /mnt/f2")
-        ssh_client.exec_command("sudo mkdir -p /mnt/f3")
-        ssh_client.exec_command("sudo mkdir -p /mnt/f4")
-        ssh_client.exec_command("sudo mkdir -p /mnt/f1/ff1")
-        ssh_client.exec_command("sleep 1")
-        ssh_client.exec_command(
+        remote_client.exec_command("sudo mkdir -p /mnt/f1")
+        remote_client.exec_command("sudo mkdir -p /mnt/f2")
+        remote_client.exec_command("sudo mkdir -p /mnt/f3")
+        remote_client.exec_command("sudo mkdir -p /mnt/f4")
+        remote_client.exec_command("sudo mkdir -p /mnt/f1/ff1")
+        remote_client.exec_command("sleep 1")
+        remote_client.exec_command(
             "sudo dd if=/dev/zero of=/mnt/f1/1m1.bin bs=1M count=1")
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo dd if=/dev/zero of=/mnt/f2/1m2.bin bs=1M count=1")
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo dd if=/dev/zero of=/mnt/f3/1m3.bin bs=1M count=1")
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo dd if=/dev/zero of=/mnt/f4/1m4.bin bs=1M count=1")
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo dd if=/dev/zero of=/mnt/f1/ff1/1m5.bin bs=1M count=1")
-        ssh_client.exec_command("sudo chmod -R 555 /mnt/f3")
-        ssh_client.exec_command("sudo chmod -R 777 /mnt/f4")
+        remote_client.exec_command("sudo chmod -R 555 /mnt/f3")
+        remote_client.exec_command("sudo chmod -R 777 /mnt/f4")
 
         task_state = (constants.TASK_STATE_DATA_COPYING_COMPLETED
                       if force_host_assisted
@@ -482,10 +265,10 @@
         if force_host_assisted:
             self.assertRaises(
                 exceptions.SSHExecCommandFailed,
-                ssh_client.exec_command,
+                remote_client.exec_command,
                 "dd if=/dev/zero of=/mnt/f1/1m6.bin bs=1M count=1")
 
-        self.umount_share(ssh_client)
+        self.umount_share(remote_client)
 
         self.share = self.migration_complete(self.share['id'], dest_pool)
 
@@ -496,11 +279,11 @@
         self.assertEqual(constants.TASK_STATE_MIGRATION_SUCCESS,
                          self.share['task_state'])
 
-        self.mount_share(new_exports[0], ssh_client)
+        self.mount_share(new_exports[0], remote_client)
 
-        output = ssh_client.exec_command("ls -lRA --ignore=lost+found /mnt")
+        output = remote_client.exec_command("ls -lRA --ignore=lost+found /mnt")
 
-        self.umount_share(ssh_client)
+        self.umount_share(remote_client)
 
         self.assertIn('1m1.bin', output)
         self.assertIn('1m2.bin', output)
@@ -508,21 +291,6 @@
         self.assertIn('1m4.bin', output)
         self.assertIn('1m5.bin', output)
 
-    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
-
     @tc.attr(base.TAG_POSITIVE, base.TAG_BACKEND)
     @testtools.skipUnless(
         CONF.share.run_snapshot_tests, "Snapshot tests are disabled.")
@@ -540,7 +308,7 @@
         self.addCleanup(self.servers_client.delete_server, instance['id'])
 
         # 3 - SSH to UVM, ok, connected
-        ssh_client = self.init_ssh(instance)
+        remote_client = self.init_remote_client(instance)
 
         # 4 - Provide RW access to S1, ok, provided
         self.provide_access_to_auxiliary_instance(instance, parent_share)
@@ -548,20 +316,20 @@
         # 5 - Try mount S1 to UVM, ok, mounted
         user_export_location = self._get_user_export_locations(parent_share)[0]
         parent_share_dir = "/mnt/parent"
-        ssh_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
+        remote_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
 
-        self.mount_share(user_export_location, ssh_client, parent_share_dir)
-        self.addCleanup(self.umount_share, ssh_client, parent_share_dir)
+        self.mount_share(user_export_location, remote_client, parent_share_dir)
+        self.addCleanup(self.umount_share, remote_client, parent_share_dir)
 
         # 6 - Create "file1", ok, created
-        ssh_client.exec_command("sudo touch %s/file1" % parent_share_dir)
+        remote_client.exec_command("sudo touch %s/file1" % parent_share_dir)
 
         # 7 - Create snapshot SS1 from S1, ok, created
         snapshot = self._create_snapshot(parent_share['id'])
 
         # 8 - Create "file2" in share S1 - ok, created. We expect that
         # snapshot will not contain any data created after snapshot creation.
-        ssh_client.exec_command("sudo touch %s/file2" % parent_share_dir)
+        remote_client.exec_command("sudo touch %s/file2" % parent_share_dir)
 
         # 9 - Create share S2 from SS1, ok, created
         child_share = self.create_share(snapshot_id=snapshot["id"])
@@ -570,37 +338,40 @@
         #      did not get access rules from parent share.
         user_export_location = self._get_user_export_locations(child_share)[0]
         child_share_dir = "/mnt/child"
-        ssh_client.exec_command("sudo mkdir -p %s" % child_share_dir)
+        remote_client.exec_command("sudo mkdir -p %s" % child_share_dir)
 
         self.assertRaises(
             exceptions.SSHExecCommandFailed,
             self.mount_share,
-            user_export_location, ssh_client, child_share_dir,
+            user_export_location, remote_client, child_share_dir,
         )
 
         # 11 - Provide RW access to S2, ok, provided
         self.provide_access_to_auxiliary_instance(instance, child_share)
 
         # 12 - Try mount S2, ok, mounted
-        self.mount_share(user_export_location, ssh_client, child_share_dir)
-        self.addCleanup(self.umount_share, ssh_client, child_share_dir)
+        self.mount_share(user_export_location, remote_client, child_share_dir)
+        self.addCleanup(self.umount_share, remote_client, child_share_dir)
 
         # 13 - List files on S2, only "file1" exists
-        output = ssh_client.exec_command("sudo ls -lRA %s" % child_share_dir)
+        output = remote_client.exec_command(
+            "sudo ls -lRA %s" % child_share_dir)
         self.assertIn('file1', output)
         self.assertNotIn('file2', output)
 
         # 14 - Create file3 on S2, ok, file created
-        ssh_client.exec_command("sudo touch %s/file3" % child_share_dir)
+        remote_client.exec_command("sudo touch %s/file3" % child_share_dir)
 
         # 15 - List files on S1, two files exist - "file1" and "file2"
-        output = ssh_client.exec_command("sudo ls -lRA %s" % parent_share_dir)
+        output = remote_client.exec_command(
+            "sudo ls -lRA %s" % parent_share_dir)
         self.assertIn('file1', output)
         self.assertIn('file2', output)
         self.assertNotIn('file3', output)
 
         # 16 - List files on S2, two files exist - "file1" and "file3"
-        output = ssh_client.exec_command("sudo ls -lRA %s" % child_share_dir)
+        output = remote_client.exec_command(
+            "sudo ls -lRA %s" % child_share_dir)
         self.assertIn('file1', output)
         self.assertNotIn('file2', output)
         self.assertIn('file3', output)
@@ -625,7 +396,7 @@
         self.addCleanup(self.servers_client.delete_server, instance['id'])
 
         # 3 - SSH to UVM, ok, connected
-        ssh_client = self.init_ssh(instance)
+        remote_client = self.init_remote_client(instance)
 
         # 4 - Provide RW access to S1, ok, provided
         self.provide_access_to_auxiliary_instance(instance, parent_share)
@@ -634,21 +405,21 @@
         user_export_location = self._get_user_export_locations(parent_share)[0]
         parent_share_dir = "/mnt/parent"
         snapshot_dir = "/mnt/snapshot_dir"
-        ssh_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
-        ssh_client.exec_command("sudo mkdir -p %s" % snapshot_dir)
+        remote_client.exec_command("sudo mkdir -p %s" % parent_share_dir)
+        remote_client.exec_command("sudo mkdir -p %s" % snapshot_dir)
 
-        self.mount_share(user_export_location, ssh_client, parent_share_dir)
-        self.addCleanup(self.umount_share, ssh_client, parent_share_dir)
+        self.mount_share(user_export_location, remote_client, parent_share_dir)
+        self.addCleanup(self.umount_share, remote_client, parent_share_dir)
 
         # 6 - Create "file1", ok, created
-        ssh_client.exec_command("sudo touch %s/file1" % parent_share_dir)
+        remote_client.exec_command("sudo touch %s/file1" % parent_share_dir)
 
         # 7 - Create snapshot SS1 from S1, ok, created
         snapshot = self._create_snapshot(parent_share['id'])
 
         # 8 - Create "file2" in share S1 - ok, created. We expect that
         # snapshot will not contain any data created after snapshot creation.
-        ssh_client.exec_command("sudo touch %s/file2" % parent_share_dir)
+        remote_client.exec_command("sudo touch %s/file2" % parent_share_dir)
 
         # 9 - Allow access to SS1
         self.provide_access_to_auxiliary_instance(instance, snapshot=snapshot)
@@ -656,45 +427,45 @@
         # 10 - Mount SS1
         user_export_location = self._get_user_export_locations(
             snapshot=snapshot)[0]
-        self.mount_share(user_export_location, ssh_client, snapshot_dir)
-        self.addCleanup(self.umount_share, ssh_client, snapshot_dir)
+        self.mount_share(user_export_location, remote_client, snapshot_dir)
+        self.addCleanup(self.umount_share, remote_client, snapshot_dir)
 
         # 11 - List files on SS1, only "file1" exists
         # NOTE(lseki): using ls without recursion to avoid permission denied
         #              error while listing lost+found directory on LVM volumes
-        output = ssh_client.exec_command("sudo ls -lA %s" % snapshot_dir)
+        output = remote_client.exec_command("sudo ls -lA %s" % snapshot_dir)
         self.assertIn('file1', output)
         self.assertNotIn('file2', output)
 
         # 12 - Try to create a file on SS1, should fail
         self.assertRaises(
             exceptions.SSHExecCommandFailed,
-            ssh_client.exec_command,
+            remote_client.exec_command,
             "sudo touch %s/file3" % snapshot_dir)
 
 
 class TestShareBasicOpsNFS(ShareBasicOpsBase):
     protocol = "nfs"
 
-    def mount_share(self, location, ssh_client, target_dir=None):
+    def mount_share(self, location, remote_client, target_dir=None):
 
-        self._ping_export_location(location, ssh_client)
+        self._ping_host_from_export_location(location, remote_client)
 
         target_dir = target_dir or "/mnt"
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo mount -vt nfs \"%s\" %s" % (location, target_dir))
 
 
 class TestShareBasicOpsCIFS(ShareBasicOpsBase):
     protocol = "cifs"
 
-    def mount_share(self, location, ssh_client, target_dir=None):
+    def mount_share(self, location, remote_client, target_dir=None):
 
-        self._ping_export_location(location, ssh_client)
+        self._ping_host_from_export_location(location, remote_client)
 
         location = location.replace("\\", "/")
         target_dir = target_dir or "/mnt"
-        ssh_client.exec_command(
+        remote_client.exec_command(
             "sudo mount.cifs \"%s\" %s -o guest" % (location, target_dir)
         )