foreman_rh_cloud 0.9.8 → 0.9.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -0
  3. data/app/controllers/foreman_inventory_upload/accounts_controller.rb +3 -0
  4. data/app/controllers/foreman_inventory_upload/tasks_controller.rb +25 -0
  5. data/app/controllers/foreman_inventory_upload/uploads_controller.rb +18 -0
  6. data/app/controllers/insights_cloud/hits_controller.rb +17 -0
  7. data/app/controllers/insights_cloud/settings_controller.rb +24 -0
  8. data/app/controllers/insights_cloud/tasks_controller.rb +1 -2
  9. data/app/helpers/foreman_inventory_upload_host_helper.rb +10 -2
  10. data/app/models/concerns/rh_cloud_host.rb +15 -0
  11. data/app/models/insights_facet.rb +5 -1
  12. data/app/models/insights_hit.rb +1 -1
  13. data/app/models/inventory_sync/inventory_status.rb +30 -0
  14. data/app/models/setting/rh_cloud.rb +4 -1
  15. data/app/overrides/hosts_list.rb +1 -1
  16. data/app/services/foreman_rh_cloud/cloud_auth.rb +28 -0
  17. data/app/views/foreman_rh_cloud/react/insights_cloud.html.erb +6 -1
  18. data/app/views/foreman_rh_cloud/react/inventory_upload.html.erb +1 -1
  19. data/app/views/hosts/_insights_tab.html.erb +15 -0
  20. data/config/routes.rb +6 -0
  21. data/db/migrate/20200727111529_add_uuid_column_to_insights_facets.foreman_rh_cloud.rb +5 -0
  22. data/db/migrate/20201007115752_add_hits_count_to_insights_facets_table.foreman_rh_cloud.rb +5 -0
  23. data/db/migrate/20201007121540_setup_hits_count_cache.foreman_rh_cloud.rb +10 -0
  24. data/lib/foreman_inventory_upload.rb +4 -0
  25. data/lib/foreman_inventory_upload/async/generate_report_job.rb +1 -1
  26. data/lib/foreman_inventory_upload/async/shell_process.rb +15 -9
  27. data/lib/foreman_inventory_upload/async/upload_report_job.rb +21 -9
  28. data/lib/foreman_inventory_upload/generators/fact_helpers.rb +36 -1
  29. data/lib/foreman_inventory_upload/generators/json_stream.rb +17 -2
  30. data/lib/foreman_inventory_upload/generators/metadata.rb +3 -0
  31. data/lib/foreman_inventory_upload/generators/queries.rb +4 -4
  32. data/lib/foreman_inventory_upload/generators/slice.rb +62 -34
  33. data/lib/foreman_rh_cloud.rb +67 -0
  34. data/lib/foreman_rh_cloud/engine.rb +20 -3
  35. data/lib/foreman_rh_cloud/version.rb +1 -1
  36. data/lib/insights_cloud.rb +8 -8
  37. data/lib/insights_cloud/async/insights_full_sync.rb +24 -32
  38. data/lib/insights_cloud/async/insights_scheduled_sync.rb +23 -0
  39. data/lib/inventory_sync/async/host_result.rb +50 -0
  40. data/lib/inventory_sync/async/inventory_full_sync.rb +80 -0
  41. data/lib/tasks/insights.rake +15 -0
  42. data/lib/tasks/rh_cloud_inventory.rake +37 -0
  43. data/package.json +3 -1
  44. data/test/controllers/insights_sync/settings_controller_test.rb +30 -0
  45. data/test/factories/insights_factories.rb +31 -0
  46. data/test/jobs/insights_full_sync_test.rb +33 -1
  47. data/test/jobs/inventory_full_sync_test.rb +91 -0
  48. data/test/jobs/upload_report_job_test.rb +34 -0
  49. data/test/unit/fact_helpers_test.rb +22 -0
  50. data/test/unit/insights_facet_test.rb +23 -0
  51. data/test/unit/metadata_generator_test.rb +2 -0
  52. data/test/unit/rh_cloud_http_proxy_test.rb +52 -0
  53. data/test/unit/slice_generator_test.rb +173 -11
  54. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountList.fixtures.js +16 -1
  55. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListActions.js +22 -17
  56. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListReducer.js +18 -0
  57. data/webpack/ForemanInventoryUpload/Components/AccountList/AccountListSelectors.js +8 -0
  58. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListActions.test.js +7 -0
  59. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListReducer.test.js +12 -6
  60. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/AccountListSelectors.test.js +9 -0
  61. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListActions.test.js.snap +20 -0
  62. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListReducer.test.js.snap +12 -0
  63. data/webpack/ForemanInventoryUpload/Components/AccountList/__tests__/__snapshots__/AccountListSelectors.test.js.snap +6 -0
  64. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcher.fixtures.js +2 -0
  65. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherActions.js +10 -11
  66. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/AutoUploadSwitcherConstants.js +0 -1
  67. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/AutoUploadSwitcherActions.test.js +12 -2
  68. data/webpack/ForemanInventoryUpload/Components/AutoUploadSwitcher/__tests__/__snapshots__/AutoUploadSwitcherActions.test.js.snap +17 -0
  69. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.fixtures.js +1 -0
  70. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcher.js +30 -0
  71. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherActions.js +29 -0
  72. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/ExcludePackagesSwitcherConstants.js +1 -0
  73. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcher.test.js +13 -0
  74. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/ExcludePackagesSwitcherActions.test.js +21 -0
  75. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcher.test.js.snap +38 -0
  76. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/ExcludePackagesSwitcherActions.test.js.snap +31 -0
  77. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/__snapshots__/integration.test.js.snap +41 -0
  78. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/__tests__/integration.test.js +38 -0
  79. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/excludePackagesSwitcher.scss +3 -0
  80. data/webpack/ForemanInventoryUpload/Components/ExcludePackagesSwitcher/index.js +20 -0
  81. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/FullScreenModal.js +5 -1
  82. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/__tests__/__snapshots__/FullScreenModal.test.js.snap +1 -0
  83. data/webpack/ForemanInventoryUpload/Components/FullScreenModal/fullScreenModal.scss +15 -13
  84. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.fixtures.js +2 -1
  85. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.js +1 -0
  86. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcher.scss +3 -0
  87. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherActions.js +10 -11
  88. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/HostObfuscationSwitcherConstants.js +0 -2
  89. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/HostObfuscationSwitcherActions.test.js +12 -2
  90. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/__tests__/__snapshots__/HostObfuscationSwitcherActions.test.js.snap +18 -1
  91. data/webpack/ForemanInventoryUpload/Components/InventoryFilter/__tests__/__snapshots__/integration.test.js.snap +9 -0
  92. data/webpack/ForemanInventoryUpload/Components/InventorySettings/InventorySettings.js +4 -0
  93. data/webpack/ForemanInventoryUpload/Components/InventorySettings/__tests__/__snapshots__/InventorySettings.test.js.snap +2 -0
  94. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.fixtures.js +1 -0
  95. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcher.js +29 -0
  96. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherActions.js +29 -0
  97. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/IpsObfuscationSwitcherConstants.js +1 -0
  98. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcher.test.js +13 -0
  99. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/IpsObfuscationSwitcherActions.test.js +21 -0
  100. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcher.test.js.snap +38 -0
  101. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/__tests__/__snapshots__/IpsObfuscationSwitcherActions.test.js.snap +31 -0
  102. data/webpack/ForemanInventoryUpload/Components/IpsObfuscationSwitcher/index.js +20 -0
  103. data/webpack/ForemanInventoryUpload/Components/PageHeader/PageHeader.js +1 -1
  104. data/webpack/ForemanInventoryUpload/Components/PageHeader/__tests__/__snapshots__/PageHeader.test.js.snap +3 -3
  105. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/DocsButton.js +1 -0
  106. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/DocsButton/__tests__/__snapshots__/DocsButton.test.js.snap +1 -0
  107. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/HistoryButton.js +1 -0
  108. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/HistoryButton/__tests__/__snapshots__/HistoryButton.test.js.snap +1 -0
  109. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/PageDescription.js +2 -2
  110. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/PageDescription/__tests__/__snapshots__/PageDescription.test.js.snap +2 -2
  111. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButton.js +58 -0
  112. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonActions.js +57 -0
  113. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonConstants.js +3 -0
  114. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonReducer.js +36 -0
  115. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/SyncButtonSelectors.js +13 -0
  116. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButton.test.js +13 -0
  117. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonActions.test.js +31 -0
  118. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonFixtures.js +9 -0
  119. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonReducer.test.js +26 -0
  120. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/SyncButtonSelectors.test.js +36 -0
  121. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButton.test.js.snap +26 -0
  122. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonActions.test.js.snap +98 -0
  123. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonReducer.test.js.snap +18 -0
  124. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/__tests__/__snapshots__/SyncButtonSelectors.test.js.snap +18 -0
  125. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Modal.js +63 -0
  126. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/Toast.js +41 -0
  127. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/components/modal.scss +20 -0
  128. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/SyncButton/index.js +22 -0
  129. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/ToolbarButtons.js +2 -0
  130. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/__tests__/__snapshots__/ToolbarButtons.test.js.snap +1 -0
  131. data/webpack/ForemanInventoryUpload/Components/PageHeader/components/ToolbarButtons/toolbarButtons.scss +6 -1
  132. data/webpack/ForemanInventoryUpload/Components/StatusChart/StatusChart.js +1 -1
  133. data/webpack/ForemanInventoryUpload/Components/StatusChart/__tests__/__snapshots__/StatusChart.test.js.snap +1 -1
  134. data/webpack/ForemanInventoryUpload/Components/TabContainer/tabContainer.scss +1 -1
  135. data/webpack/ForemanInventoryUpload/Components/TabHeader/TabHeader.js +6 -1
  136. data/webpack/ForemanInventoryUpload/Components/Terminal/Terminal.js +2 -4
  137. data/webpack/ForemanInventoryUpload/ForemanInventoryConstants.js +3 -1
  138. data/webpack/ForemanInventoryUpload/ForemanInventoryHelpers.js +8 -0
  139. data/webpack/ForemanInventoryUpload/ForemanInventoryUploadReducers.js +2 -0
  140. data/webpack/ForemanRhCloudPages.js +9 -0
  141. data/webpack/ForemanRhCloudReducers.js +2 -0
  142. data/webpack/ForemanRhCloudSelectors.js +5 -0
  143. data/webpack/ForemanRhCloudTestHelpers.js +17 -3
  144. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettings.js +33 -0
  145. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsActions.js +57 -0
  146. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsConstants.js +4 -0
  147. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsReducer.js +24 -0
  148. data/webpack/InsightsCloudSync/Components/InsightsSettings/InsightsSettingsSelectors.js +6 -0
  149. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettings.test.js +18 -0
  150. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsActions.test.js +62 -0
  151. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsReducer.test.js +33 -0
  152. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/InsightsSettingsSelectors.test.js +21 -0
  153. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettings.test.js.snap +15 -0
  154. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsActions.test.js.snap +65 -0
  155. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsReducer.test.js.snap +19 -0
  156. data/webpack/InsightsCloudSync/Components/InsightsSettings/__tests__/__snapshots__/InsightsSettingsSelectors.test.js.snap +9 -0
  157. data/webpack/InsightsCloudSync/Components/InsightsSettings/index.js +21 -0
  158. data/webpack/InsightsCloudSync/Components/InsightsSettings/insightsSettings.scss +16 -0
  159. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.fixtures.js +1 -0
  160. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/InsightsSyncSwitcher.js +45 -0
  161. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/InsightsSyncSwitcher.test.js +17 -0
  162. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/__tests__/__snapshots__/InsightsSyncSwitcher.test.js.snap +38 -0
  163. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/index.js +1 -0
  164. data/webpack/InsightsCloudSync/Components/InsightsSyncSwitcher/insightsSyncSwitcher.scss +3 -0
  165. data/webpack/InsightsCloudSync/InsightsCloudSync.js +38 -5
  166. data/webpack/InsightsCloudSync/InsightsCloudSync.test.js +3 -0
  167. data/webpack/InsightsCloudSync/InsightsCloudSyncActions.js +10 -11
  168. data/webpack/InsightsCloudSync/InsightsCloudSyncConstants.js +0 -2
  169. data/webpack/InsightsCloudSync/InsightsCloudSyncReducers.js +7 -2
  170. data/webpack/InsightsCloudSync/__snapshots__/InsightsCloudSync.test.js.snap +49 -9
  171. data/webpack/InsightsCloudSync/index.js +2 -1
  172. data/webpack/InsightsHostDetailsTab/InsightsTab.js +64 -0
  173. data/webpack/InsightsHostDetailsTab/InsightsTab.scss +86 -0
  174. data/webpack/InsightsHostDetailsTab/InsightsTabActions.js +31 -0
  175. data/webpack/InsightsHostDetailsTab/InsightsTabConstants.js +2 -0
  176. data/webpack/InsightsHostDetailsTab/InsightsTabReducer.js +19 -0
  177. data/webpack/InsightsHostDetailsTab/InsightsTabSelectors.js +3 -0
  178. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.fixtures.js +25 -0
  179. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTab.test.js +13 -0
  180. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabActions.test.js +19 -0
  181. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabIntegration.test.js +17 -0
  182. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabReducer.test.js +26 -0
  183. data/webpack/InsightsHostDetailsTab/__tests__/InsightsTabSelectors.test.js +13 -0
  184. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTab.test.js.snap +30 -0
  185. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabActions.test.js.snap +58 -0
  186. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabReducer.test.js.snap +34 -0
  187. data/webpack/InsightsHostDetailsTab/__tests__/__snapshots__/InsightsTabSelectors.test.js.snap +20 -0
  188. data/webpack/InsightsHostDetailsTab/components/ListItem/ListItem.js +69 -0
  189. data/webpack/InsightsHostDetailsTab/components/ListItem/index.js +1 -0
  190. data/webpack/InsightsHostDetailsTab/index.js +20 -0
  191. data/webpack/__mocks__/foremanReact/constants.js +5 -0
  192. data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
  193. data/webpack/__tests__/ForemanRhCloudSelectors.test.js +4 -1
  194. data/webpack/__tests__/ForemanRhCloudTestHelpers.test.js +12 -2
  195. data/webpack/__tests__/__snapshots__/ForemanRhCloudSelectors.test.js.snap +10 -9
  196. data/webpack/__tests__/__snapshots__/ForemanRhCloudTestHelpers.test.js.snap +27 -2
  197. data/webpack/index.js +2 -12
  198. data/webpack/stories/decorators/withCardsDecorator.js +1 -1
  199. metadata +120 -12
  200. data/lib/tasks/generator.rake +0 -29
  201. data/webpack/ForemanInventoryUpload/Components/HostObfuscationSwitcher/hostObfuscationSwitcher.scss +0 -0
