foreman_inventory_upload 1.0.0.beta7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +39 -0
  3. data/app/controllers/foreman_inventory_upload/reports_controller.rb +3 -4
  4. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +3 -3
  5. data/app/views/scripts/uploader.sh.erb +21 -9
  6. data/config/routes.rb +5 -5
  7. data/lib/foreman_inventory_upload.rb +14 -10
  8. data/lib/foreman_inventory_upload/async/generate_all_reports_job.rb +4 -7
  9. data/lib/foreman_inventory_upload/async/generate_report_job.rb +13 -9
  10. data/lib/foreman_inventory_upload/async/queue_for_upload_job.rb +7 -7
  11. data/lib/foreman_inventory_upload/async/upload_report_job.rb +22 -17
  12. data/lib/foreman_inventory_upload/generators/archived_report.rb +2 -2
  13. data/lib/foreman_inventory_upload/generators/queries.rb +18 -9
  14. data/lib/foreman_inventory_upload/generators/slice.rb +16 -9
  15. data/lib/foreman_inventory_upload/version.rb +1 -1
  16. data/lib/tasks/generator.rake +19 -5
  17. data/test/controllers/{statuses_controller_test.rb → accounts_controller_test.rb} +6 -7
  18. data/test/controllers/reports_controller_test.rb +3 -3
  19. data/test/controllers/uploads_controller_test.rb +3 -3
  20. data/test/unit/archived_report_generator_test.rb +3 -3
  21. data/test/unit/slice_generator_test.rb +22 -0
  22. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +5 -2
  23. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.js +11 -9
  24. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +3 -3
  25. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +7 -7
  26. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +1 -1
  27. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItem/ListItem.fixtures.js +1 -1
  28. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItem/ListItem.js +9 -7
  29. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItem/__tests__/__snapshots__/ListItem.test.js.snap +6 -4
  30. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItemStatus/ListItemStatus.fixtures.js +2 -1
  31. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItemStatus/ListItemStatus.js +5 -5
  32. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +2 -2
  33. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +4 -4
  34. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountList.test.js.snap +15 -12
  35. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +13 -10
  36. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +9 -3
  37. data/webpack/ForemanInventoryUpload/Components/AccountList/index.js +3 -6
  38. data/webpack/ForemanInventoryUpload/Components/Dashboard/Dashboard.js +5 -5
  39. data/webpack/ForemanInventoryUpload/Components/Dashboard/index.js +1 -4
  40. data/webpack/ForemanInventoryUpload/Components/NavContainer/__tests__/__snapshots__/NavContainer.test.js.snap +4 -4
  41. data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +4 -1
  42. metadata +7 -7
  43. data/app/controllers/foreman_inventory_upload/statuses_controller.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 85837a58f5c5a76038117ea20c6a10873e8c87add4841c8fb08d29e69564b7f8
4
- data.tar.gz: 652f7cac5cc2a3b861d82092257f0f683563aca3301f0c8a547ffc1cdfce89d6
3
+ metadata.gz: 4b18615a8878127f74e382f34b99c409d2a3cea180d40aaf4600660bf3e32875
4
+ data.tar.gz: fdabaddefa7099573546fe4f80a5ac3e406d2f52b1816efb7e433a958b73fe14
5
5
  SHA512:
