foreman_rh_cloud 2.0.12 → 2.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -0
  3. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +2 -0
  4. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +18 -0
  5. data/app/helpers/foreman_inventory_upload_host_helper.rb +2 -3
  6. data/app/models/concerns/rh_cloud_host.rb +4 -1
  7. data/app/models/insights_hit.rb +1 -1
  8. data/app/models/setting/rh_cloud.rb +5 -3
  9. data/app/overrides/hosts_list.rb +1 -1
  10. data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
  11. data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +1 -6
  12. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  13. data/app/views/hosts/_insights_tab.html.erb +1 -7
  14. data/app/views/layouts/foreman_rh_cloud/application.html.erb +0 -1
  15. data/config/Gemfile.lock.gh_test +815 -0
  16. data/config/database.yml.example +17 -0
  17. data/config/package-lock.json.gh_test +36317 -0
  18. data/config/routes.rb +2 -0
  19. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  20. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  21. data/lib/foreman_inventory_upload.rb +1 -1
  22. data/lib/foreman_inventory_upload/generators/archived_report.rb +1 -1
  23. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +35 -0
  24. data/lib/foreman_inventory_upload/generators/json_stream.rb +7 -2
  25. data/lib/foreman_inventory_upload/generators/queries.rb +2 -0
  26. data/lib/foreman_inventory_upload/generators/slice.rb +27 -25
  27. data/lib/foreman_rh_cloud.rb +2 -1
  28. data/lib/foreman_rh_cloud/engine.rb +3 -3
  29. data/lib/foreman_rh_cloud/version.rb +1 -1
  30. data/lib/insights_cloud/async/insights_full_sync.rb +4 -25
  31. data/lib/inventory_sync/async/inventory_full_sync.rb +2 -23
  32. data/lib/tasks/rh_cloud_inventory.rake +23 -0
  33. data/package.json +1 -1
  34. data/test/unit/fact_helpers_test.rb +22 -0
  35. data/test/unit/insights_facet_test.rb +7 -0
  36. data/test/unit/slice_generator_test.rb +142 -2
  37. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +14 -1
  38. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -18
  39. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +16 -0
  40. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +6 -0
  41. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  42. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -8
  43. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  44. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +19 -0
  45. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +11 -0
  46. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  47. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  48. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  49. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  50. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  51. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  52. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  53. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  54. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  55. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  56. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  57. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  58. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  59. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  60. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  61. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +36 -0
  62. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  63. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  64. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  65. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  66. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  67. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  68. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  69. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  70. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  71. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  72. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  73. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  74. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  75. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  76. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  77. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  78. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  79. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  80. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  81. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  82. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +8 -2
  83. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +9 -11
  84. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +1 -1
  85. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +2 -2
  86. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +18 -0
  87. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +1 -8
  88. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +62 -0
  89. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +0 -7
  90. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +2 -2
  91. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  92. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  93. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  94. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +17 -20
  95. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +0 -6
  96. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +0 -4
  97. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +16 -0
  98. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +1 -24
  99. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +38 -4
  100. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +0 -14
  101. data/webpack/InsightsCloudSync/InsightsCloudSync.js +3 -5
  102. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +1 -3
  103. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  104. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  105. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +1 -1
  106. data/webpack/InsightsHostDetailsTab/InsightsTab.js +8 -6
  107. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +2 -2
  108. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +9 -8
  109. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +0 -1
  110. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +2 -9
  111. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +7 -1
  112. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +0 -9
  113. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +26 -22
  114. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +40 -2
  115. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +0 -7
  116. metadata +30 -3
  117. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
@@ -3,6 +3,7 @@ require 'test_plugin_helper'
3
3
  class InsightsFacetTest < ActiveSupport::TestCase
4
4
  setup do
5
5
  @host = FactoryBot.create(:host, :with_insights_hits)
6
+ InsightsFacet.reset_counters(@host.insights.id, :hits_count)
6
7
  end
7
8
 
