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