foreman_rh_cloud 0.9.8 → 0.9.13

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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -0
  3. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +3 -0
  4. data/app/controllers/foreman_inventory_upload/tasks_controller.rb +25 -0
  5. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +18 -0
  6. data/app/controllers/insights_cloud/hits_controller.rb +17 -0
  7. data/app/controllers/insights_cloud/settings_controller.rb +24 -0
  8. data/app/controllers/insights_cloud/tasks_controller.rb +1 -2
  9. data/app/helpers/foreman_inventory_upload_host_helper.rb +10 -2
  10. data/app/models/concerns/rh_cloud_host.rb +15 -0
  11. data/app/models/insights_facet.rb +5 -1
  12. data/app/models/insights_hit.rb +1 -1
  13. data/app/models/inventory_sync/inventory_status.rb +30 -0
  14. data/app/models/setting/rh_cloud.rb +4 -1
  15. data/app/overrides/hosts_list.rb +1 -1
  16. data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
  17. data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +6 -1
  18. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  19. data/app/views/hosts/_insights_tab.html.erb +15 -0
  20. data/config/routes.rb +6 -0
  21. data/db/migrate/20200727111529_add_uuid_column_to_insights_facets.foreman_rh_cloud.rb +5 -0
  22. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  23. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  24. data/lib/foreman_inventory_upload.rb +4 -0
  25. data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
  26. data/lib/foreman_inventory_upload/async/shell_process.rb +15 -9
  27. data/lib/foreman_inventory_upload/async/upload_report_job.rb +21 -9
  28. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +36 -1
  29. data/lib/foreman_inventory_upload/generators/json_stream.rb +17 -2
  30. data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
  31. data/lib/foreman_inventory_upload/generators/queries.rb +4 -4
  32. data/lib/foreman_inventory_upload/generators/slice.rb +62 -34
  33. data/lib/foreman_rh_cloud.rb +67 -0
  34. data/lib/foreman_rh_cloud/engine.rb +20 -3
  35. data/lib/foreman_rh_cloud/version.rb +1 -1
  36. data/lib/insights_cloud.rb +8 -8
  37. data/lib/insights_cloud/async/insights_full_sync.rb +24 -32
  38. data/lib/insights_cloud/async/insights_scheduled_sync.rb +23 -0
  39. data/lib/inventory_sync/async/host_result.rb +50 -0
  40. data/lib/inventory_sync/async/inventory_full_sync.rb +80 -0
  41. data/lib/tasks/insights.rake +15 -0
  42. data/lib/tasks/rh_cloud_inventory.rake +37 -0
  43. data/package.json +3 -1
  44. data/test/controllers/insights_sync/settings_controller_test.rb +30 -0
  45. data/test/factories/insights_factories.rb +31 -0
  46. data/test/jobs/insights_full_sync_test.rb +33 -1
  47. data/test/jobs/inventory_full_sync_test.rb +91 -0
  48. data/test/jobs/upload_report_job_test.rb +34 -0
  49. data/test/unit/fact_helpers_test.rb +22 -0
  50. data/test/unit/insights_facet_test.rb +23 -0
  51. data/test/unit/metadata_generator_test.rb +2 -0
  52. data/test/unit/rh_cloud_http_proxy_test.rb +52 -0
  53. data/test/unit/slice_generator_test.rb +173 -11
  54. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +16 -1
  55. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -17
  56. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +18 -0
  57. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +8 -0
  58. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  59. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -6
  60. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  61. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +20 -0
  62. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +12 -0
  63. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  64. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  65. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  66. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  67. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  68. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  69. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  70. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  71. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  72. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  73. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  74. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  75. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  76. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  77. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  78. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +38 -0
  79. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  80. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  81. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/FullScreenModal.js +5 -1
  82. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/__tests__/__snapshots__/FullScreenModal.test.js.snap +1 -0
  83. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/fullScreenModal.scss +15 -13
  84. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  85. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  86. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  87. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  88. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  89. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  90. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  91. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +9 -0
  92. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  93. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  94. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  95. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  96. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  97. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  98. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  99. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  100. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  101. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  102. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  103. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +1 -1
  104. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +3 -3
  105. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/DocsButton.js +1 -0
  106. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/__tests__/__snapshots__/DocsButton.test.js.snap +1 -0
  107. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/HistoryButton.js +1 -0
  108. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/__tests__/__snapshots__/HistoryButton.test.js.snap +1 -0
  109. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/PageDescription.js +2 -2
  110. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/__tests__/__snapshots__/PageDescription.test.js.snap +2 -2
  111. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +58 -0
  112. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +57 -0
  113. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +3 -0
  114. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +36 -0
  115. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonSelectors.js +13 -0
  116. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButton.test.js +13 -0
  117. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +31 -0
  118. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonFixtures.js +9 -0
  119. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +26 -0
  120. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonSelectors.test.js +36 -0
  121. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButton.test.js.snap +26 -0
  122. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +98 -0
  123. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +18 -0
  124. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonSelectors.test.js.snap +18 -0
  125. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +63 -0
  126. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +41 -0
  127. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/modal.scss +20 -0
  128. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/index.js +22 -0
  129. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/ToolbarButtons.js +2 -0
  130. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/__tests__/__snapshots__/ToolbarButtons.test.js.snap +1 -0
  131. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/toolbarButtons.scss +6 -1
  132. data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
  133. data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
  134. data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
  135. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  136. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  137. data/webpack/ForemanInventoryUpload/ForemanInventoryConstants.js +3 -1
  138. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  139. data/webpack/ForemanInventoryUpload/ForemanInventoryUploadReducers.js +2 -0
  140. data/webpack/ForemanRhCloudPages.js +9 -0
  141. data/webpack/ForemanRhCloudReducers.js +2 -0
  142. data/webpack/ForemanRhCloudSelectors.js +5 -0
  143. data/webpack/ForemanRhCloudTestHelpers.js +17 -3
  144. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettings.js +33 -0
  145. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +57 -0
  146. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +4 -0
  147. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +24 -0
  148. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsSelectors.js +6 -0
  149. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettings.test.js +18 -0
  150. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +62 -0
  151. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +33 -0
  152. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsSelectors.test.js +21 -0
  153. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettings.test.js.snap +15 -0
  154. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +65 -0
  155. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +19 -0
  156. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsSelectors.test.js.snap +9 -0
  157. data/webpack/InsightsCloudSync/Components/InsightsSettings/index.js +21 -0
  158. data/webpack/InsightsCloudSync/Components/InsightsSettings/insightsSettings.scss +16 -0
  159. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.fixtures.js +1 -0
  160. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.js +45 -0
  161. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/InsightsSyncSwitcher.test.js +17 -0
  162. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/__snapshots__/InsightsSyncSwitcher.test.js.snap +38 -0
  163. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/index.js +1 -0
  164. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/insightsSyncSwitcher.scss +3 -0
  165. data/webpack/InsightsCloudSync/InsightsCloudSync.js +38 -5
  166. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +3 -0
  167. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  168. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  169. data/webpack/InsightsCloudSync/InsightsCloudSyncReducers.js +7 -2
  170. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +49 -9
  171. data/webpack/InsightsCloudSync/index.js +2 -1
  172. data/webpack/InsightsHostDetailsTab/InsightsTab.js +64 -0
  173. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
  174. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +31 -0
  175. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +2 -0
  176. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +19 -0
  177. data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
  178. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
  179. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
  180. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +19 -0
  181. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
  182. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +26 -0
  183. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
  184. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +30 -0
  185. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +58 -0
  186. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +34 -0
  187. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
  188. data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
  189. data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
  190. data/webpack/InsightsHostDetailsTab/index.js +20 -0
  191. data/webpack/__mocks__/foremanReact/constants.js +5 -0
  192. data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
  193. data/webpack/__tests__/ForemanRhCloudSelectors.test.js +4 -1
  194. data/webpack/__tests__/ForemanRhCloudTestHelpers.test.js +12 -2
  195. data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +10 -9
  196. data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +27 -2
  197. data/webpack/index.js +2 -12
  198. data/webpack/stories/decorators/withCardsDecorator.js +1 -1
  199. metadata +120 -12
  200. data/lib/tasks/generator.rake +0 -29
  201. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
