foreman_ansible 7.1.3 → 7.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/foreman_ansible/register.rb.orig +257 -0
  3. data/lib/foreman_ansible/version.rb +1 -1
  4. data/locale/ca/foreman_ansible.edit.po +1162 -0
  5. data/locale/ca/foreman_ansible.po.time_stamp +0 -0
  6. data/locale/cs_CZ/foreman_ansible.edit.po +1207 -0
  7. data/locale/cs_CZ/foreman_ansible.po.time_stamp +0 -0
  8. data/locale/de/foreman_ansible.edit.po +1148 -0
  9. data/locale/de/foreman_ansible.po.time_stamp +0 -0
  10. data/locale/en/foreman_ansible.edit.po +1146 -0
  11. data/locale/en/foreman_ansible.po.time_stamp +0 -0
  12. data/locale/en_GB/foreman_ansible.edit.po +1155 -0
  13. data/locale/en_GB/foreman_ansible.po.time_stamp +0 -0
  14. data/locale/es/foreman_ansible.edit.po +1148 -0
  15. data/locale/es/foreman_ansible.po.time_stamp +0 -0
  16. data/locale/fr/foreman_ansible.edit.po +1148 -0
  17. data/locale/fr/foreman_ansible.po.time_stamp +0 -0
  18. data/locale/gl/foreman_ansible.edit.po +1156 -0
  19. data/locale/gl/foreman_ansible.po.time_stamp +0 -0
  20. data/locale/it/foreman_ansible.edit.po +1148 -0
  21. data/locale/it/foreman_ansible.po.time_stamp +0 -0
  22. data/locale/ja/foreman_ansible.edit.po +1148 -0
  23. data/locale/ja/foreman_ansible.po.time_stamp +0 -0
  24. data/locale/ko/foreman_ansible.edit.po +1148 -0
  25. data/locale/ko/foreman_ansible.po.time_stamp +0 -0
  26. data/locale/nl_NL/foreman_ansible.edit.po +1168 -0
  27. data/locale/nl_NL/foreman_ansible.po.time_stamp +0 -0
  28. data/locale/pl/foreman_ansible.edit.po +1180 -0
  29. data/locale/pl/foreman_ansible.po.time_stamp +0 -0
  30. data/locale/pt_BR/foreman_ansible.edit.po +1148 -0
  31. data/locale/pt_BR/foreman_ansible.po.time_stamp +0 -0
  32. data/locale/ru/foreman_ansible.edit.po +1149 -0
  33. data/locale/ru/foreman_ansible.po.time_stamp +0 -0
  34. data/locale/sv_SE/foreman_ansible.edit.po +1180 -0
  35. data/locale/sv_SE/foreman_ansible.po.time_stamp +0 -0
  36. data/locale/zh_CN/foreman_ansible.edit.po +1148 -0
  37. data/locale/zh_CN/foreman_ansible.po.time_stamp +0 -0
  38. data/locale/zh_TW/foreman_ansible.edit.po +1148 -0
  39. data/locale/zh_TW/foreman_ansible.po.time_stamp +0 -0
  40. data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js.orig +151 -0
  41. data/webpack/components/AnsibleHostDetail/components/RolesTab/__test__/EditRoles.test.js +2 -1
  42. data/webpack/components/AnsibleHostDetail/components/RolesTab/__test__/RolesTab.test.js +3 -1
  43. data/webpack/components/AnsibleHostDetail/components/RolesTab/index.js +26 -2
  44. data/webpack/testHelper.js +12 -3
  45. metadata +52 -14
