blob: 4ae732fe07e7850d90d9b15b8771f9e7603af324 [file] [log] [blame]
/**
* Controller for power-operations
*
* @module app/serverControl
* @exports powerOperationsController
* @name powerOperationsController
*/
window.angular && (function(angular) {
'use strict';
angular.module('app.serverControl').controller('powerOperationsController', [
'$scope', 'APIUtils', 'dataService', 'Constants', '$timeout', '$interval',
'$interpolate', '$q',
function(
$scope, APIUtils, dataService, Constants, $timeout, $interval,
$interpolate, $q) {
$scope.dataService = dataService;
$scope.confirm = false;
$scope.power_confirm = false;
$scope.warmboot_confirm = false;
$scope.coldboot_confirm = false;
$scope.orderly_confirm = false;
$scope.immediately_confirm = false;
$scope.loading = false;
var pollChassisStatusTimer = undefined;
var pollHostStatusTimer = undefined;
var pollStartTime = null;
//@TODO: call api and get proper state
$scope.toggleState = function() {
dataService.server_state =
(dataService.server_state == 'Running') ? 'Off' : 'Running';
};
$scope.powerOn = function() {
$scope.loading = true;
dataService.setUnreachableState();
APIUtils.hostPowerOn()
.then(function(response) {
return response;
})
.then(function(lastStatus) {
pollStartTime = new Date();
return pollHostStatusTillOn();
})
.then(function(hostState) {
$scope.loading = false;
})
.catch(function(error) {
dataService.activateErrorModal({
title: Constants.MESSAGES.POWER_OP.POWER_ON_FAILED,
description: error.statusText ?
$interpolate(
Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
{status: error.status, description: error.statusText}) :
error
});
$scope.loading = false;
});
};
$scope.powerOnConfirm = function() {
if ($scope.confirm) {
return;
}
$scope.confirm = true;
$scope.power_confirm = true;
};
function setHostState(state) {
if (state == Constants.HOST_STATE_TEXT.off_code) {
dataService.setPowerOffState();
} else if (state == Constants.HOST_STATE_TEXT.on_code) {
dataService.setPowerOnState();
} else {
dataService.setErrorState();
}
}
function pollChassisStatusTillOff() {
var deferred = $q.defer();
pollChassisStatusTimer = $interval(function() {
var now = new Date();
if ((now.getTime() - pollStartTime.getTime()) >=
Constants.TIMEOUT.CHASSIS_OFF) {
$interval.cancel(pollChassisStatusTimer);
pollChassisStatusTimer = undefined;
deferred.reject(
new Error(Constants.MESSAGES.POLL.CHASSIS_OFF_TIMEOUT));
}
APIUtils.getChassisState()
.then(function(state) {
if (state === Constants.CHASSIS_POWER_STATE.off_code) {
$interval.cancel(pollChassisStatusTimer);
pollChassisStatusTimer = undefined;
deferred.resolve(state);
}
})
.catch(function(error) {
$interval.cancel(pollChassisStatusTimer);
pollChassisStatusTimer = undefined;
deferred.reject(error);
});
}, Constants.POLL_INTERVALS.POWER_OP);
return deferred.promise;
}
function pollHostStatusTillOn() {
var deferred = $q.defer();
pollHostStatusTimer = $interval(function() {
var now = new Date();
if ((now.getTime() - pollStartTime.getTime()) >=
Constants.TIMEOUT.HOST_ON) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.reject(new Error(Constants.MESSAGES.POLL.HOST_ON_TIMEOUT));
}
APIUtils.getHostState()
.then(function(state) {
setHostState(state);
if (state === Constants.HOST_STATE_TEXT.on_code) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.resolve(state);
} else if (state === Constants.HOST_STATE_TEXT.error_code) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.reject(
new Error(Constants.MESSAGES.POLL.HOST_QUIESCED));
}
})
.catch(function(error) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.reject(error);
});
}, Constants.POLL_INTERVALS.POWER_OP);
return deferred.promise;
}
function pollHostStatusTillOff() {
var deferred = $q.defer();
pollHostStatusTimer = $interval(function() {
var now = new Date();
if ((now.getTime() - pollStartTime.getTime()) >=
Constants.TIMEOUT.HOST_OFF) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.reject(
new Error(Constants.MESSAGES.POLL.HOST_OFF_TIMEOUT));
}
APIUtils.getHostState()
.then(function(state) {
setHostState(state);
if (state === Constants.HOST_STATE_TEXT.off_code) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.resolve(state);
}
})
.catch(function(error) {
$interval.cancel(pollHostStatusTimer);
pollHostStatusTimer = undefined;
deferred.reject(error);
});
}, Constants.POLL_INTERVALS.POWER_OP);
return deferred.promise;
}
$scope.warmReboot = function() {
$scope.loading = true;
dataService.setUnreachableState();
APIUtils.hostReboot()
.then(function(response) {
return response;
})
.then(function(lastStatus) {
pollStartTime = new Date();
return pollHostStatusTillOff();
})
.then(function(hostState) {
pollStartTime = new Date();
return pollHostStatusTillOn();
})
.then(function(hostState) {
$scope.loading = false;
})
.catch(function(error) {
dataService.activateErrorModal({
title: Constants.MESSAGES.POWER_OP.WARM_REBOOT_FAILED,
description: error.statusText ?
$interpolate(
Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
{status: error.status, description: error.statusText}) :
error
});
$scope.loading = false;
});
};
$scope.testState = function() {
$timeout(function() {
dataService.setPowerOffState();
$timeout(function() {
dataService.setPowerOnState();
}, 2000);
}, 1000);
};
$scope.warmRebootConfirm = function() {
if ($scope.confirm) {
return;
}
$scope.confirm = true;
$scope.warmboot_confirm = true;
};
$scope.coldReboot = function() {
$scope.loading = true;
dataService.setUnreachableState();
APIUtils.chassisPowerOff()
.then(function(state) {
return state;
})
.then(function(lastState) {
pollStartTime = new Date();
return pollChassisStatusTillOff();
})
.then(function(chassisState) {
return APIUtils.hostPowerOn().then(function(hostState) {
return hostState;
});
})
.then(function(hostState) {
pollStartTime = new Date();
return pollHostStatusTillOn();
})
.then(function(state) {
$scope.loading = false;
})
.catch(function(error) {
dataService.activateErrorModal({
title: Constants.MESSAGES.POWER_OP.COLD_REBOOT_FAILED,
description: error.statusText ?
$interpolate(
Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
{status: error.status, description: error.statusText}) :
error
});
$scope.loading = false;
});
};
$scope.coldRebootConfirm = function() {
if ($scope.confirm) {
return;
}
$scope.confirm = true;
$scope.coldboot_confirm = true;
};
$scope.orderlyShutdown = function() {
$scope.loading = true;
dataService.setUnreachableState();
APIUtils.hostPowerOff()
.then(function(response) {
return response;
})
.then(function(lastStatus) {
pollStartTime = new Date();
return pollHostStatusTillOff();
})
.then(function(hostState) {
pollStartTime = new Date();
return pollChassisStatusTillOff();
})
.then(function(chassisState) {
$scope.loading = false;
})
.catch(function(error) {
dataService.activateErrorModal({
title: Constants.MESSAGES.POWER_OP.ORDERLY_SHUTDOWN_FAILED,
description: error.statusText ?
$interpolate(
Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
{status: error.status, description: error.statusText}) :
error
});
$scope.loading = false;
});
};
$scope.orderlyShutdownConfirm = function() {
if ($scope.confirm) {
return;
}
$scope.confirm = true;
$scope.orderly_confirm = true;
};
$scope.immediateShutdown = function() {
$scope.loading = true;
dataService.setUnreachableState();
APIUtils.chassisPowerOff()
.then(function(response) {
return response;
})
.then(function(lastStatus) {
pollStartTime = new Date();
return pollChassisStatusTillOff();
})
.then(function(chassisState) {
dataService.setPowerOffState();
$scope.loading = false;
})
.catch(function(error) {
dataService.activateErrorModal({
title: Constants.MESSAGES.POWER_OP.IMMEDIATE_SHUTDOWN_FAILED,
description: error.statusText ?
$interpolate(
Constants.MESSAGES.ERROR_MESSAGE_DESC_TEMPLATE)(
{status: error.status, description: error.statusText}) :
error
});
$scope.loading = false;
});
};
$scope.immediateShutdownConfirm = function() {
if ($scope.confirm) {
return;
}
$scope.confirm = true;
$scope.immediately_confirm = true;
};
}
]);
})(angular);