foreman_rh_cloud 2.0.10 → 2.0.14

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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -2
  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/controllers/insights_cloud/hits_controller.rb +17 -0
  6. data/app/helpers/foreman_inventory_upload_host_helper.rb +2 -3
  7. data/app/models/concerns/rh_cloud_host.rb +15 -0
  8. data/app/models/insights_hit.rb +1 -1
  9. data/app/models/setting/rh_cloud.rb +2 -0
  10. data/app/overrides/hosts_list.rb +1 -1
  11. data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
  12. data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +1 -6
  13. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  14. data/app/views/hosts/_insights_tab.html.erb +9 -0
  15. data/app/views/layouts/foreman_rh_cloud/application.html.erb +0 -1
  16. data/config/routes.rb +3 -0
  17. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  18. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  19. data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
  20. data/lib/foreman_inventory_upload/async/shell_process.rb +15 -9
  21. data/lib/foreman_inventory_upload/async/upload_report_job.rb +21 -33
  22. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +35 -0
  23. data/lib/foreman_inventory_upload/generators/json_stream.rb +7 -2
  24. data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
  25. data/lib/foreman_inventory_upload/generators/queries.rb +4 -4
  26. data/lib/foreman_inventory_upload/generators/slice.rb +27 -25
  27. data/lib/foreman_rh_cloud.rb +55 -0
  28. data/lib/foreman_rh_cloud/engine.rb +13 -2
  29. data/lib/foreman_rh_cloud/version.rb +1 -1
  30. data/lib/insights_cloud/async/insights_full_sync.rb +5 -24
  31. data/lib/inventory_sync/async/inventory_full_sync.rb +3 -22
  32. data/lib/tasks/insights.rake +15 -0
  33. data/lib/tasks/rh_cloud_inventory.rake +37 -0
  34. data/package.json +3 -1
  35. data/test/jobs/upload_report_job_test.rb +34 -0
  36. data/test/unit/fact_helpers_test.rb +22 -0
  37. data/test/unit/insights_facet_test.rb +7 -0
  38. data/test/unit/metadata_generator_test.rb +2 -0
  39. data/test/unit/rh_cloud_http_proxy_test.rb +65 -0
  40. data/test/unit/slice_generator_test.rb +164 -2
  41. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +14 -1
  42. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -18
  43. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +16 -0
  44. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +6 -0
  45. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  46. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -8
  47. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  48. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +19 -0
  49. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +11 -0
  50. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  51. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  52. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  53. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  54. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  55. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  56. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  57. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  58. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  59. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  60. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  61. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  62. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  63. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  64. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  65. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +36 -0
  66. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  67. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  68. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  69. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  70. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  71. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  72. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  73. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  74. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  75. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilterReducer.js +13 -2
  76. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/InventoryFilterReducer.test.js +10 -1
  77. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/InventoryFilterReducer.test.js.snap +6 -0
  78. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +3 -0
  79. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  80. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  81. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  82. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  83. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  84. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  85. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  86. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  87. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  88. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  89. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  90. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +8 -2
  91. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +9 -11
  92. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +1 -1
  93. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +2 -2
  94. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +18 -0
  95. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +1 -8
  96. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +62 -0
  97. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +0 -7
  98. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +2 -2
  99. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +1 -1
  100. data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
  101. data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
  102. data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
  103. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  104. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  105. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  106. data/webpack/ForemanRhCloudPages.js +2 -0
  107. data/webpack/ForemanRhCloudReducers.js +2 -0
  108. data/webpack/ForemanRhCloudSelectors.js +5 -0
  109. data/webpack/ForemanRhCloudTestHelpers.js +6 -1
  110. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +17 -20
  111. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +0 -6
  112. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +0 -4
  113. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +16 -0
  114. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +1 -24
  115. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +38 -4
  116. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +0 -14
  117. data/webpack/InsightsCloudSync/InsightsCloudSync.js +3 -5
  118. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +1 -3
  119. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  120. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  121. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +1 -1
  122. data/webpack/InsightsHostDetailsTab/InsightsTab.js +66 -0
  123. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
  124. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +31 -0
  125. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +2 -0
  126. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +19 -0
  127. data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
  128. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
  129. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
  130. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +19 -0
  131. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
  132. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +26 -0
  133. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
  134. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +34 -0
  135. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +58 -0
  136. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +34 -0
  137. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
  138. data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
  139. data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
  140. data/webpack/InsightsHostDetailsTab/index.js +20 -0
  141. data/webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js +1 -0
  142. data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +1 -0
  143. data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +3 -0
  144. metadata +67 -16
  145. data/lib/tasks/generator.rake +0 -29
  146. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a340f8085bfc6d4d08048369230ab9b90a392cc460b86d53c30bbe8a90ed3c86
