blob: 1ffb463c4bb3b76bbe3083b2db1ae8f0eedff30a [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
Andrew Geisslerd27bb132018-05-24 11:07:27 -070029 //@TODO: call api and get proper state
beccabroek56744252018-08-03 11:25:11 -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 };
118 $scope.testState = function() {
119 $timeout(function() {
120 dataService.setPowerOffState();
121 $timeout(function() {
122 dataService.setPowerOnState();
123 }, 2000);
124 }, 1000);
125 };
126 $scope.warmRebootConfirm = function() {
127 if ($scope.confirm) {
128 return;
129 }
130 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500131 $scope.confirmWarmReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700132 };
133
134 $scope.coldReboot = function() {
135 $scope.loading = true;
136 dataService.setUnreachableState();
137 APIUtils.chassisPowerOff()
138 .then(function(state) {
139 return state;
140 })
141 .then(function(lastState) {
142 pollStartTime = new Date();
143 return pollChassisStatusTillOff();
144 })
145 .then(function(chassisState) {
146 return APIUtils.hostPowerOn().then(function(hostState) {
147 return hostState;
148 });
149 })
150 .then(function(hostState) {
beccabroekc3abaa92018-08-14 13:47:18 -0500151 return APIUtils.pollHostStatusTillOn();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700152 })
153 .then(function(state) {
154 $scope.loading = false;
155 })
156 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600157 toastService.error(
158 Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700159 $scope.loading = false;
160 });
161 };
162 $scope.coldRebootConfirm = function() {
163 if ($scope.confirm) {
164 return;
165 }
166 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500167 $scope.confirmColdReboot = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700168 };
169
170 $scope.orderlyShutdown = function() {
171 $scope.loading = true;
172 dataService.setUnreachableState();
173 APIUtils.hostPowerOff()
174 .then(function(response) {
175 return response;
176 })
177 .then(function(lastStatus) {
beccabroekc3abaa92018-08-14 13:47:18 -0500178 return APIUtils.pollHostStatusTillOff();
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700179 })
180 .then(function(hostState) {
181 pollStartTime = new Date();
182 return pollChassisStatusTillOff();
183 })
184 .then(function(chassisState) {
185 $scope.loading = false;
186 })
187 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600188 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600189 Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700190 $scope.loading = false;
191 });
192 };
193 $scope.orderlyShutdownConfirm = function() {
194 if ($scope.confirm) {
195 return;
196 }
197 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500198 $scope.confirmOrderlyShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700199 };
200
201 $scope.immediateShutdown = function() {
202 $scope.loading = true;
203 dataService.setUnreachableState();
204 APIUtils.chassisPowerOff()
205 .then(function(response) {
206 return response;
207 })
208 .then(function(lastStatus) {
209 pollStartTime = new Date();
210 return pollChassisStatusTillOff();
211 })
212 .then(function(chassisState) {
213 dataService.setPowerOffState();
214 $scope.loading = false;
215 })
216 .catch(function(error) {
beccabroek27ce84d2019-02-05 15:43:17 -0600217 toastService.error(
beccabroek92d13b62019-01-08 14:24:29 -0600218 Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED);
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700219 $scope.loading = false;
220 });
221 };
222 $scope.immediateShutdownConfirm = function() {
223 if ($scope.confirm) {
224 return;
225 }
226 $scope.confirm = true;
Gunnar Mills6af5d292019-05-17 14:39:23 -0500227 $scope.confirmImmediateShutdown = true;
Andrew Geisslerd27bb132018-05-24 11:07:27 -0700228 };
229 }
230 ]);
Iftekharul Islam99d199f2017-03-24 15:28:25 -0500231})(angular);