@@ -0,0 +1,19 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`InsightsSettings reducer should handle INSIGHTS_SYNC_SETTING_SET 1`] = `
4
+ Object {
5
+ "insightsSyncEnabled": true,
6
+ }
7
+ `;
8
+
9
+ exports[`InsightsSettings reducer should handle INSIGHTS_SYNC_SETTINGS_GET_SUCCESS 1`] = `
10
+ Object {
11
+ "insightsSyncEnabled": true,
12
+ }
13
+ `;
14
+
15
+ exports[`InsightsSettings reducer should return the initial state 1`] = `
16
+ Object {
17
+ "insightsSyncEnabled": false,
18
+ }
19
+ `;
@@ -0,0 +1,9 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`InsightsSettings selectors should return insights sync settings 1`] = `
4
+ Object {
5
+ "insightsSyncEnabled": true,
6
+ }
7
+ `;
8
+
9
+ exports[`InsightsSettings selectors should return insightsSyncEnabled setting 1`] = `true`;
@@ -0,0 +1,21 @@
1
+ import { bindActionCreators } from 'redux';
2
+ import { connect } from 'react-redux';
3
+
4
+ import InsightsSettings from './InsightsSettings';
5
+ import { selectInsightsSyncEnabled } from './InsightsSettingsSelectors';
6
+ import * as actions from './InsightsSettingsActions';
7
+ import reducer from './InsightsSettingsReducer';
8
+
9
+ // map state to props
10
+ const mapStateToProps = state => ({
11
+ insightsSyncEnabled: selectInsightsSyncEnabled(state),
12
+ });
13
+
14
+ // map action dispatchers to props
15
+ const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
16
+
17
+ // export connected component
18
+ export default connect(mapStateToProps, mapDispatchToProps)(InsightsSettings);
19
+
20
+ // export reducers
21
+ export const reducers = { settings: reducer };
@@ -0,0 +1,16 @@
1
+ .insights_settings {
2
+ border: 1px solid #ededed;
3
+ border-radius: 4px;
4
+ padding: 10px;
5
+ margin-bottom: 15px;
6
+ float: right;
7
+
8
+ h3 {
9
+ margin-top: 0;
10
+ font-weight: 600;
11
+ }
12
+
13
+ .bootstrap-switch {
14
+ float: right;
15
+ }
16
+ }
@@ -0,0 +1 @@
1
+ export const handleToggleResponse = { data: { insightsSyncEnabled: true } };
@@ -0,0 +1,45 @@
1
+ import React, { Component } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Switch, FieldLevelHelp } from 'patternfly-react';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
5
+ import './insightsSyncSwitcher.scss';
6
+
7
+ class InsightsSyncSwitcher extends Component {
8
+ handleToggle = () => {
9
+ const { insightsSyncEnabled, setInsightsSyncEnabled } = this.props;
10
+
11
+ const toggledInsightsSyncEnabled = !insightsSyncEnabled;
12
+ setInsightsSyncEnabled(toggledInsightsSyncEnabled);
13
+ };
14
+
15
+ render() {
16
+ const { insightsSyncEnabled } = this.props;
17
+
18
+ return (
19
+ <div className="insights_sync_switcher">
20
+ <span>Synchronize Automatically</span>
21
+ <FieldLevelHelp
22
+ content={__(
23
+ 'Enable automatic synchronization of Insights recommendations from the Red Hat cloud'
24
+ )}
25
+ />
26
+ <Switch
27
+ size="mini"
28
+ value={insightsSyncEnabled}
29
+ onChange={this.handleToggle}
30
+ />
31
+ </div>
32
+ );
33
+ }
34
+ }
35
+
36
+ InsightsSyncSwitcher.propTypes = {
37
+ insightsSyncEnabled: PropTypes.bool,
38
+ setInsightsSyncEnabled: PropTypes.func.isRequired,
39
+ };
40
+
41
+ InsightsSyncSwitcher.defaultProps = {
42
+ insightsSyncEnabled: true,
43
+ };
44
+
45
+ export default InsightsSyncSwitcher;
@@ -0,0 +1,17 @@
1
+ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
+ import { noop } from 'patternfly-react';
3
+
4
+ import InsightsSyncSwitcher from '../InsightsSyncSwitcher';
5
+
6
+ const fixtures = {
7
+ 'render with props': {
8
+ insightsSyncEnabled: true,
9
+ setInsightsSyncEnabled: noop,
10
+ },
11
+ /** fixtures, props for the component */
12
+ };
13
+
14
+ describe('InsightsSyncSwitcher', () => {
15
+ describe('rendering', () =>
16
+ testComponentSnapshotsWithFixtures(InsightsSyncSwitcher, fixtures));
17
+ });
@@ -0,0 +1,38 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`InsightsSyncSwitcher rendering render with props 1`] = `
4
+ <div
5
+ className="insights_sync_switcher"
6
+ >
7
+ <span>
8
+ Synchronize Automatically
9
+ </span>
10
+ <FieldLevelHelp
11
+ buttonClass=""
12
+ content="Enable automatic synchronization of Insights recommendations from the Red Hat cloud"
13
+ placement="top"
14
+ rootClose={true}
15
+ />
16
+ <Switch
17
+ animate={true}
18
+ baseClass="bootstrap-switch"
19
+ bsSize={null}
20
+ defaultValue={true}
21
+ disabled={false}
22
+ handleWidth="auto"
23
+ inverse={false}
24
+ labelText=" "
25
+ labelWidth="auto"
26
+ offColor="default"
27
+ offText="OFF"
28
+ onChange={[Function]}
29
+ onColor="primary"
30
+ onText="ON"
31
+ readonly={false}
32
+ size="mini"
33
+ tristate={false}
34
+ value={true}
35
+ wrapperClass="wrapper"
36
+ />
37
+ </div>
38
+ `;
@@ -0,0 +1 @@
1
+ export { default } from './InsightsSyncSwitcher';
@@ -0,0 +1,3 @@
1
+ .insights_sync_switcher {
2
+ margin-bottom: 5px;
3
+ }
@@ -2,18 +2,48 @@ import React from 'react';
2
2
  import { IntlProvider } from 'react-intl';
