import api from '@/store/api'; import i18n from '@/i18n'; /** * Watch for serverStatus changes in GlobalStore module * to set isOperationInProgress state * Stop watching status changes and resolve Promise when * serverStatus value matches passed argument or after 5 minutes * @param {string} serverStatus * @returns {Promise} */ const checkForServerStatus = function (serverStatus) { return new Promise((resolve) => { const timer = setTimeout(() => { resolve(); unwatch(); }, 300000 /*5mins*/); const unwatch = this.watch( (state) => state.global.serverStatus, (value) => { if (value === serverStatus) { resolve(); unwatch(); clearTimeout(timer); } }, ); }); }; const ControlStore = { namespaced: true, state: { isOperationInProgress: false, lastPowerOperationTime: null, lastBmcRebootTime: null, }, getters: { isOperationInProgress: (state) => state.isOperationInProgress, lastPowerOperationTime: (state) => state.lastPowerOperationTime, lastBmcRebootTime: (state) => state.lastBmcRebootTime, }, mutations: { setOperationInProgress: (state, inProgress) => (state.isOperationInProgress = inProgress), setLastPowerOperationTime: (state, lastPowerOperationTime) => (state.lastPowerOperationTime = lastPowerOperationTime), setLastBmcRebootTime: (state, lastBmcRebootTime) => (state.lastBmcRebootTime = lastBmcRebootTime), }, actions: { async getLastPowerOperationTime({ commit }) { return await api .get('/redfish/v1/Systems/system') .then((response) => { const lastReset = response.data.LastResetTime; if (lastReset) { const lastPowerOperationTime = new Date(lastReset); commit('setLastPowerOperationTime', lastPowerOperationTime); } }) .catch((error) => console.log(error)); }, getLastBmcRebootTime({ commit }) { return api .get('/redfish/v1/Managers/bmc') .then((response) => { const lastBmcReset = response.data.LastResetTime; const lastBmcRebootTime = new Date(lastBmcReset); commit('setLastBmcRebootTime', lastBmcRebootTime); }) .catch((error) => console.log(error)); }, async rebootBmc({ dispatch }) { const data = { ResetType: 'GracefulRestart' }; return await api .post('/redfish/v1/Managers/bmc/Actions/Manager.Reset', data) .then(() => dispatch('getLastBmcRebootTime')) .then(() => i18n.t('pageRebootBmc.toast.successRebootStart')) .catch((error) => { console.log(error); throw new Error(i18n.t('pageRebootBmc.toast.errorRebootStart')); }); }, async serverPowerOn({ dispatch, commit }) { const data = { ResetType: 'On' }; dispatch('serverPowerChange', data); await checkForServerStatus.bind(this, 'on')(); commit('setOperationInProgress', false); dispatch('getLastPowerOperationTime'); }, async serverSoftReboot({ dispatch, commit }) { const data = { ResetType: 'GracefulRestart' }; dispatch('serverPowerChange', data); await checkForServerStatus.bind(this, 'on')(); commit('setOperationInProgress', false); dispatch('getLastPowerOperationTime'); }, async serverHardReboot({ dispatch, commit }) { const data = { ResetType: 'ForceRestart' }; dispatch('serverPowerChange', data); await checkForServerStatus.bind(this, 'on')(); commit('setOperationInProgress', false); dispatch('getLastPowerOperationTime'); }, async serverSoftPowerOff({ dispatch, commit }) { const data = { ResetType: 'GracefulShutdown' }; dispatch('serverPowerChange', data); await checkForServerStatus.bind(this, 'off')(); commit('setOperationInProgress', false); dispatch('getLastPowerOperationTime'); }, async serverHardPowerOff({ dispatch, commit }) { const data = { ResetType: 'ForceOff' }; dispatch('serverPowerChange', data); await checkForServerStatus.bind(this, 'off')(); commit('setOperationInProgress', false); dispatch('getLastPowerOperationTime'); }, serverPowerChange({ commit }, data) { commit('setOperationInProgress', true); api .post('/redfish/v1/Systems/system/Actions/ComputerSystem.Reset', data) .catch((error) => { console.log(error); commit('setOperationInProgress', false); }); }, }, }; export default ControlStore;