foreman_rh_cloud 8.0.48 → 8.0.50

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5aaa9176ddc41ce5b0d3877b0f84d4da1e7646095d9552c0b4e2c268d6cff2b
4
- data.tar.gz: 323a006184c5e0f989ef81ac8a010a2e493eb8cd69dc35b93ecb30a2e807dcec
3
+ metadata.gz: 7cea22a0b284bca946fd3911d2225a4dc3af7207b458dcab9405e29427f8c9a7
4
+ data.tar.gz: 46a5c322b515ac02c73a10b7b79f1d8195c9f3cf57a42df08c07d814190c5d62
5
5
  SHA512:
6
- metadata.gz: 4758b21705294f7bc5628878fbcf101e081f7a662426fb50501ad9909b09d7c33959ec316e3b790f248587a0ba85933782c5822c70fe9ec434ab57f070b0b0ca
7
- data.tar.gz: e67bebbc9e8d478fa32778037d1fd4172b8633ff0c845bda2fa554c9e51cc74f94eca21ded5b9c7826a0622aa2842908e5abf70f1ffe2472fdecb6c6cf2f7d11
6
+ metadata.gz: 39ccb8d56628449026625a4781fc1343c8fc6eef22ab96f139d0d9bc9dd3e107d0a92f69917f4136f1d4e5744ccfb5528e2fb52d98ca57d544a6a420990a223b
7
+ data.tar.gz: 32c33fdb90216680056868fea097b665ab2a8dca2559dfd6ebd2574757d3f9811f34a1f5d092a3a065b5284bca4de1b63ff6678ce7994e66685acd857cd34e43
@@ -147,7 +147,7 @@ module ForemanInventoryUpload
147
147
  @stream.array_field('installed_packages') do
148
148
  first = true
149
149
  host.installed_packages.each do |package|
150
- @stream.raw("#{first ? '' : ', '}#{@stream.stringify_value(package.nvra)}")
150
+ @stream.raw("#{first ? '' : ', '}#{@stream.stringify_value(package.nvrea)}")
151
151
  first = false
152
152
  end
153
153
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '8.0.48'.freeze
2
+ VERSION = '8.0.50'.freeze
3
3
  end
@@ -43,7 +43,17 @@ module InsightsCloud
43
43
  end
44
44
 
45
45
  def done?(current_status = invocation_status)
46
- job_invocation.finished? || current_status.map { |_host_id, task_status| task_status['report_done'] }.all?
46
+ ActiveModel::Type::Boolean.new.cast(current_status[:task_state][:task_done_reported])
47
+ end
48
+
49
+ def job_finished?
50
+ job_invocation.finished?
51
+ end
52
+
53
+ def all_hosts_finished?(current_status)
54
+ current_status[:hosts_state].values.all? do |status|
55
+ ActiveModel::Type::Boolean.new.cast(status['report_done'] == true)
56
+ end
47
57
  end
48
58
 
49
59
  # noop, we don't want to do anything when the polling task starts
@@ -95,7 +105,11 @@ module InsightsCloud
95
105
  end
96
106
 
97
107
  def host_status(host)
98
- external_task&.dig('invocation_status', host)
108
+ external_task&.dig('invocation_status', :hosts_state, host)
109
+ end
110
+
111
+ def task_done_state
112
+ ActiveModel::Type::Boolean.new.cast(external_task&.dig('invocation_status', :task_state, :task_done_reported))
99
113
  end
100
114
 
101
115
  def sequence(host)
@@ -111,13 +125,15 @@ module InsightsCloud
111
125
  end
112
126
 
113
127
  def invocation_status
