summaryrefslogtreecommitdiff
path: root/app/controllers/chaos_controller.rb
blob: 6593b748130df4bad2925b600f3ba51783c2ac3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# frozen_string_literal: true

class ChaosController < ActionController::Base
  before_action :validate_request

  def leakmem
    memory_mb = params[:memory_mb] ? params[:memory_mb].to_i : 100
    retainer = []

    memory_mb.times { retainer << "x" * (1024 * 1024) }
    render text: "OK", content_type: 'text/plain'
  end

  def cpuspin
    duration_s = params[:duration_s] ? params[:duration_s].to_i : 30
    end_time = Time.now + duration_s.seconds;
    while Time.now < end_time
      10_000.times { }
    end

    render text: "OK", content_type: 'text/plain'
  end

  def sleep
    duration_s = params[:duration_s] ? params[:duration_s].to_i : 30
    Kernel.sleep duration_s
    render text: "OK", content_type: 'text/plain'
  end

  def kill
    Process.kill("KILL", Process.pid)
  end

  private

  def validate_request
    secret = ENV['GITLAB_CHAOS_SECRET']
    return unless secret

    unless request.headers["HTTP_X_CHAOS_SECRET"] == secret
      render text: "To experience chaos, please set X-Chaos-Secret header", content_type: 'text/plain', status: 401
    end
  end

end