Merge "Move wait_for_server_termination from servers_client"

This commit is contained in:
Jenkins
2015-08-21 02:10:43 +00:00
committed by Gerrit Code Review
21 changed files with 83 additions and 62 deletions

View File

@@ -129,7 +129,8 @@ class BaseComputeTest(tempest.test.BaseTestCase):
for server in cls.servers:
try:
cls.servers_client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(cls.servers_client,
server['id'])
except Exception:
LOG.exception('Waiting for deletion of server %s failed'
% server['id'])
@@ -150,7 +151,8 @@ class BaseComputeTest(tempest.test.BaseTestCase):
except Exception as exc:
LOG.exception(exc)
cls.servers_client.delete_server(cls.server_id)
cls.servers_client.wait_for_server_termination(cls.server_id)
waiters.wait_for_server_termination(cls.servers_client,
cls.server_id)
cls.server_id = None
raise
@@ -300,7 +302,8 @@ class BaseComputeTest(tempest.test.BaseTestCase):
if server_id:
try:
cls.servers_client.delete_server(server_id)
cls.servers_client.wait_for_server_termination(server_id)
waiters.wait_for_server_termination(cls.servers_client,
server_id)
except Exception:
LOG.exception('Failed to delete server %s' % server_id)
@@ -316,7 +319,8 @@ class BaseComputeTest(tempest.test.BaseTestCase):
"""Deletes an existing server and waits for it to be gone."""
try:
cls.servers_client.delete_server(server_id)
cls.servers_client.wait_for_server_termination(server_id)
waiters.wait_for_server_termination(cls.servers_client,
server_id)
except Exception:
LOG.exception('Failed to delete server %s' % server_id)

View File

@@ -50,7 +50,7 @@ class ImagesNegativeTestJSON(base.BaseV2ComputeTest):
# Delete server before trying to create server
self.servers_client.delete_server(server['id'])
self.servers_client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.servers_client, server['id'])
# Create a new image after server is deleted
name = data_utils.rand_name('image')
meta = {'image_type': 'test'}

View File

@@ -123,7 +123,7 @@ class SecurityGroupsTestJSON(base.BaseSecurityGroupsTest):
# Shutdown the server and then verify we can destroy the
# security groups, since no active server instance is using them
self.servers_client.delete_server(server_id)
self.servers_client.wait_for_server_termination(server_id)
waiters.wait_for_server_termination(self.servers_client, server_id)
self.client.delete_security_group(sg['id'])
self.client.delete_security_group(sg2['id'])

View File

@@ -21,6 +21,7 @@ import testtools
from tempest.api.compute import base
from tempest.common.utils import data_utils
from tempest.common.utils.linux import remote_client
from tempest.common import waiters
from tempest import config
from tempest import test
@@ -178,7 +179,8 @@ class ServersTestJSON(base.BaseV2ComputeTest):
# we're OK.
def cleanup_server():
self.client.delete_server(server_multi_nics['id'])
self.client.wait_for_server_termination(server_multi_nics['id'])
waiters.wait_for_server_termination(self.client,
server_multi_nics['id'])
self.addCleanup(cleanup_server)
@@ -218,7 +220,8 @@ class ServersTestJSON(base.BaseV2ComputeTest):
def cleanup_server():
self.client.delete_server(server_multi_nics['id'])
self.client.wait_for_server_termination(server_multi_nics['id'])
waiters.wait_for_server_termination(self.client,
server_multi_nics['id'])
self.addCleanup(cleanup_server)

View File

