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.
- checksums.yaml +4 -4
- data/README.md +27 -2
- data/app/controllers/foreman_inventory_upload/accounts_controller.rb +2 -0
- data/app/controllers/foreman_inventory_upload/uploads_controller.rb +18 -0
- data/app/controllers/insights_cloud/hits_controller.rb +17 -0
- data/app/helpers/foreman_inventory_upload_host_helper.rb +2 -3
- data/app/models/concerns/rh_cloud_host.rb +15 -0
- data/app/models/insights_hit.rb +1 -1
- data/app/models/setting/rh_cloud.rb +2 -0
- data/app/overrides/hosts_list.rb +1 -1
- data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
- data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +1 -6
- data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
- data/app/views/hosts/_insights_tab.html.erb +9 -0
- data/app/views/layouts/foreman_rh_cloud/application.html.erb +0 -1
- data/config/routes.rb +3 -0
- data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
- data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
- data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
- data/lib/foreman_inventory_upload/async/shell_process.rb +15 -9
- data/lib/foreman_inventory_upload/async/upload_report_job.rb +21 -33
- data/lib/foreman_inventory_upload/generators/fact_helpers.rb +35 -0
- data/lib/foreman_inventory_upload/generators/json_stream.rb +7 -2
- data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
- data/lib/foreman_inventory_upload/generators/queries.rb +4 -4
- data/lib/foreman_inventory_upload/generators/slice.rb +27 -25
- data/lib/foreman_rh_cloud.rb +55 -0
- data/lib/foreman_rh_cloud/engine.rb +13 -2
- data/lib/foreman_rh_cloud/version.rb +1 -1
- data/lib/insights_cloud/async/insights_full_sync.rb +5 -24
- data/lib/inventory_sync/async/inventory_full_sync.rb +3 -22
- data/lib/tasks/insights.rake +15 -0
- data/lib/tasks/rh_cloud_inventory.rake +37 -0
- data/package.json +3 -1
- data/test/jobs/upload_report_job_test.rb +34 -0
- data/test/unit/fact_helpers_test.rb +22 -0
- data/test/unit/insights_facet_test.rb +7 -0
- data/test/unit/metadata_generator_test.rb +2 -0
- data/test/unit/rh_cloud_http_proxy_test.rb +65 -0
- data/test/unit/slice_generator_test.rb +164 -2
- data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +14 -1
- data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -18
- data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +16 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +6 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -8
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +19 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +11 -0
- data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
- data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
- data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
- data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
- data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
- data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +36 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
- data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilterReducer.js +13 -2
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/InventoryFilterReducer.test.js +10 -1
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/InventoryFilterReducer.test.js.snap +6 -0
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +3 -0
- data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
- data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
- data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +8 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +9 -11
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +2 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +18 -0
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +1 -8
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +62 -0
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +0 -7
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +2 -2
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
- data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
- data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
- data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
- data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
- data/webpack/ForemanRhCloudPages.js +2 -0
- data/webpack/ForemanRhCloudReducers.js +2 -0
- data/webpack/ForemanRhCloudSelectors.js +5 -0
- data/webpack/ForemanRhCloudTestHelpers.js +6 -1
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +17 -20
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +0 -6
- data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +0 -4
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +16 -0
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +1 -24
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +38 -4
- data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +0 -14
- data/webpack/InsightsCloudSync/InsightsCloudSync.js +3 -5
- data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +1 -3
- data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
- data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
- data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +1 -1
- data/webpack/InsightsHostDetailsTab/InsightsTab.js +66 -0
- data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +31 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +2 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +19 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +19 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +26 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +34 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +58 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +34 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
- data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
- data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
- data/webpack/InsightsHostDetailsTab/index.js +20 -0
- data/webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js +1 -0
- data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +1 -0
- data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +3 -0
- metadata +67 -16
- data/lib/tasks/generator.rake +0 -29
- data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 778b0d71a8930862a9ea89c96b28024ef830b62bfe09c393da68200884bf1581
|
|
4
|
+
data.tar.gz: '01600923d9766697d70c1739a1e8a2257357804c01200b5571f8b63464401f8e'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/app/models/insights_hit.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
|
data/app/overrides/hosts_list.rb
CHANGED
|
@@ -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="
|
|
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
|
-
<%=
|
|
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
|
-
<%=
|
|
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" %>
|
data/config/routes.rb
CHANGED
|
@@ -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,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
|
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
stdout_stderr.each do |out_line|
|
|
16
|
+
progress_output.write_line(out_line)
|
|
17
|
+
end
|
|
18
18
|
|
|
19
|
-
|
|
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(
|
|
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
|