blob: 6a05b5dd4108293f22cfa95c482d903b551727b6 [file] [log] [blame]
// 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 FauxtonAPI from "../../core/api";
import {isInvalid} from "./helpers";
import {
SETUP_ADD_NODE_TO_LIST,
SETUP_BIND_ADDRESS_ADDITIONAL_NODE,
SETUP_BIND_ADDRESS_FOR_SINGLE_NODE,
SETUP_NODE_COUNT,
SETUP_PORT_ADDITIONAL_NODE,
SETUP_PORT_FOR_SINGLE_NODE,
SETUP_REMOTE_ADDRESS_ADDITIONAL_NODE,
SETUP_RESET_ADDITIONAL_NODE,
SETUP_SET_CLUSTERSTATUS,
SETUP_SET_PASSWORD,
SETUP_SET_USERNAME
} from "./actiontypes";
import {get, post} from '../../core/ajax';
import Api from "../auth/api";
/**
* @typedef {Object} CredentialObject
* @param {string} username The username
* @param {string} password The password
*/
/**
* Public functions
*/
const showError = (msg, error) => {
const errorMsg = error ? ' Error:' + error : '';
FauxtonAPI.addNotification({
msg: msg + errorMsg,
type: 'error',
fade: false,
clear: true
});
return;
};
export const getClusterStateFromCouch = () => async dispatch => {
const baseUrl = FauxtonAPI.urls('cluster_setup', 'server');
const json = await get(baseUrl);
dispatch({
type: SETUP_SET_CLUSTERSTATUS,
options: {
state: json.state
}
});
};
export const finishClusterSetup = message => async() => {
const baseUrl = FauxtonAPI.urls('cluster_setup', 'server');
const body = {action: 'finish_cluster'};
try {
const response = await post(baseUrl, body, {raw: true});
if (response.ok) {
FauxtonAPI.addNotification({
msg: message,
type: 'success',
fade: false,
clear: true
});
FauxtonAPI.navigate('#setup/finish');
} else {
const json = await response.json();
showError('The cluster is already finished', json.reason);
}
} catch (err) {
showError('There was an error. Please check your setup and try again.', err);
}
};
export const setupSingleNode = (credentials, setupNode) => async() => {
const baseUrl = FauxtonAPI.urls('cluster_setup', 'server');
const setupAttrs = {
action: 'enable_single_node',
username: credentials.username,
password: credentials.password,
bind_address: setupNode.bindAddress,
port: setupNode.port,
singlenode: true
};
const attrsAreInvalid = isInvalid(setupAttrs);
if (attrsAreInvalid) {
return showError(attrsAreInvalid);
}
try {
const response = await post(baseUrl, setupAttrs, {raw: true});
if (!response.ok) {
const json = await response.json();
const error = json.reason ? json.reason : json.error;
return showError(error);
}
await Api.login({name: credentials.username, password: credentials.password});
FauxtonAPI.addNotification({
msg: 'Single node setup successful.',
type: 'success',
fade: false,
clear: true
});
FauxtonAPI.navigate('#setup/finish');
} catch (error) {
showError("The cluster has not been setuped successfully.", error);
}
};
/**
* Add a node to the current cluster configuration
* 1. Enable cluster for the current node
* 2. Enable cluster for the remote node
* 3. Add the remote node
* @param isOrWasAdminParty
* @param credentials
* @param setupNode
* @param additionalNode
*/
export const addNode = (isOrWasAdminParty, credentials, setupNode, additionalNode) => async dispatch => {
const baseUrl = FauxtonAPI.urls('cluster_setup', 'server');
const enableSetupData = {
action: 'enable_cluster',
username: credentials.username,
password: credentials.password,
bind_address: setupNode.bindAddress,
port: setupNode.port,
node_count: setupNode.nodeCount,
singlenode: false
};
const attrsAreInvalid = isInvalid({
username: credentials.username,
password: credentials.password,
...setupNode
});
if (attrsAreInvalid) {
return showError(attrsAreInvalid);
}
let enableNodeData = {
action: 'enable_cluster',
username: credentials.username,
password: credentials.password,
bind_address: additionalNode.bindAddress,
port: additionalNode.port,
node_count: setupNode.nodeCount,
remote_node: additionalNode.remoteAddress,
remote_current_user: credentials.username,
remote_current_password: credentials.password
};
if (isOrWasAdminParty) {
delete enableNodeData.remote_current_user;
delete enableNodeData.remote_current_password;
}
const additionalNodeDataIsInvalid = isInvalid(enableNodeData);
if (additionalNodeDataIsInvalid) {
return showError(additionalNodeDataIsInvalid);
}
const continueSetup = async() => {
const addNodeData = {
action: 'add_node',
username: credentials.username,
password: credentials.password,
host: additionalNode.remoteAddress,
port: additionalNode.port,
singlenode: false
};
//Enable the remote node
const enableRemoteNodeResponse = await post(baseUrl, enableNodeData, {raw: true});
if (!enableRemoteNodeResponse.ok) {
const json = await enableRemoteNodeResponse.json();
const error = json.reason ? json.reason : json.error;
return showError(error);
}
const addNodeResponse = await post(baseUrl, addNodeData, {raw: true});
if (!addNodeResponse.ok) {
const json = await addNodeResponse.json();
const error = json.reason ? json.reason : json.error;
return showError(error);
}
dispatch({
type: SETUP_ADD_NODE_TO_LIST,
options: {
value: {
port: additionalNode.port,
remoteAddress: additionalNode.remoteAddress
}
}
});
FauxtonAPI.addNotification({
msg: 'Added node',
type: 'success',
fade: false,
clear: true
});
};
try {
await post(baseUrl, enableSetupData, {raw: true});
await Api.login({name: credentials.username, password: credentials.password});
await continueSetup();
} catch (err) {
showError('An error occured while adding the node.', err);
}
};
export const resetAddtionalNodeForm = () => {
return {
type: SETUP_RESET_ADDITIONAL_NODE,
};
};
export const alterPortAdditionalNode = value => {
return {
type: SETUP_PORT_ADDITIONAL_NODE,
options: {
value: value
}
};
};
export const alterRemoteAddressAdditionalNode = value => {
return {
type: SETUP_REMOTE_ADDRESS_ADDITIONAL_NODE,
options: {
value: value
}
};
};
export const alterBindAddressAdditionalNode = value => {
return {
type: SETUP_BIND_ADDRESS_ADDITIONAL_NODE,
options: {
value: value
}
};
};
export const setUsername = value => {
return {
type: SETUP_SET_USERNAME,
options: {
value: value
}
};
};
export const setPassword = value => {
return {
type: SETUP_SET_PASSWORD,
options: {
value: value
}
};
};
export const setPortForSetupNode = value => {
return {
type: SETUP_PORT_FOR_SINGLE_NODE,
options: {
value: value
}
};
};
export const setBindAddressForSetupNode = value => {
return {
type: SETUP_BIND_ADDRESS_FOR_SINGLE_NODE,
options: {
value: value
}
};
};
export const setNodeCount = value => {
return {
type: SETUP_NODE_COUNT,
options: {
value: value
}
};
};