foreman_leapp 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/app/views/foreman_leapp/job_templates/upgrade.erb +12 -4
  3. data/app/views/job_invocations/_leapp_preupgrade_report.html.erb +2 -1
  4. data/lib/foreman_leapp/version.rb +1 -1
  5. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +4 -0
  6. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
  7. data/webpack/components/PreupgradeReports/PreupgradeReports.js +32 -4
  8. data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +35 -0
  9. data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +1 -0
  10. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +34 -2
  11. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +9 -0
  12. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +38 -0
  13. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +131 -24
  14. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +82 -0
  15. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +19 -0
  16. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +19 -0
  17. data/webpack/components/PreupgradeReports/components/FixAllButton.js +37 -0
  18. data/webpack/components/PreupgradeReports/components/FixAllButton.test.js +18 -0
  19. data/webpack/components/PreupgradeReports/components/__snapshots__/FixAllButton.test.js.snap +34 -0
  20. data/webpack/components/PreupgradeReports/index.js +7 -2
  21. data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +12 -2
  22. data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +81 -0
  23. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +39 -5
  24. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js +38 -0
  25. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +97 -22
  26. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +196 -28
  27. data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +21 -8
  28. data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +9 -0
  29. data/webpack/components/PreupgradeReportsList/components/helpers.js +149 -21
  30. data/webpack/components/PreupgradeReportsList/index.js +21 -8
  31. data/webpack/csrf.js +4 -0
  32. metadata +27 -5
  33. data/webpack/components/PreupgradeReportsList/components/StringInfoItem.js +0 -49
  34. data/webpack/components/PreupgradeReportsList/components/__tests__/StringInfoItem.test.js +0 -13
  35. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/StringInfoItem.test.js.snap +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac3a9d3e20cffd15a2af9742b3db9f7a85e8b2e431de19f87d7bd4a9a0085126
4
- data.tar.gz: 7c4ff5f9d6eef8f247bd24132503dce1cc56e4252e268d68373d8b1ee7d29293
3
+ metadata.gz: a75680a7afc44c4a8e90727d2319a53b231748a6db1f8a1c3627c319b3483902
4
+ data.tar.gz: 8506877b49e172205eeadb3a898d9ee5e8e1235525155673d52b98efdfb7441f
5
5
  SHA512:
6
- metadata.gz: 256603788044ab3fbc6d8ad94c4407dfbddaf6617fc330df1f2bdbee00e89b43652a653e5ac92eb0ed9f5e8480620c701c76eb7431420c2985fc03e6620a0708
7
- data.tar.gz: 8c941412d342bf483ce90409c38d2f30ad153c6680168791fc8221d7706c61cd034549c529d88f257d4760b0b95c43f7da196e13fdd1fda914e6cd1a40123785
6
+ metadata.gz: 18a93546178c2252cd530f913d98633e24808dbf66698ddff5d4249d2eec0c9df2513447a304df59cd55e4b54c0bcefb31cae0713dd002ca1895bb78bb19be28
7
+ data.tar.gz: 4993f008708cdb78a9defd9cd311cadb7396e75ad16f0827675ab32e0361e5ad5154810d3e8b1d5f9504d1db2849c6aebe9addae16006a9ff8698b70719b2247
@@ -1,9 +1,9 @@
1
1
  <%#
2
2
  kind: job_template
3
3
  name: Run upgrade via Leapp
4
- job_category: Leapp
4
+ job_category: Ansible Playbook
5
5
  description_format: 'Upgrade RHEL 7 host'
6
- provider_type: SSH
6
+ provider_type: Ansible
7
7
  feature: leapp_upgrade
8
8
  template_inputs:
9
9
  - name: reboot
@@ -12,5 +12,13 @@ template_inputs:
12
12
  required: false
13
13
  options: "false\ntrue"
14
14
  %>
15
-
16
- leapp upgrade <%= "--reboot" if input('reboot') == "true" %>
15
+ ---
16
+ - hosts: all
17
+ tasks:
18
+ - name: Run Leapp Upgrade
19
+ command: leapp upgrade
20
+ <% if input('reboot') == "true" %>
21
+ - name: Reboot the machine
22
+ reboot:
23
+ reboot_timeout: 1800
24
+ <% end %>
@@ -6,5 +6,6 @@
6
6
  <% end %>
7
7
 
8
8
  <%= react_component('PreupgradeReports', {
9
- :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}")
9
+ :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}"),
10
+ :newJobInvocationUrl => new_job_invocation_path
10
11
  }) %>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ForemanLeapp
4
- VERSION = '0.0.5'
4
+ VERSION = '0.0.6'
5
5
  end
