foreman_ansible 7.0.2 → 7.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 299049c29764a0920259664c06288f37ea56d4b920e049243baeab9ad7f2e608
4
- data.tar.gz: 779264101df1f9fa6e0188c8673a435b98eb4dbd9fd814e754f991247b5bb250
3
+ metadata.gz: 7a8c4f263992d803c31386bc301ce1e032c680ada845db8bf07e71162c003384
4
+ data.tar.gz: 628c7b6952499ef5dfe912370bec8d3e936926a004acf5b7693d7706fe461ea9
5
5
  SHA512:
6
- metadata.gz: '08a1b935eb0c033ff08674e4922ee597d39ed602ef351b82d9ac763af9d850e5a32ff9ea482af7f74a641552ebaf62094b6fa59170cba317b5bba67949d31a8d'
7
- data.tar.gz: 3f814381b2167e370757f761a0b5d3e1217e3c3ba4293d7f1ecf1e77599c232ef8c62beae293c8593d81ab4e305ae1cced983527bc6d29e248bbda3a3f4e731e
6
+ metadata.gz: '09f3fd7b961edcb7abee1f6dd6de4fbf0bb80130668c39724d6c8658c2ca1570109ab6b7d172d2f9b963c6e4e5aebaa3280ebf199f9fe5ff86580ab1d8f06c7e'
7
+ data.tar.gz: 924b85ee81562a848c07417fd0788520c000292901f63ef45f8adbfc99ec32dae21858589c83688f461d19e49a4c6491801d53f611032a1c291ba941e9068133
@@ -115,7 +115,8 @@ if defined? ForemanRemoteExecution
115
115
  end
116
116
 
117
117
  def proxy_batch_size
118
- Setting['foreman_ansible_proxy_batch_size']
118
+ value = Setting['foreman_ansible_proxy_batch_size']
119
+ value.presence && value.to_i
119
120
  end
120
121
 
121
122
  private
@@ -4,5 +4,5 @@
4
4
  # This way other parts of Foreman can just call ForemanAnsible::VERSION
5
5
  # and detect what version the plugin is running.
6
6
  module ForemanAnsible
7
- VERSION = '7.0.2'
7
+ VERSION = '7.0.3'
8
8
  end
@@ -47,4 +47,16 @@ class AnsibleProviderTest < ActiveSupport::TestCase
47
47
  proxy_command_options(template_invocation, dummyhost)
48
48
  end
49
49
  end
50
+
51
+ describe '#proxy_batch_size' do
52
+ it 'returns integer if setting is string' do
53
+ Setting.expects(:[]).with('foreman_ansible_proxy_batch_size').returns('10')
54
+ _(ForemanAnsible::AnsibleProvider.proxy_batch_size).must_equal(10)
55
+ end
56
+
57
+ it 'returns nil if setting is empty' do
58
+ Setting.expects(:[]).with('foreman_ansible_proxy_batch_size').returns('')
59
+ _(ForemanAnsible::AnsibleProvider.proxy_batch_size).must_equal(nil)
60
+ end
61
+ end
50
62
  end
@@ -7,21 +7,36 @@ import { showToast } from '../../../../toastHelper';
7
7
  export const ansiblePurpose = (resourceName, resourceId) =>
8
8
  `ansible-${resourceName}-${resourceId}`;
9
9
 
