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', [
13*5ff98780SYoshie Muranaka    '$scope', 'APIUtils', 'dataService', 'Constants', '$interval', '$q',
14*5ff98780SYoshie Muranaka    'toastService',
15d27bb135SAndrew Geissler    function(
16*5ff98780SYoshie Muranaka        $scope, APIUtils, dataService, Constants, $interval, $q, toastService) {
17cd789508SIftekharul Islam      $scope.dataService = dataService;
18aa4734d5SGunnar Mills      // Is a || of the other 4 "confirm" variables to ensure only
19aa4734d5SGunnar Mills      // one confirm is shown at a time.
20cd789508SIftekharul Islam      $scope.confirm = false;
216af5d294SGunnar Mills      $scope.confirmWarmReboot = false;
226af5d294SGunnar Mills      $scope.confirmColdReboot = false;
236af5d294SGunnar Mills      $scope.confirmOrderlyShutdown = false;
246af5d294SGunnar Mills      $scope.confirmImmediateShutdown = false;
256add8325SGunnar Mills      $scope.loading = true;
26a1d238f3SIftekharul Islam
27*5ff98780SYoshie Muranaka      // When a power operation is in progress, set to true,
28*5ff98780SYoshie Muranaka      // when a power operation completes (success/fail) set to false.
29*5ff98780SYoshie Muranaka      // This property is used to show/hide the 'in progress' message
30*5ff98780SYoshie Muranaka      // in markup.
31*5ff98780SYoshie Muranaka      $scope.operationPending = false;
32cd789508SIftekharul Islam
33afcfda7bSYoshie Muranaka      /**
34afcfda7bSYoshie Muranaka       * Checks the host status provided by the dataService using an
35afcfda7bSYoshie Muranaka       * interval timer
36afcfda7bSYoshie Muranaka       * @param {string} statusType : host status type to check for
37*5ff98780SYoshie Muranaka       * @param {number} timeout : timeout limit, defaults to 5 minutes
38*5ff98780SYoshie Muranaka       * @param {string} error : error message, defaults to 'Time out'
39afcfda7bSYoshie Muranaka       * @returns {Promise} : returns a deferred promise that will be fulfilled
40afcfda7bSYoshie Muranaka       * if the status is met or be rejected if the timeout is reached
41afcfda7bSYoshie Muranaka       */
42*5ff98780SYoshie Muranaka      var checkHostStatus =
43*5ff98780SYoshie Muranaka          (statusType, timeout = 300000, error = 'Time out.') => {
44afcfda7bSYoshie Muranaka            const deferred = $q.defer();
45afcfda7bSYoshie Muranaka            const start = new Date();
46afcfda7bSYoshie Muranaka            const checkHostStatusInverval = $interval(() => {
47afcfda7bSYoshie Muranaka              let now = new Date();
48afcfda7bSYoshie Muranaka              let timePassed = now.getTime() - start.getTime();
49afcfda7bSYoshie Muranaka              if (timePassed > timeout) {
50afcfda7bSYoshie Muranaka                deferred.reject(error);
51afcfda7bSYoshie Muranaka                $interval.cancel(checkHostStatusInverval);
52afcfda7bSYoshie Muranaka              }
53afcfda7bSYoshie Muranaka              if (dataService.server_state === statusType) {
54afcfda7bSYoshie Muranaka                deferred.resolve();
55afcfda7bSYoshie Muranaka                $interval.cancel(checkHostStatusInverval);
56afcfda7bSYoshie Muranaka              }
57afcfda7bSYoshie Muranaka            }, Constants.POLL_INTERVALS.POWER_OP);
58afcfda7bSYoshie Muranaka            return deferred.promise;
59afcfda7bSYoshie Muranaka          };
60afcfda7bSYoshie Muranaka
616add8325SGunnar Mills      APIUtils.getLastPowerTime()
626add8325SGunnar Mills          .then(
635674425bSbeccabroek              function(data) {
645674425bSbeccabroek                if (data.data == 0) {
656af5d294SGunnar Mills                  $scope.powerTime = 'not available';
665674425bSbeccabroek                } else {
676af5d294SGunnar Mills                  $scope.powerTime = data.data;
685674425bSbeccabroek                }
695674425bSbeccabroek              },
705674425bSbeccabroek              function(error) {
715674425bSbeccabroek                console.log(JSON.stringify(error));
726add8325SGunnar Mills              })
736add8325SGunnar Mills          .finally(function() {
746add8325SGunnar Mills            $scope.loading = false;
755674425bSbeccabroek          });
766add8325SGunnar Mills
77cd789508SIftekharul Islam      $scope.toggleState = function() {
78d27bb135SAndrew Geissler        dataService.server_state =
79d27bb135SAndrew Geissler            (dataService.server_state == 'Running') ? 'Off' : 'Running';
80ba5e3f34SAndrew Geissler      };
81cd789508SIftekharul Islam
82*5ff98780SYoshie Muranaka      /**
83*5ff98780SYoshie Muranaka       * Initiate Power on
84*5ff98780SYoshie Muranaka       */
85*5ff98780SYoshie Muranaka      $scope.powerOn = () => {
86*5ff98780SYoshie Muranaka        $scope.operationPending = true;
87d80c280bSCamVan Nguyen        dataService.setUnreachableState();
88d27bb135SAndrew Geissler        APIUtils.hostPowerOn()
89*5ff98780SYoshie Muranaka            .then(() => {
90*5ff98780SYoshie Muranaka              // Check for on state
91*5ff98780SYoshie Muranaka              return checkHostStatus(
92*5ff98780SYoshie Muranaka                  Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON,
93*5ff98780SYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_ON_TIMEOUT);
94d27bb135SAndrew Geissler            })
95*5ff98780SYoshie Muranaka            .catch((error) => {
96*5ff98780SYoshie Muranaka              console.log(error);
9727ce84d2Sbeccabroek              toastService.error(Constants.MESSAGES.POWER_OP.POWER_ON_FAILED);
98*5ff98780SYoshie Muranaka            })
99*5ff98780SYoshie Muranaka            .finally(() => {
100*5ff98780SYoshie Muranaka              $scope.operationPending = false;
101*5ff98780SYoshie Muranaka            })
102ba5e3f34SAndrew Geissler      };
103a1d238f3SIftekharul Islam
104*5ff98780SYoshie Muranaka      /**
105*5ff98780SYoshie Muranaka       * Initiate Orderly reboot
106*5ff98780SYoshie Muranaka       * Attempts to stop all software
107*5ff98780SYoshie Muranaka       */
108*5ff98780SYoshie Muranaka      $scope.warmReboot = () => {
109*5ff98780SYoshie Muranaka        $scope.operationPending = true;
110d80c280bSCamVan Nguyen        dataService.setUnreachableState();
111d27bb135SAndrew Geissler        APIUtils.hostReboot()
112*5ff98780SYoshie Muranaka            .then(() => {
113*5ff98780SYoshie Muranaka              // Check for off state
114*5ff98780SYoshie Muranaka              return checkHostStatus(
115*5ff98780SYoshie Muranaka                  Constants.HOST_STATE_TEXT.off, Constants.TIMEOUT.HOST_OFF,
116*5ff98780SYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT);
117d27bb135SAndrew Geissler            })
118*5ff98780SYoshie Muranaka            .then(() => {
119*5ff98780SYoshie Muranaka              // Check for on state
120*5ff98780SYoshie Muranaka              return checkHostStatus(
121*5ff98780SYoshie Muranaka                  Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON,
122*5ff98780SYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_ON_TIMEOUT);
123d27bb135SAndrew Geissler            })
124*5ff98780SYoshie Muranaka            .catch((error) => {
125*5ff98780SYoshie Muranaka              console.log(error);
12627ce84d2Sbeccabroek              toastService.error(
12727ce84d2Sbeccabroek                  Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED);
128*5ff98780SYoshie Muranaka            })
129*5ff98780SYoshie Muranaka            .finally(() => {
130*5ff98780SYoshie Muranaka              $scope.operationPending = false;
131*5ff98780SYoshie Muranaka            })
132cd789508SIftekharul Islam      };
133834eb010SGunnar Mills
134cd789508SIftekharul Islam      $scope.warmRebootConfirm = function() {
135cd789508SIftekharul Islam        if ($scope.confirm) {
136aa4734d5SGunnar Mills          // If another "confirm" is already shown return
137cd789508SIftekharul Islam          return;
138cd789508SIftekharul Islam        }
139cd789508SIftekharul Islam        $scope.confirm = true;
1406af5d294SGunnar Mills        $scope.confirmWarmReboot = true;
141cd789508SIftekharul Islam      };
142cd789508SIftekharul Islam
143*5ff98780SYoshie Muranaka      /**
144*5ff98780SYoshie Muranaka       * Initiate Immediate reboot
145*5ff98780SYoshie Muranaka       * Does not attempt to stop all software
146*5ff98780SYoshie Muranaka       */
147*5ff98780SYoshie Muranaka      $scope.coldReboot = () => {
148*5ff98780SYoshie Muranaka        $scope.operationPending = true;
149d80c280bSCamVan Nguyen        dataService.setUnreachableState();
150d27bb135SAndrew Geissler        APIUtils.chassisPowerOff()
151*5ff98780SYoshie Muranaka            .then(() => {
152*5ff98780SYoshie Muranaka              // Check for off state
153afcfda7bSYoshie Muranaka              return checkHostStatus(
154afcfda7bSYoshie Muranaka                  Constants.HOST_STATE_TEXT.off,
155afcfda7bSYoshie Muranaka                  Constants.TIMEOUT.HOST_OFF_IMMEDIATE,
156afcfda7bSYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT);
157d27bb135SAndrew Geissler            })
158*5ff98780SYoshie Muranaka            .then(() => {
159afcfda7bSYoshie Muranaka              return APIUtils.hostPowerOn();
160d27bb135SAndrew Geissler            })
161*5ff98780SYoshie Muranaka            .then(() => {
162*5ff98780SYoshie Muranaka              // Check for on state
163afcfda7bSYoshie Muranaka              return checkHostStatus(
164afcfda7bSYoshie Muranaka                  Constants.HOST_STATE_TEXT.on, Constants.TIMEOUT.HOST_ON,
165afcfda7bSYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_ON_TIMEOUT);
166d27bb135SAndrew Geissler            })
167*5ff98780SYoshie Muranaka            .catch((error) => {
168afcfda7bSYoshie Muranaka              console.log(error);
16927ce84d2Sbeccabroek              toastService.error(
17027ce84d2Sbeccabroek                  Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED);
171afcfda7bSYoshie Muranaka            })
172*5ff98780SYoshie Muranaka            .finally(() => {
173*5ff98780SYoshie Muranaka              $scope.operationPending = false;
174afcfda7bSYoshie Muranaka            })
175cd789508SIftekharul Islam      };
176*5ff98780SYoshie Muranaka
177cd789508SIftekharul Islam      $scope.coldRebootConfirm = function() {
178cd789508SIftekharul Islam        if ($scope.confirm) {
179cd789508SIftekharul Islam          return;
180cd789508SIftekharul Islam        }
181cd789508SIftekharul Islam        $scope.confirm = true;
1826af5d294SGunnar Mills        $scope.confirmColdReboot = true;
183cd789508SIftekharul Islam      };
184cd789508SIftekharul Islam
185*5ff98780SYoshie Muranaka      /**
186*5ff98780SYoshie Muranaka       * Initiate Orderly shutdown
187*5ff98780SYoshie Muranaka       * Attempts to stop all software
188*5ff98780SYoshie Muranaka       */
189*5ff98780SYoshie Muranaka      $scope.orderlyShutdown = () => {
190*5ff98780SYoshie Muranaka        $scope.operationPending = true;
191d80c280bSCamVan Nguyen        dataService.setUnreachableState();
192d27bb135SAndrew Geissler        APIUtils.hostPowerOff()
193*5ff98780SYoshie Muranaka            .then(() => {
194*5ff98780SYoshie Muranaka              // Check for off state
195*5ff98780SYoshie Muranaka              return checkHostStatus(
196*5ff98780SYoshie Muranaka                  Constants.HOST_STATE_TEXT.off, Constants.TIMEOUT.HOST_OFF,
197*5ff98780SYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT);
198d27bb135SAndrew Geissler            })
199*5ff98780SYoshie Muranaka            .catch((error) => {
200*5ff98780SYoshie Muranaka              console.log(error);
20127ce84d2Sbeccabroek              toastService.error(
20292d13b62Sbeccabroek                  Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED);
203*5ff98780SYoshie Muranaka            })
204*5ff98780SYoshie Muranaka            .finally(() => {
205*5ff98780SYoshie Muranaka              $scope.operationPending = false;
206*5ff98780SYoshie Muranaka            })
207cd789508SIftekharul Islam      };
208*5ff98780SYoshie Muranaka
209cd789508SIftekharul Islam      $scope.orderlyShutdownConfirm = function() {
210cd789508SIftekharul Islam        if ($scope.confirm) {
211cd789508SIftekharul Islam          return;
212cd789508SIftekharul Islam        }
213cd789508SIftekharul Islam        $scope.confirm = true;
2146af5d294SGunnar Mills        $scope.confirmOrderlyShutdown = true;
215cd789508SIftekharul Islam      };
216cd789508SIftekharul Islam
217*5ff98780SYoshie Muranaka      /**
218*5ff98780SYoshie Muranaka       * Initiate Immediate shutdown
219*5ff98780SYoshie Muranaka       * Does not attempt to stop all software
220*5ff98780SYoshie Muranaka       */
221*5ff98780SYoshie Muranaka      $scope.immediateShutdown = () => {
222*5ff98780SYoshie Muranaka        $scope.operationPending = true;
223d80c280bSCamVan Nguyen        dataService.setUnreachableState();
224d27bb135SAndrew Geissler        APIUtils.chassisPowerOff()
225*5ff98780SYoshie Muranaka            .then(() => {
226*5ff98780SYoshie Muranaka              // Check for off state
227*5ff98780SYoshie Muranaka              return checkHostStatus(
228*5ff98780SYoshie Muranaka                  Constants.HOST_STATE_TEXT.off,
229*5ff98780SYoshie Muranaka                  Constants.TIMEOUT.HOST_OFF_IMMEDIATE,
230*5ff98780SYoshie Muranaka                  Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT);
231d27bb135SAndrew Geissler            })
232*5ff98780SYoshie Muranaka            .then(() => {
2333aa8b535SGunnar Mills              dataService.setPowerOffState();
234d27bb135SAndrew Geissler            })
235*5ff98780SYoshie Muranaka            .catch((error) => {
236*5ff98780SYoshie Muranaka              console.log(error);
23727ce84d2Sbeccabroek              toastService.error(
23892d13b62Sbeccabroek                  Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED);
239*5ff98780SYoshie Muranaka            })
240*5ff98780SYoshie Muranaka            .finally(() => {
241*5ff98780SYoshie Muranaka              $scope.operationPending = false;
242*5ff98780SYoshie Muranaka            })
243cd789508SIftekharul Islam      };
244*5ff98780SYoshie Muranaka
245cd789508SIftekharul Islam      $scope.immediateShutdownConfirm = function() {
246cd789508SIftekharul Islam        if ($scope.confirm) {
247cd789508SIftekharul Islam          return;
248cd789508SIftekharul Islam        }
249cd789508SIftekharul Islam        $scope.confirm = true;
2506af5d294SGunnar Mills        $scope.confirmImmediateShutdown = true;
251cd789508SIftekharul Islam      };
252cd789508SIftekharul Islam    }
253ba5e3f34SAndrew Geissler  ]);
254cd789508SIftekharul Islam})(angular);
255