foreman_rh_cloud 3.0.16 → 3.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/insights_cloud/candlepin_cache.rb +28 -0
  3. data/app/controllers/concerns/insights_cloud/client_authentication.rb +23 -0
  4. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +1 -1
  5. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +1 -8
  6. data/app/controllers/insights_cloud/api/machine_telemetries_controller.rb +73 -0
  7. data/app/controllers/insights_cloud/hits_controller.rb +3 -3
  8. data/app/controllers/insights_cloud/tasks_controller.rb +6 -1
  9. data/app/models/insights_hit.rb +16 -1
  10. data/app/models/insights_resolution.rb +3 -0
  11. data/app/models/insights_rule.rb +3 -0
  12. data/app/models/setting/rh_cloud.rb +12 -2
  13. data/app/services/foreman_rh_cloud/branch_info.rb +57 -0
  14. data/app/services/foreman_rh_cloud/cloud_request_forwarder.rb +102 -0
  15. data/config/routes.rb +10 -0
  16. data/db/migrate/20210214000001_create_rules_and_resolutions.foreman_rh_cloud.rb +24 -0
  17. data/db/migrate/20210214000002_add_rule_id_to_hits.foreman_rh_cloud.rb +5 -0
  18. data/lib/foreman_inventory_upload/generators/slice.rb +3 -3
  19. data/lib/foreman_rh_cloud.rb +9 -0
  20. data/lib/foreman_rh_cloud/engine.rb +1 -0
  21. data/lib/foreman_rh_cloud/version.rb +1 -1
  22. data/lib/insights_cloud.rb +4 -0
  23. data/lib/insights_cloud/async/insights_full_sync.rb +29 -0
  24. data/lib/insights_cloud/async/insights_rules_sync.rb +80 -0
  25. data/lib/insights_cloud/async/rules_result.rb +13 -0
  26. data/package.json +1 -1
  27. data/test/controllers/insights_cloud/api/machine_telemetries_controller_test.rb +107 -0
  28. data/test/factories/insights_factories.rb +2 -1
  29. data/test/factories/inventory_upload_factories.rb +12 -0
  30. data/test/jobs/insights_full_sync_test.rb +17 -0
  31. data/test/jobs/insights_rules_sync_test.rb +198 -0
  32. data/test/unit/services/foreman_rh_cloud/branch_info_test.rb +60 -0
  33. data/test/unit/services/foreman_rh_cloud/cloud_request_forwarder_test.rb +106 -0
  34. data/test/unit/slice_generator_test.rb +29 -3
  35. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +1 -1
  36. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +1 -1
  37. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +1 -1
  38. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +2 -2
  39. data/webpack/ForemanInventoryUpload/Components/Dashboard/DashboardActions.js +1 -1
  40. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardActions.test.js +4 -4
  41. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +2 -0
  42. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.scss +12 -0
  43. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +1 -0
  44. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SettingsWarning/SettingsWarning.js +64 -0
  45. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SettingsWarning/SettingsWarning.test.js +18 -0
  46. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SettingsWarning/__snapshots__/SettingsWarning.test.js.snap +30 -0
  47. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SettingsWarning/index.js +25 -0
  48. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +2 -2
  49. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButton.test.js +1 -1
  50. data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTable.js +9 -5
  51. data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableActions.js +55 -30
  52. data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableConstants.js +10 -9
  53. data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableHelpers.js +14 -6
  54. data/webpack/InsightsCloudSync/Components/InsightsTable/InsightsTableSelectors.js +4 -0
  55. data/webpack/InsightsCloudSync/Components/InsightsTable/SelectAllAlert.js +4 -10
  56. data/webpack/InsightsCloudSync/Components/InsightsTable/__tests__/InsightsTableActions.test.js +48 -0
  57. data/webpack/InsightsCloudSync/Components/InsightsTable/__tests__/__snapshots__/InsightsTable.test.js.snap +11 -24
  58. data/webpack/InsightsCloudSync/Components/InsightsTable/__tests__/__snapshots__/InsightsTableActions.test.js.snap +132 -0
  59. data/webpack/InsightsCloudSync/Components/InsightsTable/__tests__/__snapshots__/InsightsTableSelectors.test.js.snap +1 -0
  60. data/webpack/InsightsCloudSync/Components/InsightsTable/__tests__/fixtures.js +1 -1
  61. data/webpack/InsightsCloudSync/Components/InsightsTable/table.scss +10 -0
  62. data/webpack/InsightsCloudSync/InsightsCloudSync.js +18 -16
  63. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +23 -20
  64. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +1 -1
  65. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +36 -36
  66. data/webpack/InsightsCloudSync/__tests__/InsightsCloudSyncActions.test.js +9 -0
  67. data/webpack/InsightsCloudSync/__tests__/__snapshots__/InsightsCloudSyncActions.test.js.snap +11 -0
  68. data/webpack/__mocks__/foremanReact/redux/API/index.js +1 -0
  69. metadata +29 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40911c61287fcace17eb79713f616515ca463a0c671f2a663b5dca8c4587c0ca
