foreman_rh_cloud 8.0.47 → 8.0.49

Sign up to get free protection for your applications and to get access to all the features.
data/config/routes.rb CHANGED
@@ -4,6 +4,7 @@ Rails.application.routes.draw do
4
4
  post ':organization_id/reports', to: 'reports#generate', constraints: { organization_id: %r{[^\/]+} }
5
5
  get ':organization_id/uploads/last', to: 'uploads#last', constraints: { organization_id: %r{[^\/]+} }
6
6
  get ':organization_id/uploads/file', to: 'uploads#download_file', constraints: { organization_id: %r{[^\/]+} }
7
+ get 'missing_hosts', to: 'missing_hosts#index'
7
8
  get 'accounts', to: 'accounts#index'
8
9
  get 'settings', to: 'uploads_settings#index'
9
10
  post 'setting', to: 'uploads_settings#set_advanced_setting'
@@ -50,10 +51,12 @@ Rails.application.routes.draw do
50
51
  scope '(:apiv)', :module => :v2, :defaults => {:apiv => 'v2'}, :apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2, :default => true) do
51
52
  resources :organizations, :only => [:show] do
52
53
  namespace 'rh_cloud' do
54
+ get 'missing_hosts', to: 'inventory#get_hosts'
53
55
  get 'report', to: 'inventory#download_file'
54
56
  post 'report', to: 'inventory#generate_report'
55
57
 
56
58
  post 'inventory_sync', to: 'inventory#sync_inventory_status'
59
+ post 'missing_hosts', to: 'inventory#remove_hosts'
57
60
  end
58
61
  end
59
62
 
@@ -3,8 +3,8 @@
3
3
  class AddMissingHostsTable < ActiveRecord::Migration[6.1]
4
4
  def change
5
5
  create_table :insights_missing_hosts do |t|
6
- t.integer :organization_id
7
6
  t.string :name
7
+ t.integer :organization_id
8
8
  t.string :insights_id
9
9
  t.string :rhsm_id
10
10
  t.string :ip_address
@@ -113,7 +113,7 @@ module ForemanInventoryUpload
113
113
  bash_hostname = `uname -n`.chomp
114
114
  foreman_hostname = ForemanRhCloud.foreman_host&.name
115
115
  if bash_hostname == foreman_hostname
116
- fqdn(foreman_hostname)
116
+ fqdn(ForemanRhCloud.foreman_host)
117
117
  elsif Setting[:obfuscate_inventory_hostnames]
118
118
  obfuscate_fqdn(bash_hostname)
119
119
  else
@@ -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
@@ -52,9 +52,10 @@ module ForemanRhCloud
52
52
  :generate_foreman_rh_cloud,
53
53
  'foreman_inventory_upload/reports': [:generate],
54
54
  'foreman_inventory_upload/tasks': [:create],
55
- 'api/v2/rh_cloud/inventory': [:sync_inventory_status, :download_file, :generate_report, :enable_cloud_connector],
55
+ 'api/v2/rh_cloud/inventory': [:get_hosts, :remove_hosts, :sync_inventory_status, :download_file, :generate_report, :enable_cloud_connector],
56
56
  'foreman_inventory_upload/uploads': [:enable_cloud_connector],
57
57
  'foreman_inventory_upload/uploads_settings': [:set_advanced_setting],
58
+ 'foreman_inventory_upload/missing_hosts': [:remove_hosts],
58
59
  'insights_cloud/settings': [:update],
59
60
  'insights_cloud/tasks': [:create]
60
61
  )
@@ -66,6 +67,7 @@ module ForemanRhCloud
66
67
  'foreman_inventory_upload/tasks': [:show],
67
68
  'foreman_inventory_upload/cloud_status': [:index],
68
69
  'foreman_inventory_upload/uploads_settings': [:index],
70
+ 'foreman_inventory_upload/missing_hosts': [:index],
69
71
  'react': [:index]
70
72
  )
71
73
  permission(
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '8.0.47'.freeze
2
+ VERSION = '8.0.49'.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)
@@ -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.47",
3
+ "version": "8.0.49",
4
4
  "description": "Inventory Upload =============",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -9,10 +9,7 @@
9
9
  "test": "tfm-test --plugin",
10
10
  "test:watch": "tfm-test --plugin --watchAll",
11
11
  "test:current": "tfm-test --plugin --watch",
