Sha256: f1fbfdedf31eaa3610465c83c9d3daa9e3ec043bd1543a0d6d9cab6e2a5aa4f7

Contents?: true

Size: 1.62 KB

Versions: 3

Compression:

Stored size: 1.62 KB

Contents

require 'English'
require 'mcollective'

module Choria
  class Orchestrator
    class Error < StandardError; end
    class DiscoverError < Error; end

    module RpcResponse
      def sender
        self[:senderid]
      end

      def rpc_error?
        !rpc_success?
      end

      def rpc_success?
        [0, 1].include? self[:body][:statuscode]
      end

      def task_id
        self[:body][:data][:task_id]
      end
    end

    include MCollective::RPC

    attr_reader :logger

    def initialize(logger:)
      @logger = logger

      configfile ||= MCollective::Util.config_file_for_user
      MCollective::Config.instance.loadconfig(configfile)
    end

    def tasks_support
      @tasks_support ||= MCollective::Util::Choria.new.tasks_support
    end

    def run(task, targets: nil, targets_with_classes: nil, verbose: false)
      rpc_client.progress = verbose
      discover(targets: targets, targets_with_classes: targets_with_classes)
      raise DiscoverError, 'No requests sent, no nodes discovered' if rpc_client.discover.size.zero?

      task.run
    end

    def discover(targets: nil, targets_with_classes: nil)
      logger.debug "Targets: #{targets.nil? ? 'all' : targets})"
      targets&.each { |target| rpc_client.identity_filter target }

      unless targets_with_classes.nil?
        logger.debug "Filtering targets with classes: #{targets_with_classes}"
        targets_with_classes.each { |klass| rpc_client.class_filter klass }
      end

      logger.info 'Discovering targets…'
      rpc_client.discover
    end

    def rpc_client
      @rpc_client ||= rpcclient('bolt_tasks', options: {})
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
choria-colt-0.8.0 lib/choria/orchestrator.rb
choria-colt-0.7.0 lib/choria/orchestrator.rb
choria-colt-0.6.0 lib/choria/orchestrator.rb