foreman_rh_cloud 1.0.4.1 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +1 -0
  3. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +14 -7
  4. data/app/models/setting/rh_cloud.rb +13 -0
  5. data/config/routes.rb +1 -0
  6. data/lib/foreman_inventory_upload.rb +12 -0
  7. data/lib/foreman_inventory_upload/async/async_helpers.rb +13 -0
  8. data/lib/foreman_inventory_upload/async/generate_all_reports_job.rb +8 -0
  9. data/lib/foreman_inventory_upload/async/shell_process.rb +3 -1
  10. data/lib/foreman_inventory_upload/generators/archived_report.rb +6 -3
  11. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +13 -0
  12. data/lib/foreman_inventory_upload/generators/queries.rb +2 -0
  13. data/lib/foreman_inventory_upload/generators/slice.rb +30 -10
  14. data/lib/foreman_rh_cloud/engine.rb +4 -0
  15. data/lib/foreman_rh_cloud/version.rb +1 -1
  16. data/test/controllers/accounts_controller_test.rb +8 -3
  17. data/test/controllers/uploads_controller_test.rb +13 -0
  18. data/test/unit/archived_report_generator_test.rb +1 -0
  19. data/test/unit/fact_helpers_test.rb +29 -0
  20. data/test/unit/slice_generator_test.rb +109 -12
  21. data/test/unit/slice_generator_test.rb.orig +280 -0
  22. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +2 -0
  23. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +2 -1
  24. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +8 -0
  25. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +2 -0
  26. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +11 -0
  27. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -1
  28. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +10 -0
  29. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +5 -2
  30. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +1 -0
  31. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.js +32 -0
  32. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +27 -0
  33. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +2 -0
  34. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcher.test.js +14 -0
  35. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +14 -0
  36. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcher.test.js.snap +38 -0
  37. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +14 -0
  38. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/autoUploadSwitcher.scss +3 -0
  39. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/index.js +17 -0
  40. data/webpack/ForemanInventoryUpload/Components/Dashboard/__tests__/DashboardIntegration.test.js +2 -1
  41. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +21 -0
  42. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/PageHeader.test.js +13 -0
  43. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +33 -0
  44. data/webpack/ForemanInventoryUpload/Components/PageHeader/index.js +1 -0
  45. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/ScheduledRun.fixtures.js +1 -0
  46. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/ScheduledRun.js +4 -2
  47. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/__tests__/ScheduledRun.test.js +0 -1
  48. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/__tests__/__snapshots__/ScheduledRun.test.js.snap +0 -2
  49. data/webpack/ForemanInventoryUpload/Components/ScheduledRun/index.js +12 -1
  50. data/webpack/ForemanInventoryUpload/Components/TabBody/__tests__/__snapshots__/TabBody.test.js.snap +1 -1
  51. data/webpack/ForemanInventoryUpload/ForemanInventoryUpload.js +5 -4
  52. data/webpack/ForemanInventoryUpload/__snapshots__/ForemanInventoryUpload.test.js.snap +6 -5
  53. metadata +22 -2
@@ -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
@@ -28,6 +28,8 @@ export const accountID = 'user@redhat.com';
28
28
 
29
29
  export const processStatusName = 'upload_report_status';
30
30
 