4
- data.tar.gz: 5db731e3f022086fc55b9f6dded6917ff4d459c0565aa48fb4742cdcb2adbb0a
3
+ metadata.gz: de4c573e51011ac6fd99707859fa86d659454b7f30183494ab5e240e773bec0a
4
+ data.tar.gz: f0510f09adf430834e01b9732a9cf6faedff0b18471e7b90fbca8a47fe867a13
5
5
  SHA512:
6
- metadata.gz: 06c1ac8778b2c119f3594cfec3afec6662b4ab6925a7b591d88cfa3fb80b76f390d38e5e152249f253095a71ca7484e8fe715906294729d71045bcc5d35022d0
7
- data.tar.gz: c629a9b8b860600b1c0a180ebf2d057cc3201a3596fa32bbcf650661e4612fdd5612dba787b32ba70cf8b546662af68d49e98e4edd4e77f49deb22b9d681a408
6
+ metadata.gz: a5ef31993d25982136027082f9fb3d382133378627afd0f5da6eeb5eb24a971aa36cdb7f8995347b017ab438124219113e6b326a52f1821e0ccbdb0a6e402f52
7
+ data.tar.gz: e5da37635a059fadc6e6c62464aec98f75e803fddb1f8b1ca9b23ad27e42cffdb006bdd4ae5e59d10317d8599f6629ff8f4e08065a15947aff7f93133ec49e8a
@@ -0,0 +1,28 @@
1
+ module InsightsCloud
2
+ module CandlepinCache
3
+ extend ActiveSupport::Concern
4
+
5
+ def upstream_owner(org)
6
+ # We use a cache because owner_details is a call to Candlepin
7
+ Rails.cache.fetch("rh_cloud_upstream_owner_#{org.id}", expires_in: 1.minute) do
8
+ org.owner_details['upstreamConsumer']
9
+ end
10
+ end
11
+
12
+ def cp_owner_id(org)
13
+ owner = upstream_owner(org)
14
+ owner['uuid'] if owner
15
+ end
16
+
17
+ def candlepin_id_cert(org)
18
+ owner = upstream_owner(org)
19
+ return unless owner
20
+ id_cert = {
21
+ cert: owner.dig('idCert', 'cert'),
22
+ key: owner.dig('idCert', 'key'),
23
+ }
24
+ return unless id_cert.values.all?
25
+ id_cert
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ module InsightsCloud
2
+ module ClientAuthentication
3
+ extend ActiveSupport::Concern
4
+
5
+ include ::Katello::Authentication::ClientAuthentication
6
+
7
+ def authorize
8
+ client_authorized? || super
9
+ end
10
+
11
+ def client_authorized?
12
+ authenticate_client && valid_machine_user?
13
+ end
14
+
15
+ def valid_machine_user?
16
+ subscribed_host_by_uuid(User.current.uuid).present?
17
+ end
18
+
19
+ def subscribed_host_by_uuid(uuid)
20
+ @host = Host.unscoped.joins(:subscription_facet).where(:katello_subscription_facets => {:uuid => uuid }).first
21
+ end
22
+ end
23
+ end
@@ -24,7 +24,7 @@ module ForemanInventoryUpload
24
24
  autoUploadEnabled: Setting[:allow_auto_inventory_upload],
25
25
  hostObfuscationEnabled: Setting[:obfuscate_inventory_hostnames],
26
26
  ipsObfuscationEnabled: Setting[:obfuscate_inventory_ips],