12
- "publish-coverage": "tfm-publish-coverage",
13
- "stories": "tfm-stories --plugin",
14
- "stories:build": "tfm-build-stories --plugin",
15
- "stories:deploy": "surge --project .storybook-dist"
12
+ "publish-coverage": "tfm-publish-coverage"
16
13
  },
17
14
  "repository": {
18
15
  "type": "git",
@@ -27,10 +24,10 @@
27
24
  "devDependencies": {
28
25
  "@babel/core": "~7.7.0",
29
26
  "@theforeman/builder": ">= 10.1.1",
30
- "@theforeman/stories": ">= 10.1.1",
31
27
  "@theforeman/test": ">= 10.1.1",
32
28
  "@theforeman/eslint-plugin-foreman": ">= 10.1.1",
33
29
  "babel-eslint": "~10.0.0",
30
+ "cosmiconfig-typescript-loader": "~4.3.0",
34
31
  "eslint": "~6.7.2",
35
32
  "eslint-plugin-spellcheck": "~0.0.17",
36
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,9 @@ 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, @job_invocation.finished?
47
+ assert_equal 'stopped', @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)['state']
48
+
42
49
  assert_not_nil actual_report_finished = actual_jsonl.find { |l| l['type'] == 'playbook_run_completed' }
43
50
  assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
44
51
  assert_equal 'success', actual_report_finished['status']
@@ -49,57 +56,121 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
49
56
  end
50
57
 
51
58
  test 'It reports single progress message for done host' do
52
- TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:done?).returns(false, true)
59
+ class ArrangeTestHost < InsightsCloud::Async::ConnectorPlaybookExecutionReporterTask
60
+ def send_report(report)
61
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
62
+ host1_task.state = 'stopped'
63
+ host1_task.save!
64
+
65
+ output[:saved_reports] = (output[:saved_reports] || []) << report
66
+ end
67
+ end
53
68
 
54
- actual = ForemanTasks.sync_task(TestConnectorPlaybookExecutionReporterTask, @job_invocation)
69
+ ArrangeTestHost.instance_variable_set(:@connector_feature_id, nil)
70
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
71
+ host1_task.state = 'running'
72
+ host1_task.save!
55
73
 
56
- actual_report = actual.output[:saved_reports].first.to_s
74
+ ArrangeTestHost.any_instance.stubs(:job_finished?).returns(false, true)
57
75
 
58
- assert_equal 1, actual.output[:saved_reports].size
59
- assert_not_nil actual_report
60
- actual_jsonl = read_jsonl(actual_report)
76
+ actual = ForemanTasks.sync_task(ArrangeTestHost, @job_invocation)
77
+
78
+ actual_report1 = actual.output[:saved_reports].first.to_s
79
+ actual_report2 = actual.output[:saved_reports].second.to_s
80
+
81
+ assert_equal 2, actual.output[:saved_reports].size
82
+ assert_not_nil actual_report1
83
+ assert_not_nil actual_report2
84
+
85
+ actual_json1 = read_jsonl(actual_report1)
86
+ actual_json2 = read_jsonl(actual_report2)
87
+
88
+ assert_equal 'stopped', @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)['state']
61
89
 
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']
90
+ assert_not_nil actual_report_updated = actual_json1.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
91
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
92
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
93
+ assert_equal 0, actual_report_updated['sequence']
94
+ assert_equal 6, actual_report_updated.size
95
+
96
+ assert_not_nil actual_report_updated = actual_json2.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
97
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
98
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
99
+ assert_equal 1, actual_report_updated['sequence']
100
+ assert_equal 6, actual_report_updated.size
101
+
102
+ assert_not_nil actual_host_finished = actual_json2.find { |l| l['type'] == 'playbook_run_finished' && l['host'] == 'TEST_UUID1' }
103
+ assert_equal 'TEST_CORRELATION', actual_host_finished['correlation_id']
104
+ assert_equal 'TEST_UUID1', actual_host_finished['host']
105
+ assert_equal 'success', actual_host_finished['status']
106
+ assert_equal 7, actual_host_finished.size
107
+
108
+ assert_not_nil actual_report_finished = actual_json2.find { |l| l['type'] == 'playbook_run_completed' }
109
+ assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
110
+ assert_equal 'success', actual_report_finished['status']
111
+ assert_equal 4, actual_report_finished.size
66
112
  end
67
113
 
