foreman_rh_cloud 2.0.12 → 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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +2 -0
  3. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +18 -0
  4. data/app/helpers/foreman_inventory_upload_host_helper.rb +2 -3
  5. data/app/models/concerns/rh_cloud_host.rb +4 -1
  6. data/app/models/insights_hit.rb +1 -1
  7. data/app/models/setting/rh_cloud.rb +2 -0
  8. data/app/overrides/hosts_list.rb +1 -1
  9. data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
  10. data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +1 -6
  11. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  12. data/app/views/hosts/_insights_tab.html.erb +1 -7
  13. data/app/views/layouts/foreman_rh_cloud/application.html.erb +0 -1
  14. data/config/routes.rb +2 -0
  15. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  16. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  17. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +35 -0
  18. data/lib/foreman_inventory_upload/generators/json_stream.rb +7 -2
  19. data/lib/foreman_inventory_upload/generators/queries.rb +2 -0
  20. data/lib/foreman_inventory_upload/generators/slice.rb +26 -24
  21. data/lib/foreman_rh_cloud.rb +2 -1
  22. data/lib/foreman_rh_cloud/engine.rb +3 -2
  23. data/lib/foreman_rh_cloud/version.rb +1 -1
  24. data/lib/insights_cloud/async/insights_full_sync.rb +4 -25
  25. data/lib/inventory_sync/async/inventory_full_sync.rb +2 -23
  26. data/package.json +1 -1
  27. data/test/unit/fact_helpers_test.rb +22 -0
  28. data/test/unit/insights_facet_test.rb +7 -0
  29. data/test/unit/slice_generator_test.rb +106 -1
  30. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +14 -1
  31. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -18
  32. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +16 -0
  33. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +6 -0
  34. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  35. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -8
  36. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  37. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +19 -0
  38. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +11 -0
  39. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  40. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  41. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  42. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  43. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  44. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  45. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  46. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  47. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  48. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  49. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  50. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  51. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  52. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  53. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  54. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +36 -0
  55. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  56. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  57. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  58. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  59. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  60. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  61. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  62. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  63. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  64. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  65. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  66. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  67. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  68. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  69. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  70. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  71. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  72. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  73. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  74. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  75. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +8 -2
  76. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +9 -11
  77. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +1 -1
  78. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +2 -2
  79. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +18 -0
  80. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +1 -8
  81. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +62 -0
  82. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +0 -7
  83. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  84. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  85. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  86. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +17 -20
  87. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +0 -6
  88. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +0 -4
  89. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +16 -0
  90. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +1 -24
  91. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +38 -4
  92. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +0 -14
  93. data/webpack/InsightsCloudSync/InsightsCloudSync.js +2 -4
  94. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +1 -3
  95. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  96. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  97. data/webpack/InsightsHostDetailsTab/InsightsTab.js +8 -6
  98. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +1 -1
  99. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +9 -8
  100. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +0 -1
  101. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +2 -9
  102. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +7 -1
  103. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +0 -9
  104. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +26 -22
  105. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +40 -2
  106. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +0 -7
  107. metadata +39 -15
  108. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32e82a148a80e18485bbcc80e69715ad4cbda072aaf6e011e18030212461aa4e
4
- data.tar.gz: 9294a0e1779a60bfa568c0413f9f3c84ab464a563cb36060798637b97f2adcff
3
+ metadata.gz: f752d932777a3a19e0cea76d8f23c1f17a5382d17de5a2559f47db6f02ceb06b
4
+ data.tar.gz: 20b6709896a8b3cfd74028358e24001aab7b946e6ac612c133dbf39f2bdbf50c
5
5
  SHA512:
6
- metadata.gz: 5652f82aaf2127c5eba23bc81e92959a665993ea329a8462c4078b946f840cf06f9c6f385b18cfce494be83df376ed9d697f15691929b297133994edab745569
7
- data.tar.gz: 71fcfbb4dff6cb22e1078c732c42a0ffe99ec14e865ec88a9668c53fc9f91919661a1d406cc34b45cbd59c8bf058803d3ec3b5aa23b1127cf759c708fc3c3bc2
6
+ metadata.gz: 2a332f5c4ca014ba9115e642bd5cb340f050ebb720424e4480e4ce57a37397bda900825962174e96fac91c656792b8d31c1f2d15aaf3a4b9c17b200a9f1b604e
7
+ data.tar.gz: 50c3f8fbf25ee93a42dce525443ebf33be74682346996407228981529b230a4d9fb3f914de2e5b00ff27e98bcd2684b114dc573e51138c185de058c0be856097
@@ -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)
@@ -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'
@@ -6,7 +6,10 @@ module RhCloudHost
6
6
  :inventory_upload_facts,
