/* | |
Licensed to the Apache Software Foundation (ASF) under one or more | |
contributor license agreements. See the NOTICE file distributed with | |
this work for additional information regarding copyright ownership. | |
The ASF licenses this file to You 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. | |
*/ | |
solrAdminApp.controller('ReplicationController', | |
function($scope, $rootScope, $routeParams, $interval, $timeout, Replication, Constants) { | |
$scope.resetMenu("replication", Constants.IS_CORE_PAGE); | |
$scope.iterationCount = 1; | |
$scope.refresh = function() { | |
Replication.details({core:$routeParams.core}, function(response) { | |
var timeout; | |
var interval; | |
if ($scope.interval) $interval.cancel($scope.interval); | |
$scope.isSlave = (response.details.isSlave === 'true'); | |
if ($scope.isSlave) { | |
$scope.progress = getProgressDetails(response.details.slave); | |
$scope.iterations = getIterations(response.details.slave); | |
$scope.versions = getSlaveVersions(response.details); | |
$scope.settings = getSlaveSettings(response.details); | |
if ($scope.settings.isReplicating) { | |
timeout = $timeout($scope.refresh, 1000); | |
} else if(!$scope.settings.isPollingDisabled && $scope.settings.pollInterval) { | |
interval = $scope.interval = $interval(function() { | |
$scope.settings.tick--; | |
}, 1000, $scope.settings.tick); | |
timeout = $timeout($scope.refresh, 1000*(1+$scope.settings.tick)); | |
} | |
} else { | |
$scope.versions = getMasterVersions(response.details); | |
} | |
$scope.master = getMasterSettings(response.details, $scope.isSlave); | |
var onRouteChangeOff = $scope.$on('$routeChangeStart', function() { | |
if (interval) $interval.cancel(interval); | |
if (timeout) $timeout.cancel(timeout); | |
onRouteChangeOff(); | |
}); | |
}); | |
}; | |
$scope.execute = function(command) { | |
Replication.command({core:$routeParams.core, command:command}, function(data){$scope.refresh()}); | |
} | |
$scope.showIterations = function() { $scope.iterationCount = 100000}; // limitTo should accept undefined, but doesn't work. | |
$scope.hideIterations = function() { $scope.iterationCount = 1}; | |
$scope.refresh(); | |
}); | |
var getProgressDetails = function(progress) { | |
progress.timeRemaining = parseSeconds(progress.timeRemaining); | |
progress.totalPercent = parseInt(progress.totalPercent); | |
if (progress.totalPercent === 0) { | |
progress.totalPercentWidth = "1px"; | |
} else { | |
progress.totalPercentWidth = progress.totalPercent + "%"; | |
} | |
progress.currentFileSizePercent = parseInt(progress.currentFileSizePercent); | |
if (!progress.indexReplicatedAtList) { | |
progress.indexReplicatedAtList = []; | |
} | |
if (!progress.replicationFailedAtList) { | |
progress.replicationFailedAtList = []; | |
} | |
return progress; | |
}; | |
var getIterations = function(slave) { | |
var iterations = []; | |
var find = function(list, date) { | |
return list.filter(function(e) {return e.date == date}); | |
}; | |
for (var i in slave.indexReplicatedAtList) { | |
var date = slave.indexReplicatedAtList[i]; | |
var iteration = {date:date, status:"replicated", latest: false}; | |
if (date == slave.indexReplicatedAt) { | |
iteration.latest = true; | |
} | |
iterations.push(iteration); | |
} | |
for (var i in slave.replicationFailedAtList) { | |
var failedDate = slave.replicationFailedAtList[i]; | |
var matchingIterations = find(iterations, failedDate); | |
if (matchingIterations) { | |
iteration = matchingIterations[0]; | |
} else { | |
iteration = {date: failedDate, latest:false}; | |
iterations.push(iteration); | |
} | |
iteration.status = "failed"; | |
if (failedDate == slave.replicationFailedAt) { | |
iteration.latest = true; | |
} | |
} | |
iterations.sort(function(a,b){ return a.date> b.date;}).reverse(); | |
return iterations; | |
}; | |
var getMasterVersions = function(data) { | |
versions = {masterSearch:{}, master:{}}; | |
versions.masterSearch.version = data.indexVersion; | |
versions.masterSearch.generation = data.generation; | |
versions.masterSearch.size = data.indexSize; | |
versions.master.version = data.master.replicableVersion || '-'; | |
versions.master.generation = data.master.replicableGeneration || '-'; | |
versions.master.size = '-'; | |
return versions; | |
}; | |
var getSlaveVersions = function(data) { | |
versions = {masterSearch: {}, master: {}, slave: {}}; | |
versions.slave.version = data.indexVersion; | |
versions.slave.generation = data.generation; | |
versions.slave.size = data.indexSize; | |
versions.master.version = data.slave.masterDetails.replicableVersion || '-'; | |
versions.master.generation = data.slave.masterDetails.replicableGeneration || '-'; | |
versions.master.size = '-'; | |
versions.masterSearch.version = data.slave.masterDetails.indexVersion; | |
versions.masterSearch.generation = data.slave.masterDetails.generation; | |
versions.masterSearch.size = data.slave.masterDetails.indexSize; | |
versions.changedVersion = data.indexVersion !== data.slave.masterDetails.indexVersion; | |
versions.changedGeneration = data.generation !== data.slave.masterDetails.generation; | |
return versions; | |
}; | |
var parseDateToEpoch = function(date) { | |
// ["Sat Mar 03 11:00:00 CET 2012", "Sat", "Mar", "03", "11:00:00", "CET", "2012"] | |
var parts = date.match( /^(\w+)\s+(\w+)\s+(\d+)\s+(\d+\:\d+\:\d+)\s+(\w+)\s+(\d+)$/ ); | |
// "Sat Mar 03 2012 10:37:33" | |
var d = new Date( parts[1] + ' ' + parts[2] + ' ' + parts[3] + ' ' + parts[6] + ' ' + parts[4] ); | |
return d.getTime(); | |
} | |
var parseSeconds = function(time) { | |
var seconds = 0; | |
var arr = new String(time || '').split('.'); | |
var parts = arr[0].split(':').reverse(); | |
for (var i = 0; i < parts.length; i++) { | |
seconds += ( parseInt(parts[i], 10) || 0 ) * Math.pow(60, i); | |
} | |
if (arr[1] && 5 <= parseInt(arr[1][0], 10)) { | |
seconds++; // treat more or equal than .5 as additional second | |
} | |
return seconds; | |
} | |
var getSlaveSettings = function(data) { | |
var settings = {}; | |
settings.masterUrl = data.slave.masterUrl; | |
settings.isPollingDisabled = data.slave.isPollingDisabled == 'true'; | |
settings.pollInterval = data.slave.pollInterval; | |
settings.isReplicating = data.slave.isReplicating == 'true'; | |
settings.nextExecutionAt = data.slave.nextExecutionAt; | |
if(settings.isReplicating) { | |
settings.isApprox = true; | |
settings.tick = parseSeconds(settings.pollInterval); | |
} else if (!settings.isPollingDisabled && settings.pollInterval) { | |
if( settings.nextExecutionAt ) { | |
settings.nextExecutionAtEpoch = parseDateToEpoch(settings.nextExecutionAt); | |
settings.currentTime = parseDateToEpoch(data.slave.currentDate); | |
if( settings.nextExecutionAtEpoch > settings.currentTime) { | |
settings.isApprox = false; | |
settings.tick = ( settings.nextExecutionAtEpoch - settings.currentTime) / 1000; | |
} | |
} | |
} | |
return settings; | |
}; | |
var getMasterSettings = function(details, isSlave) { | |
var master = {}; | |
var masterData = isSlave ? details.slave.masterDetails.master : details.master; | |
master.replicationEnabled = masterData.replicationEnabled == "true"; | |
master.replicateAfter = masterData.replicateAfter.join(", "); | |
if (masterData.confFiles) { | |
master.files = []; | |
var confFiles = masterData.confFiles.split(','); | |
for (var i=0; i<confFiles.length; i++) { | |
var file = confFiles[i]; | |
var short = file; | |
var title = file; | |
if (file.indexOf(":")>=0) { | |
title = file.replace(':', ' ยป '); | |
var parts = file.split(':'); | |
if (isSlave) { | |
short = parts[1]; | |
} else { | |
short = parts[0]; | |
} | |
} | |
master.files.push({title:title, name:short}); | |
} | |
} | |
return master; | |
} |