foreman_host_reports 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +545 -0
  4. data/app/controllers/api/v2/host_reports_controller.rb +98 -0
  5. data/app/controllers/concerns/foreman_host_reports/controller/parameters/host_report.rb +25 -0
  6. data/app/controllers/host_reports_controller.rb +46 -0
  7. data/app/models/concerns/foreman_host_reports/host_extensions.rb +9 -0
  8. data/app/models/concerns/foreman_host_reports/smart_proxy_extensions.rb +9 -0
  9. data/app/models/host_report.rb +85 -0
  10. data/app/models/report_keyword.rb +11 -0
  11. data/app/views/api/v2/host_reports/base.json.rabl +5 -0
  12. data/app/views/api/v2/host_reports/create.json.rabl +5 -0
  13. data/app/views/api/v2/host_reports/index.json.rabl +5 -0
  14. data/app/views/api/v2/host_reports/main.json.rabl +15 -0
  15. data/app/views/api/v2/host_reports/show.json.rabl +11 -0
  16. data/config/routes.rb +33 -0
  17. data/db/migrate/20210112183526_add_host_reports.rb +36 -0
  18. data/db/migrate/20210616133601_create_report_keywords.rb +12 -0
  19. data/lib/foreman_host_reports/engine.rb +68 -0
  20. data/lib/foreman_host_reports/version.rb +3 -0
  21. data/lib/foreman_host_reports.rb +4 -0
  22. data/lib/tasks/foreman_host_reports_tasks.rake +50 -0
  23. data/locale/Makefile +60 -0
  24. data/locale/en/foreman_host_reports.po +19 -0
  25. data/locale/foreman_host_reports.pot +19 -0
  26. data/locale/gemspec.rb +2 -0
  27. data/package.json +45 -0
  28. data/test/controllers/api/v2/host_reports_controller_test.rb +278 -0
  29. data/test/factories/foreman_host_reports_factories.rb +21 -0
  30. data/test/snapshots/foreman-web.json +918 -0
  31. data/test/test_plugin_helper.rb +11 -0
  32. data/test/unit/foreman_host_reports_test.rb +9 -0
  33. data/webpack/global_index.js +4 -0
  34. data/webpack/global_test_setup.js +11 -0
  35. data/webpack/index.js +0 -0
  36. data/webpack/src/Router/HostReports/Components/HostReportDeleteModal.js +50 -0
  37. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/FormatCell.js +53 -0
  38. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/FormatCell.scss +4 -0
  39. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/formatCellFormatter.js +6 -0
  40. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/hostReportsToShowFormatter.js +13 -0
  41. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/index.js +4 -0
  42. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/reportToShowFormatter.js +13 -0
  43. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/statusFormatter.js +9 -0
  44. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/HostReportsToShowCell.js +32 -0
  45. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/ReportToShowCell.js +27 -0
  46. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/StatusCell.js +77 -0
  47. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/StatusCell.scss +9 -0
  48. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/formatImages.js +7 -0
  49. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/images/ansible.png +0 -0
  50. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/images/puppet.png +0 -0
  51. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/HostReportsTable.js +85 -0
  52. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/HostReportsTableSchema.js +65 -0
  53. data/webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/index.js +28 -0
  54. data/webpack/src/Router/HostReports/IndexPage/IndexPage.js +88 -0
  55. data/webpack/src/Router/HostReports/IndexPage/IndexPageActions.js +55 -0
  56. data/webpack/src/Router/HostReports/IndexPage/IndexPageHelpers.js +50 -0
  57. data/webpack/src/Router/HostReports/IndexPage/IndexPageSelectors.js +86 -0
  58. data/webpack/src/Router/HostReports/IndexPage/constants.js +14 -0
  59. data/webpack/src/Router/HostReports/IndexPage/index.js +98 -0
  60. data/webpack/src/Router/HostReports/ShowPage/Components/HostReportMetrics/HostReportMetrics.scss +3 -0
  61. data/webpack/src/Router/HostReports/ShowPage/Components/HostReportMetrics/index.js +100 -0
  62. data/webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/Ansible.js +77 -0
  63. data/webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/Puppet.js +79 -0
  64. data/webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/helpers.js +17 -0
  65. data/webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/index.js +29 -0
  66. data/webpack/src/Router/HostReports/ShowPage/Components/ReportLogsFilter/index.js +109 -0
  67. data/webpack/src/Router/HostReports/ShowPage/ShowPage.js +160 -0
  68. data/webpack/src/Router/HostReports/ShowPage/ShowPageSelectors.js +51 -0
  69. data/webpack/src/Router/HostReports/ShowPage/index.js +75 -0
  70. data/webpack/src/Router/HostReports/constants.js +15 -0
  71. data/webpack/src/Router/routes.js +23 -0
  72. data/webpack/test_setup.js +17 -0
  73. metadata +133 -0
