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 +4 -4
- data/app/models/foreman_ansible/ansible_provider.rb +2 -1
- data/lib/foreman_ansible/version.rb +1 -1
- data/test/unit/ansible_provider_test.rb +12 -0
- data/webpack/components/AnsibleHostDetail/components/JobsTab/JobsTabHelper.js +49 -7
- data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js +4 -1
- data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js.orig +151 -0
- data/webpack/components/AnsibleHostDetail/components/JobsTab/RecurringJobsTable.js +19 -3
- data/webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.fixtures.js +3 -0
- data/webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTab.test.js +8 -3
- data/webpack/components/AnsibleHostDetail/components/JobsTab/__test__/JobsTabHelper.test.js +11 -0
- data/webpack/components/AnsibleHostDetail/components/JobsTab/index.js +8 -1
- data/webpack/components/AnsibleHostDetail/components/SecondaryTabRoutes.js +1 -0
- data/webpack/graphql/queries/recurringJobs.gql +1 -0
- data/webpack/routes/HostgroupJobs/__test__/HostgroupJobs.test.js +5 -2
- metadata +28 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a8c4f263992d803c31386bc301ce1e032c680ada845db8bf07e71162c003384
|
4
|
+
data.tar.gz: 628c7b6952499ef5dfe912370bec8d3e936926a004acf5b7693d7706fe461ea9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz: '
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09f3fd7b961edcb7abee1f6dd6de4fbf0bb80130668c39724d6c8658c2ca1570109ab6b7d172d2f9b963c6e4e5aebaa3280ebf199f9fe5ff86580ab1d8f06c7e'
|
7
|
+
data.tar.gz: 924b85ee81562a848c07417fd0788520c000292901f63ef45f8adbfc99ec32dae21858589c83688f461d19e49a4c6491801d53f611032a1c291ba941e9068133
|
@@ -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,
|
11
|
-
`recurring = true && pattern_template_name = "Ansible Roles - Ansible Default"
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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(
|
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
|
+
|
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
|
+
|
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 {
|
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 = ({
|
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
|
+
|
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(
|
53
|
-
|
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(
|
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;
|
@@ -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(
|
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.
|
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-
|
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.
|
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/
|
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/
|
465
|
-
- test/
|
466
|
-
- test/
|
467
|
-
- test/unit/
|
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/
|
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/
|
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/
|
497
|
+
- test/graphql/mutations/hosts/assign_ansible_roles_mutation_test.rb
|
498
|
+
- test/graphql/queries/ansible_roles_query_test.rb
|