68
114
  test 'It reports two progress messages for in progress host' do
69
- TestConnectorPlaybookExecutionReporterTask.any_instance.stubs(:done?).returns(false, false, true)
115
+ class ArrangeTestHostTwo < InsightsCloud::Async::ConnectorPlaybookExecutionReporterTask
116
+ def send_report(report)
117
+ iteration_number = output[:iteration_number].to_i
118
+
119
+ if iteration_number == 1
120
+ host1_task = job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
121
+ host1_task.state = 'stopped'
122
+ host1_task.save!
123
+ end
124
+
125
+ output[:iteration_number] = iteration_number + 1
126
+ output[:saved_reports] = (output[:saved_reports] || []) << report
127
+ end
128
+ end
70
129
 
71
- host1_task = @job_invocation.template_invocations.joins(:host).where(hosts: {name: @host1.name}).first.run_host_job_task
130
+ ArrangeTestHostTwo.instance_variable_set(:@connector_feature_id, nil)
131
+ host1_task = @job_invocation.sub_task_for_host(Host.where(name: 'host1').first)
72
132
  host1_task.state = 'running'
73
133
  host1_task.save!
74
134
 
75
- actual = ForemanTasks.sync_task(TestConnectorPlaybookExecutionReporterTask, @job_invocation)
135
+ ArrangeTestHostTwo.any_instance.stubs(:job_finished?).returns(false, false, true)
76
136
 
77
- assert_equal 2, actual.output[:saved_reports].size
137
+ actual = ForemanTasks.sync_task(ArrangeTestHostTwo, @job_invocation)
78
138
 
79
- first_report = actual.output[:saved_reports].first.to_s
80
- actual_jsonl = read_jsonl(first_report)
139
+ actual_report1 = actual.output[:saved_reports].first.to_s
140
+ actual_report2 = actual.output[:saved_reports].second.to_s
141
+ actual_report3 = actual.output[:saved_reports].third.to_s
81
142
 
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']
143
+ assert_equal 3, actual.output[:saved_reports].size
144
+ assert_not_nil actual_report1
145
+ assert_not_nil actual_report2
146
+ assert_not_nil actual_report3
86
147
 
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']
148
+ actual_json1 = read_jsonl(actual_report1)
149
+ actual_json2 = read_jsonl(actual_report2)
150
+ actual_json3 = read_jsonl(actual_report3)
91
151
 
92
- second_report = actual.output[:saved_reports].last.to_s
93
- actual_jsonl = read_jsonl(second_report)
152
+ assert_not_nil actual_report_updated = actual_json1.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
153
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
154
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
155
+ assert_equal 0, actual_report_updated['sequence']
156
+ assert_equal 6, actual_report_updated.size
94
157
 
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']
158
+ assert_not_nil actual_report_updated = actual_json2.find { |l| l['type'] == 'playbook_run_update' && l['host'] == 'TEST_UUID1' }
159
+ assert_equal 'TEST_CORRELATION', actual_report_updated['correlation_id']
160
+ assert_equal 'TEST_UUID1', actual_report_updated['host']
161
+ assert_equal 1, actual_report_updated['sequence']
162
+ assert_equal 6, actual_report_updated.size
99
163
 
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
164
+ assert_not_nil actual_host_finished = actual_json3.find { |l| l['type'] == 'playbook_run_finished' && l['host'] == 'TEST_UUID1' }
165
+ assert_equal 'TEST_CORRELATION', actual_host_finished['correlation_id']
166
+ assert_equal 'TEST_UUID1', actual_host_finished['host']
167
+ assert_equal 'success', actual_host_finished['status']
168
+ assert_equal 7, actual_host_finished.size
169
+
170
+ assert_not_nil actual_report_finished = actual_json3.find { |l| l['type'] == 'playbook_run_completed' }
171
+ assert_equal 'TEST_CORRELATION', actual_report_finished['correlation_id']
172
+ assert_equal 'success', actual_report_finished['status']
173
+ assert_equal 4, actual_report_finished.size
103
174
  end
104
175
 
105
176
  private
@@ -164,10 +235,12 @@ class ConnectorPlaybookExecutionReporterTaskTest < ActiveSupport::TestCase
164
235
  :value => '1'
165
236
  )
166
237
 
