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