27
- cloudToken: Setting[:rh_cloud_token],
27
+ cloudToken: !Setting[:rh_cloud_token].empty?,
28
28
  excludePackages: Setting[:exclude_installed_packages],
29
29
  accounts: accounts,
30
30
  CloudConnectorStatus: cloud_connector_status,
@@ -14,14 +14,7 @@ module ForemanInventoryUpload
14
14
  files = Dir["{#{ForemanInventoryUpload.uploads_file_path(filename)},#{ForemanInventoryUpload.done_file_path(filename)}}"]
15
15
 
16
16
  return send_file files.first, disposition: 'attachment', filename: filename unless files.empty?
17
- throw_flash_error "File doesn't exist"
18
- end
19
-
20
- def throw_flash_error(message)
21
- process_error(
22
- :redirect => foreman_inventory_upload_index_path,
23
- :error_msg => message
24
- )
17
+ raise ::Foreman::Exception.new("The report file doesn't exist")
25
18
  end
26
19
 
27
20
  def enable_cloud_connector
@@ -0,0 +1,73 @@
1
+ module InsightsCloud::Api
2
+ class MachineTelemetriesController < ::Api::V2::BaseController
3
+ layout false
4
+
5
+ include ::InsightsCloud::ClientAuthentication
6
+ include ::InsightsCloud::CandlepinCache
7
+
8
+ before_action :cert_uuid, :ensure_org, :ensure_branch_id, :only => [:forward_request, :branch_info]
9
+ before_action :ensure_telemetry_enabled_for_consumer, :only => [:forward_request]
10
+
11
+ skip_after_action :log_response_body, :only => [:forward_request]
12
+ skip_before_action :check_media_type, :only => [:forward_request]
13
+
14
+ # The method that "proxies" requests over to Cloud
15
+ def forward_request
16
+ certs = candlepin_id_cert @organization
17
+ cloud_response = ::ForemanRhCloud::CloudRequestForwarder.new.forward_request(request, controller_name, @branch_id, certs)
18
+
19
+ if cloud_response.code == 401
20
+ return render json: {
21
+ :message => 'Authentication to the Insights Service failed.',
22
+ :headers => {},
23
+ }, status: :bad_gateway
24
+ end
25
+
26
+ if cloud_response.headers[:content_disposition]
27
+ return send_data cloud_response, disposition: cloud_response.headers[:content_disposition], type: cloud_response.headers[:content_type]
28
+ end
29
+
30
+ assign_header(response, cloud_response, :x_resource_count, true)
31
+ assign_header(response, cloud_response, :x_rh_insights_request_id, false)
32
+
33
+ render json: cloud_response, status: cloud_response.code
34
+ end
35
+
36
+ def branch_info
37
+ render :json => ForemanRhCloud::BranchInfo.new.generate(@uuid, @host, @branch_id, request.host).to_json
38
+ end
39
+
40
+ def assign_header(res, cloud_res, header, transform)
41
+ header_content = cloud_res.headers[header]
42
+ return unless header_content
43
+ new_header = transform ? header.to_s.tr('_', '-') : header.to_s
44
+ res.headers[new_header] = header_content
45
+ end
46
+
47
+ private
48
+
49
+ def ensure_telemetry_enabled_for_consumer
50
+ render_message 'Telemetry is not enabled for your organization', :status => 403 unless telemetry_config
51
+ end
52
+
53
+ def telemetry_config
54
+ ::RedhatAccess::TelemetryConfiguration.find_or_create_by(:organization_id => @organization.id) do |conf|
55
+ conf.enable_telemetry = true
56
+ end
57
+ end
58
+
59
+ def cert_uuid
60
+ @uuid ||= User.current.login
61
+ end
62
+
63
+ def ensure_org
64
+ @organization = @host.organization
65
+ return render_message 'Organization not found or invalid', :status => 400 unless @organization
66
+ end
67
+
68
+ def ensure_branch_id
69
+ @branch_id = cp_owner_id(@organization)
70
+ return render_message "Branch ID not found for organization #{@organization.title}", :status => 400 unless @branch_id
71
+ end
72
+ end
73
+ end
@@ -3,11 +3,11 @@ module InsightsCloud
3
3
  include Foreman::Controller::AutoCompleteSearch
4
4
 
5
5
  def index
6
- hits = resource_base_search_and_page.preload(:host)
6
+ hits = resource_base_search_and_page.preload(:host, :rule)
7
7
 