31
+ export const autoUploadEnabled = true;
32
+
31
33
  export const props = {
32
34
  accounts,
33
35
  fetchAccountsStatus: noop,
@@ -10,12 +10,13 @@ import {
10
10
  export const fetchAccountsStatus = () => async dispatch => {
11
11
  try {
12
12
  const {
13
- data: { accounts },
13
+ data: { accounts, autoUploadEnabled },
14
14
  } = await API.get('accounts');
15
15
  dispatch({
16
16
  type: INVENTORY_ACCOUNT_STATUS_POLLING,
17
17
  payload: {
18
18
  accounts,
19
+ autoUploadEnabled,
19
20
  },
20
21
  });
21
22
  } catch (error) {
@@ -5,6 +5,7 @@ import {
5
5
  INVENTORY_ACCOUNT_STATUS_POLLING_START,
6
6
  INVENTORY_PROCESS_RESTART,
7
7
  } from './AccountListConstants';
8
+ import { AUTO_UPLOAD_TOGGLE } from '../AutoUploadSwitcher/AutoUploadSwitcherConstants';
8
9
 
9
10
  const initialState = Immutable({
10
11
  accounts: {},
@@ -20,6 +21,7 @@ export default (state = initialState, action) => {
20
21
  accounts,
21
22
  accountID,
22
23
  processStatusName,
24
+ autoUploadEnabled,
23
25
  } = {},
24
26
  } = action;
25
27
 
@@ -28,6 +30,7 @@ export default (state = initialState, action) => {
28
30
  return state.merge({
29
31
  ...state,
30
32
  accounts,
33
+ autoUploadEnabled,
31
34
  error: null,
32
35
  });
33
36
  case INVENTORY_ACCOUNT_STATUS_POLLING_ERROR:
@@ -49,6 +52,11 @@ export default (state = initialState, action) => {
49
52
  [processStatusName]: 'Restarting...',
50
53
  },
51
54
  });
55
+ case AUTO_UPLOAD_TOGGLE:
56
+ return state.merge({
57
+ ...state,
58
+ autoUploadEnabled,
59
+ });
52
60
  default:
53
61
  return state;
54
62
  }
@@ -6,3 +6,5 @@ export const selectAccounts = state => selectAccountsList(state).accounts;
6
6
  export const selectPollingProcessID = state =>
7
7
  selectAccountsList(state).pollingProcessID;
8
8
  export const selectError = state => selectAccountsList(state).error;
9
+ export const selectAutoUploadEnabled = state =>
10
+ selectAccountsList(state).autoUploadEnabled;
@@ -14,7 +14,9 @@ import {
14
14
  pollingProcessID,
15
15
  accountID,
16
16
  processStatusName,
17
+ autoUploadEnabled,
17
18
  } from '../AccountList.fixtures';
19
+ import { AUTO_UPLOAD_TOGGLE } from '../../AutoUploadSwitcher/AutoUploadSwitcherConstants';
18
20
 
19
21
  const fixtures = {
20
22
  'should return the initial state': {},
@@ -23,6 +25,7 @@ const fixtures = {
23
25
  type: INVENTORY_ACCOUNT_STATUS_POLLING,
24
26
  payload: {
25
27
  accounts,
28
+ autoUploadEnabled,
26
29
  },
27
30
  },
28
31
  },
@@ -54,6 +57,14 @@ const fixtures = {
54
57
  },
55
58
  },
56
59
  },
60
+ 'should handle AUTO_UPLOAD_TOGGLE': {
61
+ action: {
62
+ type: AUTO_UPLOAD_TOGGLE,
63
+ payload: {
64
+ autoUploadEnabled,
65
+ },
66
+ },
67
+ },
57
68
  };
58
69
 
59
70
  describe('AccountList reducer', () =>
@@ -3,14 +3,20 @@ import {
3
3
  selectAccountsList,
4
4
  selectAccounts,
5
5
  selectPollingProcessID,
6
+ selectAutoUploadEnabled,
6
7
  } from '../AccountListSelectors';
7
- import { pollingProcessID, accounts } from '../AccountList.fixtures';
8
+ import {
9
+ pollingProcessID,
10
+ accounts,
11
+ autoUploadEnabled,
12
+ } from '../AccountList.fixtures';
8
13
 
9
14
  const state = {
10
15
  ForemanInventoryUpload: {
11
16
  accountsList: {
12
17
  accounts,
13
18
  pollingProcessID,
19
+ autoUploadEnabled,
14
20
  },
15
21
  },
16
22
  };
@@ -20,6 +26,8 @@ const fixtures = {
20
26
  'should return AccountList accounts': () => selectAccounts(state),
21
27
  'should return AccountList pollingProcessID': () =>
22
28
  selectPollingProcessID(state),
29
+ 'should return AccountList autoUploadEnabled': () =>
30
+ selectAutoUploadEnabled(state),
23
31
  };
24
32
 
25
33
  describe('AccountList selectors', () =>
@@ -1,5 +1,14 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`AccountList reducer should handle AUTO_UPLOAD_TOGGLE 1`] = `
4
+ Object {
5
+ "accounts": Object {},
6
+ "autoUploadEnabled": true,
7
+ "error": null,
8
+ "pollingProcessID": 0,
9
+ }
10
+ `;
11
+
3
12
  exports[`AccountList reducer should handle INVENTORY_ACCOUNT_STATUS_POLLING 1`] = `
4
13
  Object {
5
14
  "accounts": Object {
@@ -19,6 +28,7 @@ Object {
19
28
  "upload_report_status": "success",
20
29
  },
21
30
  },
31
+ "autoUploadEnabled": true,
22
32
  "error": null,
23
33
  "pollingProcessID": 0,
24
34
  }
@@ -1,7 +1,5 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`AccountList selectors should return AccountList pollingProcessID 1`] = `0`;
4
-
5
3
  exports[`AccountList selectors should return AccountList accounts 1`] = `
6
4
  Object {
7
5
  "Account1": Object {
@@ -22,6 +20,10 @@ Object {
22
20
  }
23
21
  `;
24
22
 
23
+ exports[`AccountList selectors should return AccountList autoUploadEnabled 1`] = `true`;
24
+
25
+ exports[`AccountList selectors should return AccountList pollingProcessID 1`] = `0`;
26
+
25
27
  exports[`AccountList selectors should return AccountsList 1`] = `
26
28
  Object {
27
29
  "accounts": Object {
@@ -41,6 +43,7 @@ Object {
41
43
  "upload_report_status": "success",
42
44
  },
43
45
  },
46
+ "autoUploadEnabled": true,
44
47
  "pollingProcessID": 0,
45
48
  }
46
49
  `;