8
9
  test 'host with hits can be deleted' do
@@ -13,4 +14,10 @@ class InsightsFacetTest < ActiveSupport::TestCase
13
14
  actual_host = Host.find_by_id(host_id)
14
15
  assert_nil actual_host
15
16
  end
17
+
18
+ test 'search host by recommendations_count' do
19
+ FactoryBot.create(:host) # create another host with no recommendations
20
+
21
+ assert_equal 1, Host.search_for('insights_recommendations_count = 1').count
22
+ end
16
23
  end
@@ -1,6 +1,6 @@
1
1
  require 'test_plugin_helper'
2
2
 
3
- class ReportGeneratorTest < ActiveSupport::TestCase
3
+ class SliceGeneratorTest < ActiveSupport::TestCase
4
4
  setup do
5
5
  User.current = User.find_by(login: 'secret_admin')
6
6
 
@@ -44,6 +44,8 @@ class ReportGeneratorTest < ActiveSupport::TestCase
44
44
  'dmi::chassis::asset_tag',
45
45
  'insights_client::obfuscate_hostname_enabled',
46
46
  'insights_client::hostname',
47
+ 'insights_client::obfuscate_ip_enabled',
48
+ 'insights_client::ips',
47
49
  ]
48
50
  end
49
51
 
@@ -69,10 +71,42 @@ class ReportGeneratorTest < ActiveSupport::TestCase
69
71
  assert_equal @host.fqdn, actual_host['fqdn']
70
72
  assert_equal '1234', actual_host['account']
71
73
  assert_equal 1, generator.hosts_count
74
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
75
+ assert_nil actual_system_profile['number_of_cpus']
76
+ assert_nil actual_system_profile['number_of_sockets']
77
+ assert_nil actual_system_profile['cores_per_socket']
78
+ assert_nil actual_system_profile['system_memory_bytes']
79
+ assert_nil actual_system_profile['os_release']
80
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
81
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
82
+ refute actual_nic.key?('mtu')
83
+ refute actual_nic.key?('mac_address')
84
+ refute actual_nic.key?('name')
85
+ end
86
+
87
+ test 'hosts report fields should be present if fact exist' do
88
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::cpu(s)'], value: '4', host: @host)
89
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::cpu_socket(s)'], value: '2', host: @host)
90
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::core(s)_per_socket'], value: '1', host: @host)
91
+
92
+ batch = Host.where(id: @host.id).in_batches.first
93
+ generator = create_generator(batch)
94
+
95
+ json_str = generator.render
96
+ actual = JSON.parse(json_str.join("\n"))
97
+
98
+ assert_equal 'slice_123', actual['report_slice_id']
99
+ assert_not_nil(actual_host = actual['hosts'].first)
100
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
101
+ assert_equal 4, actual_system_profile['number_of_cpus']
102
+ assert_equal 2, actual_system_profile['number_of_sockets']
103
+ assert_equal 1, actual_system_profile['cores_per_socket']
72
104
  end
73
105
 
74
106
  test 'generates ip_address and mac_address fields' do
75
- @host.interfaces << FactoryBot.build(:nic_managed)
107
+ nic = FactoryBot.build(:nic_managed)
108
+ nic.attrs['mtu'] = '1500'
109
+ @host.interfaces << nic
76
110
  batch = Host.where(id: @host.id).in_batches.first
77
111
  generator = create_generator(batch)
78
112
 
@@ -88,6 +122,86 @@ class ReportGeneratorTest < ActiveSupport::TestCase
88
122
  assert_equal 1, generator.hosts_count
89
123
  end
90
124
 
