foreman_ansible 7.0.2 → 7.0.3

Sign up to get free protection for your applications and to get access to all the features.
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