def test_simulate_healthcheck_on_service_disabled(mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = mock.MagicMock(spec_set=MarathonServiceConfig)
    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(
        mock_service_manifest, mock_docker_client, fake_container_id, fake_mode, fake_url, False)
def test_simulate_healthcheck_on_service_disabled(mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = mock.MagicMock(spec_set=MarathonServiceConfig)
    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(mock_service_manifest,
                                           mock_docker_client,
                                           fake_container_id, fake_mode,
                                           fake_url, False)
def test_simulate_healthcheck_on_service_enabled_success(mock_run_healthcheck_on_container, mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig('fake_name', 'fake_instance', {
        'healthcheck_grace_period_seconds': 0,
    }, {})
    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    mock_run_healthcheck_on_container.return_value = True
    assert simulate_healthcheck_on_service(
        mock_service_manifest, mock_docker_client, fake_container_id, fake_mode, fake_url, True)
def test_simulate_healthcheck_on_service_enabled_partial_failure(mock_run_healthcheck_on_container, mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig('fake_name', 'fake_instance', {
        'healthcheck_grace_period_seconds': 0,
    }, {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(
        mock_service_manifest, mock_docker_client, fake_container_id, fake_mode, fake_url, True)
    # First run_healthcheck_on_container call happens silently
    assert mock_run_healthcheck_on_container.call_count == 5
    assert mock_sleep.call_count == 3
def test_simulate_healthcheck_on_service_enabled_success(
        mock_run_healthcheck_on_container, mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig(
        'fake_name', 'fake_instance', {
            'healthcheck_grace_period_seconds': 0,
        }, {})
    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    mock_run_healthcheck_on_container.return_value = True
    assert simulate_healthcheck_on_service(mock_service_manifest,
                                           mock_docker_client,
                                           fake_container_id, fake_mode,
                                           fake_url, True)
def test_simulate_healthcheck_on_service_enabled_partial_failure(
        mock_run_healthcheck_on_container, mock_sleep):
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig(
        'fake_name', 'fake_instance', {
            'healthcheck_grace_period_seconds': 0,
        }, {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(mock_service_manifest,
                                           mock_docker_client,
                                           fake_container_id, fake_mode,
                                           fake_url, True)
    # First run_healthcheck_on_container call happens silently
    assert mock_run_healthcheck_on_container.call_count == 5
    assert mock_sleep.call_count == 3
def test_simulate_healthcheck_on_service_enabled_honors_grace_period(
    mock_run_healthcheck_on_container,
    mock_time,
    mock_sleep
):
    # change time to make sure we are sufficiently past grace period
    mock_time.side_effect = [0, 2]
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig('fake_name', 'fake_instance', {
        # only one healthcheck will be performed silently
        'healthcheck_grace_period_seconds': 1,
    }, {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(
        mock_service_manifest, mock_docker_client, fake_container_id, fake_mode, fake_url, True)
    assert mock_sleep.call_count == 0
    assert mock_run_healthcheck_on_container.call_count == 2
def test_simulate_healthcheck_on_service_enabled_during_grace_period(
    mock_run_healthcheck_on_container,
    mock_time,
    mock_sleep
):
    # prevent grace period from ending
    mock_time.side_effect = [0, 0]
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig('fake_name', 'fake_instance', {
        'healthcheck_grace_period_seconds': 1,
    }, {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(
        mock_service_manifest, mock_docker_client, fake_container_id, fake_mode, fake_url, True)
    assert mock_sleep.call_count == 0
    # First run_healthcheck_on_container call happens silently
    assert mock_run_healthcheck_on_container.call_count == 2
def test_simulate_healthcheck_on_service_enabled_during_grace_period(
        mock_run_healthcheck_on_container, mock_time, mock_sleep):
    # prevent grace period from ending
    mock_time.side_effect = [0, 0]
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig(
        'fake_name', 'fake_instance', {
            'healthcheck_grace_period_seconds': 1,
        }, {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(mock_service_manifest,
                                           mock_docker_client,
                                           fake_container_id, fake_mode,
                                           fake_url, True)
    assert mock_sleep.call_count == 0
    # First run_healthcheck_on_container call happens silently
    assert mock_run_healthcheck_on_container.call_count == 2
def test_simulate_healthcheck_on_service_enabled_honors_grace_period(
        mock_run_healthcheck_on_container, mock_time, mock_sleep):
    # change time to make sure we are sufficiently past grace period
    mock_time.side_effect = [0, 2]
    mock_docker_client = mock.MagicMock(spec_set=docker.Client)
    mock_service_manifest = MarathonServiceConfig(
        'fake_name',
        'fake_instance',
        {
            # only one healthcheck will be performed silently
            'healthcheck_grace_period_seconds': 1,
        },
        {})

    fake_container_id = 'fake_container_id'
    fake_mode = 'http'
    fake_url = 'http://fake_host/fake_status_path'
    assert simulate_healthcheck_on_service(mock_service_manifest,
                                           mock_docker_client,
                                           fake_container_id, fake_mode,
                                           fake_url, True)
    assert mock_sleep.call_count == 0
    assert mock_run_healthcheck_on_container.call_count == 2