4
- data.tar.gz: dd76bc695e8d183ac9b9afd05e84ca8650730584919243f9b99d10da522dd707
3
+ metadata.gz: 778b0d71a8930862a9ea89c96b28024ef830b62bfe09c393da68200884bf1581
4
+ data.tar.gz: '01600923d9766697d70c1739a1e8a2257357804c01200b5571f8b63464401f8e'
5
5
  SHA512:
6
- metadata.gz: dbd457318e1c1b23db3e5d2e9a71974f30f6d089fa7df5af02d4b6fbce6487c8b3cedd0749da05d76b32aa5af22a2a1cc99ffaef3d141c77a1edffd838d8bc70
7
- data.tar.gz: 7269c01c4e2599456f4d340425ad60b56a9f65749642d0e5cbda9c2217fd792b8cf1d61808a787c36a644d0f785e7c623a22d47b58af83e693530acbb77824fd
6
+ metadata.gz: e48907c9626cbf815b00bc257a45801f5a55d0f5f6e797cf7d11fadd549e822580d420e60004efa8e92aabb75c1c3b799ecda447c06fa53a6cc7a36a72160747
7
+ data.tar.gz: 853e77b02847333267442716d2c4909cd9738cd1dbdcfa7a063b0a09859b90832f73f75cd2db78565ffaffba000aa0fdd8ea6924ad98d74f554a998f17cd5964
data/README.md CHANGED
@@ -13,11 +13,36 @@ for how to install Foreman plugins
13
13
 
14
14
  ### In Satellite
15
15
 
16
- Normally you run it via UI in RH Cloud -> Inventory Upload -> Restart, but if you need to run from command-line for some reason:
16
+ #### Inventory upload
17
+
18
+ In UI: Configure -> Inventory Upload -> Restart
19
+
20
+ From command-line:
17
21
 
18
22
  export organization_id=1
19
23
  export target=/var/lib/foreman/red_hat_inventory/generated_reports/
20
- /usr/sbin/foreman-rake foreman_inventory_upload:report:generate
24
+ /usr/sbin/foreman-rake rh_cloud_inventory:report:generate
25
+
26
+ #### Fetch hosts remediation data
27
+
28
+ In UI: Configure -> Insights -> Sync now
29
+
30
+ From command-line:
31
+
32
+ /usr/sbin/foreman-rake rh_cloud_inventory:sync
33
+
34
+ #### Synchronize inventory status
35
+
36
+ In UI: Configure -> Inventory Upload -> Sync inventory status
37
+
38
+ From command-line:
39
+
40
+ # all organizations
41
+ /usr/sbin/foreman-rake rh_cloud_insights:sync
42
+
43
+ # specific organization with id 1
44
+ export organization_id=1
45
+ /usr/sbin/foreman-rake rh_cloud_insights:sync
21
46
 
22
47
  ## TODO
23
48
 
@@ -23,7 +23,9 @@ module ForemanInventoryUpload
23
23
  render json: {
24
24
  autoUploadEnabled: Setting[:allow_auto_inventory_upload],
25
25
  hostObfuscationEnabled: Setting[:obfuscate_inventory_hostnames],
26
+ ipsObfuscationEnabled: Setting[:obfuscate_inventory_ips],
26
27
  cloudToken: Setting[:rh_cloud_token],
28
+ excludePackages: Setting[:exclude_installed_packages],
27
29
  accounts: accounts,
28
30
  }, status: :ok
29
31
  end
