foreman_rh_cloud 2.0.10 → 2.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -2
- data/app/controllers/insights_cloud/hits_controller.rb +17 -0
- data/app/models/concerns/rh_cloud_host.rb +12 -0
- data/app/views/hosts/_insights_tab.html.erb +15 -0
- data/config/routes.rb +1 -0
- data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
- data/lib/foreman_inventory_upload/async/shell_process.rb +15 -9
- data/lib/foreman_inventory_upload/async/upload_report_job.rb +19 -1
- data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
- data/lib/foreman_inventory_upload/generators/queries.rb +2 -4
- data/lib/foreman_rh_cloud/engine.rb +10 -0
- data/lib/foreman_rh_cloud/version.rb +1 -1
- data/lib/tasks/insights.rake +15 -0
- data/lib/tasks/{generator.rake → rh_cloud_inventory.rake} +7 -1
- data/package.json +3 -1
- data/test/jobs/upload_report_job_test.rb +34 -0
- data/test/unit/metadata_generator_test.rb +2 -0
- data/test/unit/slice_generator_test.rb +17 -0
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/InventoryFilterReducer.js +13 -2
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/InventoryFilterReducer.test.js +10 -1
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/InventoryFilterReducer.test.js.snap +6 -0
- data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +3 -0
- data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
- data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
- data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
- data/webpack/ForemanRhCloudPages.js +2 -0
- data/webpack/ForemanRhCloudReducers.js +2 -0
- data/webpack/ForemanRhCloudSelectors.js +5 -0
- data/webpack/ForemanRhCloudTestHelpers.js +6 -1
- data/webpack/InsightsHostDetailsTab/InsightsTab.js +64 -0
- data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +30 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +3 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +26 -0
- data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +13 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +35 -0
- data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +30 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +20 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +41 -0
- data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
- data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
- data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
- data/webpack/InsightsHostDetailsTab/index.js +20 -0
- data/webpack/__mocks__/foremanReact/components/Layout/LayoutConstants.js +1 -0
- data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +1 -0
- data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +3 -0
- metadata +38 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: beb9afa713376417b3673803766cb7502efeabb52640e5d4a392eadf75b0f1b3
|
4
|
+
data.tar.gz: 1ee3c8b02c4748412ebdbc1547278460d19ced4fddfb55c913ecc38e07e71d2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 650e22398af35c4cc866c53d33988ca02d1c30909e62b6b9b6839c0c354d6d2ab56c6928b839b490119c350246520f9c8ca3d2aacc6c05d23bf7fbd22d6fd8e5
|
7
|
+
data.tar.gz: 8a501092f95cbb44def78a581fa70fff1d245b72af0332362c5efe3de2f3cc3db70e4842111644d0ed27c0e96a9458e28e0fbc8850e810efe4660a9bce39cb0c
|
data/README.md
CHANGED
@@ -13,11 +13,36 @@ for how to install Foreman plugins
|
|
13
13
|
|
14
14
|
### In Satellite
|
15
15
|
|
16
|
-
|
16
|
+
#### Inventory upload
|
17
|
+
|
18
|
+
In UI: Configure -> Inventory Upload -> Restart
|
19
|
+
|
20
|
+
From command-line:
|
17
21
|
|
18
22
|
export organization_id=1
|
19
23
|
export target=/var/lib/foreman/red_hat_inventory/generated_reports/
|
20
|
-
/usr/sbin/foreman-rake
|
24
|
+
/usr/sbin/foreman-rake rh_cloud_inventory:report:generate
|
25
|
+
|
26
|
+
#### Fetch hosts remediation data
|
27
|
+
|
28
|
+
In UI: Configure -> Insights -> Sync now
|
29
|
+
|
30
|
+
From command-line:
|
31
|
+
|
32
|
+
/usr/sbin/foreman-rake rh_cloud_inventory:sync
|
33
|
+
|
34
|
+
#### Synchronize inventory status
|
35
|
+
|
36
|
+
In UI: Configure -> Inventory Upload -> Sync inventory status
|
37
|
+
|
38
|
+
From command-line:
|
39
|
+
|
40
|
+
# all organizations
|
41
|
+
/usr/sbin/foreman-rake rh_cloud_insights:sync
|
42
|
+
|
43
|
+
# specific organization with id 1
|
44
|
+
export organization_id=1
|
45
|
+
/usr/sbin/foreman-rake rh_cloud_insights:sync
|
21
46
|
|
22
47
|
## TODO
|
23
48
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module InsightsCloud
|
2
|
+
class HitsController < ::ApplicationController
|
3
|
+
def index
|
4
|
+
host = Host.where(id: host_id_param).first
|
5
|
+
|
6
|
+
render json: {
|
7
|
+
hits: host.insights.hits,
|
8
|
+
}, status: :ok
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def host_id_param
|
14
|
+
params.require(:host_id)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RhCloudHost
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
has_many(
|
6
|
+
:inventory_upload_facts,
|
7
|
+
-> { where(fact_name_id: ForemanInventoryUpload::Generators::Queries.fact_names.values) },
|
8
|
+
class_name: 'FactValue',
|
9
|
+
:foreign_key => :host_id
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% content_for(:javascripts) do %>
|
2
|
+
<%= webpacked_plugins_js_for :'foreman_rh_cloud' %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for(:stylesheets) do %>
|
6
|
+
<%= webpacked_plugins_css_for :'foreman_rh_cloud' %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<div id="host_details_insights_react_container"></div>
|
10
|
+
<%= mount_react_component(
|
11
|
+
'InsightsHostDetailsTab',
|
12
|
+
'#host_details_insights_react_container',
|
13
|
+
{ hostID: host.id }.to_json,
|
14
|
+
flatten_data: true
|
15
|
+
) %>
|
data/config/routes.rb
CHANGED
@@ -8,24 +8,30 @@ module ForemanInventoryUpload
|
|
8
8
|
def perform(instance_label)
|
9
9
|
klass_name = self.class.name
|
10
10
|
logger.debug("Starting #{klass_name} with label #{instance_label}")
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
progress_output_for(instance_label) do |progress_output|
|
12
|
+
Open3.popen2e(hash_to_s(env), *preprocess_command(command)) do |_stdin, stdout_stderr, wait_thread|
|
13
|
+
progress_output.status = "Running in pid #{wait_thread.pid}"
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
stdout_stderr.each do |out_line|
|
16
|
+
progress_output.write_line(out_line)
|
17
|
+
end
|
18
18
|
|
19
|
-
|
19
|
+
progress_output.status = wait_thread.value.to_s
|
20
|
+
end
|
20
21
|
end
|
21
22
|
logger.debug("Finished job #{klass_name} with label #{instance_label}")
|
22
|
-
ensure
|
23
|
-
progress_output.close
|
24
23
|
end
|
25
24
|
|
26
25
|
def command
|
27
26
|
end
|
28
27
|
|
28
|
+
def progress_output_for(instance_label)
|
29
|
+
progress_output = ProgressOutput.register(instance_label)
|
30
|
+
yield(progress_output)
|
31
|
+
ensure
|
32
|
+
progress_output.close
|
33
|
+
end
|
34
|
+
|
29
35
|
def env
|
30
36
|
{}
|
31
37
|
end
|
@@ -8,15 +8,33 @@ module ForemanInventoryUpload
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def perform(filename, organization_id)
|
11
|
+
label = UploadReportJob.output_label(organization_id)
|
11
12
|
@filename = filename
|
12
13
|
@organization = Organization.find(organization_id)
|
13
14
|
|
15
|
+
if Setting[:content_disconnected]
|
16
|
+
progress_output_for(label) do |progress_output|
|
17
|
+
progress_output.write_line('Upload was stopped since disconnected mode setting is enabled for content on this instance.')
|
18
|
+
progress_output.status = "Task aborted, exit 1"
|
19
|
+
end
|
20
|
+
return
|
21
|
+
end
|
22
|
+
|
23
|
+
unless @organization.owner_details&.fetch('upstreamConsumer')&.fetch('idCert')
|
24
|
+
logger.info("Skipping organization '#{@organization}', no candlepin certificate defined.")
|
25
|
+
progress_output_for(label) do |progress_output|
|
26
|
+
progress_output.write_line("Skipping organization #{@organization}, no candlepin certificate defined.")
|
27
|
+
progress_output.status = "Task aborted, exit 1"
|
28
|
+
end
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
14
32
|
Tempfile.create([@organization.name, '.pem']) do |cer_file|
|
15
33
|
cer_file.write(rh_credentials[:cert])
|
16
34
|
cer_file.write(rh_credentials[:key])
|
17
35
|
cer_file.flush
|
18
36
|
@cer_path = cer_file.path
|
19
|
-
super(
|
37
|
+
super(label)
|
20
38
|
end
|
21
39
|
end
|
22
40
|
|
@@ -21,6 +21,9 @@ module ForemanInventoryUpload
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def render_report(metadata)
|
24
|
+
metadata ||= {}
|
25
|
+
metadata['foreman_rh_cloud_version'] = ForemanRhCloud::VERSION
|
26
|
+
|
24
27
|
@stream.object do
|
25
28
|
@stream.simple_field('report_id', Foreman.uuid)
|
26
29
|
@stream.simple_field('host_inventory_api_version', '1.0')
|
@@ -30,23 +30,21 @@ module ForemanInventoryUpload
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.for_slice(base)
|
33
|
-
fact_values = FactValue.where(fact_name_id: fact_names.values)
|
34
33
|
base
|
35
34
|
.joins(:subscription_facet)
|
36
|
-
.eager_load(:fact_values)
|
37
35
|
.preload(
|
38
36
|
:interfaces,
|
39
37
|
:installed_packages,
|
40
38
|
:content_facet,
|
41
39
|
:host_statuses,
|
40
|
+
:inventory_upload_facts,
|
42
41
|
subscription_facet: [:pools, :installed_products, :hypervisor_host]
|
43
42
|
)
|
44
|
-
.merge(fact_values)
|
45
43
|
end
|
46
44
|
|
47
45
|
def self.for_report(portal_user)
|
48
46
|
org_ids = organizations_for_user(portal_user).pluck(:id)
|
49
|
-
|
47
|
+
for_org(org_ids)
|
50
48
|
end
|
51
49
|
|
52
50
|
def self.for_org(organization_id)
|
@@ -66,9 +66,19 @@ module ForemanRhCloud
|
|
66
66
|
register_global_js_file 'subscriptions_extension'
|
67
67
|
|
68
68
|
register_custom_status(InventorySync::InventoryStatus)
|
69
|
+
|
70
|
+
extend_page 'hosts/show' do |context|
|
71
|
+
context.add_pagelet :main_tabs,
|
72
|
+
partial: 'hosts/insights_tab',
|
73
|
+
name: _('Insights'),
|
74
|
+
onlyif: proc { |host| host.insights }
|
75
|
+
end
|
69
76
|
end
|
70
77
|
|
71
78
|
::Katello::UINotifications::Subscriptions::ManifestImportSuccess.include ForemanInventoryUpload::Notifications::ManifestImportSuccessNotificationOverride if defined?(Katello)
|
79
|
+
|
80
|
+
::Host::Managed.include RhCloudHost
|
81
|
+
::Host::Base.include RhCloudHost
|
72
82
|
end
|
73
83
|
|
74
84
|
initializer "foreman_rh_cloud.set_dynflow.config.on_init", :before => :finisher_hook do |_app|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :rh_cloud_insights do
|
2
|
+
desc "Synchronize Insights inventory"
|
3
|
+
task sync: :environment do
|
4
|
+
if ! ENV['organization_id'].nil?
|
5
|
+
organizations = [ Organization.where(:id => ENV['organization_id']).first ]
|
6
|
+
else
|
7
|
+
organizations = Organization.all
|
8
|
+
end
|
9
|
+
|
10
|
+
organizations.each do |organization|
|
11
|
+
InventorySync::Async::InventoryFullSync.perform_now(organization)
|
12
|
+
puts "Synchronized inventory for organization '#{organization.name}'"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'tempfile'
|
2
2
|
|
3
|
-
namespace :
|
3
|
+
namespace :rh_cloud_inventory do
|
4
4
|
namespace :report do
|
5
5
|
desc 'Generate inventory report to be sent to Red Hat cloud'
|
6
6
|
task generate: :environment do
|
@@ -26,4 +26,10 @@ namespace :foreman_inventory_upload do
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
desc "Synchronize Insights hosts hits"
|
31
|
+
task sync: :environment do
|
32
|
+
InsightsCloud::Async::InsightsFullSync.perform_now()
|
33
|
+
puts "Synchronized Insights hosts hits data"
|
34
|
+
end
|
29
35
|
end
|
data/package.json
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"name": "foreman_rh_cloud",
|
3
|
-
"version": "
|
3
|
+
"version": "2.0.11",
|
4
4
|
"description": "Inventory Upload =============",
|
5
5
|
"main": "index.js",
|
6
6
|
"scripts": {
|
7
7
|
"lint": "tfm-lint --plugin -d /webpack",
|
8
|
+
"lint:spelling": "eslint ./",
|
8
9
|
"test": "tfm-test --plugin",
|
9
10
|
"test:watch": "tfm-test --plugin --watchAll",
|
10
11
|
"test:current": "tfm-test --plugin --watch",
|
@@ -32,6 +33,7 @@
|
|
32
33
|
"@theforeman/eslint-plugin-foreman": "^4.0.2",
|
33
34
|
"babel-eslint": "^10.0.0",
|
34
35
|
"eslint": "^6.7.2",
|
36
|
+
"eslint-plugin-spellcheck": "^0.0.17",
|
35
37
|
"prettier": "^1.13.5",
|
36
38
|
"raf": "^3.4.0",
|
37
39
|
"stylelint": "^9.3.0",
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test_plugin_helper'
|
2
|
+
|
3
|
+
class UploadReportJobTest < ActiveJob::TestCase
|
4
|
+
include FolderIsolation
|
5
|
+
|
6
|
+
test 'returns aborted state when disconnected' do
|
7
|
+
organization = FactoryBot.create(:organization)
|
8
|
+
Organization.any_instance.stubs(:owner_details).returns(
|
9
|
+
'upstreamConsumer' => {
|
10
|
+
'idCert' => 'TEST_CERT',
|
11
|
+
}
|
12
|
+
)
|
13
|
+
FactoryBot.create(:setting, :name => 'content_disconnected', :value => true)
|
14
|
+
|
15
|
+
ForemanInventoryUpload::Async::UploadReportJob.perform_now('', organization.id)
|
16
|
+
|
17
|
+
label = ForemanInventoryUpload::Async::UploadReportJob.output_label(organization.id)
|
18
|
+
progress_output = ForemanInventoryUpload::Async::ProgressOutput.get(label)
|
19
|
+
assert_match(/Upload was stopped/, progress_output.full_output)
|
20
|
+
assert_match(/exit 1/, progress_output.status)
|
21
|
+
end
|
22
|
+
|
23
|
+
test 'returns aborted state when no certificate defined on organization' do
|
24
|
+
organization = FactoryBot.create(:organization)
|
25
|
+
Organization.any_instance.expects(:owner_details).returns(nil)
|
26
|
+
|
27
|
+
ForemanInventoryUpload::Async::UploadReportJob.perform_now('', organization.id)
|
28
|
+
|
29
|
+
label = ForemanInventoryUpload::Async::UploadReportJob.output_label(organization.id)
|
30
|
+
progress_output = ForemanInventoryUpload::Async::ProgressOutput.get(label)
|
31
|
+
assert_match(/Skipping organization/, progress_output.full_output)
|
32
|
+
assert_match(/exit 1/, progress_output.status)
|
33
|
+
end
|
34
|
+
end
|
@@ -13,6 +13,8 @@ class MetadataGeneratorTest < ActiveSupport::TestCase
|
|
13
13
|
|
14
14
|
assert_not_nil actual['report_id']
|
15
15
|
assert_equal 'Satellite', actual['source']
|
16
|
+
assert_not_nil (actual_metadata = actual['source_metadata'])
|
17
|
+
assert_equal ForemanRhCloud::VERSION, actual_metadata['foreman_rh_cloud_version']
|
16
18
|
assert_equal({}, actual['report_slices'])
|
17
19
|
end
|
18
20
|
|
@@ -9,6 +9,7 @@ class ReportGeneratorTest < ActiveSupport::TestCase
|
|
9
9
|
|
10
10
|
@host = FactoryBot.create(
|
11
11
|
:host,
|
12
|
+
:redhat,
|
12
13
|
:with_subscription,
|
13
14
|
:with_content,
|
14
15
|
content_view: cv.first,
|
@@ -264,6 +265,22 @@ class ReportGeneratorTest < ActiveSupport::TestCase
|
|
264
265
|
assert_equal 1, generator.hosts_count
|
265
266
|
end
|
266
267
|
|
268
|
+
test 'include also hosts with non-redhat OS' do
|
269
|
+
os = @host.operatingsystem
|
270
|
+
os.name = 'Centos'
|
271
|
+
os.save!
|
272
|
+
|
273
|
+
# make a_host last
|
274
|
+
batch = ForemanInventoryUpload::Generators::Queries.for_org(@host.organization_id).first
|
275
|
+
generator = create_generator(batch)
|
276
|
+
|
277
|
+
json_str = generator.render
|
278
|
+
actual = JSON.parse(json_str.join("\n"))
|
279
|
+
|
280
|
+
assert_equal 'slice_123', actual['report_slice_id']
|
281
|
+
assert_equal 1, generator.hosts_count
|
282
|
+
end
|
283
|
+
|
267
284
|
test 'shows system_memory_bytes in bytes' do
|
268
285
|
FactoryBot.create(:fact_value, fact_name: fact_names['memory::memtotal'], value: '1', host: @host)
|
269
286
|
|
@@ -1,5 +1,8 @@
|
|
1
1
|
import Immutable from 'seamless-immutable';
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
LAYOUT_CHANGE_ORG,
|
4
|
+
LAYOUT_INITIALIZE,
|
5
|
+
} from 'foremanReact/components/Layout/LayoutConstants';
|
3
6
|
import {
|
4
7
|
INVENTORY_FILTER_UPDATE,
|
5
8
|
INVENTORY_FILTER_CLEAR,
|
@@ -12,7 +15,7 @@ const initialState = Immutable({
|
|
12
15
|
|
13
16
|
export default (
|
14
17
|
state = initialState,
|
15
|
-
{ type, payload: { filterTerm, org } = {} }
|
18
|
+
{ type, payload: { filterTerm, org, organization } = {} }
|
16
19
|
) => {
|
17
20
|
switch (type) {
|
18
21
|
case INVENTORY_FILTER_UPDATE:
|
@@ -30,6 +33,14 @@ export default (
|
|
30
33
|
filterTerm: term,
|
31
34
|
});
|
32
35
|
}
|
36
|
+
case LAYOUT_INITIALIZE: {
|
37
|
+
// Layout action changed in Jul 20 2020 - https://github.com/theforeman/foreman/commit/e4c39a7d8f8b50ba45ef63e46f6f6914b69f247a
|
38
|
+
const { title } = organization; // org was renamed
|
39
|
+
const term = title === ANY_ORGANIZATION ? '' : title;
|
40
|
+
return state.merge({
|
41
|
+
filterTerm: term,
|
42
|
+
});
|
43
|
+
}
|
33
44
|
default:
|
34
45
|
return state;
|
35
46
|
}
|
@@ -1,5 +1,8 @@
|
|
1
1
|
import { testReducerSnapshotWithFixtures } from '@theforeman/test';
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
LAYOUT_CHANGE_ORG,
|
4
|
+
LAYOUT_INITIALIZE,
|
5
|
+
} from 'foremanReact/components/Layout/LayoutConstants';
|
3
6
|
import reducer from '../InventoryFilterReducer';
|
4
7
|
import { filterTerm, org } from '../InventoryFilter.fixtures';
|
5
8
|
import {
|
@@ -29,6 +32,12 @@ const fixtures = {
|
|
29
32
|
payload: { org },
|
30
33
|
},
|
31
34
|
},
|
35
|
+
'should handle LAYOUT_INITIALIZE': {
|
36
|
+
action: {
|
37
|
+
type: LAYOUT_INITIALIZE,
|
38
|
+
payload: { organization: org },
|
39
|
+
},
|
40
|
+
},
|
32
41
|
};
|
33
42
|
|
34
43
|
describe('AccountList reducer', () =>
|