Sha256: 793f6c2e894801b1b257ea60ceb8ea7b637700922022ac142517ad709f4c9e6b

Contents?: true

Size: 1.54 KB

Versions: 3

Compression:

Stored size: 1.54 KB

Contents

require 'csv'

module LitmusPaper
  module Dependency
    class HaproxyBackends

      module HaproxyStatReader
        def initialize(fiber)
          @fiber = fiber
          @stats = ""
        end

        def connection_completed
          send_data("show stat\n")
        end

        def receive_data(data)
          @stats << data
          @fiber.resume(@stats) if finished?
        end

        def finished?
          @stats =~ /\n\n\z/
        end
      end

      def initialize(domain_socket, cluster)
        @domain_socket = domain_socket
        @cluster = cluster
      end

      def available?
        stats = _parse_stats(_fetch_stats)
        servers = _servers_in(stats, @cluster)

        if not _any_up?(servers)
          LitmusPaper.logger.info("None of the servers (#{servers.map{ |s| s['svname'] }.join(',')}) are up")
          false
        else
          true
        end
      end

      def _any_up?(servers)
        available = servers.select { |s| s['status'] == "UP" }
        available.size > 0
      end

      def _servers_in(stats, cluster)
        stats.select do |line|
          line['# pxname'] == cluster && !["FRONTEND", "BACKEND"].include?(line["svname"])
        end
      end

      def _parse_stats(csv)
        stats = CSV.parse(_fetch_stats)
        headers = stats.shift
        stats.map { |stat| Hash[headers.zip(stat)] }
      end

      def _fetch_stats
        fiber = Fiber.current

        connection = EM.connect_unix_domain(@domain_socket, HaproxyStatReader, fiber)

        Fiber.yield
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
litmus_paper-0.2.2 lib/litmus_paper/dependency/haproxy_backends.rb
litmus_paper-0.2.1 lib/litmus_paper/dependency/haproxy_backends.rb
litmus_paper-0.2.0 lib/litmus_paper/dependency/haproxy_backends.rb