@@ -46,6 +46,24 @@ module ForemanInventoryUpload
46
46
  ActiveModel::Type::Boolean.new.cast(params.require(:value))
47
47
  end
48
48
 
49
+ def installed_packages_inclusion
50
+ Setting[:exclude_installed_packages] = host_obfuscation_params
51
+ render_setting(:excludePackages, :exclude_installed_packages)
52
+ end
53
+
54
+ def installed_packages_inclusion_params
55
+ ActiveModel::Type::Boolean.new.cast(params.require(:value))
56
+ end
57
+
58
+ def ips_obfuscation
59
+ Setting[:obfuscate_inventory_ips] = ips_obfuscation_params
60
+ render_setting(:ipsObfuscationEnabled, :obfuscate_inventory_ips)
61
+ end
62
+
63
+ def ips_obfuscation_params
64
+ ActiveModel::Type::Boolean.new.cast(params.require(:value))
65
+ end
66
+
49
67
  private
50
68
 
51
69
  def render_setting(node_name, setting)
@@ -0,0 +1,17 @@
1
+ module InsightsCloud
2
+ class HitsController < ::ApplicationController
3
+ def index
4
+ host = Host.where(id: host_id_param).first
5
+
6
+ render json: {
7
+ hits: host.insights.hits,
8
+ }, status: :ok
9
+ end
10
+
11
+ private
12
+
13
+ def host_id_param
14
+ params.require(:host_id)
15
+ end
16
+ end
17
+ end
@@ -5,11 +5,10 @@ module ForemanInventoryUploadHostHelper
5
5
 
6
6
  def hits_counts_cell(host)
7
7
  host_hits = hits_counts[host.id]
8
- content = n_('One recommendation', '%{hits} recommendations', host_hits) % { hits: host_hits } if host_hits
9
- tag.td class: ['hidden-xs', 'ellipsis'] do
8
+ tag.td class: ['hidden-xs', 'ellipsis', 'text-center'] do
10
9
  if host_hits
11
10
  link_to(
12
- content,
11
+ host_hits,
13
12
  InsightsCloud::WebUi.system_url(InsightsCloud::WebUi::ADVISOR, host.insights.uuid),
14
13
  :rel => 'external noopener noreferrer',
15
14
  :target => '_blank'
@@ -0,0 +1,15 @@
1
+ module RhCloudHost
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ has_many(
6
+ :inventory_upload_facts,
7
+ -> { where(fact_name_id: ForemanInventoryUpload::Generators::Queries.fact_names.values) },
8
+ class_name: 'FactValue',
9
+ foreign_key: :host_id
10
+ )
11
+
12
+ has_many :insights_hits, through: :insights, source: :hits
13
+ scoped_search :relation => :insights, :on => :hits_count, :only_explicit => true, :rename => :insights_recommendations_count
14
+ end
15
+ end
@@ -2,5 +2,5 @@ class InsightsHit < ApplicationRecord
2
2
  has_one :host
3
3
  # since the facet is one-to-one association with a host, we can connect
4
4
  # through host_id column on both this model and facet.
5
- has_one :insights_facet, foreign_key: 'host_id', primary_key: 'host_id'
5
+ belongs_to :insights_facet, foreign_key: 'host_id', primary_key: 'host_id', counter_cache: :hits_count
6
6
  end
@@ -6,7 +6,9 @@ class Setting::RhCloud < Setting
6
6
  set('allow_auto_inventory_upload', N_('Allow automatic upload of the host inventory to the Red Hat cloud'), false),
7
7
  set('allow_auto_insights_sync', N_('Allow recommendations synchronization from Red Hat cloud'), false),
8
8
  set('obfuscate_inventory_hostnames', N_('Obfuscate host names sent to Red Hat cloud'), false),
9
+ set('obfuscate_inventory_ips', N_('Obfuscate ip addresses sent to Red Hat cloud'), false),
9
10
  set('rh_cloud_token', N_('Authentication token to Red Hat cloud services. Used to authenticate requests to cloud APIs'), 'DEFAULT', N_('Red Hat Cloud token'), nil, encrypted: true),
11
+ set('exclude_installed_packages', N_('Exclude installed packages from Red Hat cloud inventory report'), false),
10
12
  ]