@@ -38,14 +38,14 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
# Delete a server while it's VM state is Building
server = self.create_test_server(wait_until='BUILD')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('925fdfb4-5b13-47ea-ac8a-c36ae6fddb05')
def test_delete_active_server(self):
# Delete a server while it's VM state is Active
server = self.create_test_server(wait_until='ACTIVE')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('546d368c-bb6c-4645-979a-83ed16f3a6be')
def test_delete_server_while_in_shutoff_state(self):
@@ -54,7 +54,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
self.client.stop(server['id'])
waiters.wait_for_server_status(self.client, server['id'], 'SHUTOFF')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('943bd6e8-4d7a-4904-be83-7a6cc2d4213b')
@testtools.skipUnless(CONF.compute_feature_enabled.pause,
@@ -65,7 +65,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
self.client.pause_server(server['id'])
waiters.wait_for_server_status(self.client, server['id'], 'PAUSED')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('1f82ebd3-8253-4f4e-b93f-de9b7df56d8b')
@testtools.skipUnless(CONF.compute_feature_enabled.suspend,
@@ -76,7 +76,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
self.client.suspend_server(server['id'])
waiters.wait_for_server_status(self.client, server['id'], 'SUSPENDED')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('bb0cb402-09dd-4947-b6e5-5e7e1cfa61ad')
@testtools.skipUnless(CONF.compute_feature_enabled.shelve,
@@ -95,7 +95,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
waiters.wait_for_server_status(self.client, server['id'],
'SHELVED')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('ab0c38b4-cdd8-49d3-9b92-0cb898723c01')
@testtools.skipIf(not CONF.compute_feature_enabled.resize,
@@ -107,7 +107,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
waiters.wait_for_server_status(self.client, server['id'],
'VERIFY_RESIZE')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
@test.idempotent_id('d0f3f0d6-d9b6-4a32-8da4-23015dcab23c')
@test.services('volume')
@@ -128,7 +128,7 @@ class DeleteServersTestJSON(base.BaseV2ComputeTest):
volume['id'], 'in-use')
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
waiters.wait_for_volume_status(volumes_client,
volume['id'], 'available')
@@ -152,12 +152,13 @@ class DeleteServersAdminTestJSON(base.BaseV2ComputeAdminTest):
server = self.non_admin_client.show_server(server['id'])
self.assertEqual(server['status'], 'ERROR')
self.non_admin_client.delete_server(server['id'])
self.servers_client.wait_for_server_termination(server['id'],
ignore_error=True)
waiters.wait_for_server_termination(self.servers_client,
server['id'],
ignore_error=True)
@test.idempotent_id('73177903-6737-4f27-a60c-379e8ae8cf48')
def test_admin_delete_servers_of_others(self):
# Administrator can delete servers of others
server = self.create_test_server(wait_until='ACTIVE')
self.admin_client.delete_server(server['id'])
self.servers_client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.servers_client, server['id'])

View File

@@ -17,6 +17,7 @@ from six import moves
from tempest_lib import exceptions as lib_exc
from tempest.api.compute import base
from tempest.common import waiters
from tempest import test
@@ -47,8 +48,8 @@ class ListServersNegativeTestJSON(base.BaseV2ComputeTest):
# be put into ERROR status on a quick spawn, then delete,
# as the compute node expects the instance local status
# to be spawning, not deleted. See LP Bug#1061167
cls.client.wait_for_server_termination(srv['id'],
ignore_error=True)
waiters.wait_for_server_termination(cls.client, srv['id'],
ignore_error=True)
cls.deleted_fixtures.append(srv)
@test.attr(type=['negative'])

View File

@@ -171,7 +171,7 @@ class ServersNegativeTestJSON(base.BaseV2ComputeTest):
# Rebuild and Reboot a deleted server
server = self.create_test_server()
self.client.delete_server(server['id'])
self.client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.client, server['id'])
self.assertRaises(lib_exc.NotFound,
self.client.rebuild,

View File

@@ -53,7 +53,8 @@ class VolumesV2ActionsTest(base.BaseVolumeTest):
def resource_cleanup(cls):
# Delete the test instance
cls.servers_client.delete_server(cls.server['id'])
cls.servers_client.wait_for_server_termination(cls.server['id'])
waiters.wait_for_server_termination(cls.servers_client,
cls.server['id'])
super(VolumesV2ActionsTest, cls).resource_cleanup()

View File

@@ -181,8 +181,8 @@ class VolumesV2NegativeTest(base.BaseVolumeTest):
def test_attach_volumes_with_nonexistent_volume_id(self):
srv_name = data_utils.rand_name('Instance')
server = self.create_server(srv_name)
self.addCleanup(self.servers_client.wait_for_server_termination,
server['id'])
self.addCleanup(waiters.wait_for_server_termination,
self.servers_client, server['id'])
self.addCleanup(self.servers_client.delete_server, server['id'])
waiters.wait_for_server_status(self.servers_client, server['id'],
'ACTIVE')

View File

@@ -119,6 +119,7 @@ from tempest_lib import auth
from tempest_lib import exceptions as lib_exc
import yaml
from tempest.common import waiters
from tempest import config
from tempest.services.compute.json import flavors_client
from tempest.services.compute.json import floating_ips_client
@@ -896,8 +897,8 @@ def destroy_servers(servers):
# TODO(EmilienM): disassociate floating IP from server and release it.
client.servers.delete_server(response['id'])
client.servers.wait_for_server_termination(response['id'],
ignore_error=True)
waiters.wait_for_server_termination(client.servers, response['id'],
ignore_error=True)
def create_secgroups(secgroups):

View File

@@ -15,6 +15,7 @@ import time
from oslo_log import log as logging
from tempest_lib.common.utils import misc as misc_utils
from tempest_lib import exceptions as lib_exc
from tempest import config
from tempest import exceptions
@@ -96,6 +97,25 @@ def wait_for_server_status(client, server_id, status, ready_wait=True,
old_task_state = task_state
def wait_for_server_termination(client, server_id, ignore_error=False):
"""Waits for server to reach termination."""
start_time = int(time.time())
while True:
try:
body = client.show_server(server_id)
except lib_exc.NotFound:
return
server_status = body['status']
if server_status == 'ERROR' and not ignore_error:
raise exceptions.BuildErrorException(server_id=server_id)
if int(time.time()) - start_time >= client.build_timeout:
raise exceptions.TimeoutException
time.sleep(client.build_interval)
def wait_for_image_status(client, image_id, status):
"""Waits for an image to reach a given status.

View File

@@ -96,10 +96,11 @@ class ScenarioTest(tempest.test.BaseTestCase):
def addCleanup_with_wait(self, waiter_callable, thing_id, thing_id_param,
cleanup_callable, cleanup_args=None,
cleanup_kwargs=None):
cleanup_kwargs=None, waiter_client=None):
"""Adds wait for async resource deletion at the end of cleanups
@param waiter_callable: callable to wait for the resource to delete
with the following waiter_client if specified.
@param thing_id: the id of the resource to be cleaned-up
@param thing_id_param: the name of the id param in the waiter
@param cleanup_callable: method to load pass to self.addCleanup with
@@ -115,6 +116,8 @@ class ScenarioTest(tempest.test.BaseTestCase):
'waiter_callable': waiter_callable,
thing_id_param: thing_id
}
if waiter_client:
wait_dict['client'] = waiter_client
self.cleanup_waits.append(wait_dict)
def _wait_for_cleanups(self):
@@ -172,13 +175,15 @@ class ScenarioTest(tempest.test.BaseTestCase):
server = self.servers_client.create_server(name, image, flavor,
**create_kwargs)
if wait_on_delete:
self.addCleanup(self.servers_client.wait_for_server_termination,
self.addCleanup(waiters.wait_for_server_termination,
self.servers_client,
server['id'])
self.addCleanup_with_wait(
waiter_callable=self.servers_client.wait_for_server_termination,
waiter_callable=waiters.wait_for_server_termination,
thing_id=server['id'], thing_id_param='server_id',
cleanup_callable=self.delete_wrapper,
cleanup_args=[self.servers_client.delete_server, server['id']])
cleanup_args=[self.servers_client.delete_server, server['id']],
waiter_client=self.servers_client)
if wait_on_boot:
waiters.wait_for_server_status(self.servers_client,
server_id=server['id'],

View File

@@ -109,8 +109,8 @@ class TestLargeOpsScenario(manager.ScenarioTest):
for server in self.servers:
# after deleting all servers - wait for all servers to clear
# before cleanup continues
self.addCleanupClass(self.servers_client.
wait_for_server_termination,
self.addCleanupClass(waiters.wait_for_server_termination,
self.servers_client,
server['id'])
for server in self.servers:
self.addCleanupClass(self.servers_client.delete_server,

View File

@@ -20,6 +20,7 @@ from oslo_log import log as logging
import testtools
from tempest.common.utils import data_utils
from tempest.common import waiters
from tempest import config
from tempest import exceptions
from tempest.scenario import manager
@@ -643,7 +644,7 @@ class TestNetworkBasicOps(manager.NetworkScenarioTest):
self.assertEqual(self.port_id, port_list[0]['id'])
# Delete the server.
self.servers_client.delete_server(server['id'])
self.servers_client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.servers_client, server['id'])
# Assert the port still exists on the network but is unbound from
# the deleted server.
port = self.network_client.show_port(self.port_id)['port']

View File

@@ -122,7 +122,7 @@ class TestVolumeBootPattern(manager.ScenarioTest):
def _delete_server(self, server):
self.servers_client.delete_server(server['id'])
self.servers_client.wait_for_server_termination(server['id'])
waiters.wait_for_server_termination(self.servers_client, server['id'])
def _check_content_of_written_file(self, ssh_client, expected):
actual = self._get_content(ssh_client)

View File

@@ -14,15 +14,11 @@
# License for the specific language governing permissions and limitations
# under the License.
import time
from oslo_serialization import jsonutils as json
from six.moves.urllib import parse as urllib
from tempest_lib import exceptions as lib_exc
from tempest.api_schema.response.compute.v2_1 import servers as schema
from tempest.common import service_client
from tempest import exceptions
class ServersClient(service_client.ServiceClient):
@@ -165,24 +161,6 @@ class ServersClient(service_client.ServiceClient):
self.validate_response(_schema, resp, body)
return service_client.ResponseBody(resp, body)
def wait_for_server_termination(self, server_id, ignore_error=False):
"""Waits for server to reach termination."""
start_time = int(time.time())
while True:
try:
body = self.show_server(server_id)
except lib_exc.NotFound:
return
server_status = body['status']
if server_status == 'ERROR' and not ignore_error:
raise exceptions.BuildErrorException(server_id=server_id)
if int(time.time()) - start_time >= self.build_timeout:
raise exceptions.TimeoutException
time.sleep(self.build_interval)
def list_addresses(self, server_id):
"""Lists all addresses for a server."""
resp, body = self.get("servers/%s/ips" % server_id)

View File

@@ -37,5 +37,6 @@ class ServerCreateDestroyTest(stressaction.StressAction):
self.logger.info("created %s" % server_id)
self.logger.info("deleting %s" % name)
self.manager.servers_client.delete_server(server_id)
self.manager.servers_client.wait_for_server_termination(server_id)
waiters.wait_for_server_termination(self.manager.servers_client,
server_id)
self.logger.info("deleted %s" % server_id)

View File

@@ -86,7 +86,8 @@ class FloatingStress(stressaction.StressAction):
def _destroy_vm(self):
self.logger.info("deleting %s" % self.server_id)
self.manager.servers_client.delete_server(self.server_id)
self.manager.servers_client.wait_for_server_termination(self.server_id)
waiters.wait_for_server_termination(self.manager.servers_client,
self.server_id)
self.logger.info("deleted %s" % self.server_id)
def _create_sec_group(self):

View File

@@ -59,7 +59,8 @@ class VolumeAttachDeleteTest(stressaction.StressAction):
# Step 4: delete vm
self.logger.info("deleting vm: %s" % vm_name)
self.manager.servers_client.delete_server(server_id)
self.manager.servers_client.wait_for_server_termination(server_id)
waiters.wait_for_server_termination(self.manager.servers_client,
server_id)
self.logger.info("deleted vm: %s" % server_id)
# Step 5: delete volume

View File

@@ -48,7 +48,8 @@ class VolumeVerifyStress(stressaction.StressAction):
def _destroy_vm(self):
self.logger.info("deleting server: %s" % self.server_id)
self.manager.servers_client.delete_server(self.server_id)
self.manager.servers_client.wait_for_server_termination(self.server_id)
waiters.wait_for_server_termination(self.manager.servers_client,
self.server_id)
self.logger.info("deleted server: %s" % self.server_id)
def _create_sec_group(self):

View File

@@ -17,6 +17,7 @@
from oslo_log import log as logging
from tempest import clients
from tempest.common import waiters
LOG = logging.getLogger(__name__)
@@ -34,7 +35,8 @@ def cleanup():
for s in body['servers']:
try:
admin_manager.servers_client.wait_for_server_termination(s['id'])
waiters.wait_for_server_termination(admin_manager.servers_client,
s['id'])
except Exception:
pass