Example #1
0
def test_pick_default_log_mode():
    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.tail_logs',
                    autospec=True) as tail_logs:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True

        logs.pick_default_log_mode(args,
                                   fake_reader,
                                   service=None,
                                   levels=None,
                                   components=None,
                                   clusters=None,
                                   instances=None)

        # Only supports tailing so that's the one that should be used
        assert tail_logs.call_count == 1

    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.print_logs_by_time',
                    autospec=True) as logs_by_time:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True
        fake_reader.SUPPORTS_TIME = True

        logs.pick_default_log_mode(args,
                                   fake_reader,
                                   service=None,
                                   levels=None,
                                   components=None,
                                   clusters=None,
                                   instances=None)

        # Supports tailing and time, but time should be prioritized
        assert logs_by_time.call_count == 1

    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.print_last_n_logs',
                    autospec=True) as logs_by_lines:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True
        fake_reader.SUPPORTS_TIME = True
        fake_reader.SUPPORTS_LINE_COUNT = True

        logs.pick_default_log_mode(args,
                                   fake_reader,
                                   service=None,
                                   levels=None,
                                   components=None,
                                   clusters=None,
                                   instances=None)

        # Supports tailing , time and line counts. Line counts should be prioritized
        assert logs_by_lines.call_count == 1
Example #2
0
def test_paasta_rollback_git_sha_was_not_marked_before(
    mock_get_git_shas_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
):
    fake_args, _ = parse_args([
        'rollback',
        '-s', 'fakeservice',
        '-k', 'abcd' * 10,
        '-l', 'fake_deploy_group1',
    ])

    mock_get_git_shas_for_service.return_value = {
        'fake_sha1': ('20170403T025512', 'fake_deploy_group1'),
        'fake_sha2': ('20161006T025416', 'fake_deploy_group2'),
    }

    mock_get_git_url.return_value = 'git://git.repo'
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0

    assert paasta_rollback(fake_args) == 1
    assert not mock_mark_for_deployment.called
Example #3
0
def test_stop_or_start_handle_ls_remote_failures(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_get_remote_refs,
    mock_apply_args_filters,
    mock_confirm_to_continue,
    capfd,
):
    args, _ = parse_args([
        'restart',
        '-s',
        'fake_service',
        '-c',
        'cluster1',
        '-d',
        '/soa/dir',
    ])

    mock_list_clusters.return_value = ['cluster1']
    mock_get_git_url.return_value = 'fake_git_url'
    mock_get_instance_config.return_value = None
    mock_get_remote_refs.side_effect = remote_git.LSRemoteException
    mock_apply_args_filters.return_value = {
        'cluster1': {
            'fake_service': {
                'instance1': mock.Mock()
            }
        },
    }
    mock_confirm_to_continue.return_value = True

    assert args.command(args) == 1
    assert "may be down" in capfd.readouterr()[0]
def test_start_or_stop_bad_refs(
    mock_list_clusters,
    mock_list_remote_refs,
    mock_get_instance_config,
    mock_apply_args_filters,
    capfd,
):
    args, _ = parse_args([
        'restart', '-s', 'fake_service', '-i', 'fake_instance',
        '-c', 'fake_cluster1,fake_cluster2', '-d', '/fake/soa/dir',
    ])
    mock_list_clusters.return_value = ['fake_cluster1', 'fake_cluster2']

    mock_get_instance_config.return_value = MarathonServiceConfig(
        cluster='fake_cluster1',
        instance='fake_instance',
        service='fake_service',
        config_dict={},
        branch_dict={},
    )
    mock_list_remote_refs.return_value = {
        "refs/tags/paasta-deliberatelyinvalidref-20160304T053919-deploy": "70f7245ccf039d778c7e527af04eac00d261d783",
    }
    mock_apply_args_filters.return_value = {
        'fake_cluster1': {'fake_service': ['fake_instance']},
        'fake_cluster2': {'fake_service': ['fake_instance']},
    }
    assert args.command(args) == 1
    assert "No branches found for" in capfd.readouterr()[0]
