From 409c322c9fc09e1720f984ed45719fe242b1a5d1 Mon Sep 17 00:00:00 2001 From: Nick Carboni Date: Tue, 16 Jul 2019 15:31:02 -0400 Subject: [PATCH 1/5] Sort ServiceAnsiblePlaybook::CONFIG_OPTIONS_WHITELIST --- app/models/service_ansible_playbook.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/service_ansible_playbook.rb b/app/models/service_ansible_playbook.rb index e3553b48a4f..35d73576263 100644 --- a/app/models/service_ansible_playbook.rb +++ b/app/models/service_ansible_playbook.rb @@ -87,12 +87,12 @@ def get_job_options(action) end CONFIG_OPTIONS_WHITELIST = %i[ - hosts - extra_vars + cloud_credential_id credential_id - vault_credential_id + extra_vars + hosts network_credential_id - cloud_credential_id + vault_credential_id ].freeze def config_options(action) From 002780431143b9a36991b9ba4fefa4f1d19cd0a3 Mon Sep 17 00:00:00 2001 From: Nick Carboni Date: Tue, 16 Jul 2019 15:49:52 -0400 Subject: [PATCH 2/5] Propogate execution_ttl to job timeout Previously this option was being ignored and the job timeout was always the default of 1.hour --- .../automation_manager/configuration_script.rb | 5 ++++- app/models/service_ansible_playbook.rb | 1 + .../automation_manager/configuration_script_spec.rb | 8 ++++++++ spec/models/service_ansible_playbook_spec.rb | 6 +++++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb b/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb index be691cb6259..9dd87446dae 100644 --- a/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb +++ b/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb @@ -34,7 +34,10 @@ def run(vars = {}) playbook_vars = { :playbook_path => parent.path } credentials = collect_credentials(vars) - workflow.create_job({}, extra_vars, playbook_vars, vars[:hosts], credentials).tap do |job| + kwargs = {} + kwargs[:timeout] = vars[:execution_ttl].to_i.minutes if vars[:execution_ttl].present? + + workflow.create_job({}, extra_vars, playbook_vars, vars[:hosts], credentials, kwargs).tap do |job| job.signal(:start) end end diff --git a/app/models/service_ansible_playbook.rb b/app/models/service_ansible_playbook.rb index 35d73576263..ea0ad7d5eca 100644 --- a/app/models/service_ansible_playbook.rb +++ b/app/models/service_ansible_playbook.rb @@ -89,6 +89,7 @@ def get_job_options(action) CONFIG_OPTIONS_WHITELIST = %i[ cloud_credential_id credential_id + execution_ttl extra_vars hosts network_credential_id diff --git a/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb b/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb index 8bdc4356a5c..2adce7fb5af 100644 --- a/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb +++ b/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb @@ -43,6 +43,7 @@ expect(job.options[:env_vars]).to eq({}) expect(job.options[:extra_vars]).to eq(:instance_ids => ["i-3434"]) expect(job.options[:playbook_path]).to eq(playbook.path) + expect(job.options[:timeout]).to eq(1.hour) end it "accepts different variables to launch a job template against" do @@ -54,6 +55,13 @@ expect(job.options[:extra_vars]).to eq(:instance_ids => ["i-3434"], :some_key => :some_value) expect(job.options[:playbook_path]).to eq(playbook.path) end + + it "passes execution_ttl to the job as its timeout" do + job = manager.configuration_scripts.first.run(:execution_ttl => "5") + + expect(job).to be_a ManageIQ::Providers::AnsiblePlaybookWorkflow + expect(job.options[:timeout]).to eq(5.minutes) + end end context "#merge_extra_vars" do diff --git a/spec/models/service_ansible_playbook_spec.rb b/spec/models/service_ansible_playbook_spec.rb index bec52e0bc85..e1f26ff8e16 100644 --- a/spec/models/service_ansible_playbook_spec.rb +++ b/spec/models/service_ansible_playbook_spec.rb @@ -48,6 +48,7 @@ :credential_id => credential_0.id, :vault_credential_id => credential_3.id, :playbook_id => 10, + :execution_ttl => "5", :extra_vars => { "var1" => {:default => "default_val1"}, :var2 => {:default => "default_val2"}, @@ -122,7 +123,8 @@ expect(basic_service.options[:provision_job_options]).to include( :hosts => "default_host1,default_host2", :credential => credential_0.native_ref, - :vault_credential => credential_3.native_ref + :vault_credential => credential_3.native_ref, + :execution_ttl => "5" ) end end @@ -135,6 +137,7 @@ :hosts => "host1,host2", :credential => credential_1.native_ref, :vault_credential => credential_3.native_ref, + :execution_ttl => "5", :extra_vars => { 'var1' => 'value1', 'var2' => 'value2', @@ -160,6 +163,7 @@ :hosts => "default_host1,default_host2", :credential => credential_0.native_ref, :vault_credential => credential_3.native_ref, + :execution_ttl => "5", :extra_vars => { 'var1' => 'default_val1', 'var2' => 'default_val2', From 7fcd3771c3277bae46aa50c028aca6eee0c7e3ca Mon Sep 17 00:00:00 2001 From: Nick Carboni Date: Tue, 16 Jul 2019 16:42:07 -0400 Subject: [PATCH 3/5] Add verbosity to Ansible::Runner --- lib/ansible/runner.rb | 50 ++++++++++++++++++++++----------- spec/lib/ansible/runner_spec.rb | 11 ++++++++ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/lib/ansible/runner.rb b/lib/ansible/runner.rb index 8c77a8ab344..403761a6dd7 100644 --- a/lib/ansible/runner.rb +++ b/lib/ansible/runner.rb @@ -9,15 +9,17 @@ class << self # @param playbook_path [String] Path to the playbook we will want to run # @param hosts [Array] List of hostnames to target with the playbook # @param credentials [Array] List of Authentication object ids to provide to the playbook run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [Ansible::Runner::ResponseAsync] Response object that we can query for .running?, providing us the # Ansible::Runner::Response object, when the job is finished. - def run_async(env_vars, extra_vars, playbook_path, hosts: ["localhost"], credentials: []) + def run_async(env_vars, extra_vars, playbook_path, hosts: ["localhost"], credentials: [], verbosity: 0) run_via_cli(hosts, credentials, env_vars, extra_vars, :ansible_runner_method => "start", - :playbook => playbook_path) + :playbook => playbook_path, + :verbosity => verbosity) end # Runs a role directly via ansible-runner, a simple playbook is then automatically created, @@ -32,9 +34,10 @@ def run_async(env_vars, extra_vars, playbook_path, hosts: ["localhost"], credent # playbook. True by default. # @param hosts [Array] List of hostnames to target with the role # @param credentials [Array] List of Authentication object ids to provide to the role run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [Ansible::Runner::ResponseAsync] Response object that we can query for .running?, providing us the # Ansible::Runner::Response object, when the job is finished. - def run_role_async(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true, hosts: ["localhost"], credentials: []) + def run_role_async(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true, hosts: ["localhost"], credentials: [], verbosity: 0) run_via_cli(hosts, credentials, env_vars, @@ -42,7 +45,8 @@ def run_role_async(env_vars, extra_vars, role_name, roles_path:, role_skip_facts :ansible_runner_method => "start", :role => role_name, :roles_path => roles_path, - :role_skip_facts => role_skip_facts) + :role_skip_facts => role_skip_facts, + :verbosity => verbosity) end # Runs a playbook via ansible-runner, see: https://ansible-runner.readthedocs.io/en/latest/standalone.html#running-playbooks @@ -54,14 +58,16 @@ def run_role_async(env_vars, extra_vars, role_name, roles_path:, role_skip_facts # @param tags [Hash] Hash with key/values pairs that will be passed as tags to the ansible-runner run # @param hosts [Array] List of hostnames to target with the playbook # @param credentials [Array] List of Authentication object ids to provide to the playbook run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [Ansible::Runner::Response] Response object with all details about the ansible run - def run(env_vars, extra_vars, playbook_path, tags: nil, hosts: ["localhost"], credentials: []) + def run(env_vars, extra_vars, playbook_path, tags: nil, hosts: ["localhost"], credentials: [], verbosity: 0) run_via_cli(hosts, credentials, env_vars, extra_vars, - :tags => tags, - :playbook => playbook_path) + :tags => tags, + :playbook => playbook_path, + :verbosity => verbosity) end # Runs a role directly via ansible-runner, a simple playbook is then automatically created, @@ -77,8 +83,9 @@ def run(env_vars, extra_vars, playbook_path, tags: nil, hosts: ["localhost"], cr # @param tags [Hash] Hash with key/values pairs that will be passed as tags to the ansible-runner run # @param hosts [Array] List of hostnames to target with the role # @param credentials [Array] List of Authentication object ids to provide to the role run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [Ansible::Runner::Response] Response object with all details about the ansible run - def run_role(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true, tags: nil, hosts: ["localhost"], credentials: []) + def run_role(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true, tags: nil, hosts: ["localhost"], credentials: [], verbosity: 0) run_via_cli(hosts, credentials, env_vars, @@ -86,7 +93,8 @@ def run_role(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true :tags => tags, :role => role_name, :roles_path => roles_path, - :role_skip_facts => role_skip_facts) + :role_skip_facts => role_skip_facts, + :verbosity => verbosity) end # Runs "run" method via queue @@ -99,11 +107,13 @@ def run_role(env_vars, extra_vars, role_name, roles_path:, role_skip_facts: true # @param queue_opts [Hash] Additional options that will be passed to MiqQueue record creation # @param hosts [Array] List of hostnames to target with the playbook # @param credentials [Array] List of Authentication object ids to provide to the playbook run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [BigInt] ID of MiqTask record wrapping the task - def run_queue(env_vars, extra_vars, playbook_path, user_id, queue_opts, hosts: ["localhost"], credentials: []) + def run_queue(env_vars, extra_vars, playbook_path, user_id, queue_opts, hosts: ["localhost"], credentials: [], verbosity: 0) kwargs = { :hosts => hosts, - :credentials => credentials + :credentials => credentials, + :verbosity => verbosity } run_in_queue("run", user_id, queue_opts, [env_vars, extra_vars, playbook_path, kwargs]) end @@ -121,13 +131,15 @@ def run_queue(env_vars, extra_vars, playbook_path, user_id, queue_opts, hosts: [ # playbook. True by default. # @param hosts [Array] List of hostnames to target with the role # @param credentials [Array] List of Authentication object ids to provide to the role run + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @return [BigInt] ID of MiqTask record wrapping the task - def run_role_queue(env_vars, extra_vars, role_name, user_id, queue_opts, roles_path:, role_skip_facts: true, hosts: ["localhost"], credentials: []) + def run_role_queue(env_vars, extra_vars, role_name, user_id, queue_opts, roles_path:, role_skip_facts: true, hosts: ["localhost"], credentials: [], verbosity: 0) kwargs = { :roles_path => roles_path, :role_skip_facts => role_skip_facts, :hosts => hosts, - :credentials => credentials + :credentials => credentials, + :verbosity => verbosity } run_in_queue("run_role", user_id, queue_opts, [env_vars, extra_vars, role_name, kwargs]) end @@ -167,9 +179,10 @@ def run_in_queue(method_name, user_id, queue_opts, args) # @param tags [Hash] Hash with key/values pairs that will be passed as tags to the ansible-runner run # @param ansible_runner_method [String] Optional method we will use to run the ansible-runner. It can be either # "run", which is sync call, or "start" which is async call. Default is "run" + # @param verbosity [Integer] ansible-runner verbosity level 0-5 # @param playbook_or_role_args [Hash] Hash that includes the :playbook key or :role keys # @return [Ansible::Runner::Response] Response object with all details about the ansible run - def run_via_cli(hosts, credentials, env_vars, extra_vars, tags: nil, ansible_runner_method: "run", **playbook_or_role_args) + def run_via_cli(hosts, credentials, env_vars, extra_vars, tags: nil, ansible_runner_method: "run", verbosity: 0, **playbook_or_role_args) # If we are running against only localhost and no other value is set for ansible_connection # then assume we don't want to ssh locally extra_vars["ansible_connection"] ||= "local" if hosts == ["localhost"] @@ -184,7 +197,7 @@ def run_via_cli(hosts, credentials, env_vars, extra_vars, tags: nil, ansible_run create_extra_vars_file(base_dir, extra_vars.merge(cred_extra_vars)) create_cmdline_file(base_dir, {:tags => tags}.delete_blanks.merge(cred_command_line)) - params = runner_params(base_dir, ansible_runner_method, playbook_or_role_args) + params = runner_params(base_dir, ansible_runner_method, playbook_or_role_args, verbosity) begin result = AwesomeSpawn.run("ansible-runner", :env => env_vars.merge(cred_env_vars), :params => params) @@ -217,7 +230,7 @@ def async?(ansible_runner_method) ansible_runner_method == "start" end - def runner_params(base_dir, ansible_runner_method, playbook_or_role_args) + def runner_params(base_dir, ansible_runner_method, playbook_or_role_args, verbosity) runner_args = playbook_or_role_args.dup runner_args.delete(:roles_path) if runner_args[:roles_path].nil? @@ -225,6 +238,11 @@ def runner_params(base_dir, ansible_runner_method, playbook_or_role_args) runner_args[:role_skip_facts] = nil if runner_args.delete(:role_skip_facts) runner_args[:ident] = "result" + if verbosity.to_i > 0 + v_flag = "-#{"v" * verbosity.to_i.clamp(1, 5)}" + runner_args[v_flag] = nil + end + [ansible_runner_method, base_dir, :json, runner_args] end diff --git a/spec/lib/ansible/runner_spec.rb b/spec/lib/ansible/runner_spec.rb index 24b042f00a2..009912e9a02 100644 --- a/spec/lib/ansible/runner_spec.rb +++ b/spec/lib/ansible/runner_spec.rb @@ -59,6 +59,17 @@ described_class.run(env_vars, extra_vars, playbook, :tags => tags) end + it "calls run with the correct verbosity" do + expect(AwesomeSpawn).to receive(:run) do |command, options| + expect(command).to eq("ansible-runner") + + _method, _dir, _json, args = options[:params] + expect(args).to eq(:ident => "result", :playbook => playbook, "-vvvvv" => nil) + end.and_return(result) + + described_class.run(env_vars, extra_vars, playbook, :verbosity => 6) + end + context "with special characters" do let(:env_vars) { {"ENV1" => "pa$%w0rd!'"} } let(:extra_vars) { {"name" => "john's server"} } From 1458e7401ef89015378c0b5671f8e3618d181355 Mon Sep 17 00:00:00 2001 From: Nick Carboni Date: Tue, 16 Jul 2019 16:42:37 -0400 Subject: [PATCH 4/5] Pass verbosity from services to ansible runner --- .../providers/ansible_playbook_workflow.rb | 7 ++++--- .../manageiq/providers/ansible_role_workflow.rb | 5 +++-- .../providers/ansible_runner_workflow.rb | 8 ++++++-- .../automation_manager/configuration_script.rb | 3 ++- app/models/service_ansible_playbook.rb | 1 + .../providers/ansible_playbook_workflow_spec.rb | 16 +++++++++++++--- .../providers/ansible_role_workflow_spec.rb | 2 +- .../configuration_script_spec.rb | 8 ++++++++ spec/models/service_ansible_playbook_spec.rb | 6 +++++- 9 files changed, 43 insertions(+), 13 deletions(-) diff --git a/app/models/manageiq/providers/ansible_playbook_workflow.rb b/app/models/manageiq/providers/ansible_playbook_workflow.rb index 0176aacde2f..6e2724a1039 100644 --- a/app/models/manageiq/providers/ansible_playbook_workflow.rb +++ b/app/models/manageiq/providers/ansible_playbook_workflow.rb @@ -1,5 +1,5 @@ class ManageIQ::Providers::AnsiblePlaybookWorkflow < ManageIQ::Providers::AnsibleRunnerWorkflow - def self.job_options(env_vars, extra_vars, playbook_options, timeout, poll_interval, hosts, credentials) + def self.job_options(env_vars, extra_vars, playbook_options, timeout, poll_interval, hosts, credentials, verbosity) { :credentials => credentials, :env_vars => env_vars, @@ -8,6 +8,7 @@ def self.job_options(env_vars, extra_vars, playbook_options, timeout, poll_inter :playbook_path => playbook_options[:playbook_path], :timeout => timeout, :poll_interval => poll_interval, + :verbosity => verbosity } end @@ -17,9 +18,9 @@ def pre_playbook end def run_playbook - credentials, env_vars, extra_vars, hosts, playbook_path = options.values_at(:credentials, :env_vars, :extra_vars, :hosts, :playbook_path) + credentials, env_vars, extra_vars, hosts, playbook_path, verbosity = options.values_at(:credentials, :env_vars, :extra_vars, :hosts, :playbook_path, :verbosity) - response = Ansible::Runner.run_async(env_vars, extra_vars, playbook_path, :hosts => hosts, :credentials => credentials) + response = Ansible::Runner.run_async(env_vars, extra_vars, playbook_path, :hosts => hosts, :credentials => credentials, :verbosity => verbosity) if response.nil? queue_signal(:abort, "Failed to run ansible playbook", "error") else diff --git a/app/models/manageiq/providers/ansible_role_workflow.rb b/app/models/manageiq/providers/ansible_role_workflow.rb index b3065a9be3d..37f2f833ab9 100644 --- a/app/models/manageiq/providers/ansible_role_workflow.rb +++ b/app/models/manageiq/providers/ansible_role_workflow.rb @@ -1,5 +1,5 @@ class ManageIQ::Providers::AnsibleRoleWorkflow < ManageIQ::Providers::AnsibleRunnerWorkflow - def self.job_options(env_vars, extra_vars, role_options, timeout, poll_interval, hosts, credentials) + def self.job_options(env_vars, extra_vars, role_options, timeout, poll_interval, hosts, credentials, verbosity) { :credentials => credentials, :env_vars => env_vars, @@ -9,7 +9,8 @@ def self.job_options(env_vars, extra_vars, role_options, timeout, poll_interval, :roles_path => role_options[:roles_path], :role_skip_facts => role_options[:role_skip_facts], :timeout => timeout, - :poll_interval => poll_interval + :poll_interval => poll_interval, + :verbosity => verbosity } end diff --git a/app/models/manageiq/providers/ansible_runner_workflow.rb b/app/models/manageiq/providers/ansible_runner_workflow.rb index c9f9fc1024f..d107783f4ad 100644 --- a/app/models/manageiq/providers/ansible_runner_workflow.rb +++ b/app/models/manageiq/providers/ansible_runner_workflow.rb @@ -1,6 +1,10 @@ class ManageIQ::Providers::AnsibleRunnerWorkflow < Job - def self.create_job(env_vars, extra_vars, role_or_playbook_options, hosts = ["localhost"], credentials = [], timeout: 1.hour, poll_interval: 1.second) - super(name, job_options(env_vars, extra_vars, role_or_playbook_options, timeout, poll_interval, hosts, credentials)) + def self.create_job(env_vars, extra_vars, role_or_playbook_options, + hosts = ["localhost"], credentials = [], + timeout: 1.hour, poll_interval: 1.second, verbosity: 0) + options = job_options(env_vars, extra_vars, role_or_playbook_options, timeout, + poll_interval, hosts, credentials, verbosity) + super(name, options) end def current_job_timeout(_timeout_adjustment = 1) diff --git a/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb b/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb index 9dd87446dae..807ccc4b31a 100644 --- a/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb +++ b/app/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script.rb @@ -35,7 +35,8 @@ def run(vars = {}) credentials = collect_credentials(vars) kwargs = {} - kwargs[:timeout] = vars[:execution_ttl].to_i.minutes if vars[:execution_ttl].present? + kwargs[:timeout] = vars[:execution_ttl].to_i.minutes if vars[:execution_ttl].present? + kwargs[:verbosity] = vars[:verbosity].to_i if vars[:verbosity].present? workflow.create_job({}, extra_vars, playbook_vars, vars[:hosts], credentials, kwargs).tap do |job| job.signal(:start) diff --git a/app/models/service_ansible_playbook.rb b/app/models/service_ansible_playbook.rb index ea0ad7d5eca..43dbadfc110 100644 --- a/app/models/service_ansible_playbook.rb +++ b/app/models/service_ansible_playbook.rb @@ -94,6 +94,7 @@ def get_job_options(action) hosts network_credential_id vault_credential_id + verbosity ].freeze def config_options(action) diff --git a/spec/models/manageiq/providers/ansible_playbook_workflow_spec.rb b/spec/models/manageiq/providers/ansible_playbook_workflow_spec.rb index 630bf9ef387..4e21854decb 100644 --- a/spec/models/manageiq/providers/ansible_playbook_workflow_spec.rb +++ b/spec/models/manageiq/providers/ansible_playbook_workflow_spec.rb @@ -1,6 +1,6 @@ describe ManageIQ::Providers::AnsiblePlaybookWorkflow do let(:job) { described_class.create_job(*options).tap { |job| job.state = state } } - let(:options) { [{"ENV" => "VAR"}, %w[arg1 arg2], {:playbook_path => "/path/to/playbook"}, %w[192.0.2.0 192.0.2.1]] } + let(:options) { [{"ENV" => "VAR"}, %w[arg1 arg2], {:playbook_path => "/path/to/playbook"}, %w[192.0.2.0 192.0.2.1], {:verbosity => 3}] } let(:state) { "waiting_to_start" } context ".create_job" do @@ -90,8 +90,18 @@ it "ansible-runner succeeds" do response_async = Ansible::Runner::ResponseAsync.new(:base_dir => "/path/to/results") - - expect(Ansible::Runner).to receive(:run_async).and_return(response_async) + runner_options = [ + {"ENV" => "VAR"}, + %w[arg1 arg2], + "/path/to/playbook", + { + :hosts => %w[192.0.2.0 192.0.2.1], + :credentials => [], + :verbosity => 3 + } + ] + + expect(Ansible::Runner).to receive(:run_async).with(*runner_options).and_return(response_async) expect(job).to receive(:queue_signal).with(:poll_runner) job.signal(:run_playbook) diff --git a/spec/models/manageiq/providers/ansible_role_workflow_spec.rb b/spec/models/manageiq/providers/ansible_role_workflow_spec.rb index 6ccbe19afc5..de88fe75c3a 100644 --- a/spec/models/manageiq/providers/ansible_role_workflow_spec.rb +++ b/spec/models/manageiq/providers/ansible_role_workflow_spec.rb @@ -1,7 +1,7 @@ describe ManageIQ::Providers::AnsibleRoleWorkflow do let(:job) { described_class.create_job(*options).tap { |job| job.state = state } } let(:role_options) { {:role_name => 'role_name', :roles_path => 'path/role', :role_skip_facts => true } } - let(:options) { [{"ENV" => "VAR"}, %w(arg1 arg2), role_options] } + let(:options) { [{"ENV" => "VAR"}, %w[arg1 arg2], role_options, {:verbosity => 4}] } let(:state) { "waiting_to_start" } context ".create_job" do diff --git a/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb b/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb index 2adce7fb5af..6be437d7c19 100644 --- a/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb +++ b/spec/models/manageiq/providers/embedded_ansible/automation_manager/configuration_script_spec.rb @@ -44,6 +44,7 @@ expect(job.options[:extra_vars]).to eq(:instance_ids => ["i-3434"]) expect(job.options[:playbook_path]).to eq(playbook.path) expect(job.options[:timeout]).to eq(1.hour) + expect(job.options[:verbosity]).to eq(0) end it "accepts different variables to launch a job template against" do @@ -62,6 +63,13 @@ expect(job).to be_a ManageIQ::Providers::AnsiblePlaybookWorkflow expect(job.options[:timeout]).to eq(5.minutes) end + + it "passes verbosity to the job when specified" do + job = manager.configuration_scripts.first.run(:verbosity => "5") + + expect(job).to be_a ManageIQ::Providers::AnsiblePlaybookWorkflow + expect(job.options[:verbosity]).to eq(5) + end end context "#merge_extra_vars" do diff --git a/spec/models/service_ansible_playbook_spec.rb b/spec/models/service_ansible_playbook_spec.rb index e1f26ff8e16..e9e66aa7efc 100644 --- a/spec/models/service_ansible_playbook_spec.rb +++ b/spec/models/service_ansible_playbook_spec.rb @@ -49,6 +49,7 @@ :vault_credential_id => credential_3.id, :playbook_id => 10, :execution_ttl => "5", + :verbosity => "3", :extra_vars => { "var1" => {:default => "default_val1"}, :var2 => {:default => "default_val2"}, @@ -124,7 +125,8 @@ :hosts => "default_host1,default_host2", :credential => credential_0.native_ref, :vault_credential => credential_3.native_ref, - :execution_ttl => "5" + :execution_ttl => "5", + :verbosity => "3" ) end end @@ -138,6 +140,7 @@ :credential => credential_1.native_ref, :vault_credential => credential_3.native_ref, :execution_ttl => "5", + :verbosity => "3", :extra_vars => { 'var1' => 'value1', 'var2' => 'value2', @@ -164,6 +167,7 @@ :credential => credential_0.native_ref, :vault_credential => credential_3.native_ref, :execution_ttl => "5", + :verbosity => "3", :extra_vars => { 'var1' => 'default_val1', 'var2' => 'default_val2', From 40f33b03b9bde84ff3cc01d4c5460887ae42beef Mon Sep 17 00:00:00 2001 From: Nick Carboni Date: Wed, 17 Jul 2019 17:55:34 -0400 Subject: [PATCH 5/5] Pass verbosity through for ansible playbook automate methods --- .../embedded_ansible/automation_manager/playbook_runner.rb | 1 + .../automation_manager/playbook_runner_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner.rb b/app/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner.rb index 22f3b7687ef..a4a8efda531 100644 --- a/app/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner.rb +++ b/app/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner.rb @@ -51,6 +51,7 @@ def translate_credentials!(launch_options) limit network_credential_id vault_credential_id + verbosity ].freeze def launch_ansible_tower_job diff --git a/spec/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner_spec.rb b/spec/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner_spec.rb index 822648866a7..f4d4d8dea2b 100644 --- a/spec/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner_spec.rb +++ b/spec/models/manageiq/providers/embedded_ansible/automation_manager/playbook_runner_spec.rb @@ -83,10 +83,10 @@ end context 'with launch options' do - let(:options) { {:job_template_ref => 'jt1', :extra_vars => {:thing => "stuff"}} } + let(:options) { {:job_template_ref => 'jt1', :extra_vars => {:thing => "stuff"}, :verbosity => "4"} } it 'passes them to the job' do expect(ManageIQ::Providers::EmbeddedAnsible::AutomationManager::Job).to receive(:create_job) - .with(an_instance_of(ManageIQ::Providers::EmbeddedAnsible::AutomationManager::ConfigurationScript), :hosts => ["localhost"], :extra_vars => {:thing => "stuff"}) + .with(an_instance_of(ManageIQ::Providers::EmbeddedAnsible::AutomationManager::ConfigurationScript), :hosts => ["localhost"], :extra_vars => {:thing => "stuff"}, :verbosity => "4") .and_return(double(:id => 'jb1')) expect(subject).to receive(:queue_signal) subject.launch_ansible_tower_job