@@ -26,4 +26,26 @@ class FactHelpersTest < ActiveSupport::TestCase
26
26
 
27
27
  assert actual
28
28
  end
29
+
30
+ test 'obfuscates ips with insights-client data' do
31
+ host = mock('host')
32
+ @instance.expects(:fact_value).with(host, 'insights_client::ips').returns(
33
+ '[{"obfuscated": "10.230.230.1", "original": "224.0.0.1"}, {"obfuscated": "10.230.230.2", "original": "224.0.0.251"}]'
34
+ )
35
+
36
+ actual = @instance.obfuscated_ips(host)
37
+
38
+ assert_equal '10.230.230.1', actual['224.0.0.1']
39
+ assert_equal '10.230.230.3', actual['224.0.0.2']
40
+ end
41
+
42
+ test 'obfuscates ips without insights-client data' do
43
+ host = mock('host')
44
+ @instance.expects(:fact_value).with(host, 'insights_client::ips').returns(nil)
45
+
46
+ actual = @instance.obfuscated_ips(host)
47
+
48
+ assert_equal '10.230.230.1', actual['224.0.0.1']
49
+ assert_equal '10.230.230.2', actual['224.0.0.2']
50
+ end
29
51
  end
@@ -0,0 +1,23 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class InsightsFacetTest < ActiveSupport::TestCase
4
+ setup do
5
+ @host = FactoryBot.create(:host, :with_insights_hits)
6
+ InsightsFacet.reset_counters(@host.insights.id, :hits_count)
7
+ end
8
+
9
+ test 'host with hits can be deleted' do
10
+ assert_equal 1, @host.insights.hits.count
11
+
12
+ host_id = @host.id
13
+ @host.destroy
14
+ actual_host = Host.find_by_id(host_id)
15
+ assert_nil actual_host
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
23
+ end
@@ -13,6 +13,8 @@ class MetadataGeneratorTest < ActiveSupport::TestCase
13
13
 