Example #5
0
def test_paasta_rollback_mark_for_deployment_simple_invocation(
    mock_get_git_shas_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
):
    fake_args, _ = parse_args([
        "rollback", "-s", "fakeservice", "-k", "abcd" * 10, "-l",
        "fake_deploy_group1"
    ])

    mock_get_git_shas_for_service.return_value = {
        fake_args.commit: ("20170403T025512", fake_args.deploy_groups),
        "dcba" * 10: ("20161006T025416", "fake_deploy_group2"),
    }

    mock_get_git_url.return_value = "git://git.repo"
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0

    assert paasta_rollback(fake_args) == 0

    mock_mark_for_deployment.assert_called_once_with(
        git_url=mock_get_git_url.return_value,
        deploy_group=fake_args.deploy_groups,
        service=mock_figure_out_service_name.return_value,
        commit=fake_args.commit,
    )
Example #6
0
def test_push_to_registry_force(
    mock_log_audit,
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(
        ["push-to-registry", "-s", "foo", "-c", "abcd" * 10, "--force"])
    mock_build_command.return_value = (
        "docker push fake_registry/services-foo:paasta-abcd")
    mock_run.return_value = (0, "Success")
    assert paasta_push_to_registry(args) == 0
    assert not mock_is_docker_image_already_in_registry.called
    mock_run.assert_called_once_with(
        "docker push fake_registry/services-foo:"
        "paasta-abcd",
        component="build",
        log=True,
        loglevel="debug",
        service="foo",
        timeout=3600,
    )
    mock_log_audit.assert_called_once_with(
        action="push-to-registry",
        action_details={"commit": "abcd" * 10},
        service="foo")
def test_stop_or_start_warn_on_multi_instance(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    mock_list_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
    mock_apply_args_filters,
    capfd,
):
    args, _ = parse_args([
        'start', '-s', 'fake_service,other_service',
        '-c', 'cluster1,cluster2', '-d', '/soa/dir',
    ])
    mock_list_clusters.return_value = ['cluster1', 'cluster2']
    mock_get_git_url.return_value = 'fake_git_url'
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = 'some_group'
    mock_list_remote_refs.return_value = ['not_a_real_tag', 'fake_tag']
    mock_get_latest_deployment_tag.return_value = ('not_a_real_tag', None)
    mock_format_timestamp.return_value = 'not_a_real_timestamp'
    mock_apply_args_filters.return_value = {
        'cluster1': {'fake_service': ['main1'], 'other_service': ['main1']},
        'cluster2': {'fake_service': ['main1', 'canary']},
    }
    ret = args.command(args)
    out, err = capfd.readouterr()
    assert ret == 1
    assert "Warning: trying to start/stop/restart multiple services" in out
    def test_only_flink_instances(
        self,
        mock_apply_args_filters,
        mock_get_instance_config,
        mock_paasta_start,
        mock_binary,
        mock_binary_choice,
        capfd,
    ):
        mock_apply_args_filters.return_value = {
            "cluster": {"service": {"flink_instance": None}}
        }
        mock_get_instance_config.side_effect = [
            FlinkDeploymentConfig(
                "service",
                "cluster",
                "flink_instance",
                FlinkDeploymentConfigDict(),
                None,
            ),
        ]

        args, _ = parse_args(
            "restart -s service -c cluster -i flink_instance -d /soa/dir".split(" ")
        )
        ret = args.command(args)
        out, _ = capfd.readouterr()

        assert ret == 1
        assert not mock_paasta_start.called
        assert "paasta restart is currently unsupported for Flink instances" in out
def test_paasta_rollback_git_sha_was_not_marked_before(
    mock_get_git_shas_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
    mock_log_audit,
):
    fake_args, _ = parse_args(
        ["rollback", "-s", "fakeservice", "-k", "abcd" * 10, "-l", "fake_deploy_group1"]
    )

    mock_get_git_shas_for_service.return_value = {
        "fake_sha1": ("20170403T025512", "fake_deploy_group1"),
        "fake_sha2": ("20161006T025416", "fake_deploy_group2"),
    }

    mock_get_git_url.return_value = "git://git.repo"
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0

    assert paasta_rollback(fake_args) == 1
    assert not mock_mark_for_deployment.called
    assert not mock_log_audit.called
Example #10
0
def test_push_to_registry_force(
    mock_log_audit,
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(
        ['push-to-registry', '-s', 'foo', '-c', 'abcd' * 10, '--force'])
    mock_build_command.return_value = 'docker push fake_registry/services-foo:paasta-abcd'
    mock_run.return_value = (0, 'Success')
    assert paasta_push_to_registry(args) == 0
    assert not mock_is_docker_image_already_in_registry.called
    mock_run.assert_called_once_with(
        'docker push fake_registry/services-foo:'
        'paasta-abcd',
        component='build',
        log=True,
        loglevel='debug',
        service='foo',
        timeout=3600,
    )
    mock_log_audit.assert_called_once_with(
        action='push-to-registry',
        action_details={'commit': 'abcd' * 10},
        service='foo',
    )
def test_stop_or_start_handle_ls_remote_failures(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_get_remote_refs,
    mock_apply_args_filters,
    mock_confirm_to_continue,
    mock_can_user_deploy_service,
    capfd,
):
    args, _ = parse_args(
        ["restart", "-s", "fake_service", "-c", "cluster1", "-d", "/soa/dir"]
    )

    mock_list_clusters.return_value = ["cluster1"]
    mock_get_git_url.return_value = "fake_git_url"
    mock_get_instance_config.return_value = None
    mock_get_remote_refs.side_effect = remote_git.LSRemoteException
    mock_apply_args_filters.return_value = {
        "cluster1": {"fake_service": {"instance1": mock.Mock()}}
    }
    mock_confirm_to_continue.return_value = True

    assert args.command(args) == 1
    assert "may be down" in capfd.readouterr()[0]
Example #12
0
def test_paasta_rollback_with_force(
    mock_get_git_shas_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
):
    fake_args, _ = parse_args([
        'rollback',
        '-s', 'fakeservice',
        '-k', 'abcd' * 10,
        '-l', 'fake_deploy_group1',
        '-f',
    ])

    mock_get_git_shas_for_service.return_value = {
        'fake_sha1': ('20170403T025512', 'fake_deploy_group1'),
        'fake_sha2': ('20161006T025416', 'fake_deploy_group2'),
    }

    mock_get_git_url.return_value = 'git://git.repo'
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0

    assert paasta_rollback(fake_args) == 0

    mock_mark_for_deployment.assert_called_once_with(
        git_url=mock_get_git_url.return_value,
        deploy_group=fake_args.deploy_groups,
        service=mock_figure_out_service_name.return_value,
        commit=fake_args.commit,
    )
def test_paasta_start_or_stop(
    mock_list_clusters,
    mock_list_all_instances,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    mock_figure_out_service_name,
    mock_list_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
):
    args, _ = parse_args([
        'start', '-s', 'fake_service', '-i', 'main1,canary', '-c',
        'cluster1,cluster2', '-d', '/soa/dir'
    ])
    mock_list_clusters.return_value = ['cluster1', 'cluster2']
    mock_list_all_instances.return_value = set(args.instances.split(","))
    mock_get_git_url.return_value = 'fake_git_url'
    mock_figure_out_service_name.return_value = 'fake_service'
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = 'some_group'
    mock_list_remote_refs.return_value = ['not_a_real_tag', 'fake_tag']
    mock_get_latest_deployment_tag.return_value = ('not_a_real_tag', None)
    mock_format_timestamp.return_value = 'not_a_real_timestamp'
    ret = args.command(args)
    c1_get_instance_config_call = mock.call(service='fake_service',
                                            cluster='cluster1',
                                            instance='main1',
                                            soa_dir='/soa/dir',
                                            load_deployments=False)
    c2_get_instance_config_call = mock.call(service='fake_service',
                                            cluster='cluster1',
                                            instance='canary',
                                            soa_dir='/soa/dir',
                                            load_deployments=False)
    c3_get_instance_config_call = mock.call(service='fake_service',
                                            cluster='cluster2',
                                            instance='main1',
                                            soa_dir='/soa/dir',
                                            load_deployments=False)
    c4_get_instance_config_call = mock.call(service='fake_service',
                                            cluster='cluster2',
                                            instance='canary',
                                            soa_dir='/soa/dir',
                                            load_deployments=False)
    mock_get_instance_config.assert_has_calls([
        c1_get_instance_config_call, c2_get_instance_config_call,
        c3_get_instance_config_call, c4_get_instance_config_call
    ],
                                              any_order=True)
    mock_get_latest_deployment_tag.assert_called_with(
        ['not_a_real_tag', 'fake_tag'], 'some_group')
    mock_issue_state_change_for_service.assert_called_with(
        service_config=mock_instance_config,
        force_bounce='not_a_real_timestamp',
        desired_state='start')
    assert mock_issue_state_change_for_service.call_count == 4
    assert (ret == 0)
Example #14
0
def test_paasta_start_or_stop_with_deploy_group(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    mock_get_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
    mock_apply_args_filters,
    mock_confirm_to_continue,
):
    args, _ = parse_args([
        'start',
        '-s',
        'fake_service',
        '-c',
        'cluster1',
        '-l',
        'fake_group',
        '-d',
        '/soa/dir',
    ])
    mock_list_clusters.return_value = ['cluster1', 'cluster2']
    mock_get_git_url.return_value = 'fake_git_url'
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = args.deploy_group
    mock_get_remote_refs.return_value = ['not_a_real_tag', 'fake_tag']
    mock_get_latest_deployment_tag.return_value = ('not_a_real_tag', None)
    mock_format_timestamp.return_value = 'not_a_real_timestamp'
    mock_apply_args_filters.return_value = {
        'cluster1': {
            'fake_service': {
                'instance1': None
            }
        },
    }
    mock_confirm_to_continue.return_value = True

    ret = args.command(args)

    mock_get_instance_config.assert_called_once_with(
        service='fake_service',
        cluster='cluster1',
        instance='instance1',
        soa_dir='/soa/dir',
        load_deployments=False,
    )
    mock_get_latest_deployment_tag.assert_called_with(
        ['not_a_real_tag', 'fake_tag'],
        args.deploy_group,
    )
    mock_issue_state_change_for_service.assert_called_once_with(
        service_config=mock_instance_config,
        force_bounce='not_a_real_timestamp',
        desired_state='start',
    )
    assert ret == 0
Example #15
0
def test_paasta_rollback_with_force(
    mock_deploy_authz_check,
    mock_get_git_shas_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
    mock_log_audit,
    mock_get_currently_deployed_sha,
):
    fake_args, _ = parse_args(
        [
            "rollback",
            "-s",
            "fakeservice",
            "-k",
            "abcd" * 10,
            "-l",
            "fake_deploy_group1",
            "-f",
        ]
    )

    mock_get_git_shas_for_service.return_value = {
        "fake_sha1": ("20170403T025512", "fake_deploy_group1"),
        "fake_sha2": ("20161006T025416", "fake_deploy_group2"),
    }

    mock_get_git_url.return_value = "git://git.repo"
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0
    mock_get_currently_deployed_sha.return_value = "1234" * 10

    assert paasta_rollback(fake_args) == 0

    mock_mark_for_deployment.assert_called_once_with(
        git_url=mock_get_git_url.return_value,
        deploy_group=fake_args.deploy_groups,
        service=mock_figure_out_service_name.return_value,
        commit=fake_args.commit,
    )
    # ensure that we logged each deploy group that was rolled back AND that we logged things correctly
    mock_log_audit.call_count == len(fake_args.deploy_groups)
    for call_args in mock_log_audit.call_args_list:
        _, call_kwargs = call_args
        assert call_kwargs["action"] == "rollback"
        assert (
            call_kwargs["action_details"]["rolled_back_from"]
            == mock_get_currently_deployed_sha.return_value
        )
        assert call_kwargs["action_details"]["rolled_back_to"] == fake_args.commit
        assert (
            call_kwargs["action_details"]["rollback_type"]
            == RollbackTypes.USER_INITIATED_ROLLBACK.value
        )
        assert call_kwargs["action_details"]["deploy_group"] in fake_args.deploy_groups
        assert call_kwargs["service"] == fake_args.service
Example #16
0
def test_validate_filtering_args_with_invalid_inputs():
    fake_reader = logs.LogReader()

    fake_reader.SUPPORTS_TAILING = False
    args, _ = parse_args(["logs", "--tail"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_TIME = False
    args, _ = parse_args(["logs", "--from", "1w"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_LINE_COUNT = False
    args, _ = parse_args(["logs", "-l", "200"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_LINE_OFFSET = False
    args, _ = parse_args(["logs", "-o", "23"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_TAILING = True
    fake_reader.SUPPORTS_LINE_COUNT = True
    fake_reader.SUPPORTS_LINE_OFFSET = True
    fake_reader.SUPPORTS_TIME = True

    # Can't tail and specify lines at the same time
    args, _ = parse_args(["logs", "-l", "200", "--tail"])
    assert not logs.validate_filtering_args(args, fake_reader)

    # Can't tail and specify time at the same time
    args, _ = parse_args(["logs", "--tail", "--from", "1w"])
    assert not logs.validate_filtering_args(args, fake_reader)

    # Can't use both time and lines at the same time
    args, _ = parse_args(["logs", "--from", "1w", "-l", "100"])
    assert not logs.validate_filtering_args(args, fake_reader)
Example #17
0
def test_validate_filtering_args_with_invalid_inputs():
    fake_reader = logs.LogReader()

    fake_reader.SUPPORTS_TAILING = False
    args, _ = parse_args(["logs", "--tail"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_TIME = False
    args, _ = parse_args(["logs", "--from", "1w"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_LINE_COUNT = False
    args, _ = parse_args(["logs", "-l", "200"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_LINE_OFFSET = False
    args, _ = parse_args(["logs", "-o", "23"])
    assert not logs.validate_filtering_args(args, fake_reader)

    fake_reader.SUPPORTS_TAILING = True
    fake_reader.SUPPORTS_LINE_COUNT = True
    fake_reader.SUPPORTS_LINE_OFFSET = True
    fake_reader.SUPPORTS_TIME = True

    # Can't tail and specify lines at the same time
    args, _ = parse_args(["logs", "-l", "200", "--tail"])
    assert not logs.validate_filtering_args(args, fake_reader)

    # Can't tail and specify time at the same time
    args, _ = parse_args(["logs", "--tail", "--from", "1w"])
    assert not logs.validate_filtering_args(args, fake_reader)

    # Can't use both time and lines at the same time
    args, _ = parse_args(["logs", "--from", "1w", "-l", "100"])
    assert not logs.validate_filtering_args(args, fake_reader)
Example #18
0
def test_paasta_rollback_mark_for_deployment_simple_invocation(
    mock_can_user_deploy_service,
    mock_get_versions_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
    mock_log_audit,
    mock_get_currently_deployed_version,
):
    fake_args, _ = parse_args([
        "rollback", "-s", "fakeservice", "-k", "abcd" * 10, "-l",
        "fake_deploy_group1"
    ])

    mock_get_versions_for_service.return_value = {
        DeploymentVersion(sha=fake_args.commit, image_version=None): (
            "20170403T025512",
            fake_args.deploy_groups,
        ),
        DeploymentVersion(sha="dcba" * 10, image_version=None): (
            "20161006T025416",
            "fake_deploy_group2",
        ),
    }

    mock_get_git_url.return_value = "git://git.repo"
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [fake_args.deploy_groups]
    mock_mark_for_deployment.return_value = 0
    mock_get_currently_deployed_version.return_value = DeploymentVersion(
        sha="1234" * 10, image_version=None)

    assert paasta_rollback(fake_args) == 0

    mock_mark_for_deployment.assert_called_once_with(
        git_url=mock_get_git_url.return_value,
        deploy_group=fake_args.deploy_groups,
        service=mock_figure_out_service_name.return_value,
        commit=fake_args.commit,
        image_version=None,
    )

    # ensure that we logged each deploy group that was rolled back AND that we logged things correctly
    mock_log_audit.call_count == len(fake_args.deploy_groups)
    for call_args in mock_log_audit.call_args_list:
        _, call_kwargs = call_args
        assert call_kwargs["action"] == "rollback"
        assert call_kwargs["action_details"]["rolled_back_from"] == str(
            mock_get_currently_deployed_version.return_value)
        assert call_kwargs["action_details"][
            "rolled_back_to"] == fake_args.commit
        assert (call_kwargs["action_details"]["rollback_type"] ==
                RollbackTypes.USER_INITIATED_ROLLBACK.value)
        assert call_kwargs["action_details"][
            "deploy_group"] in fake_args.deploy_groups
        assert call_kwargs["service"] == fake_args.service
def test_paasta_start_or_stop_with_deploy_group(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    mock_get_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
    mock_apply_args_filters,
    mock_confirm_to_continue,
    mock_can_user_deploy_service,
):
    args, _ = parse_args(
        [
            "start",
            "-s",
            "fake_service",
            "-c",
            "cluster1",
            "-l",
            "fake_group",
            "-d",
            "/soa/dir",
        ]
    )
    mock_list_clusters.return_value = ["cluster1", "cluster2"]
    mock_get_git_url.return_value = "fake_git_url"
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = args.deploy_group
    mock_get_remote_refs.return_value = ["not_a_real_tag", "fake_tag"]
    mock_get_latest_deployment_tag.return_value = ("not_a_real_tag", None, None)
    mock_format_timestamp.return_value = "not_a_real_timestamp"
    mock_apply_args_filters.return_value = {
        "cluster1": {"fake_service": {"instance1": None}}
    }
    mock_confirm_to_continue.return_value = True

    ret = args.command(args)

    mock_get_instance_config.assert_called_once_with(
        service="fake_service",
        cluster="cluster1",
        instance="instance1",
        soa_dir="/soa/dir",
        load_deployments=False,
    )
    mock_get_latest_deployment_tag.assert_called_with(
        ["not_a_real_tag", "fake_tag"], args.deploy_group
    )
    mock_issue_state_change_for_service.assert_called_once_with(
        service_config=mock_instance_config,
        force_bounce="not_a_real_timestamp",
        desired_state="start",
    )
    assert ret == 0
def test_push_to_registry_works_when_service_name_starts_with_services_dash(
    mock_build_command,
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(['push-to-registry', '-s', 'foo', '-c', 'abcd' * 10])
    mock_run.return_value = (0, 'Success')
    mock_is_docker_image_already_in_registry.return_value = False
    assert paasta_push_to_registry(args) == 0
    mock_build_command.assert_called_once_with('foo', 'abcd' * 10)
Example #21
0
def test_validate_filtering_args_with_valid_inputs():
    fake_reader = logs.LogReader()
    fake_reader.SUPPORTS_TAILING = True
    fake_reader.SUPPORTS_LINE_COUNT = True
    fake_reader.SUPPORTS_TIME = True
    fake_reader.SUPPORTS_LINE_OFFSET = True

    # No arguments, completely valid
    args, _ = parse_args(["logs"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Tailing
    args, _ = parse_args(["logs", "--tail"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify number of lines
    args, _ = parse_args(["logs", "-l", "200"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify number of lines and lines to offset by
    args, _ = parse_args(["logs", "-l", "200", "-o", "23"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify a time
    args, _ = parse_args(["logs", "--from", "1w"])
    assert logs.validate_filtering_args(args, fake_reader)
def test_push_to_registry_does_not_override_when_cant_check_status(
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(['push-to-registry', '-s', 'foo', '-c', 'abcd' * 10])
    mock_run.return_value = (0, 'Success')
    mock_is_docker_image_already_in_registry.side_effect = RequestException()
    assert paasta_push_to_registry(args) == 1
    assert not mock_build_command.called
    assert not mock_run.called
Example #23
0
def test_pick_default_log_mode():
    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.tail_logs', autospec=True) as tail_logs:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True

        logs.pick_default_log_mode(
            args, fake_reader, service=None, levels=None, components=None, clusters=None, instances=None)

        # Only supports tailing so that's the one that should be used
        assert tail_logs.call_count == 1

    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.print_logs_by_time', autospec=True) as logs_by_time:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True
        fake_reader.SUPPORTS_TIME = True

        logs.pick_default_log_mode(
            args, fake_reader, service=None, levels=None, components=None, clusters=None, instances=None)

        # Supports tailing and time, but time should be prioritized
        assert logs_by_time.call_count == 1

    with mock.patch('paasta_tools.cli.cmds.logs.LogReader.print_last_n_logs', autospec=True) as logs_by_lines:
        args, _ = parse_args(["logs"])

        fake_reader = logs.LogReader()
        fake_reader.SUPPORTS_TAILING = True
        fake_reader.SUPPORTS_TIME = True
        fake_reader.SUPPORTS_LINE_COUNT = True

        logs.pick_default_log_mode(
            args, fake_reader, service=None, levels=None, components=None, clusters=None, instances=None)

        # Supports tailing , time and line counts. Line counts should be prioritized
        assert logs_by_lines.call_count == 1
def test_push_to_registry_does_not_override_existing_image(
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(['push-to-registry', '-s', 'foo', '-c', 'abcd' * 10])
    mock_run.return_value = (0, 'Success')
    mock_is_docker_image_already_in_registry.return_value = True
    assert paasta_push_to_registry(args) == 0
    assert not mock_build_command.called
    assert not mock_run.called
Example #25
0
def test_validate_filtering_args_with_valid_inputs():
    fake_reader = logs.LogReader()
    fake_reader.SUPPORTS_TAILING = True
    fake_reader.SUPPORTS_LINE_COUNT = True
    fake_reader.SUPPORTS_TIME = True
    fake_reader.SUPPORTS_LINE_OFFSET = True

    # No arguments, completely valid
    args, _ = parse_args(["logs"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Tailing
    args, _ = parse_args(["logs", "--tail"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify number of lines
    args, _ = parse_args(["logs", "-l", "200"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify number of lines and lines to offset by
    args, _ = parse_args(["logs", "-l", "200", "-o", "23"])
    assert logs.validate_filtering_args(args, fake_reader)
    # Specify a time
    args, _ = parse_args(["logs", "--from", "1w"])
    assert logs.validate_filtering_args(args, fake_reader)
Example #26
0
def test_paasta_rollback_mark_for_deployment_no_deploy_group_arg(
    mock_can_user_deploy_service,
    mock_get_versions_for_service,
    mock_mark_for_deployment,
    mock_get_git_url,
    mock_figure_out_service_name,
    mock_list_deploy_groups,
    mock_log_audit,
    mock_get_currently_deployed_version,
):
    fake_args, _ = parse_args(
        ["rollback", "-s", "fakeservice", "-k", "abcd" * 10])

    mock_get_versions_for_service.return_value = {
        DeploymentVersion(sha="fake_sha1", image_version=None): (
            "20170403T025512",
            "fake_deploy_group1",
        ),
        DeploymentVersion(sha=fake_args.commit, image_version=None): (
            "20161006T025416",
            "fake_deploy_group2",
        ),
    }

    mock_get_git_url.return_value = "git://git.repo"
    mock_figure_out_service_name.return_value = fake_args.service
    mock_list_deploy_groups.return_value = [
        "fake_deploy_group",
        "fake_cluster.fake_instance",
    ]
    mock_mark_for_deployment.return_value = 0
    mock_get_currently_deployed_version.return_value = DeploymentVersion(
        sha="1234" * 10, image_version=None)

    assert paasta_rollback(fake_args) == 1

    assert mock_mark_for_deployment.call_count == 0

    mock_log_audit.call_count == len(fake_args.deploy_groups)
    for call_args in mock_log_audit.call_args_list:
        _, call_kwargs = call_args
        assert call_kwargs["action"] == "rollback"
        assert call_kwargs["action_details"]["rolled_back_from"] == str(
            mock_get_currently_deployed_version.return_value)
        assert call_kwargs["action_details"][
            "rolled_back_to"] == fake_args.commit
        assert (call_kwargs["action_details"]["rollback_type"] ==
                RollbackTypes.USER_INITIATED_ROLLBACK.value)
        assert (call_kwargs["action_details"]["deploy_group"]
                in mock_list_deploy_groups.return_value)
        assert call_kwargs["service"] == fake_args.service
def test_push_to_registry_success(
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(['push-to-registry', '-s', 'foo', '-c', 'abcd' * 10])
    mock_build_command.return_value = 'docker push my-docker-registry/services-foo:paasta-asdf'
    mock_run.return_value = (0, 'Success')
    mock_is_docker_image_already_in_registry.return_value = False
    assert paasta_push_to_registry(args) == 0
    assert mock_build_command.called
    assert mock_run.called
Example #28
0
def test_push_to_registry_does_not_override_existing_image(
    mock_log_audit,
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
):
    args, _ = parse_args(["push-to-registry", "-s", "foo", "-c", "abcd" * 10])
    mock_run.return_value = (0, "Success")
    mock_is_docker_image_already_in_registry.return_value = True
    assert paasta_push_to_registry(args) == 0
    assert not mock_build_command.called
    assert not mock_run.called
    assert not mock_log_audit.called
def test_stop_or_start_warn_on_multi_instance(
    mock_list_clusters,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    get_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
    mock_apply_args_filters,
    capfd,
):
    args, _ = parse_args([
        "start",
        "-s",
        "fake_service,other_service",
        "-c",
        "cluster1,cluster2",
        "-d",
        "/soa/dir",
    ])
    mock_list_clusters.return_value = ["cluster1", "cluster2"]
    mock_get_git_url.return_value = "fake_git_url"
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = "some_group"
    get_remote_refs.return_value = ["not_a_real_tag", "fake_tag"]
    mock_get_latest_deployment_tag.return_value = ("not_a_real_tag", None)
    mock_format_timestamp.return_value = "not_a_real_timestamp"
    mock_apply_args_filters.return_value = {
        "cluster1": {
            "fake_service": {
                "main1": None
            },
            "other_service": {
                "main1": None
            }
        },
        "cluster2": {
            "fake_service": {
                "main1": None,
                "canary": None
            }
        },
    }
    ret = args.command(args)
    out, err = capfd.readouterr()
    assert ret == 1
    assert "Warning: trying to start/stop/restart multiple services" in out
Example #30
0
def test_push_to_registry_does_not_override_when_cant_check_status(
    mock_log_audit,
    mock_log,
    mock_run,
    mock_validate_service_name,
    mock_build_command,
    mock_is_docker_image_already_in_registry,
    mock_load_system_paasta_config,
):
    args, _ = parse_args(["push-to-registry", "-s", "foo", "-c", "abcd" * 10])
    mock_run.return_value = (0, "Success")
    mock_is_docker_image_already_in_registry.side_effect = RequestException()
    assert paasta_push_to_registry(args) == 1
    assert not mock_build_command.called
    assert not mock_run.called
    assert not mock_log_audit.called
def test_paasta_start_or_stop_with_deploy_group(
    mock_get_cluster_instance_map_for_service,
    mock_list_clusters,
    mock_list_all_instances,
    mock_get_git_url,
    mock_get_instance_config,
    mock_instance_config,
    mock_figure_out_service_name,
    mock_list_remote_refs,
    mock_get_latest_deployment_tag,
    mock_format_timestamp,
    mock_issue_state_change_for_service,
):
    args, _ = parse_args([
        'start', '-s', 'fake_service', '-c', 'cluster1', '-l', 'fake_group',
        '-d', '/soa/dir'
    ])
    mock_get_cluster_instance_map_for_service.return_value = {
        'cluster1': {
            'instances': ['instance1']
        }
    }
    mock_list_clusters.return_value = ['cluster1', 'cluster2']
    mock_list_all_instances.return_value = {
        'instance1', 'instance2', 'instance3'
    }
    mock_get_git_url.return_value = 'fake_git_url'
    mock_figure_out_service_name.return_value = 'fake_service'
    mock_get_instance_config.return_value = mock_instance_config
    mock_instance_config.get_deploy_group.return_value = args.deploy_group
    mock_list_remote_refs.return_value = ['not_a_real_tag', 'fake_tag']
    mock_get_latest_deployment_tag.return_value = ('not_a_real_tag', None)
    mock_format_timestamp.return_value = 'not_a_real_timestamp'
    ret = args.command(args)

    mock_get_instance_config.assert_called_once_with(service='fake_service',
                                                     cluster='cluster1',
                                                     instance='instance1',
                                                     soa_dir='/soa/dir',
                                                     load_deployments=False)
    mock_get_latest_deployment_tag.assert_called_with(
        ['not_a_real_tag', 'fake_tag'], args.deploy_group)
    mock_issue_state_change_for_service.assert_called_once_with(
        service_config=mock_instance_config,
        force_bounce='not_a_real_timestamp',
        desired_state='start')
    assert ret == 0
def test_start_or_stop_bad_refs(
    mock_list_clusters,
    mock_get_remote_refs,
    mock_get_instance_config,
    mock_apply_args_filters,
    mock_confirm_to_continue,
    capfd,
):
    args, _ = parse_args([
        "restart",
        "-s",
        "fake_service",
        "-i",
        "fake_instance",
        "-c",
        "fake_cluster1,fake_cluster2",
        "-d",
        "/fake/soa/dir",
    ])
    mock_list_clusters.return_value = ["fake_cluster1", "fake_cluster2"]

    mock_get_instance_config.return_value = MarathonServiceConfig(
        cluster="fake_cluster1",
        instance="fake_instance",
        service="fake_service",
        config_dict={},
        branch_dict=None,
    )
    mock_get_remote_refs.return_value = {
        "refs/tags/paasta-deliberatelyinvalidref-20160304T053919-deploy":
        "70f7245ccf039d778c7e527af04eac00d261d783"
    }
    mock_apply_args_filters.return_value = {
        "fake_cluster1": {
            "fake_service": {
                "fake_instance": None
            }
        },
        "fake_cluster2": {
            "fake_service": {
                "fake_instance": None
            }
        },
    }
    mock_confirm_to_continue.return_value = True
    assert args.command(args) == 1
    assert "deployed there yet?" in capfd.readouterr()[0]
def test_cluster_throws_exception_for_invalid_cluster_no_instances(
    mock_list_clusters,
    mock_figure_out_service_name,
    capfd,
):
    args, _ = parse_args([
        'restart', '-s', 'fake_service', '-c', 'fake_cluster_1,fake_cluster_2',
        '-d', '/foo'
    ])

    mock_list_clusters.return_value = ['fake_cluster_2']
    mock_figure_out_service_name.return_value = 'fake_service'

    assert args.command(args) == 1
    output, _ = capfd.readouterr()
    assert "Invalid cluster name(s) specified: fake_cluster_1" in output
    assert "Valid options: fake_cluster_2" in output