7
7
  -> { where(fact_name_id: ForemanInventoryUpload::Generators::Queries.fact_names.values) },
8
8
  class_name: 'FactValue',
9
- :foreign_key => :host_id
9
+ foreign_key: :host_id
10
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
11
14
  end
12
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') %>
@@ -6,10 +6,4 @@
6
6
  <%= webpacked_plugins_css_for :'foreman_rh_cloud' %>
7
7
  <% end %>
8
8
 
9
- <div id="host_details_insights_react_container"></div>
10
- <%= mount_react_component(
11
- 'InsightsHostDetailsTab',
12
- '#host_details_insights_react_container',
13
- { hostID: host.id }.to_json,
14
- flatten_data: true
15
- ) %>
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
@@ -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
@@ -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
@@ -26,8 +26,13 @@ module ForemanInventoryUpload
26
26
  @out << string
27
27
  end
28
28
 
29
- def simple_field(name, value, last = false)
30
- @out << "\"#{name}\": #{stringify_value(value)}#{last ? '' : ','}" unless value.nil?
29
+ def simple_field(name, value, last = false, &block)
30
+ return if value.nil? || value.try(:empty?)
31
+ return if value.kind_of?(Array) && value.compact.empty?
32
+
33
+ block ||= ->(value) { value }
34
+
35
+ @out << "\"#{name}\": #{stringify_value(block.call(value))}#{last ? '' : ','}"
31
36
  end
32
37
 
33
38
  def array_field(name, last = false, &block)
@@ -24,7 +24,9 @@ module ForemanInventoryUpload
24
24
  'dmi::system::product_name',
25
25
  'dmi::chassis::asset_tag',
26
26
  'insights_client::obfuscate_hostname_enabled',
27
+ 'insights_client::obfuscate_ip_enabled',
27
28
  'insights_client::hostname',
29
+ 'insights_client::ips',
28
30
  ]).pluck(:name, :id)
29
31
  ]
30
32
  end
@@ -40,6 +40,7 @@ module ForemanInventoryUpload
40
40
  end
41
41
 
42
42
  def report_host(host)
43
+ host_ips_cache = host_ips(host)
43
44
  @stream.object do
44
45
  @stream.simple_field('fqdn', fqdn(host))
45
46
  @stream.simple_field('account', account_id(host.organization).to_s)
@@ -47,10 +48,10 @@ module ForemanInventoryUpload
47
48
  @stream.simple_field('satellite_id', host.subscription_facet&.uuid)
48
49
  @stream.simple_field('bios_uuid', fact_value(host, 'dmi::system::uuid'))
49
50
  @stream.simple_field('vm_uuid', fact_value(host, 'virt::uuid'))
50
- report_ip_addresses(host)
51
+ report_ip_addresses(host, host_ips_cache)
51
52
  report_mac_addresses(host)
52
53
  @stream.object_field('system_profile') do
53
- report_system_profile(host)
54
+ report_system_profile(host, host_ips_cache)
54
55
  end
55
56
  @stream.array_field('facts') do
56
57
  @stream.object do
@@ -96,15 +97,15 @@ module ForemanInventoryUpload
96
97
  end
97
98
  end
98
99
 
99
- def report_system_profile(host)
100
- @stream.simple_field('number_of_cpus', fact_value(host, 'cpu::cpu(s)').to_i)
101
- @stream.simple_field('number_of_sockets', fact_value(host, 'cpu::cpu_socket(s)').to_i)
102
- @stream.simple_field('cores_per_socket', fact_value(host, 'cpu::core(s)_per_socket').to_i)
103
- @stream.simple_field('system_memory_bytes', kilobytes_to_bytes(fact_value(host, 'memory::memtotal').to_i))
100
+ def report_system_profile(host, host_ips_cache)
101
+ @stream.simple_field('number_of_cpus', fact_value(host, 'cpu::cpu(s)')) { |v| v.to_i }
102
+ @stream.simple_field('number_of_sockets', fact_value(host, 'cpu::cpu_socket(s)')) { |v| v.to_i }
103
+ @stream.simple_field('cores_per_socket', fact_value(host, 'cpu::core(s)_per_socket')) { |v| v.to_i }
104
+ @stream.simple_field('system_memory_bytes', fact_value(host, 'memory::memtotal')) { |v| kilobytes_to_bytes(v.to_i) }
104
105
  @stream.array_field('network_interfaces') do
