foreman_rh_cloud 1.0.4 → 2.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -0
  3. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +1 -0
  4. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +14 -7
  5. data/app/models/setting/rh_cloud.rb +13 -0
  6. data/config/routes.rb +1 -0
  7. data/lib/foreman_inventory_upload.rb +12 -0
  8. data/lib/foreman_inventory_upload/async/async_helpers.rb +13 -0
  9. data/lib/foreman_inventory_upload/async/generate_all_reports_job.rb +8 -0
  10. data/lib/foreman_inventory_upload/async/shell_process.rb +3 -1
  11. data/lib/foreman_inventory_upload/async/upload_report_job.rb +1 -5
  12. data/lib/foreman_inventory_upload/generators/archived_report.rb +6 -3
  13. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +13 -0
  14. data/lib/foreman_inventory_upload/generators/queries.rb +2 -0
  15. data/lib/foreman_inventory_upload/generators/slice.rb +31 -11
  16. data/lib/foreman_rh_cloud/engine.rb +5 -1
  17. data/lib/foreman_rh_cloud/version.rb +1 -1
  18. data/package.json +20 -100
  19. data/test/controllers/accounts_controller_test.rb +8 -3
  20. data/test/controllers/uploads_controller_test.rb +13 -0
  21. data/test/factories/inventory_upload_factories.rb +13 -13
  22. data/test/unit/archived_report_generator_test.rb +1 -0
  23. data/test/unit/fact_helpers_test.rb +29 -0
  24. data/test/unit/slice_generator_test.rb +112 -15
  25. data/test/unit/slice_generator_test.rb.orig +280 -0
  26. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +2 -0
  27. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.stories.js +5 -14
  28. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +2 -1
  29. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +8 -0
  30. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +2 -0
  31. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/EmptyState/__tests__/EmptyState.test.js +1 -1
  32. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ErrorState/__tests__/ErrorState.test.js +1 -1
  33. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItem/__tests__/ListItem.test.js +1 -1
  34. data/webpack/ForemanInventoryUpload/Components/AccountList/Components/ListItemStatus/__tests__/ListItemStatus.test.js +1 -1
  35. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountList.test.js +1 -1
  36. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +1 -1
  37. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListIntegration.test.js +1 -1
  38. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -1
  39. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +10 -2
  40. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +10 -0
  41. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +5 -2
  42. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +1 -0
  43. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.js +32 -0
  44. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +27 -0
  45. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +2 -0
  46. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcher.test.js +14 -0
  47. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +14 -0
  48. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcher.test.js.snap +38 -0
  49. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +14 -0
  50. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/autoUploadSwitcher.scss +3 -0
  51. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/index.js +17 -0
  52. data/webpack/ForemanInventoryUpload/Components/Dashboard/Dashboard.fixtures.js +13 -9
  53. data/webpack/ForemanInventoryUpload/Components/Dashboard/Dashboard.stories.js +5 -15
  54. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/Dashboard.test.js +1 -2
  55. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardActions.test.js +15 -2
  56. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardIntegration.test.js +3 -2
  57. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardReducer.test.js +1 -1
  58. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardSelectors.test.js +1 -1
  59. data/webpack/ForemanInventoryUpload/Components/FileDownload/__tests__/FileDownload.test.js +1 -1
  60. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/__tests__/FullScreenModal.test.js +1 -1
  61. data/webpack/ForemanInventoryUpload/Components/NavContainer/NavContainer.fixtures.js +5 -2
  62. data/webpack/ForemanInventoryUpload/Components/NavContainer/__tests__/NavContainer.test.js +1 -2
  63. data/webpack/ForemanInventoryUpload/Components/NavContainer/__tests__/__snapshots__/NavContainer.test.js.snap +1 -1
  64. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +21 -0
  65. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/PageHeader.test.js +13 -0
  66. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +33 -0
  67. data/webpack/ForemanInventoryUpload/Components/PageHeader/index.js +1 -0
  68. data/webpack/ForemanInventoryUpload/Components/ReportGenerate/__tests__/ReportGenerate.test.js +1 -1
  69. data/webpack/ForemanInventoryUpload/Components/ReportUpload/__tests__/ReportUpload.test.js +1 -1
  70. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/ScheduledRun.fixtures.js +1 -0
  71. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/ScheduledRun.js +4 -2
  72. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/__tests__/ScheduledRun.test.js +1 -2
  73. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/__tests__/__snapshots__/ScheduledRun.test.js.snap +0 -2
  74. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/index.js +12 -1
  75. data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/StatusChart.test.js +1 -1
  76. data/webpack/ForemanInventoryUpload/Components/TabBody/__tests__/TabBody.test.js +1 -1
  77. data/webpack/ForemanInventoryUpload/Components/TabBody/__tests__/__snapshots__/TabBody.test.js.snap +1 -1
  78. data/webpack/ForemanInventoryUpload/Components/TabContainer/__tests__/TabContainer.test.js +1 -1
  79. data/webpack/ForemanInventoryUpload/Components/TabFooter/__tests__/TabFooter.test.js +1 -1
  80. data/webpack/ForemanInventoryUpload/Components/TabHeader/__tests__/TabHeader.test.js +1 -1
  81. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +1 -1
  82. data/webpack/ForemanInventoryUpload/Components/Terminal/__tests__/Terminal.test.js +1 -2
  83. data/webpack/ForemanInventoryUpload/ForemanInventoryUpload.js +5 -4
  84. data/webpack/ForemanInventoryUpload/ForemanInventoryUpload.test.js +1 -1
  85. data/webpack/ForemanInventoryUpload/__snapshots__/ForemanInventoryUpload.test.js.snap +6 -5
  86. metadata +22 -9
  87. data/webpack/stories/ForemanInventoryUploadReducers.js +0 -3
  88. data/webpack/stories/configureStore.js +0 -15
  89. data/webpack/stories/decorators/index.js +0 -1
  90. data/webpack/stories/decorators/withCardsDecorator.js +0 -14
  91. data/webpack/stories/index.js +0 -10
  92. data/webpack/stories/index.scss +0 -7
  93. data/webpack/test_setup.js +0 -6
