22d23b2c9b38cb28f92336c63a829ee152f5b4a4
[arvados.git] / apps / backstage / app / component.arv-api-status.js
1 module.exports = ArvApiStatusComponent;
2
3 var m = require('mithril')
4 , util = require('app/util')
5 , DataManagerGraph = require('./component.dmgraph');
6
7 function ArvApiStatusComponent(connection) {
8     var apistatus = {};
9     apistatus.vm = (function() {
10         var vm = {};
11         vm.connection = connection;
12         vm.currentUser = m.prop({});
13         vm.dd = connection.discoveryDoc;
14         vm.dirty = true;
15         vm.init = function() {
16             if (vm.dirty)
17                 vm.refresh();
18             vm.dirty = false;
19         };
20         vm.keepServices = m.prop([]);
21         vm.nodes = m.prop([]);
22         vm.refresh = function() {
23             vm.connection.api(
24                 'KeepService', 'list', {}).then(vm.keepServices).then(m.redraw);
25             vm.connection.api(
26                 'Node', 'list', {}).then(vm.nodes).then(m.redraw);
27             vm.connection.api(
28                 'User', 'current', {}).then(vm.currentUser).then(m.redraw);
29         };
30         vm.logout = function() {
31             vm.connection.token(undefined);
32         };
33         vm.ddSummary = function() {
34             return !vm.dd() ? {} : {
35                 apiVersion: vm.dd().version + ' (' + vm.dd().revision + ')',
36                 sourceVersion: m('a', {
37                     href: 'https://arvados.org/projects/arvados/repository/changes?rev=' + vm.dd().source_version
38                 }, vm.dd().source_version),
39                 generatedAt: vm.dd().generatedAt,
40                 websocket: util.choose(vm.connection.webSocket().readyState, {
41                     0: m('span.label.label-warning', ['connecting']),
42                     1: m('span.label.label-success', ['OK']),
43                     2: m('span.label.label-danger', ['closing']),
44                     3: m('span.label.label-danger', ['closed']),
45                 }) || m('span.label.label-danger',
46                         {title: ('advertised websocketUrl: ' +
47                                  vm.dd().websocketUrl)}, ['none'])
48             }
49         };
50         vm.dmGraphCtrl = new DataManagerGraph.controller({
51             connection: connection,
52         });
53         return vm;
54     })();
55     apistatus.controller = function() {
56         apistatus.vm.init();
57     };
58     apistatus.view = function() {
59         var vm = apistatus.vm;
60         var ddSummary = vm.ddSummary();
61         return m('.panel.panel-info.arv-bs-api-status', [
62             m('.panel-heading', [
63                 vm.connection.apiPrefix(),
64                 !vm.dd() ? '' : m('.pull-right', [
65                     util.choose(!!vm.connection.token(), {
66                         true: [function() {
67                             return [vm.currentUser().email,
68                                     " ",
69                                     m('a.btn.btn-xs.btn-default',
70                                       {onclick: vm.logout}, 'Log out')];
71                         }],
72                         false: [function() {
73                             return m('a.btn.btn-xs.btn-primary',
74                                      {href: vm.connection.loginLink()}, 'Log in');
75                         }]
76                     }),
77                 ]),
78             ]),
79             m('.panel-body', !vm.dd() ? [vm.connection.state()] : [
80                 m('.row', [
81                     m('.col-md-4',
82                       Object.keys(ddSummary).map(function(key) {
83                           return m('.row', [
84                               m('.col-sm-4.lighten', key),
85                               m('.col-sm-8', ddSummary[key]),
86                           ]);
87                       })),
88                     m('.col-md-4', [
89                         m('ul', [
90                             '' + vm.keepServices().length + ' Keep services',
91                             vm.keepServices().map(function(keepService) {
92                                 return m('li', [
93                                     m('span.label.label-default',
94                                       keepService.service_type),
95                                     ' ',
96                                     m('a',
97                                       {href: '/show/'+keepService.uuid,
98                                        config: m.route}, [
99                                            keepService.service_host,
100                                            ':',
101                                            keepService.service_port,
102                                        ]),
103                                 ]);
104                             }),
105                         ]),
106                     ]),
107                     m('.col-md-4', [
108                         m('ul', [
109                             '' + vm.nodes().length + ' worker nodes',
110                             vm.nodes().filter(function(node) {
111                                 return node.crunch_worker_state != 'down';
112                             }).map(function(node) {
113                                 return m('li', [
114                                     m('span.label.label-default', [
115                                         node.crunch_worker_state,
116                                     ]),
117                                     ' ',
118                                     m('a', {href: '/show/'+node.uuid,
119                                             config: m.route},
120                                       node.hostname),
121                                     ' ',
122                                     m('span.label.label-info', {title: 'time since last ping'}, [
123                                         ((new Date() - Date.parse(node.last_ping_at))/1000).toFixed(),
124                                         's'
125                                     ]),
126                                 ]);
127                             }),
128                         ]),
129                     ]),
130                 ]),
131                 m('.row', 'Collection Job PipelineInstance'.split(' ').map(function(arvModelName) {
132                     return m('.col-sm-2', [
133                         m('a.btn.btn-xs.btn-default', {
134                             style: 'width: 100%',
135                             href: '/list/'+vm.connection.apiPrefix()+'/'+arvModelName,
136                             config: m.route
137                         }, arvModelName+'s'),
138                     ]);
139                 })),
140                 m('.row', [
141                   m('.col-sm-12', [
142                       DataManagerGraph.view(vm.dmGraphCtrl)
143                   ]),
144                 ]),
145             ]),
146         ]);
147     };
148     return apistatus;
149 }