Class: Environments::StopService

Inherits:
BaseService show all
Defined in:
app/services/environments/stop_service.rb

Instance Attribute Summary collapse

Attributes inherited from BaseService

#current_user, #params, #project

Instance Method Summary collapse

Methods inherited from BaseService

#initialize

Methods included from BaseServiceUtility

#deny_visibility_level, #event_service, #log_error, #log_info, #notification_service, #system_hook_service, #todo_service, #visibility_level

Methods included from Gitlab::Allowable

#can?, #can_all?, #can_any?

Constructor Details

This class inherits a constructor from BaseService

Instance Attribute Details

#refObject (readonly)

Returns the value of attribute ref.



5
6
7
# File 'app/services/environments/stop_service.rb', line 5

def ref
  @ref
end

Instance Method Details

#execute(environment) ⇒ Object



7
8
9
10
11
12
13
14
15
16
# File 'app/services/environments/stop_service.rb', line 7

def execute(environment)
  unless can?(current_user, :stop_environment, environment)
    return ServiceResponse.error(
      message: 'Unauthorized to stop the environment',
      payload: { environment: environment }
    )
  end

  unsafe_execute!(environment)
end

#execute_for_branch(branch_name) ⇒ Object



43
44
45
46
47
48
49
# File 'app/services/environments/stop_service.rb', line 43

def execute_for_branch(branch_name)
  @ref = branch_name

  return unless @ref.present?

  environments.each { |environment| execute(environment) }
end

#execute_for_merge_request_pipeline(merge_request) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/services/environments/stop_service.rb', line 51

def execute_for_merge_request_pipeline(merge_request)
  return unless merge_request.diff_head_pipeline&.merge_request?

  created_environments = merge_request.created_environments

  if created_environments.any?
    created_environments.each do |env|
      # This log message can be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/372965
      Gitlab::AppJsonLogger.info(
        message: 'Running new dynamic environment stop logic',
        project_id: project.id,
        environment_id: env.id,
        merge_request_id: merge_request.id,
        pipeline_id: merge_request.diff_head_pipeline.id
      )

      execute(env)
    end
  else
    environments_in_head_pipeline = merge_request.environments_in_head_pipeline(deployment_status: :success)

    environments_in_head_pipeline.each do |env|
      # This log message can be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/372965
      Gitlab::AppJsonLogger.info(
        message: 'Running legacy dynamic environment stop logic',
        project_id: project.id,
        environment_id: env.id,
        merge_request_id: merge_request.id,
        pipeline_id: merge_request.diff_head_pipeline.id
      )

      execute(env)
    end
  end
end

#unsafe_execute!(environment) ⇒ Object

Stops the environment without checking user permissions. This should only be used if initiated by a system action and a user cannot be specified.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'app/services/environments/stop_service.rb', line 22

def unsafe_execute!(environment)
  if params[:force]
    actions = []

    environment.stop_complete!
  else
    actions = environment.stop_with_actions!
  end

  if environment.stopped? || environment.stopping?
    delete_managed_resources(environment)

    ServiceResponse.success(payload: { environment: environment, actions: actions })
  else
    ServiceResponse.error(
      message: 'Attempted to stop the environment but failed to change the status',
      payload: { environment: environment }
    )
  end
end