Sha256: d2fb66e4d1dc45c0a123872a0797730a11ab3e92e976059bec564816b6829b27

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

require "forwardable"
module RodeoClown
  class ELB < Struct.new(:elb)

    def timeout
      @timeout ||= (ENV["TIMEOUT"] || 60).to_i
    end

    extend Forwardable
      def_delegators :elb, :availability_zones, :instances

    def self.by_name(name)
      new load_balancers[name]
    end

    def self.load_balancers
      AWS::ELB.new.load_balancers
    end

    def register_and_wait(new_instances)
      new_instances.each do |i|
        begin
          puts "...registering: #{i.id}"
          instances.register(i.id)
        rescue AWS::ELB::Errors::InvalidInstance
          puts "Instance #{i.id} could not be registered to load balancer"
        end
      end

      wait_for_state(instances, "InService")
    end

    def deregister(ary_instances)
      ary_instances.each do |i|
        begin
          puts "...deregistering: #{i.id}"
          instances.deregister(i.id)
        rescue AWS::ELB::Errors::InvalidInstance
          puts "Instance #{i.id} currently not registered to load balancer"
        end
      end
    end

    #
    # Rotate servers given 
    #
    def rotate(hsh)
      current_ec2, new_ec2 = hsh.first

      cur_instances = EC2.by_tags("Name" => current_ec2.to_s)
      new_instances = EC2.by_tags("Name" => new_ec2.to_s)

      register_and_wait new_instances
      deregister        cur_instances
    end

    #
    # Wait for all the instances to become InService
    #
    def wait_for_state(instances, exp_state)

      time = 0
      all_good = false

      loop do
        all_good = instances.all? do |i|
          state = i.elb_health[:state] 
          puts "#{i.id}: #{state}"

          exp_state == state
        end

        break if all_good || time > timeout

        sleep 1
        time += 1
      end

      # If timeout before all inservice, deregister and raise error
      unless all_good
        raise "Instances are out of service"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rodeo_clown-0.1.0 lib/rodeo_clown/elb.rb