114
- Hash[job_invocation.targeting.hosts.map do |host|
128
+ hosts_state = Hash[job_invocation.targeting.hosts.map do |host|
115
129
  next unless host.insights&.uuid
116
130
  [
117
131
  host.insights.uuid,
118
132
  task_status(job_invocation.sub_task_for_host(host), host.insights.uuid),
119
133
  ]
120
134
  end.compact]
135
+
136
+ {task_state: {task_done_reported: task_done_state}, hosts_state: hosts_state}
121
137
  end
122
138
 
123
139
  def task_status(host_task, host_name)
@@ -128,7 +144,7 @@ module InsightsCloud
128
144
  {
129
145
  'state' => host_task.state,
130
146
  'output' => host_task.main_action.live_output.map { |line| line['output'] }.join("\n"),
131
- 'exit_status' => host_task.main_action.exit_status,
147
+ 'exit_status' => ActiveModel::Type::Integer.new.cast(host_task.main_action.exit_status),
132
148
  'sequence' => sequence(host_name),
133
149
  'report_done' => host_done?(host_name),
134
150
  }
@@ -138,9 +154,9 @@ module InsightsCloud
138
154
  generator = InsightsCloud::Generators::PlaybookProgressGenerator.new(correlation_id)
139
155
  all_hosts_success = true
140
156
 
141
- invocation_status.each do |host_name, status|
157
+ invocation_status[:hosts_state].each do |host_name, status|
142
158
  # skip host if the host already reported that it's finished
143
- next if status['report_done']
159
+ next if ActiveModel::Type::Boolean.new.cast(status['report_done'])
144
160
 
145
161
  unless status['state'] == 'unknown'
146
162
  sequence = status['sequence']
@@ -154,7 +170,11 @@ module InsightsCloud
154
170
  all_hosts_success &&= status['exit_status'] == 0
155
171
  end
156
172
  end
157
- generator.job_finished_message(all_hosts_success) if done?(invocation_status)
173
+
174
+ if (job_finished? || all_hosts_finished?(invocation_status))
175
+ generator.job_finished_message(all_hosts_success)
176
+ invocation_status[:task_state][:task_done_reported] = true
177
+ end
158
178
 
159
179
  send_report(generator.generate)
160
180
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foreman_rh_cloud",
3
- "version": "8.0.48",
3
+ "version": "8.0.50",
4
4
  "description": "Inventory Upload =============",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -27,6 +27,7 @@
27
27
  "@theforeman/test": ">= 10.1.1",
28
28
  "@theforeman/eslint-plugin-foreman": ">= 10.1.1",
29
29
  "babel-eslint": "~10.0.0",
30
+ "cosmiconfig-typescript-loader": "~4.3.0",
30
31
  "eslint": "~6.7.2",
31
32
  "eslint-plugin-spellcheck": "~0.0.17",
32
33
  "jed": "~1.1.1",
@@ -29,7 +29,11 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
29
29
  end
30
30
 
31
31
  test 'It reports finish playbook messages' do
32
- TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:done?).returns(true)
32
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
33
+ host1_task.state = 'stopped'
34
+ host1_task.save!
35
+
36
+ TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:job_finished?).returns(true)
33
37
 
34
38
  actual = ForemanTasks.sync_task(TestConnectorPlaybookExecutionReporterTask, @job_invocation)
35
39
 
@@ -39,6 +43,13 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
39
43
  assert_not_nil actual_report
40
44
  actual_jsonl = read_jsonl(actual_report)
41
45
 
46
+ assert_equal true, actual.output['task']['invocation_status']['task_state']['task_done_reported']
47
+ assert_equal 0, actual.output['task']['invocation_status']['hosts_state']['TEST_UUID1']['exit_status']
48
+ assert_equal 0, actual.output['task']['invocation_status']['hosts_state']['TEST_UUID2']['exit_status']
49
+
50
+ assert_equal true, @job_invocation.finished?
51
+ assert_equal 'stopped', @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)['state']
52
+
42
53
  assert_not_nil actual_report_finished = actual_jsonl.find { |l| l['type'] == 'playbook_run_completed' }
43
54
  assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
44
55
  assert_equal 'success', actual_report_finished['status']
@@ -49,57 +60,127 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
49
60
  end
50
61
 
51
62
  test 'It reports single progress message for done host' do
52
- TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:done?).returns(false, true)
63
+ class ArrangeTestHost < InsightsCloud::Async::ConnectorPlaybookExecutionReporterTask
64
+ def send_report(report)
65
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
66
+ host1_task.state = 'stopped'
67
+ host1_task.save!
68
+
69
+ output[:saved_reports] = (output[:saved_reports] || []) << report
70
+ end
71
+ end
53
72
 
54
- actual = ForemanTasks.sync_task(TestConnectorPlaybookExecutionReporterTask, @job_invocation)
73
+ ArrangeTestHost.instance_variable_set(:@connector_feature_id, nil)
74
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
75
+ host1_task.state = 'running'
76
+ host1_task.save!
55
77
 
56
- actual_report = actual.output[:saved_reports].first.to_s
78
+ ArrangeTestHost.any_instance.stubs(:job_finished?).returns(false, true)
57
79
 