14
14
  assert_not_nil actual['report_id']
15
15
  assert_equal 'Satellite', actual['source']
16
+ assert_not_nil (actual_metadata = actual['source_metadata'])
17
+ assert_equal ForemanRhCloud::VERSION, actual_metadata['foreman_rh_cloud_version']
16
18
  assert_equal({}, actual['report_slices'])
17
19
  end
18
20
 
@@ -0,0 +1,52 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class RhCloudHttpProxyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @global_foreman_proxy_mock = 'http://global:foreman@localhost:8888'
6
+ @katello_cdn_proxy_mock = {
7
+ host: 'localhost',
8
+ port: '8888',
9
+ user: 'katello',
10
+ password: 'cdn',
11
+ scheme: 'http',
12
+ }
13
+ @katello_cdn_proxy_string_mock = 'http://katello:cdn@localhost:8888'
14
+ end
15
+
16
+ test 'selects cdn proxy' do
17
+ setup_global_foreman_proxy
18
+
19
+ setup_cdn_proxy do
20
+ assert_equal @katello_cdn_proxy_string_mock, ForemanRhCloud.proxy_setting
21
+ end
22
+ end
23
+
24
+ test 'selects global foreman proxy' do
25
+ setup_global_foreman_proxy
26
+
27
+ assert_equal @global_foreman_proxy_mock, ForemanRhCloud.proxy_setting
28
+ end
29
+
30
+ def setup_global_foreman_proxy
31
+ FactoryBot.create(:setting, :name => 'http_proxy', :value => @global_foreman_proxy_mock)
32
+ end
33
+
34
+ def setup_cdn_proxy
35
+ old_cdn_setting = SETTINGS[:katello][:cdn_proxy]
36
+ SETTINGS[:katello][:cdn_proxy] = @katello_cdn_proxy_mock
37
+ yield
38
+ ensure
39
+ SETTINGS[:katello][:cdn_proxy] = old_cdn_setting
40
+ end
41
+
42
+ test 'transform proxy scheme test' do
43
+ mock_http_proxy = 'http://user:password@localhost:8888'
44
+ mock_https_proxy = 'https://user:password@localhost:8888'
45
+
46
+ transformed_http_uri = URI.parse(ForemanRhCloud.transform_scheme(mock_http_proxy))
47
+ transformed_https_uri = URI.parse(ForemanRhCloud.transform_scheme(mock_https_proxy))
48
+
49
+ assert_equal 'proxy', transformed_http_uri.scheme
50
+ assert_equal 'proxys', transformed_https_uri.scheme
51
+ end
52
+ 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
 
