diff --git a/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml b/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml
new file mode 100644
index 00000000..3ee35227
--- /dev/null
+++ b/releasenotes/notes/select_roles-e4aed7695f9ba45d.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Custom deployment roles selection. Roles section of Deployment plan page now
+ includes 'Manage Roles'. Clicking the link provides a list of all available
+ roles and lets user select roles intended for deployment.
diff --git a/src/js/actions/ZaqarActions.js b/src/js/actions/ZaqarActions.js
index feeafd82..25b2302a 100644
--- a/src/js/actions/ZaqarActions.js
+++ b/src/js/actions/ZaqarActions.js
@@ -95,6 +95,12 @@ export default {
dispatch(RolesActions.fetchAvailableRolesFinished(payload, history));
break;
}
+ // TODO(jtomasek): change this back once underlining tripleo-common patch is fixed
+ case MistralConstants.SELECT_ROLES: {
+ // case 'tripleo.roles.v1.select_roles': {
+ dispatch(RolesActions.selectRolesFinished(payload, history));
+ break;
+ }
default:
break;
diff --git a/src/js/components/roles/AvailableRoleInput.js b/src/js/components/roles/AvailableRoleInput.js
index 9796224e..b75e3f6e 100644
--- a/src/js/components/roles/AvailableRoleInput.js
+++ b/src/js/components/roles/AvailableRoleInput.js
@@ -26,7 +26,7 @@ const AvailableRoleInput = ({
input: { value, name, onChange },
style
}) => (
-
{
+ const roleNames = Object.keys(pickBy(values));
+ this.props.selectRoles(this.props.currentPlanName, roleNames);
+ };
+
render() {
const {
availableRoles,
availableRolesLoaded,
+ fetchingAvailableRoles,
intl: { formatMessage },
currentPlanName,
roles
@@ -62,28 +69,31 @@ class SelectRolesDialog extends React.Component {
-
roles.includes(r)).toJS()}
- currentPlanName={currentPlanName}
+
- roles.keySeq().includes(key))
+ .toJS()}
+ availableRoles={availableRoles}
+ currentPlanName={currentPlanName}
>
-
- {availableRoles
- .toList()
- .map(role => (
-
- ))}
-
-
-
+ {availableRoles
+ .toList()
+ .map(role => (
+
+ ))}
+
+
);
}
@@ -93,20 +103,25 @@ SelectRolesDialog.propTypes = {
availableRolesLoaded: PropTypes.bool.isRequired,
currentPlanName: PropTypes.string.isRequired,
fetchAvailableRoles: PropTypes.func.isRequired,
+ fetchingAvailableRoles: PropTypes.bool.isRequired,
intl: PropTypes.object.isRequired,
- roles: ImmutablePropTypes.map.isRequired
+ roles: ImmutablePropTypes.map.isRequired,
+ selectRoles: PropTypes.func.isRequired
};
const mapStateToProps = state => ({
availableRoles: getMergedRoles(state),
availableRolesLoaded: state.availableRoles.loaded,
+ fetchingAvailableRoles: state.availableRoles.isFetching,
currentPlanName: getCurrentPlanName(state),
roles: getRoles(state)
});
const mapDispatchToProps = dispatch => ({
fetchAvailableRoles: planName =>
- dispatch(RolesActions.fetchAvailableRoles(planName))
+ dispatch(RolesActions.fetchAvailableRoles(planName)),
+ selectRoles: (planName, roleNames) =>
+ dispatch(RolesActions.selectRoles(planName, roleNames))
});
export default injectIntl(
diff --git a/src/js/components/roles/SelectRolesForm.js b/src/js/components/roles/SelectRolesForm.js
index 27e0c071..593fd621 100644
--- a/src/js/components/roles/SelectRolesForm.js
+++ b/src/js/components/roles/SelectRolesForm.js
@@ -16,37 +16,61 @@
import { Button } from 'react-bootstrap';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import { ModalBody, ModalFooter } from 'react-bootstrap';
+import { ModalFooter } from 'react-bootstrap';
+import { pickBy } from 'lodash';
+import { OverlayLoader } from '../ui/Loader';
import PropTypes from 'prop-types';
import React from 'react';
import { reduxForm } from 'redux-form';
import { CloseModalButton } from '../ui/Modals';
-import FormErrorList from '../ui/forms/FormErrorList';
+import ModalFormErrorList from '../ui/forms/ModalFormErrorList';
const messages = defineMessages({
saveChanges: {
- id: 'SelectRolesDialog.saveChanges',
+ id: 'SelectRolesForm.saveChanges',
defaultMessage: 'Save Changes'
},
cancel: {
- id: 'SelectRolesDialog.cancel',
+ id: 'SelectRolesForm.cancel',
defaultMessage: 'Cancel'
+ },
+ updatingRoles: {
+ id: 'SelectRolesForm.updatingRoles',
+ defaultMessage: 'Updating Roles...'
+ },
+ primaryRoleValidationError: {
+ id: 'SelectRolesForm.primaryRoleValidationError',
+ defaultMessage:
+ 'Please select one role tagged as "primary" and "controller"'
}
});
class SelectRolesForm extends React.Component {
render() {
- const { children, error, handleSubmit, invalid, pristine } = this.props;
+ const {
+ children,
+ error,
+ handleSubmit,
+ invalid,
+ intl: { formatMessage },
+ pristine,
+ submitting
+ } = this.props;
return (