8
8
  render json: {
9
- hasToken: Setting[:rh_cloud_token].length > 1,
10
- hits: hits.map { |hit| hit.attributes.merge(hostname: hit.host&.name) },
9
+ hasToken: !Setting[:rh_cloud_token].empty?,
10
+ hits: hits.map { |hit| hit.attributes.merge(hostname: hit.host&.name, has_playbook: hit.has_playbook?) },
11
11
  itemCount: hits.count,
12
12
  }, status: :ok
13
13
  end
@@ -1,7 +1,12 @@
1
1
  module InsightsCloud
2
2
  class TasksController < ::ApplicationController
3
3
  def create
4
- InsightsCloud::Async::InsightsFullSync.perform_now
4
+ job = InsightsCloud::Async::InsightsFullSync.perform_later
5
+ task = ForemanTasks::Task.find_by(external_id: job.provider_job_id)
6
+
7
+ render json: {
8
+ task: task,
9
+ }, status: :ok
5
10
  end
6
11
  end
7
12
  end
@@ -4,7 +4,22 @@ class InsightsHit < ApplicationRecord
4
4
  # since the facet is one-to-one association with a host, we can connect
5
5
  # through host_id column on both this model and facet.
6
6
  belongs_to :insights_facet, foreign_key: 'host_id', primary_key: 'host_id', counter_cache: :hits_count
7
+
8
+ has_one :rule, class_name: 'InsightsRule', foreign_key: 'rule_id', primary_key: 'rule_id'
9
+
10
+ scope :with_playbook, -> { joins(:rule) }
11
+
7
12
  scoped_search on: :title, complete_value: true
8
- scoped_search on: :total_risk, complete_value: :true
13
+ scoped_search on: :total_risk, complete_value: true
14
+ scoped_search on: :rule_id, complete_value: true, only_explicit: true
9
15
  scoped_search relation: :host, on: :name, rename: :hostname, complete_value: true
16
+ scoped_search on: :rule_id, rename: :with_playbook, only_explicit: true, complete_value: false, ext_method: :find_with_playbook
17
+
18
+ def self.find_with_playbook(key, operator, value)
19
+ { joins: :rule }
20
+ end
21
+
22
+ def has_playbook?
23
+ !rule.nil?
24
+ end
10
25
  end
@@ -0,0 +1,3 @@
1
+ class InsightsResolution < ApplicationRecord
2
+ belongs_to :rule, class_name: 'InsightsRule', foreign_key: 'rule_id', primary_key: 'rule_id', inverse_of: :resolutions
3
+ end
@@ -0,0 +1,3 @@
1
+ class InsightsRule < ApplicationRecord
2
+ has_many :resolutions, class_name: 'InsightsResolution', dependent: :destroy, foreign_key: 'rule_id', primary_key: 'rule_id', inverse_of: :rule
3
+ end
@@ -1,16 +1,26 @@
1
1
  class Setting::RhCloud < Setting
2
2
  ::Setting::BLANK_ATTRS.concat %w{rh_cloud_token}
3
3
 
4
+ def self.load_defaults
5
+ return false unless table_exists?
6
+ transaction do
7
+ # If the user had auto_upload default setting, we will not surprise him, and force the value to false
8
+ # for new users, the default will be set to true and the value will remain nil
9
+ Setting.where(name: 'allow_auto_inventory_upload', value: nil).where("settings.default LIKE '%false%'").update_all(value: "--- false\n...")
10
+ super
11
+ end
12
+ end
13
+
4
14
  def self.default_settings
5
15
  return unless ActiveRecord::Base.connection.table_exists?('settings')
6
- return unless super
7
16
  [
8
- set('allow_auto_inventory_upload', N_('Allow automatic upload of the host inventory to the Red Hat cloud'), false, N_('Allow automatic inventory uploads')),
17
+ set('allow_auto_inventory_upload', N_('Allow automatic upload of the host inventory to the Red Hat cloud'), true, N_('Allow automatic inventory uploads')),
9
18
  set('allow_auto_insights_sync', N_('Allow recommendations synchronization from Red Hat cloud'), false, N_('Allow recommendations synchronization')),
10
19
  set('obfuscate_inventory_hostnames', N_('Obfuscate host names sent to Red Hat cloud'), false, N_('Obfuscate host names')),
11
20
  set('obfuscate_inventory_ips', N_('Obfuscate ip addresses sent to Red Hat cloud'), false, N_('Obfuscate IPs')),
12
21
  set('rh_cloud_token', N_('Authentication token to Red Hat cloud services. Used to authenticate requests to cloud APIs'), nil, N_('Red Hat Cloud token'), nil, encrypted: true),
13
22
  set('exclude_installed_packages', N_('Exclude installed packages from Red Hat cloud inventory report'), false, N_("Don't upload installed packages")),
23
+ set('include_parameter_tags', N_('Should import include parameter tags from Foreman?'), false, N_('Include parameters in insights-client reports')),
14
24
  ]
