class ExternalDatabaseCreationActions {

    @Bean(name = "EXTERNAL_DATABASE_CREATION_FAILED_STATE")
    public Action<?, ?> externalDatabaseCreationFailureAction() {
        return new AbstractExternalDatabaseCreationAction<>(CreateExternalDatabaseFailed.class) {

            @Override
            protected void doExecute(ExternalDatabaseContext context, CreateExternalDatabaseFailed payload, Map<Object, Object> variables) {
                stackUpdaterService.updateStatus(context.getStack().getId(), DetailedStackStatus.EXTERNAL_DATABASE_CREATION_FAILED,
                        ResourceEvent.CLUSTER_EXTERNAL_DATABASE_CREATION_FAILED, payload.getException().getMessage());
                getMetricService().incrementMetricCounter(MetricType.EXTERNAL_DATABASE_CREATION_FAILED, context.getStack());
                sendEvent(context);
            }

            @Override
            protected Selectable createRequest(ExternalDatabaseContext context) {
                return new StackEvent(StackCreationEvent.STACKCREATION_FAILURE_HANDLED_EVENT.event(), context.getStack().getId());
            }

            @Override
            protected void beforeReturnFlowContext(FlowParameters flowParameters,
                    StateContext<ExternalDatabaseCreationState, ExternalDatabaseCreationEvent> stateContext, CreateExternalDatabaseFailed payload) {

                Flow flow = getFlow(flowParameters.getFlowId());
                flow.setFlowFailed(payload.getException());
                super.beforeReturnFlowContext(flowParameters, stateContext, payload);
            }
        };
    }

}