58
- assert_equal 1, actual.output[:saved_reports].size
59
- assert_not_nil actual_report
60
- actual_jsonl = read_jsonl(actual_report)
80
+ actual = ForemanTasks.sync_task(ArrangeTestHost, @job_invocation)
81
+
82
+ actual_report1 = actual.output[:saved_reports].first.to_s
83
+ actual_report2 = actual.output[:saved_reports].second.to_s
84
+
85
+ assert_equal 2, actual.output[:saved_reports].size
86
+ assert_not_nil actual_report1
87
+ assert_not_nil actual_report2
88
+
89
+ actual_json1 = read_jsonl(actual_report1)
90
+ actual_json2 = read_jsonl(actual_report2)
91
+
92
+ assert_equal true, actual.output['task']['invocation_status']['task_state']['task_done_reported']
93
+ assert_equal 0, actual.output['task']['invocation_status']['hosts_state']['TEST_UUID1']['exit_status']
61
94
 
62
- actual_host_updates = actual_jsonl
63
- .select { |l| l['type'] == 'playbook_run_update' && l['host'] == @host1.insights.uuid }
64
- assert_equal 1, actual_host_updates.size
65
- assert_equal 0, actual_host_updates.first['sequence']
95
+ assert_equal 'stopped', @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)['state']
96
+
97
+ assert_not_nil actual_report_updated = actual_json1.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
98
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
99
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
100
+ assert_equal 0, actual_report_updated['sequence']
101
+ assert_equal 6, actual_report_updated.size
102
+
103
+ assert_not_nil actual_report_updated = actual_json2.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
104
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
105
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
106
+ assert_equal 1, actual_report_updated['sequence']
107
+ assert_equal 6, actual_report_updated.size
108
+
109
+ assert_not_nil actual_host_finished = actual_json2.find { |l| l['type'] == 'playbook_run_finished' && l['host'] == 'TEST_UUID1' }
110
+ assert_equal 'TEST_CORRELATION', actual_host_finished['correlation_id']
111
+ assert_equal 'TEST_UUID1', actual_host_finished['host']
112
+ assert_equal 'success', actual_host_finished['status']
113
+ assert_equal 7, actual_host_finished.size
114
+
115
+ assert_not_nil actual_report_finished = actual_json2.find { |l| l['type'] == 'playbook_run_completed' }
116
+ assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
117
+ assert_equal 'success', actual_report_finished['status']
118
+ assert_equal 4, actual_report_finished.size
66
119
  end
67
120
 
68
121
  test 'It reports two progress messages for in progress host' do
69
- TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:done?).returns(false, false, true)
122
+ class ArrangeTestHostTwo < InsightsCloud::Async::ConnectorPlaybookExecutionReporterTask
123
+ def send_report(report)
124
+ iteration_number = output[:iteration_number].to_i
125
+
126
+ if iteration_number == 1
127
+ host1_task = job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
128
+ host1_task.state = 'stopped'
129
+ host1_task.save!
130
+ end
131
+
132
+ output[:iteration_number] = iteration_number + 1
133
+ output[:saved_reports] = (output[:saved_reports] || []) << report
134
+ end
135
+ end
70
136
 
71
- host1_task = @job_invocation.template_invocations.joins(:host).where(hosts: {name: @host1.name}).first.run_host_job_task
137
+ ArrangeTestHostTwo.instance_variable_set(:@connector_feature_id, nil)
138
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
72
139
  host1_task.state = 'running'
73
140
  host1_task.save!
74
141
 
75
- actual = ForemanTasks.sync_task(TestConnectorPlaybookExecutionReporterTask, @job_invocation)
142
+ ArrangeTestHostTwo.any_instance.stubs(:job_finished?).returns(false, false, true)
76
143
 
77
- assert_equal 2, actual.output[:saved_reports].size
144
+ actual = ForemanTasks.sync_task(ArrangeTestHostTwo, @job_invocation)
145
+
146
+ actual_report1 = actual.output[:saved_reports].first.to_s
147
+ actual_report2 = actual.output[:saved_reports].second.to_s
148
+ actual_report3 = actual.output[:saved_reports].third.to_s
149
+
150
+ assert_equal 3, actual.output[:saved_reports].size
151
+ assert_not_nil actual_report1
152
+ assert_not_nil actual_report2
153
+ assert_not_nil actual_report3
78
154
 
