diff --git a/tempest/api/compute/admin/test_create_server.py b/tempest/api/compute/admin/test_create_server.py
index c5078ea..293e284 100644
--- a/tempest/api/compute/admin/test_create_server.py
+++ b/tempest/api/compute/admin/test_create_server.py
@@ -136,97 +136,3 @@
             servers_client=self.client)
         disks_num_eph = len(linux_client.get_disks().split('\n'))
         self.assertEqual(disks_num + 1, disks_num_eph)
-
-
-class ServersWithFlavorSwapResizeTest(base.BaseV2ComputeAdminTest):
-    """Test resizing flavor swap size"""
-
-    @classmethod
-    def setup_credentials(cls):
-        cls.prepare_instance_network()
-        super(ServersWithFlavorSwapResizeTest, cls).setup_credentials()
-
-    @classmethod
-    def setup_clients(cls):
-        super(ServersWithFlavorSwapResizeTest, cls).setup_clients()
-        cls.client = cls.servers_client
-
-    def _create_server_with_swap(self, swap=0):
-        admin_pass = self.image_ssh_password
-        validation_resources = self.get_test_validation_resources(
-            self.os_primary)
-
-        flavor_id = self.create_flavor(
-            ram=1024, vcpus=1, disk=1, swap=swap)['id']
-
-        server = self.create_test_server(
-            validatable=True,
-            validation_resources=validation_resources,
-            wait_until='ACTIVE',
-            adminPass=admin_pass,
-            flavor=flavor_id)
-
-        self.addCleanup(waiters.wait_for_server_termination,
-                        self.servers_client, server['id'])
-        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
-                        self.servers_client.delete_server,
-                        server['id'])
-
-        server = self.client.show_server(server['id'])['server']
-
-        ssh_client = self.get_ssh_client(
-            server, validation_resources, admin_pass)
-        return server, ssh_client
-
-    def _resize_server_with_new_swap(self, server, swap=0):
-        flavor_id = self.create_flavor(
-            ram=1024, vcpus=1, disk=1, swap=swap)['id']
-        self.resize_server(server['id'], flavor_id)
-
-    @decorators.idempotent_id('b2c7bcfc-bb5b-4e22-b517-c7f686b80211')
-    def test_flavor_swap_0_to_1024(self):
-        server, ssh_client = self._create_server_with_swap(swap=0)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 0)
-
-        self._resize_server_with_new_swap(server, swap=1024)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 1)
-
-        self.reboot_server(server['id'], 'hard')
-        swap_devs = len(ssh_client.get_swap_devs())
-        self.assertEqual(swap_devs, 1)
-
-    @decorators.idempotent_id('b2c7bcfc-bb5b-4e22-b517-c7f686b80212')
-    def test_flavor_swap_2048_to_1024(self):
-        server, ssh_client = self._create_server_with_swap(swap=2048)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 1)
-
-        self._resize_server_with_new_swap(server, swap=1024)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 1)
-
-        self.reboot_server(server['id'], 'hard')
-        swap_devs = len(ssh_client.get_swap_devs())
-        self.assertEqual(swap_devs, 1)
-
-    @decorators.idempotent_id('b2c7bcfc-bb5b-4e22-b517-c7f686b80213')
-    def test_flavor_swap_1024_to_0(self):
-        server, ssh_client = self._create_server_with_swap(swap=1024)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 1)
-
-        self._resize_server_with_new_swap(server, swap=0)
-        swap_devs = len(ssh_client.get_swap_devs())
-
-        self.assertEqual(swap_devs, 0)
-
-        self.reboot_server(server['id'], 'hard')
-        swap_devs = len(ssh_client.get_swap_devs())
-        self.assertEqual(swap_devs, 0)
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index bf56818..b974b52 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -18,7 +18,6 @@
 from oslo_log import log as logging
 
 from tempest.common import compute
-from tempest.common.utils.linux import remote_client
 from tempest.common import waiters
 from tempest import config
 from tempest import exceptions
@@ -733,12 +732,3 @@
         for target_host in hosts:
             if source_host != target_host:
                 return target_host
-
-    def get_ssh_client(self, server, validation_resources, admin_pass):
-        return remote_client.RemoteClient(
-            self.get_server_ip(server, validation_resources),
-            self.ssh_user,
-            admin_pass,
-            validation_resources['keypair']['private_key'],
-            server=server,
-            servers_client=self.client)
diff --git a/tempest/common/utils/linux/remote_client.py b/tempest/common/utils/linux/remote_client.py
index a84f139..79cc09c 100644
--- a/tempest/common/utils/linux/remote_client.py
+++ b/tempest/common/utils/linux/remote_client.py
@@ -244,9 +244,3 @@
         """Wrapper for tcp connectivity checks."""
         kwargs.pop('nic', None)
         return self.nc_host(host, **kwargs)
-
-    def get_swap_devs(self):
-        cmd = 'blkid'
-        data = self.exec_command(cmd)
-        devs = [dev for dev in data.splitlines() if 'TYPE="swap"' in dev]
-        return devs
