spheromak/services

View on GitHub
lib/services.rb

Summary

Maintainability
A
45 mins
Test Coverage
#
# Services Module
#
#  Uses etcd to manage state of Service Endpoint & Members
#
module Services
  require_relative 'services/version'
  require_relative 'services/connection'
  require_relative 'services/entity'
  require_relative 'services/service'
  require_relative 'services/endpoint'
  require_relative 'services/member'

  # this will  change or be slurped up from a config/node attrib
  KEY = '/services'

  #
  # Share a connection between all classess using this module
  #
  class << self
    attr_accessor :connection, :run_context

    # proxy method to Etcd::Client.get
    def get(*args)
      Chef::Log.debug "connection.get args #{args}" unless run_context.nil?
      connection.get(*args) if exists?(*args)
    end

    # proxy method to Etcd::Client.set
    def set(*args)
      Chef::Log.debug "connection.set args #{args}" unless run_context.nil?
      connection.set(*args)
    end

    # proxy method to Etcd::Client.exists?
    def exists?(*args)
      connection.exists?(*args)
    end

    # return a list of all services
    def all
      services = []
      get(KEY).node.children.each do |s|
        name = File.basename s.key
        services << Services::Service.new(name)
      end
      services
    end

    # return all services a node is subscribed to
    def subscribed(f = nil)
      fail 'param and run_context can not both be nil' if f.nil? && run_context.nil?
      fqdn = f.nil? ? run_context.node.fqdn : f
      services = []
      all.each do |s|
        services.concat s.members.map { |m| m.name == fqdn ? s.name : nil }
      end
      services.compact
    end
  end
end