@@ -14,12 +14,17 @@ class AccountsControllerTest < ActionController::TestCase
14
14
  upload_label = ForemanInventoryUpload::Async::UploadReportJob.output_label(test_org.id)
15
15
  upload_output = ForemanInventoryUpload::Async::ProgressOutput.register(upload_label)
16
16
  upload_output.status = 'upload_status_test'
17
+ FactoryBot.create(:setting, :name => 'allow_auto_inventory_upload', :value => true)
18
+ assert_equal true, Setting[:allow_auto_inventory_upload]
17
19
 
18
20
  get :index, session: set_session_user
19
21
 
20
22
  assert_response :success
21
- actual = JSON.parse(response.body)['accounts'][test_org.id.to_s]
22
- assert_equal 'generate_status_test', actual['generate_report_status']
23
- assert_equal 'upload_status_test', actual['upload_report_status']
23
+ actual = JSON.parse(response.body)
24
+ actual_account_statuses = actual['accounts'][test_org.id.to_s]
25
+ assert_equal 'generate_status_test', actual_account_statuses['generate_report_status']
26
+ assert_equal 'upload_status_test', actual_account_statuses['upload_report_status']
27
+
28
+ assert_equal true, actual['autoUploadEnabled']
24
29
  end
25
30
  end
@@ -18,4 +18,17 @@ class UploadsControllerTest < ActionController::TestCase
18
18
  actual = JSON.parse(response.body)
19
19
  assert_equal 'test output', actual['output']
20
20
  end
21
+
22
+ test 'should update allow_auto_inventory_upload setting' do
23
+ FactoryBot.create(:setting, :name => 'allow_auto_inventory_upload', :settings_type => "boolean", :category => "Setting::RhCloud", :default => false, :value => false)
24
+
25
+ assert_equal false, Setting[:allow_auto_inventory_upload]
26
+
27
+ post :auto_upload, params: { value: true }, session: set_session_user
28
+
29
+ assert_response :success
30
+ actual = JSON.parse(response.body)
31
+ assert_equal true, actual['autoUploadEnabled']
32
+ assert_equal true, Setting[:allow_auto_inventory_upload]
33
+ end
21
34
  end
@@ -1,16 +1,16 @@
1
1
  # redefine katello factories, as long as katello is not compatible with dynamic properties
2
2
  FactoryBot.define do
3
3
  factory :katello_organization, :class => "Organization" do
4
- type {"Organization"}
4
+ type { "Organization" }
5
5
  sequence(:name) { |n| "Organization#{n}" }
6
6
  sequence(:label) { |n| "org#{n}" }
7
7
  sequence(:id) { |n| n }
8
8
 
9
9
  trait :acme_corporation do