167
- @host1 = FactoryBot.create(:host, :with_insights_hits, name: 'host1')
238
+ @host1 = FactoryBot.create(:host, :with_insights_hits)
239
+ @host1.name = 'host1' # overriding name since there is an issue with Factorybot and setting the name correctly, same for 2nd host
168
240
  @host1.insights.uuid = 'TEST_UUID1'
169
241
  @host1.insights.save!
170
- @host2 = FactoryBot.create(:host, :with_insights_hits, name: 'host2')
242
+ @host2 = FactoryBot.create(:host, :with_insights_hits)
243
+ @host2.name = 'host2'
171
244
  @host2.insights.uuid = 'TEST_UUID2'
172
245
  @host2.insights.save!
173
246
 
@@ -31,7 +31,7 @@ exports[`PageTitle rendering render without Props 1`] = `
31
31
  Actions history
32
32
  </DropdownItem>,
33
33
  <DropdownItem
34
- href="/links/manual/+?root_url=https%3A%2F%2Faccess.redhat.com%2Fproducts%2Fsubscription-central"
34
+ href="/links/manual/?root_url=https%3A%2F%2Faccess.redhat.com%2Fproducts%2Fsubscription-central"
35
35
  rel="noopener noreferrer"
36
36
  target="_blank"
37
37
  >
@@ -2,28 +2,44 @@ import React from 'react';
2
2
  import { Text } from '@patternfly/react-core';
3
3
 
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
+ import { FormattedMessage } from 'react-intl';
5
6
 
6
7
  export const PageDescription = () => (
7
8
  <div id="inventory_page_description">
8
9
  <Text>
9
10
  {__(
10
- 'Red Hat Insights is a set of cloud services which provide unified subscription reporting, predictive analysis and remediation of issues through this Satellite instance.'
11
+ 'The Red Hat Hybrid Cloud Console provides a set of cloud services, including Red Hat Insights and Subscriptions, that provide predictive analysis, remediation of issues, and unified subscription reporting for this Satellite instance.'
11
12
  )}
12
13
  </Text>
13
14
  <Text>
14
15
  {__(
15
- 'You can toggle the Auto upload switch to the ON position to enable Satellite to automatically upload your host inventory once a day.'
16
+ 'The Satellite inventory upload plugin automatically uploads Satellite host inventory data to the Inventory service of Insights, where it can also be used by the Subscriptions service for subscription reporting. If you use the Subscriptions service, enabling inventory uploads is required.'
16
17
  )}
17
18
  </Text>
18
19
  <Text>
19
- {__(
20
- 'Click Restart to upload your host inventory to Red Hat Insights. Perform this step for each organization from which you want to manually upload a host inventory.'
21
- )}
20
+ <FormattedMessage
21
+ id="enable-upload-hint"
22
+ defaultMessage={__(
23
+ 'To enable this reporting for all Satellite organizations, set {uploadButtonName} to on. The data will be reported automatically once per day.'
24
+ )}
25
+ values={{
26
+ uploadButtonName: <strong>{__('Automatic inventory upload')}</strong>,
27
+ }}
28
+ />
22
29
  </Text>
23
30
  <Text>
24
- {__(
25
- 'Enabling inventory uploads is required by subscription watch. For more information about subscription watch see link:'
26
- )}
31
+ <FormattedMessage
32
+ id="restart-button-hint"
33
+ defaultMessage={__(
34
+ 'To manually upload the data for a specific organization, select an organization and click {restartButtonName}.'
35
+ )}
36
+ values={{
37
+ restartButtonName: <strong>{__('Restart')}</strong>,
38
+ }}
39
+ />
40
+ </Text>
41
+ <Text>
42
+ {__('For more information about the Subscriptions service, see:')}
27
43
  &nbsp;
28
44
  <a
29
45
  href="https://access.redhat.com/documentation/en-us/subscription_central/2020-04/html/getting_started_with_subscription_watch/assembly-about-subscriptionwatch"
@@ -34,7 +50,7 @@ export const PageDescription = () => (
34
50
  </a>
35
51
  </Text>
36
52
  <Text>
37
- {__('For more information about Insights and Cloud Connector read')}
53
+ {__('For more information about Insights and Cloud Connector, see:')}
38
54
  &nbsp;
39
55
  <a
40
56
  href="https://console.redhat.com/security/insights/"
@@ -5,16 +5,39 @@ exports[`PageDescription rendering render without Props 1`] = `
5
5
  id="inventory_page_description"