79
- first_report = actual.output[:saved_reports].first.to_s
80
- actual_jsonl = read_jsonl(first_report)
155
+ actual_json1 = read_jsonl(actual_report1)
156
+ actual_json2 = read_jsonl(actual_report2)
157
+ actual_json3 = read_jsonl(actual_report3)
81
158
 
82
- actual_host_updates = actual_jsonl
83
- .select { |l| l['type'] == 'playbook_run_update' && l['host'] == @host1.insights.uuid }
84
- assert_equal 1, actual_host_updates.size
85
- assert_equal 0, actual_host_updates.first['sequence']
159
+ assert_equal true, actual.output['task']['invocation_status']['task_state']['task_done_reported']
160
+ assert_equal 0, actual.output['task']['invocation_status']['hosts_state']['TEST_UUID1']['exit_status']
86
161
 
87
- actual_host_updates = actual_jsonl
88
- .select { |l| l['type'] == 'playbook_run_update' && l['host'] == @host2.insights.uuid }
89
- assert_equal 1, actual_host_updates.size
90
- assert_equal 0, actual_host_updates.first['sequence']
162
+ assert_not_nil actual_report_updated = actual_json1.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
163
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
164
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
165
+ assert_equal 0, actual_report_updated['sequence']
166
+ assert_equal 6, actual_report_updated.size
91
167
 
92
- second_report = actual.output[:saved_reports].last.to_s
93
- actual_jsonl = read_jsonl(second_report)
168
+ assert_not_nil actual_report_updated = actual_json2.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
169
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
170
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
171
+ assert_equal 1, actual_report_updated['sequence']
172
+ assert_equal 6, actual_report_updated.size
94
173
 
95
- actual_host_updates = actual_jsonl
96
- .select { |l| l['type'] == 'playbook_run_update' && l['host'] == @host1.insights.uuid }
97
- assert_equal 1, actual_host_updates.size
98
- assert_equal 1, actual_host_updates.first['sequence']
174
+ assert_not_nil actual_host_finished = actual_json3.find { |l| l['type'] == 'playbook_run_finished' && l['host'] == 'TEST_UUID1' }
175
+ assert_equal 'TEST_CORRELATION', actual_host_finished['correlation_id']
176
+ assert_equal 'TEST_UUID1', actual_host_finished['host']
177
+ assert_equal 'success', actual_host_finished['status']
178
+ assert_equal 7, actual_host_finished.size
99
179
 
100
- actual_host_updates = actual_jsonl
101
- .select { |l| l['type'] == 'playbook_run_update' && l['host'] == @host2.insights.uuid }
102
- assert_equal 0, actual_host_updates.size
180
+ assert_not_nil actual_report_finished = actual_json3.find { |l| l['type'] == 'playbook_run_completed' }
181
+ assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
182
+ assert_equal 'success', actual_report_finished['status']
183
+ assert_equal 4, actual_report_finished.size
103
184
  end
104
185
 
105
186
  private
@@ -164,10 +245,12 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
164
245
  :value => '1'
165
246
  )
166
247
 
167
- @host1 = FactoryBot.create(:host, :with_insights_hits, name: 'host1')
248
+ @host1 = FactoryBot.create(:host, :with_insights_hits)
249
+ @host1.name = 'host1' # overriding name since there is an issue with Factorybot and setting the name correctly, same for 2nd host
168
250
  @host1.insights.uuid = 'TEST_UUID1'
169
251
  @host1.insights.save!
170
- @host2 = FactoryBot.create(:host, :with_insights_hits, name: 'host2')
252
+ @host2 = FactoryBot.create(:host, :with_insights_hits)
253
+ @host2.name = 'host2'
171
254
  @host2.insights.uuid = 'TEST_UUID2'
172
255
  @host2.insights.save!
173
256
 
@@ -190,7 +273,7 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
190
273
  { 'timestamp' => (Time.now - (5 - i)).to_f, 'output' => "#{i}\n" }
191
274
  end
192
275
  Support::DummyDynflowAction.any_instance.stubs(:live_output).returns(fake_output)
193
- Support::DummyDynflowAction.any_instance.stubs(:exit_status).returns(0)
276
+ Support::DummyDynflowAction.any_instance.stubs(:exit_status).returns("0")
194
277
 
195
278
  job_invocation
196
279
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_rh_cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.48
4
+ version: 8.0.50
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Red Hat Cloud team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-02 00:00:00.000000000 Z
11
+ date: 2023-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: katello