6
- metadata.gz: 751a08aec0fafcc07496027d72dd087756f366acd6da686ea67833a3b2502fbffbd677734a122addd77b1213b35c61eee35736026617c43ae0ae866f2abd6632
7
- data.tar.gz: bb8ba3a8aaad6e5ef7994aff64d42b3848d0855187b6bd1c91205c010b2c7aaeb89236678f69bd81d4f179bcd9e2a5faab8c4842410f6908d15c167bc45ecb07
6
+ metadata.gz: 1552fbef1b4ffadb0271a804d54b8782ebe9b39c0557686398e28fb72a159cddee7eea26e4ca65b86224a2fa596fa56b7e1d7237b03b9ef4eebf0f776cd32520
7
+ data.tar.gz: e6ddf50d580f4be2ef5575eed02cf5f448e273239f33449c80f79fb68fefb124ba3c92ec45e58ed6fcb4f2fedb6cc5a6c6a45577e8b00247ca4bbeab810e30c9
@@ -0,0 +1,39 @@
1
+ module ForemanInventoryUpload
2
+ class AccountsController < ::ApplicationController
3
+ # override default "welcome screen behavior, since we don't have a model"
4
+ def welcome
5
+ true
6
+ end
7
+
8
+ def index
9
+ labels = Organization.all.pluck(:id, :name)
10
+
11
+ accounts = Hash[
12
+ labels.map do |id, label|
13
+ generate_report_status = status_for(id, ForemanInventoryUpload::Async::GenerateReportJob)
14
+ upload_report_status = status_for(id, ForemanInventoryUpload::Async::UploadReportJob)
15
+
16
+ [
17
+ id,
18
+ {
19
+ generate_report_status: generate_report_status,
20
+ upload_report_status: upload_report_status,
21
+ label: label,
22
+ },
23
+ ]
24
+ end
25
+ ]
26
+
27
+ render json: {
28
+ accounts: accounts,
29
+ }, status: :ok
30
+ end
31
+
32
+ private
33
+
34
+ def status_for(label, job_class)
35
+ label = job_class.output_label(label)
36
+ ForemanInventoryUpload::Async::ProgressOutput.get(label)&.status
37
+ end
38
+ end
39
+ end
@@ -3,7 +3,7 @@
3
3
  module ForemanInventoryUpload
4
4
  class ReportsController < ::ApplicationController
5
5
  def last
6
- label = ForemanInventoryUpload::Async::GenerateReportJob.output_label(params[:portal_user])
6
+ label = ForemanInventoryUpload::Async::GenerateReportJob.output_label(params[:organization_id])
7
7
  output = ForemanInventoryUpload::Async::ProgressOutput.get(label)&.full_output
8
8
  task_label = ForemanInventoryUpload::Async::GenerateAllReportsJob.singleton_job_name