11
13
  end
12
14
 
@@ -2,7 +2,7 @@ Deface::Override.new(
2
2
  virtual_path: 'hosts/_list',
3
3
  name: 'insights_hits_header',
4
4
  insert_before: 'thead tr th.hidden-xs:first-of-type',
5
- text: '<th class="hidden-xs" width="10%"><%= _("Insights")%></th>'
5
+ text: '<th class="hidden-xs ellipsis" width="12%"><%= sort :insights_recommendations_count, :as => _("Recommendations")%></th>'
6
6
  )
7
7
 
8
8
  Deface::Override.new(
@@ -0,0 +1,28 @@
1
+ module ForemanRhCloud
2
+ module CloudAuth
3
+ extend ActiveSupport::Concern
4
+
5
+ def rh_credentials
6
+ @rh_credentials ||= query_refresh_token
7
+ end
8
+
9
+ def query_refresh_token
10
+ token_response = RestClient::Request.execute(
11
+ method: :post,
12
+ url: ForemanRhCloud.authentication_url,
13
+ verify_ssl: ForemanRhCloud.verify_ssl_method,
14
+ proxy: ForemanRhCloud.transformed_http_proxy_string(logger: logger),
15
+ payload: {
16
+ grant_type: 'refresh_token',
17
+ client_id: 'rhsm-api',
18
+ refresh_token: Setting[:rh_cloud_token],
19
+ }
20
+ )
21
+
22
+ JSON.parse(token_response)['access_token']
23
+ rescue RestClient::ExceptionWithResponse => e
24
+ Foreman::Logging.exception('Unable to authenticate using rh_cloud_token setting', e)
25
+ raise ::Foreman::WrappedException.new(e, N_('Unable to authenticate using rh_cloud_token setting'))
26
+ end
27
+ end
28
+ end
@@ -1,6 +1 @@
1
- <%= mount_react_component(
2
- 'InsightsCloudSync',
3
- '#ForemanRhCloudReactRoot',
4
- {
5
- settingsUrl: settings_url(search: 'name = rh_cloud_token')
6
- }.to_json) %>
1
+ <%= react_component('InsightsCloudSync', { settingsUrl: settings_url(search: 'name = rh_cloud_token') }) %>
@@ -1 +1 @@
1
- <%= mount_react_component('ForemanInventoryUpload', '#ForemanRhCloudReactRoot') %>
1
+ <%= react_component('ForemanInventoryUpload') %>
@@ -0,0 +1,9 @@
1
+ <% content_for(:javascripts) do %>
2
+ <%= webpacked_plugins_js_for :'foreman_rh_cloud' %>
3
+ <% end %>
4
+
5
+ <% content_for(:stylesheets) do %>
6
+ <%= webpacked_plugins_css_for :'foreman_rh_cloud' %>
7
+ <% end %>
8
+
9
+ <%= react_component('InsightsHostDetailsTab', { hostID: host.id }) %>
@@ -10,7 +10,6 @@
10
10
  <%= notifications %>
11
11
  <div id="organization-id" data-id="<%= Organization.current.id if Organization.current %>" ></div>
12
12
  <div id="user-id" data-id="<%= User.current.id if User.current %>" ></div>
13
- <div id="ForemanRhCloudReactRoot"></div>
14
13
  <%= yield %>
15
14
  <% end %>
16
15
  <%= render file: "layouts/base" %>
@@ -8,6 +8,8 @@ Rails.application.routes.draw do
8
8
  get 'auto_upload', to: 'uploads#show_auto_upload'
9
9
  post 'auto_upload', to: 'uploads#auto_upload'
10
10
  post 'host_obfuscation', to: 'uploads#host_obfuscation'
11
+ post 'installed_packages_inclusion', to: 'uploads#installed_packages_inclusion'
12
+ post 'ips_obfuscation', to: 'uploads#ips_obfuscation'
11
13
 
12
14
  resources :tasks, only: [:create]
13
15
  end
@@ -15,6 +17,7 @@ Rails.application.routes.draw do
15
17
  namespace :insights_cloud do
16
18
  resources :tasks, only: [:create]
17
19
  resource :settings, only: [:show, :update]
20
+ get 'hits/:host_id', to: 'hits#index'
18
21
  end
19
22
 
20
23
  namespace :foreman_rh_cloud do
@@ -0,0 +1,5 @@
1
+ class AddHitsCountToInsightsFacetsTable < ActiveRecord::Migration[5.0]
2
+ def change
3
+ add_column :insights_facets, :hits_count, :integer
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class SetupHitsCountCache < ActiveRecord::Migration[5.0]
2
+ def up
3
+ ActiveRecord::Base.connection.execute <<-SQL.squish
4
+ UPDATE insights_facets
5
+ SET hits_count = (SELECT count(1)
6
+ FROM insights_hits
7
+ WHERE insights_hits.host_id = insights_facets.host_id)
8
+ SQL
9
+ end
10
+ end
@@ -23,7 +23,7 @@ module ForemanInventoryUpload
23
23
  end
24
24
 
25
25
  def command
26
- "#{rake_prefix}rake foreman_inventory_upload:report:generate"
26
+ "#{rake_prefix}rake rh_cloud_inventory:report:generate"
27
27
  end
28
28
 
29
29
  def env
@@ -8,24 +8,30 @@ module ForemanInventoryUpload
8
8
  def perform(instance_label)
9
9
  klass_name = self.class.name
10
10
  logger.debug("Starting #{klass_name} with label #{instance_label}")
11
- progress_output = ProgressOutput.register(instance_label)
12
- Open3.popen2e(hash_to_s(env), *preprocess_command(command)) do |_stdin, stdout_stderr, wait_thread|
13
- progress_output.status = "Running in pid #{wait_thread.pid}"
11
+ progress_output_for(instance_label) do |progress_output|
12
+ Open3.popen2e(hash_to_s(env), *preprocess_command(command)) do |_stdin, stdout_stderr, wait_thread|
13
+ progress_output.status = "Running in pid #{wait_thread.pid}"
14
14
 
15
- stdout_stderr.each do |out_line|
16
- progress_output.write_line(out_line)
17
- end
15
+ stdout_stderr.each do |out_line|
16
+ progress_output.write_line(out_line)
17
+ end
18
18
 
19
- progress_output.status = wait_thread.value.to_s
19
+ progress_output.status = wait_thread.value.to_s
20
+ end
20
21
  end
21
22
  logger.debug("Finished job #{klass_name} with label #{instance_label}")
22
- ensure
23
- progress_output.close
24
23
  end
25
24
 
26
25
  def command
27
26
  end
28
27
 
28
+ def progress_output_for(instance_label)
29
+ progress_output = ProgressOutput.register(instance_label)
30
+ yield(progress_output)
31
+ ensure
32
+ progress_output.close
33
+ end
34
+
29
35
  def env
30
36
  {}
31
37
  end
@@ -8,15 +8,33 @@ module ForemanInventoryUpload
8
8
  end
9
9
 
10
10
  def perform(filename, organization_id)
11
+ label = UploadReportJob.output_label(organization_id)
11
12
  @filename = filename
12
13
  @organization = Organization.find(organization_id)
13
14
 
15
+ if Setting[:content_disconnected]
16
+ progress_output_for(label) do |progress_output|
17
+ progress_output.write_line('Upload was stopped since disconnected mode setting is enabled for content on this instance.')
18
+ progress_output.status = "Task aborted, exit 1"
19
+ end
20
+ return
21
+ end
22
+
23
+ unless @organization.owner_details&.fetch('upstreamConsumer')&.fetch('idCert')
24
+ logger.info("Skipping organization '#{@organization}', no candlepin certificate defined.")
25
+ progress_output_for(label) do |progress_output|
26
+ progress_output.write_line("Skipping organization #{@organization}, no candlepin certificate defined.")
27
+ progress_output.status = "Task aborted, exit 1"
28
+ end
29
+ return
30
+ end
31
+
14
32
  Tempfile.create([@organization.name, '.pem']) do |cer_file|
15
33
  cer_file.write(rh_credentials[:cert])
16
34
  cer_file.write(rh_credentials[:key])
17
35
  cer_file.flush
18
36
  @cer_path = cer_file.path
19
- super(UploadReportJob.output_label(organization_id))
37
+ super(label)
20
38
  end
21
39
  end
22
40
 
@@ -29,6 +47,8 @@ module ForemanInventoryUpload
29
47
  'FILES' => @filename,
30
48
  'CER_PATH' => @cer_path
31
49
  )
