def test_paasta_mark_for_deployment_acts_like_main( mock_mark_for_deployment, mock_validate_service_name, ): mock_mark_for_deployment.return_value = 42 with raises(SystemExit) as sys_exit: mark_for_deployment.paasta_mark_for_deployment(fake_args) mock_mark_for_deployment.assert_called_once_with( service='test_service', deploy_group='test_deploy_group', commit='fake-hash', git_url='git://false.repo/services/test_services', ) assert mock_validate_service_name.called assert sys_exit.value.code == 42
def test_paasta_mark_for_deployment_with_good_rollback( mock_get_currently_deployed_sha, mock_wait_for_deployment, mock_mark_for_deployment, mock_validate_service_name, ): class fake_args_rollback(fake_args): auto_rollback = True block = True timeout = 600 mock_wait_for_deployment.side_effect = TimeoutError mock_get_currently_deployed_sha.return_value = "old-sha" assert mark_for_deployment.paasta_mark_for_deployment(fake_args_rollback) == 1 mock_mark_for_deployment.assert_any_call( service='test_service', deploy_group='test_deploy_group', commit='fake-hash', git_url='git://false.repo/services/test_services', ) mock_mark_for_deployment.assert_any_call( service='test_service', deploy_group='test_deploy_group', commit='old-sha', git_url='git://false.repo/services/test_services', ) mock_mark_for_deployment.call_count = 2
def step_paasta_mark_for_deployments_when(context): fake_args = mock.MagicMock( deploy_group="test_cluster.test_instance", service="fake_deployments_json_service", git_url=context.test_git_repo_dir, commit=context.expected_commit, block=False, ) context.force_bounce_timestamp = format_timestamp(datetime.utcnow()) with contextlib.nested( mock.patch("paasta_tools.utils.format_timestamp", autosepc=True, return_value=context.force_bounce_timestamp), mock.patch("paasta_tools.cli.cmds.mark_for_deployment.validate_service_name", autospec=True, return_value=True), ) as (mock_format_timestamp, mock_validate_service_name): try: paasta_mark_for_deployment(fake_args) except SystemExit: pass
def step_paasta_mark_for_deployments_when(context): fake_args = mock.MagicMock( deploy_group='test_cluster.test_instance', service='fake_deployments_json_service', git_url=context.test_git_repo_dir, commit=context.expected_commit, soa_dir='fake_soa_configs', block=False, verify_image=False, ) context.force_bounce_timestamp = format_timestamp(datetime.utcnow()) with mock.patch( 'paasta_tools.utils.format_timestamp', autospec=True, return_value=context.force_bounce_timestamp, ), mock.patch( 'paasta_tools.cli.cmds.mark_for_deployment.validate_service_name', autospec=True, return_value=True, ): try: paasta_mark_for_deployment(fake_args) except SystemExit: pass
def test_paasta_mark_for_deployment_acts_like_main( mock_get_currently_deployed_sha, mock_mark_for_deployment, mock_validate_service_name, ): mock_mark_for_deployment.return_value = 42 assert mark_for_deployment.paasta_mark_for_deployment(FakeArgs) == 42 mock_mark_for_deployment.assert_called_once_with( service='test_service', deploy_group='test_deploy_group', commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4', git_url='git://false.repo/services/test_services', ) assert mock_validate_service_name.called
def test_paasta_mark_for_deployment_acts_like_main( mock_get_currently_deployed_sha, mock_mark_for_deployment, mock_validate_service_name, ): mock_mark_for_deployment.return_value = 42 assert mark_for_deployment.paasta_mark_for_deployment(fake_args) == 42 mock_mark_for_deployment.assert_called_once_with( service='test_service', deploy_group='test_deploy_group', commit='fake-hash', git_url='git://false.repo/services/test_services', ) assert mock_validate_service_name.called
def test_paasta_mark_for_deployment_with_skips_rollback_when_same_sha( mock_get_currently_deployed_sha, mock_wait_for_deployment, mock_mark_for_deployment, mock_validate_service_name, ): class fake_args_rollback(fake_args): auto_rollback = True block = True timeout = 600 mock_wait_for_deployment.side_effect = TimeoutError mock_get_currently_deployed_sha.return_value = "fake-hash" assert mark_for_deployment.paasta_mark_for_deployment(fake_args_rollback) == 1 mock_mark_for_deployment.assert_called_once_with( service='test_service', deploy_group='test_deploy_group', commit='fake-hash', git_url='git://false.repo/services/test_services', )
def test_paasta_mark_for_deployment_with_good_rollback( mock_get_currently_deployed_sha, mock_do_wait_for_deployment, mock_mark_for_deployment, mock_validate_service_name, mock_get_slack_client, ): class FakeArgsRollback(FakeArgs): auto_rollback = True block = True timeout = 600 mock_mark_for_deployment.return_value = 0 def do_wait_for_deployment_side_effect(self, target_commit): if target_commit == FakeArgs.commit: self.trigger('rollback_button_clicked') else: self.trigger('deploy_finished') mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect def on_enter_rolled_back_side_effect(self): self.trigger('abandon_button_clicked') mock_get_currently_deployed_sha.return_value = "old-sha" with patch( 'paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.periodically_update_slack', autospec=True, ), patch( 'paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back', autospec=True, wraps=mark_for_deployment.MarkForDeploymentProcess. on_enter_rolled_back, side_effect=on_enter_rolled_back_side_effect, ): assert mark_for_deployment.paasta_mark_for_deployment( FakeArgsRollback) == 1 print(mock_mark_for_deployment.mock_calls) mock_mark_for_deployment.assert_any_call( service='test_service', deploy_group='test_deploy_group', commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4', git_url='git://false.repo/services/test_services', ) mock_mark_for_deployment.assert_any_call( service='test_service', deploy_group='test_deploy_group', commit='old-sha', git_url='git://false.repo/services/test_services', ) assert mock_mark_for_deployment.call_count == 2 mock_do_wait_for_deployment.assert_any_call( mock.ANY, target_commit='d670460b4b4aece5915caf5c68d12f560a9fe3e4', ) mock_do_wait_for_deployment.assert_any_call( mock.ANY, target_commit='old-sha', ) assert mock_do_wait_for_deployment.call_count == 2
def test_paasta_mark_for_deployment_with_good_rollback( mock_load_system_paasta_config, mock_list_deploy_groups, mock_get_currently_deployed_sha, mock_do_wait_for_deployment, mock_mark_for_deployment, mock_validate_service_name, mock_get_slack_client, mock__log_audit, mock_periodically_update_slack, ): class FakeArgsRollback(FakeArgs): auto_rollback = True block = True timeout = 600 mock_list_deploy_groups.return_value = ["test_deploy_groups"] mock_mark_for_deployment.return_value = 0 def do_wait_for_deployment_side_effect(self, target_commit): if target_commit == FakeArgs.commit: self.trigger("rollback_button_clicked") else: self.trigger("deploy_finished") mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect def on_enter_rolled_back_side_effect(self): self.trigger("abandon_button_clicked") mock_get_currently_deployed_sha.return_value = "old-sha" with patch( "paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back", autospec=True, wraps=mark_for_deployment.MarkForDeploymentProcess. on_enter_rolled_back, side_effect=on_enter_rolled_back_side_effect, ): assert mark_for_deployment.paasta_mark_for_deployment( FakeArgsRollback) == 1 mock_mark_for_deployment.assert_any_call( service="test_service", deploy_group="test_deploy_group", commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4", git_url="git://false.repo/services/test_services", ) mock_mark_for_deployment.assert_any_call( service="test_service", deploy_group="test_deploy_group", commit="old-sha", git_url="git://false.repo/services/test_services", ) assert mock_mark_for_deployment.call_count == 2 mock_do_wait_for_deployment.assert_any_call( mock.ANY, target_commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4") mock_do_wait_for_deployment.assert_any_call(mock.ANY, target_commit="old-sha") assert mock_do_wait_for_deployment.call_count == 2 # in normal usage, this would also be called once per m-f-d, but we mock that out above # so _log_audit is only called as part of handling the rollback assert mock__log_audit.call_count == len( mock_list_deploy_groups.return_value)
def test_paasta_mark_for_deployment_with_good_rollback( mock_get_metrics, mock_load_system_paasta_config, mock_list_deploy_groups, mock_get_currently_deployed_version, mock_do_wait_for_deployment, mock_mark_for_deployment, mock_validate_service_name, mock_get_slack_client, mock__log_audit, mock_get_instance_configs, mock_periodically_update_slack, ): class FakeArgsRollback(FakeArgs): auto_rollback = True block = True timeout = 600 warn = 80 # % of timeout to warn at polling_interval = 15 diagnosis_interval = 15 time_before_first_diagnosis = 15 mock_list_deploy_groups.return_value = ["test_deploy_groups"] config_mock = mock.Mock() config_mock.get_default_push_groups.return_value = None mock_load_system_paasta_config.return_value = config_mock mock_get_instance_configs.return_value = { "fake_cluster": [], "fake_cluster2": [] } mock_mark_for_deployment.return_value = 0 def do_wait_for_deployment_side_effect(self, target_commit, target_image_version): if (target_commit == FakeArgs.commit and target_image_version == FakeArgs.image_version): self.trigger("rollback_button_clicked") else: self.trigger("deploy_finished") mock_do_wait_for_deployment.side_effect = do_wait_for_deployment_side_effect def on_enter_rolled_back_side_effect(self): self.trigger("abandon_button_clicked") mock_get_currently_deployed_version.return_value = DeploymentVersion( "old-sha", None) with patch( "paasta_tools.cli.cmds.mark_for_deployment.MarkForDeploymentProcess.on_enter_rolled_back", autospec=True, wraps=mark_for_deployment.MarkForDeploymentProcess. on_enter_rolled_back, side_effect=on_enter_rolled_back_side_effect, ): assert mark_for_deployment.paasta_mark_for_deployment( FakeArgsRollback) == 1 mock_mark_for_deployment.assert_any_call( service="test_service", deploy_group="test_deploy_group", commit="d670460b4b4aece5915caf5c68d12f560a9fe3e4", git_url="git://false.repo/services/test_services", image_version="extrastuff", ) mock_mark_for_deployment.assert_any_call( service="test_service", deploy_group="test_deploy_group", commit="old-sha", git_url="git://false.repo/services/test_services", image_version=None, ) assert mock_mark_for_deployment.call_count == 2 mock_do_wait_for_deployment.assert_any_call( mock.ANY, "d670460b4b4aece5915caf5c68d12f560a9fe3e4", "extrastuff") mock_do_wait_for_deployment.assert_any_call(mock.ANY, "old-sha", None) assert mock_do_wait_for_deployment.call_count == 2 # in normal usage, this would also be called once per m-f-d, but we mock that out above # so _log_audit is only called as part of handling the rollback assert mock__log_audit.call_count == len( mock_list_deploy_groups.return_value) mock__log_audit.assert_called_once_with( action="rollback", action_details={ "deploy_group": "test_deploy_group", "rolled_back_from": "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)", "rolled_back_to": "old-sha", "rollback_type": "user_initiated_rollback", }, service="test_service", ) mock_get_metrics.assert_called_once_with("paasta.mark_for_deployment") mock_get_metrics.return_value.create_timer.assert_called_once_with( name="deploy_duration", default_dimensions=dict( paasta_service="test_service", deploy_group="test_deploy_group", old_version="old-sha", new_version= "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)", deploy_timeout=600, ), ) mock_timer = mock_get_metrics.return_value.create_timer.return_value mock_timer.start.assert_called_once_with() mock_timer.stop.assert_called_once_with(tmp_dimensions=dict(exit_status=1)) mock_emit_event = mock_get_metrics.return_value.emit_event event_dimensions = dict( paasta_service="test_service", deploy_group="test_deploy_group", rolled_back_from= "DeploymentVersion(sha=d670460b4b4aece5915caf5c68d12f560a9fe3e4, image_version=extrastuff)", rolled_back_to="old-sha", rollback_type="user_initiated_rollback", ) expected_calls = [] for cluster in mock_get_instance_configs.return_value.keys(): dims = dict(event_dimensions) dims["paasta_cluster"] = cluster exp_call = call(name="rollback", dimensions=dims) expected_calls.append(exp_call) mock_emit_event.assert_has_calls(expected_calls, any_order=True)