def test_mark_for_deployment_yelpy_repo(mock_trigger_deploys, mock_create_remote_refs): mark_for_deployment.mark_for_deployment( git_url="git://false.repo.yelpcorp.com/services/test_services", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) mock_trigger_deploys.assert_called_once_with(service="fake_service")
def test_mark_for_deployment_nonyelpy_repo(mock_trigger_deploys, mock_create_remote_refs): mark_for_deployment.mark_for_deployment( git_url="git://false.repo/services/test_services", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) assert not mock_trigger_deploys.called
def test_mark_for_deployment_nonyelpy_repo(mock_load_system_paasta_config, mock_trigger_deploys, mock_create_remote_refs): config_mock = mock.Mock() config_mock.get_default_push_groups.return_value = None mock_load_system_paasta_config.return_value = config_mock mark_for_deployment.mark_for_deployment( git_url="git://false.repo/services/test_services", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) assert not mock_trigger_deploys.called
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ service = figure_out_service_name(args) git_url = get_git_url(service) commit = args.commit given_deploy_groups = [deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group] service_deploy_groups = set(config.get_deploy_group() for config in get_instance_config_for_service( soa_dir=DEFAULT_SOA_DIR, service=service, )) deploy_groups, invalid = validate_given_deploy_groups(service_deploy_groups, given_deploy_groups) if len(invalid) > 0: print PaastaColors.yellow("These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(deploy_groups) == 0: print PaastaColors.red("ERROR: No valid deploy groups specified for %s.\n" % (service)) returncode = 1 for deploy_group in deploy_groups: returncode = mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, ) sys.exit(returncode)
def test_mark_for_deployment_happy(mock_load_system_paasta_config, mock_create_remote_refs, mock__log_audit, mock__log): config_mock = mock.Mock() config_mock.get_default_push_groups.return_value = None mock_load_system_paasta_config.return_value = config_mock actual = mark_for_deployment.mark_for_deployment( git_url="fake_git_url", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", image_version="extrastuff", ) assert actual == 0 mock_create_remote_refs.assert_called_once_with(git_url="fake_git_url", ref_mutator=ANY, force=True) mock__log_audit.assert_called_once_with( action="mark-for-deployment", action_details={ "deploy_group": "fake_deploy_group", "commit": "fake_commit", "image_version": "extrastuff", }, service="fake_service", )
def test_mark_for_deployment_yelpy_repo( mock_load_system_paasta_config, mock_trigger_deploys, mock_create_remote_refs, mock__log, mock__log_audit, ): config_mock = mock.Mock() config_mock.get_default_push_groups.return_value = None mock_load_system_paasta_config.return_value = config_mock mark_for_deployment.mark_for_deployment( git_url="git://false.repo.yelpcorp.com/services/test_services", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) mock_trigger_deploys.assert_called_once_with(service="fake_service")
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ soa_dir = args.soa_dir service = figure_out_service_name(args, soa_dir) git_url = get_git_url(service, soa_dir) given_deploy_groups = { deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group } service_deploy_groups = { config.get_deploy_group() for config in get_instance_config_for_service( service=service, soa_dir=soa_dir, ) } deploy_groups, invalid = validate_given_deploy_groups( service_deploy_groups, given_deploy_groups) if len(invalid) > 0: print PaastaColors.yellow( "These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(deploy_groups) == 0: print PaastaColors.red( "ERROR: No valid deploy groups specified for %s.\n" % (service)) return 1 commit = args.commit if not commit: list_previous_commits(service, deploy_groups, bool(given_deploy_groups), soa_dir) return 1 returncode = 0 for deploy_group in deploy_groups: returncode = max( mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, ), returncode, ) return returncode
def test_mark_for_deployment_sad(mock_create_remote_refs, mock__log): mock_create_remote_refs.side_effect = Exception('something bad') with patch('time.sleep', autospec=True): actual = mark_for_deployment.mark_for_deployment( git_url='fake_git_url', deploy_group='fake_deploy_group', service='fake_service', commit='fake_commit', ) assert actual == 1 assert mock_create_remote_refs.call_count == 3
def test_mark_for_deployment_sad(mock_create_remote_refs, mock__log_audit, mock__log): mock_create_remote_refs.side_effect = Exception("something bad") with patch("time.sleep", autospec=True): actual = mark_for_deployment.mark_for_deployment( git_url="fake_git_url", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) assert actual == 1 assert mock_create_remote_refs.call_count == 3 assert not mock__log_audit.called
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ soa_dir = args.soa_dir service = figure_out_service_name(args, soa_dir) git_url = get_git_url(service, soa_dir) given_deploy_groups = {deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group} all_deploy_groups = list_deploy_groups(service=service, soa_dir=soa_dir) deploy_groups, invalid = validate_given_deploy_groups(all_deploy_groups, given_deploy_groups) if len(invalid) > 0: paasta_print( PaastaColors.yellow( "These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid), ), ) if len(deploy_groups) == 0: paasta_print(PaastaColors.red("ERROR: No valid deploy groups specified for %s.\n" % (service))) return 1 git_shas = get_git_shas_for_service(service, deploy_groups, soa_dir) commit = args.commit if not commit: paasta_print("Please specify a commit to mark for rollback (-k, --commit).") list_previous_commits(service, deploy_groups, bool(given_deploy_groups), git_shas) return 1 elif commit not in git_shas and not args.force: paasta_print(PaastaColors.red("This Git SHA has never been deployed before.")) paasta_print("Please double check it or use --force to skip this verification.\n") list_previous_commits(service, deploy_groups, bool(given_deploy_groups), git_shas) return 1 returncode = 0 for deploy_group in deploy_groups: returncode = max( mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, ), returncode, ) return returncode
def test_mark_for_deployment_happy(mock_create_remote_refs, mock__log): actual = mark_for_deployment.mark_for_deployment( git_url='fake_git_url', deploy_group='fake_deploy_group', service='fake_service', commit='fake_commit', ) assert actual == 0 mock_create_remote_refs.assert_called_once_with( git_url='fake_git_url', ref_mutator=ANY, force=True, )
def test_mark_for_deployment_happy(mock_create_remote_refs): actual = mark_for_deployment.mark_for_deployment( git_url='fake_git_url', cluster='fake_cluster', instance='fake_instance', service='fake_service', commit='fake_commit', ) assert actual == 0 mock_create_remote_refs.assert_called_once_with( git_url='fake_git_url', ref_mutator=ANY, force=True, )
def test_mark_for_deployment_sad(mock_create_remote_refs, mock__log): mock_create_remote_refs.side_effect = Exception('something bad') actual = mark_for_deployment.mark_for_deployment( git_url='fake_git_url', deploy_group='fake_deploy_group', service='fake_service', commit='fake_commit', ) assert actual == 1 mock_create_remote_refs.assert_called_once_with( git_url='fake_git_url', ref_mutator=ANY, force=True, )
def test_mark_for_deployment_happy(mock_create_remote_refs, mock__log_audit, mock__log): actual = mark_for_deployment.mark_for_deployment( git_url="fake_git_url", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) assert actual == 0 mock_create_remote_refs.assert_called_once_with( git_url="fake_git_url", ref_mutator=ANY, force=True ) mock__log_audit.assert_called_once_with( action="mark-for-deployment", action_details={"deploy_group": "fake_deploy_group", "commit": "fake_commit"}, service="fake_service", )
def test_mark_for_deployment_sad(mock_load_system_paasta_config, mock_create_remote_refs, mock__log_audit, mock__log): config_mock = mock.Mock() config_mock.get_default_push_groups.return_value = None mock_load_system_paasta_config.return_value = config_mock mock_create_remote_refs.side_effect = Exception("something bad") with patch("time.sleep", autospec=True): actual = mark_for_deployment.mark_for_deployment( git_url="fake_git_url", deploy_group="fake_deploy_group", service="fake_service", commit="fake_commit", ) assert actual == 1 assert mock_create_remote_refs.call_count == 3 assert not mock__log_audit.called
def test_mark_for_deployment_happy(mock_create_remote_refs, mock__log_audit, mock__log): actual = mark_for_deployment.mark_for_deployment( git_url='fake_git_url', deploy_group='fake_deploy_group', service='fake_service', commit='fake_commit', ) assert actual == 0 mock_create_remote_refs.assert_called_once_with( git_url='fake_git_url', ref_mutator=ANY, force=True, ) mock__log_audit.assert_called_once_with( action='mark-for-deployment', action_details={'deploy_group': 'fake_deploy_group', 'commit': 'fake_commit'}, service='fake_service', )
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ soa_dir = args.soa_dir service = figure_out_service_name(args, soa_dir) git_url = get_git_url(service, soa_dir) given_deploy_groups = {deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group} service_deploy_groups = {config.get_deploy_group() for config in get_instance_config_for_service( service=service, soa_dir=soa_dir, )} deploy_groups, invalid = validate_given_deploy_groups(service_deploy_groups, given_deploy_groups) if len(invalid) > 0: print PaastaColors.yellow("These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(deploy_groups) == 0: print PaastaColors.red("ERROR: No valid deploy groups specified for %s.\n" % (service)) return 1 commit = args.commit if not commit: list_previous_commits(service, deploy_groups, bool(given_deploy_groups), soa_dir) return 1 returncode = 0 for deploy_group in deploy_groups: returncode = max( mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, ), returncode, ) return returncode
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, cluster, instance and sha. These arguments will be verified and passed onto mark_for_deployment. """ service = figure_out_service_name(args) cluster = args.cluster git_url = get_git_url(service) commit = args.commit given_instances = args.instances.split(",") if cluster in list_clusters(service): service_instances = list_all_instances_for_service(service) instances, invalid = validate_given_instances(service_instances, given_instances) if len(invalid) > 0: print PaastaColors.yellow( "These instances are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(instances) is 0: print PaastaColors.red( "ERROR: No valid instances specified for %s.\n" % (service)) returncode = 1 for instance in instances: returncode = mark_for_deployment( git_url=git_url, cluster=cluster, instance=instance, service=service, commit=commit, ) else: print PaastaColors.red( "ERROR: The service %s is not deployed into cluster %s.\n" % (service, cluster)) returncode = 1 sys.exit(returncode)
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ service = figure_out_service_name(args) git_url = get_git_url(service) commit = args.commit given_deploy_groups = [ deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group ] service_deploy_groups = set(config.get_deploy_group() for config in get_instance_config_for_service( soa_dir=DEFAULT_SOA_DIR, service=service, )) deploy_groups, invalid = validate_given_deploy_groups( service_deploy_groups, given_deploy_groups) if len(invalid) > 0: print PaastaColors.yellow( "These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(deploy_groups) == 0: print PaastaColors.red( "ERROR: No valid deploy groups specified for %s.\n" % (service)) returncode = 1 for deploy_group in deploy_groups: returncode = mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, ) sys.exit(returncode)
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, cluster, instance and sha. These arguments will be verified and passed onto mark_for_deployment. """ service = figure_out_service_name(args) cluster = args.cluster git_url = get_git_url(service) commit = args.commit given_instances = args.instances.split(",") if cluster in list_clusters(service): service_instances = list_all_instances_for_service(service) instances, invalid = validate_given_instances(service_instances, given_instances) if len(invalid) > 0: print PaastaColors.yellow("These instances are not valid and will be skipped: %s.\n" % (",").join(invalid)) if len(instances) is 0: print PaastaColors.red("ERROR: No valid instances specified for %s.\n" % (service)) returncode = 1 for instance in instances: returncode = mark_for_deployment( git_url=git_url, cluster=cluster, instance=instance, service=service, commit=commit, ) else: print PaastaColors.red("ERROR: The service %s is not deployed into cluster %s.\n" % (service, cluster)) returncode = 1 sys.exit(returncode)
def paasta_rollback(args): """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ soa_dir = args.soa_dir service = figure_out_service_name(args, soa_dir) deploy_info = get_deploy_info(service=service, soa_dir=args.soa_dir) deploy_authz_check(deploy_info, service) git_url = get_git_url(service, soa_dir) given_deploy_groups = { deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group } all_deploy_groups = list_deploy_groups(service=service, soa_dir=soa_dir) deploy_groups, invalid = validate_given_deploy_groups( all_deploy_groups, given_deploy_groups ) if len(invalid) > 0: print( PaastaColors.yellow( "These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid) ) ) if len(deploy_groups) == 0: print( PaastaColors.red( "ERROR: No valid deploy groups specified for %s.\n" % (service) ) ) return 1 git_shas = get_git_shas_for_service(service, deploy_groups, soa_dir) commit = args.commit if not commit: print("Please specify a commit to mark for rollback (-k, --commit).") list_previous_commits( service, deploy_groups, bool(given_deploy_groups), git_shas ) return 1 elif commit not in git_shas and not args.force: print(PaastaColors.red("This Git SHA has never been deployed before.")) print("Please double check it or use --force to skip this verification.\n") list_previous_commits( service, deploy_groups, bool(given_deploy_groups), git_shas ) return 1 returncode = 0 for deploy_group in deploy_groups: rolled_back_from = get_currently_deployed_sha(service, deploy_group) returncode |= mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit ) # we could also gate this by the return code from m-f-d, but we probably care more about someone wanting to # rollback than we care about if the underlying machinery was successfully able to complete the request if rolled_back_from != commit: audit_action_details = { "rolled_back_from": rolled_back_from, "rolled_back_to": commit, "rollback_type": RollbackTypes.USER_INITIATED_ROLLBACK.value, "deploy_group": deploy_group, } _log_audit( action="rollback", action_details=audit_action_details, service=service ) return returncode
def paasta_rollback(args: argparse.Namespace) -> int: """Call mark_for_deployment with rollback parameters :param args: contains all the arguments passed onto the script: service, deploy groups and sha. These arguments will be verified and passed onto mark_for_deployment. """ soa_dir = args.soa_dir service = figure_out_service_name(args, soa_dir) deploy_info = get_deploy_info(service=service, soa_dir=args.soa_dir) if not can_user_deploy_service(deploy_info, service): return 1 git_url = get_git_url(service, soa_dir) if args.all_deploy_groups: given_deploy_groups = list_deploy_groups(service=service, soa_dir=soa_dir) else: given_deploy_groups = { deploy_group for deploy_group in args.deploy_groups.split(",") if deploy_group } all_deploy_groups = list_deploy_groups(service=service, soa_dir=soa_dir) deploy_groups, invalid = validate_given_deploy_groups( all_deploy_groups, given_deploy_groups) if len(invalid) > 0: print( PaastaColors.yellow( "These deploy groups are not valid and will be skipped: %s.\n" % (",").join(invalid))) if len(deploy_groups) == 0 and not args.all_deploy_groups: print( PaastaColors.red( "ERROR: No valid deploy groups specified for %s.\n Use the flag -a to rollback all valid deploy groups for this service" % (service))) return 1 versions = get_versions_for_service(service, deploy_groups, soa_dir) commit = args.commit image_version = args.image_version new_version = DeploymentVersion(sha=commit, image_version=image_version) if not commit: print("Please specify a commit to mark for rollback (-k, --commit).") list_previous_versions(service, deploy_groups, bool(given_deploy_groups), versions) return 1 elif new_version not in versions and not args.force: print( PaastaColors.red( f"This version {new_version} has never been deployed before.")) print( "Please double check it or use --force to skip this verification.\n" ) list_previous_versions(service, deploy_groups, bool(given_deploy_groups), versions) return 1 # TODO: Add similar check for when image_version is empty and no-commit redeploys is enforced for requested deploy_group returncode = 0 for deploy_group in deploy_groups: rolled_back_from = get_currently_deployed_version( service, deploy_group) returncode |= mark_for_deployment( git_url=git_url, service=service, deploy_group=deploy_group, commit=commit, image_version=image_version, ) # we could also gate this by the return code from m-f-d, but we probably care more about someone wanting to # rollback than we care about if the underlying machinery was successfully able to complete the request if rolled_back_from != new_version: audit_action_details = { "rolled_back_from": str(rolled_back_from), "rolled_back_to": str(new_version), "rollback_type": RollbackTypes.USER_INITIATED_ROLLBACK.value, "deploy_group": deploy_group, } _log_audit(action="rollback", action_details=audit_action_details, service=service) return returncode