コード例 #1
0
def test_paasta_mark_for_deployment_acts_like_main(
    mock_mark_for_deployment,
    mock_validate_service_name,
):
    mock_mark_for_deployment.return_value = 42
    with raises(SystemExit) as sys_exit:
        mark_for_deployment.paasta_mark_for_deployment(fake_args)
    mock_mark_for_deployment.assert_called_once_with(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='fake-hash',
        git_url='git://false.repo/services/test_services',
    )

    assert mock_validate_service_name.called
    assert sys_exit.value.code == 42
コード例 #2
0
def test_paasta_mark_for_deployment_with_good_rollback(
    mock_get_currently_deployed_sha,
    mock_wait_for_deployment,
    mock_mark_for_deployment,
    mock_validate_service_name,
):
    class fake_args_rollback(fake_args):
        auto_rollback = True
        block = True
        timeout = 600

    mock_wait_for_deployment.side_effect = TimeoutError
    mock_get_currently_deployed_sha.return_value = "old-sha"
    assert mark_for_deployment.paasta_mark_for_deployment(fake_args_rollback) == 1
    mock_mark_for_deployment.assert_any_call(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='fake-hash',
        git_url='git://false.repo/services/test_services',
    )
    mock_mark_for_deployment.assert_any_call(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='old-sha',
        git_url='git://false.repo/services/test_services',
    )
    mock_mark_for_deployment.call_count = 2
コード例 #3
0
def step_paasta_mark_for_deployments_when(context):
    fake_args = mock.MagicMock(
        deploy_group="test_cluster.test_instance",
        service="fake_deployments_json_service",
        git_url=context.test_git_repo_dir,
        commit=context.expected_commit,
        block=False,
    )
    context.force_bounce_timestamp = format_timestamp(datetime.utcnow())
    with contextlib.nested(
        mock.patch("paasta_tools.utils.format_timestamp", autosepc=True, return_value=context.force_bounce_timestamp),
        mock.patch("paasta_tools.cli.cmds.mark_for_deployment.validate_service_name", autospec=True, return_value=True),
    ) as (mock_format_timestamp, mock_validate_service_name):
        try:
            paasta_mark_for_deployment(fake_args)
        except SystemExit:
            pass
コード例 #4
0
def step_paasta_mark_for_deployments_when(context):
    fake_args = mock.MagicMock(
        deploy_group='test_cluster.test_instance',
        service='fake_deployments_json_service',
        git_url=context.test_git_repo_dir,
        commit=context.expected_commit,
        soa_dir='fake_soa_configs',
        block=False,
        verify_image=False,
    )
    context.force_bounce_timestamp = format_timestamp(datetime.utcnow())
    with mock.patch(
        'paasta_tools.utils.format_timestamp', autospec=True,
        return_value=context.force_bounce_timestamp,
    ), mock.patch(
        'paasta_tools.cli.cmds.mark_for_deployment.validate_service_name', autospec=True,
        return_value=True,
    ):
        try:
            paasta_mark_for_deployment(fake_args)
        except SystemExit:
            pass
コード例 #5
0
def test_paasta_mark_for_deployment_acts_like_main(
    mock_get_currently_deployed_sha,
    mock_mark_for_deployment,
    mock_validate_service_name,
):
    mock_mark_for_deployment.return_value = 42
    assert mark_for_deployment.paasta_mark_for_deployment(FakeArgs) == 42
    mock_mark_for_deployment.assert_called_once_with(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4',
        git_url='git://false.repo/services/test_services',
    )
    assert mock_validate_service_name.called
コード例 #6
0
def test_paasta_mark_for_deployment_acts_like_main(
    mock_get_currently_deployed_sha,
    mock_mark_for_deployment,
    mock_validate_service_name,
):
    mock_mark_for_deployment.return_value = 42
    assert mark_for_deployment.paasta_mark_for_deployment(fake_args) == 42
    mock_mark_for_deployment.assert_called_once_with(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='fake-hash',
        git_url='git://false.repo/services/test_services',
    )
    assert mock_validate_service_name.called
コード例 #7
0
def test_paasta_mark_for_deployment_with_skips_rollback_when_same_sha(
    mock_get_currently_deployed_sha,
    mock_wait_for_deployment,
    mock_mark_for_deployment,
    mock_validate_service_name,
):
    class fake_args_rollback(fake_args):
        auto_rollback = True
        block = True
        timeout = 600

    mock_wait_for_deployment.side_effect = TimeoutError
    mock_get_currently_deployed_sha.return_value = "fake-hash"
    assert mark_for_deployment.paasta_mark_for_deployment(fake_args_rollback) == 1
    mock_mark_for_deployment.assert_called_once_with(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='fake-hash',
        git_url='git://false.repo/services/test_services',
    )