125
+ test 'generates nic fields' do
126
+ ip6 = Array.new(4) { '%x' % rand(16**4) }.join(':') + '::' + '5'
127
+ nic = FactoryBot.build(:nic_managed, ip6: ip6)
128
+ nic.attrs['mtu'] = '1500'
129
+ @host.interfaces << nic
130
+ batch = Host.where(id: @host.id).in_batches.first
131
+ generator = create_generator(batch)
132
+
133
+ json_str = generator.render
134
+ actual = JSON.parse(json_str.join("\n"))
135
+
136
+ assert_equal 'slice_123', actual['report_slice_id']
137
+ assert_not_nil(actual_host = actual['hosts'].first)
138
+ assert_equal @host.interfaces.where.not(ip: nil).first.ip, actual_host['ip_addresses'].first
139
+ assert_equal @host.interfaces.where.not(mac: nil).first.mac, actual_host['mac_addresses'].first
140
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
141
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
142
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
143
+ assert_equal nic.ip, actual_nic['ipv4_addresses'].first
144
+ assert_equal nic.ip6, actual_nic['ipv6_addresses'].first
145
+ assert_equal 1500, actual_nic['mtu']
146
+ assert_equal nic.mac, actual_nic['mac_address']
147
+ assert_equal nic.identifier, actual_nic['name']
148
+ assert_equal @host.fqdn, actual_host['fqdn']
149
+ assert_equal '1234', actual_host['account']
150
+ assert_equal 1, generator.hosts_count
151
+ end
152
+
153
+ test 'generates obfuscated ip_address fields without inisghts-client' do
154
+ FactoryBot.create(:setting, :name => 'obfuscate_inventory_ips', :value => true)
155
+
156
+ @host.interfaces << FactoryBot.build(:nic_managed)
157
+ batch = Host.where(id: @host.id).in_batches.first
158
+ generator = create_generator(batch)
159
+
160
+ json_str = generator.render
161
+ actual = JSON.parse(json_str.join("\n"))
162
+
163
+ assert_equal 'slice_123', actual['report_slice_id']
164
+ assert_not_nil(actual_host = actual['hosts'].first)
165
+ assert_equal '10.230.230.1', actual_host['ip_addresses'].first
166
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
167
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
168
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
169
+ assert_equal '10.230.230.1', actual_nic['ipv4_addresses'].first
170
+ assert_equal @host.fqdn, actual_host['fqdn']
171
+ assert_equal '1234', actual_host['account']
172
+ assert_equal 1, generator.hosts_count
173
+ end
174
+
175
+ test 'generates obfuscated ip_address fields with inisghts-client' do
176
+ nic = FactoryBot.build(:nic_managed)
177
+ @host.interfaces << nic
178
+
179
+ FactoryBot.create(:fact_value, fact_name: fact_names['insights_client::obfuscate_ip_enabled'], value: 'true', host: @host)
180
+ FactoryBot.create(
181
+ :fact_value,
182
+ fact_name: fact_names['insights_client::ips'],
183
+ value: "[{\"obfuscated\": \"10.230.230.100\", \"original\": \"#{nic.ip}\"}]",
184
+ host: @host
185
+ )
186
+
187
+ batch = Host.where(id: @host.id).in_batches.first
188
+ generator = create_generator(batch)
189
+
190
+ json_str = generator.render
191
+ actual = JSON.parse(json_str.join("\n"))
192
+
193
+ assert_equal 'slice_123', actual['report_slice_id']
194
+ assert_not_nil(actual_host = actual['hosts'].first)
195
+ assert_equal '10.230.230.100', actual_host['ip_addresses'].first
196
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
197
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
198
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
199
+ assert_equal '10.230.230.100', actual_nic['ipv4_addresses'].first
200
+ assert_equal @host.fqdn, actual_host['fqdn']
201
+ assert_equal '1234', actual_host['account']
202
+ assert_equal 1, generator.hosts_count
203
+ end
204
+
91
205
  test 'obfuscates fqdn when instructed by insights-client' do
92
206
  FactoryBot.create(:fact_value, fact_name: fact_names['insights_client::obfuscate_hostname_enabled'], value: 'true', host: @host)
93
207
  FactoryBot.create(:fact_value, fact_name: fact_names['insights_client::hostname'], value: 'obfuscated_name', host: @host)