@@ -0,0 +1,4 @@
1
+ export const useForemanSettings = () => ({
2
+ perPage: 20,
3
+ perPageOptions: [5, 10, 20, 30, 50],
4
+ });
@@ -0,0 +1,2 @@
1
+ const PaginationWrapper = () => jest.fn();
2
+ export default PaginationWrapper;
@@ -1,12 +1,25 @@
1
1
  import React from 'react';
2
2
  import MessageBox from 'foremanReact/components/common/MessageBox';
3
- import { LoadingState } from 'patternfly-react';
3
+ import { LoadingState, Row } from 'patternfly-react';
4
4
  import PropTypes from 'prop-types';
5
5
 
6
6
  import PreupgradeReportsList from '../PreupgradeReportsList';
7
+ import FixAllButton from './components/FixAllButton';
7
8
 
8
- const PreupgradeReports = ({ preupgradeReports, loading, error }) => {
9
- if (Object.keys(error).length > 0) {
9
+ import {
10
+ flattenEntries,
11
+ isEmpty,
12
+ anyEntriesFixable,
13
+ } from './PreupgradeReportsHelpers';
14
+
15
+ const PreupgradeReports = ({
16
+ preupgradeReports,
17
+ loading,
18
+ error,
19
+ csrfToken,
20
+ newJobInvocationUrl,
21
+ }) => {
22
+ if (!isEmpty(error)) {
10
23
  return (
11
24
  <MessageBox
12
25
  key="preupgrade-reports-error"
@@ -18,7 +31,20 @@ const PreupgradeReports = ({ preupgradeReports, loading, error }) => {
18
31
 
19
32
  return (
20
33
  <LoadingState loading={loading}>
21
- <PreupgradeReportsList preupgradeReports={preupgradeReports} />
34
+ <Row>
35
+ <div className="title-filter col-md-4">&nbsp;</div>
36
+ <div id="title_action" className="col-md-8">
37
+ <div className="btn-toolbar pull-right">
38
+ <FixAllButton
39
+ postUrl={newJobInvocationUrl}
40
+ disabled={!anyEntriesFixable(preupgradeReports)}
41
+ csrfToken={csrfToken}
42
+ preupgradeReports={preupgradeReports}
43
+ />
44
+ </div>
45
+ </div>
46
+ </Row>
47
+ <PreupgradeReportsList allEntries={flattenEntries(preupgradeReports)} />
22
48
  </LoadingState>
23
49
  );
24
50
  };
@@ -27,6 +53,8 @@ PreupgradeReports.propTypes = {
27
53
  preupgradeReports: PropTypes.array.isRequired,
28
54
  loading: PropTypes.bool.isRequired,
29
55
  error: PropTypes.object.isRequired,
56
+ csrfToken: PropTypes.string.isRequired,
57
+ newJobInvocationUrl: PropTypes.string.isRequired,
30
58
  };
31
59
 
32
60
  export default PreupgradeReports;
@@ -0,0 +1,35 @@
1
+ export const flattenEntries = reports =>
2
+ reports.reduce((memo, report) => [...memo, ...report.entries], []);
3
+
4
+ export const entryFixable = entry =>
5
+ entry.detail &&
6
+ entry.detail.remediations &&
7
+ entry.detail.remediations.some(remediation => remediation.type === 'command');
8
+
9
+ export const isEmpty = obj => Object.keys(obj).length === 0;
10
+
11
+ export const anyEntriesFixable = reports =>
12
+ flattenEntries(reports).some(entryFixable);
13
+
14
+ export const idsForInvocation = reports =>
15
+ reports.reduce(
16
+ (memo, report) => {
17
+ report.entries.forEach(entry => {
18
+ if (entryFixable(entry)) {
19
+ memo.entryIds = [...memo.entryIds, entry.id];
20
+
21
+ if (!memo.hostIds.includes(report.hostId)) {
22
+ memo.hostIds = [...memo.hostIds, report.hostId];
23
+ }
24
+ }
25
+ });
26
+ return memo;
27
+ },
28
+ { hostIds: [], entryIds: [] }
29
+ );
30
+
31
+ export const entriesPage = (entries, pagination) => {
32
+ const offset = (pagination.page - 1) * pagination.perPage;
33
+
34
+ return entries.slice(offset, offset + pagination.perPage);
35
+ };
@@ -2,6 +2,7 @@ export const selectPreupgrade = state => state.foremanLeapp.preupgrade;
2
2
 
3
3
  export const selectPreupgradeReports = state =>
4
4
  selectPreupgrade(state).preupgradeReports;
5
+
5
6
  export const selectLoadingPreupgradeReports = state =>
6
7
  selectPreupgrade(state).loadingPreupgradeReports;
7
8
  export const selectError = state => selectPreupgrade(state).error;
@@ -2,14 +2,46 @@ export const preupgradeReports = [
2
2
  {
3
3
  hostId: 5,
4
4
  entries: [
5
- { title: 'Fix me!', severity: 'Too severe to talk about' },
5
+ { title: 'Fix me!', severity: 'Too severe to talk about', id: 42 },
6
+ { title: 'I am broken too', severity: 'medium', id: 43 },
7
+ ],
8
+ },
9
+ {
10
+ hostId: 6,
11
+ entries: [
12
+ { title: 'Octocat is not happy', severity: 'high', id: 44 },
13
+ { title: 'Not enough credits', severity: 'low', id: 45 },
14
+ { title: 'SELinux is turned off', severity: 'medium', id: 46 },
15
+ { title: 'Root password is too short', severity: 'medium', id: 47 },
16
+ {
17
+ title: 'No chocolate chip cookies in cookie jar',
18
+ severity: 'high',
19
+ id: 49,
20
+ },
21
+ ],
22
+ },
23
+ ];
24
+
25
+ export const reportsWithRemediations = [
26
+ {
27
+ hostId: 5,
28
+ entries: [
29
+ {
30
+ title: 'Fix me!',
31
+ severity: 'Too severe to talk about',
32
+ detail: { remediations: [{ type: 'hint' }] },
33
+ },
6
34
  { title: 'I am broken too', severity: 'medium' },
7
35
  ],
8
36
  },
9
37
  {
10
38
  hostId: 6,
11
39
  entries: [
12
- { title: 'Octocat is not happy', severity: 'high' },
40
+ {
41
+ title: 'Octocat is not happy',
42
+ severity: 'high',
43
+ detail: { remediations: [{ type: 'command' }] },
44
+ },
13
45
  { title: 'Not enough credits', severity: 'low' },
14
46
  ],
15
47
  },
@@ -4,16 +4,23 @@ import PreupgradeReports from '../PreupgradeReports';
4
4
 
5
5
  import { preupgradeReports } from './PreupgradeReports.fixtures';
6
6
 
7
+ const csrfToken = 'xyz';
8
+ const newJobInvocationUrl = '/job_invocations/new';
9
+
7
10
  const fixtures = {
8
11
  'should render when loaded': {
9
12
  loading: false,
10
13
  error: {},
11
14
  preupgradeReports,
15
+ csrfToken,
16
+ newJobInvocationUrl,
12
17
  },
13
18
  'should render when loading': {
14
19
  loading: true,
15
20
  error: {},
16
21
  preupgradeReports: [],
22
+ csrfToken,
23
+ newJobInvocationUrl,
17
24
  },
18
25
  'should render error': {
19
26
  loading: false,
@@ -22,6 +29,8 @@ const fixtures = {
22
29
  errorMsg: 'Well, this is embarassing',
23
30
  },
24
31
  preupgradeReports: [],
32
+ csrfToken,
33
+ newJobInvocationUrl,
25
34
  },
26
35
  };
27
36
 
@@ -0,0 +1,38 @@
1
+ import { testSelectorsSnapshotWithFixtures } from '@theforeman/test';
2
+
3
+ import {
4
+ preupgradeReports,
5
+ reportsWithRemediations,
6
+ } from './PreupgradeReports.fixtures';
7
+
8
+ import {
9
+ flattenEntries,
10
+ isEmpty,
11
+ entryFixable,
12
+ anyEntriesFixable,
13
+ idsForInvocation,
14
+ entriesPage,
15
+ } from '../PreupgradeReportsHelpers';
16
+
17
+ const fixtures = {
18
+ 'should return flattened entrues': () => flattenEntries(preupgradeReports),
19
+ 'should detect empty object': () => isEmpty({}),
20
+ 'should detect non-empty object': () => isEmpty({ foo: 'bar' }),
21
+ 'should detect entry is fixable': () =>
22
+ entryFixable({ detail: { remediations: [{ type: 'command' }] } }),
23
+ 'should detect entry is not fixable when not having a command': () =>
24
+ entryFixable({ detail: { remediations: [{ type: 'hint' }] } }),
25
+ 'should detect entry is not fixable when not having remediations': () =>
26
+ !!entryFixable({ detail: {} }),
27
+ 'should detect no entry is fixable': () =>
28
+ anyEntriesFixable(preupgradeReports),
29
+ 'should detect a fixable entry in reports': () =>
30
+ anyEntriesFixable(reportsWithRemediations),
31
+ 'should collect ids for job invocation': () =>
32
+ idsForInvocation(preupgradeReports),
33
+ 'should return entries page': () =>
34
+ entriesPage(flattenEntries(preupgradeReports), { page: 2, perPage: 3 }),
35
+ };
36
+
37
+ describe('PreupgradeReportsHelpers', () =>
38
+ testSelectorsSnapshotWithFixtures(fixtures));
@@ -16,34 +16,116 @@ exports[`PreupgradeReports should render when loaded 1`] = `
16
16
  size="lg"
17
17
  timeout={300}
18
18
  >
19
+ <Row
20
+ bsClass="row"
21
+ componentClass="div"
22
+ >
23
+ <div
24
+ className="title-filter col-md-4"
25
+ >
26
+  
27
+ </div>
28
+ <div
29
+ className="col-md-8"
30
+ id="title_action"
31
+ >
32
+ <div
33
+ className="btn-toolbar pull-right"
34
+ >
35
+ <FixAllButton
36
+ csrfToken="xyz"
37
+ disabled={true}
38
+ postUrl="/job_invocations/new"
39
+ preupgradeReports={
40
+ Array [
41
+ Object {
42
+ "entries": Array [
43
+ Object {
44
+ "id": 42,
45
+ "severity": "Too severe to talk about",
46
+ "title": "Fix me!",
47
+ },
48
+ Object {
49
+ "id": 43,
50
+ "severity": "medium",
51
+ "title": "I am broken too",
52
+ },
53
+ ],
54
+ "hostId": 5,
55
+ },
56
+ Object {
57
+ "entries": Array [
58
+ Object {
59
+ "id": 44,
60
+ "severity": "high",
61
+ "title": "Octocat is not happy",
62
+ },
63
+ Object {
64
+ "id": 45,
65
+ "severity": "low",
66
+ "title": "Not enough credits",
67
+ },
68
+ Object {
69
+ "id": 46,
70
+ "severity": "medium",
71
+ "title": "SELinux is turned off",
72
+ },
73
+ Object {
74
+ "id": 47,
75
+ "severity": "medium",
76
+ "title": "Root password is too short",
77
+ },
78
+ Object {
79
+ "id": 49,
80
+ "severity": "high",
81
+ "title": "No chocolate chip cookies in cookie jar",
82
+ },
83
+ ],
84
+ "hostId": 6,
85
+ },
86
+ ]
87
+ }
88
+ />
89
+ </div>
90
+ </div>
91
+ </Row>
19
92
  <PreupgradeReportsList
20
- preupgradeReports={
93
+ allEntries={
21
94
  Array [
22
95
  Object {
23
- "entries": Array [
24
- Object {
25
- "severity": "Too severe to talk about",
26
- "title": "Fix me!",
27
- },
28
- Object {
29
- "severity": "medium",
30
- "title": "I am broken too",
31
- },
32
- ],
33
- "hostId": 5,
96
+ "id": 42,
97
+ "severity": "Too severe to talk about",
98
+ "title": "Fix me!",
34
99
  },
35
100
  Object {
36
- "entries": Array [
37
- Object {
38
- "severity": "high",
39
- "title": "Octocat is not happy",
40
- },
41
- Object {
42
- "severity": "low",
43
- "title": "Not enough credits",
44
- },
45
- ],
46
- "hostId": 6,
101
+ "id": 43,
102
+ "severity": "medium",
103
+ "title": "I am broken too",
104
+ },
105
+ Object {
106
+ "id": 44,
107
+ "severity": "high",
108
+ "title": "Octocat is not happy",
109
+ },
110
+ Object {
111
+ "id": 45,
112
+ "severity": "low",
113
+ "title": "Not enough credits",
114
+ },
115
+ Object {
116
+ "id": 46,
117
+ "severity": "medium",
118
+ "title": "SELinux is turned off",
119
+ },
120
+ Object {
121
+ "id": 47,
122
+ "severity": "medium",
123
+ "title": "Root password is too short",
124
+ },
125
+ Object {
126
+ "id": 49,
127
+ "severity": "high",
128
+ "title": "No chocolate chip cookies in cookie jar",
47
129
  },
48
130
  ]
49
131
  }
@@ -59,8 +141,33 @@ exports[`PreupgradeReports should render when loading 1`] = `
59
141
  size="lg"
60
142
  timeout={300}
61
143
  >
144
+ <Row
145
+ bsClass="row"
146
+ componentClass="div"
147
+ >
148
+ <div
149
+ className="title-filter col-md-4"
150
+ >
151
+  
152
+ </div>
153
+ <div
154
+ className="col-md-8"
155
+ id="title_action"
156
+ >
157
+ <div
158
+ className="btn-toolbar pull-right"
159
+ >
160
+ <FixAllButton
161
+ csrfToken="xyz"
162
+ disabled={true}
163
+ postUrl="/job_invocations/new"
164
+ preupgradeReports={Array []}
165
+ />
166
+ </div>
167
+ </div>
168
+ </Row>
62
169
  <PreupgradeReportsList
63
- preupgradeReports={Array []}
170
+ allEntries={Array []}
64
171
  />
65
172
  </LoadingState>
66
173
  `;