1cd789508SIftekharul Islam/** 2cd789508SIftekharul Islam * Controller for power-operations 3cd789508SIftekharul Islam * 4cd789508SIftekharul Islam * @module app/serverControl 5cd789508SIftekharul Islam * @exports powerOperationsController 6cd789508SIftekharul Islam * @name powerOperationsController 7cd789508SIftekharul Islam */ 8cd789508SIftekharul Islam 9cd789508SIftekharul Islamwindow.angular && (function(angular) { 10cd789508SIftekharul Islam 'use strict'; 11cd789508SIftekharul Islam 12d27bb135SAndrew Geissler angular.module('app.serverControl').controller('powerOperationsController', [ 13*5ff98780SYoshie Muranaka '$scope', 'APIUtils', 'dataService', 'Constants', '$interval', '$q', 14*5ff98780SYoshie Muranaka 'toastService', 15d27bb135SAndrew Geissler function( 16*5ff98780SYoshie Muranaka $scope, APIUtils, dataService, Constants, $interval, $q, toastService) { 17cd789508SIftekharul Islam $scope.dataService = dataService; 18aa4734d5SGunnar Mills // Is a || of the other 4 "confirm" variables to ensure only 19aa4734d5SGunnar Mills // one confirm is shown at a time. 20cd789508SIftekharul Islam $scope.confirm = false; 216af5d294SGunnar Mills $scope.confirmWarmReboot = false; 226af5d294SGunnar Mills $scope.confirmColdReboot = false; 236af5d294SGunnar Mills $scope.confirmOrderlyShutdown = false; 246af5d294SGunnar Mills $scope.confirmImmediateShutdown = false; 256add8325SGunnar Mills $scope.loading = true; 26a1d238f3SIftekharul Islam 27*5ff98780SYoshie Muranaka // When a power operation is in progress, set to true, 28*5ff98780SYoshie Muranaka // when a power operation completes (success/fail) set to false. 29*5ff98780SYoshie Muranaka // This property is used to show/hide the 'in progress' message 30*5ff98780SYoshie Muranaka // in markup. 31*5ff98780SYoshie Muranaka $scope.operationPending = false; 32cd789508SIftekharul Islam 33afcfda7bSYoshie Muranaka /** 34afcfda7bSYoshie Muranaka * Checks the host status provided by the dataService using an 35afcfda7bSYoshie Muranaka * interval timer 36afcfda7bSYoshie Muranaka * @param {string} statusType : host status type to check for 37*5ff98780SYoshie Muranaka * @param {number} timeout : timeout limit, defaults to 5 minutes 38*5ff98780SYoshie Muranaka * @param {string} error : error message, defaults to 'Time out' 39afcfda7bSYoshie Muranaka * @returns {Promise} : returns a deferred promise that will be fulfilled 40afcfda7bSYoshie Muranaka * if the status is met or be rejected if the timeout is reached 41afcfda7bSYoshie Muranaka */ 42*5ff98780SYoshie Muranaka var checkHostStatus = 43*5ff98780SYoshie Muranaka (statusType, timeout = 300000, error = 'Time out.') => { 44afcfda7bSYoshie Muranaka const deferred = $q.defer(); 45afcfda7bSYoshie Muranaka const start = new Date(); 46afcfda7bSYoshie Muranaka const checkHostStatusInverval = $interval(() => { 47afcfda7bSYoshie Muranaka let now = new Date(); 48afcfda7bSYoshie Muranaka let timePassed = now.getTime() - start.getTime(); 49afcfda7bSYoshie Muranaka if (timePassed > timeout) { 50afcfda7bSYoshie Muranaka deferred.reject(error); 51afcfda7bSYoshie Muranaka $interval.cancel(checkHostStatusInverval); 52afcfda7bSYoshie Muranaka } 53afcfda7bSYoshie Muranaka if (dataService.server_state === statusType) { 54afcfda7bSYoshie Muranaka deferred.resolve(); 55afcfda7bSYoshie Muranaka $interval.cancel(checkHostStatusInverval); 56afcfda7bSYoshie Muranaka } 57afcfda7bSYoshie Muranaka }, Constants.POLL_INTERVALS.POWER_OP); 58afcfda7bSYoshie Muranaka return deferred.promise; 59afcfda7bSYoshie Muranaka }; 60afcfda7bSYoshie Muranaka 616add8325SGunnar Mills APIUtils.getLastPowerTime() 626add8325SGunnar Mills .then( 635674425bSbeccabroek function(data) { 645674425bSbeccabroek if (data.data == 0) { 656af5d294SGunnar Mills $scope.powerTime = 'not available'; 665674425bSbeccabroek } else { 676af5d294SGunnar Mills $scope.powerTime = data.data; 685674425bSbeccabroek } 695674425bSbeccabroek }, 705674425bSbeccabroek function(error) { 715674425bSbeccabroek console.log(JSON.stringify(error)); 726add8325SGunnar Mills }) 736add8325SGunnar Mills .finally(function() { 746add8325SGunnar Mills $scope.loading = false; 755674425bSbeccabroek }); 766add8325SGunnar Mills 77cd789508SIftekharul Islam $scope.toggleState = function() { 78d27bb135SAndrew Geissler dataService.server_state = 79d27bb135SAndrew Geissler (dataService.server_state == 'Running') ? 'Off' : 'Running'; 80ba5e3f34SAndrew Geissler }; 81cd789508SIftekharul Islam 82*5ff98780SYoshie Muranaka /** 83*5ff98780SYoshie Muranaka * Initiate Power on 84*5ff98780SYoshie Muranaka */ 85*5ff98780SYoshie Muranaka $scope.powerOn = () => { 86*5ff98780SYoshie Muranaka $scope.operationPending = true; 87d80c280bSCamVan Nguyen dataService.setUnreachableState(); 88d27bb135SAndrew Geissler APIUtils.hostPowerOn() 89*5ff98780SYoshie Muranaka .then(() => { 90*5ff98780SYoshie Muranaka // Check for on state 91*5ff98780SYoshie Muranaka return checkHostStatus( 92*5ff98780SYoshie Muranaka Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON, 93*5ff98780SYoshie Muranaka Constants.MESSAGES.POLL.HOST_ON_TIMEOUT); 94d27bb135SAndrew Geissler }) 95*5ff98780SYoshie Muranaka .catch((error) => { 96*5ff98780SYoshie Muranaka console.log(error); 9727ce84d2Sbeccabroek toastService.error(Constants.MESSAGES.POWER_OP.POWER_ON_FAILED); 98*5ff98780SYoshie Muranaka }) 99*5ff98780SYoshie Muranaka .finally(() => { 100*5ff98780SYoshie Muranaka $scope.operationPending = false; 101*5ff98780SYoshie Muranaka }) 102ba5e3f34SAndrew Geissler }; 103a1d238f3SIftekharul Islam 104*5ff98780SYoshie Muranaka /** 105*5ff98780SYoshie Muranaka * Initiate Orderly reboot 106*5ff98780SYoshie Muranaka * Attempts to stop all software 107*5ff98780SYoshie Muranaka */ 108*5ff98780SYoshie Muranaka $scope.warmReboot = () => { 109*5ff98780SYoshie Muranaka $scope.operationPending = true; 110d80c280bSCamVan Nguyen dataService.setUnreachableState(); 111d27bb135SAndrew Geissler APIUtils.hostReboot() 112*5ff98780SYoshie Muranaka .then(() => { 113*5ff98780SYoshie Muranaka // Check for off state 114*5ff98780SYoshie Muranaka return checkHostStatus( 115*5ff98780SYoshie Muranaka Constants.HOST_STATE_TEXT.off, Constants.TIMEOUT.HOST_OFF, 116*5ff98780SYoshie Muranaka Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT); 117d27bb135SAndrew Geissler }) 118*5ff98780SYoshie Muranaka .then(() => { 119*5ff98780SYoshie Muranaka // Check for on state 120*5ff98780SYoshie Muranaka return checkHostStatus( 121*5ff98780SYoshie Muranaka Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON, 122*5ff98780SYoshie Muranaka Constants.MESSAGES.POLL.HOST_ON_TIMEOUT); 123d27bb135SAndrew Geissler }) 124*5ff98780SYoshie Muranaka .catch((error) => { 125*5ff98780SYoshie Muranaka console.log(error); 12627ce84d2Sbeccabroek toastService.error( 12727ce84d2Sbeccabroek Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED); 128*5ff98780SYoshie Muranaka }) 129*5ff98780SYoshie Muranaka .finally(() => { 130*5ff98780SYoshie Muranaka $scope.operationPending = false; 131*5ff98780SYoshie Muranaka }) 132cd789508SIftekharul Islam }; 133834eb010SGunnar Mills 134cd789508SIftekharul Islam $scope.warmRebootConfirm = function() { 135cd789508SIftekharul Islam if ($scope.confirm) { 136aa4734d5SGunnar Mills // If another "confirm" is already shown return 137cd789508SIftekharul Islam return; 138cd789508SIftekharul Islam } 139cd789508SIftekharul Islam $scope.confirm = true; 1406af5d294SGunnar Mills $scope.confirmWarmReboot = true; 141cd789508SIftekharul Islam }; 142cd789508SIftekharul Islam 143*5ff98780SYoshie Muranaka /** 144*5ff98780SYoshie Muranaka * Initiate Immediate reboot 145*5ff98780SYoshie Muranaka * Does not attempt to stop all software 146*5ff98780SYoshie Muranaka */ 147*5ff98780SYoshie Muranaka $scope.coldReboot = () => { 148*5ff98780SYoshie Muranaka $scope.operationPending = true; 149d80c280bSCamVan Nguyen dataService.setUnreachableState(); 150d27bb135SAndrew Geissler APIUtils.chassisPowerOff() 151*5ff98780SYoshie Muranaka .then(() => { 152*5ff98780SYoshie Muranaka // Check for off state 153afcfda7bSYoshie Muranaka return checkHostStatus( 154afcfda7bSYoshie Muranaka Constants.HOST_STATE_TEXT.off, 155afcfda7bSYoshie Muranaka Constants.TIMEOUT.HOST_OFF_IMMEDIATE, 156afcfda7bSYoshie Muranaka Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT); 157d27bb135SAndrew Geissler }) 158*5ff98780SYoshie Muranaka .then(() => { 159afcfda7bSYoshie Muranaka return APIUtils.hostPowerOn(); 160d27bb135SAndrew Geissler }) 161*5ff98780SYoshie Muranaka .then(() => { 162*5ff98780SYoshie Muranaka // Check for on state 163afcfda7bSYoshie Muranaka return checkHostStatus( 164afcfda7bSYoshie Muranaka Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON, 165afcfda7bSYoshie Muranaka Constants.MESSAGES.POLL.HOST_ON_TIMEOUT); 166d27bb135SAndrew Geissler }) 167*5ff98780SYoshie Muranaka .catch((error) => { 168afcfda7bSYoshie Muranaka console.log(error); 16927ce84d2Sbeccabroek toastService.error( 17027ce84d2Sbeccabroek Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED); 171afcfda7bSYoshie Muranaka }) 172*5ff98780SYoshie Muranaka .finally(() => { 173*5ff98780SYoshie Muranaka $scope.operationPending = false; 174afcfda7bSYoshie Muranaka }) 175cd789508SIftekharul Islam }; 176*5ff98780SYoshie Muranaka 177cd789508SIftekharul Islam $scope.coldRebootConfirm = function() { 178cd789508SIftekharul Islam if ($scope.confirm) { 179cd789508SIftekharul Islam return; 180cd789508SIftekharul Islam } 181cd789508SIftekharul Islam $scope.confirm = true; 1826af5d294SGunnar Mills $scope.confirmColdReboot = true; 183cd789508SIftekharul Islam }; 184cd789508SIftekharul Islam 185*5ff98780SYoshie Muranaka /** 186*5ff98780SYoshie Muranaka * Initiate Orderly shutdown 187*5ff98780SYoshie Muranaka * Attempts to stop all software 188*5ff98780SYoshie Muranaka */ 189*5ff98780SYoshie Muranaka $scope.orderlyShutdown = () => { 190*5ff98780SYoshie Muranaka $scope.operationPending = true; 191d80c280bSCamVan Nguyen dataService.setUnreachableState(); 192d27bb135SAndrew Geissler APIUtils.hostPowerOff() 193*5ff98780SYoshie Muranaka .then(() => { 194*5ff98780SYoshie Muranaka // Check for off state 195*5ff98780SYoshie Muranaka return checkHostStatus( 196*5ff98780SYoshie Muranaka Constants.HOST_STATE_TEXT.off, Constants.TIMEOUT.HOST_OFF, 197*5ff98780SYoshie Muranaka Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT); 198d27bb135SAndrew Geissler }) 199*5ff98780SYoshie Muranaka .catch((error) => { 200*5ff98780SYoshie Muranaka console.log(error); 20127ce84d2Sbeccabroek toastService.error( 20292d13b62Sbeccabroek Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED); 203*5ff98780SYoshie Muranaka }) 204*5ff98780SYoshie Muranaka .finally(() => { 205*5ff98780SYoshie Muranaka $scope.operationPending = false; 206*5ff98780SYoshie Muranaka }) 207cd789508SIftekharul Islam }; 208*5ff98780SYoshie Muranaka 209cd789508SIftekharul Islam $scope.orderlyShutdownConfirm = function() { 210cd789508SIftekharul Islam if ($scope.confirm) { 211cd789508SIftekharul Islam return; 212cd789508SIftekharul Islam } 213cd789508SIftekharul Islam $scope.confirm = true; 2146af5d294SGunnar Mills $scope.confirmOrderlyShutdown = true; 215cd789508SIftekharul Islam }; 216cd789508SIftekharul Islam 217*5ff98780SYoshie Muranaka /** 218*5ff98780SYoshie Muranaka * Initiate Immediate shutdown 219*5ff98780SYoshie Muranaka * Does not attempt to stop all software 220*5ff98780SYoshie Muranaka */ 221*5ff98780SYoshie Muranaka $scope.immediateShutdown = () => { 222*5ff98780SYoshie Muranaka $scope.operationPending = true; 223d80c280bSCamVan Nguyen dataService.setUnreachableState(); 224d27bb135SAndrew Geissler APIUtils.chassisPowerOff() 225*5ff98780SYoshie Muranaka .then(() => { 226*5ff98780SYoshie Muranaka // Check for off state 227*5ff98780SYoshie Muranaka return checkHostStatus( 228*5ff98780SYoshie Muranaka Constants.HOST_STATE_TEXT.off, 229*5ff98780SYoshie Muranaka Constants.TIMEOUT.HOST_OFF_IMMEDIATE, 230*5ff98780SYoshie Muranaka Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT); 231d27bb135SAndrew Geissler }) 232*5ff98780SYoshie Muranaka .then(() => { 2333aa8b535SGunnar Mills dataService.setPowerOffState(); 234d27bb135SAndrew Geissler }) 235*5ff98780SYoshie Muranaka .catch((error) => { 236*5ff98780SYoshie Muranaka console.log(error); 23727ce84d2Sbeccabroek toastService.error( 23892d13b62Sbeccabroek Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED); 239*5ff98780SYoshie Muranaka }) 240*5ff98780SYoshie Muranaka .finally(() => { 241*5ff98780SYoshie Muranaka $scope.operationPending = false; 242*5ff98780SYoshie Muranaka }) 243cd789508SIftekharul Islam }; 244*5ff98780SYoshie Muranaka 245cd789508SIftekharul Islam $scope.immediateShutdownConfirm = function() { 246cd789508SIftekharul Islam if ($scope.confirm) { 247cd789508SIftekharul Islam return; 248cd789508SIftekharul Islam } 249cd789508SIftekharul Islam $scope.confirm = true; 2506af5d294SGunnar Mills $scope.confirmImmediateShutdown = true; 251cd789508SIftekharul Islam }; 252cd789508SIftekharul Islam } 253ba5e3f34SAndrew Geissler ]); 254cd789508SIftekharul Islam})(angular); 255