예제 #1
0
    def wait_for_status(self, res_id, get_status, wait_status, timeout=60,
                        stop_statuses=None):
        LOG.debug("Waiting for status change")
        delay = 1
        stop_statuses = [s.lower() for s in (stop_statuses or [])]
        if 'error' not in stop_statuses:
            stop_statuses.append('error')
        while delay < timeout:
            actual_status = get_status(res_id).lower()
            LOG.debug("Expected status is '%s', actual - '%s', "
                      "stop statuses - %s",
                      wait_status, actual_status, stop_statuses)
            if actual_status in stop_statuses:
                LOG.debug("Stop status reached, exit")
                raise exception.TimeoutException(
                    get_status(res_id).lower(),
                    wait_status, "Timed out waiting for state change")
            elif actual_status == wait_status.lower():
                LOG.debug("Expected status reached, exit")
                break

            LOG.debug("Expected status NOT reached, waiting")

            time.sleep(delay)
            delay *= 2
        else:
            LOG.debug("Timed out waiting for state change")
            raise exception.TimeoutException(
                get_status(res_id).lower(),
                wait_status, "Timed out waiting for state change")
예제 #2
0
    def test_tries_to_boot_vm_on_all_nodes(self, associate_floatingip,
                                           prepare_networks):

        compute_hosts = ['host1', 'host2', 'host3']
        num_computes = len(compute_hosts)
        instance_body = {
            'availability_zone': 'somezone',
            'name': 'vm1',
            'id': 'some-id'
        }
        one_instance = {
            utils.INSTANCES_TYPE: {
                'some_id': {
                    utils.INSTANCE_BODY: instance_body,
                }
            }
        }

        dst_compute = mock.Mock()
        dst_compute.get_compute_hosts.return_value = compute_hosts
        dst_compute.deploy.side_effect = exception.TimeoutException(
            None, None, None)

        dst_cloud = mock.Mock()
        dst_cloud.resources = {
            utils.COMPUTE_RESOURCE: dst_compute,
            utils.NETWORK_RESOURCE: mock.Mock(),
            utils.IDENTITY_RESOURCE: mock.Mock(),
        }

        tr_inst = transport_instance.TransportInstance(mock.MagicMock())
        tr_inst.cfg = mock.MagicMock()
        tr_inst.cfg.migrate.keep_ip = True
        tr_inst.cfg.migrate.keep_floatingip = True

        tr_inst.dst_cloud = dst_cloud

        self.assertRaises(transport_instance.DestinationCloudNotOperational,
                          tr_inst.deploy_instance_on_random_host, one_instance,
                          'somezone')
        self.assertEqual(associate_floatingip.call_count, num_computes)
        self.assertEqual(prepare_networks.call_count, num_computes)
        self.assertEqual(dst_compute.deploy.call_count, num_computes)
예제 #3
0
def wait_for_condition(condition_fn, *args, **kwargs):
    """
    Periodically calls condition_fn function passing args as positional
    arguments and kwargs as keyword arguments and terminate when this function
    will return True.
    If after timeout seconds function didn't terminate, TimeoutException is
    raised.
    :param condition_fn: predicate function
    :param timeout: for how many seconds to wait for condition_fn to return
                    True before raising TimeoutException
    :raise TimeoutException: when function didn't terminate after timeout
                             seconds
    """
    timeout = kwargs.pop('timeout', 60)
    delay = 1
    while delay <= timeout:
        if condition_fn(*args, **kwargs):
            break
        time.sleep(delay)
        delay *= 2
    else:
        raise exception.TimeoutException(None, None, "Timeout exp")