3
3
  import PropTypes from 'prop-types';
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
- import { Button } from 'patternfly-react';
5
+ import { Button, Icon } from 'patternfly-react';
6
6
  import { INSIGHTS_SYNC_PAGE_TITLE } from './InsightsCloudSyncConstants';
7
+ import InsightsSettings from './Components/InsightsSettings';
7
8
 
8
- const InsightsCloudSync = ({ syncInsights }) => {
9
+ const InsightsCloudSync = ({ data: { settingsUrl }, syncInsights }) => {
9
10
  document.title = INSIGHTS_SYNC_PAGE_TITLE;
10
11
  return (
11
12
  <IntlProvider locale={navigator.language}>
12
13
  <div className="insights-cloud-sync">
13
14
  <h1>{__('Red Hat Insights Sync')}</h1>
14
- <Button bsStyle="primary" onClick={syncInsights}>
15
- {__('Sync now')}
16
- </Button>
15
+ <div className="insights-cloud-sync-body">
16
+ <InsightsSettings />
17
+ <p>
18
+ {__(`Insights synchronization process is used to provide Insights
19
+ recommendations output for hosts managed here`)}
20
+ </p>
21
+ <p>
22
+ {__(`1. Obtain an RHSM API token: `)}
23
+ <a
24
+ href="https://access.redhat.com/management/api"
25
+ target="_blank"
26
+ rel="noopener noreferrer"
27
+ >
28
+ access.redhat.com <Icon name="external-link" />
29
+ </a>
30
+ <br />
31
+ {__("2. Copy the token to 'Red Hat Cloud token' setting: ")}
32
+ <a href={settingsUrl} target="_blank" rel="noopener noreferrer">
33
+ {__('Red Hat Cloud token ')}
34
+ <Icon name="external-link" />
35
+ </a>
36
+ <br />
37
+ {__(
38
+ '3. Now you can synchronize recommendations manually using the "Sync now" button.'
39
+ )}
40
+ </p>
41
+ <div>
42
+ <Button bsStyle="primary" onClick={syncInsights}>
43
+ {__('Sync now')}
44
+ </Button>
45
+ </div>
46
+ </div>
17
47
  </div>
18
48
  </IntlProvider>
19
49
  );
@@ -21,6 +51,9 @@ const InsightsCloudSync = ({ syncInsights }) => {
21
51
 
22
52
  InsightsCloudSync.propTypes = {
23
53
  syncInsights: PropTypes.func.isRequired,
54
+ data: PropTypes.shape({
55
+ settingsUrl: PropTypes.string.isRequired,
56
+ }).isRequired,
24
57
  };
25
58
 
26
59
  export default InsightsCloudSync;
@@ -6,6 +6,9 @@ import InsightsCloudSync from './InsightsCloudSync';
6
6
  const fixtures = {
7
7
  render: {
8
8
  syncInsights: noop,
9
+ data: {
10
+ settingsUrl: 'www.example.com/settings',
11
+ },
9
12
  },
10
13
  };
11
14
 
@@ -1,9 +1,7 @@
1
1
  import API from 'foremanReact/API';
2
+ import { addToast } from 'foremanReact/redux/actions/toasts';
2
3
  import { insightsCloudUrl } from './InsightsCloudSyncHelpers';
3
- import {
4
- INSIGHTS_CLOUD_SYNC_SUCCESS,
5
- INSIGHTS_CLOUD_SYNC_FAILURE,
6
- } from './InsightsCloudSyncConstants';
4
+ import { INSIGHTS_CLOUD_SYNC_SUCCESS } from './InsightsCloudSyncConstants';
7
5
 
8
6
  export const syncInsights = () => async dispatch => {
9
7
  try {
@@ -12,12 +10,13 @@ export const syncInsights = () => async dispatch => {
12
10
  type: INSIGHTS_CLOUD_SYNC_SUCCESS,
13
11
  payload: {},
14
12
  });
15
- } catch (error) {
16
- dispatch({
17
- type: INSIGHTS_CLOUD_SYNC_FAILURE,
18
- payload: {
19
- error: error.message,
20
- },
21
- });
13
+ } catch ({ message }) {
14
+ dispatch(
15
+ addToast({
16
+ sticky: true,
17
+ type: 'error',
18
+ message,
19
+ })
20
+ );
22
21
  }
23
22
  };
@@ -1,6 +1,4 @@
1
1
  import { translate as __ } from 'foremanReact/common/I18n';
2
2
 
3
3
  export const INSIGHTS_CLOUD_SYNC_SUCCESS = 'INSIGHTS_CLOUD_SYNC_SUCCESS';
4
- export const INSIGHTS_CLOUD_SYNC_FAILURE = 'INSIGHTS_CLOUD_SYNC_FAILURE';
5
-
6
4
  export const INSIGHTS_SYNC_PAGE_TITLE = __('Red Hat Insights cloud sync');
@@ -1,3 +1,8 @@
1
- const reducers = {};
1
+ import { combineReducers } from 'redux';
2
+ import { reducers as settingsReducers } from './Components/InsightsSettings';
2
3
 
3
- export default reducers;
4
+ export default {
5
+ InsightsCloudSync: combineReducers({
6
+ ...settingsReducers,
7
+ }),
8
+ };
@@ -10,16 +10,56 @@ exports[`InsightsCloudSync render 1`] = `
10
10
  <h1>
11
11
  Red Hat Insights Sync
12
12
  </h1>
13
- <Button
14
- active={false}
15
- block={false}
16
- bsClass="btn"
17
- bsStyle="primary"
18
- disabled={false}
19
- onClick={[Function]}
13
+ <div
14
+ className="insights-cloud-sync-body"
20
15
  >
21
- Sync now
22
- </Button>
16
+ <Connect(InsightsSettings) />
17
+ <p>
18
+ Insights synchronization process is used to provide Insights
19
+ recommendations output for hosts managed here
20
+ </p>
21
+ <p>
22
+ 1. Obtain an RHSM API token:
23
+ <a
24
+ href="https://access.redhat.com/management/api"
25
+ rel="noopener noreferrer"
26
+ target="_blank"
27
+ >
28
+ access.redhat.com
29
+ <Icon
30
+ name="external-link"
31
+ type="fa"
32
+ />
33
+ </a>
34
+ <br />
35
+ 2. Copy the token to 'Red Hat Cloud token' setting:
36
+ <a
37
+ href="www.example.com/settings"
38
+ rel="noopener noreferrer"
39
+ target="_blank"
40
+ >
41
+ Red Hat Cloud token
42
+ <Icon
43
+ name="external-link"
44
+ type="fa"
45
+ />
46
+ </a>
47
+ <br />
48
+ 3. Now you can synchronize recommendations manually using the "Sync now" button.
49
+ </p>
50
+ <div>
51
+ <Button
52
+ active={false}
53
+ block={false}
54
+ bsClass="btn"
55
+ bsStyle="primary"
56
+ disabled={false}
57
+ onClick={[Function]}
58
+ >
59
+ Sync now
60
+ </Button>
61
+ </div>
62
+ </div>
23
63
  </div>
24
64
  </IntlProvider>
25
65
  `;
@@ -3,6 +3,7 @@ import { connect } from 'react-redux';
3
3
 
4
4
  import * as actions from './InsightsCloudSyncActions';
5
5
  import InsightsCloudSync from './InsightsCloudSync';
6
+ import insightsCloudSyncReducers from './InsightsCloudSyncReducers';
6
7
 
7
8
  // map state to props
8
9
  const mapStateToProps = state => ({});
@@ -11,7 +12,7 @@ const mapStateToProps = state => ({});
11
12
  const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
12
13
 
13
14
  // export reducers
14
- export const reducers = {};
15
+ export const reducers = insightsCloudSyncReducers;
15
16
 
16
17
  // export connected component
17
18
  export default connect(mapStateToProps, mapDispatchToProps)(InsightsCloudSync);
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { orderBy } from 'lodash';
4
+ import { Grid, ListView, noop } from 'patternfly-react';
5
+ import ListItem from './components/ListItem';
6
+ import './InsightsTab.scss';
7
+
8
+ class InsightsHostDetailsTab extends React.Component {
9
+ componentDidMount() {
10
+ const { fetchHits, hostID } = this.props;
11
+ fetchHits(hostID);
12
+ }
13
+
14
+ render() {
15
+ const { hits } = this.props;
16
+
17
+ if (!hits.length) {
18
+ return <h2>No recommendations were found for this host!</h2>;
19
+ }
20
+ const hitsSorted = orderBy(hits, ['insights_hit.total_risk'], ['desc']);
21
+ const items = hitsSorted.map(
22
+ (
23
+ {
24
+ insights_hit: {
25
+ title,
26
+ total_risk: totalRisk,
27
+ results_url: resultsUrl,
28
+ solution_url: solutionUrl,
29
+ },
30
+ },
31
+ index
32
+ ) => (
33
+ <ListItem
34
+ key={index}
35
+ title={title}
36
+ totalRisk={totalRisk}
37
+ resultsUrl={resultsUrl}
38
+ solutionUrl={solutionUrl}
39
+ />
40
+ )
41
+ );
42
+ return (
43
+ <Grid.Row>
44
+ <Grid.Col xs={12}>
45
+ <h2>Recommendations</h2>
46
+ <ListView id="hits_list">{items}</ListView>
47
+ </Grid.Col>
48
+ </Grid.Row>
49
+ );
50
+ }
51
+ }
52
+
53
+ InsightsHostDetailsTab.propTypes = {
54
+ hostID: PropTypes.number.isRequired,
55
+ fetchHits: PropTypes.func,
56
+ hits: PropTypes.array,
57
+ };
58
+
59
+ InsightsHostDetailsTab.defaultProps = {
60
+ fetchHits: noop,
61
+ hits: [],
62
+ };
63
+
64
+ export default InsightsHostDetailsTab;