コード例 #8
0
def test_paasta_mark_for_deployment_with_good_rollback(
    mock_get_currently_deployed_sha,
    mock_do_wait_for_deployment,
    mock_mark_for_deployment,
    mock_validate_service_name,
    mock_get_slack_client,
):
    class FakeArgsRollback(FakeArgs):
        auto_rollback = True
        block = True
        timeout = 600

    mock_mark_for_deployment.return_value = 0

    def do_wait_for_deployment_side_effect(self, target_commit):
        if target_commit == FakeArgs.commit:
            self.trigger('rollback_button_clicked')
        else:
            self.trigger('deploy_finished')

    mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect

    def on_enter_rolled_back_side_effect(self):
        self.trigger('abandon_button_clicked')

    mock_get_currently_deployed_sha.return_value = "old-sha"
    with patch(
            'paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.periodically_update_slack',
            autospec=True,
    ), patch(
            'paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back',
            autospec=True,
            wraps=mark_for_deployment.MarkForDeploymentProcess.
            on_enter_rolled_back,
            side_effect=on_enter_rolled_back_side_effect,
    ):
        assert mark_for_deployment.paasta_mark_for_deployment(
            FakeArgsRollback) == 1
    print(mock_mark_for_deployment.mock_calls)
    mock_mark_for_deployment.assert_any_call(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4',
        git_url='git://false.repo/services/test_services',
    )
    mock_mark_for_deployment.assert_any_call(
        service='test_service',
        deploy_group='test_deploy_group',
        commit='old-sha',
        git_url='git://false.repo/services/test_services',
    )
    assert mock_mark_for_deployment.call_count == 2

    mock_do_wait_for_deployment.assert_any_call(
        mock.ANY,
        target_commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4',
    )
    mock_do_wait_for_deployment.assert_any_call(
        mock.ANY,
        target_commit='old-sha',
    )
    assert mock_do_wait_for_deployment.call_count == 2
