tripleo-ui/src/js/actions/RegisterNodesActions.js

198 lines
5.6 KiB
JavaScript

/**
* Copyright 2017 Red Hat Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
import { defineMessages } from 'react-intl';
import { normalize, arrayOf } from 'normalizr';
import { Map } from 'immutable';
import { getCurrentPlanName } from '../selectors/plans';
import RegisterNodesConstants from '../constants/RegisterNodesConstants';
import MistralApiErrorHandler from '../services/MistralApiErrorHandler';
import MistralApiService from '../services/MistralApiService';
import NotificationActions from './NotificationActions';
import NodesActions from './NodesActions';
import { nodeSchema } from '../normalizrSchemas/nodes';
import ValidationsActions from './ValidationsActions';
import MistralConstants from '../constants/MistralConstants';
import logger from '../services/logging/LoggingService';
const messages = defineMessages({
registrationNotificationTitle: {
id: 'RegisterNodesActions.registrationNotificationTitle',
defaultMessage: 'Nodes Registration Complete'
},
registrationNotificationMessage: {
id: 'RegisterNodesActions.registrationNotificationMessage',
defaultMessage: 'The nodes were successfully registered.'
}
});
export default {
addNode(node) {
return {
type: RegisterNodesConstants.ADD_NODE,
payload: node
};
},
selectNode(id) {
return {
type: RegisterNodesConstants.SELECT_NODE,
payload: id
};
},
removeNode(id) {
return {
type: RegisterNodesConstants.REMOVE_NODE,
payload: id
};
},
updateNode(node) {
return {
type: RegisterNodesConstants.UPDATE_NODE,
payload: node
};
},
startNodesRegistration(nodes) {
return (dispatch, getState) => {
dispatch(this.startNodesRegistrationPending(nodes));
MistralApiService.runWorkflow(
MistralConstants.BAREMETAL_REGISTER_OR_UPDATE,
{
nodes_json: nodes.toList().toJS(),
kernel_name: 'bm-deploy-kernel',
ramdisk_name: 'bm-deploy-ramdisk'
}
)
.then(response => {
if (response.state === 'ERROR') {
const errors = [
{
title: 'Nodes Registration Failed',
message: response.state_info
}
];
dispatch(this.startNodesRegistrationFailed(errors));
} else {
dispatch(this.startNodesRegistrationSuccess());
}
})
.catch(error => {
logger.error(
'Error in RegisterNodesActions.startNodesRegistration',
error
);
let errorHandler = new MistralApiErrorHandler(error);
dispatch(this.startNodesRegistrationFailed(errorHandler.errors));
});
};
},
startNodesRegistrationPending(nodes) {
return {
type: RegisterNodesConstants.START_NODES_REGISTRATION_PENDING,
payload: nodes
};
},
startNodesRegistrationSuccess() {
return {
type: RegisterNodesConstants.START_NODES_REGISTRATION_SUCCESS
};
},
startNodesRegistrationFailed(errors) {
return {
type: RegisterNodesConstants.START_NODES_REGISTRATION_FAILED,
payload: errors
};
},
nodesRegistrationFinished(messagePayload, history) {
return (dispatch, getState, { getIntl }) => {
const { formatMessage } = getIntl(getState());
const registeredNodes =
normalize(messagePayload.registered_nodes, arrayOf(nodeSchema)).entities
.nodes || Map();
dispatch(NodesActions.addNodes(registeredNodes));
// TODO(jtomasek): This should not be needed when workflow returns up to date nodes
dispatch(NodesActions.fetchNodes());
// run pre-introspection validations
dispatch(
ValidationsActions.runValidationGroups(
['pre-introspection'],
getCurrentPlanName(getState())
)
);
switch (messagePayload.status) {
case 'SUCCESS': {
dispatch(
NotificationActions.notify({
type: 'success',
title: formatMessage(messages.registrationNotificationTitle),
message: formatMessage(messages.registrationNotificationMessage)
})
);
dispatch(this.nodesRegistrationSuccess());
history.push('/nodes');
break;
}
case 'FAILED': {
const errors = [
{
title: 'Nodes Registration Failed',
message: JSON.stringify(messagePayload.message)
}
];
history.push('/nodes/register');
// TODO(jtomasek): repopulate nodes registration form with failed nodes provided by message
dispatch(this.nodesRegistrationFailed(errors));
break;
}
default:
break;
}
};
},
nodesRegistrationSuccess() {
return {
type: RegisterNodesConstants.NODES_REGISTRATION_SUCCESS
};
},
nodesRegistrationFailed(errors, failedNodes) {
return {
type: RegisterNodesConstants.NODES_REGISTRATION_FAILED,
payload: {
errors: errors,
failedNodes: failedNodes
}
};
},
cancelNodesRegistration() {
return {
type: RegisterNodesConstants.CANCEL_NODES_REGISTRATION
};
}
};