9
9
  scheduled = ForemanTasks::Task.where(
@@ -18,10 +18,9 @@ module ForemanInventoryUpload
18
18
  end
19
19
 
20
20
  def generate
21
- portal_user = params[:portal_user]
21
+ organization_id = params[:organization_id]
22
22
 
23
- generated_file_name = File.join(ForemanInventoryUpload.base_folder, "#{portal_user}.tar.gz")
24
- ForemanInventoryUpload::Async::GenerateReportJob.perform_later(generated_file_name, portal_user)
23
+ ForemanInventoryUpload::Async::GenerateReportJob.perform_later(ForemanInventoryUpload.generated_reports_folder, organization_id)
25
24
 
26
25
  render json: {
27
26
  action_status: 'success',
@@ -1,7 +1,7 @@
1
1
  module ForemanInventoryUpload
2
2
  class UploadsController < ::ApplicationController
3
3
  def last
4
- label = ForemanInventoryUpload::Async::UploadReportJob.output_label(params[:portal_user])
4
+ label = ForemanInventoryUpload::Async::UploadReportJob.output_label(params[:organization_id])
5
5
  output = ForemanInventoryUpload::Async::ProgressOutput.get(label)&.full_output
6
6
 
7
7
  render json: {
@@ -10,8 +10,8 @@ module ForemanInventoryUpload
10
10
  end
11
11
 
12
12
  def download_file
13
- filename = 'hosts_report.tar.gz'
14
- path = Rails.root.join(ForemanInventoryUpload.uploads_folder(params[:portal_user]), filename)
13
+ filename = ForemanInventoryUpload.facts_archive_name(params[:organization_id])
14
+ path = Rails.root.join(ForemanInventoryUpload.uploads_folder, filename)
15
15
  unless File.exist? path
16
16
  return throw_flash_error(
17
17
  "Path doesn't exist: #{path}"
@@ -3,26 +3,38 @@
3
3
  DEST=<%= @upload_url %>
4
4
  RH_USERNAME=<%= @rh_username %>
5
5
 
6
- if [ -z "$RH_USERNAME" ]
6
+ if [ -z "$FILES" ]
7
7
  then
8
- IFS= read -rp "Enter username: " RH_USERNAME
8
+ FILES=./*.tar.gz
9
9
  fi
10
10
 
11
- if [ -z "$RH_PASSWORD" ]
11
+ if [ -n "$CER_PATH" ]
12
12
  then
13
- IFS= read -rsp "Enter password: " RH_PASSWORD
14
- fi
13
+ AUTH_KEY="--cert"
14
+ AUTH_VAL="$CER_PATH"
15
+ else
16
+ if [ -z "$RH_USERNAME" ]
17
+ then
18
+ IFS= read -rp "Enter username: " RH_USERNAME
19
+ fi
15
20
 
16
- if [ -z "$FILES" ]
17
- then
18
- FILES=./*.tar.gz
21
+ if [ -z "$RH_PASSWORD" ]
22
+ then
23
+ IFS= read -rsp "Enter password: " RH_PASSWORD
24
+ fi
25
+
26
+ AUTH_KEY="-u"
27
+ AUTH_VAL="\"$RH_USERNAME\":\"$RH_PASSWORD\""
19
28
  fi
20
29
 
30
+ # /tmp/a b/x.pem
31
+ # curl --cert /tmp/a\ b/x.pem
32
+
21
33
  mkdir -p done
22
34
 
23
35
  for f in $FILES
24
36
  do
25
- curl -k -vvv -# --fail -F "file=@$f;type=application/vnd.redhat.qpc.tar+tgz" $DEST -u "$RH_USERNAME":"$RH_PASSWORD"
37
+ curl -k -vvv -# --fail -F "file=@$f;type=application/vnd.redhat.qpc.tar+tgz" $DEST "$AUTH_KEY" "$AUTH_VAL"
26
38
  if [ $? -eq 0 ]; then
27
39
  mv $f done/
28
40
  echo "Done: $f"
data/config/routes.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  Rails.application.routes.draw do
2
2
  namespace :foreman_inventory_upload do
3
3
  get 'index', to: 'react#index'
4
- get ':portal_user/reports/last', to: 'reports#last', constraints: { portal_user: %r{[^\/]+} }
5
- post ':portal_user/reports', to: 'reports#generate', constraints: { portal_user: %r{[^\/]+} }
6
- get ':portal_user/uploads/last', to: 'uploads#last', constraints: { portal_user: %r{[^\/]+} }
7
- get ':portal_user/uploads/file', to: 'uploads#download_file', constraints: { portal_user: %r{[^\/]+} }
8
- get 'statuses', to: 'statuses#index'
4
+ get ':organization_id/reports/last', to: 'reports#last', constraints: { organization_id: %r{[^\/]+} }
5
+ post ':organization_id/reports', to: 'reports#generate', constraints: { organization_id: %r{[^\/]+} }
6
+ get ':organization_id/uploads/last', to: 'uploads#last', constraints: { organization_id: %r{[^\/]+} }
7
+ get ':organization_id/uploads/file', to: 'uploads#download_file', constraints: { organization_id: %r{[^\/]+} }
8
+ get 'accounts', to: 'accounts#index'
9
9
  end
10
10
  end
@@ -11,16 +11,20 @@ module ForemanInventoryUpload
11
11
  )
12
12
  end
13
13
 
14
- def self.uploads_folder(group)
15
- @uploads_folders ||= {}
16
- cache = @uploads_folders[group]
17
- return cache if cache
14
+ def self.uploads_folder
15
+ @uploads_folder ||= ensure_folder(
16
+ File.join(
17
+ ForemanInventoryUpload.base_folder,
18
+ 'uploads/'
19
+ )
20
+ )
21
+ end
18
22
 
19
- @uploads_folders[group] = ensure_folder(
23
+ def self.generated_reports_folder
24
+ @generated_reports_folder ||= ensure_folder(
20
25
  File.join(
21
26
  ForemanInventoryUpload.base_folder,
22
- 'uploads/',
23
- "#{group}/"
27
+ 'generated_reports/'
24
28
  )
25
29
  )
26
30
  end
@@ -33,12 +37,12 @@ module ForemanInventoryUpload
33
37
  'uploader.sh'
34
38
  end
35
39
 
36
- def self.facts_archive_name
37
- 'hosts_report.tar.gz'
40
+ def self.facts_archive_name(organization)
41
+ "report_for_#{organization}.tar.gz"
38
42
  end
39
43
 
40
44
  def self.upload_url
41
- # for testing set ENV to 'https://ci.cloud.paas.psi.redhat.com/api/ingress/v1/upload'
45
+ # for testing set ENV to 'https://ci.cloud.redhat.com/api/ingress/v1/upload'
42
46
  @upload_url ||= ENV['SATELLITE_INVENTORY_UPLOAD_URL'] || 'https://cloud.redhat.com/api/ingress/v1/upload'
43
47
  end
44
48
 
@@ -2,13 +2,10 @@ module ForemanInventoryUpload
2
2
  module Async
3
3
  class GenerateAllReportsJob < ::ApplicationJob
4
4
  def perform
5
- portal_users = RedhatAccess::TelemetryConfiguration
6
- .where(enable_telemetry: true)
7
- .distinct
8
- .pluck(:portal_user)
9
- portal_users.map do |portal_user|
10
- generated_file_name = File.join(ForemanInventoryUpload.base_folder, "#{portal_user}.tar.gz")
11
- GenerateReportJob.perform_later(generated_file_name, portal_user)
5
+ organizations = Organization.unscoped.all
6
+
7
+ organizations.map do |organization|
8
+ GenerateReportJob.perform_later(ForemanInventoryUpload.generated_reports_folder, organization.id)
12
9
  end
13
10
  ensure
14
11
  self.class.set(:wait => 24.hours).perform_later
@@ -1,17 +1,21 @@
1
1
  module ForemanInventoryUpload
2
2
  module Async
3
3
  class GenerateReportJob < ShellProcess
4
- def self.output_label(portal_user)
5
- "report_for_#{portal_user}"
4
+ def self.output_label(label)
5
+ "report_for_#{label}"
6
6
  end
7
7
 
8
- def perform(result_file, portal_user)
9
- @result_file = result_file
10
- @portal_user = portal_user
8
+ def perform(base_folder, organization)
9
+ @base_folder = base_folder
10
+ @organization = organization
11
11
 
12
- super(GenerateReportJob.output_label(portal_user))
12
+ super(GenerateReportJob.output_label(organization))
13
13
 
14
- QueueForUploadJob.perform_later(result_file, portal_user)
14
+ QueueForUploadJob.perform_later(
15
+ base_folder,
16
+ ForemanInventoryUpload.facts_archive_name(organization),
17
+ organization
18
+ )
15
19
  end
16
20
 
17
21
  def command
@@ -20,8 +24,8 @@ module ForemanInventoryUpload
20
24
 
21
25
  def env
22
26
  super.merge(
23
- 'target' => @result_file,
24
- 'portal_user' => @portal_user
27
+ 'target' => @base_folder,
28
+ 'organization_id' => @organization
25
29
  )
26
30
  end
27
31
  end
@@ -1,21 +1,22 @@
1
1
  module ForemanInventoryUpload
2
2
  module Async
3
3
  class QueueForUploadJob < ::ApplicationJob
4
- def perform(report_file, portal_user)
5
- @portal_user = portal_user
4
+ def perform(base_folder, report_file, organization_id)
5
+ @base_folder = base_folder
6
+ @report_file = report_file
6
7
  logger.debug('Ensuring objects')
7
8
  ensure_ouput_folder
8
9
  ensure_output_script
9
10
  logger.debug("Copying #{report_file} to #{uploads_folder}")
10
- enqueued_file_name = File.join(uploads_folder, ForemanInventoryUpload.facts_archive_name)
11
- FileUtils.mv(report_file, enqueued_file_name)
11
+ enqueued_file_name = File.join(uploads_folder, report_file)
12
+ FileUtils.mv(File.join(base_folder, report_file), enqueued_file_name)
12
13
  logger.debug("Done copying #{report_file} to #{enqueued_file_name}")
13
14
 
14
- UploadReportJob.perform_later(enqueued_file_name, portal_user)
15
+ UploadReportJob.perform_later(enqueued_file_name, organization_id)
15
16
  end
16
17
 
17
18
  def uploads_folder
18
- @uploads_folder ||= ForemanInventoryUpload.uploads_folder(@portal_user)
19
+ @uploads_folder ||= ForemanInventoryUpload.uploads_folder
19
20
  end
20
21
 
21
22
  def script_file
@@ -36,7 +37,6 @@ module ForemanInventoryUpload
36
37
  source: template_src,
37
38
  variables: {
38
39
  upload_url: ForemanInventoryUpload.upload_url,
39
- rh_username: @portal_user,
40
40
  }
41
41
  )
42
42
  script_source = Foreman::Renderer.render(template_src, scope)
@@ -1,15 +1,23 @@
1
+ require 'tempfile'
2
+
1
3
  module ForemanInventoryUpload
2
4
  module Async
3
5
  class UploadReportJob < ShellProcess
4
- def self.output_label(portal_user)
5
- "upload_for_#{portal_user}"
6
+ def self.output_label(label)
7
+ "upload_for_#{label}"
6
8
  end
7
9
 
8
- def perform(filename, portal_user)
9
- @portal_user = portal_user
10
+ def perform(filename, organization_id)
10
11
  @filename = filename
12
+ @organization = Organization.find(organization_id)
11
13
 
12
- super(UploadReportJob.output_label(portal_user))
14
+ Tempfile.create([@organization.name, '.pem']) do |cer_file|
15
+ cer_file.write(rh_credentials[:cert])
16
+ cer_file.write(rh_credentials[:key])
17
+ cer_file.flush
18
+ @cer_path = cer_file.path
19
+ super(UploadReportJob.output_label(organization_id))
20
+ end
13
21
  end
14
22
 
15
23
  def command
@@ -18,22 +26,19 @@ module ForemanInventoryUpload
18
26
 
19
27
  def env
20
28
  super.merge(
21
- 'RH_USERNAME' => rh_username,
22
- 'RH_PASSWORD' => rh_password,
23
- 'FILES' => @filename
29
+ 'FILES' => @filename,
30
+ 'CER_PATH' => @cer_path
24
31
  )
25
32
  end
26
33
 
27
34
  def rh_credentials
28
- @rh_credentials ||= RedhatAccess::TelemetryConfiguration.where(portal_user: @portal_user).last
29
- end
30
-
31
- def rh_username
32
- @portal_user
33
- end
34
-
35
- def rh_password
36
- rh_credentials.portal_password
35
+ @rh_credentials ||= begin
36
+ candlepin_id_certificate = @organization.owner_details['upstreamConsumer']['idCert']
37
+ {
38
+ cert: candlepin_id_certificate['cert'],
39
+ key: candlepin_id_certificate['key'],
40
+ }
41
+ end
37
42
  end
38
43
  end
39
44
  end
@@ -6,10 +6,10 @@ module ForemanInventoryUpload
6
6
  @logger = logger
7
7
  end
8
8
 
9
- def render(portal_user)
9
+ def render(organization:)
10
10
  Dir.mktmpdir do |tmpdir|
11
11
  @logger.info "Started generating hosts report in #{tmpdir}"
12
- host_batches = ForemanInventoryUpload::Generators::Queries.for_report(portal_user)
12
+ host_batches = ForemanInventoryUpload::Generators::Queries.for_org(organization)
13
13
  File.open(File.join(tmpdir, 'metadata.json'), 'w') do |metadata_out|
14
14
  metadata_generator = ForemanInventoryUpload::Generators::Metadata.new(metadata_out)
15
15
  metadata_generator.render do |inner_generator|
@@ -17,6 +17,7 @@ module ForemanInventoryUpload
17
17
  'distribution::name',
18
18
  'uname::release',
19
19
  'lscpu::flags',
20
+ 'distribution::version',
20
21
  ]).pluck(:name, :id)
21
22
  ]
22
23
  end
@@ -37,15 +38,23 @@ module ForemanInventoryUpload
37
38
  end
38
39
 
39
40
  def self.for_report(portal_user)
40
- org_ids = Organization
41
- .joins(:telemetry_configuration)
42
- .where(
43
- redhat_access_telemetry_configurations: {
44
- portal_user: portal_user,
45
- enable_telemetry: true,
46
- }
47
- ).pluck(:id)
48
- for_slice(Host.where(organization_id: org_ids)).in_batches(of: 1_000)
41
+ org_ids = organizations_for_user(portal_user).pluck(:id)
42
+ for_slice(Host.unscoped.where(organization_id: org_ids)).in_batches(of: 1_000)
43
+ end
44
+
45
+ def self.for_org(organization_id)
46
+ for_slice(Host.unscoped.where(organization_id: organization_id)).in_batches(of: 1_000)
47
+ end
48
+
49
+ def self.organizations_for_user(portal_user)
50
+ Organization
51
+ .joins(:telemetry_configuration)
52
+ .where(
53
+ redhat_access_telemetry_configurations: {
54
+ portal_user: portal_user,
55
+ enable_telemetry: true,
56
+ }
57
+ )
49
58
  end
50
59
  end
51
60
  end
@@ -23,14 +23,14 @@ module ForemanInventoryUpload
23
23
  first = true
24
24
  hosts_batch.each do |host|
25
25
  @stream.comma unless first
26
- first = false
27
- report_host(host)
26
+ first = false if report_host(host)
28
27
  end
29
28
  end
30
29
  end
31
30
  end
32
31
 
33
32
  def report_host(host)
33
+ return nil unless host&.subscription_facet&.pools&.first
34
34
  @stream.object do
35
35
  @stream.simple_field('display_name', host.name)
36
36
  @stream.simple_field('fqdn', host.fqdn)
@@ -56,13 +56,7 @@ module ForemanInventoryUpload
56
56
  @stream.object do
57
57
  @stream.simple_field('namespace', 'satellite')
58
58
  @stream.object_field('facts', :last) do
59
- @stream.simple_field('virtual_host_name', host.subscription_facet.hypervisor_host&.name)
60
- @stream.simple_field('virtual_host_uuid', host.subscription_facet.hypervisor_host&.subscription_facet&.uuid)
61
- if defined?(ForemanThemeSatellite)
62
- @stream.simple_field('satellite_version', ForemanThemeSatellite::SATELLITE_VERSION)
63
- end
64
- @stream.simple_field('satellite_instance_id', Foreman.respond_to?(:instance_id) ? Foreman.instance_id : nil)
65
- @stream.simple_field('organization_id', host.organization_id, :last)
59
+ report_satellite_facts(host)
66
60
  end
67
61
  end
68
62
  end
@@ -120,6 +114,19 @@ module ForemanInventoryUpload
120
114
  end
121
115
  end
122
116
 
117
+ def report_satellite_facts(host)
118
+ @stream.simple_field('virtual_host_name', host.subscription_facet.hypervisor_host&.name)
119
+ @stream.simple_field('virtual_host_uuid', host.subscription_facet.hypervisor_host&.subscription_facet&.uuid)
120
+ if defined?(ForemanThemeSatellite)
121
+ @stream.simple_field('satellite_version', ForemanThemeSatellite::SATELLITE_VERSION)
122
+ end
123
+ @stream.simple_field('system_purpose_usage', host.subscription_facet.purpose_usage)
124
+ @stream.simple_field('system_purpose_role', host.subscription_facet.purpose_role)
125
+ @stream.simple_field('distribution_version', fact_value(host, 'distribution::version'))
126
+ @stream.simple_field('satellite_instance_id', Foreman.respond_to?(:instance_id) ? Foreman.instance_id : nil)
127
+ @stream.simple_field('organization_id', host.organization_id, :last)
128
+ end
129
+
123
130
  def fact_value(host, fact_name)
124
131
  value_record = host.fact_values.find do |fact_value|
125
132
  fact_value.fact_name_id == ForemanInventoryUpload::Generators::Queries.fact_names[fact_name]