@@ -9,6 +9,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
9
9
 
10
10
  @host = FactoryBot.create(
11
11
  :host,
12
+ :redhat,
12
13
  :with_subscription,
13
14
  :with_content,
14
15
  content_view: cv.first,
@@ -43,6 +44,8 @@ class ReportGeneratorTest < ActiveSupport::TestCase
43
44
  'dmi::chassis::asset_tag',
44
45
  'insights_client::obfuscate_hostname_enabled',
45
46
  'insights_client::hostname',
47
+ 'insights_client::obfuscate_ip_enabled',
48
+ 'insights_client::ips',
46
49
  ]
47
50
  end
48
51
 
@@ -63,6 +66,103 @@ class ReportGeneratorTest < ActiveSupport::TestCase
63
66
 
64
67
  assert_equal 'slice_123', actual['report_slice_id']
65
68
  assert_not_nil(actual_host = actual['hosts'].first)
69
+ assert_nil actual_host['ip_addresses']
70
+ assert_nil actual_host['mac_addresses']
71
+ assert_equal @host.fqdn, actual_host['fqdn']
72
+ assert_equal '1234', actual_host['account']
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
+ end
81
+
82
+ test 'hosts report fields should be present if fact exist' do
83
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::cpu(s)'], value: '4', host: @host)
84
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::cpu_socket(s)'], value: '2', host: @host)
85
+ FactoryBot.create(:fact_value, fact_name: fact_names['cpu::core(s)_per_socket'], value: '1', host: @host)
86
+
87
+ batch = Host.where(id: @host.id).in_batches.first
88
+ generator = create_generator(batch)
89
+
90
+ json_str = generator.render
91
+ actual = JSON.parse(json_str.join("\n"))
92
+
93
+ assert_equal 'slice_123', actual['report_slice_id']
94
+ assert_not_nil(actual_host = actual['hosts'].first)
95
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
96
+ assert_equal 4, actual_system_profile['number_of_cpus']
97
+ assert_equal 2, actual_system_profile['number_of_sockets']
98
+ assert_equal 1, actual_system_profile['cores_per_socket']
99
+ end
100
+
101
+ test 'generates ip_address and mac_address fields' do
102
+ @host.interfaces << FactoryBot.build(:nic_managed)
103
+ batch = Host.where(id: @host.id).in_batches.first
104
+ generator = create_generator(batch)
105
+
106
+ json_str = generator.render
107
+ actual = JSON.parse(json_str.join("\n"))
108
+
109
+ assert_equal 'slice_123', actual['report_slice_id']
110
+ assert_not_nil(actual_host = actual['hosts'].first)
111
+ assert_equal @host.interfaces.where.not(ip: nil).first.ip, actual_host['ip_addresses'].first
112
+ assert_equal @host.interfaces.where.not(mac: nil).first.mac, actual_host['mac_addresses'].first
113
+ assert_equal @host.fqdn, actual_host['fqdn']
114
+ assert_equal '1234', actual_host['account']
115
+ assert_equal 1, generator.hosts_count
116
+ end
117
+
118
+ test 'generates obfuscated ip_address fields without inisghts-client' do
119
+ FactoryBot.create(:setting, :name => 'obfuscate_inventory_ips', :value => true)
120
+
121
+ @host.interfaces << FactoryBot.build(:nic_managed)
122
+ batch = Host.where(id: @host.id).in_batches.first
123
+ generator = create_generator(batch)
124
+
125
+ json_str = generator.render
126
+ actual = JSON.parse(json_str.join("\n"))
127
+
128
+ assert_equal 'slice_123', actual['report_slice_id']
129
+ assert_not_nil(actual_host = actual['hosts'].first)
130
+ assert_equal '10.230.230.1', actual_host['ip_addresses'].first
131
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
132
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
133
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
134
+ assert_equal '10.230.230.1', actual_nic['ipv4_addresses'].first
135
+ assert_equal @host.fqdn, actual_host['fqdn']
136
+ assert_equal '1234', actual_host['account']
137
+ assert_equal 1, generator.hosts_count
138
+ end
139
+
140
+ test 'generates obfuscated ip_address fields with inisghts-client' do
141
+ nic = FactoryBot.build(:nic_primary_and_provision)
142
+ @host.interfaces = [nic]
143
+ @host.save!
144
+
145
+ FactoryBot.create(:fact_value, fact_name: fact_names['insights_client::obfuscate_ip_enabled'], value: 'true', host: @host)
146
+ FactoryBot.create(
147
+ :fact_value,
148
+ fact_name: fact_names['insights_client::ips'],
149
+ value: "[{\"obfuscated\": \"10.230.230.100\", \"original\": \"#{nic.ip}\"}]",
150
+ host: @host
151
+ )
152
+
153
+ batch = Host.where(id: @host.id).in_batches.first
154
+ generator = create_generator(batch)
155
+
156
+ json_str = generator.render
157
+ actual = JSON.parse(json_str.join("\n"))
158
+
159
+ assert_equal 'slice_123', actual['report_slice_id']
160
+ assert_not_nil(actual_host = actual['hosts'].first)
161
+ assert_equal '10.230.230.100', actual_host['ip_addresses'].first
162
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
163
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
164
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
165
+ assert_equal '10.230.230.100', actual_nic['ipv4_addresses'].first
66
166
  assert_equal @host.fqdn, actual_host['fqdn']
