blob: 31a29585f5595073a6b4dfa88be75ac98408a623 [file] [log] [blame]
Iftekharul Islam99d199f2017-03-24 15:28:25 -05001/**
2 * API utilities service
3 *
4 * @module app/common/services/api-utils
5 * @exports APIUtils
6 * @name APIUtils
Iftekharul Islam99d199f2017-03-24 15:28:25 -05007 */
8
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07009window.angular && (function(angular) {
10 'use strict';
Andrew Geisslerd27bb132018-05-24 11:07:27 -070011 angular.module('app.common.services').factory('APIUtils', [
beccabroekc3abaa92018-08-14 13:47:18 -050012 '$http', 'Constants', '$q', 'dataService', '$interval',
13 function($http, Constants, $q, DataService, $interval) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070014 var getScaledValue = function(value, scale) {
15 scale = scale + '';
16 scale = parseInt(scale, 10);
17 var power = Math.abs(parseInt(scale, 10));
CamVan Nguyen33275832018-03-13 18:38:37 -050018
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070019 if (scale > 0) {
20 value = value * Math.pow(10, power);
Andrew Geisslerd27bb132018-05-24 11:07:27 -070021 } else if (scale < 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070022 value = value / Math.pow(10, power);
23 }
24 return value;
25 };
26 var SERVICE = {
27 API_CREDENTIALS: Constants.API_CREDENTIALS,
28 API_RESPONSE: Constants.API_RESPONSE,
29 CHASSIS_POWER_STATE: Constants.CHASSIS_POWER_STATE,
30 HOST_STATE_TEXT: Constants.HOST_STATE,
31 HOST_STATE: Constants.HOST_STATE,
32 LED_STATE: Constants.LED_STATE,
33 LED_STATE_TEXT: Constants.LED_STATE_TEXT,
34 HOST_SESSION_STORAGE_KEY: Constants.API_CREDENTIALS.host_storage_key,
35 getChassisState: function() {
36 var deferred = $q.defer();
37 $http({
38 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070039 url: DataService.getHost() +
40 '/xyz/openbmc_project/state/chassis0/attr/CurrentPowerState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070041 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070042 })
43 .then(
44 function(response) {
45 var json = JSON.stringify(response.data);
46 var content = JSON.parse(json);
47 deferred.resolve(content.data);
48 },
49 function(error) {
50 console.log(error);
51 deferred.reject(error);
52 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070053 return deferred.promise;
54 },
Gunnar Mills65491142018-06-04 14:23:33 -050055 validIPV4IP: function(ip) {
56 // Checks for [0-255].[0-255].[0-255].[0-255]
57 return ip.match(
58 /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/);
59 },
Gunnar Mills854fbba2018-09-13 15:41:30 -050060 deleteObject: function(path) {
61 return $http({
62 method: 'POST',
63 url: DataService.getHost() + path + '/action/Delete',
64 withCredentials: true,
65 data: JSON.stringify({'data': []})
66 })
67 .then(function(response) {
68 return response.data;
69 });
70 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070071 getHostState: function() {
72 var deferred = $q.defer();
73 $http({
74 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070075 url: DataService.getHost() +
76 '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070077 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -070078 })
79 .then(
80 function(response) {
81 var json = JSON.stringify(response.data);
82 var content = JSON.parse(json);
83 deferred.resolve(content.data);
84 },
85 function(error) {
86 console.log(error);
87 deferred.reject(error);
88 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070089 return deferred.promise;
90 },
Gunnar Millsff64c542018-08-24 15:49:09 -050091 getSNMPManagers: function() {
92 return $http({
93 method: 'GET',
94 url: DataService.getHost() +
95 '/xyz/openbmc_project/network/snmp/manager/enumerate',
Gunnar Millsff64c542018-08-24 15:49:09 -050096 withCredentials: true
97 })
98 .then(function(response) {
99 return response.data;
100 });
101 },
beccabroekc3abaa92018-08-14 13:47:18 -0500102 pollHostStatusTillOn: function() {
103 var deferred = $q.defer();
104 var hostOnTimeout = setTimeout(function() {
105 ws.close();
106 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
107 }, Constants.TIMEOUT.HOST_ON);
108
109 var ws =
110 new WebSocket('wss://' + DataService.server_id + '/subscribe');
111 var data = JSON.stringify({
112 'paths': ['/xyz/openbmc_project/state/host0'],
113 'interfaces': ['xyz.openbmc_project.State.Host']
114 });
115 ws.onopen = function() {
116 ws.send(data);
117 };
118 ws.onmessage = function(evt) {
119 var content = JSON.parse(evt.data);
120 var hostState = content.properties.CurrentHostState;
121 if (hostState === Constants.HOST_STATE_TEXT.on_code) {
122 clearTimeout(hostOnTimeout);
123 ws.close();
124 deferred.resolve();
125 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
126 clearTimeout(hostOnTimeout);
127 ws.close();
128 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
129 }
130 };
131 },
132
133 pollHostStatusTilReboot: function() {
134 var deferred = $q.defer();
135 var onState = Constants.HOST_STATE_TEXT.on_code;
136 var offState = Constants.HOST_STATE_TEXT.on_code;
137 var hostTimeout;
138 var setHostTimeout = function(message, timeout) {
139 hostTimeout = setTimeout(function() {
140 ws.close();
141 deferred.reject(new Error(message));
142 }, timeout);
143 };
144 var ws =
145 new WebSocket('wss://' + DataService.server_id + '/subscribe');
146 var data = JSON.stringify({
147 'paths': ['/xyz/openbmc_project/state/host0'],
148 'interfaces': ['xyz.openbmc_project.State.Host']
149 });
150 ws.onopen = function() {
151 ws.send(data);
152 };
153 setHostTimeout(
154 Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT,
155 Constants.TIMEOUT.HOST_OFF);
156 var pollState = offState;
157 ws.onmessage = function(evt) {
158 var content = JSON.parse(evt.data);
159 var hostState = content.properties.CurrentHostState;
160 if (hostState === pollState) {
161 if (pollState === offState) {
162 clearTimeout(hostTimeout);
163 pollState = onState;
164 setHostTimeout(
165 Constants.MESSAGES.POLL.HOST_ON_TIMEOUT,
166 Constants.TIMEOUT.HOST_ON);
167 }
168 if (pollState === onState) {
169 clearTimeout(hostTimeout);
170 ws.close();
171 deferred.resolve();
172 }
173 } else if (hostState === Constants.HOST_STATE_TEXT.error_code) {
174 clearTimeout(hostTimeout);
175 ws.close();
176 deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
177 }
178 };
179 },
180
181 pollHostStatusTillOff: function() {
182 var deferred = $q.defer();
183 var hostOffTimeout = setTimeout(function() {
184 ws.close();
185 deferred.reject(
186 new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
187 }, Constants.TIMEOUT.HOST_OFF);
188
189 var ws =
190 new WebSocket('wss://' + DataService.server_id + '/subscribe');
191 var data = JSON.stringify({
192 'paths': ['/xyz/openbmc_project/state/host0'],
193 'interfaces': ['xyz.openbmc_project.State.Host']
194 });
195 ws.onopen = function() {
196 ws.send(data);
197 };
198 ws.onmessage = function(evt) {
199 var content = JSON.parse(evt.data);
200 var hostState = content.properties.CurrentHostState;
201 if (hostState === Constants.HOST_STATE_TEXT.off_code) {
202 clearTimeout(hostOffTimeout);
203 ws.close();
204 deferred.resolve();
205 }
206 };
207 },
Gunnar Mills854fbba2018-09-13 15:41:30 -0500208 addSNMPManager: function(address, port) {
209 return $http({
210 method: 'POST',
211 url: DataService.getHost() +
212 '/xyz/openbmc_project/network/snmp/manager/action/Client',
213 withCredentials: true,
214 data: JSON.stringify({'data': [address, +port]})
215 })
216 .then(function(response) {
217 return response.data;
218 });
219 },
220 setSNMPManagerPort: function(snmpManagerPath, port) {
221 return $http({
222 method: 'PUT',
223 url: DataService.getHost() + snmpManagerPath + '/attr/Port',
224 withCredentials: true,
225 data: JSON.stringify({'data': +port})
226 })
227 .then(function(response) {
228 return response.data;
229 });
230 },
231 setSNMPManagerAddress: function(snmpManagerPath, address) {
232 return $http({
233 method: 'PUT',
234 url: DataService.getHost() + snmpManagerPath +
235 '/attr/Address',
236 withCredentials: true,
237 data: JSON.stringify({'data': address})
238 })
239 .then(function(response) {
240 return response.data;
241 });
242 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700243 getNetworkInfo: function() {
244 var deferred = $q.defer();
245 $http({
246 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700247 url: DataService.getHost() +
248 '/xyz/openbmc_project/network/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700249 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700250 })
251 .then(
252 function(response) {
253 var json = JSON.stringify(response.data);
254 var content = JSON.parse(json);
255 var hostname = '';
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500256 var defaultgateway = '';
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700257 var macAddress = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700258
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700259 function parseNetworkData(content) {
260 var data = {
261 interface_ids: [],
262 interfaces: {},
263 ip_addresses: {ipv4: [], ipv6: []},
264 };
265 var interfaceId = '', keyParts = [], interfaceHash = '',
266 interfaceType = '';
267 for (var key in content.data) {
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500268 if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700269 interfaceId = key.split('/').pop();
270 if (data.interface_ids.indexOf(interfaceId) == -1) {
271 data.interface_ids.push(interfaceId);
272 data.interfaces[interfaceId] = {
273 interfaceIname: '',
274 DomainName: '',
275 MACAddress: '',
276 Nameservers: [],
277 DHCPEnabled: 0,
278 ipv4: {ids: [], values: []},
279 ipv6: {ids: [], values: []}
280 };
281 data.interfaces[interfaceId].MACAddress =
282 content.data[key].MACAddress;
283 data.interfaces[interfaceId].DomainName =
284 content.data[key].DomainName.join(' ');
285 data.interfaces[interfaceId].Nameservers =
286 content.data[key].Nameservers;
287 data.interfaces[interfaceId].DHCPEnabled =
288 content.data[key].DHCPEnabled;
289 }
290 } else if (
291 key.match(
Gunnar Mills3efbe2d2018-06-07 14:47:19 -0500292 /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700293 keyParts = key.split('/');
294 interfaceHash = keyParts.pop();
295 interfaceType = keyParts.pop();
296 interfaceId = keyParts.pop();
297
298 if (data.interfaces[interfaceId][interfaceType]
299 .ids.indexOf(interfaceHash) == -1) {
300 data.interfaces[interfaceId][interfaceType]
301 .ids.push(interfaceHash);
302 data.interfaces[interfaceId][interfaceType]
303 .values.push(content.data[key]);
304 data.ip_addresses[interfaceType].push(
305 content.data[key]['Address']);
306 }
307 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700308 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700309 return data;
310 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700311
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700312 if (content.data.hasOwnProperty(
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500313 '/xyz/openbmc_project/network/config')) {
314 if (content.data['/xyz/openbmc_project/network/config']
315 .hasOwnProperty('HostName')) {
316 hostname =
317 content.data['/xyz/openbmc_project/network/config']
318 .HostName;
319 }
320 if (content.data['/xyz/openbmc_project/network/config']
321 .hasOwnProperty('DefaultGateway')) {
322 defaultgateway =
323 content.data['/xyz/openbmc_project/network/config']
324 .DefaultGateway;
325 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700326 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700327
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700328 if (content.data.hasOwnProperty(
329 '/xyz/openbmc_project/network/eth0') &&
330 content.data['/xyz/openbmc_project/network/eth0']
331 .hasOwnProperty('MACAddress')) {
332 macAddress =
333 content.data['/xyz/openbmc_project/network/eth0']
334 .MACAddress;
335 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700336
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700337 deferred.resolve({
338 data: content.data,
339 hostname: hostname,
Gunnar Millse9f5fe72018-05-04 13:43:10 -0500340 defaultgateway: defaultgateway,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700341 mac_address: macAddress,
342 formatted_data: parseNetworkData(content)
343 });
344 },
345 function(error) {
346 console.log(error);
347 deferred.reject(error);
348 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700349 return deferred.promise;
350 },
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500351 setMACAddress: function(interface_name, mac_address) {
352 return $http({
353 method: 'PUT',
354 url: DataService.getHost() +
355 '/xyz/openbmc_project/network/' + interface_name +
356 '/attr/MACAddress',
Gunnar Mills7ddc7272018-04-12 16:12:03 -0500357 withCredentials: true,
358 data: JSON.stringify({'data': mac_address})
359 })
360 .then(function(response) {
361 return response.data;
362 });
363 },
Gunnar Millsdca79d72018-05-30 13:07:01 -0500364 setDefaultGateway: function(defaultGateway) {
365 return $http({
366 method: 'PUT',
367 url: DataService.getHost() +
368 '/xyz/openbmc_project/network/config/attr/DefaultGateway',
Gunnar Millsdca79d72018-05-30 13:07:01 -0500369 withCredentials: true,
370 data: JSON.stringify({'data': defaultGateway})
371 })
372 .then(function(response) {
373 return response.data;
374 });
375 },
Gunnar Millscb2c3062018-05-31 13:13:30 -0500376 setDHCPEnabled: function(interfaceName, dhcpEnabled) {
377 return $http({
378 method: 'PUT',
379 url: DataService.getHost() +
380 '/xyz/openbmc_project/network/' + interfaceName +
381 '/attr/DHCPEnabled',
Gunnar Millscb2c3062018-05-31 13:13:30 -0500382 withCredentials: true,
383 data: JSON.stringify({'data': dhcpEnabled})
384 })
385 .then(function(response) {
386 return response.data;
387 });
388 },
Gunnar Mills06467822018-06-06 15:43:18 -0500389 setNameservers: function(interfaceName, dnsServers) {
390 return $http({
391 method: 'PUT',
392 url: DataService.getHost() +
393 '/xyz/openbmc_project/network/' + interfaceName +
394 '/attr/Nameservers',
Gunnar Mills06467822018-06-06 15:43:18 -0500395 withCredentials: true,
396 data: JSON.stringify({'data': dnsServers})
397 })
398 .then(function(response) {
399 return response.data;
400 });
401 },
Gunnar Millsa45c3852018-05-30 16:18:45 -0500402 deleteIPV4: function(interfaceName, networkID) {
403 return $http({
404 method: 'POST',
405 url: DataService.getHost() +
406 '/xyz/openbmc_project/network/' + interfaceName +
407 '/ipv4/' + networkID + '/action/Delete',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500408 withCredentials: true,
409 data: JSON.stringify({'data': []})
410 })
411 .then(function(response) {
412 return response.data;
413 });
414 },
415 addIPV4: function(
416 interfaceName, ipAddress, netmaskPrefixLength, gateway) {
417 return $http({
418 method: 'POST',
419 url: DataService.getHost() +
420 '/xyz/openbmc_project/network/' + interfaceName +
421 '/action/IP',
Gunnar Millsa45c3852018-05-30 16:18:45 -0500422 withCredentials: true,
423 data: JSON.stringify({
424 'data': [
425 'xyz.openbmc_project.Network.IP.Protocol.IPv4',
426 ipAddress, +netmaskPrefixLength, gateway
427 ]
428 })
429 })
430 .then(function(response) {
431 return response.data;
432 });
433 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700434 getLEDState: function() {
435 var deferred = $q.defer();
436 $http({
437 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700438 url: DataService.getHost() +
439 '/xyz/openbmc_project/led/groups/enclosure_identify',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700440 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700441 })
442 .then(
443 function(response) {
444 var json = JSON.stringify(response.data);
445 var content = JSON.parse(json);
446 deferred.resolve(content.data.Asserted);
447 },
448 function(error) {
449 console.log(error);
450 deferred.reject(error);
451 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700452 return deferred.promise;
453 },
454 login: function(username, password, callback) {
455 $http({
456 method: 'POST',
457 url: DataService.getHost() + '/login',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700458 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700459 data: JSON.stringify({'data': [username, password]})
460 })
461 .then(
462 function(response) {
463 if (callback) {
464 callback(response.data);
465 }
466 },
467 function(error) {
468 if (callback) {
469 if (error && error.status && error.status == 'error') {
470 callback(error);
471 } else {
472 callback(error, true);
473 }
474 }
475 console.log(error);
476 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700477 },
478 testPassword: function(username, password) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700479 // Calls /login without the current session to verify the given
480 // password is correct ignore the interceptor logout on a bad password
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700481 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700482 method: 'POST',
483 url: DataService.getHost() + '/login',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700484 withCredentials: false,
485 data: JSON.stringify({'data': [username, password]})
486 })
487 .then(function(response) {
488 return response.data;
489 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700490 },
491 logout: function(callback) {
492 $http({
493 method: 'POST',
494 url: DataService.getHost() + '/logout',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700495 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700496 data: JSON.stringify({'data': []})
497 })
498 .then(
499 function(response) {
500 if (callback) {
501 callback(response.data);
502 }
503 },
504 function(error) {
505 if (callback) {
506 callback(null, error);
507 }
508 console.log(error);
509 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700510 },
511 changePassword: function(user, newPassword) {
AppaRao Pulif04960f2018-12-06 21:51:27 +0530512 if (DataService.configJson.redfishSupportEnabled) {
513 return $http({
514 method: 'PATCH',
515 url: DataService.getHost() +
516 '/redfish/v1/AccountService/Accounts/' + user,
517 withCredentials: true,
518 data: JSON.stringify({'Password': newPassword})
519 });
520 } else {
521 var deferred = $q.defer();
522 $http({
523 method: 'POST',
524 url: DataService.getHost() + '/xyz/openbmc_project/user/' + user +
525 '/action/SetPassword',
526 withCredentials: true,
527 data: JSON.stringify({'data': [newPassword]}),
528 responseType: 'arraybuffer'
529 })
530 .then(
531 function(response, status, headers) {
532 deferred.resolve(
533 {data: response, status: status, headers: headers});
534 },
535 function(error) {
536 console.log(error);
537 deferred.reject(error);
538 });
539 return deferred.promise;
540 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700541 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700542 chassisPowerOff: function() {
543 var deferred = $q.defer();
544 $http({
545 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700546 url: DataService.getHost() +
547 '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700548 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700549 data: JSON.stringify(
550 {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
551 })
552 .then(
553 function(response) {
554 var json = JSON.stringify(response.data);
555 var content = JSON.parse(json);
556 deferred.resolve(content.status);
557 },
558 function(error) {
559 console.log(error);
560 deferred.reject(error);
561 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700562 return deferred.promise;
563 },
564 setLEDState: function(state, callback) {
565 $http({
566 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700567 url: DataService.getHost() +
568 '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700569 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700570 data: JSON.stringify({'data': state})
571 })
572 .then(
573 function(response) {
574 var json = JSON.stringify(response.data);
575 var content = JSON.parse(json);
576 if (callback) {
577 return callback(content.status);
578 }
579 },
580 function(error) {
581 if (callback) {
582 callback(error);
583 } else {
584 console.log(error);
585 }
586 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700587 },
588 bmcReboot: function(callback) {
589 $http({
590 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700591 url: DataService.getHost() +
592 '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700593 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700594 data: JSON.stringify(
595 {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
596 })
597 .then(
598 function(response) {
599 var json = JSON.stringify(response.data);
600 var content = JSON.parse(json);
601 if (callback) {
602 return callback(content.status);
603 }
604 },
605 function(error) {
606 if (callback) {
607 callback(error);
608 } else {
609 console.log(error);
610 }
611 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700612 },
beccabroekbfc99902018-07-24 15:36:33 -0500613 getLastRebootTime: function() {
614 return $http({
615 method: 'GET',
616 url: DataService.getHost() +
617 '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
beccabroekbfc99902018-07-24 15:36:33 -0500618 withCredentials: true
619 })
620 .then(function(response) {
621 return response.data;
622 });
623 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700624 hostPowerOn: function() {
625 var deferred = $q.defer();
626 $http({
627 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700628 url: DataService.getHost() +
629 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700630 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700631 data: JSON.stringify(
632 {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
633 })
634 .then(
635 function(response) {
636 var json = JSON.stringify(response.data);
637 var content = JSON.parse(json);
638 deferred.resolve(content.status);
639 },
640 function(error) {
641 console.log(error);
642 deferred.reject(error);
643 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700644 return deferred.promise;
645 },
646 hostPowerOff: function() {
647 var deferred = $q.defer();
648 $http({
649 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700650 url: DataService.getHost() +
651 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700652 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700653 data: JSON.stringify(
654 {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
655 })
656 .then(
657 function(response) {
658 var json = JSON.stringify(response.data);
659 var content = JSON.parse(json);
660 deferred.resolve(content.status);
661 },
662 function(error) {
663 console.log(error);
664 deferred.reject(error);
665 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700666 return deferred.promise;
667 },
668 hostReboot: function() {
669 var deferred = $q.defer();
670 $http({
671 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700672 url: DataService.getHost() +
673 '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700674 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700675 data: JSON.stringify(
676 {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
677 })
678 .then(
679 function(response) {
680 var json = JSON.stringify(response.data);
681 var content = JSON.parse(json);
682 deferred.resolve(content.status);
683 },
684 function(error) {
685 console.log(error);
686 deferred.reject(error);
687 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700688
689 return deferred.promise;
690 },
691 hostShutdown: function(callback) {
692 $http({
693 method: 'POST',
694 url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700695 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700696 data: JSON.stringify({'data': []})
697 })
698 .then(
699 function(response) {
700 var json = JSON.stringify(response.data);
701 var content = JSON.parse(json);
702 if (callback) {
703 return callback(content);
704 }
705 },
706 function(error) {
707 if (callback) {
708 callback(error);
709 } else {
710 console.log(error);
711 }
712 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700713 },
beccabroek56744252018-08-03 11:25:11 -0500714 getLastPowerTime: function() {
715 return $http({
716 method: 'GET',
717 url: DataService.getHost() +
718 '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
beccabroek56744252018-08-03 11:25:11 -0500719 withCredentials: true
720 })
721 .then(function(response) {
722 return response.data;
723 });
724 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700725 getLogs: function() {
726 var deferred = $q.defer();
727 $http({
728 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700729 url: DataService.getHost() +
730 '/xyz/openbmc_project/logging/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700731 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700732 })
733 .then(
734 function(response) {
735 var json = JSON.stringify(response.data);
736 var content = JSON.parse(json);
737 var dataClone = JSON.parse(JSON.stringify(content.data));
738 var data = [];
739 var severityCode = '';
740 var priority = '';
741 var health = '';
742 var relatedItems = [];
Matt Spinler845acdc2018-05-01 16:41:28 -0500743 var eventID = 'None';
744 var description = 'None';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700745
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700746 for (var key in content.data) {
747 if (content.data.hasOwnProperty(key) &&
748 content.data[key].hasOwnProperty('Id')) {
749 var severityFlags = {
750 low: false,
751 medium: false,
752 high: false
753 };
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700754 severityCode =
755 content.data[key].Severity.split('.').pop();
756 priority =
757 Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
758 severityFlags[priority.toLowerCase()] = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700759 relatedItems = [];
760 content.data[key].associations.forEach(function(item) {
761 relatedItems.push(item[2]);
762 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700763
Matt Spinler845acdc2018-05-01 16:41:28 -0500764 if (content.data[key].hasOwnProperty(['EventID'])) {
765 eventID = content.data[key].EventID;
766 }
767
768 if (content.data[key].hasOwnProperty(['Description'])) {
769 description = content.data[key].Description;
770 }
771
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700772 data.push(Object.assign(
773 {
774 path: key,
775 copied: false,
776 priority: priority,
777 severity_code: severityCode,
778 severity_flags: severityFlags,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700779 additional_data:
780 content.data[key].AdditionalData.join('\n'),
781 type: content.data[key].Message,
782 selected: false,
783 search_text:
784 ('#' + content.data[key].Id + ' ' +
785 severityCode + ' ' +
Gunnar Mills07876ff2018-06-28 15:21:22 -0500786 content.data[key].Message + ' ' +
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700787 content.data[key].Severity + ' ' +
788 content.data[key].AdditionalData.join(' '))
789 .toLowerCase(),
790 meta: false,
791 confirm: false,
792 related_items: relatedItems,
Matt Spinler845acdc2018-05-01 16:41:28 -0500793 eventID: eventID,
794 description: description,
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700795 data: {key: key, value: content.data[key]}
796 },
797 content.data[key]));
798 }
799 }
800 deferred.resolve({data: data, original: dataClone});
801 },
802 function(error) {
803 console.log(error);
804 deferred.reject(error);
805 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700806
807 return deferred.promise;
808 },
809 getAllSensorStatus: function(callback) {
810 $http({
811 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700812 url: DataService.getHost() +
813 '/xyz/openbmc_project/sensors/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700814 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700815 })
816 .then(
817 function(response) {
818 var json = JSON.stringify(response.data);
819 var content = JSON.parse(json);
820 var dataClone = JSON.parse(JSON.stringify(content.data));
821 var sensorData = [];
822 var severity = {};
823 var title = '';
824 var tempKeyParts = [];
825 var order = 0;
826 var customOrder = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700827
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700828 function getSensorStatus(reading) {
829 var severityFlags = {
830 critical: false,
831 warning: false,
832 normal: false
833 },
834 severityText = '', order = 0;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700835
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700836 if (reading.hasOwnProperty('CriticalLow') &&
837 reading.Value < reading.CriticalLow) {
838 severityFlags.critical = true;
839 severityText = 'critical';
840 order = 2;
841 } else if (
842 reading.hasOwnProperty('CriticalHigh') &&
843 reading.Value > reading.CriticalHigh) {
844 severityFlags.critical = true;
845 severityText = 'critical';
846 order = 2;
847 } else if (
848 reading.hasOwnProperty('CriticalLow') &&
849 reading.hasOwnProperty('WarningLow') &&
850 reading.Value >= reading.CriticalLow &&
851 reading.Value <= reading.WarningLow) {
852 severityFlags.warning = true;
853 severityText = 'warning';
854 order = 1;
855 } else if (
856 reading.hasOwnProperty('WarningHigh') &&
857 reading.hasOwnProperty('CriticalHigh') &&
858 reading.Value >= reading.WarningHigh &&
859 reading.Value <= reading.CriticalHigh) {
860 severityFlags.warning = true;
861 severityText = 'warning';
862 order = 1;
863 } else {
864 severityFlags.normal = true;
865 severityText = 'normal';
866 }
867 return {
868 flags: severityFlags,
869 severityText: severityText,
870 order: order
871 };
872 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700873
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700874 for (var key in content.data) {
875 if (content.data.hasOwnProperty(key) &&
876 content.data[key].hasOwnProperty('Unit')) {
877 severity = getSensorStatus(content.data[key]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700878
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700879 if (!content.data[key].hasOwnProperty('CriticalLow')) {
880 content.data[key].CriticalLow = '--';
881 content.data[key].CriticalHigh = '--';
882 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700883
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700884 if (!content.data[key].hasOwnProperty('WarningLow')) {
885 content.data[key].WarningLow = '--';
886 content.data[key].WarningHigh = '--';
887 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700888
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700889 tempKeyParts = key.split('/');
890 title = tempKeyParts.pop();
891 title = tempKeyParts.pop() + '_' + title;
892 title = title.split('_')
893 .map(function(item) {
894 return item.toLowerCase()
895 .charAt(0)
896 .toUpperCase() +
897 item.slice(1);
898 })
899 .reduce(function(prev, el) {
900 return prev + ' ' + el;
901 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700902
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700903 content.data[key].Value = getScaledValue(
904 content.data[key].Value, content.data[key].Scale);
905 content.data[key].CriticalLow = getScaledValue(
906 content.data[key].CriticalLow,
907 content.data[key].Scale);
908 content.data[key].CriticalHigh = getScaledValue(
909 content.data[key].CriticalHigh,
910 content.data[key].Scale);
911 content.data[key].WarningLow = getScaledValue(
912 content.data[key].WarningLow,
913 content.data[key].Scale);
914 content.data[key].WarningHigh = getScaledValue(
915 content.data[key].WarningHigh,
916 content.data[key].Scale);
917 if (Constants.SENSOR_SORT_ORDER.indexOf(
918 content.data[key].Unit) > -1) {
919 customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
920 content.data[key].Unit);
921 } else {
922 customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
923 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700924
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700925 sensorData.push(Object.assign(
926 {
927 path: key,
928 selected: false,
929 confirm: false,
930 copied: false,
931 title: title,
932 unit:
933 Constants
934 .SENSOR_UNIT_MAP[content.data[key].Unit],
935 severity_flags: severity.flags,
936 status: severity.severityText,
937 order: severity.order,
938 custom_order: customOrder,
939 search_text:
940 (title + ' ' + content.data[key].Value + ' ' +
941 Constants.SENSOR_UNIT_MAP[content.data[key]
942 .Unit] +
943 ' ' + severity.severityText + ' ' +
944 content.data[key].CriticalLow + ' ' +
945 content.data[key].CriticalHigh + ' ' +
946 content.data[key].WarningLow + ' ' +
947 content.data[key].WarningHigh + ' ')
948 .toLowerCase(),
949 original_data:
950 {key: key, value: content.data[key]}
951 },
952 content.data[key]));
953 }
954 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700955
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700956 callback(sensorData, dataClone);
957 },
958 function(error) {
959 console.log(error);
960 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700961 },
962 getActivation: function(imageId) {
963 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700964 method: 'GET',
965 url: DataService.getHost() +
966 '/xyz/openbmc_project/software/' + imageId +
967 '/attr/Activation',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700968 withCredentials: true
969 })
970 .then(function(response) {
971 return response.data;
972 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700973 },
974 getFirmwares: function() {
975 var deferred = $q.defer();
976 $http({
977 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700978 url: DataService.getHost() +
979 '/xyz/openbmc_project/software/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700980 withCredentials: true
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700981 })
982 .then(
983 function(response) {
984 var json = JSON.stringify(response.data);
985 var content = JSON.parse(json);
986 var data = [];
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700987 var isExtended = false;
988 var bmcActiveVersion = '';
989 var hostActiveVersion = '';
990 var imageType = '';
991 var extendedVersions = [];
992 var functionalImages = [];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700993
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700994 function getFormatedExtendedVersions(extendedVersion) {
995 var versions = [];
996 extendedVersion = extendedVersion.split(',');
Andrew Geisslerba5e3f32018-05-24 10:58:00 -0700997
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700998 extendedVersion.forEach(function(item) {
999 var parts = item.split('-');
1000 var numberIndex = 0;
1001 for (var i = 0; i < parts.length; i++) {
1002 if (/[0-9]/.test(parts[i])) {
1003 numberIndex = i;
1004 break;
1005 }
1006 }
1007 var titlePart = parts.splice(0, numberIndex);
1008 titlePart = titlePart.join('');
1009 titlePart = titlePart[0].toUpperCase() +
1010 titlePart.substr(1, titlePart.length);
1011 var versionPart = parts.join('-');
1012 versions.push({title: titlePart, version: versionPart});
1013 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001014
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001015 return versions;
1016 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001017
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001018 // Get the list of functional images so we can compare
1019 // later if an image is functional
1020 if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
1021 functionalImages =
1022 content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
1023 .endpoints;
1024 }
1025 for (var key in content.data) {
1026 if (content.data.hasOwnProperty(key) &&
1027 content.data[key].hasOwnProperty('Version')) {
Gunnar Millsac9131e2018-07-13 15:52:18 -05001028 var activationStatus = '';
1029
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001030 // If the image is "Functional" use that for the
1031 // activation status, else use the value of "Activation"
1032 // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
Gunnar Millsac9131e2018-07-13 15:52:18 -05001033 if (content.data[key].Activation) {
1034 activationStatus =
1035 content.data[key].Activation.split('.').pop();
1036 }
1037
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001038 if (functionalImages.includes(key)) {
1039 activationStatus = 'Functional';
1040 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001041
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001042 imageType = content.data[key].Purpose.split('.').pop();
1043 isExtended = content.data[key].hasOwnProperty(
1044 'ExtendedVersion') &&
1045 content.data[key].ExtendedVersion != '';
1046 if (isExtended) {
1047 extendedVersions = getFormatedExtendedVersions(
1048 content.data[key].ExtendedVersion);
1049 }
1050 data.push(Object.assign(
1051 {
1052 path: key,
1053 activationStatus: activationStatus,
1054 imageId: key.split('/').pop(),
1055 imageType: imageType,
1056 isExtended: isExtended,
1057 extended:
1058 {show: false, versions: extendedVersions},
1059 data: {key: key, value: content.data[key]}
1060 },
1061 content.data[key]));
1062
1063 if (activationStatus == 'Functional' &&
1064 imageType == 'BMC') {
1065 bmcActiveVersion = content.data[key].Version;
1066 }
1067
1068 if (activationStatus == 'Functional' &&
1069 imageType == 'Host') {
1070 hostActiveVersion = content.data[key].Version;
1071 }
1072 }
1073 }
1074
1075 deferred.resolve({
1076 data: data,
1077 bmcActiveVersion: bmcActiveVersion,
1078 hostActiveVersion: hostActiveVersion
1079 });
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001080 },
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001081 function(error) {
1082 console.log(error);
1083 deferred.reject(error);
1084 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001085
1086 return deferred.promise;
1087 },
1088 changePriority: function(imageId, priority) {
1089 var deferred = $q.defer();
1090 $http({
1091 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001092 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1093 imageId + '/attr/Priority',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001094 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001095 data: JSON.stringify({'data': priority})
1096 })
1097 .then(
1098 function(response) {
1099 var json = JSON.stringify(response.data);
1100 var content = JSON.parse(json);
1101 deferred.resolve(content);
1102 },
1103 function(error) {
1104 console.log(error);
1105 deferred.reject(error);
1106 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001107
1108 return deferred.promise;
1109 },
1110 deleteImage: function(imageId) {
1111 var deferred = $q.defer();
1112 $http({
1113 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001114 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1115 imageId + '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001116 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001117 data: JSON.stringify({'data': []})
1118 })
1119 .then(
1120 function(response) {
1121 var json = JSON.stringify(response.data);
1122 var content = JSON.parse(json);
1123 deferred.resolve(content);
1124 },
1125 function(error) {
1126 console.log(error);
1127 deferred.reject(error);
1128 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001129
1130 return deferred.promise;
1131 },
1132 activateImage: function(imageId) {
1133 var deferred = $q.defer();
1134 $http({
1135 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001136 url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1137 imageId + '/attr/RequestedActivation',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001138 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001139 data:
1140 JSON.stringify({'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1141 })
1142 .then(
1143 function(response) {
1144 var json = JSON.stringify(response.data);
1145 var content = JSON.parse(json);
1146 deferred.resolve(content);
1147 },
1148 function(error) {
1149 console.log(error);
1150 deferred.reject(error);
1151 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001152
1153 return deferred.promise;
1154 },
1155 uploadImage: function(file) {
1156 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001157 method: 'POST',
1158 timeout: 5 * 60 * 1000,
1159 url: DataService.getHost() + '/upload/image',
Gunnar Millsdd9d4c32018-09-10 12:59:34 -05001160 // Overwrite the default 'application/json' Content-Type
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001161 headers: {'Content-Type': 'application/octet-stream'},
1162 withCredentials: true,
1163 data: file
1164 })
1165 .then(function(response) {
1166 return response.data;
1167 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001168 },
1169 downloadImage: function(host, filename) {
1170 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001171 method: 'POST',
1172 url: DataService.getHost() +
1173 '/xyz/openbmc_project/software/action/DownloadViaTFTP',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001174 withCredentials: true,
1175 data: JSON.stringify({'data': [filename, host]}),
1176 responseType: 'arraybuffer'
1177 })
1178 .then(function(response) {
1179 return response.data;
1180 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001181 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001182 getServerInfo: function() {
1183 // TODO: openbmc/openbmc#3117 Need a way via REST to get
1184 // interfaces so we can get the system object(s) by the looking
1185 // for the system interface.
1186 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001187 method: 'GET',
1188 url: DataService.getHost() +
1189 '/xyz/openbmc_project/inventory/system',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001190 withCredentials: true
1191 })
1192 .then(function(response) {
1193 return response.data;
1194 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001195 },
1196 getBMCTime: function() {
1197 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001198 method: 'GET',
1199 url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001200 withCredentials: true
1201 })
1202 .then(function(response) {
1203 return response.data;
1204 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001205 },
Gunnar Millsc74d4342018-07-18 14:52:02 -05001206 getTime: function() {
1207 return $http({
1208 method: 'GET',
1209 url: DataService.getHost() +
1210 '/xyz/openbmc_project/time/enumerate',
Gunnar Millsc74d4342018-07-18 14:52:02 -05001211 withCredentials: true
1212 })
1213 .then(function(response) {
1214 return response.data;
1215 });
1216 },
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001217 // Even though NTPServers is a network interface specific path
1218 // (e.g. /xyz/openbmc_project/network/eth0/attr/NTPServers) it acts
1219 // like a global setting. Just use eth0 for setting and getting the
1220 // NTP Servers until it is moved to a non-network interface specific
1221 // path like it is in Redfish. TODO: openbmc/phosphor-time-manager#4
1222 getNTPServers: function() {
1223 return $http({
1224 method: 'GET',
1225 url: DataService.getHost() +
1226 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001227 withCredentials: true
1228 })
1229 .then(function(response) {
1230 return response.data;
1231 });
1232 },
1233 setNTPServers: function(ntpServers) {
1234 return $http({
1235 method: 'PUT',
1236 url: DataService.getHost() +
1237 '/xyz/openbmc_project/network/eth0/attr/NTPServers',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001238 withCredentials: true,
1239 data: JSON.stringify({'data': ntpServers})
1240 })
1241 .then(function(response) {
1242 return response.data;
1243 });
1244 },
1245 setTimeMode: function(timeMode) {
1246 return $http({
1247 method: 'PUT',
1248 url: DataService.getHost() +
1249 '/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001250 withCredentials: true,
1251 data: JSON.stringify({'data': timeMode})
1252 })
1253 .then(function(response) {
1254 return response.data;
1255 });
1256 },
1257 setTimeOwner: function(timeOwner) {
1258 return $http({
1259 method: 'PUT',
1260 url: DataService.getHost() +
1261 '/xyz/openbmc_project/time/owner/attr/TimeOwner',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001262 withCredentials: true,
1263 data: JSON.stringify({'data': timeOwner})
1264 })
1265 .then(function(response) {
1266 return response.data;
1267 });
1268 },
1269 setBMCTime: function(time) {
1270 return $http({
1271 method: 'PUT',
1272 url: DataService.getHost() +
1273 '/xyz/openbmc_project/time/bmc/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001274 withCredentials: true,
1275 data: JSON.stringify({'data': time})
1276 })
1277 .then(function(response) {
1278 return response.data;
1279 });
1280 },
1281 setHostTime: function(time) {
1282 return $http({
1283 method: 'PUT',
1284 url: DataService.getHost() +
1285 '/xyz/openbmc_project/time/host/attr/Elapsed',
Gunnar Millsb7ea2792018-07-18 13:01:48 -05001286 withCredentials: true,
1287 data: JSON.stringify({'data': time})
1288 })
1289 .then(function(response) {
1290 return response.data;
1291 });
1292 },
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001293 getHardwares: function(callback) {
1294 $http({
1295 method: 'GET',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001296 url: DataService.getHost() +
1297 '/xyz/openbmc_project/inventory/enumerate',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001298 withCredentials: true
1299 }).then(function(response) {
1300 var json = JSON.stringify(response.data);
1301 var content = JSON.parse(json);
1302 var hardwareData = [];
1303 var keyIndexMap = {};
1304 var title = '';
beccabroek628ba8b2018-10-01 14:12:25 -05001305 var depth = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001306 var data = [];
1307 var searchText = '';
1308 var componentIndex = -1;
beccabroek628ba8b2018-10-01 14:12:25 -05001309 var parent = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001310
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001311 function isSubComponent(key) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001312 for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1313 i++) {
1314 if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1315 2)
1316 return true;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001317 }
1318
1319 return false;
1320 }
1321
1322 function titlelize(title) {
1323 title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001324 for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1325 i++) {
1326 if (title.toLowerCase().indexOf(
1327 (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001328 return title.toUpperCase();
1329 }
1330 }
1331
1332 return title;
1333 }
1334
1335 function camelcaseToLabel(obj) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001336 var transformed = [], label = '', value = '';
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001337 for (var key in obj) {
1338 label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1339 if (obj[key] !== '') {
1340 value = obj[key];
1341 if (value == 1 || value == 0) {
1342 value = (value == 1) ? 'Yes' : 'No';
1343 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001344 transformed.push({key: label, value: value});
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001345 }
1346 }
1347
1348 return transformed;
1349 }
1350
beccabroek628ba8b2018-10-01 14:12:25 -05001351 function determineParent(key) {
1352 var levels = key.split('/');
1353 levels.pop();
1354 return levels.join('/');
1355 }
1356
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001357 function getSearchText(data) {
1358 var searchText = '';
1359 for (var i = 0; i < data.length; i++) {
1360 searchText += ' ' + data[i].key + ' ' + data[i].value;
1361 }
1362
1363 return searchText;
1364 }
1365
1366 for (var key in content.data) {
1367 if (content.data.hasOwnProperty(key) &&
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001368 key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001369 data = camelcaseToLabel(content.data[key]);
1370 searchText = getSearchText(data);
1371 title = key.split('/').pop();
1372
1373 title = titlelize(title);
beccabroek628ba8b2018-10-01 14:12:25 -05001374 // e.g. /xyz/openbmc_project/inventory/system and
1375 // /xyz/openbmc_project/inventory/system/chassis are depths of 5
1376 // and 6.
1377 depth = key.split('/').length;
1378 parent = determineParent(key);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001379
1380 if (!isSubComponent(key)) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001381 hardwareData.push(Object.assign(
1382 {
1383 path: key,
1384 title: title,
beccabroek628ba8b2018-10-01 14:12:25 -05001385 depth: depth,
1386 parent: parent,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001387 selected: false,
1388 expanded: false,
1389 search_text: title.toLowerCase() + ' ' +
1390 searchText.toLowerCase(),
1391 sub_components: [],
1392 original_data: {key: key, value: content.data[key]}
1393 },
1394 {items: data}));
Iftekharul Islam2a489552017-11-02 13:23:08 -05001395
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001396 keyIndexMap[key] = hardwareData.length - 1;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001397 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001398 parent = determineParent(key)
1399 componentIndex = keyIndexMap[parent];
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001400 data = content.data[key];
1401 data.title = title;
1402 hardwareData[componentIndex].sub_components.push(data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001403 hardwareData[componentIndex].search_text +=
1404 ' ' + title.toLowerCase();
Iftekharul Islam171c6a12017-08-11 08:35:47 -05001405
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001406 // Sort the subcomponents alphanumeric so they are displayed
1407 // on the inventory page in order (e.g. core 0, core 1, core
1408 // 2, ... core 12, core 13)
1409 hardwareData[componentIndex].sub_components.sort(function(
1410 a, b) {
1411 return a.title.localeCompare(
1412 b.title, 'en', {numeric: true});
Gunnar Mills55a8e392018-03-14 15:37:44 -05001413 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001414 }
1415 }
1416 }
beccabroek628ba8b2018-10-01 14:12:25 -05001417 // First, order the components by depth and then place the child
1418 // components beneath their parent component alphanumerically. Can
1419 // be removed with completion of
1420 // https://github.com/openbmc/openbmc/issues/3401
1421 // TODO: Remove this once implemented in back end
1422 hardwareData.sort(function(a, b) {
1423 if (a.depth < b.depth) return -1;
1424 if (a.depth > b.depth) return 1;
1425 return b.title.localeCompare(a.title, 'en', {numeric: true});
1426 });
1427
1428 var orderedComponents = [];
1429
1430 for (var i = 0; i < hardwareData.length; i++) {
1431 if (!keyIndexMap[hardwareData[i].parent]) {
1432 orderedComponents.push(hardwareData[i]);
1433 } else {
1434 for (var j = 0; j < orderedComponents.length; j++) {
1435 if (orderedComponents[j].path === hardwareData[i].parent) {
1436 var child = hardwareData[i];
1437 orderedComponents.splice(j + 1, 0, child);
1438 }
1439 }
1440 }
1441 }
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001442
1443 if (callback) {
beccabroek628ba8b2018-10-01 14:12:25 -05001444 callback(orderedComponents, content.data);
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001445 } else {
beccabroek628ba8b2018-10-01 14:12:25 -05001446 return {data: orderedComponents, original_data: content.data};
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001447 }
1448 });
1449 },
1450 deleteLogs: function(logs) {
1451 var defer = $q.defer();
1452 var promises = [];
1453
1454 function finished() {
1455 defer.resolve();
1456 }
1457
1458 logs.forEach(function(item) {
1459 promises.push($http({
1460 method: 'POST',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001461 url: DataService.getHost() +
1462 '/xyz/openbmc_project/logging/entry/' + item.Id +
1463 '/action/Delete',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001464 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001465 data: JSON.stringify({'data': []})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001466 }));
1467 });
1468
1469 $q.all(promises).then(finished);
1470
1471 return defer.promise;
1472 },
1473 resolveLogs: function(logs) {
1474 var defer = $q.defer();
1475 var promises = [];
1476
1477 function finished() {
1478 defer.resolve();
1479 }
1480
1481 logs.forEach(function(item) {
1482 promises.push($http({
1483 method: 'PUT',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001484 url: DataService.getHost() +
1485 '/xyz/openbmc_project/logging/entry/' + item.Id +
1486 '/attr/Resolved',
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001487 withCredentials: true,
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001488 data: JSON.stringify({'data': '1'})
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001489 }));
1490 });
Iftekharul Islama1d238f2018-02-26 12:29:45 -06001491
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001492 $q.all(promises).then(finished);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001493
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001494 return defer.promise;
1495 },
1496 getPowerConsumption: function() {
1497 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001498 method: 'GET',
1499 url: DataService.getHost() +
1500 '/xyz/openbmc_project/sensors/power/total_power',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001501 withCredentials: true
1502 })
1503 .then(
1504 function(response) {
1505 var json = JSON.stringify(response.data);
1506 var content = JSON.parse(json);
Iftekharul Islamcd789502017-04-19 14:37:55 -05001507
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001508 return getScaledValue(
1509 content.data.Value, content.data.Scale) +
1510 ' ' +
1511 Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1512 },
1513 function(error) {
1514 if ('Not Found' == error.statusText) {
1515 return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1516 } else {
1517 throw error;
1518 }
1519 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001520 },
1521 getPowerCap: function() {
1522 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001523 method: 'GET',
1524 url: DataService.getHost() +
1525 '/xyz/openbmc_project/control/host0/power_cap',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001526 withCredentials: true
1527 })
1528 .then(function(response) {
Gunnar Mills006aaa02018-06-26 16:08:59 -05001529 return response.data;
1530 });
1531 },
1532 setPowerCapEnable: function(powerCapEnable) {
1533 return $http({
1534 method: 'PUT',
1535 url: DataService.getHost() +
1536 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001537 withCredentials: true,
1538 data: JSON.stringify({'data': powerCapEnable})
1539 })
1540 .then(function(response) {
1541 return response.data;
1542 });
1543 },
1544 setPowerCap: function(powerCap) {
1545 return $http({
1546 method: 'PUT',
1547 url: DataService.getHost() +
1548 '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
Gunnar Mills006aaa02018-06-26 16:08:59 -05001549 withCredentials: true,
1550 data: JSON.stringify({'data': powerCap})
1551 })
1552 .then(function(response) {
1553 return response.data;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001554 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001555 },
1556 setHostname: function(hostname) {
1557 return $http({
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001558 method: 'PUT',
1559 url: DataService.getHost() +
1560 '/xyz/openbmc_project/network/config/attr/HostName',
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001561 withCredentials: true,
1562 data: JSON.stringify({'data': hostname})
1563 })
1564 .then(function(response) {
1565 return response.data;
1566 });
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001567 },
1568 };
1569 return SERVICE;
Andrew Geisslerd27bb132018-05-24 11:07:27 -07001570 }
1571 ]);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07001572})(window.angular);