From 71bc741e025648dc7cf8ef16be3fc2ecbcf14081 Mon Sep 17 00:00:00 2001 From: Vincent Janelle Date: Wed, 29 May 2024 11:30:30 -0700 Subject: [PATCH] (#195) Allow overriding federation as cli argument and playbook func args --- .ruby-version | 2 +- Gemfile | 5 +++-- lib/mcollective/client.rb | 1 + lib/mcollective/config.rb | 5 +++-- lib/mcollective/discovery/delegate.rb | 6 ++++++ lib/mcollective/optionparser.rb | 4 ++++ lib/mcollective/rpc.rb | 3 ++- lib/mcollective/util.rb | 3 ++- lib/mcollective/util/choria.rb | 4 +++- .../util/playbook/nodes/mcollective_nodes.rb | 11 +++++++++++ spec/unit/mcollective/rpc_spec.rb | 2 +- spec/unit/mcollective/util_spec.rb | 2 +- 12 files changed, 38 insertions(+), 10 deletions(-) diff --git a/.ruby-version b/.ruby-version index ecd7ee50..b347b11e 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.8 +3.2.3 diff --git a/Gemfile b/Gemfile index f30050d5..ab128bf8 100755 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ group :development, :test do gem "listen", "~> 3" gem "mcollective-test" gem "mocha", "~> 0.12.2" - gem "puppet", "~> 6" + gem "puppet", "~> 8" gem "rake", ">= 12.3.3" gem "rdoc" gem "rspec", "~> 3.9.0" @@ -20,5 +20,6 @@ group :development, :test do gem "semantic_puppet" gem "webmock" gem "yard" - gem "google-protobuf", "3.17.3" + gem "google-protobuf", "3.25" + end diff --git a/lib/mcollective/client.rb b/lib/mcollective/client.rb index 67b47823..a2c2a0b4 100644 --- a/lib/mcollective/client.rb +++ b/lib/mcollective/client.rb @@ -15,6 +15,7 @@ def initialize(options) @config.loadconfig(options[:config]) unless @config.configured @options = options @connection_timeout = options[:connection_timeout] + @config.federations = options[:federations] if options[:federations] else raise "Invalid parameter passed to Client constructor. Valid types are Hash or String" end diff --git a/lib/mcollective/config.rb b/lib/mcollective/config.rb index a17187c9..c22a2388 100644 --- a/lib/mcollective/config.rb +++ b/lib/mcollective/config.rb @@ -3,7 +3,7 @@ module MCollective class Config include Singleton - attr_accessor :mode + attr_accessor :mode, :federations attr_reader :daemonize, :pluginconf, :configured, :logfile, :keeplogs, :max_log_size, :loglevel, :logfacility, :identity, :connector, :securityprovider, :factsource, :registration, :registerinterval, :classesfile, @@ -112,7 +112,7 @@ def parse_config_file(configfile, libdirs) # rubocop:disable Metrics/MethodLengt when "default_batch_sleep_time" @default_batch_sleep_time = Float(val) else - # server config might now be choria config which will divirge from mcollective + # server config might now be choria config which will diverge from mcollective # in time, so we only raise this error when it looks like we aren't loading # a server config else we try our best to load as much as we can raise("Unknown config parameter '#{key}'") unless configfile =~ /server/ @@ -231,6 +231,7 @@ def set_config_defaults(configfile) # rubocop:disable Naming/AccessorMethodName @connection_timeout = nil @default_batch_size = 0 @default_batch_sleep_time = 1 + @federations = [] end def libdir diff --git a/lib/mcollective/discovery/delegate.rb b/lib/mcollective/discovery/delegate.rb index 2c50cfd6..6e09326a 100644 --- a/lib/mcollective/discovery/delegate.rb +++ b/lib/mcollective/discovery/delegate.rb @@ -6,6 +6,8 @@ def self.binary_name end def self.discover(filter, timeout, limit, client) + @config = Config.instance + raise("Cannot find the choria binary in your path") unless Util.command_in_path?("choria") cmd = [binary_name, "discover", "-j", "--silent"] @@ -37,6 +39,10 @@ def self.discover(filter, timeout, limit, client) cmd << "-S" << c.first["expr"] end + unless @config.federations.empty? + cmd << "--federations" << @config.federations.join(",") + end + client.options.fetch(:discovery_options, []).each do |opt| cmd << "--do" << opt end diff --git a/lib/mcollective/optionparser.rb b/lib/mcollective/optionparser.rb index a99853bd..b063852f 100644 --- a/lib/mcollective/optionparser.rb +++ b/lib/mcollective/optionparser.rb @@ -186,6 +186,10 @@ def add_common_options @parser.on("--connection-timeout TIMEOUT", Integer, "Set the timeout for establishing a connection to the middleware") do |v| @options[:connection_timeout] = Integer(v) end + + @parser.on("--federations FEDERATIONS", String, "Target federations") do |v| + @options[:federations] = String(v).split(",") + end end private diff --git a/lib/mcollective/rpc.rb b/lib/mcollective/rpc.rb index b65023dd..36255d7f 100644 --- a/lib/mcollective/rpc.rb +++ b/lib/mcollective/rpc.rb @@ -26,6 +26,7 @@ def rpcoptions Helpers.add_simplerpc_options(parser, opts) end + end # Wrapper to create clients, supposed to be used as @@ -171,7 +172,7 @@ def empty_filter?(options) def self.const_missing(const_name) super unless const_name == :DDL - Log.warn("MCollective::RPC::DDL is deprecatd, please use MCollective::DDL instead") + Log.warn("MCollective::RPC::DDL is deprecated, please use MCollective::DDL instead") MCollective::DDL end end diff --git a/lib/mcollective/util.rb b/lib/mcollective/util.rb index 3b65da56..f6a80a0a 100644 --- a/lib/mcollective/util.rb +++ b/lib/mcollective/util.rb @@ -216,7 +216,8 @@ def self.default_options :collective => nil, :discovery_method => nil, :discovery_options => Config.instance.default_discovery_options, - :filter => empty_filter + :filter => empty_filter, + :federations => [] } end diff --git a/lib/mcollective/util/choria.rb b/lib/mcollective/util/choria.rb index 76031756..1064a164 100644 --- a/lib/mcollective/util/choria.rb +++ b/lib/mcollective/util/choria.rb @@ -97,7 +97,9 @@ def federated? # # @return [Array] def federation_collectives - if override_networks = env_fetch("CHORIA_FED_COLLECTIVE", nil) + if (@config.federations.length > 0) + @config.federations + elsif (override_networks = env_fetch("CHORIA_FED_COLLECTIVE", nil)) override_networks.split(",").map(&:strip).reject(&:empty?) else get_option("choria.federation.collectives", "").split(",").map(&:strip).reject(&:empty?) diff --git a/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb b/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb index 5930639e..3f0bb939 100644 --- a/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb +++ b/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb @@ -64,6 +64,17 @@ def create_and_configure_client # @param data [Hash] input data matching nodes.json schema # @return [McollectiveNodes] def from_hash(data) + @config = Config.instance + + # Allow specifying federations at playbook execution time + if data["federations"] + if data["federations"].instance_of?(String) + @config.federations = [data["federations"]] + else + @config.federations = data["federations"] + end + end + @discovery_method = data.fetch("discovery_method", "mc") @agents = data.fetch("agents", ["rpcutil"]) @facts = data.fetch("facts", []) diff --git a/spec/unit/mcollective/rpc_spec.rb b/spec/unit/mcollective/rpc_spec.rb index f5ad7fd4..62841c83 100755 --- a/spec/unit/mcollective/rpc_spec.rb +++ b/spec/unit/mcollective/rpc_spec.rb @@ -6,7 +6,7 @@ module MCollective describe RPC do describe "#const_missing" do it "should deprecate only the DDL class" do - Log.expects(:warn).with("MCollective::RPC::DDL is deprecatd, please use MCollective::DDL instead") + Log.expects(:warn).with("MCollective::RPC::DDL is deprecated, please use MCollective::DDL instead") expect(MCollective::RPC::DDL).to eq(MCollective::DDL) expect { MCollective::RPC::Foo }.to raise_error(NameError) diff --git a/spec/unit/mcollective/util_spec.rb b/spec/unit/mcollective/util_spec.rb index 4aa4779f..3759b241 100755 --- a/spec/unit/mcollective/util_spec.rb +++ b/spec/unit/mcollective/util_spec.rb @@ -238,7 +238,7 @@ module MCollective empty_filter = Util.empty_filter config_file = Util.config_file_for_user - expect(Util.default_options).to eq({:verbose => false, :disctimeout => nil, :timeout => 5, :config => config_file, :filter => empty_filter, :collective => nil, :discovery_method => nil, :discovery_options => []}) + expect(Util.default_options).to eq({:verbose => false, :disctimeout => nil, :timeout => 5, :config => config_file, :filter => empty_filter, :collective => nil, :discovery_method => nil, :discovery_options => [], :federations => []}) end end