15
25
  end
16
26
 
@@ -0,0 +1,57 @@
1
+ module ForemanRhCloud
2
+ class BranchInfo
3
+ def generate(uuid, host, branch_id, request_hostname)
4
+ {
5
+ :remote_leaf => uuid,
6
+ :remote_branch => branch_id,
7
+ :display_name => host.organization.name,
8
+ :hostname => request_hostname,
9
+ :product => {
10
+ :type => core_app_name,
11
+ :major_version => core_app_version.major,
12
+ :minor_version => core_app_version.minor,
13
+ },
14
+ :organization_id => host.organization.id,
15
+ :satellite_instance_id => Foreman.instance_id,
16
+ :labels => host_labels(host),
17
+ }
18
+ end
19
+
20
+ def core_app_name
21
+ 'Foreman'
22
+ end
23
+
24
+ def core_app_version
25
+ Foreman::Version.new
26
+ end
27
+
28
+ def new_label(key, value, namespace)
29
+ {
30
+ :namespace => namespace,
31
+ :key => key,
32
+ :value => value,
33
+ }
34
+ end
35
+
36
+ def labels_from_items(items, label_namespace, label_lamb, label_value_method = :to_s)
37
+ items.map { |item| new_label(label_lamb.call(item), item.public_send(label_value_method), label_namespace) }
38
+ end
39
+
40
+ def host_labels(host)
41
+ labels = [new_label('Organization', host.organization.name, 'Satellite')]
42
+ labels += labels_from_items(host.location.title.split('/'), 'Satellite', ->(item) { 'Location' }) if host.location
43
+ labels += labels_from_items(host.hostgroup.title.split('/'), 'Satellite', ->(item) { 'Host Group' }) if host.hostgroup
44
+ labels += labels_from_items(host.host_collections, 'Satellite', ->(item) { 'Host Collection' }, :name)
45
+
46
+ if Setting[:include_parameter_tags]
47
+ labels += labels_from_items(
48
+ host.host_inherited_params_objects,
49
+ 'SatelliteParameter',
50
+ ->(item) { item.name },
51
+ :value)
52
+ end
53
+
54
+ labels
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,102 @@
1
+ require 'rest-client'
2
+
3
+ module ForemanRhCloud
4
+ class CloudRequestForwarder
5
+ include ::ForemanRhCloud::CloudAuth
6
+
7
+ def forward_request(original_request, controller_name, branch_id, certs)
8
+ forward_params = prepare_forward_params(original_request, branch_id)
9
+ logger.debug("Request parameters for telemetry request: #{forward_params}")
10
+
11
+ forward_payload = prepare_forward_payload(original_request, controller_name)
12
+
13
+ logger.debug("User agent for telemetry is: #{http_user_agent original_request}")
14
+
15
+ request_opts = prepare_request_opts(original_request, forward_payload, forward_params, certs)
16
+
17
+ logger.debug("Sending request to: #{request_opts[:url]}")
18
+
19
+ execute_cloud_request(request_opts)
20
+ end
21
+
22
+ def prepare_request_opts(original_request, forward_payload, forward_params, certs)
23
+ base_params = {
24
+ method: original_request.method,
25
+ verify_ssl: ForemanRhCloud.verify_ssl_method,
26
+ payload: forward_payload,
27
+ headers: {
28
+ params: forward_params,
29
+ user_agent: http_user_agent(original_request),
30
+ },
31
+ }
32
+
33
+ if no_cert_paths.any? { |path| path.match original_request.path }
34
+ base_params.merge(url: prepare_forward_cloud_url(ForemanRhCloud.base_url, original_request.path))
35
+ else
36
+ base_params.merge(
37
+ url: prepare_forward_cloud_url(ForemanRhCloud.cert_base_url, original_request.path),
38
+ ssl_client_cert: OpenSSL::X509::Certificate.new(certs[:cert]),
39
+ ssl_client_key: OpenSSL::PKey::RSA.new(certs[:key])
40
+ )
41
+ end
42
+ end
43
+
44
+ def no_cert_paths
45
+ [
46
+ "/redhat_access/r/insights/v1/static/release/insights-core.egg",
47
+ "/redhat_access/r/insights/v1/static/uploader.v2.json",
48
+ "/redhat_access/r/insights/v1/static/uploader.v2.json.asc",
49
+ "/redhat_access/r/insights/v1/static/core/insights-core.egg",
50
+ ]
51
+ end
52
+
53
+ def execute_cloud_request(request_opts)
54
+ RestClient::Request.execute request_opts
55
+ end
56
+
57
+ def prepare_forward_payload(original_request, controller_name)
58
+ forward_payload = original_request.request_parameters[controller_name]
59
+
60
+ forward_payload = original_request.raw_post.clone if original_request.post? && original_request.raw_post
61
+ forward_payload = original_request.body.read if original_request.put?
62
+
63
+ forward_payload = original_request.params.slice(:file, :metadata) if original_request.params[:file]
64
+
65
+ # fix rails behaviour for http PATCH:
66
+ forward_payload = forward_payload.to_json if original_request.format.json? && original_request.patch? && forward_payload && !forward_payload.is_a?(String)
67
+ forward_payload
68
+ end
69
+
70
+ def prepare_forward_params(original_request, branch_id)
71
+ forward_params = original_request.query_parameters
72
+ if original_request.user_agent && !original_request.user_agent.include?('redhat_access_cfme')
73
+ forward_params = forward_params.merge(:branch_id => branch_id)
74
+ end
75
+
76
+ forward_params
77
+ end
78
+
79
+ def prepare_forward_cloud_url(base_url, request_path)
80
+ cloud_path = request_path.sub('/redhat_access/r/insights/platform/', '')
81
+ .sub('/redhat_access/r/insights/', '')
82
+
83
+ "#{base_url}/api/#{cloud_path}"
84
+ end
85
+
86
+ def core_app_name
87
+ 'Foreman'
88
+ end
89
+
90
+ def core_app_version
91
+ Foreman::Version.new
92
+ end
93
+
94
+ def http_user_agent(original_request)
95
+ "#{core_app_name}/#{core_app_version};#{ForemanRhCloud::Engine.engine_name}/#{ForemanRhCloud::VERSION};#{original_request.env['HTTP_USER_AGENT']}"
96
+ end
97
+
98
+ def logger
99
+ Foreman::Logging.logger('app')
100
+ end
101
+ end
102
+ end
data/config/routes.rb CHANGED
@@ -32,4 +32,14 @@ Rails.application.routes.draw do
32
32
  get 'inventory_upload', to: '/react#index'