6
6
  >
7
7
  <Text>
8
- Red Hat Insights is a set of cloud services which provide unified subscription reporting, predictive analysis and remediation of issues through this Satellite instance.
8
+ The Red Hat Hybrid Cloud Console provides a set of cloud services, including Red Hat Insights and Subscriptions, that provide predictive analysis, remediation of issues, and unified subscription reporting for this Satellite instance.
9
9
  </Text>
10
10
  <Text>
11
- You can toggle the Auto upload switch to the ON position to enable Satellite to automatically upload your host inventory once a day.
11
+ The Satellite inventory upload plugin automatically uploads Satellite host inventory data to the Inventory service of Insights, where it can also be used by the Subscriptions service for subscription reporting. If you use the Subscriptions service, enabling inventory uploads is required.
12
12
  </Text>
13
13
  <Text>
14
- Click Restart to upload your host inventory to Red Hat Insights. Perform this step for each organization from which you want to manually upload a host inventory.
14
+ <FormattedMessage
15
+ defaultMessage="To enable this reporting for all Satellite organizations, set {uploadButtonName} to on. The data will be reported automatically once per day."
16
+ id="enable-upload-hint"
17
+ values={
18
+ Object {
19
+ "uploadButtonName": <strong>
20
+ Automatic inventory upload
21
+ </strong>,
22
+ }
23
+ }
24
+ />
15
25
  </Text>
16
26
  <Text>
17
- Enabling inventory uploads is required by subscription watch. For more information about subscription watch see link:
27
+ <FormattedMessage
28
+ defaultMessage="To manually upload the data for a specific organization, select an organization and click {restartButtonName}."
29
+ id="restart-button-hint"
30
+ values={
31
+ Object {
32
+ "restartButtonName": <strong>
33
+ Restart
34
+ </strong>,
35
+ }
36
+ }
37
+ />
38
+ </Text>
39
+ <Text>
40
+ For more information about the Subscriptions service, see:
18
41
   
19
42
  <a
20
43
  href="https://access.redhat.com/documentation/en-us/subscription_central/2020-04/html/getting_started_with_subscription_watch/assembly-about-subscriptionwatch"
@@ -25,7 +48,7 @@ exports[`PageDescription rendering render without Props 1`] = `
25
48
  </a>
26
49
  </Text>
27
50
  <Text>
28
- For more information about Insights and Cloud Connector read
51
+ For more information about Insights and Cloud Connector, see:
29
52
   
30
53
  <a
31
54
  href="https://console.redhat.com/security/insights/"
@@ -6,7 +6,7 @@ export const inventoryUrl = path =>
6
6
 
7
7
  export const getInventoryDocsUrl = () =>
8
8
  foremanUrl(
9
- `/links/manual/+?root_url=${URI.encode(
9
+ `/links/manual/?root_url=${URI.encode(
10
10
  'https://access.redhat.com/products/subscription-central'
11
11
  )}`
12
12
  );
@@ -2,4 +2,4 @@
2
2
 
3
3
  exports[`ForemanInventoryUpload helpers should return inventory Url 1`] = `"/foreman_inventory_upload/test_path"`;
4
4
 
5
- exports[`ForemanInventoryUpload helpers should return inventory docs url 1`] = `"/links/manual/+?root_url=https%3A%2F%2Faccess.redhat.com%2Fproducts%2Fsubscription-central"`;
5
+ exports[`ForemanInventoryUpload helpers should return inventory docs url 1`] = `"/links/manual/?root_url=https%3A%2F%2Faccess.redhat.com%2Fproducts%2Fsubscription-central"`;
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.47
4
+ version: 8.0.49
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-06-20 00:00:00.000000000 Z
11
+ date: 2023-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: katello
@@ -126,6 +126,7 @@ files:
126
126
  - app/controllers/concerns/inventory_upload/task_actions.rb
127
127
  - app/controllers/foreman_inventory_upload/accounts_controller.rb
128
128
  - app/controllers/foreman_inventory_upload/cloud_status_controller.rb
129
+ - app/controllers/foreman_inventory_upload/missing_hosts_controller.rb
129
130
  - app/controllers/foreman_inventory_upload/reports_controller.rb
130
131
  - app/controllers/foreman_inventory_upload/tasks_controller.rb
131
132
  - app/controllers/foreman_inventory_upload/uploads_controller.rb