50
+
51
+ http_proxy_string = ForemanRhCloud.http_proxy_string(logger: logger)
32
52
  if http_proxy_string
33
53
  env_vars['http_proxy'] = http_proxy_string
34
54
  env_vars['https_proxy'] = http_proxy_string
@@ -36,13 +56,6 @@ module ForemanInventoryUpload
36
56
  env_vars
37
57
  end
38
58
 
39
- def http_proxy_string
40
- @http_proxy_string ||=
41
- HttpProxy.default_global_content_proxy&.full_url ||
42
- cdn_proxy ||
43
- global_foreman_proxy
44
- end
45
-
46
59
  def rh_credentials
47
60
  @rh_credentials ||= begin
48
61
  candlepin_id_certificate = @organization.owner_details['upstreamConsumer']['idCert']
@@ -52,31 +65,6 @@ module ForemanInventoryUpload
52
65
  }
53
66
  end
54
67
  end
55
-
56
- def cdn_proxy
57
- cdn_settings = SETTINGS[:katello][:cdn_proxy] || {}
58
-
59
- return nil unless cdn_settings[:host]
60
-
61
- proxy_uri = URI('')
62
-
63
- original_uri = URI.parse(cdn_settings[:host])
64
-
65
- proxy_uri.scheme = original_uri.scheme || 'http'
66
- proxy_uri.host = original_uri.host || original_uri.path
67
- proxy_uri.port = cdn_settings[:port]
68
- proxy_uri.user = cdn_settings[:user]
69
- proxy_uri.password = cdn_settings[:password]
70
-
71
- proxy_uri.to_s
72
- rescue URI::Error => e
73
- logger.warn("cdn_proxy parsing failed: #{e}")
74
- nil
75
- end
76
-
77
- def global_foreman_proxy
78
- Setting[:http_proxy]
79
- end
80
68
  end
