blob: c82d36f6bfa1866be67dd5578368a15014081180 [file] [log] [blame]
Iftekharul Islam99d199f2017-03-24 15:28:25 -05001/**
2 * Controller for power-operations
3 *
Iftekharul Islamcd789502017-04-19 14:37:55 -05004 * @module app/serverControl
Iftekharul Islam99d199f2017-03-24 15:28:25 -05005 * @exports powerOperationsController
6 * @name powerOperationsController
Iftekharul Islam99d199f2017-03-24 15:28:25 -05007 */
8
Andrew Geisslerba5e3f32018-05-24 10:58:00 -07009window.angular && (function(angular) {
10 'use strict';
Iftekharul Islam99d199f2017-03-24 15:28:25 -050011
Andrew Geisslerd27bb132018-05-24 11:07:27 -070012 angular.module('app.serverControl').controller('powerOperationsController', [
13 '$scope', 'APIUtils', 'dataService', 'Constants', '$timeout', '$interval',
beccabroek27ce84d2019-02-05 15:43:17 -060014 '$interpolate', '$q', 'toastService',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070015 function(
16 $scope, APIUtils, dataService, Constants, $timeout, $interval,
beccabroek27ce84d2019-02-05 15:43:17 -060017 $interpolate, $q, toastService) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -070018 $scope.dataService = dataService;
19 $scope.confirm = false;
Gunnar Mills6af5d292019-05-17 14:39:23 -050020 $scope.confirmWarmReboot = false;
21 $scope.confirmColdReboot = false;
22 $scope.confirmOrderlyShutdown = false;
23 $scope.confirmImmediateShutdown = false;
Gunnar Mills6add8322018-09-05 15:16:12 -050024 $scope.loading = true;
Iftekharul Islama1d238f2018-02-26 12:29:45 -060025
Andrew Geisslerd27bb132018-05-24 11:07:27 -070026 var pollChassisStatusTimer = undefined;
Andrew Geisslerd27bb132018-05-24 11:07:27 -070027 var pollStartTime = null;
Iftekharul Islam99d199f2017-03-24 15:28:25 -050028
Gunnar Mills6add8322018-09-05 15:16:12 -050029 APIUtils.getLastPowerTime()
30 .then(
31 function(data) {
32 if (data.data == 0) {
Gunnar Mills6af5d292019-05-17 14:39:23 -050033 $scope.powerTime = 'not available';
Gunnar Mills6add8322018-09-05 15:16:12 -050034 } else {
Gunnar Mills6af5d292019-05-17 14:39:23 -050035 $scope.powerTime = data.data;
Gunnar Mills6add8322018-09-05 15:16:12 -050036 }
37 },
38 function(error) {
39 console.log(JSON.stringify(error));
40 })
41 .finally(function() {
42 $scope.loading = false;
beccabroek56744252018-08-03 11:25:11 -050043 });
Gunnar Mills6add8322018-09-05 15:16:12 -050044
Andrew Geisslerd27bb132018-05-24 11:07:27 -070045 $scope.toggleState = function() {
46 dataService.server_state =
47 (dataService.server_state == 'Running') ? 'Off' : 'Running';
48 };
Iftekharul Islam99d199f2017-03-24 15:28:25 -050049
Andrew Geisslerd27bb132018-05-24 11:07:27 -070050 $scope.powerOn = function() {
51 $scope.loading = true;
52 dataService.setUnreachableState();
53 APIUtils.hostPowerOn()
54 .then(function(response) {
55 return response;
56 })
57 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -050058 return APIUtils.pollHostStatusTillOn();
Andrew Geisslerd27bb132018-05-24 11:07:27 -070059 })
60 .then(function(hostState) {
61 $scope.loading = false;
62 })
63 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -060064 toastService.error(Constants.MESSAGES.POWER_OP.POWER_ON_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -070065 $scope.loading = false;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070066 });
Andrew Geisslerd27bb132018-05-24 11:07:27 -070067 };
CamVan Nguyend80c2802018-04-17 19:25:16 -050068
Andrew Geisslerd27bb132018-05-24 11:07:27 -070069 function pollChassisStatusTillOff() {
70 var deferred = $q.defer();
71 pollChassisStatusTimer = $interval(function() {
72 var now = new Date();
73 if ((now.getTime() - pollStartTime.getTime()) >=
74 Constants.TIMEOUT.CHASSIS_OFF) {
75 $interval.cancel(pollChassisStatusTimer);
76 pollChassisStatusTimer = undefined;
77 deferred.reject(
78 new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT));
79 }
80 APIUtils.getChassisState()
81 .then(function(state) {
82 if (state === Constants.CHASSIS_POWER_STATE.off_code) {
83 $interval.cancel(pollChassisStatusTimer);
84 pollChassisStatusTimer = undefined;
85 deferred.resolve(state);
86 }
87 })
88 .catch(function(error) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070089 $interval.cancel(pollChassisStatusTimer);
90 pollChassisStatusTimer = undefined;
Andrew Geisslerd27bb132018-05-24 11:07:27 -070091 deferred.reject(error);
92 });
93 }, Constants.POLL_INTERVALS.POWER_OP);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070094
Andrew Geisslerd27bb132018-05-24 11:07:27 -070095 return deferred.promise;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070096 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -070097 $scope.warmReboot = function() {
98 $scope.loading = true;
99 dataService.setUnreachableState();
100 APIUtils.hostReboot()
101 .then(function(response) {
102 return response;
103 })
104 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -0500105 return APIUtils.pollHostStatusTilReboot();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700106 })
107 .then(function(hostState) {
108 $scope.loading = false;
109 })
110 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600111 toastService.error(
112 Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700113 $scope.loading = false;
114 });
115 };
Gunnar Mills834eb012019-05-17 14:58:06 -0500116
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700117 $scope.warmRebootConfirm = function() {
118 if ($scope.confirm) {
119 return;
120 }
121 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500122 $scope.confirmWarmReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700123 };
124
125 $scope.coldReboot = function() {
126 $scope.loading = true;
127 dataService.setUnreachableState();
128 APIUtils.chassisPowerOff()
129 .then(function(state) {
130 return state;
131 })
132 .then(function(lastState) {
133 pollStartTime = new Date();
134 return pollChassisStatusTillOff();
135 })
136 .then(function(chassisState) {
137 return APIUtils.hostPowerOn().then(function(hostState) {
138 return hostState;
139 });
140 })
141 .then(function(hostState) {
beccabroekc3abaa92018-08-14 13:47:18 -0500142 return APIUtils.pollHostStatusTillOn();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700143 })
144 .then(function(state) {
145 $scope.loading = false;
146 })
147 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600148 toastService.error(
149 Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700150 $scope.loading = false;
151 });
152 };
153 $scope.coldRebootConfirm = function() {
154 if ($scope.confirm) {
155 return;
156 }
157 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500158 $scope.confirmColdReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700159 };
160
161 $scope.orderlyShutdown = function() {
162 $scope.loading = true;
163 dataService.setUnreachableState();
164 APIUtils.hostPowerOff()
165 .then(function(response) {
166 return response;
167 })
168 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -0500169 return APIUtils.pollHostStatusTillOff();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700170 })
171 .then(function(hostState) {
172 pollStartTime = new Date();
173 return pollChassisStatusTillOff();
174 })
175 .then(function(chassisState) {
176 $scope.loading = false;
177 })
178 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600179 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600180 Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700181 $scope.loading = false;
182 });
183 };
184 $scope.orderlyShutdownConfirm = function() {
185 if ($scope.confirm) {
186 return;
187 }
188 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500189 $scope.confirmOrderlyShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700190 };
191
192 $scope.immediateShutdown = function() {
193 $scope.loading = true;
194 dataService.setUnreachableState();
195 APIUtils.chassisPowerOff()
196 .then(function(response) {
197 return response;
198 })
199 .then(function(lastStatus) {
200 pollStartTime = new Date();
201 return pollChassisStatusTillOff();
202 })
203 .then(function(chassisState) {
204 dataService.setPowerOffState();
205 $scope.loading = false;
206 })
207 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600208 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600209 Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700210 $scope.loading = false;
211 });
212 };
213 $scope.immediateShutdownConfirm = function() {
214 if ($scope.confirm) {
215 return;
216 }
217 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500218 $scope.confirmImmediateShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700219 };
220 }
221 ]);
Iftekharul Islam99d199f2017-03-24 15:28:25 -0500222})(angular);