10
- const jobSearch = (resourceName, resourceId, statusSearch) =>
11
- `recurring = true && pattern_template_name = "Ansible Roles - Ansible Default" && ${statusSearch} && recurring_logic.purpose = ${ansiblePurpose(
10
+ const jobSearch = (resourceName, resourceId, status, hostGroupId) => {
11
+ const search = `recurring = true && pattern_template_name = "Ansible Roles - Ansible Default"`;
12
+ const searchStatus = ` && ${status}`;
13
+ const searchHost = ` && recurring_logic.purpose = ${ansiblePurpose(
12
14
  resourceName,
13
15
  resourceId
14
16
  )}`;
17
+ const searchHostGroup = hostGroupId
18
+ ? ` or recurring_logic.purpose = ${ansiblePurpose(
19
+ 'hostgroup',
20
+ hostGroupId
21
+ )}`
22
+ : '';
15
23
 
16
- export const scheduledJobsSearch = (resourceName, resourceId) =>
17
- jobSearch(resourceName, resourceId, 'status = queued');
18
- export const previousJobsSearch = (resourceName, resourceId) =>
19
- jobSearch(resourceName, resourceId, 'status != queued');
24
+ return search + searchStatus + searchHost + searchHostGroup;
25
+ };
26
+
27
+ export const scheduledJobsSearch = (resourceName, resourceId, hostGroupId) =>
28
+ jobSearch(resourceName, resourceId, 'status = queued', hostGroupId);
29
+ export const previousJobsSearch = (resourceName, resourceId, hostGroupId) =>
30
+ jobSearch(resourceName, resourceId, 'status != queued', hostGroupId);
20
31
 
21
32
  const fetchJobsFn = (searchFn, pagination = {}) => componentProps =>
22
33
  useQuery(jobsQuery, {
23
34
  variables: {
24
- search: searchFn(componentProps.resourceName, componentProps.resourceId),
35
+ search: searchFn(
36
+ componentProps.resourceName,
37
+ componentProps.resourceId,
38
+ componentProps.hostGroupId
39
+ ),
25
40
  ...pagination,
26
41
  },
27
42
  });
@@ -77,3 +92,30 @@ export const useCancelMutation = (resourceName, resourceId) =>
77
92
  },
78
93
  ],
79
94
  });
95
+
96
+ export const readableCron = (cron = '') => {
97
+ if (cron.match(/(\d+ \* \* \* \*)/)) {
98
+ return 'hourly';
99
+ }
100
+
101
+ if (cron.match(/(\d+ \d+ \* \* \*)/)) {
102
+ return 'daily';
103
+ }
104
+
105
+ if (cron.match(/(\d+ \d+ \* \* \d+)/)) {
106
+ return 'weekly';
107
+ }
108
+
109
+ if (cron.match(/(\d+ \d+ \d+ \* \*)/)) {
110
+ return 'monthly';
111
+ }
112
+
113
+ return 'custom';
114
+ };
115
+
116
+ export const readablePurpose = (purpose = '') => {
117
+ if (window.location.href.match(/ansible\/hostgroup/)) {
118
+ return '';
119
+ }
120
+ return purpose.match(/hostgroup/) ? __('(from host group)') : '';
121
+ };
@@ -17,6 +17,7 @@ import { Flex, FlexItem, Pagination } from '@patternfly/react-core';
17
17
 
18
18
  import { decodeId } from '../../../../globalIdHelper';
19
19
  import withLoading from '../../../withLoading';
20
+ import { readableCron, readablePurpose } from './JobsTabHelper';
20
21
  import {
21
22
  preparePerPageOptions,
22
23
  refreshPage,
@@ -78,13 +79,15 @@ const PreviousJobsTable = ({ history, totalCount, jobs, pagination }) => {
78
79
  >
79
80
  {job.description}
80
81
  </a>
82
+ &nbsp;
83
+ {readablePurpose(job.recurringLogic.purpose)}
81
84
  </Td>
82
85
  <Td>{job.task.result}</Td>
83
86
  <Td>{job.task.state}</Td>
84
87
  <Td>
85
88
  <RelativeDateTime date={job.startAt} />
86
89
  </Td>
87
- <Td>{job.recurringLogic.cronLine}</Td>
90
+ <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
88
91
  </Tr>
89
92
  ))}
90
93
  </Tbody>
@@ -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);
@@ -14,11 +14,20 @@ import {
14
14
  Td,
15
15
  } from '@patternfly/react-table';
16
16
 
17
- import { useCancelMutation } from './JobsTabHelper';
17
+ import {
18
+ useCancelMutation,
19
+ readableCron,
20
+ readablePurpose,
21
+ } from './JobsTabHelper';
18
22
  import withLoading from '../../../withLoading';
19
23
  import { decodeId } from '../../../../globalIdHelper';
20
24
 
21
- const RecurringJobsTable = ({ jobs, resourceName, resourceId }) => {
25
+ const RecurringJobsTable = ({
26
+ jobs,
27
+ resourceName,
28
+ resourceId,
29
+ hostGroupId,
30
+ }) => {
22
31
  const columns = [__('Description'), __('Schedule'), __('Next Run')];
23
32
  const dispatch = useDispatch();
24
33
 
@@ -73,8 +82,10 @@ const RecurringJobsTable = ({ jobs, resourceName, resourceId }) => {
73
82
  >
74
83
  {job.description}
75
84
  </a>
85
+ &nbsp;
86
+ {readablePurpose(job.recurringLogic.purpose)}
76
87
  </Td>
77
- <Td>{job.recurringLogic.cronLine}</Td>
88
+ <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
78
89
  <Td>
79
90
  <RelativeDateTime date={job.startAt} />
80
91
  </Td>
@@ -91,6 +102,11 @@ RecurringJobsTable.propTypes = {
91
102
  jobs: PropTypes.array.isRequired,
92
103
  resourceId: PropTypes.number.isRequired,
93
104
  resourceName: PropTypes.string.isRequired,
105
+ hostGroupId: PropTypes.number,
106
+ };
107
+
108
+ RecurringJobsTable.defaultProps = {
109
+ hostGroupId: undefined,
94
110
  };
95
111
 
96
112
  export default withLoading(RecurringJobsTable);
@@ -23,10 +23,12 @@ const viewer = userFactory('viewer', [
23
23
 
24
24
  const firstRecurringLogicGlobalId =
25
25
  'MDE6Rm9yZW1hblRhc2tzOjpSZWN1cnJpbmdMb2dpYy0x';
26
+
26
27
  const firstRecurringLogic = {
27
28
  __typename: 'ForemanTasks::RecurringLogic',
28
29
  id: firstRecurringLogicGlobalId,
29
30
  cronLine: toCron(futureDate, 'weekly'),
31
+ purpose: '',
30
32
  meta: {
31
33
  canEdit: true,
32
34
  },
@@ -66,6 +68,7 @@ export const secondJob = {
66
68
  __typename: 'ForemanTasks::RecurringLogic',
67
69
  id: 'MDE6Rm9yZW1hblRhc2tzOjpSZWN1cnJpbmdMb2dpYy0yMw==',
68
70
  cronLine: '54 10 15 * *',
71
+ purpose: '',
69
72
  meta: {
70
73
  canEdit: true,
71
74
  },
@@ -18,6 +18,7 @@ import {
18
18
  import * as toasts from '../../../../../toastHelper';
19
19
 
20
20
  import { toCron } from '../NewRecurringJobHelper';
21
+ import { readableCron } from '../JobsTabHelper';
21
22
 
22
23
  import {
23
24
  tick,
@@ -49,8 +50,10 @@ describe('JobsTab', () => {
49
50
  .map(element => expect(element).toBeInTheDocument());
50
51
  expect(screen.getByText('Scheduled recurring jobs')).toBeInTheDocument();
51
52
  expect(screen.getByText('Previously executed jobs')).toBeInTheDocument();
52
- expect(screen.getByText(toCron(futureDate, 'weekly'))).toBeInTheDocument();
53
- expect(screen.getByText('54 10 15 * *')).toBeInTheDocument();
53
+ expect(
54
+ screen.getByText(readableCron(toCron(futureDate, 'weekly')))
55
+ ).toBeInTheDocument();
56
+ expect(screen.getByText('monthly')).toBeInTheDocument();
54
57
  });
55
58
  it('should show empty state', async () => {
56
59
  render(
@@ -129,7 +132,9 @@ describe('JobsTab', () => {
129
132
  message: 'Ansible job was successfully created.',
130
133
  });
131
134
  await waitFor(tick);
132
- expect(screen.getByText(toCron(futureDate, 'weekly'))).toBeInTheDocument();
135
+ expect(
136
+ screen.getByText(readableCron(toCron(futureDate, 'weekly')))
137
+ ).toBeInTheDocument();
133
138
  expect(screen.getByText('in 3 days')).toBeInTheDocument();
134
139
  expect(
135
140
  screen.queryByText('No config job for Ansible roles scheduled')
@@ -0,0 +1,11 @@
1
+ import { readableCron } from '../JobsTabHelper';
2
+
3
+ describe('JobTabsHelper', () => {
4
+ it('readableCron', () => {
5
+ expect(readableCron('01 * * * *')).toBe('hourly');
6
+ expect(readableCron('01 01 * * *')).toBe('daily');
7
+ expect(readableCron('01 01 * * 01')).toBe('weekly');
8
+ expect(readableCron('01 01 01 * *')).toBe('monthly');
9
+ expect(readableCron()).toBe('custom');
10
+ });
11
+ });
@@ -15,7 +15,7 @@ import RecurringJobsTable from './RecurringJobsTable';
15
15
  import PreviousJobsTable from './PreviousJobsTable';
16
16
  import NewRecurringJobModal from './NewRecurringJobModal';
17
17
 
18
- const JobsTab = ({ resourceName, resourceId, history }) => {
18
+ const JobsTab = ({ resourceName, resourceId, hostGroupId, history }) => {
19
19
  const [modalOpen, setModalOpen] = useState(false);
20
20
  const toggleModal = () => setModalOpen(!modalOpen);
21
21
 
@@ -44,6 +44,7 @@ const JobsTab = ({ resourceName, resourceId, history }) => {
44
44
  <RecurringJobsTable
45
45
  resourceId={resourceId}
46
46
  resourceName={resourceName}
47
+ hostGroupId={hostGroupId}
47
48
  fetchFn={fetchRecurringFn}
48
49
  renameData={renameData}
49
50
  renamedDataPath="jobs"
@@ -59,6 +60,7 @@ const JobsTab = ({ resourceName, resourceId, history }) => {
59
60
  <PreviousJobsTable
60
61
  resourceId={resourceId}
61
62
  resourceName={resourceName}
63
+ hostGroupId={hostGroupId}
62
64
  fetchFn={fetchPreviousFn(useParamsToVars(history))}
63
65
  renameData={renameData}
64
66
  emptyWrapper={() => null}
@@ -81,8 +83,13 @@ const JobsTab = ({ resourceName, resourceId, history }) => {
81
83
 
82
84
  JobsTab.propTypes = {
83
85
  resourceName: PropTypes.string.isRequired,
86
+ hostGroupId: PropTypes.number,
84
87
  resourceId: PropTypes.number.isRequired,
85
88
  history: PropTypes.object.isRequired,
86
89
  };
87
90
 
91
+ JobsTab.defaultProps = {
92
+ hostGroupId: undefined,
93
+ };
94
+
88
95
  export default JobsTab;
@@ -44,6 +44,7 @@ const SecondaryTabRoutes = ({ response, router, history }) => (
44
44
  <JobsTab
45
45
  resourceId={response.id}
46
46
  resourceName="host"
47
+ hostGroupId={response.hostgroup_id}
47
48
  history={history}
48
49
  />
49
50
  </TabLayout>
@@ -14,6 +14,7 @@ query($search: String, $first: Int, $last: Int) {
14
14
  meta {
15
15
  canEdit
16
16
  }
17
+ purpose
17
18
  }
18
19
  task {
19
20
  id
@@ -24,6 +24,7 @@ import {
24
24
  } from '../../../testHelper';
25
25
 
26
26
  import { toCron } from '../../../components/AnsibleHostDetail/components/JobsTab/NewRecurringJobHelper';
27
+ import { readableCron } from '../../../components/AnsibleHostDetail/components/JobsTab/JobsTabHelper';
27
28
 
28
29
  const TestComponent = withRedux(withRouter(withMockedProvider(HostgroupJobs)));
29
30
 
@@ -46,7 +47,7 @@ describe('HostgroupJobs', () => {
46
47
  .map(element => expect(element).toBeInTheDocument());
47
48
  expect(screen.getByText('Scheduled recurring jobs')).toBeInTheDocument();
48
49
  expect(screen.getByText('Previously executed jobs')).toBeInTheDocument();
49
- expect(screen.getByText('54 10 15 * *')).toBeInTheDocument();
50
+ expect(screen.getByText(readableCron('54 10 15 * *'))).toBeInTheDocument();
50
51
  });
51
52
  it('should show empty state', async () => {
52
53
  render(
@@ -103,7 +104,9 @@ describe('HostgroupJobs', () => {
103
104
  type: 'success',
104
105
  message: 'Ansible job was successfully created.',
105
106
  });
106
- expect(screen.getByText(toCron(futureDate, 'weekly'))).toBeInTheDocument();
107
+ expect(
108
+ screen.getByText(readableCron(toCron(futureDate, 'weekly')))
109
+ ).toBeInTheDocument();
107
110
  expect(screen.getByText('in 3 days')).toBeInTheDocument();
108
111
  expect(
109
112
  screen.queryByText('No config job for Ansible roles scheduled')
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.0.2
4
+ version: 7.0.3
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-01-19 00:00:00.000000000 Z
11
+ date: 2022-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts_as_list
@@ -327,9 +327,11 @@ files:
327
327
  - webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.js
328
328
  - webpack/components/AnsibleHostDetail/components/JobsTab/NewRecurringJobModal.scss
329
329
  - webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js
330
+ - webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js.orig
330
331
  - webpack/components/AnsibleHostDetail/components/JobsTab/RecurringJobsTable.js
331
332
  - webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.fixtures.js
332
333
  - webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.test.js
334
+ - webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTabHelper.test.js
333
335
  - webpack/components/AnsibleHostDetail/components/JobsTab/index.js
334
336
  - webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/AllRolesTable.js
335
337
  - webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/index.js
@@ -447,50 +449,50 @@ required_rubygems_version: !ruby/object:Gem::Requirement
447
449
  - !ruby/object:Gem::Version
448
450
  version: '0'
449
451
  requirements: []
450
- rubygems_version: 3.3.4
452
+ rubygems_version: 3.3.7
451
453
  signing_key:
452
454
  specification_version: 4
453
455
  summary: Ansible integration with Foreman (theforeman.org)
454
456
  test_files:
455
- - test/functional/ansible_variables_controller_test.rb
456
- - test/functional/ansible_roles_controller_test.rb
457
- - test/functional/api/v2/ansible_variables_controller_test.rb
457
+ - test/functional/api/v2/hosts_controller_test.rb
458
458
  - test/functional/api/v2/ansible_roles_controller_test.rb
459
459
  - test/functional/api/v2/hostgroups_controller_test.rb
460
+ - test/functional/api/v2/ansible_variables_controller_test.rb
460
461
  - test/functional/api/v2/ansible_inventories_controller_test.rb
461
- - test/functional/api/v2/hosts_controller_test.rb
462
- - test/functional/ui_ansible_roles_controller_test.rb
463
462
  - test/functional/hosts_controller_test.rb
464
- - test/graphql/mutations/hosts/assign_ansible_roles_mutation_test.rb
465
- - test/graphql/queries/ansible_roles_query_test.rb
466
- - test/foreman_ansible/helpers/ansible_roles_helper_test.rb
467
- - test/unit/actions/run_ansible_job_test.rb
468
- - test/unit/actions/run_proxy_ansible_command_test.rb
469
- - test/unit/services/api_roles_importer_test.rb
470
- - test/unit/services/ui_roles_importer_test.rb
463
+ - test/functional/ansible_roles_controller_test.rb
464
+ - test/functional/ansible_variables_controller_test.rb
465
+ - test/functional/ui_ansible_roles_controller_test.rb
466
+ - test/unit/services/inventory_creator_test.rb
471
467
  - test/unit/services/ansible_report_importer_test.rb
472
- - test/unit/services/insights_plan_runner_test.rb
473
- - test/unit/services/override_resolver_test.rb
468
+ - test/unit/services/ui_roles_importer_test.rb
474
469
  - test/unit/services/roles_importer_test.rb
475
- - test/unit/services/inventory_creator_test.rb
476
470
  - test/unit/services/ansible_variables_importer_test.rb
477
- - test/unit/lib/proxy_api/ansible_test.rb
471
+ - test/unit/services/override_resolver_test.rb
472
+ - test/unit/services/api_roles_importer_test.rb
473
+ - test/unit/services/insights_plan_runner_test.rb
478
474
  - test/unit/ansible_role_test.rb
479
- - test/unit/hostgroup_ansible_role_test.rb
480
- - test/unit/ansible_variable_test.rb
481
475
  - test/unit/host_ansible_role_test.rb
476
+ - test/unit/hostgroup_ansible_role_test.rb
482
477
  - test/unit/helpers/ansible_reports_helper_test.rb
483
478
  - test/unit/ansible_provider_test.rb
484
- - test/unit/ignore_roles_test.rb
485
- - test/unit/import_roles_and_variables.rb
486
- - test/unit/concerns/config_reports_extensions_test.rb
487
479
  - test/unit/concerns/host_managed_extensions_test.rb
480
+ - test/unit/concerns/config_reports_extensions_test.rb
488
481
  - test/unit/concerns/hostgroup_extensions_test.rb
482
+ - test/unit/ignore_roles_test.rb
483
+ - test/unit/ansible_variable_test.rb
484
+ - test/unit/import_roles_and_variables.rb
485
+ - test/unit/lib/proxy_api/ansible_test.rb
486
+ - test/unit/actions/run_ansible_job_test.rb
487
+ - test/unit/actions/run_proxy_ansible_command_test.rb
488
+ - test/foreman_ansible/helpers/ansible_roles_helper_test.rb
489
+ - test/test_plugin_helper.rb
489
490
  - test/factories/ansible_proxy.rb
490
- - test/factories/host_ansible_enhancements.rb
491
491
  - test/factories/ansible_variables.rb
492
+ - test/factories/host_ansible_enhancements.rb
492
493
  - test/factories/ansible_roles.rb
493
494
  - test/fixtures/report.json
494
495
  - test/fixtures/sample_facts.json
495
496
  - test/fixtures/insights_playbook.yaml
496
- - test/test_plugin_helper.rb
497
+ - test/graphql/mutations/hosts/assign_ansible_roles_mutation_test.rb
498
+ - test/graphql/queries/ansible_roles_query_test.rb