foreman_acd 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_acd/ansible_playbooks_controller.rb +122 -0
- data/app/controllers/foreman_acd/api/v2/ansible_playbooks_controller.rb +54 -0
- data/app/controllers/foreman_acd/api/v2/app_instances_controller.rb +54 -0
- data/app/controllers/foreman_acd/api/v2/app_playbooks_controller.rb +0 -0
- data/app/controllers/foreman_acd/app_definitions_controller.rb +7 -4
- data/app/controllers/foreman_acd/app_instances_controller.rb +33 -126
- data/app/controllers/foreman_acd/concerns/ansible_playbook_parameters.rb +23 -0
- data/app/controllers/foreman_acd/concerns/app_definition_parameters.rb +1 -1
- data/app/controllers/foreman_acd/concerns/app_instance_parameters.rb +1 -1
- data/app/controllers/ui_acd_controller.rb +11 -3
- data/app/models/foreman_acd/ansible_playbook.rb +50 -0
- data/app/models/foreman_acd/app_definition.rb +2 -0
- data/app/models/foreman_acd/app_instance.rb +7 -0
- data/app/services/foreman_acd/app_configurator.rb +70 -0
- data/app/services/foreman_acd/app_deployer.rb +143 -0
- data/app/services/foreman_acd/inventory_creator.rb +67 -0
- data/app/views/foreman_acd/ansible_playbooks/_form.html.erb +21 -0
- data/app/views/foreman_acd/ansible_playbooks/edit.html.erb +3 -0
- data/app/views/foreman_acd/ansible_playbooks/index.html.erb +30 -0
- data/app/views/foreman_acd/ansible_playbooks/new.html.erb +3 -0
- data/app/views/foreman_acd/api/v2/ansible_playbooks/base.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/ansible_playbooks/index.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/ansible_playbooks/show.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_definitions/base.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_definitions/index.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_definitions/show.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_instances/base.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_instances/index.json.rabl +3 -0
- data/app/views/foreman_acd/api/v2/app_instances/show.json.rabl +3 -0
- data/app/views/foreman_acd/app_definitions/_form.html.erb +24 -10
- data/app/views/foreman_acd/app_definitions/edit.html.erb +5 -0
- data/app/views/foreman_acd/app_instances/_form.html.erb +7 -5
- data/app/views/foreman_acd/app_instances/index.html.erb +5 -1
- data/app/views/templates/job/run_acd_ansible_playbook.erb +49 -0
- data/app/views/ui_acd/ansible_data.json.rabl +6 -0
- data/app/views/ui_acd/app.json.rabl +6 -2
- data/app/views/ui_acd/app_definition.json.rabl +1 -1
- data/app/views/ui_acd/{fdata.json.rabl → foreman_data.json.rabl} +1 -1
- data/config/routes.rb +24 -1
- data/db/migrate/20200916091018_create_ansible_playbooks.rb +20 -0
- data/db/migrate/20200917120220_add_ansible_playbook_id.rb +14 -0
- data/db/migrate/20201016002819_add_ansible_vars_all_to_app_definitions.rb +5 -0
- data/db/migrate/20201016104338_add_ansible_vars_all_to_app_instances.rb +5 -0
- data/db/seeds.d/75-job_templates.rb +8 -0
- data/lib/foreman_acd/engine.rb +3 -0
- data/lib/foreman_acd/plugin.rb +53 -2
- data/lib/foreman_acd/version.rb +1 -1
- data/package.json +1 -1
- data/webpack/components/ApplicationDefinition/ApplicationDefinition.js +137 -22
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionActions.js +95 -11
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionConstants.js +7 -2
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionHelper.js +26 -0
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionReducer.js +117 -21
- data/webpack/components/ApplicationDefinition/ApplicationDefinitionSelectors.js +2 -0
- data/webpack/components/ApplicationDefinition/components/AnsiblePlaybookSelector.js +49 -0
- data/webpack/components/ApplicationDefinition/index.js +4 -0
- data/webpack/components/ApplicationInstance/ApplicationInstance.js +92 -22
- data/webpack/components/ApplicationInstance/ApplicationInstanceActions.js +37 -8
- data/webpack/components/ApplicationInstance/ApplicationInstanceConstants.js +4 -2
- data/webpack/components/ApplicationInstance/ApplicationInstanceReducer.js +98 -26
- data/webpack/components/ApplicationInstance/ApplicationInstanceSelectors.js +2 -1
- data/webpack/components/ApplicationInstance/index.js +2 -0
- data/webpack/components/ParameterSelection/ParameterSelection.js +46 -37
- data/webpack/components/ParameterSelection/ParameterSelectionActions.js +49 -52
- data/webpack/components/ParameterSelection/ParameterSelectionConstants.js +5 -3
- data/webpack/components/ParameterSelection/ParameterSelectionHelper.js +0 -32
- data/webpack/components/ParameterSelection/ParameterSelectionReducer.js +32 -16
- data/webpack/components/ParameterSelection/ParameterSelectionSelectors.js +2 -2
- data/webpack/components/ParameterSelection/index.js +4 -4
- data/webpack/components/common/DeleteTableEntry.js +1 -1
- data/webpack/reducer.js +14 -11
- metadata +48 -3
@@ -1,9 +1,14 @@
|
|
1
1
|
export const APPLICATION_DEFINITION_INIT = 'INIT_APPLICATION_DEFINITION_INIT';
|
2
|
+
export const APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_REQUEST = 'APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_REQUEST';
|
3
|
+
export const APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_SUCCESS = 'APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_SUCCESS';
|
4
|
+
export const APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_FAILURE = 'APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_FAILURE';
|
2
5
|
export const APPLICATION_DEFINITION_SERVICE_DELETE = 'APPLICATION_DEFINITION_SERVICE_DELETE';
|
3
6
|
export const APPLICATION_DEFINITION_SERVICE_ADD = 'APPLICATION_DEFINITION_SERVICE_ADD';
|
4
7
|
export const APPLICATION_DEFINITION_SERVICE_EDIT_ACTIVATE = 'APPLICATION_DEFINITION_SERVICE_EDIT_ACTIVATE';
|
5
8
|
export const APPLICATION_DEFINITION_SERVICE_EDIT_CONFIRM = 'APPLICATION_DEFINITION_SERVICE_EDIT_CONFIRM';
|
6
9
|
export const APPLICATION_DEFINITION_SERVICE_EDIT_CHANGE = 'APPLICATION_DEFINITION_SERVICE_EDIT_CHANGE';
|
7
10
|
export const APPLICATION_DEFINITION_SERVICE_EDIT_CANCEL = 'APPLICATION_DEFINITION_SERVICE_EDIT_CANCEL';
|
8
|
-
export const
|
9
|
-
export const
|
11
|
+
export const APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_OPEN = 'APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_OPEN';
|
12
|
+
export const APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_CLOSE = 'APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_CLOSE';
|
13
|
+
export const APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_OPEN = 'APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_OPEN';
|
14
|
+
export const APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_CLOSE = 'APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_CLOSE';
|
@@ -0,0 +1,26 @@
|
|
1
|
+
export function transformAnsiblePlaybook(playbook) {
|
2
|
+
|
3
|
+
const ansiblePlaybook = new Object;
|
4
|
+
ansiblePlaybook.id = playbook.id;
|
5
|
+
ansiblePlaybook.name = playbook.name;
|
6
|
+
ansiblePlaybook.groups = {};
|
7
|
+
|
8
|
+
if (playbook.hasOwnProperty('groups')) {
|
9
|
+
Object.entries(playbook.groups).forEach(([group_name,group_vars]) => {
|
10
|
+
ansiblePlaybook.groups[group_name] = [];
|
11
|
+
|
12
|
+
let id=0;
|
13
|
+
Object.entries(group_vars).forEach(([var_name,var_value]) => {
|
14
|
+
let entry = {
|
15
|
+
id: id,
|
16
|
+
name: var_name,
|
17
|
+
value: var_value
|
18
|
+
}
|
19
|
+
ansiblePlaybook.groups[group_name].push(entry);
|
20
|
+
id += 1;
|
21
|
+
});
|
22
|
+
});
|
23
|
+
}
|
24
|
+
|
25
|
+
return ansiblePlaybook;
|
26
|
+
}
|
@@ -8,16 +8,30 @@ import {
|
|
8
8
|
|
9
9
|
import {
|
10
10
|
APPLICATION_DEFINITION_INIT,
|
11
|
+
APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_REQUEST,
|
12
|
+
APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_SUCCESS,
|
13
|
+
APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_FAILURE,
|
11
14
|
APPLICATION_DEFINITION_SERVICE_DELETE,
|
12
15
|
APPLICATION_DEFINITION_SERVICE_ADD,
|
13
16
|
APPLICATION_DEFINITION_SERVICE_EDIT_ACTIVATE,
|
14
17
|
APPLICATION_DEFINITION_SERVICE_EDIT_CONFIRM,
|
15
18
|
APPLICATION_DEFINITION_SERVICE_EDIT_CHANGE,
|
16
19
|
APPLICATION_DEFINITION_SERVICE_EDIT_CANCEL,
|
17
|
-
|
18
|
-
|
20
|
+
APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_OPEN,
|
21
|
+
APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_CLOSE,
|
22
|
+
APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_OPEN,
|
23
|
+
APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_CLOSE,
|
19
24
|
} from './ApplicationDefinitionConstants';
|
20
25
|
|
26
|
+
import {
|
27
|
+
PARAMETER_SELECTION_PARAM_TYPE_FOREMAN,
|
28
|
+
PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE,
|
29
|
+
} from '../ParameterSelection/ParameterSelectionConstants';
|
30
|
+
|
31
|
+
import {
|
32
|
+
transformAnsiblePlaybook,
|
33
|
+
} from './ApplicationDefinitionHelper';
|
34
|
+
|
21
35
|
export const initialState = Immutable({
|
22
36
|
name: false,
|
23
37
|
error: { errorMsg: '', status: '', statusText: '' },
|
@@ -30,6 +44,30 @@ const applicationDefinitionConf = (state = initialState, action) => {
|
|
30
44
|
case APPLICATION_DEFINITION_INIT: {
|
31
45
|
return state.merge(payload);
|
32
46
|
}
|
47
|
+
|
48
|
+
case APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_FAILURE: {
|
49
|
+
return state.merge({ error: payload.error, loading: false });
|
50
|
+
}
|
51
|
+
case APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_REQUEST: {
|
52
|
+
return state.set('loading', true);
|
53
|
+
}
|
54
|
+
case APPLICATION_DEFINITION_LOAD_ANSIBLE_DATA_SUCCESS: {
|
55
|
+
let newState = {};
|
56
|
+
let allVars = [];
|
57
|
+
|
58
|
+
const ansiblePlaybook = transformAnsiblePlaybook(payload);
|
59
|
+
|
60
|
+
if (ansiblePlaybook.hasOwnProperty('groups')) {
|
61
|
+
allVars = ansiblePlaybook.groups['all']
|
62
|
+
}
|
63
|
+
|
64
|
+
newState = {
|
65
|
+
ansiblePlaybook: ansiblePlaybook,
|
66
|
+
ansibleVarsAll: allVars
|
67
|
+
}
|
68
|
+
|
69
|
+
return state.merge(newState);
|
70
|
+
}
|
33
71
|
case APPLICATION_DEFINITION_SERVICE_ADD: {
|
34
72
|
let services = [];
|
35
73
|
let index = 1;
|
@@ -39,7 +77,9 @@ const applicationDefinitionConf = (state = initialState, action) => {
|
|
39
77
|
index = Math.max(...services.map(e => e.id)) + 1;
|
40
78
|
}
|
41
79
|
|
42
|
-
const newRow = {id: index, name: "", description: '', hostgroup: '',
|
80
|
+
const newRow = { id: index, name: "", description: '', hostgroup: '',
|
81
|
+
ansibleGroup: '', minCount: '', maxCount: '',
|
82
|
+
foremanParameters: [], ansibleParameters: [], newEntry: true };
|
43
83
|
newRow.backup = cloneDeep(newRow)
|
44
84
|
services.push(newRow);
|
45
85
|
|
@@ -72,9 +112,16 @@ const applicationDefinitionConf = (state = initialState, action) => {
|
|
72
112
|
delete services[index].backup;
|
73
113
|
delete services[index].newEntry;
|
74
114
|
|
115
|
+
let ansibleParameters = [];
|
116
|
+
const selectedGroup = services[index].ansibleGroup;
|
117
|
+
|
118
|
+
if (selectedGroup) {
|
119
|
+
services[index].ansibleParameters = state.ansiblePlaybook.groups[selectedGroup];
|
120
|
+
}
|
121
|
+
|
75
122
|
return state.merge({
|
76
123
|
editMode: false,
|
77
|
-
services: services
|
124
|
+
services: services,
|
78
125
|
});
|
79
126
|
}
|
80
127
|
case APPLICATION_DEFINITION_SERVICE_EDIT_CHANGE: {
|
@@ -101,33 +148,31 @@ const applicationDefinitionConf = (state = initialState, action) => {
|
|
101
148
|
services: services
|
102
149
|
});
|
103
150
|
}
|
104
|
-
case
|
151
|
+
case APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_OPEN: {
|
105
152
|
let parametersData = {};
|
106
153
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
hostgroup_id: payload.rowData.hostgroup
|
112
|
-
}
|
113
|
-
parametersData.parameters = payload.rowData.parameters;
|
114
|
-
|
115
|
-
if (parametersData.parameters.length > 0) {
|
116
|
-
parametersData.mode = 'editDefinition';
|
117
|
-
} else {
|
118
|
-
parametersData.mode = 'newDefinition';
|
119
|
-
}
|
154
|
+
parametersData.paramDefinition = {
|
155
|
+
id: payload.rowData.id,
|
156
|
+
name: payload.rowData.name,
|
157
|
+
dataId: payload.rowData.hostgroup
|
120
158
|
}
|
121
159
|
|
160
|
+
parametersData.type = PARAMETER_SELECTION_PARAM_TYPE_FOREMAN;
|
161
|
+
parametersData.parameters = payload.rowData.foremanParameters;
|
162
|
+
parametersData.useDefaultValue = true;
|
163
|
+
parametersData.allowRowAdjustment = true;
|
164
|
+
parametersData.allowNameAdjustment = true;
|
165
|
+
parametersData.allowDescriptionAdjustment = true;
|
166
|
+
|
122
167
|
return state.merge({
|
123
168
|
parametersData: parametersData,
|
124
169
|
});
|
125
170
|
}
|
126
|
-
case
|
171
|
+
case APPLICATION_DEFINITION_FOREMAN_PARAMETER_SELECTION_MODAL_CLOSE: {
|
127
172
|
if (payload.mode == 'save') {
|
128
173
|
const services = cloneDeep(state.services);
|
129
|
-
const index = findIndex(services, { id: state.parametersData.
|
130
|
-
services[index].
|
174
|
+
const index = findIndex(services, { id: state.parametersData.paramDefinition.id });
|
175
|
+
services[index].foremanParameters = cloneDeep(payload.parameterSelection);
|
131
176
|
|
132
177
|
return state.merge({
|
133
178
|
parametersData: null,
|
@@ -139,6 +184,57 @@ const applicationDefinitionConf = (state = initialState, action) => {
|
|
139
184
|
});
|
140
185
|
}
|
141
186
|
}
|
187
|
+
case APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_OPEN: {
|
188
|
+
let parametersData = {};
|
189
|
+
|
190
|
+
if ((payload.hasOwnProperty('isAllGroup')) && (payload.isAllGroup == true)) {
|
191
|
+
parametersData.parameters = state.ansibleVarsAll;
|
192
|
+
parametersData.paramDefinition = {
|
193
|
+
isAllGroup: true,
|
194
|
+
}
|
195
|
+
} else {
|
196
|
+
parametersData.parameters = payload.rowData.ansibleParameters;
|
197
|
+
parametersData.paramDefinition = {
|
198
|
+
id: payload.rowData.id,
|
199
|
+
name: payload.rowData.name,
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
parametersData.type = PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE;
|
204
|
+
parametersData.useDefaultValue = false;
|
205
|
+
parametersData.allowRowAdjustment = true;
|
206
|
+
parametersData.allowNameAdjustment = true;
|
207
|
+
parametersData.allowDescriptionAdjustment = true;
|
208
|
+
|
209
|
+
return state.merge({
|
210
|
+
parametersData: parametersData,
|
211
|
+
});
|
212
|
+
}
|
213
|
+
case APPLICATION_DEFINITION_ANSIBLE_PARAMETER_SELECTION_MODAL_CLOSE: {
|
214
|
+
let newState = {};
|
215
|
+
if (payload.mode == 'save') {
|
216
|
+
if ((state.parametersData.paramDefinition.hasOwnProperty('isAllGroup')) && (state.parametersData.paramDefinition.isAllGroup == true)) {
|
217
|
+
newState = {
|
218
|
+
parametersData: null,
|
219
|
+
ansibleVarsAll: cloneDeep(payload.parameterSelection),
|
220
|
+
};
|
221
|
+
} else {
|
222
|
+
const services = cloneDeep(state.services);
|
223
|
+
const index = findIndex(services, { id: state.parametersData.paramDefinition.id });
|
224
|
+
services[index].ansibleParameters = cloneDeep(payload.parameterSelection);
|
225
|
+
|
226
|
+
newState = {
|
227
|
+
parametersData: null,
|
228
|
+
services: services,
|
229
|
+
};
|
230
|
+
}
|
231
|
+
} else {
|
232
|
+
newState = {
|
233
|
+
parametersData: null,
|
234
|
+
};
|
235
|
+
}
|
236
|
+
return state.merge(newState);
|
237
|
+
}
|
142
238
|
default:
|
143
239
|
return state;
|
144
240
|
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
const applicationDefinitionConf = state => state.foremanAcd.applicationDefinitionConf;
|
2
2
|
|
3
3
|
export const selectEditMode = state => applicationDefinitionConf(state).editMode;
|
4
|
+
export const selectAnsiblePlaybook = state => applicationDefinitionConf(state).ansiblePlaybook;
|
4
5
|
export const selectServices = state => applicationDefinitionConf(state).services;
|
5
6
|
export const selectColumns = state => applicationDefinitionConf(state).columns;
|
6
7
|
export const selectParametersData = state => applicationDefinitionConf(state).parametersData;
|
8
|
+
export const selectAnsibleVarsAll = state => applicationDefinitionConf(state).ansibleVarsAll;
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
import ExtSelect from '../../common/ExtSelect';
|
4
|
+
import RailsData from '../../common/RailsData'
|
5
|
+
|
6
|
+
const AnsiblePlaybookSelector= ({
|
7
|
+
label,
|
8
|
+
hidden,
|
9
|
+
editable,
|
10
|
+
viewText,
|
11
|
+
selectValue,
|
12
|
+
onChange,
|
13
|
+
options,
|
14
|
+
additionalData,
|
15
|
+
}) =>{
|
16
|
+
return (
|
17
|
+
<div className="form-group">
|
18
|
+
<label className="col-md-2 control-label">{label}</label>
|
19
|
+
<div className="col-md-4">
|
20
|
+
<ExtSelect
|
21
|
+
editable={editable}
|
22
|
+
viewText={viewText}
|
23
|
+
selectValue={selectValue}
|
24
|
+
onChange={onChange}
|
25
|
+
options={options}
|
26
|
+
additionalData={additionalData}
|
27
|
+
/>
|
28
|
+
<RailsData
|
29
|
+
key='ansible_playbook_id'
|
30
|
+
view='app_definition'
|
31
|
+
parameter='acd_ansible_playbook_id'
|
32
|
+
value={selectValue}
|
33
|
+
/>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
);
|
37
|
+
};
|
38
|
+
|
39
|
+
AnsiblePlaybookSelector.propTypes = {
|
40
|
+
label: PropTypes.string.isRequired,
|
41
|
+
editable: PropTypes.bool.isRequired,
|
42
|
+
viewText: PropTypes.string,
|
43
|
+
selectValue: PropTypes.string,
|
44
|
+
onChange: PropTypes.func.isRequired,
|
45
|
+
options: PropTypes.object,
|
46
|
+
additionalData: PropTypes.object,
|
47
|
+
};
|
48
|
+
|
49
|
+
export default AnsiblePlaybookSelector;
|
@@ -7,16 +7,20 @@ import * as ApplicationDefinitionActions from './ApplicationDefinitionActions';
|
|
7
7
|
|
8
8
|
import {
|
9
9
|
selectEditMode,
|
10
|
+
selectAnsiblePlaybook,
|
10
11
|
selectServices,
|
11
12
|
selectColumns,
|
12
13
|
selectParametersData,
|
14
|
+
selectAnsibleVarsAll,
|
13
15
|
} from './ApplicationDefinitionSelectors';
|
14
16
|
|
15
17
|
const mapStateToProps = state => ({
|
16
18
|
editMode: selectEditMode(state),
|
19
|
+
ansiblePlaybook: selectAnsiblePlaybook(state),
|
17
20
|
services: selectServices(state),
|
18
21
|
columns: selectColumns(state),
|
19
22
|
parametersData: selectParametersData(state),
|
23
|
+
ansibleVarsAll: selectAnsibleVarsAll(state),
|
20
24
|
});
|
21
25
|
|
22
26
|
const mapDispatchToProps = dispatch =>
|
@@ -21,6 +21,11 @@ import {
|
|
21
21
|
inlineEditFormatterFactory,
|
22
22
|
} from 'patternfly-react';
|
23
23
|
|
24
|
+
import {
|
25
|
+
PARAMETER_SELECTION_PARAM_TYPE_FOREMAN,
|
26
|
+
PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE,
|
27
|
+
} from '../ParameterSelection/ParameterSelectionConstants';
|
28
|
+
|
24
29
|
class ApplicationInstance extends React.Component {
|
25
30
|
|
26
31
|
constructor(props) {
|
@@ -69,19 +74,19 @@ class ApplicationInstance extends React.Component {
|
|
69
74
|
|
70
75
|
componentDidMount() {
|
71
76
|
const {
|
72
|
-
data: { mode, appDefinition, hosts,
|
77
|
+
data: { mode, appDefinition, hosts, ansibleVarsAll, appDefinitionUrl },
|
73
78
|
initApplicationInstance,
|
74
79
|
addApplicationInstanceHost,
|
75
80
|
deleteApplicationInstanceHost,
|
76
81
|
activateEditApplicationInstanceHost,
|
77
82
|
changeEditApplicationInstanceHost,
|
78
|
-
|
79
|
-
|
83
|
+
openForemanParameterSelectionModal,
|
84
|
+
openAnsibleParameterSelectionModal,
|
80
85
|
loadApplicationDefinition,
|
81
86
|
} = this.props;
|
82
87
|
|
83
88
|
if (mode === 'editInstance') {
|
84
|
-
loadApplicationDefinition(appDefinition.id, { url:
|
89
|
+
loadApplicationDefinition(appDefinition.id, { url: appDefinitionUrl });
|
85
90
|
}
|
86
91
|
|
87
92
|
const inlineEditButtonsFormatter = inlineEditFormatterFactory({
|
@@ -92,13 +97,21 @@ class ApplicationInstance extends React.Component {
|
|
92
97
|
bsStyle="default"
|
93
98
|
onClick={() => activateEditApplicationInstanceHost(additionalData)}
|
94
99
|
>
|
95
|
-
<Icon type="pf" name="edit" />
|
100
|
+
<Icon type="pf" name="edit" title="edit entry" />
|
96
101
|
</Button>
|
102
|
+
|
97
103
|
<Button
|
98
104
|
bsStyle="default"
|
99
|
-
onClick={() =>
|
105
|
+
onClick={() => openForemanParameterSelectionModal(additionalData)}
|
100
106
|
>
|
101
|
-
<Icon type="pf" name="settings" />
|
107
|
+
<Icon type="pf" name="settings" title="change parameters" />
|
108
|
+
</Button>
|
109
|
+
|
110
|
+
<Button
|
111
|
+
bsStyle="default"
|
112
|
+
onClick={() => openAnsibleParameterSelectionModal(additionalData)}
|
113
|
+
>
|
114
|
+
<span title="change ansible variables">A</span>
|
102
115
|
</Button>
|
103
116
|
<DeleteTableEntry
|
104
117
|
hidden={false}
|
@@ -113,9 +126,14 @@ class ApplicationInstance extends React.Component {
|
|
113
126
|
<Button bsStyle="default" disabled>
|
114
127
|
<Icon type="pf" name="edit" />
|
115
128
|
</Button>
|
129
|
+
|
116
130
|
<Button bsStyle="default" disabled>
|
117
131
|
<Icon type="pf" name="settings" />
|
118
132
|
</Button>
|
133
|
+
|
134
|
+
<Button bsStyle="default" disabled>
|
135
|
+
<span>A</span>
|
136
|
+
</Button>
|
119
137
|
<DeleteTableEntry
|
120
138
|
hidden={false}
|
121
139
|
disabled={true}
|
@@ -188,6 +206,7 @@ class ApplicationInstance extends React.Component {
|
|
188
206
|
initApplicationInstance(
|
189
207
|
appDefinition,
|
190
208
|
hosts,
|
209
|
+
ansibleVarsAll,
|
191
210
|
this.headerFormatter,
|
192
211
|
this.inlineEditFormatter,
|
193
212
|
this.inlineEditButtonsFormatter,
|
@@ -196,7 +215,7 @@ class ApplicationInstance extends React.Component {
|
|
196
215
|
|
197
216
|
render() {
|
198
217
|
const {
|
199
|
-
data: { mode, applications, organization, location,
|
218
|
+
data: { mode, applications, organization, location, foremanDataUrl, appDefinitionUrl },
|
200
219
|
appDefinition,
|
201
220
|
services,
|
202
221
|
hosts,
|
@@ -204,9 +223,9 @@ class ApplicationInstance extends React.Component {
|
|
204
223
|
addApplicationInstanceHost,
|
205
224
|
confirmEditApplicationInstanceHost,
|
206
225
|
cancelEditApplicationInstanceHost,
|
207
|
-
|
208
|
-
|
209
|
-
|
226
|
+
closeForemanParameterSelectionModal,
|
227
|
+
openAnsibleParameterSelectionModal,
|
228
|
+
closeAnsibleParameterSelectionModal,
|
210
229
|
loadApplicationDefinition,
|
211
230
|
} = this.props;
|
212
231
|
|
@@ -232,7 +251,7 @@ class ApplicationInstance extends React.Component {
|
|
232
251
|
options={ applications }
|
233
252
|
onChange={ loadApplicationDefinition }
|
234
253
|
selectValue={ appDefinition.id.toString() }
|
235
|
-
additionalData={{url:
|
254
|
+
additionalData={{url: appDefinitionUrl}}
|
236
255
|
/>
|
237
256
|
</div>
|
238
257
|
<div className="form-group">
|
@@ -269,33 +288,73 @@ class ApplicationInstance extends React.Component {
|
|
269
288
|
/>
|
270
289
|
</Table.PfProvider>
|
271
290
|
<AddTableEntry
|
272
|
-
|
273
|
-
|
274
|
-
|
291
|
+
hidden={ false }
|
292
|
+
disabled={ this.props.editMode }
|
293
|
+
onAddTableEntry={ addApplicationInstanceHost }
|
275
294
|
/>
|
295
|
+
<span style={{ marginLeft: 30 }}>
|
296
|
+
Ansible group vars 'all':
|
297
|
+
<Button
|
298
|
+
style={{ marginLeft: 10 }}
|
299
|
+
bsStyle="default"
|
300
|
+
disabled={ this.props.editMode }
|
301
|
+
onClick={() => openAnsibleParameterSelectionModal({
|
302
|
+
isAllGroup: true
|
303
|
+
})}
|
304
|
+
>
|
305
|
+
<span title="change ansible variables for 'all'">A</span>
|
306
|
+
</Button>
|
307
|
+
</span>
|
276
308
|
</div>
|
277
309
|
<div>
|
278
310
|
<ForemanModal
|
279
|
-
id="
|
311
|
+
id="AppInstanceForemanParamSelection"
|
280
312
|
dialogClassName="param_selection_modal"
|
281
|
-
title="Parameter specification for Application Instance"
|
313
|
+
title="Foreman Parameter specification for Application Instance"
|
282
314
|
>
|
283
315
|
<ForemanModal.Header closeButton={false}>
|
284
316
|
Parameter specification
|
285
317
|
</ForemanModal.Header>
|
286
318
|
{this.props.parametersData ? (
|
287
319
|
<ParameterSelection
|
320
|
+
paramType={ PARAMETER_SELECTION_PARAM_TYPE_FOREMAN }
|
288
321
|
location={ location }
|
289
322
|
organization={ organization }
|
290
|
-
|
323
|
+
paramDataUrl= { foremanDataUrl }
|
291
324
|
data={ this.props.parametersData }
|
292
325
|
/>
|
293
326
|
) : (<span>Empty</span>)
|
294
327
|
}
|
295
328
|
<ForemanModal.Footer>
|
296
329
|
<div>
|
297
|
-
<Button bsStyle="primary" onClick={() =>
|
298
|
-
<Button bsStyle="default" onClick={() =>
|
330
|
+
<Button bsStyle="primary" onClick={() => closeForemanParameterSelectionModal({ mode: 'save' })}>Save</Button>
|
331
|
+
<Button bsStyle="default" onClick={() => closeForemanParameterSelectionModal({ mode: 'cancel' })}>Cancel</Button>
|
332
|
+
</div>
|
333
|
+
</ForemanModal.Footer>
|
334
|
+
</ForemanModal>
|
335
|
+
</div>
|
336
|
+
<div>
|
337
|
+
<ForemanModal
|
338
|
+
id="AppInstanceAnsibleParamSelection"
|
339
|
+
dialogClassName="param_selection_modal"
|
340
|
+
title="Ansible group variables for Application Instance"
|
341
|
+
>
|
342
|
+
<ForemanModal.Header closeButton={false}>
|
343
|
+
Parameter specification
|
344
|
+
</ForemanModal.Header>
|
345
|
+
{this.props.parametersData ? (
|
346
|
+
<ParameterSelection
|
347
|
+
paramType={ PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE }
|
348
|
+
location={ location }
|
349
|
+
organization={ organization }
|
350
|
+
data={ this.props.parametersData }
|
351
|
+
/>
|
352
|
+
) : (<span>Empty</span>)
|
353
|
+
}
|
354
|
+
<ForemanModal.Footer>
|
355
|
+
<div>
|
356
|
+
<Button bsStyle="primary" onClick={() => closeAnsibleParameterSelectionModal({ mode: 'save' })}>Save</Button>
|
357
|
+
<Button bsStyle="default" onClick={() => closeAnsibleParameterSelectionModal({ mode: 'cancel' })}>Cancel</Button>
|
299
358
|
</div>
|
300
359
|
</ForemanModal.Footer>
|
301
360
|
</ForemanModal>
|
@@ -306,6 +365,12 @@ class ApplicationInstance extends React.Component {
|
|
306
365
|
parameter='hosts'
|
307
366
|
value={JSON.stringify(this.props.hosts)}
|
308
367
|
/>
|
368
|
+
<RailsData
|
369
|
+
key='applications_instance'
|
370
|
+
view='app_instance'
|
371
|
+
parameter='ansible_vars_all'
|
372
|
+
value={JSON.stringify(this.props.ansibleVarsAll)}
|
373
|
+
/>
|
309
374
|
</span>
|
310
375
|
)};
|
311
376
|
}
|
@@ -316,6 +381,7 @@ ApplicationInstance.defaultProps = {
|
|
316
381
|
editMode: false,
|
317
382
|
services: [],
|
318
383
|
hosts: [],
|
384
|
+
ansibleVarsAll: [],
|
319
385
|
parametersData: {},
|
320
386
|
columns: [],
|
321
387
|
editParamsOfRowId: null,
|
@@ -327,6 +393,8 @@ ApplicationInstance.propTypes = {
|
|
327
393
|
services: PropTypes.array,
|
328
394
|
appDefinition: PropTypes.object,
|
329
395
|
columns: PropTypes.array,
|
396
|
+
hosts: PropTypes.array,
|
397
|
+
ansibleVarsAll: PropTypes.array,
|
330
398
|
loadApplicationDefinition: PropTypes.func,
|
331
399
|
addApplicationInstanceHost: PropTypes.func,
|
332
400
|
deleteApplicationInstanceHost: PropTypes.func,
|
@@ -334,8 +402,10 @@ ApplicationInstance.propTypes = {
|
|
334
402
|
confirmEditApplicationInstanceHost: PropTypes.func,
|
335
403
|
cancelEditApplicationInstanceHost: PropTypes.func,
|
336
404
|
changeEditApplicationInstanceHost: PropTypes.func,
|
337
|
-
|
338
|
-
|
405
|
+
openForemanParameterSelectionModal: PropTypes.func,
|
406
|
+
closeForemanParameterSelectionModal: PropTypes.func,
|
407
|
+
openAnsibleParameterSelectionModal: PropTypes.func,
|
408
|
+
closeAnsibleParameterSelectionModal: PropTypes.func,
|
339
409
|
parametersData: PropTypes.object,
|
340
410
|
};
|
341
411
|
|