10
- name {"ACME_Corporation"}
11
- type {"Organization"}
12
- description {"This is the first Organization."}
13
- label {"acme_corporation_label"}
10
+ name { "ACME_Corporation" }
11
+ type { "Organization" }
12
+ description { "This is the first Organization." }
13
+ label { "acme_corporation_label" }
14
14
  end
15
15
 
16
16
  trait :with_library do
@@ -24,11 +24,11 @@ end
24
24
  FactoryBot.define do
25
25
  factory :katello_content_view, :class => Katello::ContentView do
26
26
  sequence(:name) { |n| "Database#{n}" }
27
- description {"This content view is for database content"}
27
+ description { "This content view is for database content" }
28
28
  association :organization, :factory => :katello_organization
29
29
 
30
30
  trait :composite do
31
- composite {true}
31
+ composite { true }
32
32
  end
33
33
  end
34
34
  end
@@ -50,23 +50,23 @@ end
50
50
  FactoryBot.define do
51
51
  factory :katello_subscription_facets, :aliases => [:subscription_facet], :class => ::Katello::Host::SubscriptionFacet do
52
52
  sequence(:uuid) { |n| "uuid-#{n}-#{rand(500)}" }
53
- facts { {'memory.memtotal' => "12 GB"} }
53
+ facts { { 'memory.memtotal' => "12 GB" } }
54
54
  end
55
55
  end
56
56
 
57
57
  FactoryBot.define do
58
58
  factory :katello_pool, :class => Katello::Pool do
59
- active {true}
60
- end_date {Date.today + 1.year}
59
+ active { true }
60
+ end_date { Date.today + 1.year }
61
61
  end
62
62
  end
63
63
 
64
64
  FactoryBot.modify do
65
65
  factory :host do
66
66
  transient do
67
- content_view {nil}
68
- lifecycle_environment {nil}
69
- content_source {nil}
67
+ content_view { nil }
68
+ lifecycle_environment { nil }
69
+ content_source { nil }
70
70
  end
71
71
 
72
72
  trait :with_content do
@@ -49,6 +49,7 @@ class ArchivedReportGeneratorTest < ActiveSupport::TestCase
49
49
  test_org = FactoryBot.create(:organization)
50
50
 
51
51
  ForemanInventoryUpload::Generators::Queries.expects(:for_org).with(test_org.id).returns(batches)
52
+ ForemanInventoryUpload::Generators::Slice.any_instance.stubs(:golden_ticket?).returns(false)
52
53
  Dir.mktmpdir do |tmpdir|
53
54
  target = File.join(tmpdir, 'test.tar.gz')
54
55
  generator = ForemanInventoryUpload::Generators::ArchivedReport.new(target, Logger.new(STDOUT))
@@ -0,0 +1,29 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class FactHelpersTest < ActiveSupport::TestCase
4
+ class FactsHelpersTestStub
5
+ include ForemanInventoryUpload::Generators::FactHelpers
6
+ end
7
+
8
+ setup do
9
+ @instance = FactsHelpersTestStub.new
10
+
11
+ @org = FactoryBot.create(:organization)
12
+ end
13
+
14
+ test 'golden_ticket uses golden_ticket method when defined' do
15
+ @org.expects(:golden_ticket?).returns(true)
16
+
17
+ actual = @instance.golden_ticket?(@org)
18
+
19
+ assert actual
20
+ end
21
+
22
+ test 'golden_ticket uses content_access_mode method when golden_ticket not defined' do
23
+ @org.expects(:content_access_mode).returns('org_environment')
24
+
25
+ actual = @instance.golden_ticket?(@org)
26
+
27
+ assert actual
28
+ end
29
+ end
@@ -16,7 +16,9 @@ class ReportGeneratorTest < ActiveSupport::TestCase
16
16
  organization: env.organization
17
17
  )
18
18
 
19
- @host.subscription_facet.pools << FactoryBot.create(:katello_pool, account_number: '1234', cp_id: 1)
19
+ @host.organization.pools << FactoryBot.create(:katello_pool, account_number: '1234', cp_id: 1)
20
+
21
+ ForemanInventoryUpload::Generators::Queries.instance_variable_set(:@fact_names, nil)
20
22
  end
21
23
 
22
24
  def interesting_facts
@@ -30,9 +32,12 @@ class ReportGeneratorTest < ActiveSupport::TestCase
30
32
  'dmi::bios::vendor',
31
33
  'dmi::bios::version',
32
34
  'dmi::bios::relase_date',
33
- 'distribution::name',
34
35
  'uname::release',
