foreman_rh_cloud 2.0.8 → 2.0.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -2
  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 +1 -1
  18. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  19. data/app/views/hosts/_insights_tab.html.erb +9 -0
  20. data/app/views/layouts/foreman_rh_cloud/application.html.erb +0 -1
  21. data/config/routes.rb +6 -0
  22. data/db/migrate/20200727111529_add_uuid_column_to_insights_facets.foreman_rh_cloud.rb +5 -0
  23. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  24. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  25. data/lib/foreman_inventory_upload.rb +4 -0
  26. data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
  27. data/lib/foreman_inventory_upload/async/shell_process.rb +21 -9
  28. data/lib/foreman_inventory_upload/async/upload_report_job.rb +22 -6
  29. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +36 -1
  30. data/lib/foreman_inventory_upload/generators/json_stream.rb +17 -2
  31. data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
  32. data/lib/foreman_inventory_upload/generators/queries.rb +4 -4
  33. data/lib/foreman_inventory_upload/generators/slice.rb +62 -34
  34. data/lib/foreman_inventory_upload/scripts/uploader.sh.erb +1 -1
  35. data/lib/foreman_rh_cloud.rb +68 -0
  36. data/lib/foreman_rh_cloud/engine.rb +19 -3
  37. data/lib/foreman_rh_cloud/version.rb +1 -1
  38. data/lib/insights_cloud.rb +8 -8
  39. data/lib/insights_cloud/async/insights_full_sync.rb +24 -32
  40. data/lib/insights_cloud/async/insights_scheduled_sync.rb +23 -0
  41. data/lib/inventory_sync/async/host_result.rb +50 -0
  42. data/lib/inventory_sync/async/inventory_full_sync.rb +80 -0
  43. data/lib/tasks/insights.rake +15 -0
  44. data/lib/tasks/rh_cloud_inventory.rake +37 -0
  45. data/package.json +3 -1
  46. data/test/controllers/insights_sync/settings_controller_test.rb +30 -0
  47. data/test/factories/insights_factories.rb +31 -0
  48. data/test/jobs/insights_full_sync_test.rb +33 -1
  49. data/test/jobs/inventory_full_sync_test.rb +91 -0
  50. data/test/jobs/upload_report_job_test.rb +34 -0
  51. data/test/unit/fact_helpers_test.rb +22 -0
  52. data/test/unit/insights_facet_test.rb +23 -0
  53. data/test/unit/metadata_generator_test.rb +2 -0
  54. data/test/unit/rh_cloud_http_proxy_test.rb +65 -0
  55. data/test/unit/slice_generator_test.rb +172 -11
  56. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +16 -1
  57. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -17
  58. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +18 -0
  59. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +8 -0
  60. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  61. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -6
  62. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  63. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +20 -0
  64. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +12 -0
  65. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  66. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  67. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  68. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  69. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  70. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  71. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  72. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  73. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  74. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  75. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  76. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  77. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  78. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  79. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  80. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +36 -0
  81. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  82. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  83. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/FullScreenModal.js +5 -1
  84. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/__tests__/__snapshots__/FullScreenModal.test.js.snap +1 -0
  85. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/fullScreenModal.scss +15 -13
  86. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  87. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  88. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  89. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  90. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  91. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  92. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  93. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilterReducer.js +13 -2
  94. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/InventoryFilterReducer.test.js +10 -1
  95. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/InventoryFilterReducer.test.js.snap +6 -0
  96. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +9 -0
  97. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  98. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  99. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  100. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  101. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  102. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  103. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  104. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  105. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  106. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  107. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  108. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +1 -1
  109. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +3 -3
  110. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/DocsButton.js +1 -0
  111. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/__tests__/__snapshots__/DocsButton.test.js.snap +1 -0
  112. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/HistoryButton.js +1 -0
  113. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/__tests__/__snapshots__/HistoryButton.test.js.snap +1 -0
  114. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/PageDescription.js +2 -2
  115. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/__tests__/__snapshots__/PageDescription.test.js.snap +2 -2
  116. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +58 -0
  117. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +57 -0
  118. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +3 -0
  119. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +36 -0
  120. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonSelectors.js +13 -0
  121. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButton.test.js +13 -0
  122. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +31 -0
  123. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonFixtures.js +9 -0
  124. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +26 -0
  125. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonSelectors.test.js +36 -0
  126. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButton.test.js.snap +26 -0
  127. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +98 -0
  128. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +18 -0
  129. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonSelectors.test.js.snap +18 -0
  130. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +63 -0
  131. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +41 -0
  132. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/modal.scss +20 -0
  133. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/index.js +22 -0
  134. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/ToolbarButtons.js +2 -0
  135. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/__tests__/__snapshots__/ToolbarButtons.test.js.snap +1 -0
  136. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/toolbarButtons.scss +6 -1
  137. data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
  138. data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
  139. data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
  140. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  141. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  142. data/webpack/ForemanInventoryUpload/ForemanInventoryConstants.js +3 -1
  143. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  144. data/webpack/ForemanInventoryUpload/ForemanInventoryUploadReducers.js +2 -0
  145. data/webpack/ForemanRhCloudPages.js +9 -0
  146. data/webpack/ForemanRhCloudReducers.js +2 -0
  147. data/webpack/ForemanRhCloudSelectors.js +5 -0
  148. data/webpack/ForemanRhCloudTestHelpers.js +17 -3
  149. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettings.js +33 -0
  150. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +57 -0
  151. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +4 -0
  152. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +24 -0
  153. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsSelectors.js +6 -0
  154. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettings.test.js +18 -0
  155. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +62 -0
  156. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +33 -0
  157. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsSelectors.test.js +21 -0
  158. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettings.test.js.snap +15 -0
  159. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +65 -0
  160. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +19 -0
  161. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsSelectors.test.js.snap +9 -0
  162. data/webpack/InsightsCloudSync/Components/InsightsSettings/index.js +21 -0
  163. data/webpack/InsightsCloudSync/Components/InsightsSettings/insightsSettings.scss +16 -0
  164. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.fixtures.js +1 -0
  165. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.js +45 -0
  166. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/InsightsSyncSwitcher.test.js +17 -0
  167. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/__snapshots__/InsightsSyncSwitcher.test.js.snap +38 -0
  168. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/index.js +1 -0
  169. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/insightsSyncSwitcher.scss +3 -0
  170. data/webpack/InsightsCloudSync/InsightsCloudSync.js +36 -5
  171. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +1 -0
  172. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  173. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  174. data/webpack/InsightsCloudSync/InsightsCloudSyncReducers.js +7 -2
  175. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +51 -9
  176. data/webpack/InsightsCloudSync/index.js +2 -1
  177. data/webpack/InsightsHostDetailsTab/InsightsTab.js +66 -0
  178. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
  179. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +31 -0
  180. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +2 -0
  181. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +19 -0
  182. data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
  183. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
  184. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
  185. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +19 -0
  186. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
  187. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +26 -0
  188. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
  189. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +34 -0
  190. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +58 -0
  191. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +34 -0
  192. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
  193. data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
  194. data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
  195. data/webpack/InsightsHostDetailsTab/index.js +20 -0
  196. data/webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js +1 -0
  197. data/webpack/__mocks__/foremanReact/constants.js +5 -0
  198. data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
  199. data/webpack/__tests__/ForemanRhCloudSelectors.test.js +4 -1
  200. data/webpack/__tests__/ForemanRhCloudTestHelpers.test.js +12 -2
  201. data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +10 -9
  202. data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +27 -2
  203. data/webpack/index.js +2 -12
  204. metadata +120 -12
  205. data/lib/tasks/generator.rake +0 -29
  206. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