@@ -0,0 +1,109 @@
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import { sprintf, translate as __ } from 'foremanReact/common/I18n';
5
+
6
+ import { ContextSelector, ContextSelectorItem } from '@patternfly/react-core';
7
+
8
+ import ReportLogs from '../ReportLogs';
9
+
10
+ const ReportLogsFilter = ({ format, reportedAt, meta }) => {
11
+ const reportedAtLocal = new Date(reportedAt);
12
+ const { logs } = meta;
13
+ const filterItems = [
14
+ { text: __('All messages'), accepts: [] },
15
+ {
16
+ text: __('Notices, warnings and errors'),
17
+ accepts: ['notice', 'warning', 'err'],
18
+ },
19
+ { text: __('Warnings and errors'), accepts: ['warning', 'err'] },
20
+ { text: __('Errors only'), accepts: ['err'] },
21
+ ];
22
+ const [currentItem, setCurrentItem] = useState(filterItems[0]);
23
+ const [currentFilterItems, setCurrentFilterItems] = useState(filterItems);
24
+ const [searchValue, setSearchValue] = useState('');
25
+ const [isOpen, setIsOpen] = useState(false);
26
+ const [filteredLogs, setFilteredLogs] = useState(logs);
27
+
28
+ /* eslint-disable react-hooks/exhaustive-deps */
29
+ const onSearchButtonClick = useCallback(() => {
30
+ const filtered =
31
+ searchValue === ''
32
+ ? filterItems
33
+ : filterItems.filter(item =>
34
+ item.text.toLowerCase().includes(searchValue.toLowerCase())
35
+ );
36
+ setCurrentFilterItems(filtered || []);
37
+ }, [searchValue]);
38
+ /* eslint-enable react-hooks/exhaustive-deps */
39
+
40
+ useEffect(() => {
41
+ onSearchButtonClick();
42
+ }, [searchValue, onSearchButtonClick]);
43
+
44
+ const onToggle = (event, newIsOpen) => {
45
+ setIsOpen(newIsOpen);
46
+ };
47
+ const onSelect = () => {
48
+ setIsOpen(!isOpen);
49
+ };
50
+ const onSearchInputChange = (value, event) => {
51
+ setSearchValue(event.target.value);
52
+ };
53
+ const filterLogs = (toFilter, accepts) => {
54
+ if (!accepts.length) return toFilter;
55
+
56
+ return toFilter.filter(log => accepts.includes(log[0] || log.level));
57
+ };
58
+
59
+ useEffect(() => {
60
+ setFilteredLogs(filterLogs(logs, currentItem.accepts));
61
+ }, [logs, currentItem]);
62
+
63
+ return (
64
+ <>
65
+ <span>{__('Show log messages:')}</span>
66
+ <br />
67
+ <ContextSelector
68
+ id="report-logs-filter"
69
+ toggleText={currentItem.text}
70
+ onSearchInputChange={onSearchInputChange}
71
+ isOpen={isOpen}
72
+ searchInputValue={searchValue}
73
+ onToggle={onToggle}
74
+ onSelect={onSelect}
75
+ onSearchButtonClick={onSearchButtonClick}
76
+ screenReaderLabel="Selected Messages:"
77
+ >
78
+ {currentFilterItems.map((item, i) => (
79
+ <ContextSelectorItem
80
+ key={i + 1}
81
+ id={`select_messages_${i}`}
82
+ onClick={() => {
83
+ setCurrentItem(item);
84
+ }}
85
+ isDisabled={item.text === currentItem.text}
86
+ >
87
+ {item.text}
88
+ </ContextSelectorItem>
89
+ ))}
90
+ </ContextSelector>
91
+ <p className="ra">
92
+ {sprintf(__('Reported at %s'), reportedAtLocal.toLocaleString())}
93
+ </p>
94
+ <ReportLogs format={format} logs={filteredLogs} meta={meta} />
95
+ </>
96
+ );
97
+ };
98
+
99
+ ReportLogsFilter.propTypes = {
100
+ format: PropTypes.string.isRequired,
101
+ reportedAt: PropTypes.string.isRequired,
102
+ meta: PropTypes.object,
103
+ };
104
+
105
+ ReportLogsFilter.defaultProps = {
106
+ meta: {},
107
+ };
108
+
109
+ export default ReportLogsFilter;
@@ -0,0 +1,160 @@
1
+ import React from 'react';
2
+ import JSONTree from 'react-json-tree';
3
+ import PropTypes from 'prop-types';
4
+ import { Button, Grid, GridItem } from '@patternfly/react-core';
5
+
6
+ import PageLayout from 'foremanReact/routes/common/PageLayout/PageLayout';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
8
+ import { foremanUrl } from 'foremanReact/common/helpers';
9
+ import { useForemanModal } from 'foremanReact/components/ForemanModal/ForemanModalHooks';
10
+
11
+ import HostReportDeleteModal from '../Components/HostReportDeleteModal';
12
+ import ReportLogsFilter from './Components/ReportLogsFilter';
13
+ import HostReportMetrics from './Components/HostReportMetrics';
14
+
15
+ import {
16
+ HOSTS_PATH,
17
+ HOST_REPORTS_PATH,
18
+ HOST_REPORT_DELETE_MODAL_ID,
19
+ } from '../constants';
20
+
21
+ const HostReportsShowPage = ({
22
+ id,
23
+ body,
24
+ format,
25
+ host,
26
+ reportedAt,
27
+ permissions,
28
+ isLoading,
29
+ fetchAndPush,
30
+ }) => {
31
+ const {
32
+ setModalOpen: setDeleteModalOpen,
33
+ setModalClosed: setDeleteModalClosed,
34
+ } = useForemanModal({
35
+ id: HOST_REPORT_DELETE_MODAL_ID,
36
+ });
37
+
38
+ const buttons = [];
39
+
40
+ if (permissions.canDelete) {
41
+ buttons.push(
42
+ <Button
43
+ key={`host-report-delete-button-${id}`}
44
+ variant="danger"
45
+ isSmall
46
+ onClick={() => setDeleteModalOpen()}
47
+ >
48
+ {__('Delete')}
49
+ </Button>
50
+ );
51
+ }
52
+ buttons.push(
53
+ <Button
54
+ key={`host-report-host-button-${id}`}
55
+ variant="link"
56
+ component="a"
57
+ target="_blank"
58
+ href={foremanUrl(`${HOSTS_PATH}/${host.id}`)}
59
+ isSmall
60
+ >
61
+ {__('Host details')}
62
+ </Button>
63
+ );
64
+ buttons.push(
65
+ <Button
66
+ key={`host-report-other-button-${id}`}
67
+ variant="link"
68
+ component="a"
69
+ target="_blank"
70
+ href={foremanUrl(`${HOSTS_PATH}/${host.id}${HOST_REPORTS_PATH}`)}
71
+ isSmall
72
+ >
73
+ {__('Other reports for this host')}
74
+ </Button>
75
+ );
76
+
77
+ const meta = {};
78
+ switch (format) {
79
+ case 'puppet':
80
+ meta.environment = body.environment;
81
+ meta.logs = body.logs;
82
+ break;
83
+ case 'ansible':
84
+ meta.checkMode = body.checkMode;
85
+ meta.logs = body.results;
86
+ break;
87
+ default:
88
+ break;
89
+ }
90
+
91
+ const theme = {
92
+ scheme: 'foreman',
93
+ backgroundColor: 'rgba(0, 0, 0, 255)',
94
+ base00: 'rgba(0, 0, 0, 0)',
95
+ };
96
+
97
+ return (
98
+ <React.Fragment>
99
+ <HostReportDeleteModal
100
+ toDelete={{ id, hostName: host.name }}
101
+ onSuccess={() => {
102
+ setDeleteModalClosed();
103
+ fetchAndPush({ page: 1 });
104
+ }}
105
+ />
106
+ <PageLayout
107
+ header={host.name}
108
+ searchable={false}
109
+ isLoading={isLoading}
110
+ breadcrumbOptions={{
111
+ isSwitchable: false,
112
+ breadcrumbItems: [
113
+ { caption: __('Host Reports'), url: foremanUrl(HOST_REPORTS_PATH) },
114
+ {
115
+ caption: host.name,
116
+ url: foremanUrl(`${HOST_REPORTS_PATH}/${id}`),
117
+ },
118
+ ],
119
+ }}
120
+ toolbarButtons={buttons}
121
+ >
122
+ {format === 'plain' ? (
123
+ <JSONTree data={body} hideRoot theme={theme} />
124
+ ) : (
125
+ <Grid hasGutter>
126
+ <GridItem>
127
+ <ReportLogsFilter
128
+ format={format}
129
+ reportedAt={reportedAt}
130
+ meta={meta}
131
+ />
132
+ </GridItem>
133
+ {format === 'puppet' ? (
134
+ <GridItem>
135
+ <HostReportMetrics metrics={body.metrics} />
136
+ </GridItem>
137
+ ) : null}
138
+ </Grid>
139
+ )}
140
+ </PageLayout>
141
+ </React.Fragment>
142
+ );
143
+ };
144
+
145
+ HostReportsShowPage.propTypes = {
146
+ id: PropTypes.number.isRequired,
147
+ body: PropTypes.object.isRequired,
148
+ format: PropTypes.string.isRequired,
149
+ host: PropTypes.object.isRequired,
150
+ reportedAt: PropTypes.string.isRequired,
151
+ permissions: PropTypes.object.isRequired,
152
+ fetchAndPush: PropTypes.func.isRequired,
153
+ isLoading: PropTypes.bool,
154
+ };
155
+
156
+ HostReportsShowPage.defaultProps = {
157
+ isLoading: true,
158
+ };
159
+
160
+ export default HostReportsShowPage;
@@ -0,0 +1,51 @@
1
+ import { STATUS } from 'foremanReact/constants';
2
+ import { deepPropsToCamelCase } from 'foremanReact/common/helpers';
3
+ import {
4
+ selectAPIStatus,
5
+ selectAPIResponse,
6
+ selectAPIErrorMessage,
7
+ } from 'foremanReact/redux/API/APISelectors';
8
+
9
+ import { HOST_REPORT_REQUEST_KEY } from '../constants';
10
+
11
+ const selectHostReportResponse = state => {
12
+ const response = deepPropsToCamelCase(
13
+ selectAPIResponse(state, HOST_REPORT_REQUEST_KEY)
14
+ );
15
+ return response;
16
+ };
17
+
18
+ export const selectIsLoading = state => {
19
+ const status = selectHostReportPageStatus(state);
20
+ return !status || status === STATUS.PENDING;
21
+ };
22
+
23
+ const selectHostReportPageStatus = state =>
24
+ selectAPIStatus(state, HOST_REPORT_REQUEST_KEY);
25
+
26
+ export const selectHasError = state =>
27
+ selectHostReportPageStatus(state) === STATUS.ERROR;
28
+
29
+ export const selectHostReport = state => {
30
+ if (selectHasError(state)) {
31
+ return [];
32
+ }
33
+ return selectHostReportResponse(state).hostReport;
34
+ };
35
+
36
+ export const selectSearch = state => selectHostReportResponse(state).search;
37
+
38
+ export const selectPermissions = state =>
39
+ selectHostReportResponse(state).permissions || {};
40
+
41
+ export const selectErrorMessage = state => {
42
+ if (!selectHasError(state)) return { message: '', details: '' };
43
+ const error = selectHostReportResponse(state).response?.data?.error;
44
+
45
+ if (error) return error;
46
+
47
+ return {
48
+ message: selectAPIErrorMessage(state, HOST_REPORT_REQUEST_KEY),
49
+ details: '',
50
+ };
51
+ };
@@ -0,0 +1,75 @@
1
+ import React, { useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useSelector, useDispatch } from 'react-redux';
4
+
5
+ import { get } from 'foremanReact/redux/API';
6
+ import { foremanUrl } from 'foremanReact/common/helpers';
7
+
8
+ import Loading from 'foremanReact/components/Loading';
9
+ import DefaultEmptyState from 'foremanReact/components/common/EmptyState';
10
+
11
+ import HostReportsShowPage from './ShowPage';
12
+
13
+ import { HOST_REPORT_REQUEST_KEY, HOST_REPORTS_PATH } from '../constants';
14
+ import {
15
+ selectHostReport,
16
+ selectIsLoading,
17
+ selectHasError,
18
+ selectErrorMessage,
19
+ selectPermissions,
20
+ } from './ShowPageSelectors';
21
+
22
+ import { fetchAndPush } from '../IndexPage/IndexPageActions';
23
+
24
+ const ConnectedHostReportsShowPage = ({ match }) => {
25
+ const dispatch = useDispatch();
26
+
27
+ const report = useSelector(selectHostReport);
28
+ const isLoading = useSelector(selectIsLoading);
29
+ const hasError = useSelector(selectHasError);
30
+ const error = useSelector(selectErrorMessage);
31
+ const permissions = useSelector(selectPermissions);
32
+
33
+ const { id } = match.params;
34
+
35
+ useEffect(() => {
36
+ dispatch(
37
+ get({
38
+ key: HOST_REPORT_REQUEST_KEY,
39
+ url: foremanUrl(`${HOST_REPORTS_PATH}/${id}`),
40
+ })
41
+ );
42
+ }, [dispatch, id]);
43
+
44
+ if (isLoading && !hasError) return <Loading />;
45
+
46
+ if (!isLoading && hasError) {
47
+ return (
48
+ <DefaultEmptyState
49
+ icon="error-circle-o"
50
+ header={error.message}
51
+ description={error.details || ''}
52
+ documentation={null}
53
+ />
54
+ );
55
+ }
56
+
57
+ return (
58
+ <HostReportsShowPage
59
+ id={report.id}
60
+ body={report.body}
61
+ format={report.format}
62
+ host={report.host}
63
+ reportedAt={report.reportedAt}
64
+ permissions={permissions}
65
+ isLoading={isLoading}
66
+ fetchAndPush={params => dispatch(fetchAndPush(params))}
67
+ />
68
+ );
69
+ };
70
+
71
+ ConnectedHostReportsShowPage.propTypes = {
72
+ match: PropTypes.object.isRequired,
73
+ };
74
+
75
+ export default ConnectedHostReportsShowPage;
@@ -0,0 +1,15 @@
1
+ import { getControllerSearchProps } from 'foremanReact/constants';
2
+
3
+ export const HOST_REPORTS_SEARCH_PROPS = getControllerSearchProps(
4
+ 'host_reports'
5
+ );
6
+ export const HOSTS_PATH = '/hosts';
7
+ export const HOST_REPORTS_PATH = '/host_reports';
8
+ export const HOST_REPORTS_API_PATH =
9
+ '/api/v2/host_reports?include_permissions=true';
10
+ export const HOST_REPORTS_API_PLAIN_PATH = '/api/v2/host_reports';
11
+
12
+ export const HOST_REPORT_REQUEST_KEY = 'HOST_REPORT';
13
+ export const HOST_REPORTS_API_REQUEST_KEY = 'HOST_REPORTS_API';
14
+
15
+ export const HOST_REPORT_DELETE_MODAL_ID = 'hostReportDeleteModal';
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import ConnectedHostReportsIndexPage from './HostReports/IndexPage';
3
+ import ConnectedHostReportsShowPage from './HostReports/ShowPage';
4
+
5
+ const ForemanHostReportsRoutes = [
6
+ {
7
+ path: '/host_reports',
8
+ exact: true,
9
+ render: props => <ConnectedHostReportsIndexPage {...props} />,
10
+ },
11
+ {
12
+ path: '/host_reports/:id([0-9]+)',
13
+ exact: true,
14
+ render: props => <ConnectedHostReportsShowPage {...props} />,
15
+ },
16
+ {
17
+ path: '/hosts/:hostId([0-9]+)/host_reports',
18
+ exact: true,
19
+ render: props => <ConnectedHostReportsIndexPage {...props} />,
20
+ },
21
+ ];
22
+
23
+ export default ForemanHostReportsRoutes;
@@ -0,0 +1,17 @@
1
+ import 'core-js/shim';
2
+ import 'regenerator-runtime/runtime';
3
+ import MutationObserver from '@sheerun/mutationobserver-shim';
4
+
5
+ import { configure } from 'enzyme';
6
+ import Adapter from 'enzyme-adapter-react-16';
7
+
8
+ configure({ adapter: new Adapter() });
9
+
10
+ // Mocking translation function
11
+ global.__ = text => text; // eslint-disable-line
12
+
13
+ // Mocking locales to prevent unnecessary fallback messages
14
+ window.locales = { en: { domain: 'app', locale_data: { app: { '': {} } } } };
15
+
16
+ // see https://github.com/testing-library/dom-testing-library/releases/tag/v7.0.0
17
+ window.MutationObserver = MutationObserver;
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: foreman_host_reports
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Zapletal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Fast and efficient reporting capabilities
28
+ email:
29
+ - lukas-x@zapletalovi.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - LICENSE
35
+ - README.md
36
+ - app/controllers/api/v2/host_reports_controller.rb
37
+ - app/controllers/concerns/foreman_host_reports/controller/parameters/host_report.rb
38
+ - app/controllers/host_reports_controller.rb
39
+ - app/models/concerns/foreman_host_reports/host_extensions.rb
40
+ - app/models/concerns/foreman_host_reports/smart_proxy_extensions.rb
41
+ - app/models/host_report.rb
42
+ - app/models/report_keyword.rb
43
+ - app/views/api/v2/host_reports/base.json.rabl
44
+ - app/views/api/v2/host_reports/create.json.rabl
45
+ - app/views/api/v2/host_reports/index.json.rabl
46
+ - app/views/api/v2/host_reports/main.json.rabl
47
+ - app/views/api/v2/host_reports/show.json.rabl
48
+ - config/routes.rb
49
+ - db/migrate/20210112183526_add_host_reports.rb
50
+ - db/migrate/20210616133601_create_report_keywords.rb
51
+ - lib/foreman_host_reports.rb
52
+ - lib/foreman_host_reports/engine.rb
53
+ - lib/foreman_host_reports/version.rb
54
+ - lib/tasks/foreman_host_reports_tasks.rake
55
+ - locale/Makefile
56
+ - locale/en/foreman_host_reports.po
57
+ - locale/foreman_host_reports.pot
58
+ - locale/gemspec.rb
59
+ - package.json
60
+ - test/controllers/api/v2/host_reports_controller_test.rb
61
+ - test/factories/foreman_host_reports_factories.rb
62
+ - test/snapshots/foreman-web.json
63
+ - test/test_plugin_helper.rb
64
+ - test/unit/foreman_host_reports_test.rb
65
+ - webpack/global_index.js
66
+ - webpack/global_test_setup.js
67
+ - webpack/index.js
68
+ - webpack/src/Router/HostReports/Components/HostReportDeleteModal.js
69
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/FormatCell.js
70
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/FormatCell.scss
71
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/formatCellFormatter.js
72
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/hostReportsToShowFormatter.js
73
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/index.js
74
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/reportToShowFormatter.js
75
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/Formatters/statusFormatter.js
76
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/HostReportsToShowCell.js
77
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/ReportToShowCell.js
78
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/StatusCell.js
79
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/StatusCell.scss
80
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/formatImages.js
81
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/images/ansible.png
82
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/Components/images/puppet.png
83
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/HostReportsTable.js
84
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/HostReportsTableSchema.js
85
+ - webpack/src/Router/HostReports/IndexPage/Components/HostReportsTable/index.js
86
+ - webpack/src/Router/HostReports/IndexPage/IndexPage.js
87
+ - webpack/src/Router/HostReports/IndexPage/IndexPageActions.js
88
+ - webpack/src/Router/HostReports/IndexPage/IndexPageHelpers.js
89
+ - webpack/src/Router/HostReports/IndexPage/IndexPageSelectors.js
90
+ - webpack/src/Router/HostReports/IndexPage/constants.js
91
+ - webpack/src/Router/HostReports/IndexPage/index.js
92
+ - webpack/src/Router/HostReports/ShowPage/Components/HostReportMetrics/HostReportMetrics.scss
93
+ - webpack/src/Router/HostReports/ShowPage/Components/HostReportMetrics/index.js
94
+ - webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/Ansible.js
95
+ - webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/Puppet.js
96
+ - webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/helpers.js
97
+ - webpack/src/Router/HostReports/ShowPage/Components/ReportLogs/index.js
98
+ - webpack/src/Router/HostReports/ShowPage/Components/ReportLogsFilter/index.js
99
+ - webpack/src/Router/HostReports/ShowPage/ShowPage.js
100
+ - webpack/src/Router/HostReports/ShowPage/ShowPageSelectors.js
101
+ - webpack/src/Router/HostReports/ShowPage/index.js
102
+ - webpack/src/Router/HostReports/constants.js
103
+ - webpack/src/Router/routes.js
104
+ - webpack/test_setup.js
105
+ homepage: https://github.com/theforeman/foreman_host_reports
106
+ licenses:
107
+ - GPL-3.0
108
+ metadata: {}
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 2.5.0
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubygems_version: 3.1.4
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Foreman reporting engine
128
+ test_files:
129
+ - test/factories/foreman_host_reports_factories.rb
130
+ - test/unit/foreman_host_reports_test.rb
131
+ - test/controllers/api/v2/host_reports_controller_test.rb
132
+ - test/snapshots/foreman-web.json
133
+ - test/test_plugin_helper.rb