xref: /openbmc/phosphor-webui/app/server-control/controllers/power-operations-controller.js (revision a1d238f3a53db2ec3cc4c2fd52fe78738b37968b)
1/**
2 * Controller for power-operations
3 *
4 * @module app/serverControl
5 * @exports powerOperationsController
6 * @name powerOperationsController
7 * @version 0.1.0
8 */
9
10window.angular && (function (angular) {
11    'use strict';
12
13    angular
14        .module('app.serverControl')
15        .controller('powerOperationsController', [
16            '$scope',
17            'APIUtils',
18            'dataService',
19            'Constants',
20            '$timeout',
21            '$interval',
22            '$q',
23            function($scope, APIUtils, dataService, Constants, $timeout, $interval, $q){
24                $scope.dataService = dataService;
25                $scope.confirm = false;
26                $scope.power_confirm = false;
27                $scope.warmboot_confirm = false;
28                $scope.coldboot_confirm = false;
29                $scope.orderly_confirm = false;
30                $scope.immediately_confirm = false;
31                $scope.loading = false;
32
33                var pollChassisStatusTimer = undefined;
34                var pollHostStatusTimer = undefined;
35                var pollStartTime = null;
36
37                //@TODO: call api and get proper state
38                $scope.toggleState = function(){
39                    dataService.server_state = (dataService.server_state == 'Running') ? 'Off': 'Running';
40                }
41
42                $scope.togglePower = function(){
43                    var method = (dataService.server_state == 'Running') ? 'hostPowerOff' : 'hostPowerOn';
44                    //@TODO: show progress or set class orange
45                    APIUtils[method]().then(function(response){
46                        //update state based on response
47                        //error case?
48                        if(response == null){
49                            console.log("Failed request.");
50                        }else{
51                            //@TODO::need to get the server status
52                            if(dataService.server_state == 'Running'){
53                                dataService.setPowerOffState();
54                            }else{
55                                dataService.setPowerOnState();
56                            }
57                        }
58                    });
59                }
60                $scope.powerOnConfirm = function(){
61                    if($scope.confirm) {
62                        return;
63                    }
64                    $scope.confirm = true;
65                    $scope.power_confirm = true;
66                };
67
68                function pollChassisStatusTillOff(){
69                    var deferred = $q.defer();
70                    pollChassisStatusTimer = $interval(function(){
71                        var now = new Date();
72                        if((now.getTime() - pollStartTime.getTime()) >= Constants.TIMEOUT.CHASSIS_OFF){
73                            $interval.cancel(pollChassisStatusTimer);
74                            pollChassisStatusTimer = undefined;
75                            deferred.reject(new Error(Constants.MESSAGES.POLL.TIMEOUT));
76                        }
77                        APIUtils.getChassisState().then(function(state){
78                            if(state === Constants.CHASSIS_POWER_STATE.off_code){
79                                $interval.cancel(pollChassisStatusTimer);
80                                pollChassisStatusTimer = undefined;
81                                deferred.resolve(state);
82                            }
83                        }).catch(function(error){
84                            $interval.cancel(pollChassisStatusTimer);
85                            pollChassisStatusTimer = undefined;
86                            deferred.reject(error);
87                        });
88                    }, Constants.POLL_INTERVALS.POWER_OP);
89
90                    return deferred.promise;
91                }
92                function pollHostStatusTillOn(){
93                    var deferred = $q.defer();
94                    pollHostStatusTimer = $interval(function(){
95                        var now = new Date();
96                        if((now.getTime() - pollStartTime.getTime()) >= Constants.TIMEOUT.HOST_ON){
97                            $interval.cancel(pollHostStatusTimer);
98                            pollHostStatusTimer = undefined;
99                            deferred.reject(new Error(Constants.MESSAGES.POLL.TIMEOUT));
100                        }
101                        APIUtils.getHostState().then(function(state){
102                            if(state === Constants.HOST_STATE_TEXT.on_code){
103                                $interval.cancel(pollHostStatusTimer);
104                                pollHostStatusTimer = undefined;
105                                deferred.resolve(state);
106                            }
107                        }).catch(function(error){
108                            $interval.cancel(pollHostStatusTimer);
109                            pollHostStatusTimer = undefined;
110                            deferred.reject(error);
111                        });
112                    }, Constants.POLL_INTERVALS.POWER_OP);
113
114                    return deferred.promise;
115                }
116                $scope.warmReboot = function(){
117                    //@TODO:show progress
118                    dataService.setBootingState();
119                    APIUtils.hostReboot().then(function(response){
120                        if(response){
121                            dataService.setPowerOnState();
122                        }else{
123                            //@TODO:hide progress & show error message
124                        }
125                    });
126                };
127                $scope.testState = function(){
128                    $timeout(function(){
129                        dataService.setPowerOffState();
130                        $timeout(function(){
131                            dataService.setPowerOnState();
132                        }, 2000);
133                    }, 1000);
134                };
135                $scope.warmRebootConfirm = function(){
136                    if($scope.confirm) {
137                        return;
138                    }
139                    $scope.confirm = true;
140                    $scope.warmboot_confirm = true;
141                };
142
143                $scope.coldReboot = function(){
144                    $scope.loading = true;
145                    dataService.setBootingState();
146                    APIUtils.chassisPowerOff().then(function(state){
147                        return state;
148                    }).then(function(lastState) {
149                        pollStartTime = new Date();
150                        return pollChassisStatusTillOff();
151                    }).then(function(chassisState) {
152                        APIUtils.hostPowerOn().then(function(hostState){
153                            return hostState;
154                        })
155                    }).then(function(hostState) {
156                        pollStartTime = new Date();
157                        return pollHostStatusTillOn();
158                    }).then(function(state) {
159                        dataService.setPowerOnState();
160                        $scope.loading = false;
161                    }).catch(function(error){
162                        $scope.loading = false;
163                    });
164                };
165                $scope.coldRebootConfirm = function(){
166                    if($scope.confirm) {
167                        return;
168                    }
169                    $scope.confirm = true;
170                    $scope.coldboot_confirm = true;
171                };
172
173                $scope.orderlyShutdown = function(){
174                    //@TODO:show progress
175                    APIUtils.hostPowerOff().then(function(response){
176                        if(response){
177                            dataService.setPowerOffState();
178                        }else{
179                            //@TODO:hide progress & show error message
180                        }
181                    });
182                };
183                $scope.orderlyShutdownConfirm = function(){
184                    if($scope.confirm) {
185                        return;
186                    }
187                    $scope.confirm = true;
188                    $scope.orderly_confirm = true;
189                };
190
191                $scope.immediateShutdown = function(){
192                    //@TODO:show progress
193                    APIUtils.chassisPowerOff(function(response){
194                        if(response){
195                            dataService.setPowerOffState();
196                        }else{
197                            //@TODO:hide progress & show error message
198                        }
199                    });
200                };
201                $scope.immediateShutdownConfirm = function(){
202                    if($scope.confirm) {
203                        return;
204                    }
205                    $scope.confirm = true;
206                    $scope.immediately_confirm = true;
207                };
208            }
209        ]
210    );
211
212})(angular);
213