From 9acaa2a2854fa204f5d2bb9be6afa396c6103ef0 Mon Sep 17 00:00:00 2001 From: Adam Ruzicka Date: Fri, 5 Apr 2024 13:07:06 +0200 Subject: [PATCH 1/4] Fixes #37320 - Set IDs on outputs --- lib/smart_proxy_ansible/runner/ansible_runner.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/smart_proxy_ansible/runner/ansible_runner.rb b/lib/smart_proxy_ansible/runner/ansible_runner.rb index 7d74847..190949e 100644 --- a/lib/smart_proxy_ansible/runner/ansible_runner.rb +++ b/lib/smart_proxy_ansible/runner/ansible_runner.rb @@ -130,7 +130,7 @@ def hostname_for_event(event) def handle_host_event(hostname, event) log_event("for host: #{hostname.inspect}", event) - publish_data_for(hostname, event['stdout'] + "\n", 'stdout') if event['stdout'] + publish_data_for(hostname, event['stdout'] + "\n", 'stdout', id: event['uuid']) if event['stdout'] case event['event'] when 'runner_on_ok' publish_exit_status_for(hostname, 0) if @exit_statuses[hostname].nil? @@ -150,25 +150,23 @@ def handle_broadcast_data(event) header, *rows = event['stdout'].strip.lines.map(&:rstrip) # #lines strips the leading newline that precedes the header broadcast_data("\n" + header + "\n", 'stdout') - inventory_hosts = @outputs.keys.select { |key| key.is_a? String } rows.each do |row| host = inventory_hosts.find { |host| row =~ /#{host}/ } line = row + "\n" unless host - broadcast_data(line, 'stdout') + broadcast_data(line, 'stdout', id: event['uuid']) next end - publish_data_for(host, line, 'stdout') - + publish_data_for(host, line, 'stdout', id: event['uuid']) # If the task has been rescued, it won't consider a failure if @exit_statuses[host].to_i != 0 && failures[host].to_i <= 0 && unreachable[host].to_i <= 0 && rescued[host].to_i > 0 publish_exit_status_for(host, 0) end end else - broadcast_data(event['stdout'] + "\n", 'stdout') + broadcast_data(event['stdout'] + "\n", 'stdout', id: event['uuid']) end # If the run ends early due to an error - fail all other tasks From 8bfce8275ca50df282222a434bd532be39ffa01f Mon Sep 17 00:00:00 2001 From: Adam Ruzicka Date: Fri, 1 Nov 2024 13:00:41 +0000 Subject: [PATCH 2/4] Bump dependency on smart_proxy_dynflow --- smart_proxy_ansible.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smart_proxy_ansible.gemspec b/smart_proxy_ansible.gemspec index 6ff83b0..9c02ef8 100644 --- a/smart_proxy_ansible.gemspec +++ b/smart_proxy_ansible.gemspec @@ -28,6 +28,6 @@ Gem::Specification.new do |gem| gem.required_ruby_version = '>= 3.0' gem.add_development_dependency 'rake', '~> 13.0' - gem.add_runtime_dependency('smart_proxy_dynflow', '~> 0.8') + gem.add_runtime_dependency('smart_proxy_dynflow', '>= 0.9.4', '< 1.0.0') gem.add_runtime_dependency('smart_proxy_remote_execution_ssh', '>= 0.5.0', '< 2.0.0') end From 057e3e98ad3f289b48cb4a68248c5977c829f3d5 Mon Sep 17 00:00:00 2001 From: Adam Ruzicka Date: Fri, 1 Nov 2024 13:10:34 +0000 Subject: [PATCH 3/4] Refs #37320 - Set real timestamps on outputs --- lib/smart_proxy_ansible/runner/ansible_runner.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/smart_proxy_ansible/runner/ansible_runner.rb b/lib/smart_proxy_ansible/runner/ansible_runner.rb index 190949e..2e314d9 100644 --- a/lib/smart_proxy_ansible/runner/ansible_runner.rb +++ b/lib/smart_proxy_ansible/runner/ansible_runner.rb @@ -130,7 +130,7 @@ def hostname_for_event(event) def handle_host_event(hostname, event) log_event("for host: #{hostname.inspect}", event) - publish_data_for(hostname, event['stdout'] + "\n", 'stdout', id: event['uuid']) if event['stdout'] + publish_data_for(hostname, event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: event['created']) if event['stdout'] case event['event'] when 'runner_on_ok' publish_exit_status_for(hostname, 0) if @exit_statuses[hostname].nil? @@ -150,23 +150,25 @@ def handle_broadcast_data(event) header, *rows = event['stdout'].strip.lines.map(&:rstrip) # #lines strips the leading newline that precedes the header broadcast_data("\n" + header + "\n", 'stdout') + inventory_hosts = @outputs.keys.select { |key| key.is_a? String } rows.each do |row| host = inventory_hosts.find { |host| row =~ /#{host}/ } line = row + "\n" unless host - broadcast_data(line, 'stdout', id: event['uuid']) + broadcast_data(line, 'stdout', id: event['uuid'], timestamp: event['created']) next end - publish_data_for(host, line, 'stdout', id: event['uuid']) + publish_data_for(host, line, 'stdout', id: event['uuid'], timestamp: event['created']) + # If the task has been rescued, it won't consider a failure if @exit_statuses[host].to_i != 0 && failures[host].to_i <= 0 && unreachable[host].to_i <= 0 && rescued[host].to_i > 0 publish_exit_status_for(host, 0) end end else - broadcast_data(event['stdout'] + "\n", 'stdout', id: event['uuid']) + broadcast_data(event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: event['created']) end # If the run ends early due to an error - fail all other tasks From dc31cd8ba7e9724ae113302bd30aa21b40325e0b Mon Sep 17 00:00:00 2001 From: Adam Ruzicka Date: Fri, 19 Dec 2025 15:50:15 +0100 Subject: [PATCH 4/4] Parse timestamps --- lib/smart_proxy_ansible/runner/ansible_runner.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/smart_proxy_ansible/runner/ansible_runner.rb b/lib/smart_proxy_ansible/runner/ansible_runner.rb index 2e314d9..3fca8d6 100644 --- a/lib/smart_proxy_ansible/runner/ansible_runner.rb +++ b/lib/smart_proxy_ansible/runner/ansible_runner.rb @@ -130,7 +130,7 @@ def hostname_for_event(event) def handle_host_event(hostname, event) log_event("for host: #{hostname.inspect}", event) - publish_data_for(hostname, event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: event['created']) if event['stdout'] + publish_data_for(hostname, event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: parse_timestamp(event['created'])) if event['stdout'] case event['event'] when 'runner_on_ok' publish_exit_status_for(hostname, 0) if @exit_statuses[hostname].nil? @@ -156,11 +156,11 @@ def handle_broadcast_data(event) host = inventory_hosts.find { |host| row =~ /#{host}/ } line = row + "\n" unless host - broadcast_data(line, 'stdout', id: event['uuid'], timestamp: event['created']) + broadcast_data(line, 'stdout', id: event['uuid'], timestamp: parse_timestamp(event['created'])) next end - publish_data_for(host, line, 'stdout', id: event['uuid'], timestamp: event['created']) + publish_data_for(host, line, 'stdout', id: event['uuid'], timestamp: parse_timestamp(event['created'])) # If the task has been rescued, it won't consider a failure if @exit_statuses[host].to_i != 0 && failures[host].to_i <= 0 && unreachable[host].to_i <= 0 && rescued[host].to_i > 0 @@ -168,7 +168,7 @@ def handle_broadcast_data(event) end end else - broadcast_data(event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: event['created']) + broadcast_data(event['stdout'] + "\n", 'stdout', id: event['uuid'], timestamp: parse_timestamp(event['created'])) end # If the run ends early due to an error - fail all other tasks @@ -383,6 +383,13 @@ def extract_ports(host_data) host_data["ansible_port"] ].compact.uniq end + + def parse_timestamp(ts) + Time.iso8601(ts) + rescue ArgumentError + logger.warn("Failed to parse '#{ts}' (#{ts.class}) as iso8601 timestamp, defaulting to current timestamp") + Time.now.getlocal + end end end end