57 lines
1.6 KiB
Ruby
57 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class ChaosController < ActionController::Base
|
||
|
before_action :validate_request
|
||
|
|
||
|
def leakmem
|
||
|
memory_mb = (params[:memory_mb]&.to_i || 100)
|
||
|
duration_s = (params[:duration_s]&.to_i || 30).seconds
|
||
|
|
||
|
start = Time.now
|
||
|
retainer = []
|
||
|
# Add `n` 1mb chunks of memory to the retainer array
|
||
|
memory_mb.times { retainer << "x" * 1.megabyte }
|
||
|
|
||
|
duration_taken = (Time.now - start).seconds
|
||
|
Kernel.sleep duration_s - duration_taken if duration_s > duration_taken
|
||
|
|
||
|
render text: "OK", content_type: 'text/plain'
|
||
|
end
|
||
|
|
||
|
def cpuspin
|
||
|
duration_s = (params[:duration_s]&.to_i || 30).seconds
|
||
|
end_time = Time.now + duration_s.seconds
|
||
|
|
||
|
rand while Time.now < end_time
|
||
|
|
||
|
render text: "OK", content_type: 'text/plain'
|
||
|
end
|
||
|
|
||
|
def sleep
|
||
|
duration_s = (params[:duration_s]&.to_i || 30).seconds
|
||
|
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']
|
||
|
# GITLAB_CHAOS_SECRET is required unless you're running in Development mode
|
||
|
if !secret && !Rails.env.development?
|
||
|
render text: "chaos misconfigured: please configure GITLAB_CHAOS_SECRET when using GITLAB_ENABLE_CHAOS_ENDPOINTS outside of a development environment", content_type: 'text/plain', status: 500
|
||
|
end
|
||
|
|
||
|
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
|