Class: RightScale::ReenrollManager

Inherits:
Object
  • Object
show all
Defined in:
lib/instance/reenroll_manager.rb

Overview

Tracks reenroll votes and trigger reenroll as necessary

Constant Summary collapse

REENROLL_THRESHOLD =

Number of votes required to trigger re-enroll

3
MAXIMUM_REENROLL_DELAY =

Additional number of seconds that should be spent in offline mode before triggering a re-enroll after vote threshold has been reached

900
RESET_DELAY =

Delay in seconds until votes count is reset if no more votes occur This value should be more than two hours as this is the period at which votes will get generated in offline mode

7200

Class Method Summary collapse

Class Method Details

.reenroll!(args = nil) ⇒ Object

Trigger reenroll

Parameters

args(String)

Arguments to be passed through to rs_reenroll

Return

true

If command ran successfully

false

Otherwise



95
96
97
98
99
100
# File 'lib/instance/reenroll_manager.rb', line 95

def self.reenroll!(args=nil)
  cmd = "rs_reenroll #{args}"
  cmd += '&' unless RightScale::Platform.windows?
  AMQP.stop { EM.stop } rescue nil
  system(cmd)
end

.reenrolling?Boolean

Are we currently reenrolling?

Return

true

If we are currently re-enrolling (note: process is going away)

false

Otherwise

Returns:

  • (Boolean)


45
46
47
# File 'lib/instance/reenroll_manager.rb', line 45

def self.reenrolling?
  @reenrolling
end

.reset_votesObject

Reset votes count

Return

true

Always return true



81
82
83
84
85
# File 'lib/instance/reenroll_manager.rb', line 81

def self.reset_votes
  @total_votes = 0
  @reset_timer = nil
  true
end

.set_reenrollingObject

Set reenrolling flag

Return

true

Always return true



53
54
55
# File 'lib/instance/reenroll_manager.rb', line 53

def self.set_reenrolling
  @reenrolling = true
end

.voteObject

Vote for re-enrolling, if threshold is reached re-enroll If no vote occurs in the next two hours, then reset counter

Return

true

Always return true



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/instance/reenroll_manager.rb', line 62

def self.vote
  @total_votes ||= 0
  @reenrolling ||= false
  @total_votes += 1
  @reset_timer.cancel if @reset_timer
  @reset_timer = EM::Timer.new(RESET_DELAY) { reset_votes }
  if @total_votes >= REENROLL_THRESHOLD && !@reenrolling
    delay = rand(MAXIMUM_REENROLL_DELAY)
    Log.info("[re-enroll] Re-enroll threshold reached, shutting down and re-enrolling in #{delay} seconds")
    set_reenrolling
    EM::Timer.new(delay) { reenroll! }
  end
  true
end