35
36
  'lscpu::flags',
37
+ 'distribution::name',
38
+ 'distribution::version',
39
+ 'distribution::id',
40
+ 'virt::is_guest',
36
41
  ]
37
42
  end
38
43
 
@@ -46,22 +51,22 @@ class ReportGeneratorTest < ActiveSupport::TestCase
46
51
 
47
52
  test 'generates a report for a single host' do
48
53
  batch = Host.where(id: @host.id).in_batches.first
49
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
54
+ generator = create_generator(batch)
50
55
 
51
56
  json_str = generator.render
52
57
  actual = JSON.parse(json_str.join("\n"))
53
58
 
54
59
  assert_equal 'slice_123', actual['report_slice_id']
55
60
  assert_not_nil(actual_host = actual['hosts'].first)
56
- assert_equal @host.name, actual_host['display_name']
57
61
  assert_equal @host.fqdn, actual_host['fqdn']
58
62
  assert_equal '1234', actual_host['account']
63
+ assert_equal 1, generator.hosts_count
59
64
  end
60
65
 
61
66
  test 'generates a report with satellite facts' do
62
67
  Foreman.expects(:instance_id).twice.returns('satellite-id')
63
68
  batch = Host.where(id: @host.id).in_batches.first
64
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice-123')
69
+ generator = create_generator(batch)
65
70
 
66
71
  json_str = generator.render
67
72
  actual = JSON.parse(json_str.join("\n"))
@@ -72,13 +77,13 @@ class ReportGeneratorTest < ActiveSupport::TestCase
72
77
  assert_equal 'satellite-id', satellite_facts['satellite_instance_id']
73
78
  assert_equal @host.organization_id, satellite_facts['organization_id']
74
79
 
75
- instance_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'satellite_instance_id'}
80
+ instance_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'satellite_instance_id' }
76
81
  assert_not_nil instance_id_tag
77
82
  assert_equal 'satellite-id', instance_id_tag['value']
78
83
 
79
- org_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'organization_id'}
84
+ org_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'organization_id' }
80
85
  assert_not_nil org_id_tag
81
- assert_equal @host.organization_id, org_id_tag['value']
86
+ assert_equal @host.organization_id.to_s, org_id_tag['value']
82
87
 
83
88
  version = satellite_facts['satellite_version']
84
89
  if defined?(ForemanThemeSatellite)
@@ -102,14 +107,13 @@ class ReportGeneratorTest < ActiveSupport::TestCase
102
107
  @host.save!
103
108
 
104
109
  batch = Host.where(id: @host.id).in_batches.first
105
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
110
+ generator = create_generator(batch)
106
111
 
107
112
  json_str = generator.render
108
113
  actual = JSON.parse(json_str.join("\n"))
109
114
 
110
115
  assert_equal 'slice_123', actual['report_slice_id']
111
116
  assert_not_nil(actual_host = actual['hosts'].first)
112
- assert_equal @host.name, actual_host['display_name']
113
117
  assert_equal @host.fqdn, actual_host['fqdn']
114
118
  assert_not_nil(host_facts = actual_host['facts']&.first)
115
119
  assert_equal 'satellite', host_facts['namespace']
@@ -124,14 +128,13 @@ class ReportGeneratorTest < ActiveSupport::TestCase
124
128
  @host.subscription_facet.save!
125
129
 
126
130
  batch = Host.where(id: @host.id).in_batches.first
127
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
131
+ generator = create_generator(batch)
128
132
 
129
133
  json_str = generator.render
130
134
  actual = JSON.parse(json_str.join("\n"))
131
135
 
132
136
  assert_equal 'slice_123', actual['report_slice_id']
133
137
  assert_not_nil(actual_host = actual['hosts'].first)
134
- assert_equal @host.name, actual_host['display_name']
135
138
  assert_equal @host.fqdn, actual_host['fqdn']
136
139
  assert_not_nil(host_facts = actual_host['facts']&.first)
137
140
  assert_equal 'satellite', host_facts['namespace']
@@ -140,6 +143,22 @@ class ReportGeneratorTest < ActiveSupport::TestCase
140
143
  assert_equal 'test_role', fact_values['system_purpose_role']
141
144
  end
142
145
 
