Skip to content

Commit 8a96d49

Browse files
authored
Merge pull request #31 from Nitro/relistan/fix-ui-reload
This should fix the UI's aggressive reloading
2 parents 70c2fd8 + 149f28e commit 8a96d49

File tree

1 file changed

+90
-53
lines changed

1 file changed

+90
-53
lines changed

ui/app/services/services.js

+90-53
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
99
});
1010
}])
1111

12-
.factory('stateService', function($http) {
13-
var state = {};
14-
15-
state.getServices = function() {
12+
.factory('stateService', function($http, $q) {
13+
function svcGetServices() {
1614
return $http({
1715
method: 'GET',
1816
url: '/services.json',
@@ -24,14 +22,47 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
2422
'//' + window.location.hostname +
2523
':3212/;csv;norefresh';
2624

27-
state.getHaproxy = function() {
25+
function svcGetHaproxy() {
2826
return $http({
2927
method: 'GET',
3028
url: haproxyUrl,
3129
dataType: 'text/plain',
3230
});
3331
};
3432

33+
var serviceWaiter = $q.defer();
34+
var haproxyWaiter = $q.defer();
35+
36+
var state = {
37+
waitFirstServices: serviceWaiter.promise,
38+
waitFirstHaproxy: haproxyWaiter.promise,
39+
services: {},
40+
haproxy: {},
41+
42+
getServices: function() {
43+
return state.services;
44+
},
45+
46+
getHaproxy: function() {
47+
return state.haproxy;
48+
}
49+
};
50+
51+
// Called on an interval to keep the data up to date
52+
function refreshData() {
53+
svcGetServices().then(function(services) {
54+
state.services = services.data;
55+
serviceWaiter.resolve();
56+
});
57+
58+
svcGetHaproxy().then(function(haproxy) {
59+
state.haproxy = haproxy.data;
60+
haproxyWaiter.resolve();
61+
});
62+
};
63+
64+
setInterval(refreshData, 4000); // every 4 seconds
65+
3566
return state;
3667
})
3768

@@ -57,59 +88,65 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
5788

5889
return true;
5990
};
60-
61-
var getData = function() {
62-
63-
stateService.getServices().success(function (response) {
64-
var services = {};
65-
for (var svcName in response.Services) {
66-
services[svcName] = response.Services[svcName].groupBy(function(s) {
67-
var ports = _.map(s.Ports, function(p) { _.pick(p, 'ServicePort') });
68-
return [s.Image, ports, s.Status];
69-
});
70-
if ($scope.collapsed[svcName] == null) {
71-
$scope.collapsed[svcName] = true;
72-
}
73-
}
74-
$scope.servicesList = services;
75-
$scope.clusterName = response.ClusterName;
76-
$scope.serverList = response.ClusterMembers;
77-
});
78-
79-
stateService.getHaproxy().success(function (response) {
80-
var raw = Papa.parse(response, { header: true });
81-
82-
var transform = function(memo, item) {
83-
if (item.svname == 'FRONTEND' || item.svname == 'BACKEND' ||
84-
item['# pxname'] == 'stats' || item['# pxname'] == 'stats_proxy' ||
85-
item['# pxname'] == '') {
86-
return memo
87-
}
88-
89-
// Transform the resulting HAproxy structure into something we can use
90-
var fields = item['# pxname'].split('-');
91-
var svcPort = fields[fields.length-1];
92-
var svcName = fields.slice(0, fields.length-1).join('-');
93-
94-
fields = item.svname.split('-');
95-
var hostname = fields.slice(0, fields.length-1).join('-');
96-
var containerID = fields[fields.length-1];
97-
98-
// Store by servce -> hostname -> container
99-
memo[svcName] = memo[svcName] || {};
100-
memo[svcName][hostname] = memo[svcName][hostname] || {}
101-
memo[svcName][hostname][containerID] = item;
10291

92+
function updateData() {
93+
// Services
94+
var services = {};
95+
var servicesResponse = stateService.getServices();
96+
97+
for (var svcName in servicesResponse.Services) {
98+
services[svcName] = servicesResponse.Services[svcName].groupBy(function(s) {
99+
var ports = _.map(s.Ports, function(p) { _.pick(p, 'ServicePort') });
100+
return [s.Image, ports, s.Status];
101+
});
102+
if ($scope.collapsed[svcName] == null) {
103+
$scope.collapsed[svcName] = true;
104+
}
105+
}
106+
$scope.servicesList = services;
107+
$scope.clusterName = servicesResponse.ClusterName;
108+
$scope.serverList = servicesResponse.ClusterMembers;
109+
110+
// Haproxy
111+
var haproxyResponse = stateService.getHaproxy();
112+
var raw = Papa.parse(haproxyResponse, { header: true });
113+
114+
var transform = function(memo, item) {
115+
if (item.svname == 'FRONTEND' || item.svname == 'BACKEND' ||
116+
item['# pxname'] == 'stats' || item['# pxname'] == 'stats_proxy' ||
117+
item['# pxname'] == '') {
103118
return memo
104-
};
119+
}
105120

106-
var processed = _.inject(raw.data, transform, {});
107-
$scope.haproxyInfo = processed;
108-
});
121+
// Transform the resulting HAproxy structure into something we can use
122+
var fields = item['# pxname'].split('-');
123+
var svcPort = fields[fields.length-1];
124+
var svcName = fields.slice(0, fields.length-1).join('-');
125+
126+
fields = item.svname.split('-');
127+
var hostname = fields.slice(0, fields.length-1).join('-');
128+
var containerID = fields[fields.length-1];
129+
130+
// Store by servce -> hostname -> container
131+
memo[svcName] = memo[svcName] || {};
132+
memo[svcName][hostname] = memo[svcName][hostname] || {}
133+
memo[svcName][hostname][containerID] = item;
134+
135+
return memo
136+
};
137+
138+
var processed = _.inject(raw.data, transform, {});
139+
$scope.haproxyInfo = processed;
109140
};
110141

111-
getData();
112-
$interval(getData, 4000); // every 4 seconds
142+
// On the first time through, this will update the data and kick off the
143+
// scheduled refresh. Otherwise do nothing.
144+
stateService.waitFirstHaproxy.then(function() {
145+
stateService.waitFirstServices.then(function() {
146+
updateData();
147+
$interval(updateData, 2000); // Update UI every 2 seconds
148+
}, function(){})
149+
}, function(){});
113150
})
114151

115152
.filter('portsStr', function() {

0 commit comments

Comments
 (0)