67
167
  assert_equal '1234', actual_host['account']
68
168
  assert_equal 1, generator.hosts_count
@@ -96,7 +196,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
96
196
  json_str = generator.render
97
197
  actual = JSON.parse(json_str.join("\n"))
98
198
 
99
- obfuscated_fqdn = Digest::SHA1.hexdigest(@host.fqdn)
199
+ obfuscated_fqdn = Digest::SHA1.hexdigest(@host.fqdn) + '.example.com'
100
200
 
101
201
  assert_equal 'slice_123', actual['report_slice_id']
102
202
  assert_not_nil(actual_host = actual['hosts'].first)
@@ -127,6 +227,10 @@ class ReportGeneratorTest < ActiveSupport::TestCase
127
227
  end
128
228
 
129
229
  test 'generates a report with satellite facts' do
230
+ hostgroup = FactoryBot.create(:hostgroup)
231
+ @host.hostgroup = hostgroup
232
+ @host.save!
233
+
130
234
  Foreman.expects(:instance_id).twice.returns('satellite-id')
131
235
  batch = Host.where(id: @host.id).in_batches.first
132
236
  generator = create_generator(batch)
@@ -140,13 +244,14 @@ class ReportGeneratorTest < ActiveSupport::TestCase
140
244
  assert_equal 'satellite-id', satellite_facts['satellite_instance_id']
