Sha256: bcfad95340c9b6c08458e8f1c0a3878f4532dd79dbdd96739de6b0df14644029

Contents?: true

Size: 1.93 KB

Versions: 1

Compression:

Stored size: 1.93 KB

Contents

require 'ridley'

require 'set'


class SyncServers
  attr_reader :status


  def initialize knives
    @knives  = knives
    @started = Time.now
    @status  = sync_servers.merge \
      elapsed: Time.now - @started rescue nil
  end



private

  def ridleys
    @ridleys ||= @knives.map do |knife|
      Ridley.from_chef_config(knife)
    end
  end


  def all_nodes
    @clients ||= {}
    bad_ridleys = []

    @all_nodes ||= ridleys.each_with_index.pmap(4) do |ridley, i|
      clients = ridley.client.all

      begin
        nodes = ridley.partial_search(:node, '*:*', %w[ ohai_time ])
      rescue
        puts 'WARNING: No partial search, skipping knife'
        bad_ridleys << i
        nodes = []
      end

      nodes.map do |n|
        c = clients.select { |c| c.name == n.name }.shift
        @clients[n.name] = c unless c.nil?
        n
      end
    end.flatten

    bad_ridleys.sort.reverse.each do |idx|
      @ridleys.delete_at idx
    end

    return @all_nodes
  end


  def merged_nodes
    @merged_nodes ||= all_nodes.group_by(&:name).pmap do |_, copies|
      copies.sort_by do |c|
        time = c.automatic.ohai_time
        time.is_a?(Float) ? time : -1.0
      end.last
    end
  end


  def sync_servers
    nodes = merged_nodes
    failures = Set.new

    nodes.peach(8) do |n|
      n.reload

      ridleys.peach(4) do |ridley|
        ridley.node.create(n) \
        rescue ridley.node.update(n) \
        rescue failures << n.name

        c = @clients[n.name]
        next if c.nil?
        ridley.client.create(c) \
        rescue ridley.client.update(c) \
        rescue puts('WARNING: Client sync failed for node "%s"' % n.name)
      end

      puts 'Synced node "%s"' % n.name
    end unless @ridleys.length == 1

    puts 'Sync completed'
    return {
      failures: failures,
      num_successes: nodes.length - failures.length,
      num_failures: failures.length,
      num_nodes: nodes.length
    }
  rescue
    return nil
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kitchen_hooks-1.7.4 lib/kitchen_hooks/helpers/sync_servers.rb