{ "version": 3, "sources": ["../ui/app/mn_admin/mn_servers_service.js"], "sourcesContent": ["/*\nCopyright 2020-Present Couchbase, Inc.\n\nUse of this software is governed by the Business Source License included in\nthe file licenses/BSL-Couchbase.txt. As of the Change Date specified in that\nfile, in accordance with the Business Source License, use of this software will\nbe governed by the Apache License, Version 2.0, included in the file\nlicenses/APL2.txt.\n*/\n\nimport angular from \"angular\";\nimport _ from \"lodash\";\nimport uiBootstrap from \"angular-ui-bootstrap\";\n\nimport mnPoolDefault from \"../components/mn_pool_default.js\";\nimport template from \"./mn_servers_stop_rebalance_dialog.html\";\n\nexport default \"mnServersService\";\n\nangular\n .module('mnServersService', [mnPoolDefault, uiBootstrap])\n .factory('mnServersService', [\"$http\", \"$q\", \"$uibModal\", \"mnPoolDefault\", mnServersFactory]);\n\nfunction mnServersFactory($http, $q, $uibModal, mnPoolDefault) {\n var pendingEject = [];\n\n var mnServersService = {\n addToPendingEject: addToPendingEject,\n removeFromPendingEject: removeFromPendingEject,\n getPendingEject: getPendingEject,\n setPendingEject: setPendingEject,\n reAddNode: reAddNode,\n setupServices: setupServices,\n cancelFailOverNode: cancelFailOverNode,\n stopRebalance: stopRebalance,\n stopRebalanceWithConfirm: stopRebalanceWithConfirm,\n stopRecovery: stopRecovery,\n postFailover: postFailover,\n ejectNode: ejectNode,\n postRebalance: postRebalance,\n getNodeStatuses: getNodeStatuses,\n addNodesByStatus: addNodesByStatus,\n getNodes: getNodes,\n addServer: addServer,\n getServicesStatus: getServicesStatus\n };\n\n return mnServersService;\n\n function stopRebalanceWithConfirm() {\n return stopRebalance()\n .then(null, function (resp) {\n if (resp.status === 504) {\n return $uibModal.open({\n template\n }).result.then(function () {\n return stopRebalance(true);\n });\n }\n });\n }\n\n function getNodesByService(service, nodes) {\n var nodes2 = nodes.allNodes.filter(node => node.services.indexOf(service) > -1);\n return addNodesByStatus(nodes2);\n }\n\n function getServicesStatus(isEnterprise) {\n return mnServersService.getNodes().then(function (nodes) {\n var rv = {\n kv: getNodesByService(\"kv\", nodes),\n index: getNodesByService(\"index\", nodes),\n n1ql: getNodesByService(\"n1ql\", nodes),\n fts: getNodesByService(\"fts\", nodes),\n all: nodes\n };\n if (isEnterprise) {\n rv.cbas = getNodesByService(\"cbas\", nodes);\n rv.eventing = getNodesByService(\"eventing\", nodes);\n rv.backup = getNodesByService(\"backup\", nodes);\n }\n return rv;\n });\n }\n\n function addToPendingEject(node) {\n pendingEject.push(node);\n }\n function removeFromPendingEject(node) {\n node.pendingEject = false;\n _.remove(pendingEject, {'hostname': node.hostname});\n }\n function getPendingEject() {\n return pendingEject;\n }\n function setPendingEject(newPendingEject) {\n pendingEject = newPendingEject;\n }\n function reAddNode(data) {\n return $http({\n method: 'POST',\n url: '/controller/setRecoveryType',\n data: data\n });\n }\n function setupServices(data) {\n return $http({\n method: 'POST',\n url: '/node/controller/setupServices',\n data: data\n });\n }\n function cancelFailOverNode(data) {\n return $http({\n method: 'POST',\n url: '/controller/reFailOver',\n data: data\n });\n }\n function stopRebalance(allowUnsafe) {\n return $http({\n method: 'POST',\n url: '/controller/stopRebalance',\n data: \"allowUnsafe=\" + (allowUnsafe ? \"true\" : \"false\")\n });\n }\n function stopRecovery(url) {\n return $http({\n method: 'POST',\n url: url\n });\n }\n function postFailover(type, otpNode, allowUnsafe) {\n var data = \"\";\n if (_.isArray(otpNode)) {\n data = otpNode.map(function (node) {\n return \"otpNode=\" + encodeURIComponent(node);\n }).join(\"&\");\n } else {\n data = \"otpNode=\" + encodeURIComponent(otpNode);\n }\n\n data += \"&allowUnsafe=\" + (allowUnsafe ? \"true\" : \"false\");\n\n return $http({\n method: 'POST',\n url: '/controller/' + type,\n data: data\n });\n }\n function ejectNode(data) {\n return $http({\n method: 'POST',\n url: '/controller/ejectNode',\n data: data\n });\n }\n function postRebalance(allNodes) {\n return $http({\n method: 'POST',\n url: '/controller/rebalance',\n data: {\n knownNodes: _.pluck(allNodes, 'otpNode').join(','),\n ejectedNodes: _.pluck(mnServersService.getPendingEject(), 'otpNode').join(',')\n }\n }).then(null, function (resp) {\n if (resp.data) {\n if (resp.data.mismatch) {\n resp.data.mismatch = \"Could not Rebalance because the cluster configuration was modified by someone else.\\nYou may want to verify the latest cluster configuration and, if necessary, please retry a Rebalance.\";\n }\n if (resp.data.deltaRecoveryNotPossible) {\n resp.data.deltaRecoveryNotPossible = \"Delta recovery is not possible. This could be because a node was added, server groups or bucket configurations were changed or a failover may have finished in a way that prevents delta recovery. Please rebalance using full recovery.\";\n }\n if (resp.data.noKVNodesLeft) {\n resp.data.noKVNodesLeft = \"Could not Rebalance out last kv node(s).\";\n }\n } else {\n resp.data = \"Request failed. Check logs.\";\n }\n return $q.reject(resp);\n });\n }\n function addStatusMessagePart(status, message) {\n if (status.length) {\n return status + \", \" + message;\n } else {\n return status + message;\n }\n }\n function getStatusWeight(status) {\n var priority = {\n unhealthy: 0,\n inactiveFailed: 1,\n warmup: 2,\n healthy: 3,\n };\n return priority[status] === undefined ? 100 : priority[status];\n }\n function addNodesByStatus(nodes) {\n var nodesByStatuses = {};\n var statusClass = \"inactive\";\n\n _.forEach(nodes, function (node) {\n var status = \"\";\n\n if (node.clusterMembership === 'inactiveFailed') {\n status = addStatusMessagePart(status, \"failed over\");\n }\n if (node.status === 'unhealthy') {\n status = addStatusMessagePart(status, \"not responding\");\n }\n if (node.status === 'warmup') {\n status = addStatusMessagePart(status, \"pending\");\n }\n if (status != \"\") {\n nodesByStatuses[status] = ++nodesByStatuses[status] || 1;\n }\n if (getStatusWeight(statusClass) > getStatusWeight(node.status)) {\n statusClass = node.status;\n }\n if (getStatusWeight(statusClass) > getStatusWeight(node.clusterMembership)) {\n statusClass = node.clusterMembership;\n }\n });\n\n\n nodes.nodesByStatuses = nodesByStatuses;\n nodes.statusClass = statusClass;\n\n return nodes;\n }\n function getNodeStatuses(hostname) {\n return $http({\n method: 'GET',\n url: '/nodeStatuses'\n }).then(function (resp) {\n var nodeStatuses = resp.data;\n var node = nodeStatuses[hostname];\n if (!node) {\n return\n }\n var rv = _.clone(node);\n rv.confirmation = false;\n rv.down = node.status != 'healthy';\n rv.backfill = node.replication < 1;\n rv.failOver = rv.down ? \"startFailover\" : node.gracefulFailoverPossible ? \"startGracefulFailover\" : \"startFailover\";\n rv.gracefulFailoverPossible = node.gracefulFailoverPossible;\n !rv.backfill && (rv.confirmation = true);\n return rv;\n })\n }\n function getNodes() {\n return mnPoolDefault.get().then(function (poolDefault) {\n var nodes = poolDefault.nodes;\n\n var stillActualEject = [];\n\n _.each(mnServersService.getPendingEject(), function (node) {\n var original = _.detect(nodes, function (n) {\n return n.otpNode == node.otpNode;\n });\n if (!original || original.clusterMembership === 'inactiveAdded') {\n return;\n }\n stillActualEject.push(original);\n original.pendingEject = true;\n });\n\n mnServersService.setPendingEject(stillActualEject);\n\n var rv = {};\n\n rv.allNodes = nodes;\n\n rv.failedOver = _.filter(nodes, function (node) {\n return node.clusterMembership === 'inactiveFailed';\n });\n rv.onlyActive = _.filter(nodes, function (node) {\n return node.clusterMembership === 'active';\n });\n rv.active = rv.failedOver.concat(rv.onlyActive);\n rv.down = _.filter(nodes, function (node) {\n return node.status !== 'healthy';\n });\n rv.pending = _.filter(nodes, function (node) {\n return node.clusterMembership !== 'active';\n }).concat(mnServersService.getPendingEject());\n rv.reallyActive = _.filter(rv.onlyActive, function (node) {\n return !node.pendingEject\n });\n rv.reallyActiveData = _.filter(rv.reallyActive, function (node) {\n return _.indexOf(node.services, \"kv\") > -1;\n });\n rv.unhealthyActive = _.detect(rv.reallyActive, function (node) {\n return node.status === 'unhealthy';\n });\n let ram = poolDefault.storageTotals.ram;\n\n rv.ramTotalPerActiveNode = ram ? (ram.total / rv.onlyActive.length) : 0;\n\n return rv;\n });\n }\n function addServer(selectedGroup, credentials, servicesList) {\n credentials = _.clone(credentials);\n if (!credentials['user'] || !credentials['password']) {\n credentials['user'] = '';\n credentials['password'] = '';\n }\n credentials.services = servicesList.join(',');\n return $http({\n method: 'POST',\n url: (selectedGroup && selectedGroup.addNodeURI) || '/controller/addNode',\n data: credentials\n });\n }\n}\n"], "mappings": "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", "names": [] }