141
245
  assert_equal @host.organization_id, satellite_facts['organization_id']
142
246
 
143
- instance_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'satellite_instance_id'}
144
- assert_not_nil instance_id_tag
145
- assert_equal 'satellite-id', instance_id_tag['value']
247
+ actual_host = actual['hosts'].first
248
+ assert_tag('satellite-id', actual_host, 'satellite_instance_id')
249
+ assert_tag(@host.organization_id.to_s, actual_host, 'organization_id')
250
+ assert_tag(@host.content_view.name, actual_host, 'content_view')
251
+ assert_tag(@host.location.name, actual_host, 'location')
252
+ assert_tag(@host.organization.name, actual_host, 'organization')
253
+ assert_tag(@host.hostgroup.name, actual_host, 'hostgroup')
146
254
 
147
- org_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'organization_id'}
148
- assert_not_nil org_id_tag
149
- assert_equal @host.organization_id.to_s, org_id_tag['value']
150
255
  assert_equal false, satellite_facts['is_hostname_obfuscated']
151
256
 
152
257
  version = satellite_facts['satellite_version']
@@ -189,6 +294,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
189
294
  test 'generates a report with system purpose' do
190
295
  @host.subscription_facet.purpose_usage = 'test_usage'
191
296
  @host.subscription_facet.purpose_role = 'test_role'
297
+ @host.subscription_facet.service_level = 'test_sla'
192
298
  @host.subscription_facet.save!
193
299
 
194
300
  batch = Host.where(id: @host.id).in_batches.first
@@ -205,6 +311,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
205
311
  assert_not_nil(fact_values = host_facts['facts'])
206
312
  assert_equal 'test_usage', fact_values['system_purpose_usage']
207
313
  assert_equal 'test_role', fact_values['system_purpose_role']
314
+ assert_equal 'test_sla', fact_values['system_purpose_sla']
208
315
  end
209
316
 
210
317
  test 'generates a report for a golden ticket' do
@@ -243,6 +350,22 @@ class ReportGeneratorTest < ActiveSupport::TestCase
243
350
  assert_equal 1, generator.hosts_count
244
351
  end
245
352
 
353
+ test 'include also hosts with non-redhat OS' do
354
+ os = @host.operatingsystem
355
+ os.name = 'Centos'
356
+ os.save!
357
+
358
+ # make a_host last
359
+ batch = ForemanInventoryUpload::Generators::Queries.for_org(@host.organization_id).first
360
+ generator = create_generator(batch)
361
+
362
+ json_str = generator.render
363
+ actual = JSON.parse(json_str.join("\n"))
364
+
365
+ assert_equal 'slice_123', actual['report_slice_id']
366
+ assert_equal 1, generator.hosts_count
367
+ end
368
+
246
369
  test 'shows system_memory_bytes in bytes' do
247
370
  FactoryBot.create(:fact_value, fact_name: fact_names['memory::memtotal'], value: '1', host: @host)
248
371
 
@@ -262,10 +385,17 @@ class ReportGeneratorTest < ActiveSupport::TestCase
262
385
  first_pool = @host.organization.pools.first
263
386
  second_pool = FactoryBot.create(:katello_pool, account_number: nil, cp_id: 2)
264
387
  new_org = FactoryBot.create(:organization, pools: [first_pool, second_pool])
265
- @host.organization = new_org
266
- @host.save!
267
388
 
268
- batch = Host.where(id: @host.id).in_batches.first
389
+ another_host = FactoryBot.create(
390
+ :host,
391
+ :with_subscription,
392
+ :with_content,
393
+ content_view: @host.content_view,
394
+ lifecycle_environment: @host.lifecycle_environment,
395
+ organization: new_org
396
+ )
397
+
398
+ batch = Host.where(id: another_host.id).in_batches.first
269
399
  generator = create_generator(batch)
270
400
 
271
401
  json_str = generator.render
