def wait_for_image_status(client, image_id, status): """Waits for an image to reach a given status. The client should have a get_image(image_id) method to get the image. The client should also have build_interval and build_timeout attributes. """ image = client.get_image(image_id) start = int(time.time()) while image['status'] != status: time.sleep(client.build_interval) image = client.get_image(image_id) status_curr = image['status'] if status_curr == 'ERROR': raise exceptions.AddImageException(image_id=image_id) # check the status again to avoid a false negative where we hit # the timeout at the same time that the image reached the expected # status if status_curr == status: return if int(time.time()) - start >= client.build_timeout: message = ('Image %(image_id)s failed to reach %(status)s state' '(current state %(status_curr)s) ' 'within the required time (%(timeout)s s).' % { 'image_id': image_id, 'status': status, 'status_curr': status_curr, 'timeout': client.build_timeout }) caller = misc_utils.find_test_caller() if caller: message = '(%s) %s' % (caller, message) raise exceptions.TimeoutException(message)
def wait_for_image_status(client, image_id, status): """Waits for an image to reach a given status. The client should have a get_image(image_id) method to get the image. The client should also have build_interval and build_timeout attributes. """ resp, image = client.get_image(image_id) start = int(time.time()) while image['status'] != status: time.sleep(client.build_interval) resp, image = client.get_image(image_id) if image['status'] == 'ERROR': raise exceptions.AddImageException(image_id=image_id) # check the status again to avoid a false negative where we hit # the timeout at the same time that the image reached the expected # status if image['status'] == status: return if int(time.time()) - start >= client.build_timeout: message = ('Image %(image_id)s failed to reach %(status)s ' 'status within the required time (%(timeout)s s).' % {'image_id': image_id, 'status': status, 'timeout': client.build_timeout}) message += ' Current status: %s.' % image['status'] raise exceptions.TimeoutException(message)
def wait_for_image_status(self, image_id, status): """Waits for an image to reach a given status.""" resp, image = self.get_image(image_id) start = int(time.time()) while image['status'] != status: time.sleep(self.build_interval) resp, image = self.get_image(image_id) if image['status'] == 'ERROR': raise exceptions.AddImageException(image_id=image_id) if int(time.time()) - start >= self.build_timeout: raise exceptions.TimeoutException
def wait_for_image_status(client, image_id, status): """Waits for an image to reach a given status. The client should have a show_image(image_id) method to get the image. The client should also have build_interval and build_timeout attributes. """ if isinstance(client, images_v1_client.ImagesClient): # The 'check_image' method is used here because the show_image method # returns image details plus the image itself which is very expensive. # The 'check_image' method returns just image details. def _show_image_v1(image_id): resp = client.check_image(image_id) return common_image.get_image_meta_from_headers(resp) show_image = _show_image_v1 else: show_image = client.show_image current_status = 'An unknown status' start = int(time.time()) while int(time.time()) - start < client.build_timeout: image = show_image(image_id) # Compute image client returns response wrapped in 'image' element # which is not the case with Glance image client. if 'image' in image: image = image['image'] current_status = image['status'] if current_status == status: return if current_status.lower() == 'killed': raise exceptions.ImageKilledException(image_id=image_id, status=status) if current_status.lower() == 'error': raise exceptions.AddImageException(image_id=image_id) time.sleep(client.build_interval) message = ('Image %(image_id)s failed to reach %(status)s state ' '(current state %(current_status)s) within the required ' 'time (%(timeout)s s).' % { 'image_id': image_id, 'status': status, 'current_status': current_status, 'timeout': client.build_timeout }) caller = test_utils.find_test_caller() if caller: message = '(%s) %s' % (caller, message) raise lib_exc.TimeoutException(message)