foreman-tasks 5.0.0 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +4 -4
- data/app/controllers/foreman_tasks/tasks_controller.rb +5 -4
- data/app/graphql/types/recurring_logic.rb +1 -0
- data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +4 -1
- data/app/lib/actions/middleware/watch_delegated_proxy_sub_tasks.rb +2 -6
- data/app/lib/actions/trigger_proxy_batch.rb +79 -0
- data/app/models/foreman_tasks/recurring_logic.rb +8 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +8 -3
- data/app/models/foreman_tasks/task.rb +1 -0
- data/app/models/foreman_tasks/triggering.rb +12 -4
- data/app/views/foreman_tasks/api/tasks/show.json.rabl +1 -1
- data/app/views/foreman_tasks/layouts/react.html.erb +0 -1
- data/app/views/foreman_tasks/recurring_logics/index.html.erb +4 -2
- data/app/views/foreman_tasks/task_groups/recurring_logic_task_groups/_recurring_logic_task_group.html.erb +4 -0
- data/db/migrate/20210720115251_add_purpose_to_recurring_logic.rb +6 -0
- data/extra/foreman-tasks-cleanup.sh +127 -0
- data/extra/foreman-tasks-export.sh +117 -0
- data/lib/foreman_tasks/tasks/export_tasks.rake +92 -47
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/controllers/api/tasks_controller_test.rb +29 -0
- data/test/controllers/tasks_controller_test.rb +19 -0
- data/test/unit/actions/trigger_proxy_batch_test.rb +59 -0
- data/test/unit/triggering_test.rb +22 -0
- data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.js +11 -4
- data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.test.js +27 -5
- data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +8 -0
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +6 -1
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableHelpers.js +2 -1
- data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +22 -11
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableReducer.js +17 -16
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +3 -0
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableHelpers.test.js +1 -1
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableReducer.test.js +3 -1
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +12 -2
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableReducer.test.js.snap +5 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionHeaderCellFormatter.test.js.snap +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionHeaderCellFormatter.test.js +1 -1
- data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionHeaderCellFormatter.js +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -0
- metadata +8 -5
- data/app/services/foreman_tasks/dashboard_table_filter.rb +0 -56
- data/test/unit/dashboard_table_filter_test.rb +0 -77
@@ -15,22 +15,29 @@ export const convertDashboardQuery = query => {
|
|
15
15
|
state,
|
16
16
|
result,
|
17
17
|
search,
|
18
|
+
...rest
|
18
19
|
} = query;
|
19
20
|
|
20
21
|
const hours = timeToHoursNumber(timeHorizon);
|
21
22
|
const timestamp = new Date(new Date() - hours * 60 * 60 * 1000);
|
22
23
|
let dashboardTime = '';
|
23
24
|
const stateQuery = state ? `state=${state}` : '';
|
24
|
-
|
25
|
+
let resultQuery = '';
|
26
|
+
if (result === 'other') {
|
27
|
+
resultQuery = 'result ^ (pending, cancelled)';
|
28
|
+
} else {
|
29
|
+
resultQuery = result ? `result=${result}` : '';
|
30
|
+
}
|
25
31
|
if (timeMode === TASKS_DASHBOARD_JS_QUERY_MODES.RECENT) {
|
26
|
-
dashboardTime = `
|
32
|
+
dashboardTime = `state_updated_at>${timestamp.toISOString()} or null? state_updated_at`;
|
27
33
|
} else if (timeMode === TASKS_DASHBOARD_JS_QUERY_MODES.OLDER) {
|
28
|
-
dashboardTime = `
|
34
|
+
dashboardTime = `state_updated_at<=${timestamp.toISOString()}`;
|
29
35
|
}
|
30
36
|
const newQuery = [stateQuery, resultQuery, search, dashboardTime]
|
31
37
|
.filter(Boolean)
|
38
|
+
.map(q => `(${q})`)
|
32
39
|
.join(' and ');
|
33
|
-
return newQuery;
|
40
|
+
return newQuery ? { search: newQuery, ...rest } : rest;
|
34
41
|
};
|
35
42
|
|
36
43
|
export const resumeToastInfo = {
|
@@ -27,9 +27,18 @@ describe('convertDashboardQuery', () => {
|
|
27
27
|
result: 'error',
|
28
28
|
search: 'action~job',
|
29
29
|
};
|
30
|
-
|
31
|
-
'state=stopped and result=error and action~job and (state_updated_at>2020-05-01T11:01:58.135Z or state_updated_at
|
32
|
-
|
30
|
+
const expected =
|
31
|
+
'(state=stopped) and (result=error) and (action~job) and (state_updated_at>2020-05-01T11:01:58.135Z or null? state_updated_at)';
|
32
|
+
|
33
|
+
expect(convertDashboardQuery(query)).toEqual({ search: expected });
|
34
|
+
|
35
|
+
const query2 = {
|
36
|
+
...query,
|
37
|
+
time_mode: TASKS_DASHBOARD_JS_QUERY_MODES.OLDER,
|
38
|
+
};
|
39
|
+
const expected2 =
|
40
|
+
'(state=stopped) and (result=error) and (action~job) and (state_updated_at<=2020-05-01T11:01:58.135Z)';
|
41
|
+
expect(convertDashboardQuery(query2)).toEqual({ search: expected2 });
|
33
42
|
// Cleanup
|
34
43
|
global.Date = realDate;
|
35
44
|
});
|
@@ -37,10 +46,23 @@ describe('convertDashboardQuery', () => {
|
|
37
46
|
const query = {
|
38
47
|
search: 'action~job',
|
39
48
|
};
|
40
|
-
expect(convertDashboardQuery(query)).toEqual('action~job');
|
49
|
+
expect(convertDashboardQuery(query)).toEqual({ search: '(action~job)' });
|
41
50
|
});
|
42
51
|
it('convertDashboardQuery should work with no query', () => {
|
43
52
|
const query = {};
|
44
|
-
expect(convertDashboardQuery(query)).toEqual(
|
53
|
+
expect(convertDashboardQuery(query)).toEqual({});
|
54
|
+
});
|
55
|
+
it('convertDashboardQuery should not override unknown keys', () => {
|
56
|
+
const query = { weather: 'nice', search: 'okay', number: 7 };
|
57
|
+
expect(convertDashboardQuery(query)).toEqual({
|
58
|
+
...query,
|
59
|
+
search: '(okay)',
|
60
|
+
});
|
61
|
+
});
|
62
|
+
it('convertDashboardQuery should expand other result', () => {
|
63
|
+
const query = { result: 'other' };
|
64
|
+
expect(convertDashboardQuery(query)).toEqual({
|
65
|
+
search: '(result ^ (pending, cancelled))',
|
66
|
+
});
|
45
67
|
});
|
46
68
|
});
|
@@ -27,6 +27,7 @@ const TasksTable = ({
|
|
27
27
|
openClickedModal,
|
28
28
|
openModal,
|
29
29
|
allRowsSelected,
|
30
|
+
permissions,
|
30
31
|
}) => {
|
31
32
|
const { search, pathname } = history.location;
|
32
33
|
const url = pathname + search;
|
@@ -59,6 +60,7 @@ const TasksTable = ({
|
|
59
60
|
},
|
60
61
|
isSelected: ({ rowData }) =>
|
61
62
|
allRowsSelected || selectedRows.includes(rowData.id),
|
63
|
+
permissions,
|
62
64
|
};
|
63
65
|
};
|
64
66
|
|
@@ -162,6 +164,9 @@ TasksTable.propTypes = {
|
|
162
164
|
unselectRow: PropTypes.func.isRequired,
|
163
165
|
openModal: PropTypes.func.isRequired,
|
164
166
|
allRowsSelected: PropTypes.bool,
|
167
|
+
permissions: PropTypes.shape({
|
168
|
+
edit: PropTypes.bool,
|
169
|
+
}),
|
165
170
|
};
|
166
171
|
|
167
172
|
TasksTable.defaultProps = {
|
@@ -173,6 +178,9 @@ TasksTable.defaultProps = {
|
|
173
178
|
},
|
174
179
|
selectedRows: [],
|
175
180
|
allRowsSelected: false,
|
181
|
+
permissions: {
|
182
|
+
edit: false,
|
183
|
+
},
|
176
184
|
};
|
177
185
|
|
178
186
|
export default TasksTable;
|
@@ -18,9 +18,14 @@ import {
|
|
18
18
|
resumeTaskRequest,
|
19
19
|
forceCancelTaskRequest,
|
20
20
|
} from '../TaskActions';
|
21
|
+
import { convertDashboardQuery } from '../TaskActions/TaskActionHelpers';
|
21
22
|
|
22
23
|
export const getTableItems = url =>
|
23
|
-
getTableItemsAction(
|
24
|
+
getTableItemsAction(
|
25
|
+
TASKS_TABLE_ID,
|
26
|
+
convertDashboardQuery(getURIQuery(url)),
|
27
|
+
getApiPathname(url)
|
28
|
+
);
|
24
29
|
|
25
30
|
export const reloadPage = (url, parentTaskID) => dispatch => {
|
26
31
|
dispatch(getTableItems(url));
|
@@ -2,6 +2,7 @@ import URI from 'urijs';
|
|
2
2
|
import { translate as __, documentLocale } from 'foremanReact/common/I18n';
|
3
3
|
import humanizeDuration from 'humanize-duration';
|
4
4
|
import { isoCompatibleDate } from 'foremanReact/common/helpers';
|
5
|
+
import { convertDashboardQuery } from '../TaskActions/TaskActionHelpers';
|
5
6
|
|
6
7
|
export const updateURlQuery = (query, history) => {
|
7
8
|
const uri = new URI(history.location.pathname + history.location.search);
|
@@ -17,7 +18,7 @@ export const getApiPathname = url => {
|
|
17
18
|
export const getCSVurl = (path, query) => {
|
18
19
|
let url = new URI(path);
|
19
20
|
url = url.pathname(`${url.pathname()}.csv`);
|
20
|
-
url.addSearch(query);
|
21
|
+
url.addSearch(convertDashboardQuery(query));
|
21
22
|
return url.toString();
|
22
23
|
};
|
23
24
|
|
@@ -77,11 +77,14 @@ const TasksTablePage = ({
|
|
77
77
|
</Button>
|
78
78
|
{props.status === STATUS.PENDING && <Spinner size="md" loading />}
|
79
79
|
<ExportButton
|
80
|
-
url={getCSVurl(
|
80
|
+
url={getCSVurl(history.location.pathname, uriQuery)}
|
81
81
|
title={__('Export All')}
|
82
82
|
/>
|
83
83
|
<ActionSelectButton
|
84
|
-
disabled={
|
84
|
+
disabled={
|
85
|
+
!props.permissions.edit ||
|
86
|
+
!(props.selectedRows.length || props.allRowsSelected)
|
87
|
+
}
|
85
88
|
onCancel={() => openModal(CANCEL_SELECTED_MODAL)}
|
86
89
|
onResume={() => openModal(RESUME_SELECTED_MODAL)}
|
87
90
|
onForceCancel={() => openModal(FORCE_UNLOCK_SELECTED_MODAL)}
|
@@ -94,15 +97,17 @@ const TasksTablePage = ({
|
|
94
97
|
}
|
95
98
|
>
|
96
99
|
<React.Fragment>
|
97
|
-
{
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
100
|
+
{props.permissions.edit &&
|
101
|
+
showSelectAll &&
|
102
|
+
props.itemCount >= props.pagination.perPage && (
|
103
|
+
<SelectAllAlert
|
104
|
+
itemCount={props.itemCount}
|
105
|
+
perPage={props.pagination.perPage}
|
106
|
+
selectAllRows={selectAllRows}
|
107
|
+
unselectAllRows={props.unselectAllRows}
|
108
|
+
allRowsSelected={props.allRowsSelected}
|
109
|
+
/>
|
110
|
+
)}
|
106
111
|
<TasksTable history={history} {...props} openModal={openModal} />
|
107
112
|
</React.Fragment>
|
108
113
|
</PageLayout>
|
@@ -131,6 +136,9 @@ TasksTablePage.propTypes = {
|
|
131
136
|
showSelectAll: PropTypes.bool,
|
132
137
|
unselectAllRows: PropTypes.func.isRequired,
|
133
138
|
reloadPage: PropTypes.func.isRequired,
|
139
|
+
permissions: PropTypes.shape({
|
140
|
+
edit: PropTypes.bool,
|
141
|
+
}),
|
134
142
|
};
|
135
143
|
|
136
144
|
TasksTablePage.defaultProps = {
|
@@ -146,6 +154,9 @@ TasksTablePage.defaultProps = {
|
|
146
154
|
createHeader: () => __('Tasks'),
|
147
155
|
showSelectAll: false,
|
148
156
|
modalID: '',
|
157
|
+
permissions: {
|
158
|
+
edit: false,
|
159
|
+
},
|
149
160
|
};
|
150
161
|
|
151
162
|
export default TasksTablePage;
|
@@ -19,8 +19,13 @@ const initialState = Immutable({
|
|
19
19
|
|
20
20
|
export const TasksTableQueryReducer = (state = initialState, action) => {
|
21
21
|
const { type, payload, response } = action;
|
22
|
-
const {
|
23
|
-
|
22
|
+
const {
|
23
|
+
subtotal,
|
24
|
+
page,
|
25
|
+
per_page: perPageString,
|
26
|
+
action_name: actionName,
|
27
|
+
can_edit: canEdit,
|
28
|
+
} = response || {};
|
24
29
|
const ACTION_TYPES = createTableActionTypes(TASKS_TABLE_ID);
|
25
30
|
switch (type) {
|
26
31
|
case SELECT_ALL_ROWS:
|
@@ -34,26 +39,22 @@ export const TasksTableQueryReducer = (state = initialState, action) => {
|
|
34
39
|
perPage: Number(perPageString),
|
35
40
|
},
|
36
41
|
selectedRows: [],
|
42
|
+
permissions: {
|
43
|
+
edit: canEdit,
|
44
|
+
},
|
37
45
|
});
|
38
46
|
case SELECT_ROWS:
|
39
47
|
return state.set('selectedRows', union(payload, state.selectedRows));
|
40
48
|
case OPEN_SELECT_ALL:
|
41
49
|
return state.set('showSelectAll', true);
|
42
50
|
case UNSELECT_ROWS:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
.set('allRowsSelected', false)
|
51
|
-
.set('showSelectAll', false);
|
52
|
-
}
|
53
|
-
return state.set(
|
54
|
-
'selectedRows',
|
55
|
-
state.selectedRows.filter(row => row !== payload.id)
|
56
|
-
);
|
51
|
+
return state
|
52
|
+
.set(
|
53
|
+
'selectedRows',
|
54
|
+
state.selectedRows.filter(row => row !== payload.id)
|
55
|
+
)
|
56
|
+
.set('showSelectAll', false)
|
57
|
+
.set('allRowsSelected', false);
|
57
58
|
case UNSELECT_ALL_ROWS:
|
58
59
|
return state
|
59
60
|
.set('selectedRows', [])
|
@@ -24,6 +24,9 @@ export const selectActionName = state =>
|
|
24
24
|
export const selectSelectedRows = state =>
|
25
25
|
selectTasksTableQuery(state).selectedRows || [];
|
26
26
|
|
27
|
+
export const selectPermissions = state =>
|
28
|
+
selectTasksTableQuery(state).permissions || { edit: false };
|
29
|
+
|
27
30
|
export const selectResults = createSelector(
|
28
31
|
selectTasksTableContent,
|
29
32
|
({ results }) =>
|
@@ -32,7 +32,7 @@ describe('getCSVurl', () => {
|
|
32
32
|
const url = '/foreman_tasks/tasks';
|
33
33
|
const query = { state: 'stopped' };
|
34
34
|
expect(getCSVurl(url, query)).toEqual(
|
35
|
-
'/foreman_tasks/tasks.csv?
|
35
|
+
'/foreman_tasks/tasks.csv?search=%28state%3Dstopped%29'
|
36
36
|
);
|
37
37
|
});
|
38
38
|
it('should return currect url for subtasks', () => {
|
@@ -73,7 +73,9 @@ const fixtures = {
|
|
73
73
|
},
|
74
74
|
},
|
75
75
|
'should handle UNSELECT_ROWS with all rows selected': {
|
76
|
-
state: Immutable({
|
76
|
+
state: Immutable({
|
77
|
+
tasksTableQuery: { allRowsSelected: true, selectedRows: [3, 4, 5] },
|
78
|
+
}),
|
77
79
|
action: {
|
78
80
|
type: UNSELECT_ROWS,
|
79
81
|
payload: { id: [4], results: [{ id: 3 }, { id: 4 }, { id: 5 }] },
|
data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap
CHANGED
@@ -92,7 +92,7 @@ exports[`TasksTablePage rendering render with Breadcrubs and edit permissions 1`
|
|
92
92
|
/>
|
93
93
|
<ExportButton
|
94
94
|
title="Export All"
|
95
|
-
url="/foreman_tasks/tasks.csv?
|
95
|
+
url="/foreman_tasks/tasks.csv?search=%28state%3Dstopped%29"
|
96
96
|
/>
|
97
97
|
<ActionSelectButton
|
98
98
|
disabled={true}
|
@@ -126,6 +126,11 @@ exports[`TasksTablePage rendering render with Breadcrubs and edit permissions 1`
|
|
126
126
|
}
|
127
127
|
}
|
128
128
|
parentTaskID={null}
|
129
|
+
permissions={
|
130
|
+
Object {
|
131
|
+
"edit": false,
|
132
|
+
}
|
133
|
+
}
|
129
134
|
reloadPage={[MockFunction]}
|
130
135
|
results={
|
131
136
|
Array [
|
@@ -227,7 +232,7 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
|
|
227
232
|
/>
|
228
233
|
<ExportButton
|
229
234
|
title="Export All"
|
230
|
-
url="/foreman_tasks/tasks.csv?
|
235
|
+
url="/foreman_tasks/tasks.csv?search=%28state%3Dstopped%29"
|
231
236
|
/>
|
232
237
|
<ActionSelectButton
|
233
238
|
disabled={true}
|
@@ -261,6 +266,11 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
|
|
261
266
|
}
|
262
267
|
}
|
263
268
|
parentTaskID={null}
|
269
|
+
permissions={
|
270
|
+
Object {
|
271
|
+
"edit": false,
|
272
|
+
}
|
273
|
+
}
|
264
274
|
reloadPage={[MockFunction]}
|
265
275
|
results={
|
266
276
|
Array [
|
@@ -59,6 +59,9 @@ Object {
|
|
59
59
|
"page": 3,
|
60
60
|
"perPage": 12,
|
61
61
|
},
|
62
|
+
"permissions": Object {
|
63
|
+
"edit": undefined,
|
64
|
+
},
|
62
65
|
"selectedRows": Array [],
|
63
66
|
},
|
64
67
|
}
|
@@ -77,7 +80,9 @@ Object {
|
|
77
80
|
exports[`TasksTableReducer reducer should handle UNSELECT_ROWS 1`] = `
|
78
81
|
Object {
|
79
82
|
"tasksTableQuery": Object {
|
83
|
+
"allRowsSelected": false,
|
80
84
|
"selectedRows": Array [],
|
85
|
+
"showSelectAll": false,
|
81
86
|
},
|
82
87
|
}
|
83
88
|
`;
|
@@ -16,6 +16,7 @@ import {
|
|
16
16
|
selectAllRowsSelected,
|
17
17
|
selectShowSelectAll,
|
18
18
|
selectModalID,
|
19
|
+
selectPermissions,
|
19
20
|
} from './TasksTableSelectors';
|
20
21
|
|
21
22
|
const mapStateToProps = state => ({
|
@@ -30,6 +31,7 @@ const mapStateToProps = state => ({
|
|
30
31
|
allRowsSelected: selectAllRowsSelected(state),
|
31
32
|
showSelectAll: selectShowSelectAll(state),
|
32
33
|
modalID: selectModalID(state),
|
34
|
+
permissions: selectPermissions(state),
|
33
35
|
});
|
34
36
|
|
35
37
|
const mapDispatchToProps = dispatch =>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Nečas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dynflow
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- app/lib/actions/proxy_action.rb
|
166
166
|
- app/lib/actions/recurring_action.rb
|
167
167
|
- app/lib/actions/serializers/active_record_serializer.rb
|
168
|
+
- app/lib/actions/trigger_proxy_batch.rb
|
168
169
|
- app/lib/foreman_tasks/concerns/polling_action_extensions.rb
|
169
170
|
- app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb
|
170
171
|
- app/models/foreman_tasks/concerns/action_subject.rb
|
@@ -187,7 +188,6 @@ files:
|
|
187
188
|
- app/models/foreman_tasks/task_groups/recurring_logic_task_group.rb
|
188
189
|
- app/models/foreman_tasks/triggering.rb
|
189
190
|
- app/models/setting/foreman_tasks.rb
|
190
|
-
- app/services/foreman_tasks/dashboard_table_filter.rb
|
191
191
|
- app/services/foreman_tasks/proxy_selector.rb
|
192
192
|
- app/services/foreman_tasks/troubleshooting_help_generator.rb
|
193
193
|
- app/services/ui_notifications/tasks.rb
|
@@ -249,6 +249,7 @@ files:
|
|
249
249
|
- db/migrate/20200517215015_rename_bookmarks_controller.rb
|
250
250
|
- db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb
|
251
251
|
- db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb
|
252
|
+
- db/migrate/20210720115251_add_purpose_to_recurring_logic.rb
|
252
253
|
- db/seeds.d/20-foreman_tasks_permissions.rb
|
253
254
|
- db/seeds.d/30-notification_blueprints.rb
|
254
255
|
- db/seeds.d/60-dynflow_proxy_feature.rb
|
@@ -257,6 +258,8 @@ files:
|
|
257
258
|
- deploy/foreman-tasks.sysconfig
|
258
259
|
- extra/dynflow-debug.sh
|
259
260
|
- extra/dynflow-executor.example
|
261
|
+
- extra/foreman-tasks-cleanup.sh
|
262
|
+
- extra/foreman-tasks-export.sh
|
260
263
|
- foreman-tasks.gemspec
|
261
264
|
- gemfile.d/foreman-tasks.rb
|
262
265
|
- lib/foreman-tasks.rb
|
@@ -323,9 +326,9 @@ files:
|
|
323
326
|
- test/unit/actions/bulk_action_test.rb
|
324
327
|
- test/unit/actions/proxy_action_test.rb
|
325
328
|
- test/unit/actions/recurring_action_test.rb
|
329
|
+
- test/unit/actions/trigger_proxy_batch_test.rb
|
326
330
|
- test/unit/cleaner_test.rb
|
327
331
|
- test/unit/config/environment.rb
|
328
|
-
- test/unit/dashboard_table_filter_test.rb
|
329
332
|
- test/unit/dynflow_console_authorizer_test.rb
|
330
333
|
- test/unit/locking_test.rb
|
331
334
|
- test/unit/proxy_selector_test.rb
|
@@ -637,9 +640,9 @@ test_files:
|
|
637
640
|
- test/unit/actions/bulk_action_test.rb
|
638
641
|
- test/unit/actions/proxy_action_test.rb
|
639
642
|
- test/unit/actions/recurring_action_test.rb
|
643
|
+
- test/unit/actions/trigger_proxy_batch_test.rb
|
640
644
|
- test/unit/cleaner_test.rb
|
641
645
|
- test/unit/config/environment.rb
|
642
|
-
- test/unit/dashboard_table_filter_test.rb
|
643
646
|
- test/unit/dynflow_console_authorizer_test.rb
|
644
647
|
- test/unit/locking_test.rb
|
645
648
|
- test/unit/proxy_selector_test.rb
|