1/**
2 * API utilities service
3 *
4 * @module app/common/services/api-utils
5 * @exports APIUtils
6 * @name APIUtils
7 */
8
9window.angular && (function(angular) {
10  'use strict';
11  angular.module('app.common.services').factory('APIUtils', [
12    '$http', 'Constants', '$q', 'dataService', '$interval',
13    function($http, Constants, $q, DataService, $interval) {
14      var getScaledValue = function(value, scale) {
15        scale = scale + '';
16        scale = parseInt(scale, 10);
17        var power = Math.abs(parseInt(scale, 10));
18
19        if (scale > 0) {
20          value = value * Math.pow(10, power);
21        } else if (scale < 0) {
22          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',
39            url: DataService.getHost() +
40                '/xyz/openbmc_project/state/chassis0/attr/CurrentPowerState',
41            withCredentials: true
42          })
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                  });
53          return deferred.promise;
54        },
55        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        },
60        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        },
71        getHostState: function() {
72          var deferred = $q.defer();
73          $http({
74            method: 'GET',
75            url: DataService.getHost() +
76                '/xyz/openbmc_project/state/host0/attr/CurrentHostState',
77            withCredentials: true
78          })
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                  });
89          return deferred.promise;
90        },
91        getSNMPManagers: function() {
92          return $http({
93                   method: 'GET',
94                   url: DataService.getHost() +
95                       '/xyz/openbmc_project/network/snmp/manager/enumerate',
96                   withCredentials: true
97                 })
98              .then(function(response) {
99                return response.data;
100              });
101        },
102        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        },
208        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        },
243        getNetworkInfo: function() {
244          var deferred = $q.defer();
245          $http({
246            method: 'GET',
247            url: DataService.getHost() +
248                '/xyz/openbmc_project/network/enumerate',
249            withCredentials: true
250          })
251              .then(
252                  function(response) {
253                    var json = JSON.stringify(response.data);
254                    var content = JSON.parse(json);
255                    var hostname = '';
256                    var defaultgateway = '';
257                    var macAddress = '';
258
259                    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) {
268                        if (key.match(/network\/eth\d+(_\d+)?$/ig)) {
269                          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(
292                                /network\/eth\d+(_\d+)?\/ipv[4|6]\/[a-z0-9]+$/ig)) {
293                          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                        }
308                      }
309                      return data;
310                    }
311
312                    if (content.data.hasOwnProperty(
313                            '/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                      }
326                    }
327
328                    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                    }
336
337                    deferred.resolve({
338                      data: content.data,
339                      hostname: hostname,
340                      defaultgateway: defaultgateway,
341                      mac_address: macAddress,
342                      formatted_data: parseNetworkData(content)
343                    });
344                  },
345                  function(error) {
346                    console.log(error);
347                    deferred.reject(error);
348                  });
349          return deferred.promise;
350        },
351        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',
357                   withCredentials: true,
358                   data: JSON.stringify({'data': mac_address})
359                 })
360              .then(function(response) {
361                return response.data;
362              });
363        },
364        setDefaultGateway: function(defaultGateway) {
365          return $http({
366                   method: 'PUT',
367                   url: DataService.getHost() +
368                       '/xyz/openbmc_project/network/config/attr/DefaultGateway',
369                   withCredentials: true,
370                   data: JSON.stringify({'data': defaultGateway})
371                 })
372              .then(function(response) {
373                return response.data;
374              });
375        },
376        setDHCPEnabled: function(interfaceName, dhcpEnabled) {
377          return $http({
378                   method: 'PUT',
379                   url: DataService.getHost() +
380                       '/xyz/openbmc_project/network/' + interfaceName +
381                       '/attr/DHCPEnabled',
382                   withCredentials: true,
383                   data: JSON.stringify({'data': dhcpEnabled})
384                 })
385              .then(function(response) {
386                return response.data;
387              });
388        },
389        setNameservers: function(interfaceName, dnsServers) {
390          return $http({
391                   method: 'PUT',
392                   url: DataService.getHost() +
393                       '/xyz/openbmc_project/network/' + interfaceName +
394                       '/attr/Nameservers',
395                   withCredentials: true,
396                   data: JSON.stringify({'data': dnsServers})
397                 })
398              .then(function(response) {
399                return response.data;
400              });
401        },
402        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',
408                   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',
422                   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        },
434        getLEDState: function() {
435          var deferred = $q.defer();
436          $http({
437            method: 'GET',
438            url: DataService.getHost() +
439                '/xyz/openbmc_project/led/groups/enclosure_identify',
440            withCredentials: true
441          })
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                  });
452          return deferred.promise;
453        },
454        login: function(username, password, callback) {
455          $http({
456            method: 'POST',
457            url: DataService.getHost() + '/login',
458            withCredentials: true,
459            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                  });
477        },
478        logout: function(callback) {
479          $http({
480            method: 'POST',
481            url: DataService.getHost() + '/logout',
482            withCredentials: true,
483            data: JSON.stringify({'data': []})
484          })
485              .then(
486                  function(response) {
487                    if (callback) {
488                      callback(response.data);
489                    }
490                  },
491                  function(error) {
492                    if (callback) {
493                      callback(null, error);
494                    }
495                    console.log(error);
496                  });
497        },
498        changePassword: function(user, newPassword) {
499          if (DataService.configJson.redfishSupportEnabled == true) {
500            return $http({
501              method: 'PATCH',
502              url: DataService.getHost() +
503                  '/redfish/v1/AccountService/Accounts/' + user,
504              withCredentials: true,
505              data: JSON.stringify({'Password': newPassword})
506            });
507          } else {
508            var deferred = $q.defer();
509            $http({
510              method: 'POST',
511              url: DataService.getHost() + '/xyz/openbmc_project/user/' + user +
512                  '/action/SetPassword',
513              withCredentials: true,
514              data: JSON.stringify({'data': [newPassword]}),
515              responseType: 'arraybuffer'
516            })
517                .then(
518                    function(response, status, headers) {
519                      deferred.resolve(
520                          {data: response, status: status, headers: headers});
521                    },
522                    function(error) {
523                      console.log(error);
524                      deferred.reject(error);
525                    });
526            return deferred.promise;
527          }
528        },
529        getAllUserAccounts: function(members) {
530          var deferred = $q.defer();
531          var promises = [];
532          var users = [];
533
534          if (DataService.configJson.redfishSupportEnabled == true) {
535            $http({
536              method: 'GET',
537              url:
538                  DataService.getHost() + '/redfish/v1/AccountService/Accounts',
539              withCredentials: true
540            })
541                .then(
542                    function(response) {
543                      var members = response.data['Members'];
544                      angular.forEach(members, function(member) {
545                        promises.push(
546                            $http({
547                              method: 'GET',
548                              url: DataService.getHost() + member['@odata.id'],
549                              withCredentials: true
550                            }).then(function(res) {
551                              return res.data;
552                            }));
553                      });
554
555                      $q.all(promises).then(
556                          function(results) {
557                            deferred.resolve(results);
558                          },
559                          function(errors) {
560                            deferred.reject(errors);
561                          });
562                    },
563                    function(error) {
564                      console.log(error);
565                      deferred.reject(error);
566                    });
567          } else {
568            $http({
569              method: 'GET',
570              url:
571                  DataService.getHost() + '/xyz/openbmc_project/user/enumerate',
572              withCredentials: true
573            })
574                .then(
575                    function(response) {
576                      var json = JSON.stringify(response.data);
577                      var content = JSON.parse(json);
578
579                      function convertPrivToRoleId(priv) {
580                        if (priv == 'priv-admin') {
581                          return 'Administrator';
582                        } else if (priv == 'priv-user') {
583                          return 'User';
584                        } else if (priv == 'priv-operator') {
585                          return 'Operator';
586                        } else if (priv == 'priv-callback') {
587                          return 'Callback';
588                        }
589                        return '';
590                      }
591
592                      for (var key in content.data) {
593                        var username = key.split('/').pop();
594                        if (content.data.hasOwnProperty(key) &&
595                            content.data[key].hasOwnProperty('UserPrivilege')) {
596                          var val = content.data[key];
597                          users.push(Object.assign({
598                            Id: username,
599                            UserName: username,
600                            Locked: val['UserLockedForFailedAttempt'],
601                            RoleId: convertPrivToRoleId(val['UserPrivilege']),
602                            Enabled: val['UserEnabled'],
603                            Password: null
604                          }));
605                        }
606                      }
607                      deferred.resolve(users);
608                    },
609                    function(error) {
610                      console.log(error);
611                      deferred.reject(error);
612                    });
613          }
614          return deferred.promise;
615        },
616        createUser: function(user, passwd, role, enabled) {
617          if (DataService.configJson.redfishSupportEnabled == true) {
618            var data = {};
619            data['UserName'] = user;
620            data['Password'] = passwd;
621            data['RoleId'] = role;
622            data['Enabled'] = enabled;
623
624            return $http({
625              method: 'POST',
626              url:
627                  DataService.getHost() + '/redfish/v1/AccountService/Accounts',
628              withCredentials: true,
629              data: data
630            });
631          } else {
632            function convertRoleIdToPriv(roleId) {
633              if (roleId == 'Administrator') {
634                return 'priv-admin';
635              } else if (roleId == 'User') {
636                return 'priv-user';
637              } else if (roleId == 'Operator') {
638                return 'priv-operator';
639              } else if (roleId == 'Callback') {
640                return 'priv-callback';
641              }
642              return '';
643            }
644            function setUserPassword(user, passwd) {
645              return $http({
646                       method: 'POST',
647                       url: DataService.getHost() +
648                           '/xyz/openbmc_project/user/' + user +
649                           '/action/SetPassword',
650                       withCredentials: true,
651                       data: JSON.stringify({'data': [passwd]}),
652                       responseType: 'arraybuffer'
653                     })
654                  .then(function(response) {
655                    return response.data;
656                  });
657            }
658            var priv = convertRoleIdToPriv(role);
659            return $http({
660                     method: 'POST',
661                     url: DataService.getHost() +
662                         '/xyz/openbmc_project/user/action/CreateUser',
663                     withCredentials: true,
664                     data: JSON.stringify({
665                       'data':
666                           [user, ['web', 'redfish', 'ssh'], priv, enabled]
667                     }),
668                     responseType: 'arraybuffer'
669                   })
670                .then(function(response) {
671                  return setUserPassword(user, passwd);
672                });
673          }
674        },
675        updateUser: function(user, newUser, passwd, role, enabled) {
676          if (DataService.configJson.redfishSupportEnabled == true) {
677            var data = {};
678            if ((newUser !== undefined) && (newUser != null)) {
679              data['UserName'] = newUser;
680            }
681            if ((role !== undefined) && (role != null)) {
682              data['RoleId'] = role;
683            }
684            if ((enabled !== undefined) && (enabled != null)) {
685              data['Enabled'] = enabled;
686            }
687            if ((passwd !== undefined) && (passwd != null)) {
688              data['Password'] = passwd;
689            }
690            return $http({
691              method: 'PATCH',
692              url: DataService.getHost() +
693                  '/redfish/v1/AccountService/Accounts/' + user,
694              withCredentials: true,
695              data: data
696            });
697          } else {
698            var deferred = $q.defer();
699            var promises = [];
700            function convertRoleIdToPriv(roleId) {
701              if (roleId == 'Administrator') {
702                return 'priv-admin';
703              } else if (roleId == 'User') {
704                return 'priv-user';
705              } else if (roleId == 'Operator') {
706                return 'priv-operator';
707              } else if (roleId == 'Callback') {
708                return 'priv-callback';
709              }
710              return '';
711            }
712            function setUserProperty(user, propKey, propVal) {
713              return $http({
714                       method: 'PUT',
715                       url: DataService.getHost() +
716                           '/xyz/openbmc_project/user/' + user + '/attr/' +
717                           propKey,
718                       withCredentials: true,
719                       data: JSON.stringify({'data': propVal})
720                     })
721                  .then(function(response) {
722                    return response.data;
723                  });
724            }
725            function setUserPassword(user, passwd) {
726              return $http({
727                       method: 'POST',
728                       url: DataService.getHost() +
729                           '/xyz/openbmc_project/user/' + user +
730                           '/action/SetPassword',
731                       withCredentials: true,
732                       data: JSON.stringify({'data': [passwd]}),
733                       responseType: 'arraybuffer'
734                     })
735                  .then(function(response) {
736                    return response.data;
737                  });
738            }
739            function renameUser(user, newUser) {
740              return $http({
741                       method: 'POST',
742                       url: DataService.getHost() +
743                           '/xyz/openbmc_project/user/action/RenameUser',
744                       withCredentials: true,
745                       data: JSON.stringify({'data': [user, newUser]})
746                     })
747                  .then(function(response) {
748                    return response.data;
749                  });
750            }
751            if ((role !== undefined) && (role != null)) {
752              var priv = convertRoleIdToPriv(role);
753              promises.push(setUserProperty(user, 'UserPrivilege', priv));
754            }
755            if ((enabled !== undefined) && (enabled != null)) {
756              promises.push(setUserProperty(user, 'UserEnabled', enabled));
757            }
758            if ((passwd !== undefined) && (passwd != null)) {
759              promises.push(setUserPassword(user, passwd));
760            }
761            if ((newUser !== undefined) && (newUser != null)) {
762              promises.push(renameUser(user, newUser));
763            }
764            $q.all(promises).then(
765                function(results) {
766                  deferred.resolve(results);
767                },
768                function(errors) {
769                  deferred.reject(errors);
770                });
771            return deferred.promise;
772          }
773        },
774        deleteUser: function(user) {
775          if (DataService.configJson.redfishSupportEnabled == true) {
776            return $http({
777              method: 'DELETE',
778              url: DataService.getHost() +
779                  '/redfish/v1/AccountService/Accounts/' + user,
780              withCredentials: true,
781            });
782          } else {
783            return $http({
784                     method: 'POST',
785                     url: DataService.getHost() + '/xyz/openbmc_project/user/' +
786                         user + '/action/Delete',
787                     withCredentials: true,
788                     data: JSON.stringify({'data': []})
789                   })
790                .then(function(response) {
791                  return response.data;
792                });
793          }
794        },
795        chassisPowerOff: function() {
796          var deferred = $q.defer();
797          $http({
798            method: 'PUT',
799            url: DataService.getHost() +
800                '/xyz/openbmc_project/state/chassis0/attr/RequestedPowerTransition',
801            withCredentials: true,
802            data: JSON.stringify(
803                {'data': 'xyz.openbmc_project.State.Chassis.Transition.Off'})
804          })
805              .then(
806                  function(response) {
807                    var json = JSON.stringify(response.data);
808                    var content = JSON.parse(json);
809                    deferred.resolve(content.status);
810                  },
811                  function(error) {
812                    console.log(error);
813                    deferred.reject(error);
814                  });
815          return deferred.promise;
816        },
817        setLEDState: function(state, callback) {
818          $http({
819            method: 'PUT',
820            url: DataService.getHost() +
821                '/xyz/openbmc_project/led/groups/enclosure_identify/attr/Asserted',
822            withCredentials: true,
823            data: JSON.stringify({'data': state})
824          })
825              .then(
826                  function(response) {
827                    var json = JSON.stringify(response.data);
828                    var content = JSON.parse(json);
829                    if (callback) {
830                      return callback(content.status);
831                    }
832                  },
833                  function(error) {
834                    if (callback) {
835                      callback(error);
836                    } else {
837                      console.log(error);
838                    }
839                  });
840        },
841        bmcReboot: function(callback) {
842          $http({
843            method: 'PUT',
844            url: DataService.getHost() +
845                '/xyz/openbmc_project/state/bmc0/attr/RequestedBmcTransition',
846            withCredentials: true,
847            data: JSON.stringify(
848                {'data': 'xyz.openbmc_project.State.BMC.Transition.Reboot'})
849          })
850              .then(
851                  function(response) {
852                    var json = JSON.stringify(response.data);
853                    var content = JSON.parse(json);
854                    if (callback) {
855                      return callback(content.status);
856                    }
857                  },
858                  function(error) {
859                    if (callback) {
860                      callback(error);
861                    } else {
862                      console.log(error);
863                    }
864                  });
865        },
866        getLastRebootTime: function() {
867          return $http({
868                   method: 'GET',
869                   url: DataService.getHost() +
870                       '/xyz/openbmc_project/state/bmc0/attr/LastRebootTime',
871                   withCredentials: true
872                 })
873              .then(function(response) {
874                return response.data;
875              });
876        },
877        hostPowerOn: function() {
878          var deferred = $q.defer();
879          $http({
880            method: 'PUT',
881            url: DataService.getHost() +
882                '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
883            withCredentials: true,
884            data: JSON.stringify(
885                {'data': 'xyz.openbmc_project.State.Host.Transition.On'})
886          })
887              .then(
888                  function(response) {
889                    var json = JSON.stringify(response.data);
890                    var content = JSON.parse(json);
891                    deferred.resolve(content.status);
892                  },
893                  function(error) {
894                    console.log(error);
895                    deferred.reject(error);
896                  });
897          return deferred.promise;
898        },
899        hostPowerOff: function() {
900          var deferred = $q.defer();
901          $http({
902            method: 'PUT',
903            url: DataService.getHost() +
904                '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
905            withCredentials: true,
906            data: JSON.stringify(
907                {'data': 'xyz.openbmc_project.State.Host.Transition.Off'})
908          })
909              .then(
910                  function(response) {
911                    var json = JSON.stringify(response.data);
912                    var content = JSON.parse(json);
913                    deferred.resolve(content.status);
914                  },
915                  function(error) {
916                    console.log(error);
917                    deferred.reject(error);
918                  });
919          return deferred.promise;
920        },
921        hostReboot: function() {
922          var deferred = $q.defer();
923          $http({
924            method: 'PUT',
925            url: DataService.getHost() +
926                '/xyz/openbmc_project/state/host0/attr/RequestedHostTransition',
927            withCredentials: true,
928            data: JSON.stringify(
929                {'data': 'xyz.openbmc_project.State.Host.Transition.Reboot'})
930          })
931              .then(
932                  function(response) {
933                    var json = JSON.stringify(response.data);
934                    var content = JSON.parse(json);
935                    deferred.resolve(content.status);
936                  },
937                  function(error) {
938                    console.log(error);
939                    deferred.reject(error);
940                  });
941
942          return deferred.promise;
943        },
944        hostShutdown: function(callback) {
945          $http({
946            method: 'POST',
947            url: DataService.getHost() + '/xyz/openbmc_project/state/host0',
948            withCredentials: true,
949            data: JSON.stringify({'data': []})
950          })
951              .then(
952                  function(response) {
953                    var json = JSON.stringify(response.data);
954                    var content = JSON.parse(json);
955                    if (callback) {
956                      return callback(content);
957                    }
958                  },
959                  function(error) {
960                    if (callback) {
961                      callback(error);
962                    } else {
963                      console.log(error);
964                    }
965                  });
966        },
967        getLastPowerTime: function() {
968          return $http({
969                   method: 'GET',
970                   url: DataService.getHost() +
971                       '/xyz/openbmc_project/state/chassis0/attr/LastStateChangeTime',
972                   withCredentials: true
973                 })
974              .then(function(response) {
975                return response.data;
976              });
977        },
978        getLogs: function() {
979          var deferred = $q.defer();
980          $http({
981            method: 'GET',
982            url: DataService.getHost() +
983                '/xyz/openbmc_project/logging/enumerate',
984            withCredentials: true
985          })
986              .then(
987                  function(response) {
988                    var json = JSON.stringify(response.data);
989                    var content = JSON.parse(json);
990                    var dataClone = JSON.parse(JSON.stringify(content.data));
991                    var data = [];
992                    var severityCode = '';
993                    var priority = '';
994                    var health = '';
995                    var relatedItems = [];
996                    var eventID = 'None';
997                    var description = 'None';
998
999                    for (var key in content.data) {
1000                      if (content.data.hasOwnProperty(key) &&
1001                          content.data[key].hasOwnProperty('Id')) {
1002                        var severityFlags = {
1003                          low: false,
1004                          medium: false,
1005                          high: false
1006                        };
1007                        severityCode =
1008                            content.data[key].Severity.split('.').pop();
1009                        priority =
1010                            Constants.SEVERITY_TO_PRIORITY_MAP[severityCode];
1011                        severityFlags[priority.toLowerCase()] = true;
1012                        relatedItems = [];
1013                        content.data[key].associations.forEach(function(item) {
1014                          relatedItems.push(item[2]);
1015                        });
1016
1017                        if (content.data[key].hasOwnProperty(['EventID'])) {
1018                          eventID = content.data[key].EventID;
1019                        }
1020
1021                        if (content.data[key].hasOwnProperty(['Description'])) {
1022                          description = content.data[key].Description;
1023                        }
1024
1025                        data.push(Object.assign(
1026                            {
1027                              path: key,
1028                              copied: false,
1029                              priority: priority,
1030                              severity_code: severityCode,
1031                              severity_flags: severityFlags,
1032                              additional_data:
1033                                  content.data[key].AdditionalData.join('\n'),
1034                              type: content.data[key].Message,
1035                              selected: false,
1036                              search_text:
1037                                  ('#' + content.data[key].Id + ' ' +
1038                                   severityCode + ' ' +
1039                                   content.data[key].Message + ' ' +
1040                                   content.data[key].Severity + ' ' +
1041                                   content.data[key].AdditionalData.join(' '))
1042                                      .toLowerCase(),
1043                              meta: false,
1044                              confirm: false,
1045                              related_items: relatedItems,
1046                              eventID: eventID,
1047                              description: description,
1048                              data: {key: key, value: content.data[key]}
1049                            },
1050                            content.data[key]));
1051                      }
1052                    }
1053                    deferred.resolve({data: data, original: dataClone});
1054                  },
1055                  function(error) {
1056                    console.log(error);
1057                    deferred.reject(error);
1058                  });
1059
1060          return deferred.promise;
1061        },
1062        getAllSensorStatus: function(callback) {
1063          $http({
1064            method: 'GET',
1065            url: DataService.getHost() +
1066                '/xyz/openbmc_project/sensors/enumerate',
1067            withCredentials: true
1068          })
1069              .then(
1070                  function(response) {
1071                    var json = JSON.stringify(response.data);
1072                    var content = JSON.parse(json);
1073                    var dataClone = JSON.parse(JSON.stringify(content.data));
1074                    var sensorData = [];
1075                    var severity = {};
1076                    var title = '';
1077                    var tempKeyParts = [];
1078                    var order = 0;
1079                    var customOrder = 0;
1080
1081                    function getSensorStatus(reading) {
1082                      var severityFlags = {
1083                        critical: false,
1084                        warning: false,
1085                        normal: false
1086                      },
1087                          severityText = '', order = 0;
1088
1089                      if (reading.hasOwnProperty('CriticalLow') &&
1090                          reading.Value < reading.CriticalLow) {
1091                        severityFlags.critical = true;
1092                        severityText = 'critical';
1093                        order = 2;
1094                      } else if (
1095                          reading.hasOwnProperty('CriticalHigh') &&
1096                          reading.Value > reading.CriticalHigh) {
1097                        severityFlags.critical = true;
1098                        severityText = 'critical';
1099                        order = 2;
1100                      } else if (
1101                          reading.hasOwnProperty('CriticalLow') &&
1102                          reading.hasOwnProperty('WarningLow') &&
1103                          reading.Value >= reading.CriticalLow &&
1104                          reading.Value <= reading.WarningLow) {
1105                        severityFlags.warning = true;
1106                        severityText = 'warning';
1107                        order = 1;
1108                      } else if (
1109                          reading.hasOwnProperty('WarningHigh') &&
1110                          reading.hasOwnProperty('CriticalHigh') &&
1111                          reading.Value >= reading.WarningHigh &&
1112                          reading.Value <= reading.CriticalHigh) {
1113                        severityFlags.warning = true;
1114                        severityText = 'warning';
1115                        order = 1;
1116                      } else {
1117                        severityFlags.normal = true;
1118                        severityText = 'normal';
1119                      }
1120                      return {
1121                        flags: severityFlags,
1122                        severityText: severityText,
1123                        order: order
1124                      };
1125                    }
1126
1127                    for (var key in content.data) {
1128                      if (content.data.hasOwnProperty(key) &&
1129                          content.data[key].hasOwnProperty('Unit')) {
1130                        severity = getSensorStatus(content.data[key]);
1131
1132                        if (!content.data[key].hasOwnProperty('CriticalLow')) {
1133                          content.data[key].CriticalLow = '--';
1134                          content.data[key].CriticalHigh = '--';
1135                        }
1136
1137                        if (!content.data[key].hasOwnProperty('WarningLow')) {
1138                          content.data[key].WarningLow = '--';
1139                          content.data[key].WarningHigh = '--';
1140                        }
1141
1142                        tempKeyParts = key.split('/');
1143                        title = tempKeyParts.pop();
1144                        title = tempKeyParts.pop() + '_' + title;
1145                        title = title.split('_')
1146                                    .map(function(item) {
1147                                      return item.toLowerCase()
1148                                                 .charAt(0)
1149                                                 .toUpperCase() +
1150                                          item.slice(1);
1151                                    })
1152                                    .reduce(function(prev, el) {
1153                                      return prev + ' ' + el;
1154                                    });
1155
1156                        content.data[key].Value = getScaledValue(
1157                            content.data[key].Value, content.data[key].Scale);
1158                        content.data[key].CriticalLow = getScaledValue(
1159                            content.data[key].CriticalLow,
1160                            content.data[key].Scale);
1161                        content.data[key].CriticalHigh = getScaledValue(
1162                            content.data[key].CriticalHigh,
1163                            content.data[key].Scale);
1164                        content.data[key].WarningLow = getScaledValue(
1165                            content.data[key].WarningLow,
1166                            content.data[key].Scale);
1167                        content.data[key].WarningHigh = getScaledValue(
1168                            content.data[key].WarningHigh,
1169                            content.data[key].Scale);
1170                        if (Constants.SENSOR_SORT_ORDER.indexOf(
1171                                content.data[key].Unit) > -1) {
1172                          customOrder = Constants.SENSOR_SORT_ORDER.indexOf(
1173                              content.data[key].Unit);
1174                        } else {
1175                          customOrder = Constants.SENSOR_SORT_ORDER_DEFAULT;
1176                        }
1177
1178                        sensorData.push(Object.assign(
1179                            {
1180                              path: key,
1181                              selected: false,
1182                              confirm: false,
1183                              copied: false,
1184                              title: title,
1185                              unit:
1186                                  Constants
1187                                      .SENSOR_UNIT_MAP[content.data[key].Unit],
1188                              severity_flags: severity.flags,
1189                              status: severity.severityText,
1190                              order: severity.order,
1191                              custom_order: customOrder,
1192                              search_text:
1193                                  (title + ' ' + content.data[key].Value + ' ' +
1194                                   Constants.SENSOR_UNIT_MAP[content.data[key]
1195                                                                 .Unit] +
1196                                   ' ' + severity.severityText + ' ' +
1197                                   content.data[key].CriticalLow + ' ' +
1198                                   content.data[key].CriticalHigh + ' ' +
1199                                   content.data[key].WarningLow + ' ' +
1200                                   content.data[key].WarningHigh + ' ')
1201                                      .toLowerCase(),
1202                              original_data:
1203                                  {key: key, value: content.data[key]}
1204                            },
1205                            content.data[key]));
1206                      }
1207                    }
1208
1209                    callback(sensorData, dataClone);
1210                  },
1211                  function(error) {
1212                    console.log(error);
1213                  });
1214        },
1215        getActivation: function(imageId) {
1216          return $http({
1217                   method: 'GET',
1218                   url: DataService.getHost() +
1219                       '/xyz/openbmc_project/software/' + imageId +
1220                       '/attr/Activation',
1221                   withCredentials: true
1222                 })
1223              .then(function(response) {
1224                return response.data;
1225              });
1226        },
1227        getFirmwares: function() {
1228          var deferred = $q.defer();
1229          $http({
1230            method: 'GET',
1231            url: DataService.getHost() +
1232                '/xyz/openbmc_project/software/enumerate',
1233            withCredentials: true
1234          })
1235              .then(
1236                  function(response) {
1237                    var json = JSON.stringify(response.data);
1238                    var content = JSON.parse(json);
1239                    var data = [];
1240                    var isExtended = false;
1241                    var bmcActiveVersion = '';
1242                    var hostActiveVersion = '';
1243                    var imageType = '';
1244                    var extendedVersions = [];
1245                    var functionalImages = [];
1246
1247                    function getFormatedExtendedVersions(extendedVersion) {
1248                      var versions = [];
1249                      extendedVersion = extendedVersion.split(',');
1250
1251                      extendedVersion.forEach(function(item) {
1252                        var parts = item.split('-');
1253                        var numberIndex = 0;
1254                        for (var i = 0; i < parts.length; i++) {
1255                          if (/[0-9]/.test(parts[i])) {
1256                            numberIndex = i;
1257                            break;
1258                          }
1259                        }
1260                        var titlePart = parts.splice(0, numberIndex);
1261                        titlePart = titlePart.join('');
1262                        titlePart = titlePart[0].toUpperCase() +
1263                            titlePart.substr(1, titlePart.length);
1264                        var versionPart = parts.join('-');
1265                        versions.push({title: titlePart, version: versionPart});
1266                      });
1267
1268                      return versions;
1269                    }
1270
1271                    // Get the list of functional images so we can compare
1272                    // later if an image is functional
1273                    if (content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]) {
1274                      functionalImages =
1275                          content.data[Constants.FIRMWARE.FUNCTIONAL_OBJPATH]
1276                              .endpoints;
1277                    }
1278                    for (var key in content.data) {
1279                      if (content.data.hasOwnProperty(key) &&
1280                          content.data[key].hasOwnProperty('Version')) {
1281                        var activationStatus = '';
1282
1283                        // If the image is "Functional" use that for the
1284                        // activation status, else use the value of
1285                        // "Activation"
1286                        // github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Activation.interface.yaml
1287                        if (content.data[key].Activation) {
1288                          activationStatus =
1289                              content.data[key].Activation.split('.').pop();
1290                        }
1291
1292                        if (functionalImages.includes(key)) {
1293                          activationStatus = 'Functional';
1294                        }
1295
1296                        imageType = content.data[key].Purpose.split('.').pop();
1297                        isExtended = content.data[key].hasOwnProperty(
1298                                         'ExtendedVersion') &&
1299                            content.data[key].ExtendedVersion != '';
1300                        if (isExtended) {
1301                          extendedVersions = getFormatedExtendedVersions(
1302                              content.data[key].ExtendedVersion);
1303                        }
1304                        data.push(Object.assign(
1305                            {
1306                              path: key,
1307                              activationStatus: activationStatus,
1308                              imageId: key.split('/').pop(),
1309                              imageType: imageType,
1310                              isExtended: isExtended,
1311                              extended:
1312                                  {show: false, versions: extendedVersions},
1313                              data: {key: key, value: content.data[key]}
1314                            },
1315                            content.data[key]));
1316
1317                        if (activationStatus == 'Functional' &&
1318                            imageType == 'BMC') {
1319                          bmcActiveVersion = content.data[key].Version;
1320                        }
1321
1322                        if (activationStatus == 'Functional' &&
1323                            imageType == 'Host') {
1324                          hostActiveVersion = content.data[key].Version;
1325                        }
1326                      }
1327                    }
1328
1329                    deferred.resolve({
1330                      data: data,
1331                      bmcActiveVersion: bmcActiveVersion,
1332                      hostActiveVersion: hostActiveVersion
1333                    });
1334                  },
1335                  function(error) {
1336                    console.log(error);
1337                    deferred.reject(error);
1338                  });
1339
1340          return deferred.promise;
1341        },
1342        changePriority: function(imageId, priority) {
1343          var deferred = $q.defer();
1344          $http({
1345            method: 'PUT',
1346            url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1347                imageId + '/attr/Priority',
1348            withCredentials: true,
1349            data: JSON.stringify({'data': priority})
1350          })
1351              .then(
1352                  function(response) {
1353                    var json = JSON.stringify(response.data);
1354                    var content = JSON.parse(json);
1355                    deferred.resolve(content);
1356                  },
1357                  function(error) {
1358                    console.log(error);
1359                    deferred.reject(error);
1360                  });
1361
1362          return deferred.promise;
1363        },
1364        deleteImage: function(imageId) {
1365          var deferred = $q.defer();
1366          $http({
1367            method: 'POST',
1368            url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1369                imageId + '/action/Delete',
1370            withCredentials: true,
1371            data: JSON.stringify({'data': []})
1372          })
1373              .then(
1374                  function(response) {
1375                    var json = JSON.stringify(response.data);
1376                    var content = JSON.parse(json);
1377                    deferred.resolve(content);
1378                  },
1379                  function(error) {
1380                    console.log(error);
1381                    deferred.reject(error);
1382                  });
1383
1384          return deferred.promise;
1385        },
1386        activateImage: function(imageId) {
1387          var deferred = $q.defer();
1388          $http({
1389            method: 'PUT',
1390            url: DataService.getHost() + '/xyz/openbmc_project/software/' +
1391                imageId + '/attr/RequestedActivation',
1392            withCredentials: true,
1393            data:
1394                JSON.stringify({'data': Constants.FIRMWARE.ACTIVATE_FIRMWARE})
1395          })
1396              .then(
1397                  function(response) {
1398                    var json = JSON.stringify(response.data);
1399                    var content = JSON.parse(json);
1400                    deferred.resolve(content);
1401                  },
1402                  function(error) {
1403                    console.log(error);
1404                    deferred.reject(error);
1405                  });
1406
1407          return deferred.promise;
1408        },
1409        uploadImage: function(file) {
1410          return $http({
1411                   method: 'POST',
1412                   timeout: 5 * 60 * 1000,
1413                   url: DataService.getHost() + '/upload/image',
1414                   // Overwrite the default 'application/json' Content-Type
1415                   headers: {'Content-Type': 'application/octet-stream'},
1416                   withCredentials: true,
1417                   data: file
1418                 })
1419              .then(function(response) {
1420                return response.data;
1421              });
1422        },
1423        downloadImage: function(host, filename) {
1424          return $http({
1425                   method: 'POST',
1426                   url: DataService.getHost() +
1427                       '/xyz/openbmc_project/software/action/DownloadViaTFTP',
1428                   withCredentials: true,
1429                   data: JSON.stringify({'data': [filename, host]}),
1430                   responseType: 'arraybuffer'
1431                 })
1432              .then(function(response) {
1433                return response.data;
1434              });
1435        },
1436        getServerInfo: function() {
1437          // TODO: openbmc/openbmc#3117 Need a way via REST to get
1438          // interfaces so we can get the system object(s) by the looking
1439          // for the system interface.
1440          return $http({
1441                   method: 'GET',
1442                   url: DataService.getHost() +
1443                       '/xyz/openbmc_project/inventory/system',
1444                   withCredentials: true
1445                 })
1446              .then(function(response) {
1447                return response.data;
1448              });
1449        },
1450        getBMCTime: function() {
1451          return $http({
1452                   method: 'GET',
1453                   url: DataService.getHost() + '/xyz/openbmc_project/time/bmc',
1454                   withCredentials: true
1455                 })
1456              .then(function(response) {
1457                return response.data;
1458              });
1459        },
1460        getTime: function() {
1461          return $http({
1462                   method: 'GET',
1463                   url: DataService.getHost() +
1464                       '/xyz/openbmc_project/time/enumerate',
1465                   withCredentials: true
1466                 })
1467              .then(function(response) {
1468                return response.data;
1469              });
1470        },
1471        // Even though NTPServers is a network interface specific path
1472        // (e.g. /xyz/openbmc_project/network/eth0/attr/NTPServers) it acts
1473        // like a global setting. Just use eth0 for setting and getting the
1474        // NTP Servers until it is moved to a non-network interface specific
1475        // path like it is in Redfish. TODO: openbmc/phosphor-time-manager#4
1476        getNTPServers: function() {
1477          return $http({
1478                   method: 'GET',
1479                   url: DataService.getHost() +
1480                       '/xyz/openbmc_project/network/eth0/attr/NTPServers',
1481                   withCredentials: true
1482                 })
1483              .then(function(response) {
1484                return response.data;
1485              });
1486        },
1487        setNTPServers: function(ntpServers) {
1488          return $http({
1489                   method: 'PUT',
1490                   url: DataService.getHost() +
1491                       '/xyz/openbmc_project/network/eth0/attr/NTPServers',
1492                   withCredentials: true,
1493                   data: JSON.stringify({'data': ntpServers})
1494                 })
1495              .then(function(response) {
1496                return response.data;
1497              });
1498        },
1499        setTimeMode: function(timeMode) {
1500          return $http({
1501                   method: 'PUT',
1502                   url: DataService.getHost() +
1503                       '/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod',
1504                   withCredentials: true,
1505                   data: JSON.stringify({'data': timeMode})
1506                 })
1507              .then(function(response) {
1508                return response.data;
1509              });
1510        },
1511        setTimeOwner: function(timeOwner) {
1512          return $http({
1513                   method: 'PUT',
1514                   url: DataService.getHost() +
1515                       '/xyz/openbmc_project/time/owner/attr/TimeOwner',
1516                   withCredentials: true,
1517                   data: JSON.stringify({'data': timeOwner})
1518                 })
1519              .then(function(response) {
1520                return response.data;
1521              });
1522        },
1523        setBMCTime: function(time) {
1524          return $http({
1525                   method: 'PUT',
1526                   url: DataService.getHost() +
1527                       '/xyz/openbmc_project/time/bmc/attr/Elapsed',
1528                   withCredentials: true,
1529                   data: JSON.stringify({'data': time})
1530                 })
1531              .then(function(response) {
1532                return response.data;
1533              });
1534        },
1535        setHostTime: function(time) {
1536          return $http({
1537                   method: 'PUT',
1538                   url: DataService.getHost() +
1539                       '/xyz/openbmc_project/time/host/attr/Elapsed',
1540                   withCredentials: true,
1541                   data: JSON.stringify({'data': time})
1542                 })
1543              .then(function(response) {
1544                return response.data;
1545              });
1546        },
1547        getHardwares: function(callback) {
1548          $http({
1549            method: 'GET',
1550            url: DataService.getHost() +
1551                '/xyz/openbmc_project/inventory/enumerate',
1552            withCredentials: true
1553          }).then(function(response) {
1554            var json = JSON.stringify(response.data);
1555            var content = JSON.parse(json);
1556            var hardwareData = [];
1557            var keyIndexMap = {};
1558            var title = '';
1559            var depth = '';
1560            var data = [];
1561            var searchText = '';
1562            var componentIndex = -1;
1563            var parent = '';
1564
1565            function isSubComponent(key) {
1566              for (var i = 0; i < Constants.HARDWARE.parent_components.length;
1567                   i++) {
1568                if (key.split(Constants.HARDWARE.parent_components[i]).length ==
1569                    2)
1570                  return true;
1571              }
1572
1573              return false;
1574            }
1575
1576            function titlelize(title) {
1577              title = title.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1578              for (var i = 0; i < Constants.HARDWARE.uppercase_titles.length;
1579                   i++) {
1580                if (title.toLowerCase().indexOf(
1581                        (Constants.HARDWARE.uppercase_titles[i] + ' ')) > -1) {
1582                  return title.toUpperCase();
1583                }
1584              }
1585
1586              return title;
1587            }
1588
1589            function camelcaseToLabel(obj) {
1590              var transformed = [], label = '', value = '';
1591              for (var key in obj) {
1592                label = key.replace(/([A-Z0-9]+)/g, ' $1').replace(/^\s+/, '');
1593                if (obj[key] !== '') {
1594                  value = obj[key];
1595                  if (value == 1 || value == 0) {
1596                    value = (value == 1) ? 'Yes' : 'No';
1597                  }
1598                  transformed.push({key: label, value: value});
1599                }
1600              }
1601
1602              return transformed;
1603            }
1604
1605            function determineParent(key) {
1606              var levels = key.split('/');
1607              levels.pop();
1608              return levels.join('/');
1609            }
1610
1611            function getSearchText(data) {
1612              var searchText = '';
1613              for (var i = 0; i < data.length; i++) {
1614                searchText += ' ' + data[i].key + ' ' + data[i].value;
1615              }
1616
1617              return searchText;
1618            }
1619
1620            for (var key in content.data) {
1621              if (content.data.hasOwnProperty(key) &&
1622                  key.indexOf(Constants.HARDWARE.component_key_filter) == 0) {
1623                data = camelcaseToLabel(content.data[key]);
1624                searchText = getSearchText(data);
1625                title = key.split('/').pop();
1626
1627                title = titlelize(title);
1628                // e.g. /xyz/openbmc_project/inventory/system and
1629                // /xyz/openbmc_project/inventory/system/chassis are depths of 5
1630                // and 6.
1631                depth = key.split('/').length;
1632                parent = determineParent(key);
1633
1634                if (!isSubComponent(key)) {
1635                  hardwareData.push(Object.assign(
1636                      {
1637                        path: key,
1638                        title: title,
1639                        depth: depth,
1640                        parent: parent,
1641                        selected: false,
1642                        expanded: false,
1643                        search_text: title.toLowerCase() + ' ' +
1644                            searchText.toLowerCase(),
1645                        sub_components: [],
1646                        original_data: {key: key, value: content.data[key]}
1647                      },
1648                      {items: data}));
1649
1650                  keyIndexMap[key] = hardwareData.length - 1;
1651                } else {
1652                  parent = determineParent(key)
1653                  componentIndex = keyIndexMap[parent];
1654                  data = content.data[key];
1655                  data.title = title;
1656                  hardwareData[componentIndex].sub_components.push(data);
1657                  hardwareData[componentIndex].search_text +=
1658                      ' ' + title.toLowerCase();
1659
1660                  // Sort the subcomponents alphanumeric so they are displayed
1661                  // on the inventory page in order (e.g. core 0, core 1, core
1662                  // 2, ... core 12, core 13)
1663                  hardwareData[componentIndex].sub_components.sort(function(
1664                      a, b) {
1665                    return a.title.localeCompare(
1666                        b.title, 'en', {numeric: true});
1667                  });
1668                }
1669              }
1670            }
1671            // First, order the components by depth and then place the child
1672            // components beneath their parent component alphanumerically. Can
1673            // be removed with completion of
1674            // https://github.com/openbmc/openbmc/issues/3401
1675            // TODO: Remove this once implemented in back end
1676            hardwareData.sort(function(a, b) {
1677              if (a.depth < b.depth) return -1;
1678              if (a.depth > b.depth) return 1;
1679              return b.title.localeCompare(a.title, 'en', {numeric: true});
1680            });
1681
1682            var orderedComponents = [];
1683
1684            for (var i = 0; i < hardwareData.length; i++) {
1685              if (!keyIndexMap[hardwareData[i].parent]) {
1686                orderedComponents.push(hardwareData[i]);
1687              } else {
1688                for (var j = 0; j < orderedComponents.length; j++) {
1689                  if (orderedComponents[j].path === hardwareData[i].parent) {
1690                    var child = hardwareData[i];
1691                    orderedComponents.splice(j + 1, 0, child);
1692                  }
1693                }
1694              }
1695            }
1696
1697            if (callback) {
1698              callback(orderedComponents, content.data);
1699            } else {
1700              return {data: orderedComponents, original_data: content.data};
1701            }
1702          });
1703        },
1704        deleteLogs: function(logs) {
1705          var defer = $q.defer();
1706          var promises = [];
1707
1708          function finished() {
1709            defer.resolve();
1710          }
1711
1712          logs.forEach(function(item) {
1713            promises.push($http({
1714              method: 'POST',
1715              url: DataService.getHost() +
1716                  '/xyz/openbmc_project/logging/entry/' + item.Id +
1717                  '/action/Delete',
1718              withCredentials: true,
1719              data: JSON.stringify({'data': []})
1720            }));
1721          });
1722
1723          $q.all(promises).then(finished);
1724
1725          return defer.promise;
1726        },
1727        resolveLogs: function(logs) {
1728          var defer = $q.defer();
1729          var promises = [];
1730
1731          function finished() {
1732            defer.resolve();
1733          }
1734
1735          logs.forEach(function(item) {
1736            promises.push($http({
1737              method: 'PUT',
1738              url: DataService.getHost() +
1739                  '/xyz/openbmc_project/logging/entry/' + item.Id +
1740                  '/attr/Resolved',
1741              withCredentials: true,
1742              data: JSON.stringify({'data': '1'})
1743            }));
1744          });
1745
1746          $q.all(promises).then(finished);
1747
1748          return defer.promise;
1749        },
1750        getPowerConsumption: function() {
1751          return $http({
1752                   method: 'GET',
1753                   url: DataService.getHost() +
1754                       '/xyz/openbmc_project/sensors/power/total_power',
1755                   withCredentials: true
1756                 })
1757              .then(
1758                  function(response) {
1759                    var json = JSON.stringify(response.data);
1760                    var content = JSON.parse(json);
1761
1762                    return getScaledValue(
1763                               content.data.Value, content.data.Scale) +
1764                        ' ' +
1765                        Constants.POWER_CONSUMPTION_TEXT[content.data.Unit];
1766                  },
1767                  function(error) {
1768                    if ('Not Found' == error.statusText) {
1769                      return Constants.POWER_CONSUMPTION_TEXT.notavailable;
1770                    } else {
1771                      throw error;
1772                    }
1773                  });
1774        },
1775        getPowerCap: function() {
1776          return $http({
1777                   method: 'GET',
1778                   url: DataService.getHost() +
1779                       '/xyz/openbmc_project/control/host0/power_cap',
1780                   withCredentials: true
1781                 })
1782              .then(function(response) {
1783                return response.data;
1784              });
1785        },
1786        setPowerCapEnable: function(powerCapEnable) {
1787          return $http({
1788                   method: 'PUT',
1789                   url: DataService.getHost() +
1790                       '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCapEnable',
1791                   withCredentials: true,
1792                   data: JSON.stringify({'data': powerCapEnable})
1793                 })
1794              .then(function(response) {
1795                return response.data;
1796              });
1797        },
1798        setPowerCap: function(powerCap) {
1799          return $http({
1800                   method: 'PUT',
1801                   url: DataService.getHost() +
1802                       '/xyz/openbmc_project/control/host0/power_cap/attr/PowerCap',
1803                   withCredentials: true,
1804                   data: JSON.stringify({'data': powerCap})
1805                 })
1806              .then(function(response) {
1807                return response.data;
1808              });
1809        },
1810        setHostname: function(hostname) {
1811          return $http({
1812                   method: 'PUT',
1813                   url: DataService.getHost() +
1814                       '/xyz/openbmc_project/network/config/attr/HostName',
1815                   withCredentials: true,
1816                   data: JSON.stringify({'data': hostname})
1817                 })
1818              .then(function(response) {
1819                return response.data;
1820              });
1821        },
1822      };
1823      return SERVICE;
1824    }
1825  ]);
1826})(window.angular);
1827