@@ -0,0 +1,91 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class InventoryFullSyncTest < ActiveJob::TestCase
4
+ setup do
5
+ @host1 = FactoryBot.create(:host, :managed, name: 'host1')
6
+
7
+ User.current = User.find_by(login: 'secret_admin')
8
+
9
+ env = FactoryBot.create(:katello_k_t_environment)
10
+ cv = env.content_views << FactoryBot.create(:katello_content_view, organization: env.organization)
11
+
12
+ # this host would pass our plugin queries, so it could be uploaded to the cloud.
13
+ @host2 = FactoryBot.create(
14
+ :host,
15
+ :with_subscription,
16
+ :with_content,
17
+ content_view: cv.first,
18
+ lifecycle_environment: env,
19
+ organization: env.organization
20
+ )
21
+
22
+ @host2.subscription_facet.pools << FactoryBot.create(:katello_pool, account_number: '1234', cp_id: 1)
23
+
24
+ ForemanInventoryUpload::Generators::Queries.instance_variable_set(:@fact_names, nil)
25
+
26
+ inventory_json = <<-INVENTORY_JSON
27
+ {
28
+ "total": 3,
29
+ "count": 3,
30
+ "page": 1,
31
+ "per_page": 50,
32
+ "results": [{"fqdn": "#{@host1.fqdn}"}]
33
+ }
34
+ INVENTORY_JSON
35
+ @inventory = JSON.parse(inventory_json)
36
+ end
37
+
38
+ def interesting_facts
39
+ [
40
+ 'dmi::system::uuid',
41
+ 'virt::uuid',
42
+ 'cpu::cpu(s)',
43
+ 'cpu::cpu_socket(s)',
44
+ 'cpu::core(s)_per_socket',
45
+ 'memory::memtotal',
46
+ 'dmi::bios::vendor',
47
+ 'dmi::bios::version',
48
+ 'dmi::bios::relase_date',
49
+ 'uname::release',
50
+ 'lscpu::flags',
51
+ 'distribution::name',
52
+ 'distribution::version',
53
+ 'distribution::id',
54
+ 'virt::is_guest',
55
+ 'dmi::system::manufacturer',
56
+ 'dmi::system::product_name',
57
+ 'dmi::chassis::asset_tag',
58
+ 'insights_client::obfuscate_hostname_enabled',
59
+ 'insights_client::hostname',
60
+ ]
61
+ end
62
+
63
+ def fact_names
64
+ @fact_names ||= Hash[
65
+ interesting_facts.map do |fact|
66
+ [fact, FactoryBot.create(:fact_name, name: fact, type: 'Katello::RhsmFactName')]
67
+ end
68
+ ]
69
+ end
70
+
71
+ test 'Host status should be SYNC for inventory hosts' do
72
+ InventorySync::Async::InventoryFullSync.any_instance.expects(:query_inventory).returns(@inventory)
73
+
74
+ InventorySync::Async::InventoryFullSync.perform_now(@host1.organization)
75
+
76
+ @host1.reload
77
+
78
+ assert_equal InventorySync::InventoryStatus::SYNC, InventorySync::InventoryStatus.where(host_id: @host1.id).first.status
79
+ end
80
+
81
+ test 'Host status should be DISCONNECT for hosts that are not returned from cloud' do
82
+ InventorySync::Async::InventoryFullSync.any_instance.expects(:query_inventory).returns(@inventory)
83
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::uuid'], value: '1234', host: @host2)
84
+
85
+ InventorySync::Async::InventoryFullSync.perform_now(@host2.organization)
86
+
87
+ @host2.reload
88
+
89
+ assert_equal InventorySync::InventoryStatus::DISCONNECT, InventorySync::InventoryStatus.where(host_id: @host2.id).first.status
90
+ end
91
+ end
@@ -0,0 +1,34 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class UploadReportJobTest < ActiveJob::TestCase
4
+ include FolderIsolation
5
+
6
+ test 'returns aborted state when disconnected' do
7
+ organization = FactoryBot.create(:organization)
8
+ Organization.any_instance.stubs(:owner_details).returns(
9
+ 'upstreamConsumer' => {
10
+ 'idCert' => 'TEST_CERT',
11
+ }
12
+ )
13
+ FactoryBot.create(:setting, :name => 'content_disconnected', :value => true)
14
+
15
+ ForemanInventoryUpload::Async::UploadReportJob.perform_now('', organization.id)
16
+
17
+ label = ForemanInventoryUpload::Async::UploadReportJob.output_label(organization.id)
18
+ progress_output = ForemanInventoryUpload::Async::ProgressOutput.get(label)
19
+ assert_match(/Upload was stopped/, progress_output.full_output)
20
+ assert_match(/exit 1/, progress_output.status)
21
+ end
22
+
23
+ test 'returns aborted state when no certificate defined on organization' do
24
+ organization = FactoryBot.create(:organization)
25
+ Organization.any_instance.expects(:owner_details).returns(nil)
26
+
27
+ ForemanInventoryUpload::Async::UploadReportJob.perform_now('', organization.id)
28
+
29
+ label = ForemanInventoryUpload::Async::UploadReportJob.output_label(organization.id)
30
+ progress_output = ForemanInventoryUpload::Async::ProgressOutput.get(label)
31
+ assert_match(/Skipping organization/, progress_output.full_output)
32
+ assert_match(/exit 1/, progress_output.status)
33
+ end
34
+ end
@@ -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,65 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class RhCloudHttpProxyTest < ActiveSupport::TestCase
4
+ setup do
5
+ @global_content_proxy_mock = 'http://global:content@localhost:8888'
6
+ @global_foreman_proxy_mock = 'http://global:foreman@localhost:8888'
7
+ @katello_cdn_proxy_mock = {
8
+ host: 'localhost',
9
+ port: '8888',
10
+ user: 'katello',
11
+ password: 'cdn',
12
+ scheme: 'http',
13
+ }
14
+ @katello_cdn_proxy_string_mock = 'http://katello:cdn@localhost:8888'
15
+ end
16
+
17
+ test 'selects global content proxy' do
18
+ setup_global_content_proxy
19
+ setup_global_foreman_proxy
20
+ setup_cdn_proxy do
21
+ assert_equal @global_content_proxy_mock, ForemanRhCloud.proxy_setting
22
+ end
23
+ end
24
+
25
+ test 'selects cdn proxy' do
26
+ setup_global_foreman_proxy
27
+ setup_cdn_proxy do
28
+ assert_equal @katello_cdn_proxy_string_mock, ForemanRhCloud.proxy_setting
29
+ end
30
+ end
31
+
32
+ test 'selects global foreman proxy' do
33
+ setup_global_foreman_proxy
34
+
35
+ assert_equal @global_foreman_proxy_mock, ForemanRhCloud.proxy_setting
36
+ end
37
+
38
+ def setup_global_content_proxy
39
+ http_proxy = FactoryBot.create(:http_proxy, url: @global_content_proxy_mock)
40
+ HttpProxy.stubs(:default_global_content_proxy).returns(http_proxy)
41
+ end
42
+
43
+ def setup_global_foreman_proxy
44
+ FactoryBot.create(:setting, :name => 'http_proxy', :value => @global_foreman_proxy_mock)
45
+ end
46
+
47
+ def setup_cdn_proxy
48
+ old_cdn_setting = SETTINGS[:katello][:cdn_proxy]
49
+ SETTINGS[:katello][:cdn_proxy] = @katello_cdn_proxy_mock
50
+ yield
51
+ ensure
52
+ SETTINGS[:katello][:cdn_proxy] = old_cdn_setting
53
+ end
54
+
55
+ test 'transform proxy scheme test' do
56
+ mock_http_proxy = 'http://user:password@localhost:8888'
57
+ mock_https_proxy = 'https://user:password@localhost:8888'
58
+
59
+ transformed_http_uri = URI.parse(ForemanRhCloud.transform_scheme(mock_http_proxy))
60
+ transformed_https_uri = URI.parse(ForemanRhCloud.transform_scheme(mock_https_proxy))
61
+
62
+ assert_equal 'proxy', transformed_http_uri.scheme
63
+ assert_equal 'proxys', transformed_https_uri.scheme
64
+ end
65
+ 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,102 @@ 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_managed)
142
+ @host.interfaces << nic
143
+
144
+ FactoryBot.create(:fact_value, fact_name: fact_names['insights_client::obfuscate_ip_enabled'], value: 'true', host: @host)
145
+ FactoryBot.create(
146
+ :fact_value,
147
+ fact_name: fact_names['insights_client::ips'],
148
+ value: "[{\"obfuscated\": \"10.230.230.100\", \"original\": \"#{nic.ip}\"}]",
149
+ host: @host
150
+ )
151
+
152
+ batch = Host.where(id: @host.id).in_batches.first
153
+ generator = create_generator(batch)
154
+
155
+ json_str = generator.render
156
+ actual = JSON.parse(json_str.join("\n"))
157
+
158
+ assert_equal 'slice_123', actual['report_slice_id']
159
+ assert_not_nil(actual_host = actual['hosts'].first)
160
+ assert_equal '10.230.230.100', actual_host['ip_addresses'].first
161
+ assert_not_nil(actual_system_profile = actual_host['system_profile'])
162
+ assert_not_nil(actual_network_interfaces = actual_system_profile['network_interfaces'])
163
+ assert_not_nil(actual_nic = actual_network_interfaces.first)
164
+ assert_equal '10.230.230.100', actual_nic['ipv4_addresses'].first
66
165
  assert_equal @host.fqdn, actual_host['fqdn']