File without changes
@@ -0,0 +1,151 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
5
+
6
+ import RelativeDateTime from 'foremanReact/components/common/dates/RelativeDateTime';
7
+
8
+ import {
9
+ TableComposable,
10
+ Thead,
11
+ Tbody,
12
+ Tr,
13
+ Th,
14
+ Td,
15
+ } from '@patternfly/react-table';
16
+ import { Flex, FlexItem, Pagination } from '@patternfly/react-core';
17
+
18
+ import { decodeId } from '../../../../globalIdHelper';
19
+ import withLoading from '../../../withLoading';
20
+ <<<<<<< HEAD
21
+ import { readableCron } from './JobsTabHelper';
22
+ import {
23
+ preparePerPageOptions,
24
+ refreshPage,
25
+ } from '../../../../helpers/paginationHelper';
26
+ =======
27
+ import { readableCron, readablePurpose } from './JobsTabHelper';
28
+ >>>>>>> 5b01704 (Fixes #34458 - Show Hostgroup jobs on the Host Detail page)
29
+
30
+ const PreviousJobsTable = ({ history, totalCount, jobs, pagination }) => {
31
+ const columns = [
32
+ __('Description'),
33
+ __('Result'),
34
+ __('State'),
35
+ __('Executed at'),
36
+ __('Schedule'),
37
+ ];
38
+
39
+ const handlePerPageSelected = (event, perPage) => {
40
+ refreshPage(history, { page: 1, perPage });
41
+ };
42
+
43
+ const handlePageSelected = (event, page) => {
44
+ refreshPage(history, { ...pagination, page });
45
+ };
46
+
47
+ const perPageOptions = preparePerPageOptions(usePaginationOptions());
48
+
49
+ return (
50
+ <React.Fragment>
51
+ <h3>{__('Previously executed jobs')}</h3>
52
+ <<<<<<< HEAD
53
+ <Flex className="pf-u-pt-md">
54
+ =======
55
+ <Flex direction={{ default: 'column' }} className="pf-u-pt-md">
56
+ <FlexItem align={{ default: 'alignRight' }}>
57
+ <Pagination updateParamsByUrl itemCount={totalCount} variant="top" />
58
+ </FlexItem>
59
+ <FlexItem>
60
+ <TableComposable variant="compact">
61
+ <Thead>
62
+ <Tr>
63
+ {columns.map(col => (
64
+ <Th key={col}>{col}</Th>
65
+ ))}
66
+ </Tr>
67
+ </Thead>
68
+ <Tbody>
69
+ {jobs.map(job => (
70
+ <Tr key={job.id}>
71
+ <Td>
72
+ <a
73
+ onClick={() =>
74
+ window.tfm.nav.pushUrl(
75
+ `/job_invocations/${decodeId(job.id)}`
76
+ )
77
+ }
78
+ >
79
+ {job.description}
80
+ </a>
81
+ &nbsp;
82
+ {readablePurpose(job.recurringLogic.purpose)}
83
+ </Td>
84
+ <Td>{job.task.result}</Td>
85
+ <Td>{job.task.state}</Td>
86
+ <Td>
87
+ <RelativeDateTime date={job.startAt} />
88
+ </Td>
89
+ <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
90
+ </Tr>
91
+ ))}
92
+ </Tbody>
93
+ </TableComposable>
94
+ </FlexItem>
95
+ >>>>>>> 5b01704 (Fixes #34458 - Show Hostgroup jobs on the Host Detail page)
96
+ <FlexItem align={{ default: 'alignRight' }}>
97
+ <Pagination
98
+ itemCount={totalCount}
99
+ page={pagination.page}
100
+ perPage={pagination.perPage}
101
+ onSetPage={handlePageSelected}
102
+ onPerPageSelect={handlePerPageSelected}
103
+ perPageOptions={perPageOptions}
104
+ variant="top"
105
+ />
106
+ </FlexItem>
107
+ </Flex>
108
+ <TableComposable variant="compact">
109
+ <Thead>
110
+ <Tr>
111
+ {columns.map(col => (
112
+ <Th key={col}>{col}</Th>
113
+ ))}
114
+ </Tr>
115
+ </Thead>
116
+ <Tbody>
117
+ {jobs.map(job => (
118
+ <Tr key={job.id}>
119
+ <Td>
120
+ <a
121
+ onClick={() =>
122
+ window.tfm.nav.pushUrl(
123
+ `/job_invocations/${decodeId(job.id)}`
124
+ )
125
+ }
126
+ >
127
+ {job.description}
128
+ </a>
129
+ </Td>
130
+ <Td>{job.task.result}</Td>
131
+ <Td>{job.task.state}</Td>
132
+ <Td>
133
+ <RelativeDateTime date={job.startAt} />
134
+ </Td>
135
+ <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
136
+ </Tr>
137
+ ))}
138
+ </Tbody>
139
+ </TableComposable>
140
+ </React.Fragment>
141
+ );
142
+ };
143
+
144
+ PreviousJobsTable.propTypes = {
145
+ jobs: PropTypes.array.isRequired,
146
+ history: PropTypes.object.isRequired,
147
+ totalCount: PropTypes.number.isRequired,
148
+ pagination: PropTypes.object.isRequired,
149
+ };
150
+
151
+ export default withLoading(PreviousJobsTable);
@@ -21,7 +21,8 @@ import {
21
21
  assignRolesErrorMock,
22
22
  } from './RolesTab.fixtures';
23
23
 
24
- const TestComponent = withReactRouter(withRedux(withMockedProvider(RolesTab)));
24
+ jest.mock('axios');
25
+ const TestComponent = withRedux(withReactRouter(withMockedProvider(RolesTab)));
25
26
 
26
27
  describe('assigning Ansible roles', () => {
27
28
  it('should assign Ansible roles', async () => {
@@ -6,6 +6,7 @@ import {
6
6
  tick,
7
7
  withMockedProvider,
8
8
  withReactRouter,
9
+ withRedux,
9
10
  } from '../../../../../testHelper';
10
11
 
11
12
  import {
@@ -18,7 +19,8 @@ import {
18
19
 
19
20
  import RolesTab from '../';
20
21
 
21
- const TestComponent = withReactRouter(withMockedProvider(RolesTab));
22
+ jest.mock('axios');
23
+ const TestComponent = withRedux(withReactRouter(withMockedProvider(RolesTab)));
22
24
 
23
25
  describe('RolesTab', () => {
24
26
  it('should load Ansible Roles as admin', async () => {
@@ -2,7 +2,10 @@ import React, { useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { useQuery } from '@apollo/client';
4
4
  import { Button } from '@patternfly/react-core';
5
+ import { Link, Route } from 'react-router-dom';
5
6
  import { translate as __ } from 'foremanReact/common/I18n';
7
+ import { foremanUrl } from 'foremanReact/common/helpers';
8
+ import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
6
9
 
7
10
  import ansibleRolesQuery from '../../../../graphql/queries/hostAnsibleRoles.gql';
8
11
  import { encodeId } from '../../../../globalIdHelper';
@@ -12,6 +15,7 @@ import {
12
15
  useCurrentPagination,
13
16
  } from '../../../../helpers/pageParamsHelper';
14
17
  import EditRolesModal from './EditRolesModal';
18
+ import AllRolesModal from './AllRolesModal';
15
19
 
16
20
  const RolesTab = ({ hostId, history, canEditHost }) => {
17
21
  const hostGlobalId = encodeId('Host', hostId);
@@ -33,9 +37,28 @@ const RolesTab = ({ hostId, history, canEditHost }) => {
33
37
  onClick={() => setAssignModal(true)}
34
38
  aria-label="edit ansible roles"
35
39
  >
36
- {__('Assign Ansible roles')}
40
+ {__('Assign roles directly to the host')}
37
41
  </Button>
38
42
  ) : null;
43
+
44
+ const url = hostId && foremanUrl(`/api/v2/hosts/${hostId}/ansible_roles`);
45
+ const { response: allAnsibleRoles } = useAPI('get', url, {
46
+ key: 'ANSIBLE_ROLES',
47
+ });
48
+ const emptyStateDescription = allAnsibleRoles.length > 0 && (
49
+ <>
50
+ <Route path="/Ansible/roles/all">
51
+ <AllRolesModal
52
+ onClose={() => history.push('/Ansible/roles')}
53
+ isOpen
54
+ hostGlobalId={hostGlobalId}
55
+ history={history}
56
+ />
57
+ </Route>
58
+ <Link to="/Ansible/roles/all">{__('View inherited roles')}</Link>
59
+ </>
60
+ );
61
+
39
62
  return (
40
63
  <>
41
64
  <RolesTable
@@ -46,8 +69,9 @@ const RolesTab = ({ hostId, history, canEditHost }) => {
46
69
  history={history}
47
70
  hostGlobalId={hostGlobalId}
48
71
  emptyStateProps={{
49
- header: __('No Ansible roles assigned'),
72
+ header: __('No roles assigned directly to the host'),
50
73
  action: editBtn,
74
+ description: emptyStateDescription,
51
75
  }}
52
76
  pagination={pagination}
53
77
  canEditHost={canEditHost}
@@ -1,15 +1,24 @@
1
1
  import React from 'react';
2
2
  import { Provider } from 'react-redux';
3
+ import thunk from 'redux-thunk';
4
+ import { applyMiddleware, createStore, compose, combineReducers } from 'redux';
3
5
  import { MockedProvider } from '@apollo/react-testing';
4
6
  import { Router, MemoryRouter } from 'react-router-dom';
5
7
  import { createMemoryHistory } from 'history';
6
8
 
7
- import store from 'foremanReact/redux';
8
- import ConfirmModal from 'foremanReact/components/ConfirmModal';
9
+ import { reducers as apiReducer, APIMiddleware } from 'foremanReact/redux/API';
10
+ import ConfirmModal, {
11
+ reducers as confirmModalReducers,
12
+ } from 'foremanReact/components/ConfirmModal';
9
13
  import { getForemanContext } from 'foremanReact/Root/Context/ForemanContext';
10
14
 
15
+ const reducers = combineReducers({ ...apiReducer, ...confirmModalReducers });
16
+
17
+ export const generateStore = () =>
18
+ createStore(reducers, compose(applyMiddleware(thunk, APIMiddleware)));
19
+
11
20
  export const withRedux = Component => props => (
12
- <Provider store={store}>
21
+ <Provider store={generateStore()}>
13
22
  <Component {...props} />
14
23
  <ConfirmModal />
15
24
  </Provider>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_ansible
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.3
4
+ version: 7.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Lobato Garcia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-25 00:00:00.000000000 Z
11
+ date: 2022-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts_as_list
@@ -223,48 +223,85 @@ files:
223
223
  - lib/foreman_ansible.rb
224
224
  - lib/foreman_ansible/engine.rb
225
225
  - lib/foreman_ansible/register.rb
226
+ - lib/foreman_ansible/register.rb.orig
226
227
  - lib/foreman_ansible/remote_execution.rb
227
228
  - lib/foreman_ansible/version.rb
228
229
  - locale/Makefile
229
230
  - locale/action_names.rb
230
231
  - locale/ca/LC_MESSAGES/foreman_ansible.mo
232
+ - locale/ca/foreman_ansible.edit.po
231
233
  - locale/ca/foreman_ansible.po
234
+ - locale/ca/foreman_ansible.po.time_stamp
232
235
  - locale/cs_CZ/LC_MESSAGES/foreman_ansible.mo
236
+ - locale/cs_CZ/foreman_ansible.edit.po
233
237
  - locale/cs_CZ/foreman_ansible.po
238
+ - locale/cs_CZ/foreman_ansible.po.time_stamp
234
239
  - locale/de/LC_MESSAGES/foreman_ansible.mo
240
+ - locale/de/foreman_ansible.edit.po
235
241
  - locale/de/foreman_ansible.po
242
+ - locale/de/foreman_ansible.po.time_stamp
236
243
  - locale/en/LC_MESSAGES/foreman_ansible.mo
244
+ - locale/en/foreman_ansible.edit.po
237
245
  - locale/en/foreman_ansible.po
246
+ - locale/en/foreman_ansible.po.time_stamp
238
247
  - locale/en_GB/LC_MESSAGES/foreman_ansible.mo
248
+ - locale/en_GB/foreman_ansible.edit.po
239
249
  - locale/en_GB/foreman_ansible.po
250
+ - locale/en_GB/foreman_ansible.po.time_stamp
240
251
  - locale/es/LC_MESSAGES/foreman_ansible.mo
252
+ - locale/es/foreman_ansible.edit.po
241
253
  - locale/es/foreman_ansible.po
254
+ - locale/es/foreman_ansible.po.time_stamp
242
255
  - locale/foreman_ansible.pot
243
256
  - locale/fr/LC_MESSAGES/foreman_ansible.mo
257
+ - locale/fr/foreman_ansible.edit.po
244
258
  - locale/fr/foreman_ansible.po
259
+ - locale/fr/foreman_ansible.po.time_stamp
245
260
  - locale/gemspec.rb
246
261
  - locale/gl/LC_MESSAGES/foreman_ansible.mo
262
+ - locale/gl/foreman_ansible.edit.po
247
263
  - locale/gl/foreman_ansible.po
264
+ - locale/gl/foreman_ansible.po.time_stamp
248
265
  - locale/it/LC_MESSAGES/foreman_ansible.mo
266
+ - locale/it/foreman_ansible.edit.po
249
267
  - locale/it/foreman_ansible.po
268
+ - locale/it/foreman_ansible.po.time_stamp
250
269
  - locale/ja/LC_MESSAGES/foreman_ansible.mo
270
+ - locale/ja/foreman_ansible.edit.po
251
271
  - locale/ja/foreman_ansible.po
272
+ - locale/ja/foreman_ansible.po.time_stamp
252
273
  - locale/ko/LC_MESSAGES/foreman_ansible.mo
274
+ - locale/ko/foreman_ansible.edit.po
253
275
  - locale/ko/foreman_ansible.po
276
+ - locale/ko/foreman_ansible.po.time_stamp
254
277
  - locale/nl_NL/LC_MESSAGES/foreman_ansible.mo
278
+ - locale/nl_NL/foreman_ansible.edit.po
255
279
  - locale/nl_NL/foreman_ansible.po
280
+ - locale/nl_NL/foreman_ansible.po.time_stamp
256
281
  - locale/pl/LC_MESSAGES/foreman_ansible.mo
282
+ - locale/pl/foreman_ansible.edit.po
257
283
  - locale/pl/foreman_ansible.po
284
+ - locale/pl/foreman_ansible.po.time_stamp
258
285
  - locale/pt_BR/LC_MESSAGES/foreman_ansible.mo
286
+ - locale/pt_BR/foreman_ansible.edit.po
259
287
  - locale/pt_BR/foreman_ansible.po
288
+ - locale/pt_BR/foreman_ansible.po.time_stamp
260
289
  - locale/ru/LC_MESSAGES/foreman_ansible.mo
290
+ - locale/ru/foreman_ansible.edit.po
261
291
  - locale/ru/foreman_ansible.po
292
+ - locale/ru/foreman_ansible.po.time_stamp
262
293
  - locale/sv_SE/LC_MESSAGES/foreman_ansible.mo
294
+ - locale/sv_SE/foreman_ansible.edit.po
263
295
  - locale/sv_SE/foreman_ansible.po
296
+ - locale/sv_SE/foreman_ansible.po.time_stamp
264
297
  - locale/zh_CN/LC_MESSAGES/foreman_ansible.mo
298
+ - locale/zh_CN/foreman_ansible.edit.po
265
299
  - locale/zh_CN/foreman_ansible.po
300
+ - locale/zh_CN/foreman_ansible.po.time_stamp
266
301
  - locale/zh_TW/LC_MESSAGES/foreman_ansible.mo
302
+ - locale/zh_TW/foreman_ansible.edit.po
267
303
  - locale/zh_TW/foreman_ansible.po
304
+ - locale/zh_TW/foreman_ansible.po.time_stamp
268
305
  - package.json
269
306
  - test/factories/ansible_proxy.rb
270
307
  - test/factories/ansible_roles.rb
@@ -338,6 +375,7 @@ files:
338
375
  - webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.js
339
376
  - webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.scss
340
377
  - webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js
378
+ - webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js.orig
341
379
  - webpack/components/AnsibleHostDetail/components/JobsTab/RecurringJobsTable.js
342
380
  - webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.fixtures.js
343
381
  - webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.test.js
@@ -458,7 +496,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
458
496
  - !ruby/object:Gem::Version
459
497
  version: '0'
460
498
  requirements: []
461
- rubygems_version: 3.2.26
499
+ rubygems_version: 3.1.6
462
500
  signing_key:
463
501
  specification_version: 4
464
502
  summary: Ansible integration with Foreman (theforeman.org)
@@ -473,34 +511,25 @@ test_files:
473
511
  - test/fixtures/sample_facts.json
474
512
  - test/fixtures/sample_playbooks.json
475
513
  - test/foreman_ansible/helpers/ansible_roles_helper_test.rb
476
- - test/functional/ansible_roles_controller_test.rb
477
- - test/functional/ansible_variables_controller_test.rb
478
514
  - test/functional/api/v2/ansible_inventories_controller_test.rb
479
515
  - test/functional/api/v2/ansible_playbooks_controller_test.rb
480
516
  - test/functional/api/v2/ansible_roles_controller_test.rb
481
517
  - test/functional/api/v2/ansible_variables_controller_test.rb
482
518
  - test/functional/api/v2/hostgroups_controller_test.rb
483
519
  - test/functional/api/v2/hosts_controller_test.rb
520
+ - test/functional/ansible_roles_controller_test.rb
521
+ - test/functional/ansible_variables_controller_test.rb
484
522
  - test/functional/hosts_controller_test.rb
485
523
  - test/functional/ui_ansible_roles_controller_test.rb
486
524
  - test/graphql/mutations/hosts/assign_ansible_roles_mutation_test.rb
487
525
  - test/graphql/queries/ansible_roles_query_test.rb
488
526
  - test/graphql/queries/host_ansible_roles_query_test.rb
489
- - test/test_plugin_helper.rb
490
527
  - test/unit/actions/run_ansible_job_test.rb
491
528
  - test/unit/actions/run_proxy_ansible_command_test.rb
492
- - test/unit/ansible_provider_test.rb
493
- - test/unit/ansible_role_test.rb
494
- - test/unit/ansible_variable_test.rb
495
529
  - test/unit/concerns/config_reports_extensions_test.rb
496
530
  - test/unit/concerns/host_managed_extensions_test.rb
497
531
  - test/unit/concerns/hostgroup_extensions_test.rb
498
532
  - test/unit/helpers/ansible_reports_helper_test.rb
499
- - test/unit/host_ansible_role_test.rb
500
- - test/unit/hostgroup_ansible_role_test.rb
501
- - test/unit/ignore_roles_test.rb
502
- - test/unit/import_playbooks_test.rb
503
- - test/unit/import_roles_and_variables.rb
504
533
  - test/unit/lib/proxy_api/ansible_test.rb
505
534
  - test/unit/services/ansible_report_importer_test.rb
506
535
  - test/unit/services/ansible_variables_importer_test.rb
@@ -510,3 +539,12 @@ test_files:
510
539
  - test/unit/services/override_resolver_test.rb
511
540
  - test/unit/services/roles_importer_test.rb
512
541
  - test/unit/services/ui_roles_importer_test.rb
542
+ - test/unit/ansible_provider_test.rb
543
+ - test/unit/ansible_role_test.rb
544
+ - test/unit/ansible_variable_test.rb
545
+ - test/unit/host_ansible_role_test.rb
546
+ - test/unit/hostgroup_ansible_role_test.rb
547
+ - test/unit/ignore_roles_test.rb
548
+ - test/unit/import_playbooks_test.rb
549
+ - test/unit/import_roles_and_variables.rb
550
+ - test/test_plugin_helper.rb