146
+ test 'generates a report for a golden ticket' do
147
+ batch = Host.where(id: @host.id).in_batches.first
148
+ generator = create_generator(batch) do |generator|
149
+ generator.stubs(:golden_ticket?).returns(true)
150
+ end
151
+
152
+ json_str = generator.render
153
+ actual = JSON.parse(json_str.join("\n"))
154
+
155
+ assert_equal 'slice_123', actual['report_slice_id']
156
+ assert_not_nil(actual_host = actual['hosts'].first)
157
+ assert_equal @host.fqdn, actual_host['fqdn']
158
+ assert_equal '1234', actual_host['account']
159
+ assert_equal 1, generator.hosts_count
160
+ end
161
+
143
162
  test 'skips hosts without subscription' do
144
163
  a_host = FactoryBot.create(
145
164
  :host,
@@ -148,23 +167,23 @@ class ReportGeneratorTest < ActiveSupport::TestCase
148
167
 
149
168
  # make a_host last
150
169
  batch = Host.where(id: [@host.id, a_host.id]).order(:name).in_batches.first
151
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
170
+ generator = create_generator(batch)
152
171
 
153
172
  json_str = generator.render
154
173
  actual = JSON.parse(json_str.join("\n"))
155
174
 
156
175
  assert_equal 'slice_123', actual['report_slice_id']
157
176
  assert_not_nil(actual_host = actual['hosts'].first)
158
- assert_equal @host.name, actual_host['display_name']
159
177
  assert_equal @host.fqdn, actual_host['fqdn']
160
178
  assert_equal '1234', actual_host['account']
179
+ assert_equal 1, generator.hosts_count
161
180
  end
162
181
 
163
182
  test 'shows system_memory_bytes in bytes' do
164
183
  FactoryBot.create(:fact_value, fact_name: fact_names['memory::memtotal'], value: '1', host: @host)
165
184
 
166
185
  batch = Host.where(id: @host.id).in_batches.first
167
- generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
186
+ generator = create_generator(batch)
168
187
 
169
188
  json_str = generator.render
170
189
  actual = JSON.parse(json_str.join("\n"))
@@ -174,4 +193,82 @@ class ReportGeneratorTest < ActiveSupport::TestCase
174
193
  assert_not_nil(actual_profile = actual_host['system_profile'])
175
194
  assert_equal 1024, actual_profile['system_memory_bytes']
176
195
  end
196
+
197
+ test 'reports an account for hosts with multiple pools' do
198
+ first_pool = @host.organization.pools.first
199
+ second_pool = FactoryBot.create(:katello_pool, account_number: nil, cp_id: 2)
200
+ new_org = FactoryBot.create(:organization, pools: [first_pool, second_pool])
201
+ @host.organization = new_org
202
+ @host.save!
203
+
204
+ batch = Host.where(id: @host.id).in_batches.first
205
+ generator = create_generator(batch)
206
+
207
+ json_str = generator.render
208
+ actual = JSON.parse(json_str.join("\n"))
209
+
210
+ assert_equal 'slice_123', actual['report_slice_id']
211
+ assert_not_nil(actual_host = actual['hosts'].first)
212
+ assert_not_nil(actual_host['account'])
213
+ assert_not_empty(actual_host['account'])
214
+ end
215
+
216
+ test 'Generates os_release with version and id' do
217
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::name'], value: 'Red Hat Test Linux', host: @host)
218
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::version'], value: '7.1', host: @host)
219
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::id'], value: 'TestId', host: @host)
220
+
221
+ batch = Host.where(id: @host.id).in_batches.first
222
+ generator = create_generator(batch)
223
+
224
+ json_str = generator.render
225
+ actual = JSON.parse(json_str.join("\n"))
226
+
227
+ assert_equal 'slice_123', actual['report_slice_id']
228
+ assert_not_nil(actual_host = actual['hosts'].first)
229
+ assert_not_nil(actual_profile = actual_host['system_profile'])
230
+ assert_equal 'Red Hat Test Linux 7.1 (TestId)', actual_profile['os_release']
231
+ end
232
+
233
+ test 'sets infrastructure_type to "virtual" based on virt.is_guest fact' do
234
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::is_guest'], value: true, host: @host)
235
+
236
+ batch = Host.where(id: @host.id).in_batches.first
237
+ generator = create_generator(batch)
238
+
239
+ json_str = generator.render
240
+ actual = JSON.parse(json_str.join("\n"))
241
+
242
+ assert_equal 'slice_123', actual['report_slice_id']
243
+ assert_not_nil(actual_host = actual['hosts'].first)
244
+ assert_not_nil(actual_profile = actual_host['system_profile'])
245
+ assert_equal 'virtual', actual_profile['infrastructure_type']
246
+ end
247
+
248
+ test 'sets infrastructure_type to "physical" based on virt.is_guest fact' do
249
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::is_guest'], value: false, host: @host)
250
+
251
+ batch = Host.where(id: @host.id).in_batches.first
252
+ generator = create_generator(batch)
253
+
254
+ json_str = generator.render
255
+ actual = JSON.parse(json_str.join("\n"))
256
+
257
+ assert_equal 'slice_123', actual['report_slice_id']
258
+ assert_not_nil(actual_host = actual['hosts'].first)
259
+ assert_not_nil(actual_profile = actual_host['system_profile'])
260
+ assert_equal 'physical', actual_profile['infrastructure_type']
261
+ end
262
+
263
+ private
264
+
265
+ def create_generator(batch, name = 'slice_123')
266
+ generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], name)
267
+ if block_given?
268
+ yield(generator)
269
+ else
270
+ generator.stubs(:golden_ticket?).returns(false)
271
+ end
272
+ generator
273
+ end
177
274
  end
