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