var app = angular.module('sentinelDashboardApp');
app.controller('SentinelClusterSingleController', ['$scope', '$stateParams', 'ngDialog',
'MachineService', 'ClusterStateService',
function ($scope, $stateParams, ngDialog, MachineService, ClusterStateService) {
$scope.app = $stateParams.app;
const UNSUPPORTED_CODE = 4041;
const CLUSTER_MODE_CLIENT = 0;
const CLUSTER_MODE_SERVER = 1;
$scope.macsInputConfig = {
searchField: ['text', 'value'],
persist: true,
create: false,
maxItems: 1,
render: {
item: function (data, escape) {
return '
' + escape(data.text) + '
';
}
},
onChange: function (value, oldValue) {
$scope.macInputModel = value;
}
};
function convertSetToString(set) {
if (set === undefined) {
return '';
}
let s = '';
for (let i = 0; i < set.length; i++) {
s = s + set[i];
if (i < set.length - 1) {
s = s + ',';
}
}
return s;
}
function convertStrToNamespaceSet(str) {
if (str === undefined || str === '') {
return [];
}
let arr = [];
let spliced = str.split(',');
spliced.forEach((v) => {
arr.push(v.trim());
});
return arr;
}
function fetchMachineClusterState() {
if (!$scope.macInputModel || $scope.macInputModel === '') {
return;
}
let mac = $scope.macInputModel.split(':');
ClusterStateService.fetchClusterUniversalStateSingle($scope.app, mac[0], mac[1]).success(function (data) {
if (data.code == 0 && data.data) {
$scope.loadError = undefined;
$scope.stateVO = data.data;
$scope.stateVO.currentMode = $scope.stateVO.stateInfo.mode;
if ($scope.stateVO.server && $scope.stateVO.server.namespaceSet) {
$scope.stateVO.server.namespaceSetStr = convertSetToString($scope.stateVO.server.namespaceSet);
}
} else {
$scope.stateVO = {};
if (data.code === UNSUPPORTED_CODE) {
$scope.loadError = {message: '机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流,请升级至 1.4.0 以上版本并引入相关依赖。'}
} else {
$scope.loadError = {message: data.msg};
}
}
}).error((data, header, config, status) => {
$scope.loadError = {message: '未知错误'};
});
}
fetchMachineClusterState();
function checkValidClientConfig(stateVO) {
if (!stateVO.client || !stateVO.client.clientConfig) {
alert('不合法的配置');
return false;
}
let config = stateVO.client.clientConfig;
if (!config.serverHost || config.serverHost.trim() == '') {
alert('请输入有效的 Token Server IP');
return false;
}
if (config.serverPort === undefined || config.serverPort <= 0 || config.serverPort > 65535) {
alert('请输入有效的 Token Server 端口');
return false;
}
if (config.requestTimeout === undefined || config.requestTimeout <= 0) {
alert('请输入有效的请求超时时长');
return false;
}
return true;
}
function sendClusterClientRequest(stateVO) {
if (!checkValidClientConfig(stateVO)) {
return;
}
if (!$scope.macInputModel) {
return;
}
let mac = $scope.macInputModel.split(':');
let request = {
app: $scope.app,
ip: mac[0],
port: mac[1],
};
request.mode = CLUSTER_MODE_CLIENT;
request.clientConfig = stateVO.client.clientConfig;
ClusterStateService.modifyClusterConfig(request).success(function (data) {
if (data.code == 0 && data.data) {
alert('修改集群限流客户端配置成功');
window.location.reload();
} else {
if (data.code === UNSUPPORTED_CODE) {
alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流客户端,请升级至 1.4.0 以上版本并引入相关依赖。');
} else {
alert('修改失败:' + data.msg);
}
}
}).error((data, header, config, status) => {
alert('未知错误');
});
}
function checkValidServerConfig(stateVO) {
if (!stateVO.server || !stateVO.server.transport) {
alert('不合法的配置');
return false;
}
if (stateVO.server.namespaceSetStr === undefined || stateVO.server.namespaceSetStr == '') {
alert('请输入有效的命名空间集合(多个 namespace 以 , 分隔)');
return false;
}
let transportConfig = stateVO.server.transport;
if (transportConfig.port === undefined || transportConfig.port <= 0 || transportConfig.port > 65535) {
alert('请输入有效的 Token Server 端口');
return false;
}
let flowConfig = stateVO.server.flow;
if (flowConfig.maxAllowedQps === undefined || flowConfig.maxAllowedQps < 0) {
alert('请输入有效的最大允许 QPS');
return false;
}
// if (transportConfig.idleSeconds === undefined || transportConfig.idleSeconds <= 0) {
// alert('请输入有效的连接清理时长 (idleSeconds)');
// return false;
// }
return true;
}
function sendClusterServerRequest(stateVO) {
if (!checkValidServerConfig(stateVO)) {
return;
}
if (!$scope.macInputModel) {
return;
}
let mac = $scope.macInputModel.split(':');
let request = {
app: $scope.app,
ip: mac[0],
port: mac[1],
};
request.mode = CLUSTER_MODE_SERVER;
request.flowConfig = stateVO.server.flow;
request.transportConfig = stateVO.server.transport;
request.namespaceSet = convertStrToNamespaceSet(stateVO.server.namespaceSetStr);
ClusterStateService.modifyClusterConfig(request).success(function (data) {
if (data.code == 0 && data.data) {
alert('修改集群限流服务端配置成功');
window.location.reload();
} else {
if (data.code === UNSUPPORTED_CODE) {
alert('机器 ' + mac[0] + ':' + mac[1] + ' 的 Sentinel 客户端版本不支持集群限流服务端,请升级至 1.4.0 以上版本并引入相关依赖。');
} else {
alert('修改失败:' + data.msg);
}
}
}).error((data, header, config, status) => {
alert('未知错误');
});
}
$scope.saveConfig = () => {
let ok = confirm('是否确定修改集群限流配置?');
if (!ok) {
return;
}
let mode = $scope.stateVO.stateInfo.mode;
if (mode != 1 && mode != 0) {
alert('未知的集群限流模式');
return;
}
if (mode == 0) {
sendClusterClientRequest($scope.stateVO);
} else {
sendClusterServerRequest($scope.stateVO);
}
};
function queryAppMachines() {
MachineService.getAppMachines($scope.app).success(
function (data) {
if (data.code === 0) {
// $scope.machines = data.data;
if (data.data) {
$scope.machines = [];
$scope.macsInputOptionsOrigin = [];
$scope.macsInputOptions = [];
data.data.forEach(function (item) {
if (item.healthy) {
$scope.macsInputOptionsOrigin.push({
text: item.ip + ':' + item.port,
value: item.ip + ':' + item.port
});
}
});
$scope.macsInputOptions = $scope.macsInputOptionsOrigin;
}
if ($scope.macsInputOptions.length > 0) {
$scope.macInputModel = $scope.macsInputOptions[0].value;
}
} else {
$scope.macsInputOptions = [];
}
}
);
}
queryAppMachines();
$scope.$watch('searchKey', function () {
if (!$scope.macsInputOptions) {
return;
}
if ($scope.searchKey) {
$scope.macsInputOptions = $scope.macsInputOptionsOrigin
.filter((e) => e.value.indexOf($scope.searchKey) !== -1);
} else {
$scope.macsInputOptions = $scope.macsInputOptionsOrigin;
}
if ($scope.macsInputOptions.length > 0) {
$scope.macInputModel = $scope.macsInputOptions[0].value;
} else {
$scope.macInputModel = '';
}
});
$scope.$watch('macInputModel', function () {
if ($scope.macInputModel) {
fetchMachineClusterState();
}
});
}]);