67
166
  assert_equal '1234', actual_host['account']
68
167
  assert_equal 1, generator.hosts_count
@@ -96,7 +195,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
96
195
  json_str = generator.render
97
196
  actual = JSON.parse(json_str.join("\n"))
98
197
 
99
- obfuscated_fqdn = Digest::SHA1.hexdigest(@host.fqdn)
198
+ obfuscated_fqdn = Digest::SHA1.hexdigest(@host.fqdn) + '.example.com'
100
199
 
101
200
  assert_equal 'slice_123', actual['report_slice_id']
102
201
  assert_not_nil(actual_host = actual['hosts'].first)
@@ -127,6 +226,10 @@ class ReportGeneratorTest < ActiveSupport::TestCase
127
226
  end
128
227
 
129
228
  test 'generates a report with satellite facts' do
229
+ hostgroup = FactoryBot.create(:hostgroup)
230
+ @host.hostgroup = hostgroup
231
+ @host.save!
232
+
130
233
  Foreman.expects(:instance_id).twice.returns('satellite-id')
131
234
  batch = Host.where(id: @host.id).in_batches.first
132
235
  generator = create_generator(batch)
@@ -140,13 +243,14 @@ class ReportGeneratorTest < ActiveSupport::TestCase
140
243
  assert_equal 'satellite-id', satellite_facts['satellite_instance_id']
