/app/controllers/projects/settings/operations_controller.rb

https://gitlab.com/realsatomic/gitlab · Ruby · 163 lines · 128 code · 33 blank · 2 comment · 14 complexity · 996929419257ab7a011dd29ff1a19963 MD5 · raw file

  1. # frozen_string_literal: true
  2. module Projects
  3. module Settings
  4. class OperationsController < Projects::ApplicationController
  5. layout 'project_settings'
  6. before_action :authorize_admin_operations!
  7. before_action :authorize_read_prometheus_alerts!, only: [:reset_alerting_token]
  8. before_action do
  9. push_frontend_feature_flag(:integrated_error_tracking, project)
  10. end
  11. respond_to :json, only: [:reset_alerting_token, :reset_pagerduty_token]
  12. helper_method :error_tracking_setting
  13. helper_method :tracing_setting
  14. feature_category :incident_management
  15. def update
  16. result = ::Projects::Operations::UpdateService.new(project, current_user, update_params).execute
  17. track_events(result)
  18. render_update_response(result)
  19. end
  20. def reset_alerting_token
  21. result = ::Projects::Operations::UpdateService
  22. .new(project, current_user, alerting_params)
  23. .execute
  24. if result[:status] == :success
  25. render json: { token: project.alerting_setting.token }
  26. else
  27. render json: {}, status: :unprocessable_entity
  28. end
  29. end
  30. def reset_pagerduty_token
  31. result = ::Projects::Operations::UpdateService
  32. .new(project, current_user, pagerduty_token_params)
  33. .execute
  34. if result[:status] == :success
  35. pagerduty_token = project.incident_management_setting&.pagerduty_token
  36. webhook_url = project_incidents_integrations_pagerduty_url(project, token: pagerduty_token)
  37. render json: { pagerduty_webhook_url: webhook_url, pagerduty_token: pagerduty_token }
  38. else
  39. render json: {}, status: :unprocessable_entity
  40. end
  41. end
  42. private
  43. def track_events(result)
  44. if result[:status] == :success
  45. ::Gitlab::Tracking::IncidentManagement.track_from_params(
  46. update_params[:incident_management_setting_attributes]
  47. )
  48. track_tracing_external_url
  49. end
  50. end
  51. def track_tracing_external_url
  52. external_url_previous_change = project&.tracing_setting&.external_url_previous_change
  53. return unless external_url_previous_change
  54. return unless external_url_previous_change[0].blank? && external_url_previous_change[1].present?
  55. ::Gitlab::Tracking.event('project:operations:tracing', 'external_url_populated', user: current_user, project: project, namespace: project.namespace)
  56. end
  57. def alerting_params
  58. { alerting_setting_attributes: { regenerate_token: true } }
  59. end
  60. def pagerduty_token_params
  61. { incident_management_setting_attributes: { regenerate_token: true } }
  62. end
  63. def render_update_response(result)
  64. respond_to do |format|
  65. format.html do
  66. render_update_html_response(result)
  67. end
  68. format.json do
  69. render_update_json_response(result)
  70. end
  71. end
  72. end
  73. def render_update_html_response(result)
  74. if result[:status] == :success
  75. flash[:notice] = _('Your changes have been saved')
  76. redirect_to project_settings_operations_path(@project)
  77. else
  78. render 'show'
  79. end
  80. end
  81. def render_update_json_response(result)
  82. if result[:status] == :success
  83. flash[:notice] = _('Your changes have been saved')
  84. render json: {
  85. status: result[:status]
  86. }
  87. else
  88. render(
  89. status: result[:http_status] || :bad_request,
  90. json: {
  91. status: result[:status],
  92. message: result[:message]
  93. }
  94. )
  95. end
  96. end
  97. def error_tracking_setting
  98. @error_tracking_setting ||= project.error_tracking_setting ||
  99. project.build_error_tracking_setting
  100. end
  101. def tracing_setting
  102. @tracing_setting ||= project.tracing_setting || project.build_tracing_setting
  103. end
  104. def update_params
  105. params.require(:project).permit(permitted_project_params)
  106. end
  107. # overridden in EE
  108. def permitted_project_params
  109. project_params = {
  110. incident_management_setting_attributes: ::Gitlab::Tracking::IncidentManagement.tracking_keys.keys,
  111. metrics_setting_attributes: [:external_dashboard_url, :dashboard_timezone],
  112. error_tracking_setting_attributes: [
  113. :enabled,
  114. :integrated,
  115. :api_host,
  116. :token,
  117. project: [:slug, :name, :organization_slug, :organization_name]
  118. ],
  119. grafana_integration_attributes: [:token, :grafana_url, :enabled],
  120. tracing_setting_attributes: [:external_url]
  121. }
  122. if Feature.enabled?(:settings_operations_prometheus_service, project)
  123. project_params[:prometheus_integration_attributes] = [:manual_configuration, :api_url]
  124. end
  125. project_params
  126. end
  127. end
  128. end
  129. end
  130. Projects::Settings::OperationsController.prepend_mod_with('Projects::Settings::OperationsController')