blob: 2030b4d365285d733098772fa101bf5dfd620154 [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',
Gunnar Millsa1b5fb62019-05-17 16:36:10 -050014 '$q', 'toastService',
Andrew Geisslerd27bb132018-05-24 11:07:27 -070015 function(
Gunnar Millsa1b5fb62019-05-17 16:36:10 -050016 $scope, APIUtils, dataService, Constants, $timeout, $interval, $q,
17 toastService) {
Andrew Geisslerd27bb132018-05-24 11:07:27 -070018 $scope.dataService = dataService;
Gunnar Millsaa4734d2019-05-17 15:56:18 -050019 // Is a || of the other 4 "confirm" variables to ensure only
20 // one confirm is shown at a time.
Andrew Geisslerd27bb132018-05-24 11:07:27 -070021 $scope.confirm = false;
Gunnar Mills6af5d292019-05-17 14:39:23 -050022 $scope.confirmWarmReboot = false;
23 $scope.confirmColdReboot = false;
24 $scope.confirmOrderlyShutdown = false;
25 $scope.confirmImmediateShutdown = false;
Gunnar Mills6add8322018-09-05 15:16:12 -050026 $scope.loading = true;
Iftekharul Islama1d238f2018-02-26 12:29:45 -060027
Andrew Geisslerd27bb132018-05-24 11:07:27 -070028 var pollChassisStatusTimer = undefined;
Andrew Geisslerd27bb132018-05-24 11:07:27 -070029 var pollStartTime = null;
Iftekharul Islam99d199f2017-03-24 15:28:25 -050030
Gunnar Mills6add8322018-09-05 15:16:12 -050031 APIUtils.getLastPowerTime()
32 .then(
33 function(data) {
34 if (data.data == 0) {
Gunnar Mills6af5d292019-05-17 14:39:23 -050035 $scope.powerTime = 'not available';
Gunnar Mills6add8322018-09-05 15:16:12 -050036 } else {
Gunnar Mills6af5d292019-05-17 14:39:23 -050037 $scope.powerTime = data.data;
Gunnar Mills6add8322018-09-05 15:16:12 -050038 }
39 },
40 function(error) {
41 console.log(JSON.stringify(error));
42 })
43 .finally(function() {
44 $scope.loading = false;
beccabroek56744252018-08-03 11:25:11 -050045 });
Gunnar Mills6add8322018-09-05 15:16:12 -050046
Andrew Geisslerd27bb132018-05-24 11:07:27 -070047 $scope.toggleState = function() {
48 dataService.server_state =
49 (dataService.server_state == 'Running') ? 'Off' : 'Running';
50 };
Iftekharul Islam99d199f2017-03-24 15:28:25 -050051
Andrew Geisslerd27bb132018-05-24 11:07:27 -070052 $scope.powerOn = function() {
53 $scope.loading = true;
54 dataService.setUnreachableState();
55 APIUtils.hostPowerOn()
56 .then(function(response) {
57 return response;
58 })
59 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -050060 return APIUtils.pollHostStatusTillOn();
Andrew Geisslerd27bb132018-05-24 11:07:27 -070061 })
62 .then(function(hostState) {
63 $scope.loading = false;
64 })
65 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -060066 toastService.error(Constants.MESSAGES.POWER_OP.POWER_ON_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -070067 $scope.loading = false;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070068 });
Andrew Geisslerd27bb132018-05-24 11:07:27 -070069 };
CamVan Nguyend80c2802018-04-17 19:25:16 -050070
Andrew Geisslerd27bb132018-05-24 11:07:27 -070071 function pollChassisStatusTillOff() {
72 var deferred = $q.defer();
73 pollChassisStatusTimer = $interval(function() {
74 var now = new Date();
75 if ((now.getTime() - pollStartTime.getTime()) >=
76 Constants.TIMEOUT.CHASSIS_OFF) {
77 $interval.cancel(pollChassisStatusTimer);
78 pollChassisStatusTimer = undefined;
79 deferred.reject(
80 new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT));
81 }
82 APIUtils.getChassisState()
83 .then(function(state) {
84 if (state === Constants.CHASSIS_POWER_STATE.off_code) {
85 $interval.cancel(pollChassisStatusTimer);
86 pollChassisStatusTimer = undefined;
87 deferred.resolve(state);
88 }
89 })
90 .catch(function(error) {
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070091 $interval.cancel(pollChassisStatusTimer);
92 pollChassisStatusTimer = undefined;
Andrew Geisslerd27bb132018-05-24 11:07:27 -070093 deferred.reject(error);
94 });
95 }, Constants.POLL_INTERVALS.POWER_OP);
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070096
Andrew Geisslerd27bb132018-05-24 11:07:27 -070097 return deferred.promise;
Andrew Geisslerba5e3f32018-05-24 10:58:00 -070098 }
Andrew Geisslerd27bb132018-05-24 11:07:27 -070099 $scope.warmReboot = function() {
100 $scope.loading = true;
101 dataService.setUnreachableState();
102 APIUtils.hostReboot()
103 .then(function(response) {
104 return response;
105 })
106 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -0500107 return APIUtils.pollHostStatusTilReboot();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700108 })
109 .then(function(hostState) {
110 $scope.loading = false;
111 })
112 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600113 toastService.error(
114 Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700115 $scope.loading = false;
116 });
117 };
Gunnar Mills834eb012019-05-17 14:58:06 -0500118
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700119 $scope.warmRebootConfirm = function() {
120 if ($scope.confirm) {
Gunnar Millsaa4734d2019-05-17 15:56:18 -0500121 // If another "confirm" is already shown return
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700122 return;
123 }
124 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500125 $scope.confirmWarmReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700126 };
127
128 $scope.coldReboot = function() {
129 $scope.loading = true;
130 dataService.setUnreachableState();
131 APIUtils.chassisPowerOff()
132 .then(function(state) {
133 return state;
134 })
135 .then(function(lastState) {
136 pollStartTime = new Date();
137 return pollChassisStatusTillOff();
138 })
139 .then(function(chassisState) {
140 return APIUtils.hostPowerOn().then(function(hostState) {
141 return hostState;
142 });
143 })
144 .then(function(hostState) {
beccabroekc3abaa92018-08-14 13:47:18 -0500145 return APIUtils.pollHostStatusTillOn();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700146 })
147 .then(function(state) {
148 $scope.loading = false;
149 })
150 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600151 toastService.error(
152 Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700153 $scope.loading = false;
154 });
155 };
156 $scope.coldRebootConfirm = function() {
157 if ($scope.confirm) {
158 return;
159 }
160 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500161 $scope.confirmColdReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700162 };
163
164 $scope.orderlyShutdown = function() {
165 $scope.loading = true;
166 dataService.setUnreachableState();
167 APIUtils.hostPowerOff()
168 .then(function(response) {
169 return response;
170 })
171 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -0500172 return APIUtils.pollHostStatusTillOff();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700173 })
174 .then(function(hostState) {
175 pollStartTime = new Date();
176 return pollChassisStatusTillOff();
177 })
178 .then(function(chassisState) {
179 $scope.loading = false;
180 })
181 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600182 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600183 Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700184 $scope.loading = false;
185 });
186 };
187 $scope.orderlyShutdownConfirm = function() {
188 if ($scope.confirm) {
189 return;
190 }
191 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500192 $scope.confirmOrderlyShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700193 };
194
195 $scope.immediateShutdown = function() {
196 $scope.loading = true;
197 dataService.setUnreachableState();
198 APIUtils.chassisPowerOff()
199 .then(function(response) {
200 return response;
201 })
202 .then(function(lastStatus) {
203 pollStartTime = new Date();
204 return pollChassisStatusTillOff();
205 })
206 .then(function(chassisState) {
207 dataService.setPowerOffState();
208 $scope.loading = false;
209 })
210 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600211 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600212 Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700213 $scope.loading = false;
214 });
215 };
216 $scope.immediateShutdownConfirm = function() {
217 if ($scope.confirm) {
218 return;
219 }
220 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500221 $scope.confirmImmediateShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700222 };
223 }
224 ]);
Iftekharul Islam99d199f2017-03-24 15:28:25 -0500225})(angular);