105
106
  @stream.raw(host.interfaces.map do |nic|
106
107
  {
107
- 'ipv4_addresses': [nic.ip].compact,
108
+ 'ipv4_addresses': [host_ips_cache[nic.ip]].compact,
108
109
  'ipv6_addresses': [nic.ip6].compact,
109
110
  'mtu': nic.try(:mtu),
110
111
  'mac_address': nic.mac,
@@ -123,18 +124,16 @@ module ForemanInventoryUpload
123
124
  end
124
125
  end
125
126
  @stream.simple_field(
126
- 'os_release',
127
- os_release_value(
128
- name: fact_value(host, 'distribution::name'),
129
- version: fact_value(host, 'distribution::version'),
130
- codename: fact_value(host, 'distribution::id')
131
- )
132
- )
127
+ 'os_release', [
128
+ fact_value(host, 'distribution::name'),
129
+ fact_value(host, 'distribution::version'),
130
+ fact_value(host, 'distribution::id'),
131
+ ]
132
+ ) { |v| os_release_value(*v) }
133
133
  @stream.simple_field('os_kernel_version', fact_value(host, 'uname::release'))
134
134
  @stream.simple_field('arch', host.architecture&.name)
135
135
  @stream.simple_field('subscription_status', host.subscription_status_label)
136
136
  @stream.simple_field('katello_agent_running', host.content_facet&.katello_agent_installed?)
137
- @stream.simple_field('satellite_managed', true)
138
137
  @stream.simple_field(
139
138
  'infrastructure_type',
140
139
  ActiveModel::Type::Boolean.new.cast(fact_value(host, 'virt::is_guest')) ? 'virtual' : 'physical'
@@ -150,13 +149,16 @@ module ForemanInventoryUpload
150
149
  end.join(', '))
151
150
  end
152
151
  end
153
- @stream.array_field('installed_packages', :last) do
154
- first = true
155
- host.installed_packages.each do |package|
156
- @stream.raw("#{first ? '' : ', '}#{@stream.stringify_value(package.nvra)}")
157
- first = false
152
+ unless Setting[:exclude_installed_packages]
153
+ @stream.array_field('installed_packages') do
154
+ first = true
155
+ host.installed_packages.each do |package|
156
+ @stream.raw("#{first ? '' : ', '}#{@stream.stringify_value(package.nvra)}")
157
+ first = false
158
+ end
158
159
  end
159
160
  end
161
+ @stream.simple_field('satellite_managed', true, :last)
160
162
  end
161
163
 
162
164
  def report_satellite_facts(host)
@@ -175,8 +177,8 @@ module ForemanInventoryUpload
175
177
  @stream.simple_field('organization_id', host.organization_id, :last)
176
178
  end
177
179
 
178
- def report_ip_addresses(host)
179
- ip_addresses = host.interfaces.map { |nic| nic.ip }.compact
180
+ def report_ip_addresses(host, host_ips_cache)
181
+ ip_addresses = host.interfaces.map { |nic| host_ips_cache[nic.ip] }.compact
180
182
 
181
183
  @stream.string_array_value('ip_addresses', ip_addresses)
182
184
  end
@@ -187,7 +189,7 @@ module ForemanInventoryUpload
187
189
  @stream.string_array_value('mac_addresses', macs)
188
190
  end
189
191
 
190
- def os_release_value(name:, version:, codename:)
192
+ def os_release_value(name, version, codename)
191
193
  "#{name} #{version} (#{codename})"
192
194
  end
193
195
  end
@@ -28,7 +28,8 @@ module ForemanRhCloud
28
28
  def self.proxy_setting(logger: Foreman::Logging.logger('background'))
29
29
  HttpProxy.default_global_content_proxy&.full_url ||
30
30
  ForemanRhCloud.cdn_proxy(logger: logger) ||
31
- ForemanRhCloud.global_foreman_proxy
31
+ ForemanRhCloud.global_foreman_proxy ||
32
+ ''
32
33
  end
33
34
 
34
35
  def self.cdn_proxy(logger: Foreman::Logging.logger('app'))
@@ -13,6 +13,7 @@ module ForemanRhCloud
13
13
  config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
14
14
  config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
15
15
  config.autoload_paths += Dir["#{config.root}/app/overrides"]
16
+ config.autoload_paths += Dir["#{config.root}/app/services"]
16
17
  config.autoload_paths += Dir["#{config.root}/lib"]
17
18
 
18
19
  config.eager_load_paths += Dir["#{config.root}/lib"]
@@ -54,8 +55,8 @@ module ForemanRhCloud
54
55
 
55
56
  # Adding a sub menu after hosts menu
56
57
  divider :top_menu, caption: N_('RH Cloud'), parent: :configure_menu
57
- menu :top_menu, :inventory_upload, :caption => N_('Inventory Upload'), :url_hash => { controller: :'foreman_rh_cloud/react', :action => :inventory_upload}, parent: :configure_menu
58
- menu :top_menu, :insights_hits_import, :caption => N_('Insights'), :url_hash => { controller: :'foreman_rh_cloud/react', :action => :insights_cloud }, parent: :configure_menu
58
+ menu :top_menu, :inventory_upload, caption: N_('Inventory Upload'), url_hash: { controller: :'foreman_rh_cloud/react', action: :inventory_upload }, parent: :configure_menu
59
+ menu :top_menu, :insights_hits_import, caption: N_('Insights'), url_hash: { controller: :'foreman_rh_cloud/react', action: :insights_cloud }, parent: :configure_menu
59
60
 
60
61
  register_facet InsightsFacet, :insights do
61
62
  configure_host do
@@ -1,3 +1,3 @@
1
1
  module ForemanRhCloud
2
- VERSION = '2.0.12'.freeze
2
+ VERSION = '2.0.13'.freeze
3
3
  end
@@ -3,6 +3,8 @@ require 'rest-client'
3
3
  module InsightsCloud
4
4
  module Async
5
5
  class InsightsFullSync < ::ApplicationJob
6
+ include ::ForemanRhCloud::CloudAuth
7
+
6
8
  def perform
7
9
  hits = query_insights_hits
8
10
 
@@ -16,10 +18,6 @@ module InsightsCloud
16
18
  Foreman::Logging.logger('background')
17
19
  end
18
20
 
19
- def rh_credentials
20
- @rh_credentials ||= query_refresh_token
21
- end
22
-
23
21
  private
24
22
 
25
23
  def query_insights_hits
@@ -36,25 +34,6 @@ module InsightsCloud
36
34
  JSON.parse(hits_response)
37
35
  end
38
36
 
39
- def query_refresh_token
40
- token_response = RestClient::Request.execute(
41
- method: :post,
42
- url: ForemanRhCloud.authentication_url,
43
- verify_ssl: ForemanRhCloud.verify_ssl_method,
44
- proxy: ForemanRhCloud.transformed_http_proxy_string(logger: logger),
45
- payload: {
46
- grant_type: 'refresh_token',
47
- client_id: 'rhsm-api',
48
- refresh_token: Setting[:rh_cloud_token],
49
- }
50
- )
51
-
52
- JSON.parse(token_response)['access_token']
53
- rescue RestClient::ExceptionWithResponse => e
54
- Foreman::Logging.exception('Unable to authenticate using rh_cloud_token setting', e)
55
- raise ::Foreman::WrappedException.new(e, N_('Unable to authenticate using rh_cloud_token setting'))
56
- end
57
-
58
37
  def setup_host_names(host_names)
59
38
  @host_ids = Hash[
60
39
  Host.unscoped.where(name: host_names).pluck(:name, :id)
@@ -67,8 +46,6 @@ module InsightsCloud
67
46
 
68
47
  def replace_hits_data(hits)
69
48
  InsightsHit.transaction do
70
- InsightsHit.delete_all
71
- InsightsHit.create(hits.map { |hits_hash| to_model_hash(hits_hash) }.compact)
72
49
  # create new facets for hosts that are missing one
73
50
  hosts_with_existing_facets = InsightsFacet.where(host_id: @host_ids.values).pluck(:host_id)
74
51
  InsightsFacet.create(
@@ -81,6 +58,8 @@ module InsightsCloud
81
58
  end
82
59
  end.compact
83
60
  )
61
+ InsightsHit.delete_all
62
+ InsightsHit.create(hits.map { |hits_hash| to_model_hash(hits_hash) }.compact)
84
63
  end
85
64
  end
86
65