module EventStore::HTTP::Controls::Cluster::CurrentMembers

Public Class Methods

get() click to toggle source
# File lib/event_store/http/controls/cluster/current_members.rb, line 6
def self.get
  port = Port.example

  ip_address = IPAddress::Cluster.list.detect do |ip_address|
    begin
      socket = TCPSocket.new ip_address, port
      socket.close
      true
    rescue SystemCallError
      false
    end
  end

  leader_ip_address = nil
  follower_ip_addresses = []

  Net::HTTP.start ip_address, port do |connection|
    connection.read_timeout = 0.1

    response = connection.request_get '/gossip', { 'Accept' => 'application/json' }

    fail unless response.code == '200'

    json_text = response.body

    gossip_status = ::JSON.parse json_text

    members = gossip_status['members']

    members.each do |member|
      ip_address = member['externalHttpIp']

      if member['state'] == 'Master'
        leader_ip_address = ip_address
      else
        follower_ip_addresses << ip_address
      end
    end
  end

  return leader_ip_address, *follower_ip_addresses
end