@@ -399,6 +529,32 @@ class ReportGeneratorTest < ActiveSupport::TestCase
399
529
  assert_equal 'alibaba', actual_profile['cloud_provider']
400
530
  end
401
531
 
532
+ test 'include packages installed in the report' do
533
+ FactoryBot.create(:setting, :name => 'exclude_installed_packages', :value => false)
534
+ installed_package = ::Katello::InstalledPackage.create(name: 'test-package', nvra: 'test-package-1.0.x86_64')
535
+
536
+ another_host = FactoryBot.create(
537
+ :host,
538
+ :with_subscription,
539
+ :with_content,
540
+ content_view: @host.content_view,
541
+ lifecycle_environment: @host.lifecycle_environment,
542
+ organization: @host.organization,
543
+ installed_packages: [installed_package]
544
+ )
545
+
546
+ batch = Host.where(id: another_host.id).in_batches.first
547
+ generator = create_generator(batch)
548
+
549
+ json_str = generator.render
550
+ actual = JSON.parse(json_str.join("\n"))
551
+
552
+ assert_equal 'slice_123', actual['report_slice_id']
553
+ assert_not_nil(actual_host = actual['hosts'].first)
554
+ assert_not_nil(actual_profile = actual_host['system_profile'])
555
+ assert_not_nil(actual_profile['installed_packages'])
556
+ end
557
+
402
558
  private
403
559
 
404
560
  def create_generator(batch, name = 'slice_123')
@@ -410,4 +566,10 @@ class ReportGeneratorTest < ActiveSupport::TestCase
410
566
  end
411
567
  generator
412
568
  end
569
+
570
+ def assert_tag(expected_value, host, tag_id)
571
+ actual_tag = host['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == tag_id }
572
+ assert_not_nil actual_tag
573
+ assert_equal expected_value, actual_tag['value']
574
+ end
413
575
  end
@@ -34,8 +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
 
41
+ export const cloudToken = 'some-cloud-token';
42
+
43
+ export const excludePackages = false;
44
+
39
45
  export const props = {
40
46
  accounts,
41
47
  fetchAccountsStatus: noop,
@@ -44,6 +50,15 @@ export const props = {
44
50
  pollingProcessID,
45
51
  };
46
52
 
53
+ export const pollingResponse = {
54
+ accounts,
55
+ autoUploadEnabled,
56
+ hostObfuscationEnabled,
57
+ ipsObfuscationEnabled,
58
+ cloudToken,
59
+ excludePackages,
60
+ };
61
+
47
62
  export const fetchAccountsStatusResponse = {
48
- data: { accounts, autoUploadEnabled, hostObfuscationEnabled },
63
+ data: pollingResponse,
49
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,16 +11,10 @@ import {
10
11
 
11
12
  export const fetchAccountsStatus = () => async dispatch => {
12
13
  try {
13
- const {
14
- data: { accounts, autoUploadEnabled, hostObfuscationEnabled },
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
- },
17
+ payload: data,
23
18
  });
24
19
  } catch (error) {
25
20
  dispatch({
@@ -45,7 +40,7 @@ export const stopAccountStatusPolling = pollingProcessID => dispatch => {
45
40
  });
46
41
  };
47
42
 
48
- export const restartProcess = (accountID, activeTab) => dispatch => {
43
+ export const restartProcess = (accountID, activeTab) => async dispatch => {
49
44
  let processController = null;
50
45
  let processStatusName = null;
51
46
 
@@ -57,12 +52,22 @@ export const restartProcess = (accountID, activeTab) => dispatch => {
57
52
  processStatusName = 'generate_report_status';
58
53
  }
59
54
 
60
- API.post(inventoryUrl(`${accountID}/${processController}`));
61
- dispatch({
62
- type: INVENTORY_PROCESS_RESTART,
63
- payload: {
64
- accountID,
65
- processStatusName,
66
- },
67
- });
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
+ }
68
73
  };