@@ -449,6 +563,32 @@ class ReportGeneratorTest < ActiveSupport::TestCase
449
563
  assert_equal 'alibaba', actual_profile['cloud_provider']
450
564
  end
451
565
 
566
+ test 'include packages installed in the report' do
567
+ FactoryBot.create(:setting, :name => 'exclude_installed_packages', :value => false)
568
+ installed_package = ::Katello::InstalledPackage.create(name: 'test-package', nvrea: 'test-package-1.0.x86_64', nvra: 'test-package-1.0.x86_64')
569
+
570
+ another_host = FactoryBot.create(
571
+ :host,
572
+ :with_subscription,
573
+ :with_content,
574
+ content_view: @host.content_view,
575
+ lifecycle_environment: @host.lifecycle_environment,
576
+ organization: @host.organization,
577
+ installed_packages: [installed_package]
578
+ )
579
+
580
+ batch = Host.where(id: another_host.id).in_batches.first
581
+ generator = create_generator(batch)
582
+
583
+ json_str = generator.render
584
+ actual = JSON.parse(json_str.join("\n"))
585
+
586
+ assert_equal 'slice_123', actual['report_slice_id']
587
+ assert_not_nil(actual_host = actual['hosts'].first)
588
+ assert_not_nil(actual_profile = actual_host['system_profile'])
589
+ assert_not_nil(actual_profile['installed_packages'])
590
+ end
591
+
452
592
  private
453
593
 
454
594
  def create_generator(batch, name = 'slice_123')
@@ -34,10 +34,14 @@ export const autoUploadEnabled = true;
34
34
 
35
35
  export const hostObfuscationEnabled = true;
36
36
 
37
+ export const ipsObfuscationEnabled = true;
38
+
37
39
  export const filterTerm = 'some_filter';
38
40
 
39
41
  export const cloudToken = 'some-cloud-token';
40
42
 