141
244
  assert_equal @host.organization_id, satellite_facts['organization_id']
142
245
 
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']
246
+ actual_host = actual['hosts'].first
247
+ assert_tag('satellite-id', actual_host, 'satellite_instance_id')
248
+ assert_tag(@host.organization_id.to_s, actual_host, 'organization_id')
249
+ assert_tag(@host.content_view.name, actual_host, 'content_view')
250
+ assert_tag(@host.location.name, actual_host, 'location')
251
+ assert_tag(@host.organization.name, actual_host, 'organization')
252
+ assert_tag(@host.hostgroup.name, actual_host, 'hostgroup')
146
253
 
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
254
  assert_equal false, satellite_facts['is_hostname_obfuscated']
151
255
 
152
256
  version = satellite_facts['satellite_version']
@@ -189,6 +293,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
189
293
  test 'generates a report with system purpose' do
190
294
  @host.subscription_facet.purpose_usage = 'test_usage'
191
295
  @host.subscription_facet.purpose_role = 'test_role'
296
+ @host.subscription_facet.service_level = 'test_sla'
192
297
  @host.subscription_facet.save!
193
298
 
194
299
  batch = Host.where(id: @host.id).in_batches.first
@@ -205,6 +310,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
205
310
  assert_not_nil(fact_values = host_facts['facts'])
