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', [ 13d27bb135SAndrew Geissler '$scope', 'APIUtils', 'dataService', 'Constants', '$timeout', '$interval', 14d27bb135SAndrew Geissler '$interpolate', '$q', 15d27bb135SAndrew Geissler function( 16d27bb135SAndrew Geissler $scope, APIUtils, dataService, Constants, $timeout, $interval, 17d27bb135SAndrew Geissler $interpolate, $q) { 18cd789508SIftekharul Islam $scope.dataService = dataService; 19cd789508SIftekharul Islam $scope.confirm = false; 20cd789508SIftekharul Islam $scope.power_confirm = false; 21cd789508SIftekharul Islam $scope.warmboot_confirm = false; 22cd789508SIftekharul Islam $scope.coldboot_confirm = false; 23cd789508SIftekharul Islam $scope.orderly_confirm = false; 24cd789508SIftekharul Islam $scope.immediately_confirm = false; 25a1d238f3SIftekharul Islam $scope.loading = false; 26a1d238f3SIftekharul Islam 27a1d238f3SIftekharul Islam var pollChassisStatusTimer = undefined; 28a1d238f3SIftekharul Islam var pollHostStatusTimer = undefined; 29a1d238f3SIftekharul Islam var pollStartTime = null; 30cd789508SIftekharul Islam 31cd789508SIftekharul Islam //@TODO: call api and get proper state 32*5674425bSbeccabroek 33*5674425bSbeccabroek APIUtils.getLastPowerTime().then( 34*5674425bSbeccabroek function(data) { 35*5674425bSbeccabroek if (data.data == 0) { 36*5674425bSbeccabroek $scope.power_time = 'not available'; 37*5674425bSbeccabroek } else { 38*5674425bSbeccabroek $scope.power_time = data.data; 39*5674425bSbeccabroek } 40*5674425bSbeccabroek }, 41*5674425bSbeccabroek function(error) { 42*5674425bSbeccabroek console.log(JSON.stringify(error)); 43*5674425bSbeccabroek }); 44cd789508SIftekharul Islam $scope.toggleState = function() { 45d27bb135SAndrew Geissler dataService.server_state = 46d27bb135SAndrew Geissler (dataService.server_state == 'Running') ? 'Off' : 'Running'; 47ba5e3f34SAndrew Geissler }; 48cd789508SIftekharul Islam 49d80c280bSCamVan Nguyen $scope.powerOn = function() { 50d80c280bSCamVan Nguyen $scope.loading = true; 51d80c280bSCamVan Nguyen dataService.setUnreachableState(); 52d27bb135SAndrew Geissler APIUtils.hostPowerOn() 53d27bb135SAndrew Geissler .then(function(response) { 54d80c280bSCamVan Nguyen return response; 55d27bb135SAndrew Geissler }) 56d27bb135SAndrew Geissler .then(function(lastStatus) { 57d80c280bSCamVan Nguyen pollStartTime = new Date(); 58d80c280bSCamVan Nguyen return pollHostStatusTillOn(); 59d27bb135SAndrew Geissler }) 60d27bb135SAndrew Geissler .then(function(hostState) { 61d80c280bSCamVan Nguyen $scope.loading = false; 62d27bb135SAndrew Geissler }) 63d27bb135SAndrew Geissler .catch(function(error) { 64ba5e3f34SAndrew Geissler dataService.activateErrorModal({ 65ba5e3f34SAndrew Geissler title: Constants.MESSAGES.POWER_OP.POWER_ON_FAILED, 66d80c280bSCamVan Nguyen description: error.statusText ? 67d27bb135SAndrew Geissler $interpolate( 68d27bb135SAndrew Geissler Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)( 69d27bb135SAndrew Geissler {status: error.status, description: error.statusText}) : 70d27bb135SAndrew Geissler error 71ba5e3f34SAndrew Geissler }); 72d80c280bSCamVan Nguyen $scope.loading = false; 73cd789508SIftekharul Islam }); 74ba5e3f34SAndrew Geissler }; 75cd789508SIftekharul Islam $scope.powerOnConfirm = function() { 76cd789508SIftekharul Islam if ($scope.confirm) { 77cd789508SIftekharul Islam return; 78cd789508SIftekharul Islam } 79cd789508SIftekharul Islam $scope.confirm = true; 80cd789508SIftekharul Islam $scope.power_confirm = true; 81cd789508SIftekharul Islam }; 82a1d238f3SIftekharul Islam 83a1d238f3SIftekharul Islam function pollChassisStatusTillOff() { 84a1d238f3SIftekharul Islam var deferred = $q.defer(); 85a1d238f3SIftekharul Islam pollChassisStatusTimer = $interval(function() { 86a1d238f3SIftekharul Islam var now = new Date(); 87d27bb135SAndrew Geissler if ((now.getTime() - pollStartTime.getTime()) >= 88d27bb135SAndrew Geissler Constants.TIMEOUT.CHASSIS_OFF) { 89a1d238f3SIftekharul Islam $interval.cancel(pollChassisStatusTimer); 90a1d238f3SIftekharul Islam pollChassisStatusTimer = undefined; 91d27bb135SAndrew Geissler deferred.reject( 92d27bb135SAndrew Geissler new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT)); 93a1d238f3SIftekharul Islam } 94d27bb135SAndrew Geissler APIUtils.getChassisState() 95d27bb135SAndrew Geissler .then(function(state) { 96a1d238f3SIftekharul Islam if (state === Constants.CHASSIS_POWER_STATE.off_code) { 97a1d238f3SIftekharul Islam $interval.cancel(pollChassisStatusTimer); 98a1d238f3SIftekharul Islam pollChassisStatusTimer = undefined; 99a1d238f3SIftekharul Islam deferred.resolve(state); 100a1d238f3SIftekharul Islam } 101d27bb135SAndrew Geissler }) 102d27bb135SAndrew Geissler .catch(function(error) { 103a1d238f3SIftekharul Islam $interval.cancel(pollChassisStatusTimer); 104a1d238f3SIftekharul Islam pollChassisStatusTimer = undefined; 105a1d238f3SIftekharul Islam deferred.reject(error); 106a1d238f3SIftekharul Islam }); 107a1d238f3SIftekharul Islam }, Constants.POLL_INTERVALS.POWER_OP); 108a1d238f3SIftekharul Islam 109a1d238f3SIftekharul Islam return deferred.promise; 110a1d238f3SIftekharul Islam } 111ba5e3f34SAndrew Geissler 112a1d238f3SIftekharul Islam function pollHostStatusTillOn() { 113a1d238f3SIftekharul Islam var deferred = $q.defer(); 114a1d238f3SIftekharul Islam pollHostStatusTimer = $interval(function() { 115a1d238f3SIftekharul Islam var now = new Date(); 116d27bb135SAndrew Geissler if ((now.getTime() - pollStartTime.getTime()) >= 117d27bb135SAndrew Geissler Constants.TIMEOUT.HOST_ON) { 118a1d238f3SIftekharul Islam $interval.cancel(pollHostStatusTimer); 119a1d238f3SIftekharul Islam pollHostStatusTimer = undefined; 120d80c280bSCamVan Nguyen deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT)); 121a1d238f3SIftekharul Islam } 122d27bb135SAndrew Geissler APIUtils.getHostState() 123d27bb135SAndrew Geissler .then(function(state) { 124a1d238f3SIftekharul Islam if (state === Constants.HOST_STATE_TEXT.on_code) { 125a1d238f3SIftekharul Islam $interval.cancel(pollHostStatusTimer); 126a1d238f3SIftekharul Islam pollHostStatusTimer = undefined; 127a1d238f3SIftekharul Islam deferred.resolve(state); 128d27bb135SAndrew Geissler } else if (state === Constants.HOST_STATE_TEXT.error_code) { 129d80c280bSCamVan Nguyen $interval.cancel(pollHostStatusTimer); 130d80c280bSCamVan Nguyen pollHostStatusTimer = undefined; 131d27bb135SAndrew Geissler deferred.reject( 132d27bb135SAndrew Geissler new Error(Constants.MESSAGES.POLL.HOST_QUIESCED)); 133d80c280bSCamVan Nguyen } 134d27bb135SAndrew Geissler }) 135d27bb135SAndrew Geissler .catch(function(error) { 136d80c280bSCamVan Nguyen $interval.cancel(pollHostStatusTimer); 137d80c280bSCamVan Nguyen pollHostStatusTimer = undefined; 138d80c280bSCamVan Nguyen deferred.reject(error); 139d80c280bSCamVan Nguyen }); 140d80c280bSCamVan Nguyen }, Constants.POLL_INTERVALS.POWER_OP); 141d80c280bSCamVan Nguyen 142d80c280bSCamVan Nguyen return deferred.promise; 143d80c280bSCamVan Nguyen } 144ba5e3f34SAndrew Geissler 145d80c280bSCamVan Nguyen function pollHostStatusTillOff() { 146d80c280bSCamVan Nguyen var deferred = $q.defer(); 147d80c280bSCamVan Nguyen pollHostStatusTimer = $interval(function() { 148d80c280bSCamVan Nguyen var now = new Date(); 149d27bb135SAndrew Geissler if ((now.getTime() - pollStartTime.getTime()) >= 150d27bb135SAndrew Geissler Constants.TIMEOUT.HOST_OFF) { 151d80c280bSCamVan Nguyen $interval.cancel(pollHostStatusTimer); 152d80c280bSCamVan Nguyen pollHostStatusTimer = undefined; 153d27bb135SAndrew Geissler deferred.reject( 154d27bb135SAndrew Geissler new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT)); 155d80c280bSCamVan Nguyen } 156d27bb135SAndrew Geissler APIUtils.getHostState() 157d27bb135SAndrew Geissler .then(function(state) { 158d80c280bSCamVan Nguyen if (state === Constants.HOST_STATE_TEXT.off_code) { 159d80c280bSCamVan Nguyen $interval.cancel(pollHostStatusTimer); 160d80c280bSCamVan Nguyen pollHostStatusTimer = undefined; 161d80c280bSCamVan Nguyen deferred.resolve(state); 162a1d238f3SIftekharul Islam } 163d27bb135SAndrew Geissler }) 164d27bb135SAndrew Geissler .catch(function(error) { 165a1d238f3SIftekharul Islam $interval.cancel(pollHostStatusTimer); 166a1d238f3SIftekharul Islam pollHostStatusTimer = undefined; 167a1d238f3SIftekharul Islam deferred.reject(error); 168a1d238f3SIftekharul Islam }); 169a1d238f3SIftekharul Islam }, Constants.POLL_INTERVALS.POWER_OP); 170a1d238f3SIftekharul Islam 171a1d238f3SIftekharul Islam return deferred.promise; 172a1d238f3SIftekharul Islam } 173cd789508SIftekharul Islam $scope.warmReboot = function() { 174d80c280bSCamVan Nguyen $scope.loading = true; 175d80c280bSCamVan Nguyen dataService.setUnreachableState(); 176d27bb135SAndrew Geissler APIUtils.hostReboot() 177d27bb135SAndrew Geissler .then(function(response) { 178d80c280bSCamVan Nguyen return response; 179d27bb135SAndrew Geissler }) 180d27bb135SAndrew Geissler .then(function(lastStatus) { 181d80c280bSCamVan Nguyen pollStartTime = new Date(); 182d80c280bSCamVan Nguyen return pollHostStatusTillOff(); 183d27bb135SAndrew Geissler }) 184d27bb135SAndrew Geissler .then(function(hostState) { 185d80c280bSCamVan Nguyen pollStartTime = new Date(); 186d80c280bSCamVan Nguyen return pollHostStatusTillOn(); 187d27bb135SAndrew Geissler }) 188d27bb135SAndrew Geissler .then(function(hostState) { 189d80c280bSCamVan Nguyen $scope.loading = false; 190d27bb135SAndrew Geissler }) 191d27bb135SAndrew Geissler .catch(function(error) { 192ba5e3f34SAndrew Geissler dataService.activateErrorModal({ 193ba5e3f34SAndrew Geissler title: Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED, 194d80c280bSCamVan Nguyen description: error.statusText ? 195d27bb135SAndrew Geissler $interpolate( 196d27bb135SAndrew Geissler Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)( 197d27bb135SAndrew Geissler {status: error.status, description: error.statusText}) : 198d27bb135SAndrew Geissler error 199ba5e3f34SAndrew Geissler }); 200d80c280bSCamVan Nguyen $scope.loading = false; 201cd789508SIftekharul Islam }); 202cd789508SIftekharul Islam }; 203cd789508SIftekharul Islam $scope.testState = function() { 204cd789508SIftekharul Islam $timeout(function() { 205cd789508SIftekharul Islam dataService.setPowerOffState(); 206cd789508SIftekharul Islam $timeout(function() { 207cd789508SIftekharul Islam dataService.setPowerOnState(); 208cd789508SIftekharul Islam }, 2000); 209cd789508SIftekharul Islam }, 1000); 210cd789508SIftekharul Islam }; 211cd789508SIftekharul Islam $scope.warmRebootConfirm = function() { 212cd789508SIftekharul Islam if ($scope.confirm) { 213cd789508SIftekharul Islam return; 214cd789508SIftekharul Islam } 215cd789508SIftekharul Islam $scope.confirm = true; 216cd789508SIftekharul Islam $scope.warmboot_confirm = true; 217cd789508SIftekharul Islam }; 218cd789508SIftekharul Islam 219cd789508SIftekharul Islam $scope.coldReboot = function() { 220a1d238f3SIftekharul Islam $scope.loading = true; 221d80c280bSCamVan Nguyen dataService.setUnreachableState(); 222d27bb135SAndrew Geissler APIUtils.chassisPowerOff() 223d27bb135SAndrew Geissler .then(function(state) { 224a1d238f3SIftekharul Islam return state; 225d27bb135SAndrew Geissler }) 226d27bb135SAndrew Geissler .then(function(lastState) { 227a1d238f3SIftekharul Islam pollStartTime = new Date(); 228a1d238f3SIftekharul Islam return pollChassisStatusTillOff(); 229d27bb135SAndrew Geissler }) 230d27bb135SAndrew Geissler .then(function(chassisState) { 231d80c280bSCamVan Nguyen return APIUtils.hostPowerOn().then(function(hostState) { 232a1d238f3SIftekharul Islam return hostState; 233ba5e3f34SAndrew Geissler }); 234d27bb135SAndrew Geissler }) 235d27bb135SAndrew Geissler .then(function(hostState) { 236a1d238f3SIftekharul Islam pollStartTime = new Date(); 237a1d238f3SIftekharul Islam return pollHostStatusTillOn(); 238d27bb135SAndrew Geissler }) 239d27bb135SAndrew Geissler .then(function(state) { 240a1d238f3SIftekharul Islam $scope.loading = false; 241d27bb135SAndrew Geissler }) 242d27bb135SAndrew Geissler .catch(function(error) { 243ba5e3f34SAndrew Geissler dataService.activateErrorModal({ 244ba5e3f34SAndrew Geissler title: Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED, 245d80c280bSCamVan Nguyen description: error.statusText ? 246d27bb135SAndrew Geissler $interpolate( 247d27bb135SAndrew Geissler Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)( 248d27bb135SAndrew Geissler {status: error.status, description: error.statusText}) : 249d27bb135SAndrew Geissler error 250ba5e3f34SAndrew Geissler }); 251a1d238f3SIftekharul Islam $scope.loading = false; 252a1d238f3SIftekharul Islam }); 253cd789508SIftekharul Islam }; 254cd789508SIftekharul Islam $scope.coldRebootConfirm = function() { 255cd789508SIftekharul Islam if ($scope.confirm) { 256cd789508SIftekharul Islam return; 257cd789508SIftekharul Islam } 258cd789508SIftekharul Islam $scope.confirm = true; 259cd789508SIftekharul Islam $scope.coldboot_confirm = true; 260cd789508SIftekharul Islam }; 261cd789508SIftekharul Islam 262cd789508SIftekharul Islam $scope.orderlyShutdown = function() { 263d80c280bSCamVan Nguyen $scope.loading = true; 264d80c280bSCamVan Nguyen dataService.setUnreachableState(); 265d27bb135SAndrew Geissler APIUtils.hostPowerOff() 266d27bb135SAndrew Geissler .then(function(response) { 267d80c280bSCamVan Nguyen return response; 268d27bb135SAndrew Geissler }) 269d27bb135SAndrew Geissler .then(function(lastStatus) { 270d80c280bSCamVan Nguyen pollStartTime = new Date(); 271ba5e3f34SAndrew Geissler return pollHostStatusTillOff(); 272d27bb135SAndrew Geissler }) 273d27bb135SAndrew Geissler .then(function(hostState) { 274d80c280bSCamVan Nguyen pollStartTime = new Date(); 275d80c280bSCamVan Nguyen return pollChassisStatusTillOff(); 276d27bb135SAndrew Geissler }) 277d27bb135SAndrew Geissler .then(function(chassisState) { 278d80c280bSCamVan Nguyen $scope.loading = false; 279d27bb135SAndrew Geissler }) 280d27bb135SAndrew Geissler .catch(function(error) { 281ba5e3f34SAndrew Geissler dataService.activateErrorModal({ 282ba5e3f34SAndrew Geissler title: Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED, 283d80c280bSCamVan Nguyen description: error.statusText ? 284d27bb135SAndrew Geissler $interpolate( 285d27bb135SAndrew Geissler Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)( 286d27bb135SAndrew Geissler {status: error.status, description: error.statusText}) : 287d27bb135SAndrew Geissler error 288ba5e3f34SAndrew Geissler }); 289d80c280bSCamVan Nguyen $scope.loading = false; 290cd789508SIftekharul Islam }); 291cd789508SIftekharul Islam }; 292cd789508SIftekharul Islam $scope.orderlyShutdownConfirm = function() { 293cd789508SIftekharul Islam if ($scope.confirm) { 294cd789508SIftekharul Islam return; 295cd789508SIftekharul Islam } 296cd789508SIftekharul Islam $scope.confirm = true; 297cd789508SIftekharul Islam $scope.orderly_confirm = true; 298cd789508SIftekharul Islam }; 299cd789508SIftekharul Islam 300cd789508SIftekharul Islam $scope.immediateShutdown = function() { 301d80c280bSCamVan Nguyen $scope.loading = true; 302d80c280bSCamVan Nguyen dataService.setUnreachableState(); 303d27bb135SAndrew Geissler APIUtils.chassisPowerOff() 304d27bb135SAndrew Geissler .then(function(response) { 305d80c280bSCamVan Nguyen return response; 306d27bb135SAndrew Geissler }) 307d27bb135SAndrew Geissler .then(function(lastStatus) { 308d80c280bSCamVan Nguyen pollStartTime = new Date(); 309d80c280bSCamVan Nguyen return pollChassisStatusTillOff(); 310d27bb135SAndrew Geissler }) 311d27bb135SAndrew Geissler .then(function(chassisState) { 3123aa8b535SGunnar Mills dataService.setPowerOffState(); 313d80c280bSCamVan Nguyen $scope.loading = false; 314d27bb135SAndrew Geissler }) 315d27bb135SAndrew Geissler .catch(function(error) { 316ba5e3f34SAndrew Geissler dataService.activateErrorModal({ 317ba5e3f34SAndrew Geissler title: Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED, 318d80c280bSCamVan Nguyen description: error.statusText ? 319d27bb135SAndrew Geissler $interpolate( 320d27bb135SAndrew Geissler Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)( 321d27bb135SAndrew Geissler {status: error.status, description: error.statusText}) : 322d27bb135SAndrew Geissler error 323ba5e3f34SAndrew Geissler }); 324d80c280bSCamVan Nguyen $scope.loading = false; 3253aa8b535SGunnar Mills }); 326cd789508SIftekharul Islam }; 327cd789508SIftekharul Islam $scope.immediateShutdownConfirm = function() { 328cd789508SIftekharul Islam if ($scope.confirm) { 329cd789508SIftekharul Islam return; 330cd789508SIftekharul Islam } 331cd789508SIftekharul Islam $scope.confirm = true; 332cd789508SIftekharul Islam $scope.immediately_confirm = true; 333cd789508SIftekharul Islam }; 334cd789508SIftekharul Islam } 335ba5e3f34SAndrew Geissler ]); 336cd789508SIftekharul Islam})(angular); 337