43
+ export const excludePackages = false;
44
+
41
45
  export const props = {
42
46
  accounts,
43
47
  fetchAccountsStatus: noop,
@@ -46,6 +50,15 @@ export const props = {
46
50
  pollingProcessID,
47
51
  };
48
52
 
53
+ export const pollingResponse = {
54
+ accounts,
55
+ autoUploadEnabled,
56
+ hostObfuscationEnabled,
57
+ ipsObfuscationEnabled,
58
+ cloudToken,
59
+ excludePackages,
60
+ };
61
+
49
62
  export const fetchAccountsStatusResponse = {
50
- data: { accounts, autoUploadEnabled, hostObfuscationEnabled, cloudToken },
63
+ data: pollingResponse,
51
64
  };
@@ -1,4 +1,5 @@
1
1
  import API from 'foremanReact/API';
2
+ import { addToast } from 'foremanReact/redux/actions/toasts';
2
3
  import { inventoryUrl } from '../../ForemanInventoryHelpers';
3
4
  import {
4
5
  INVENTORY_ACCOUNT_STATUS_POLLING,
@@ -10,17 +11,10 @@ import {
10
11
 
11
12
  export const fetchAccountsStatus = () => async dispatch => {
12
13
  try {
13
- const {
14
- data: { accounts, autoUploadEnabled, hostObfuscationEnabled, cloudToken },
15
- } = await API.get(inventoryUrl('accounts'));
14
+ const { data } = await API.get(inventoryUrl('accounts'));
16
15
  dispatch({
17
16
  type: INVENTORY_ACCOUNT_STATUS_POLLING,
18
- payload: {
19
- accounts,
20
- autoUploadEnabled,
21
- hostObfuscationEnabled,
22
- cloudToken,
23
- },
17
+ payload: data,
24
18
  });
25
19
  } catch (error) {
26
20
  dispatch({
@@ -46,7 +40,7 @@ export const stopAccountStatusPolling = pollingProcessID => dispatch => {
46
40
  });
47
41
  };
48
42
 
49
- export const restartProcess = (accountID, activeTab) => dispatch => {
43
+ export const restartProcess = (accountID, activeTab) => async dispatch => {
50
44
  let processController = null;
51
45
  let processStatusName = null;
52
46
 
@@ -58,12 +52,22 @@ export const restartProcess = (accountID, activeTab) => dispatch => {
58
52
  processStatusName = 'generate_report_status';
59
53
  }
60
54
 
61
- API.post(inventoryUrl(`${accountID}/${processController}`));
62
- dispatch({
63
- type: INVENTORY_PROCESS_RESTART,
64
- payload: {
65
- accountID,
66
- processStatusName,
67
- },
68
- });
55
+ try {
56
+ await API.post(inventoryUrl(`${accountID}/${processController}`));
57
+ dispatch({
58
+ type: INVENTORY_PROCESS_RESTART,
59
+ payload: {
60
+ accountID,
61
+ processStatusName,
62
+ },
63
+ });
64
+ } catch (error) {
65
+ dispatch(
66
+ addToast({
67
+ sticky: true,
68
+ type: 'error',
69
+ message: error.message,
70
+ })
71
+ );
72
+ }
69
73
  };
@@ -1,6 +1,8 @@
1
1
  import Immutable from 'seamless-immutable';
2
2
  import { AUTO_UPLOAD_TOGGLE } from '../AutoUploadSwitcher/AutoUploadSwitcherConstants';
3
3
  import { HOST_OBFUSCATION_TOGGLE } from '../HostObfuscationSwitcher/HostObfuscationSwitcherConstants';
4
+ import { IPS_OBFUSCATION_TOGGLE } from '../IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants';
5
+ import { EXCLUDE_PACKAGES_TOGGLE } from '../ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants';
4
6
  import {
5
7
  INVENTORY_ACCOUNT_STATUS_POLLING,
6
8
  INVENTORY_ACCOUNT_STATUS_POLLING_ERROR,
@@ -24,7 +26,9 @@ export default (state = initialState, action) => {
24
26
  processStatusName,
25
27
  autoUploadEnabled,
26
28
  hostObfuscationEnabled,
29
+ ipsObfuscationEnabled,
27
30
  cloudToken,
31
+ excludePackages,
28
32
  } = {},
29
33
  } = action;
30
34
 
@@ -35,7 +39,9 @@ export default (state = initialState, action) => {
35
39
  accounts,
36
40
  autoUploadEnabled,
37
41
  hostObfuscationEnabled,
42
+ ipsObfuscationEnabled,
38
43
  cloudToken,
44
+ excludePackages,
39
45
  error: null,
40
46
  });
41
47
  case INVENTORY_ACCOUNT_STATUS_POLLING_ERROR:
@@ -67,6 +73,16 @@ export default (state = initialState, action) => {
67
73
  ...state,
68
74
  hostObfuscationEnabled,
69
75
  });
76
+ case EXCLUDE_PACKAGES_TOGGLE:
77
+ return state.merge({
78
+ ...state,
79
+ excludePackages,
80
+ });
81
+ case IPS_OBFUSCATION_TOGGLE:
82
+ return state.merge({
83
+ ...state,
84
+ ipsObfuscationEnabled,
85
+ });
70
86
  default:
71
87
  return state;
72
88
  }
@@ -16,4 +16,10 @@ export const selectAutoUploadEnabled = state =>
16
16
  export const selectHostObfuscationEnabled = state =>
17
17
  selectAccountsList(state).hostObfuscationEnabled;
18
18
 
19
+ export const selectIpsObfuscationEnabled = state =>
20
+ selectAccountsList(state).ipsObfuscationEnabled;
21
+
19
22
  export const selectCloudToken = state => selectAccountsList(state).cloudToken;
23
+
24
+ export const selectExcludePackages = state =>
25
+ selectAccountsList(state).excludePackages;
@@ -22,6 +22,13 @@ const fixtures = {
22
22
  'should stopAccountStatusPolling': () =>
23
23
  stopAccountStatusPolling(pollingProcessID),
24
24
  'should restartProcess': () => restartProcess(accountID, activeTab),
25
+ 'should invoke toast notification upon failure': () => {
26
+ API.post.mockImplementationOnce(() =>
27
+ Promise.reject(new Error('test error'))
28
+ );
29
+
30
+ return restartProcess(accountID, activeTab);
31
+ },
25
32
  };
26
33
 
27
34
  describe('AccountList actions', () => testActionSnapshotWithFixtures(fixtures));
@@ -9,29 +9,25 @@ import {
9
9
  } from '../AccountListConstants';
10
10
  import reducer from '../AccountListReducer';
11
11
  import {
12
- accounts,
13
12
  error,
14
13
  pollingProcessID,
15
14
  accountID,
16
15
  processStatusName,
17
16
  autoUploadEnabled,
18
17
  hostObfuscationEnabled,
19
- cloudToken,
18
+ ipsObfuscationEnabled,
19
+ pollingResponse,
20
20
  } from '../AccountList.fixtures';
21
21
  import { AUTO_UPLOAD_TOGGLE } from '../../AutoUploadSwitcher/AutoUploadSwitcherConstants';
22
22
  import { HOST_OBFUSCATION_TOGGLE } from '../../HostObfuscationSwitcher/HostObfuscationSwitcherConstants';
23
+ import { IPS_OBFUSCATION_TOGGLE } from '../../IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants';
23
24
 
24
25
  const fixtures = {
25
26
  'should return the initial state': {},
26
27
  'should handle INVENTORY_ACCOUNT_STATUS_POLLING': {
27
28
  action: {
28
29
  type: INVENTORY_ACCOUNT_STATUS_POLLING,
29
- payload: {
30
- accounts,
31
- autoUploadEnabled,
32
- hostObfuscationEnabled,
33
- cloudToken,
34
- },
30
+ payload: pollingResponse,
35
31
  },
36
32
  },
37
33
  'should handle INVENTORY_ACCOUNT_STATUS_POLLING_ERROR': {
@@ -78,6 +74,14 @@ const fixtures = {
78
74
  },
79
75
  },
80
76
  },
77
+ 'should handle IPS_OBFUSCATION_TOGGLE': {
78
+ action: {
79
+ type: IPS_OBFUSCATION_TOGGLE,
80
+ payload: {
81
+ ipsObfuscationEnabled,
82
+ },
83
+ },
84
+ },
81
85
  };
82
86
 
83
87
  describe('AccountList reducer', () =>
@@ -5,12 +5,16 @@ import {
5
5
  selectPollingProcessID,
6
6
  selectAutoUploadEnabled,
7
7
  selectHostObfuscationEnabled,
8
+ selectCloudToken,
9
+ selectExcludePackages,
8
10
  } from '../AccountListSelectors';
9
11
  import {
10
12
  pollingProcessID,
11
13
  accounts,
12
14
  autoUploadEnabled,
13
15
  hostObfuscationEnabled,
16
+ cloudToken,
17
+ excludePackages,
14
18
  } from '../AccountList.fixtures';
15
19
  import { rhCloudStateWrapper } from '../../../../ForemanRhCloudTestHelpers';
16
20
 
@@ -20,6 +24,8 @@ const state = rhCloudStateWrapper({
20
24
  pollingProcessID,
21
25
  autoUploadEnabled,
22
26
  hostObfuscationEnabled,
27
+ cloudToken,
28
+ excludePackages,
23
29
  },
24
30
  });
25
31
 
@@ -32,6 +38,9 @@ const fixtures = {
32
38
  selectAutoUploadEnabled(state),
33
39
  'should return AccountList hostObfuscationEnabled': () =>
34
40
  selectHostObfuscationEnabled(state),
41
+ 'should return AccountList cloudToken': () => selectCloudToken(state),
42
+ 'should return AccountList excludePackages': () =>
43
+ selectExcludePackages(state),
35
44
  };
36
45
 
37
46
  describe('AccountList selectors', () =>