206
311
  assert_equal 'test_usage', fact_values['system_purpose_usage']
207
312
  assert_equal 'test_role', fact_values['system_purpose_role']
313
+ assert_equal 'test_sla', fact_values['system_purpose_sla']
208
314
  end
209
315
 
210
316
  test 'generates a report for a golden ticket' do
@@ -243,6 +349,22 @@ class ReportGeneratorTest < ActiveSupport::TestCase
243
349
  assert_equal 1, generator.hosts_count
244
350
  end
245
351
 
352
+ test 'include also hosts with non-redhat OS' do
353
+ os = @host.operatingsystem
354
+ os.name = 'Centos'
355
+ os.save!
356
+
357
+ # make a_host last
358
+ batch = ForemanInventoryUpload::Generators::Queries.for_org(@host.organization_id).first
359
+ generator = create_generator(batch)
360
+
361
+ json_str = generator.render
362
+ actual = JSON.parse(json_str.join("\n"))
363
+
364
+ assert_equal 'slice_123', actual['report_slice_id']
365
+ assert_equal 1, generator.hosts_count
366
+ end
367
+
246
368
  test 'shows system_memory_bytes in bytes' do
247
369
  FactoryBot.create(:fact_value, fact_name: fact_names['memory::memtotal'], value: '1', host: @host)