コード例 #9
0
def test_paasta_mark_for_deployment_with_good_rollback(
    mock_load_system_paasta_config,
    mock_list_deploy_groups,
    mock_get_currently_deployed_sha,
    mock_do_wait_for_deployment,
    mock_mark_for_deployment,
    mock_validate_service_name,
    mock_get_slack_client,
    mock__log_audit,
    mock_periodically_update_slack,
):
    class FakeArgsRollback(FakeArgs):
        auto_rollback = True
        block = True
        timeout = 600

    mock_list_deploy_groups.return_value = ["test_deploy_groups"]
    mock_mark_for_deployment.return_value = 0

    def do_wait_for_deployment_side_effect(self, target_commit):
        if target_commit == FakeArgs.commit:
            self.trigger("rollback_button_clicked")
        else:
            self.trigger("deploy_finished")

    mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect

    def on_enter_rolled_back_side_effect(self):
        self.trigger("abandon_button_clicked")

    mock_get_currently_deployed_sha.return_value = "old-sha"
    with patch(
            "paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back",
            autospec=True,
            wraps=mark_for_deployment.MarkForDeploymentProcess.
            on_enter_rolled_back,
            side_effect=on_enter_rolled_back_side_effect,
    ):
        assert mark_for_deployment.paasta_mark_for_deployment(
            FakeArgsRollback) == 1
    mock_mark_for_deployment.assert_any_call(
        service="test_service",
        deploy_group="test_deploy_group",
        commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4",
        git_url="git://false.repo/services/test_services",
    )
    mock_mark_for_deployment.assert_any_call(
        service="test_service",
        deploy_group="test_deploy_group",
        commit="old-sha",
        git_url="git://false.repo/services/test_services",
    )
    assert mock_mark_for_deployment.call_count == 2

    mock_do_wait_for_deployment.assert_any_call(
        mock.ANY, target_commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4")
    mock_do_wait_for_deployment.assert_any_call(mock.ANY,
                                                target_commit="old-sha")
    assert mock_do_wait_for_deployment.call_count == 2
    # in normal usage, this would also be called once per m-f-d, but we mock that out above
    # so _log_audit is only called as part of handling the rollback
    assert mock__log_audit.call_count == len(
        mock_list_deploy_groups.return_value)
コード例 #10
0
def test_paasta_mark_for_deployment_with_good_rollback(
    mock_get_metrics,
    mock_load_system_paasta_config,
    mock_list_deploy_groups,
    mock_get_currently_deployed_version,
    mock_do_wait_for_deployment,
    mock_mark_for_deployment,
    mock_validate_service_name,
    mock_get_slack_client,
    mock__log_audit,
    mock_get_instance_configs,
    mock_periodically_update_slack,
):
    class FakeArgsRollback(FakeArgs):
        auto_rollback = True
        block = True
        timeout = 600
        warn = 80  # % of timeout to warn at
        polling_interval = 15
        diagnosis_interval = 15
        time_before_first_diagnosis = 15

    mock_list_deploy_groups.return_value = ["test_deploy_groups"]
    config_mock = mock.Mock()
    config_mock.get_default_push_groups.return_value = None
    mock_load_system_paasta_config.return_value = config_mock
    mock_get_instance_configs.return_value = {
        "fake_cluster": [],
        "fake_cluster2": []
    }
    mock_mark_for_deployment.return_value = 0

    def do_wait_for_deployment_side_effect(self, target_commit,
                                           target_image_version):
        if (target_commit == FakeArgs.commit
                and target_image_version == FakeArgs.image_version):
            self.trigger("rollback_button_clicked")
        else:
            self.trigger("deploy_finished")

    mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect

    def on_enter_rolled_back_side_effect(self):
        self.trigger("abandon_button_clicked")

    mock_get_currently_deployed_version.return_value = DeploymentVersion(
        "old-sha", None)
    with patch(
            "paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back",
            autospec=True,
            wraps=mark_for_deployment.MarkForDeploymentProcess.
            on_enter_rolled_back,
            side_effect=on_enter_rolled_back_side_effect,
    ):
        assert mark_for_deployment.paasta_mark_for_deployment(
            FakeArgsRollback) == 1

    mock_mark_for_deployment.assert_any_call(
        service="test_service",
        deploy_group="test_deploy_group",
        commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4",
        git_url="git://false.repo/services/test_services",
        image_version="extrastuff",
    )
    mock_mark_for_deployment.assert_any_call(
        service="test_service",
        deploy_group="test_deploy_group",
        commit="old-sha",
        git_url="git://false.repo/services/test_services",
        image_version=None,
    )
    assert mock_mark_for_deployment.call_count == 2

    mock_do_wait_for_deployment.assert_any_call(
        mock.ANY, "d670460b4b4aece5915caf5c68d12f560a9fe3e4", "extrastuff")
    mock_do_wait_for_deployment.assert_any_call(mock.ANY, "old-sha", None)
    assert mock_do_wait_for_deployment.call_count == 2
    # in normal usage, this would also be called once per m-f-d, but we mock that out above
    # so _log_audit is only called as part of handling the rollback
    assert mock__log_audit.call_count == len(
        mock_list_deploy_groups.return_value)
    mock__log_audit.assert_called_once_with(
        action="rollback",
        action_details={
            "deploy_group": "test_deploy_group",
            "rolled_back_from":
            "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)",
            "rolled_back_to": "old-sha",
            "rollback_type": "user_initiated_rollback",
        },
        service="test_service",
    )

    mock_get_metrics.assert_called_once_with("paasta.mark_for_deployment")
    mock_get_metrics.return_value.create_timer.assert_called_once_with(
        name="deploy_duration",
        default_dimensions=dict(
            paasta_service="test_service",
            deploy_group="test_deploy_group",
            old_version="old-sha",
            new_version=
            "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)",
            deploy_timeout=600,
        ),
    )
    mock_timer = mock_get_metrics.return_value.create_timer.return_value
    mock_timer.start.assert_called_once_with()
    mock_timer.stop.assert_called_once_with(tmp_dimensions=dict(exit_status=1))
    mock_emit_event = mock_get_metrics.return_value.emit_event
    event_dimensions = dict(
        paasta_service="test_service",
        deploy_group="test_deploy_group",
        rolled_back_from=
        "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)",
        rolled_back_to="old-sha",
        rollback_type="user_initiated_rollback",
    )
    expected_calls = []
    for cluster in mock_get_instance_configs.return_value.keys():
        dims = dict(event_dimensions)
        dims["paasta_cluster"] = cluster
        exp_call = call(name="rollback", dimensions=dims)
        expected_calls.append(exp_call)
    mock_emit_event.assert_has_calls(expected_calls, any_order=True)