33
33
  get 'insights_cloud', to: '/react#index' # Uses foreman's react controller
34
34
  end
35
+
36
+ scope :module => :'insights_cloud/api', :path => :redhat_access do
37
+ scope 'r/insights/v1' do
38
+ get 'branch_info', to: 'machine_telemetries#branch_info'
39
+ end
40
+
41
+ scope '/r/insights' do
42
+ match '/*path', :constraints => lambda { |req| !req.path.include?('view/api') }, to: 'machine_telemetries#forward_request', via: [:get, :post, :delete,:put, :patch]
43
+ end
44
+ end
35
45
  end
@@ -0,0 +1,24 @@
1
+ class CreateRulesAndResolutions < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :insights_rules do |t|
4
+ t.string :rule_id
5
+ t.string :description
6
+ t.string :category_name
7
+ t.string :impact_name
8
+ t.string :summary
9
+ t.string :generic
10
+ t.string :reason
11
+ t.integer :total_risk
12
+ t.boolean :reboot_required
13
+ t.string :more_info
14
+ t.integer :rating
15
+ end
16
+
17
+ create_table :insights_resolutions do |t|
18
+ t.string :rule_id
19
+ t.integer :system_type
20
+ t.string :resolution
21
+ t.boolean :has_playbook
22
+ end
23
+ end
24
+ end