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_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
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]
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, )
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
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]
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)
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
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
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)
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)
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
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
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
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
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