81
69
  end
82
70
  end
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  module ForemanInventoryUpload
2
4
  module Generators
3
5
  module FactHelpers
@@ -69,6 +71,39 @@ module ForemanInventoryUpload
69
71
  def obfuscate_fqdn(fqdn)
70
72
  "#{Digest::SHA1.hexdigest(fqdn)}.example.com"
71
73
  end
74
+
75
+ def obfuscate_ips?(host)
76
+ insights_client_setting = fact_value(host, 'insights_client::obfuscate_ip_enabled')
77
+ insights_client_setting = ActiveModel::Type::Boolean.new.cast(insights_client_setting)
78
+ return insights_client_setting unless insights_client_setting.nil?
79
+
80
+ Setting[:obfuscate_inventory_ips]
81
+ end
82
+
83
+ def host_ips(host)
84
+ return obfuscated_ips(host) if obfuscate_ips?(host)
85
+
86
+ # return a pass through proxy hash in case no obfuscation needed
87
+ Hash.new { |h, k| k }
88
+ end
89
+
90
+ def obfuscated_ips(host)
91
+ insights_client_ips = JSON.parse(fact_value(host, 'insights_client::ips') || '[]')
92
+
93
+ obfuscated_ips = Hash[
94
+ insights_client_ips.map { |ip_record| [ip_record['original'], ip_record['obfuscated']] }
95
+ ]
96
+
97
+ obfuscated_ips.default_proc = proc do |hash, key|
98
+ hash[key] = obfuscate_ip(key, hash)
99
+ end
100
+
101
+ obfuscated_ips
102
+ end
103
+
104
+ def obfuscate_ip(ip, ips_dict)
105
+ "10.230.230.#{ips_dict.count + 1}"
106
+ end
72
107
  end
73
108
  end
74
109
  end