@@ -0,0 +1,280 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class ReportGeneratorTest < ActiveSupport::TestCase
4
+ setup do
5
+ User.current = User.find_by(login: 'secret_admin')
6
+
7
+ env = FactoryBot.create(:katello_k_t_environment)
8
+ cv = env.content_views << FactoryBot.create(:katello_content_view, organization: env.organization)
9
+
10
+ @host = FactoryBot.create(
11
+ :host,
12
+ :with_subscription,
13
+ :with_content,
14
+ content_view: cv.first,
15
+ lifecycle_environment: env,
16
+ organization: env.organization
17
+ )
18
+
19
+ @host.organization.pools << FactoryBot.create(:katello_pool, account_number: '1234', cp_id: 1)
20
+
21
+ ForemanInventoryUpload::Generators::Queries.instance_variable_set(:@fact_names, nil)
22
+ end
23
+
24
+ def interesting_facts
25
+ [
26
+ 'dmi::system::uuid',
27
+ 'virt::uuid',
28
+ 'cpu::cpu(s)',
29
+ 'cpu::cpu_socket(s)',
30
+ 'cpu::core(s)_per_socket',
31
+ 'memory::memtotal',
32
+ 'dmi::bios::vendor',
33
+ 'dmi::bios::version',
34
+ 'dmi::bios::relase_date',
35
+ 'uname::release',
36
+ 'lscpu::flags',
37
+ 'distribution::name',
38
+ 'distribution::version',
39
+ 'distribution::id',
40
+ 'virt::is_guest',
41
+ ]
42
+ end
43
+
44
+ def fact_names
45
+ @fact_names ||= Hash[
46
+ interesting_facts.map do |fact|
47
+ [fact, FactoryBot.create(:fact_name, name: fact, type: 'Katello::RhsmFactName')]
48
+ end
49
+ ]
50
+ end
51
+
52
+ test 'generates a report for a single host' do
53
+ batch = Host.where(id: @host.id).in_batches.first
54
+ generator = create_generator(batch)
55
+
56
+ json_str = generator.render
57
+ actual = JSON.parse(json_str.join("\n"))
58
+
59
+ assert_equal 'slice_123', actual['report_slice_id']
60
+ assert_not_nil(actual_host = actual['hosts'].first)
61
+ assert_equal @host.name, actual_host['display_name']
62
+ assert_equal @host.fqdn, actual_host['fqdn']
63
+ assert_equal '1234', actual_host['account']
64
+ assert_equal 1, generator.hosts_count
65
+ end
66
+
67
+ test 'generates a report with satellite facts' do
68
+ Foreman.expects(:instance_id).twice.returns('satellite-id')
69
+ batch = Host.where(id: @host.id).in_batches.first
70
+ generator = create_generator(batch)
71
+
72
+ json_str = generator.render
73
+ actual = JSON.parse(json_str.join("\n"))
74
+
75
+ facts = actual['hosts'].first['facts'].first
76
+ assert_equal 'satellite', facts['namespace']
77
+ satellite_facts = facts['facts']
78
+ assert_equal 'satellite-id', satellite_facts['satellite_instance_id']
79
+ assert_equal @host.organization_id, satellite_facts['organization_id']
80
+
81
+ instance_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'satellite_instance_id' }
82
+ assert_not_nil instance_id_tag
83
+ assert_equal 'satellite-id', instance_id_tag['value']
84
+
85
+ org_id_tag = actual['hosts'].first['tags'].find { |tag| tag['namespace'] == 'satellite' && tag['key'] == 'organization_id' }
86
+ assert_not_nil org_id_tag
87
+ assert_equal @host.organization_id.to_s, org_id_tag['value']
88
+
89
+ version = satellite_facts['satellite_version']
90
+ if defined?(ForemanThemeSatellite)
91
+ assert_equal ForemanThemeSatellite::SATELLITE_VERSION, version
92
+ else
93
+ assert_nil version
94
+ end
95
+ end
96
+
97
+ test 'generates a report for a host with hypervisor' do
98
+ hypervisor_host = FactoryBot.create(
99
+ :host,
100
+ :with_subscription,
101
+ :with_content,
102
+ content_view: @host.content_view,
103
+ lifecycle_environment: @host.lifecycle_environment,
104
+ organization: @host.organization
105
+ )
106
+
107
+ @host.subscription_facet.hypervisor_host = hypervisor_host
108
+ @host.save!
109
+
110
+ batch = Host.where(id: @host.id).in_batches.first
111
+ generator = create_generator(batch)
112
+
113
+ json_str = generator.render
114
+ actual = JSON.parse(json_str.join("\n"))
115
+
116
+ assert_equal 'slice_123', actual['report_slice_id']
117
+ assert_not_nil(actual_host = actual['hosts'].first)
118
+ assert_equal @host.name, actual_host['display_name']
119
+ assert_equal @host.fqdn, actual_host['fqdn']
120
+ assert_not_nil(host_facts = actual_host['facts']&.first)
121
+ assert_equal 'satellite', host_facts['namespace']
122
+ assert_not_nil(fact_values = host_facts['facts'])
123
+ assert_equal hypervisor_host.name, fact_values['virtual_host_name']
124
+ assert_equal hypervisor_host.subscription_facet.uuid, fact_values['virtual_host_uuid']
125
+ end
126
+
127
+ test 'generates a report with system purpose' do
128
+ @host.subscription_facet.purpose_usage = 'test_usage'
129
+ @host.subscription_facet.purpose_role = 'test_role'
130
+ @host.subscription_facet.save!
131
+
132
+ batch = Host.where(id: @host.id).in_batches.first
133
+ generator = create_generator(batch)
134
+
135
+ json_str = generator.render
136
+ actual = JSON.parse(json_str.join("\n"))
137
+
138
+ assert_equal 'slice_123', actual['report_slice_id']
139
+ assert_not_nil(actual_host = actual['hosts'].first)
140
+ assert_equal @host.name, actual_host['display_name']
141
+ assert_equal @host.fqdn, actual_host['fqdn']
142
+ assert_not_nil(host_facts = actual_host['facts']&.first)
143
+ assert_equal 'satellite', host_facts['namespace']
144
+ assert_not_nil(fact_values = host_facts['facts'])
145
+ assert_equal 'test_usage', fact_values['system_purpose_usage']
146
+ assert_equal 'test_role', fact_values['system_purpose_role']
147
+ end
148
+
149
+ test 'generates a report for a golden ticket' do
150
+ batch = Host.where(id: @host.id).in_batches.first
151
+ generator = create_generator(batch) do |generator|
152
+ generator.stubs(:golden_ticket?).returns(true)
153
+ end
154
+
155
+ json_str = generator.render
156
+ actual = JSON.parse(json_str.join("\n"))
157
+
158
+ assert_equal 'slice_123', actual['report_slice_id']
159
+ assert_not_nil(actual_host = actual['hosts'].first)
160
+ assert_equal @host.name, actual_host['display_name']
161
+ assert_equal @host.fqdn, actual_host['fqdn']
162
+ assert_equal '1234', actual_host['account']
163
+ assert_equal 1, generator.hosts_count
164
+ end
165
+
166
+ test 'skips hosts without subscription' do
167
+ a_host = FactoryBot.create(
168
+ :host,
169
+ organization: @host.organization
170
+ )
171
+
172
+ # make a_host last
173
+ batch = Host.where(id: [@host.id, a_host.id]).order(:name).in_batches.first
174
+ generator = create_generator(batch)
175
+
176
+ json_str = generator.render
177
+ actual = JSON.parse(json_str.join("\n"))
178
+
179
+ assert_equal 'slice_123', actual['report_slice_id']
180
+ assert_not_nil(actual_host = actual['hosts'].first)
181
+ assert_equal @host.name, actual_host['display_name']
182
+ assert_equal @host.fqdn, actual_host['fqdn']
183
+ assert_equal '1234', actual_host['account']
184
+ assert_equal 1, generator.hosts_count
185
+ end
186
+
187
+ test 'shows system_memory_bytes in bytes' do
188
+ FactoryBot.create(:fact_value, fact_name: fact_names['memory::memtotal'], value: '1', host: @host)
189
+
190
+ batch = Host.where(id: @host.id).in_batches.first
191
+ generator = create_generator(batch)
192
+
193
+ json_str = generator.render
194
+ actual = JSON.parse(json_str.join("\n"))
195
+
196
+ assert_equal 'slice_123', actual['report_slice_id']
197
+ assert_not_nil(actual_host = actual['hosts'].first)
198
+ assert_not_nil(actual_profile = actual_host['system_profile'])
199
+ assert_equal 1024, actual_profile['system_memory_bytes']
200
+ end
201
+
202
+ test 'reports an account for hosts with multiple pools' do
203
+ first_pool = @host.organization.pools.first
204
+ second_pool = FactoryBot.create(:katello_pool, account_number: nil, cp_id: 2)
205
+ new_org = FactoryBot.create(:organization, pools: [first_pool, second_pool])
206
+ @host.organization = new_org
207
+ @host.save!
208
+
209
+ batch = Host.where(id: @host.id).in_batches.first
210
+ generator = create_generator(batch)
211
+
212
+ json_str = generator.render
213
+ actual = JSON.parse(json_str.join("\n"))
214
+
215
+ assert_equal 'slice_123', actual['report_slice_id']
216
+ assert_not_nil(actual_host = actual['hosts'].first)
217
+ assert_not_nil(actual_host['account'])
218
+ assert_not_empty(actual_host['account'])
219
+ end
220
+
221
+ test 'Generates os_release with version and id' do
222
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::name'], value: 'Red Hat Test Linux', host: @host)
223
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::version'], value: '7.1', host: @host)
224
+ FactoryBot.create(:fact_value, fact_name: fact_names['distribution::id'], value: 'TestId', host: @host)
225
+
226
+ batch = Host.where(id: @host.id).in_batches.first
227
+ generator = create_generator(batch)
228
+
229
+ json_str = generator.render
230
+ actual = JSON.parse(json_str.join("\n"))
231
+
232
+ assert_equal 'slice_123', actual['report_slice_id']
233
+ assert_not_nil(actual_host = actual['hosts'].first)
234
+ assert_not_nil(actual_profile = actual_host['system_profile'])
235
+ assert_equal 'Red Hat Test Linux 7.1 (TestId)', actual_profile['os_release']
236
+ end
237
+
238
+ <<<<<<< HEAD
239
+ test 'sets infrastructure_type to "virtual" based on virt.is_guest fact' do
240
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::is_guest'], value: true, host: @host)
241
+
242
+ batch = Host.where(id: @host.id).in_batches.first
243
+ generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
244
+
245
+ json_str = generator.render
246
+ actual = JSON.parse(json_str.join("\n"))
247
+
248
+ assert_equal 'slice_123', actual['report_slice_id']
249
+ assert_not_nil(actual_host = actual['hosts'].first)
250
+ assert_not_nil(actual_profile = actual_host['system_profile'])
251
+ assert_equal 'virtual', actual_profile['infrastructure_type']
252
+ end
253
+
254
+ test 'sets infrastructure_type to "physical" based on virt.is_guest fact' do
255
+ FactoryBot.create(:fact_value, fact_name: fact_names['virt::is_guest'], value: false, host: @host)
256
+
257
+ batch = Host.where(id: @host.id).in_batches.first
258
+ generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], 'slice_123')
259
+
260
+ json_str = generator.render
261
+ actual = JSON.parse(json_str.join("\n"))
262
+
263
+ assert_equal 'slice_123', actual['report_slice_id']
264
+ assert_not_nil(actual_host = actual['hosts'].first)
265
+ assert_not_nil(actual_profile = actual_host['system_profile'])
266
+ assert_equal 'physical', actual_profile['infrastructure_type']
267
+ =======
268
+ private
269
+
270
+ def create_generator(batch, name = 'slice_123')
271
+ generator = ForemanInventoryUpload::Generators::Slice.new(batch, [], name)
272
+ if block_given?
273
+ yield(generator)
274
+ else
275
+ generator.stubs(:golden_ticket?).returns(false)
276
+ end
277
+ generator
278
+ >>>>>>> Add support fo golden ticket
279
+ end
280
+ end