248
370
 
@@ -262,10 +384,17 @@ class ReportGeneratorTest < ActiveSupport::TestCase
262
384
  first_pool = @host.organization.pools.first
263
385
  second_pool = FactoryBot.create(:katello_pool, account_number: nil, cp_id: 2)
264
386
  new_org = FactoryBot.create(:organization, pools: [first_pool, second_pool])
265
- @host.organization = new_org
266
- @host.save!
267
387
 
268
- batch = Host.where(id: @host.id).in_batches.first
388
+ another_host = FactoryBot.create(
389
+ :host,
390
+ :with_subscription,
391
+ :with_content,
392
+ content_view: @host.content_view,
393
+ lifecycle_environment: @host.lifecycle_environment,
394
+ organization: new_org
395
+ )
396
+
397
+ batch = Host.where(id: another_host.id).in_batches.first
269
398
  generator = create_generator(batch)
270
399
 
271
400
  json_str = generator.render
@@ -399,6 +528,32 @@ class ReportGeneratorTest < ActiveSupport::TestCase
399
528
  assert_equal 'alibaba', actual_profile['cloud_provider']
400
529
  end
401
530
 
531
+ test 'include packages installed in the report' do
532
+ FactoryBot.create(:setting, :name => 'exclude_installed_packages', :value => false)
533
+ installed_package = ::Katello::InstalledPackage.create(name: 'test-package', nvrea: 'test-package-1.0.x86_64', nvra: 'test-package-1.0.x86_64')
534
+
535
+ another_host = FactoryBot.create(
536
+ :host,
537
+ :with_subscription,
538
+ :with_content,
539
+ content_view: @host.content_view,
540
+ lifecycle_environment: @host.lifecycle_environment,
541
+ organization: @host.organization,
542
+ installed_packages: [installed_package]
543
+ )
544
+
545
+ batch = Host.where(id: another_host.id).in_batches.first
546
+ generator = create_generator(batch)
547
+
548
+ json_str = generator.render
549
+ actual = JSON.parse(json_str.join("\n"))
550
+
551
+ assert_equal 'slice_123', actual['report_slice_id']
552
+ assert_not_nil(actual_host = actual['hosts'].first)
553
+ assert_not_nil(actual_profile = actual_host['system_profile'])
554
+ assert_not_nil(actual_profile['installed_packages'])
555
+ end
556
+
402
557
  private
403
558
 
404
559
  def create_generator(batch, name = 'slice_123')
@@ -410,4 +565,10 @@ class ReportGeneratorTest < ActiveSupport::TestCase
410
565
  end
411
566
  generator
412
567
  end
568
+
569
+ def assert_tag(expected_value, host, tag_id)
570
+ actual_tag = host['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == tag_id }
571
+ assert_not_nil actual_tag
572
+ assert_equal expected_value, actual_tag['value']
573
+ end
413
574
  end