@@ -9,10 +9,8 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
9
9
} ) ;
10
10
} ] )
11
11
12
- . factory ( 'stateService' , function ( $http ) {
13
- var state = { } ;
14
-
15
- state . getServices = function ( ) {
12
+ . factory ( 'stateService' , function ( $http , $q ) {
13
+ function svcGetServices ( ) {
16
14
return $http ( {
17
15
method : 'GET' ,
18
16
url : '/services.json' ,
@@ -24,14 +22,47 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
24
22
'//' + window . location . hostname +
25
23
':3212/;csv;norefresh' ;
26
24
27
- state . getHaproxy = function ( ) {
25
+ function svcGetHaproxy ( ) {
28
26
return $http ( {
29
27
method : 'GET' ,
30
28
url : haproxyUrl ,
31
29
dataType : 'text/plain' ,
32
30
} ) ;
33
31
} ;
34
32
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
+
35
66
return state ;
36
67
} )
37
68
@@ -57,59 +88,65 @@ angular.module('sidecar.services', ['ngRoute', 'ui.bootstrap'])
57
88
58
89
return true ;
59
90
} ;
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 ;
102
91
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' ] == '' ) {
103
118
return memo
104
- } ;
119
+ }
105
120
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 ;
109
140
} ;
110
141
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 ( ) { } ) ;
113
150
} )
114
151
115
152
. filter ( 'portsStr' , function ( ) {
0 commit comments