foreman_remote_execution 3.0.2 → 3.3.0
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/.eslintrc +5 -30
- data/.gitignore +1 -0
- data/.hound.yml +2 -6
- data/.rubocop.yml +80 -50
- data/.rubocop_todo.yml +113 -73
- data/.travis.yml +2 -3
- data/Gemfile +4 -0
- data/app/controllers/api/v2/foreign_input_sets_controller.rb +3 -2
- data/app/controllers/api/v2/job_invocations_controller.rb +7 -6
- data/app/controllers/api/v2/job_templates_controller.rb +3 -2
- data/app/controllers/api/v2/remote_execution_features_controller.rb +3 -2
- data/app/controllers/api/v2/template_invocations_controller.rb +1 -1
- data/app/controllers/cockpit_controller.rb +1 -0
- data/app/controllers/concerns/foreman/controller/parameters/foreign_input_set.rb +1 -1
- data/app/controllers/concerns/foreman/controller/parameters/job_template.rb +4 -4
- data/app/controllers/job_invocations_controller.rb +10 -6
- data/app/controllers/job_templates_controller.rb +1 -1
- data/app/controllers/remote_execution_features_controller.rb +3 -2
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +16 -5
- data/app/helpers/job_invocations_chart_helper.rb +13 -10
- data/app/helpers/job_invocations_helper.rb +18 -5
- data/app/helpers/remote_execution_helper.rb +49 -48
- data/app/lib/actions/remote_execution/run_host_job.rb +8 -8
- data/app/lib/actions/remote_execution/run_hosts_job.rb +2 -2
- data/app/lib/foreman_remote_execution/renderer/scope/input.rb +1 -0
- data/app/lib/proxy_api/remote_execution_ssh.rb +6 -0
- data/app/models/concerns/foreman_remote_execution/errors_flattener.rb +0 -2
- data/app/models/concerns/foreman_remote_execution/host_extensions.rb +3 -5
- data/app/models/concerns/foreman_remote_execution/nic_extensions.rb +1 -0
- data/app/models/concerns/foreman_remote_execution/orchestration/ssh.rb +61 -0
- data/app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb +5 -0
- data/app/models/foreign_input_set.rb +3 -2
- data/app/models/host_status/execution_status.rb +9 -1
- data/app/models/input_template_renderer.rb +1 -1
- data/app/models/job_invocation.rb +10 -12
- data/app/models/job_invocation_composer.rb +20 -14
- data/app/models/job_invocation_task_group.rb +1 -1
- data/app/models/job_template.rb +3 -3
- data/app/models/remote_execution_feature.rb +0 -2
- data/app/models/remote_execution_provider.rb +9 -2
- data/app/models/setting/remote_execution.rb +54 -56
- data/app/models/ssh_execution_provider.rb +2 -2
- data/app/models/targeting.rb +1 -0
- data/app/models/template_invocation.rb +2 -3
- data/app/services/default_proxy_proxy_selector.rb +18 -0
- data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
- data/app/views/api/v2/job_invocations/main.json.rabl +5 -2
- data/app/views/job_invocations/_card_results.html.erb +1 -0
- data/app/views/job_invocations/_card_target_hosts.html.erb +12 -0
- data/app/views/job_invocations/_card_user_input.html.erb +1 -1
- data/app/views/job_invocations/_form.html.erb +3 -2
- data/app/views/job_invocations/_host_status_td.html.erb +1 -1
- data/app/views/job_invocations/_rerun_taxonomies.html.erb +22 -0
- data/app/views/job_invocations/_tab_overview.html.erb +1 -1
- data/app/views/job_invocations/_user_input.html.erb +1 -1
- data/app/views/job_invocations/show.html.erb +3 -1
- data/config/routes.rb +2 -1
- data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +1 -0
- data/db/migrate/20180110104432_rename_template_invocation_permission.rb +1 -0
- data/db/seeds.d/50-notification_blueprints.rb +4 -4
- data/db/seeds.d/70-job_templates.rb +1 -1
- data/db/seeds.d/90-bookmarks.rb +1 -0
- data/extra/cockpit/foreman-cockpit-session +7 -2
- data/foreman_remote_execution.gemspec +1 -1
- data/lib/foreman_remote_execution/engine.rb +20 -17
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/locale/action_names.rb +4 -3
- data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/de/foreman_remote_execution.po +65 -16
- data/locale/en/foreman_remote_execution.po +63 -15
- data/locale/en_GB/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/en_GB/foreman_remote_execution.po +64 -15
- data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/es/foreman_remote_execution.po +66 -17
- data/locale/foreman_remote_execution.pot +193 -148
- data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/fr/foreman_remote_execution.po +66 -17
- data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ja/foreman_remote_execution.po +66 -17
- data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ko/foreman_remote_execution.po +65 -15
- data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/pt_BR/foreman_remote_execution.po +66 -17
- data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ru/foreman_remote_execution.po +65 -18
- data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_CN/foreman_remote_execution.po +66 -17
- data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_TW/foreman_remote_execution.po +65 -16
- data/package.json +16 -34
- data/test/benchmark/run_hosts_job_benchmark.rb +1 -1
- data/test/factories/foreman_remote_execution_factories.rb +1 -1
- data/test/functional/api/v2/job_invocations_controller_test.rb +9 -9
- data/test/functional/api/v2/job_templates_controller_test.rb +1 -1
- data/test/functional/api/v2/remote_execution_features_controller_test.rb +2 -2
- data/test/functional/api/v2/template_invocations_controller_test.rb +4 -4
- data/test/functional/job_invocations_controller_test.rb +23 -11
- data/test/functional/job_templates_controller_test.rb +1 -1
- data/test/models/orchestration/ssh_test.rb +24 -0
- data/test/unit/actions/run_hosts_job_test.rb +8 -8
- data/test/unit/concerns/foreman_tasks_cleaner_extensions_test.rb +3 -3
- data/test/unit/concerns/host_extensions_test.rb +19 -19
- data/test/unit/concerns/nic_extensions_test.rb +1 -1
- data/test/unit/execution_task_status_mapper_test.rb +10 -10
- data/test/unit/input_template_renderer_test.rb +77 -77
- data/test/unit/job_invocation_composer_test.rb +100 -96
- data/test/unit/job_invocation_test.rb +29 -29
- data/test/unit/job_template_effective_user_test.rb +3 -3
- data/test/unit/job_template_test.rb +31 -31
- data/test/unit/remote_execution_feature_test.rb +19 -19
- data/test/unit/remote_execution_provider_test.rb +33 -30
- data/test/unit/renderer_scope_input.rb +6 -6
- data/test/unit/targeting_test.rb +6 -6
- data/test/unit/template_invocation_input_value_test.rb +3 -3
- data/webpack/index.js +1 -17
- data/webpack/react_app/components/jobInvocations/AggregateStatus/index.js +10 -0
- data/webpack/react_app/components/jobInvocations/AggregateStatus/index.test.js +6 -3
- data/webpack/react_app/components/jobInvocations/index.js +19 -7
- data/webpack/react_app/redux/actions/jobInvocations/index.js +12 -8
- data/webpack/react_app/redux/consts.js +1 -2
- data/webpack/react_app/redux/reducers/jobInvocations/index.fixtures.js +8 -40
- data/webpack/react_app/redux/reducers/jobInvocations/index.test.js +17 -11
- data/webpack/test_setup.js +2 -1
- metadata +10 -5
|
@@ -13,15 +13,15 @@ class RendererScopeInputTest < ActiveSupport::TestCase
|
|
|
13
13
|
it 'caches the value under given key' do
|
|
14
14
|
i = 1
|
|
15
15
|
result = input.cached('some_key') { i }
|
|
16
|
-
result.must_equal 1
|
|
16
|
+
_(result).must_equal 1
|
|
17
17
|
|
|
18
18
|
i += 1
|
|
19
19
|
result = input.cached('some_key') { i }
|
|
20
|
-
result.must_equal 1
|
|
20
|
+
_(result).must_equal 1
|
|
21
21
|
|
|
22
22
|
i += 1
|
|
23
23
|
result = input.cached('different_key') { i }
|
|
24
|
-
result.must_equal 3
|
|
24
|
+
_(result).must_equal 3
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
@@ -35,15 +35,15 @@ class RendererScopeInputTest < ActiveSupport::TestCase
|
|
|
35
35
|
it 'does not cache the value' do
|
|
36
36
|
i = 1
|
|
37
37
|
result = input.cached('some_key') { i }
|
|
38
|
-
result.must_equal 1
|
|
38
|
+
_(result).must_equal 1
|
|
39
39
|
|
|
40
40
|
i += 1
|
|
41
41
|
result = input.cached('some_key') { i }
|
|
42
|
-
result.must_equal 2
|
|
42
|
+
_(result).must_equal 2
|
|
43
43
|
|
|
44
44
|
i += 1
|
|
45
45
|
result = input.cached('different_key') { i }
|
|
46
|
-
result.must_equal 3
|
|
46
|
+
_(result).must_equal 3
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
data/test/unit/targeting_test.rb
CHANGED
|
@@ -51,7 +51,7 @@ class TargetingTest < ActiveSupport::TestCase
|
|
|
51
51
|
targeting.resolve_hosts!
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
it { targeting.hosts.must_include(host) }
|
|
54
|
+
it { _(targeting.hosts).must_include(host) }
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
context 'can delete a user' do
|
|
@@ -74,7 +74,7 @@ class TargetingTest < ActiveSupport::TestCase
|
|
|
74
74
|
host.destroy
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
it { targeting.reload.hosts.must_be_empty }
|
|
77
|
+
it { _(targeting.reload.hosts).must_be_empty }
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
describe '#build_query_from_hosts(ids)' do
|
|
@@ -89,9 +89,9 @@ class TargetingTest < ActiveSupport::TestCase
|
|
|
89
89
|
let(:query) { Targeting.build_query_from_hosts([ host.id, second_host.id ]) }
|
|
90
90
|
|
|
91
91
|
it 'builds query using host names joining inside ^' do
|
|
92
|
-
query.must_include host.name
|
|
93
|
-
query.must_include second_host.name
|
|
94
|
-
query.must_include 'name ^'
|
|
92
|
+
_(query).must_include host.name
|
|
93
|
+
_(query).must_include second_host.name
|
|
94
|
+
_(query).must_include 'name ^'
|
|
95
95
|
|
|
96
96
|
Host.search_for(query).must_include host
|
|
97
97
|
Host.search_for(query).must_include second_host
|
|
@@ -102,7 +102,7 @@ class TargetingTest < ActiveSupport::TestCase
|
|
|
102
102
|
let(:query) { Targeting.build_query_from_hosts([ host.id ]) }
|
|
103
103
|
|
|
104
104
|
it 'builds query using host name' do
|
|
105
|
-
query.must_equal "name ^ (#{host.name})"
|
|
105
|
+
_(query).must_equal "name ^ (#{host.name})"
|
|
106
106
|
Host.search_for(query).must_include host
|
|
107
107
|
Host.search_for(query).wont_include second_host
|
|
108
108
|
end
|
|
@@ -31,8 +31,8 @@ class TemplateInvocationInputTest < ActiveSupport::TestCase
|
|
|
31
31
|
template.template_inputs << FactoryBot.build(:template_input, :name => 'service_name',
|
|
32
32
|
:input_type => 'user', :required => true)
|
|
33
33
|
assert_valid FactoryBot.create(:template_invocation_input_value,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
:template_invocation => template_invocation,
|
|
35
|
+
:template_input => template.template_inputs.first,
|
|
36
|
+
:value => 'foreman' * 1_000_000)
|
|
37
37
|
end
|
|
38
38
|
end
|
data/webpack/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import URI from 'urijs';
|
|
2
1
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
3
|
-
import {
|
|
2
|
+
import { registerReducer } from 'foremanReact/common/MountingService';
|
|
4
3
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
5
4
|
import componentRegistry from 'foremanReact/components/componentRegistry';
|
|
6
5
|
import JobInvocationContainer from './react_app/components/jobInvocations';
|
|
@@ -12,18 +11,3 @@ componentRegistry.register({
|
|
|
12
11
|
});
|
|
13
12
|
|
|
14
13
|
registerReducer('foremanRemoteExecutionReducers', rootReducer);
|
|
15
|
-
|
|
16
|
-
if (window.location.href.match(/job_invocations/)) {
|
|
17
|
-
const jobInvocationId = parseInt(
|
|
18
|
-
new URI(window.location.href).filename(),
|
|
19
|
-
10,
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
const mountJobInvocationContainer = () => {
|
|
23
|
-
mount('JobInvocationContainer', '#status_chart', {
|
|
24
|
-
url: `/job_invocations/chart?id=${jobInvocationId}`,
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
document.addEventListener('page:change', mountJobInvocationContainer);
|
|
29
|
-
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
2
3
|
|
|
3
4
|
const AggregateStatus = ({ statuses }) => (
|
|
4
5
|
<div id="aggregate_statuses">
|
|
@@ -31,4 +32,13 @@ const AggregateStatus = ({ statuses }) => (
|
|
|
31
32
|
</div>
|
|
32
33
|
);
|
|
33
34
|
|
|
35
|
+
AggregateStatus.propTypes = {
|
|
36
|
+
statuses: PropTypes.shape({
|
|
37
|
+
cancelled: PropTypes.number,
|
|
38
|
+
failed: PropTypes.number,
|
|
39
|
+
pending: PropTypes.number,
|
|
40
|
+
success: PropTypes.number,
|
|
41
|
+
}).isRequired,
|
|
42
|
+
};
|
|
43
|
+
|
|
34
44
|
export default AggregateStatus;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { shallow } from '
|
|
3
|
-
import AggregateStatus from './index
|
|
2
|
+
import { shallow } from '@theforeman/test';
|
|
3
|
+
import AggregateStatus from './index';
|
|
4
4
|
|
|
5
5
|
jest.unmock('./index.js');
|
|
6
6
|
|
|
@@ -20,7 +20,10 @@ describe('AggregateStatus', () => {
|
|
|
20
20
|
|
|
21
21
|
it('renders cards with props passed', () => {
|
|
22
22
|
const statuses = {
|
|
23
|
-
success: 19,
|
|
23
|
+
success: 19,
|
|
24
|
+
failed: 20,
|
|
25
|
+
cancelled: 31,
|
|
26
|
+
pending: 3,
|
|
24
27
|
};
|
|
25
28
|
const chartNumbers = shallow(<AggregateStatus statuses={statuses} />);
|
|
26
29
|
const success = chartNumbers.find('#success_count').text();
|
|
@@ -4,14 +4,18 @@ import Immutable from 'seamless-immutable';
|
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
6
6
|
import DonutChart from 'foremanReact/components/common/charts/DonutChart';
|
|
7
|
-
import AggregateStatus from './AggregateStatus
|
|
7
|
+
import AggregateStatus from './AggregateStatus';
|
|
8
8
|
import * as JobInvocationActions from '../../redux/actions/jobInvocations';
|
|
9
9
|
|
|
10
|
-
const colIndexOfMaxValue = columns =>
|
|
10
|
+
const colIndexOfMaxValue = columns =>
|
|
11
|
+
columns.reduce((iMax, x, i, arr) => (x[1] > arr[iMax][1] ? i : iMax), 0);
|
|
11
12
|
|
|
12
13
|
class JobInvocationContainer extends React.Component {
|
|
13
14
|
componentDidMount() {
|
|
14
|
-
const {
|
|
15
|
+
const {
|
|
16
|
+
startJobInvocationsPolling,
|
|
17
|
+
data: { url },
|
|
18
|
+
} = this.props;
|
|
15
19
|
|
|
16
20
|
startJobInvocationsPolling(url);
|
|
17
21
|
}
|
|
@@ -22,15 +26,20 @@ class JobInvocationContainer extends React.Component {
|
|
|
22
26
|
|
|
23
27
|
return (
|
|
24
28
|
<div id="job_invocations_chart_container">
|
|
25
|
-
<DonutChart
|
|
26
|
-
|
|
29
|
+
<DonutChart
|
|
30
|
+
data={Immutable.asMutable(jobInvocations)}
|
|
31
|
+
title={{
|
|
32
|
+
type: 'percent',
|
|
33
|
+
secondary: (jobInvocations[iMax] || [])[0],
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
27
36
|
<AggregateStatus statuses={statuses} />
|
|
28
37
|
</div>
|
|
29
38
|
);
|
|
30
39
|
}
|
|
31
40
|
}
|
|
32
41
|
|
|
33
|
-
const mapStateToProps =
|
|
42
|
+
const mapStateToProps = state => {
|
|
34
43
|
const {
|
|
35
44
|
jobInvocations,
|
|
36
45
|
statuses,
|
|
@@ -62,4 +71,7 @@ JobInvocationContainer.defaultProps = {
|
|
|
62
71
|
jobInvocations: [['property', 3, 'color']],
|
|
63
72
|
statuses: {},
|
|
64
73
|
};
|
|
65
|
-
export default connect(
|
|
74
|
+
export default connect(
|
|
75
|
+
mapStateToProps,
|
|
76
|
+
JobInvocationActions
|
|
77
|
+
)(JobInvocationContainer);
|
|
@@ -8,10 +8,10 @@ import {
|
|
|
8
8
|
} from '../../consts';
|
|
9
9
|
|
|
10
10
|
const defaultJobInvocationsPollingInterval = 1000;
|
|
11
|
-
const jobInvocationsInterval =
|
|
12
|
-
defaultJobInvocationsPollingInterval;
|
|
11
|
+
const jobInvocationsInterval =
|
|
12
|
+
process.env.JOB_INVOCATIONS_POLLING || defaultJobInvocationsPollingInterval;
|
|
13
13
|
|
|
14
|
-
const getJobInvocations = url => (dispatch, getState) => {
|
|
14
|
+
const getJobInvocations = url => async (dispatch, getState) => {
|
|
15
15
|
function onGetJobInvocationsSuccess({ data }) {
|
|
16
16
|
// If the job has finished, stop polling
|
|
17
17
|
if (data.finished) {
|
|
@@ -41,7 +41,7 @@ const getJobInvocations = url => (dispatch, getState) => {
|
|
|
41
41
|
if (jobInvocationsInterval) {
|
|
42
42
|
setTimeout(
|
|
43
43
|
() => dispatch(getJobInvocations(url)),
|
|
44
|
-
jobInvocationsInterval
|
|
44
|
+
jobInvocationsInterval
|
|
45
45
|
);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -52,10 +52,14 @@ const getJobInvocations = url => (dispatch, getState) => {
|
|
|
52
52
|
|
|
53
53
|
if (getState().foremanRemoteExecutionReducers.jobInvocations.isPolling) {
|
|
54
54
|
if (isDocumentVisible) {
|
|
55
|
-
|
|
56
|
-
.
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
try {
|
|
56
|
+
const data = await API.get(url);
|
|
57
|
+
onGetJobInvocationsSuccess(data);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
onGetJobInvocationsFailed(error);
|
|
60
|
+
} finally {
|
|
61
|
+
triggerPolling();
|
|
62
|
+
}
|
|
59
63
|
} else {
|
|
60
64
|
// document is not visible, keep polling without api call
|
|
61
65
|
triggerPolling();
|
|
@@ -2,5 +2,4 @@ export const JOB_INVOCATIONS_POLLING_STARTED =
|
|
|
2
2
|
'JOB_INVOCATIONS_POLLING_STARTED';
|
|
3
3
|
export const JOB_INVOCATIONS_GET_JOB_INVOCATIONS =
|
|
4
4
|
'JOB_INVOCATIONS_GET_JOB_INVOCATIONS';
|
|
5
|
-
export const JOB_INVOCATIONS_JOB_FINISHED =
|
|
6
|
-
'JOB_INVOCATIONS_JOB_FINISHED';
|
|
5
|
+
export const JOB_INVOCATIONS_JOB_FINISHED = 'JOB_INVOCATIONS_JOB_FINISHED';
|
|
@@ -15,26 +15,10 @@ export const pollingStarted = Immutable({
|
|
|
15
15
|
export const jobInvocationsPayload = Immutable({
|
|
16
16
|
jobInvocations: {
|
|
17
17
|
job_invocations: [
|
|
18
|
-
[
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
],
|
|
23
|
-
[
|
|
24
|
-
'Failed',
|
|
25
|
-
20,
|
|
26
|
-
'#B7312D',
|
|
27
|
-
],
|
|
28
|
-
[
|
|
29
|
-
'Pending',
|
|
30
|
-
40,
|
|
31
|
-
'#B7312D',
|
|
32
|
-
],
|
|
33
|
-
[
|
|
34
|
-
'Cancelled',
|
|
35
|
-
0,
|
|
36
|
-
'#B7312D',
|
|
37
|
-
],
|
|
18
|
+
['Success', 100, '#B7312D'],
|
|
19
|
+
['Failed', 20, '#B7312D'],
|
|
20
|
+
['Pending', 40, '#B7312D'],
|
|
21
|
+
['Cancelled', 0, '#B7312D'],
|
|
38
22
|
],
|
|
39
23
|
statuses: {
|
|
40
24
|
cancelled: 0,
|
|
@@ -48,26 +32,10 @@ export const jobInvocationsPayload = Immutable({
|
|
|
48
32
|
export const jobInvocationsReceived = Immutable({
|
|
49
33
|
isPolling: true,
|
|
50
34
|
jobInvocations: [
|
|
51
|
-
[
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
],
|
|
56
|
-
[
|
|
57
|
-
'Failed',
|
|
58
|
-
20,
|
|
59
|
-
'#B7312D',
|
|
60
|
-
],
|
|
61
|
-
[
|
|
62
|
-
'Pending',
|
|
63
|
-
40,
|
|
64
|
-
'#B7312D',
|
|
65
|
-
],
|
|
66
|
-
[
|
|
67
|
-
'Cancelled',
|
|
68
|
-
0,
|
|
69
|
-
'#B7312D',
|
|
70
|
-
],
|
|
35
|
+
['Success', 100, '#B7312D'],
|
|
36
|
+
['Failed', 20, '#B7312D'],
|
|
37
|
+
['Pending', 40, '#B7312D'],
|
|
38
|
+
['Cancelled', 0, '#B7312D'],
|
|
71
39
|
],
|
|
72
40
|
statuses: {
|
|
73
41
|
cancelled: 0,
|
|
@@ -18,20 +18,26 @@ describe('job invocations chart reducer', () => {
|
|
|
18
18
|
expect(reducer(undefined, {})).toEqual(initialState);
|
|
19
19
|
});
|
|
20
20
|
it('should start polling given POLLING_STARTED', () => {
|
|
21
|
-
expect(
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
expect(
|
|
22
|
+
reducer(initialState, {
|
|
23
|
+
type: JOB_INVOCATIONS_POLLING_STARTED,
|
|
24
|
+
})
|
|
25
|
+
).toEqual(pollingStarted);
|
|
24
26
|
});
|
|
25
27
|
it('should stop polling given JOB_FINISHED', () => {
|
|
26
|
-
expect(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
expect(
|
|
29
|
+
reducer(pollingStarted, {
|
|
30
|
+
type: JOB_INVOCATIONS_JOB_FINISHED,
|
|
31
|
+
payload: { jobInvocations: { job_invocations: [], statuses: {} } },
|
|
32
|
+
})
|
|
33
|
+
).toEqual(initialState);
|
|
30
34
|
});
|
|
31
35
|
it('should receive job invocations given GET_JOB_INVOCATIONS', () => {
|
|
32
|
-
expect(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
expect(
|
|
37
|
+
reducer(pollingStarted, {
|
|
38
|
+
type: JOB_INVOCATIONS_GET_JOB_INVOCATIONS,
|
|
39
|
+
payload: jobInvocationsPayload,
|
|
40
|
+
})
|
|
41
|
+
).toEqual(jobInvocationsReceived);
|
|
36
42
|
});
|
|
37
43
|
});
|
data/webpack/test_setup.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import 'core-js/shim';
|
|
2
2
|
import 'regenerator-runtime/runtime';
|
|
3
3
|
|
|
4
|
-
import { configure } from '
|
|
4
|
+
import { configure } from '@theforeman/test';
|
|
5
|
+
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
5
6
|
import Adapter from 'enzyme-adapter-react-16';
|
|
6
7
|
|
|
7
8
|
configure({ adapter: new Adapter() });
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman_remote_execution
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.0
|
|
4
|
+
version: 3.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Foreman Remote Execution team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-01
|
|
11
|
+
date: 2020-06-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: deface
|
|
@@ -30,7 +30,7 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 1.0.
|
|
33
|
+
version: 1.0.2
|
|
34
34
|
- - "<"
|
|
35
35
|
- !ruby/object:Gem::Version
|
|
36
36
|
version: 2.0.0
|
|
@@ -40,7 +40,7 @@ dependencies:
|
|
|
40
40
|
requirements:
|
|
41
41
|
- - ">="
|
|
42
42
|
- !ruby/object:Gem::Version
|
|
43
|
-
version: 1.0.
|
|
43
|
+
version: 1.0.2
|
|
44
44
|
- - "<"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
46
|
version: 2.0.0
|
|
@@ -178,6 +178,7 @@ files:
|
|
|
178
178
|
- app/models/concerns/foreman_remote_execution/foreman_tasks_triggering_extensions.rb
|
|
179
179
|
- app/models/concerns/foreman_remote_execution/host_extensions.rb
|
|
180
180
|
- app/models/concerns/foreman_remote_execution/nic_extensions.rb
|
|
181
|
+
- app/models/concerns/foreman_remote_execution/orchestration/ssh.rb
|
|
181
182
|
- app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb
|
|
182
183
|
- app/models/concerns/foreman_remote_execution/subnet_extensions.rb
|
|
183
184
|
- app/models/concerns/foreman_remote_execution/taxonomy_extensions.rb
|
|
@@ -204,6 +205,7 @@ files:
|
|
|
204
205
|
- app/models/template_invocation_input_value.rb
|
|
205
206
|
- app/overrides/execution_interface.rb
|
|
206
207
|
- app/overrides/subnet_proxies.rb
|
|
208
|
+
- app/services/default_proxy_proxy_selector.rb
|
|
207
209
|
- app/services/remote_execution_proxy_selector.rb
|
|
208
210
|
- app/services/ui_notifications/remote_execution_jobs/base_job_finish.rb
|
|
209
211
|
- app/views/api/v2/foreign_input_sets/base.json.rabl
|
|
@@ -242,6 +244,7 @@ files:
|
|
|
242
244
|
- app/views/job_invocations/_host_status_td.html.erb
|
|
243
245
|
- app/views/job_invocations/_preview_hosts_list.html.erb
|
|
244
246
|
- app/views/job_invocations/_preview_hosts_modal.html.erb
|
|
247
|
+
- app/views/job_invocations/_rerun_taxonomies.html.erb
|
|
245
248
|
- app/views/job_invocations/_tab_hosts.html.erb
|
|
246
249
|
- app/views/job_invocations/_tab_overview.html.erb
|
|
247
250
|
- app/views/job_invocations/_tab_preview_templates.html.erb
|
|
@@ -376,6 +379,7 @@ files:
|
|
|
376
379
|
- test/functional/job_invocations_controller_test.rb
|
|
377
380
|
- test/functional/job_templates_controller_test.rb
|
|
378
381
|
- test/helpers/remote_execution_helper_test.rb
|
|
382
|
+
- test/models/orchestration/ssh_test.rb
|
|
379
383
|
- test/test_plugin_helper.rb
|
|
380
384
|
- test/unit/actions/run_host_job_test.rb
|
|
381
385
|
- test/unit/actions/run_hosts_job_test.rb
|
|
@@ -423,7 +427,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
423
427
|
- !ruby/object:Gem::Version
|
|
424
428
|
version: '0'
|
|
425
429
|
requirements: []
|
|
426
|
-
rubygems_version: 3.0.
|
|
430
|
+
rubygems_version: 3.0.4
|
|
427
431
|
signing_key:
|
|
428
432
|
specification_version: 4
|
|
429
433
|
summary: A plugin bringing remote execution to the Foreman, completing the config
|
|
@@ -441,6 +445,7 @@ test_files:
|
|
|
441
445
|
- test/functional/job_invocations_controller_test.rb
|
|
442
446
|
- test/functional/job_templates_controller_test.rb
|
|
443
447
|
- test/helpers/remote_execution_helper_test.rb
|
|
448
|
+
- test/models/orchestration/ssh_test.rb
|
|
444
449
|
- test/test_plugin_helper.rb
|
|
445
450
|
- test/unit/actions/run_host_job_test.rb
|
|
446
451
|
- test/unit/actions/run_hosts_job_test.rb
|