168cbbe90SSandeepa Singhimport api from '@/store/api';
268cbbe90SSandeepa Singhimport i18n from '@/i18n';
368cbbe90SSandeepa Singh
468cbbe90SSandeepa Singh/**
568cbbe90SSandeepa Singh * Watch for serverStatus changes in GlobalStore module
668cbbe90SSandeepa Singh * to set isOperationInProgress state
768cbbe90SSandeepa Singh * Stop watching status changes and resolve Promise when
868cbbe90SSandeepa Singh * serverStatus value matches passed argument or after 5 minutes
968cbbe90SSandeepa Singh * @param {string} serverStatus
1068cbbe90SSandeepa Singh * @returns {Promise}
1168cbbe90SSandeepa Singh */
1268cbbe90SSandeepa Singhconst checkForServerStatus = function (serverStatus) {
1368cbbe90SSandeepa Singh  return new Promise((resolve) => {
1468cbbe90SSandeepa Singh    const timer = setTimeout(() => {
1568cbbe90SSandeepa Singh      resolve();
1668cbbe90SSandeepa Singh      unwatch();
1768cbbe90SSandeepa Singh    }, 300000 /*5mins*/);
1868cbbe90SSandeepa Singh    const unwatch = this.watch(
1968cbbe90SSandeepa Singh      (state) => state.global.serverStatus,
2068cbbe90SSandeepa Singh      (value) => {
2168cbbe90SSandeepa Singh        if (value === serverStatus) {
2268cbbe90SSandeepa Singh          resolve();
2368cbbe90SSandeepa Singh          unwatch();
2468cbbe90SSandeepa Singh          clearTimeout(timer);
2568cbbe90SSandeepa Singh        }
268132399cSEd Tanous      },
2768cbbe90SSandeepa Singh    );
2868cbbe90SSandeepa Singh  });
2968cbbe90SSandeepa Singh};
3068cbbe90SSandeepa Singh
3168cbbe90SSandeepa Singhconst ControlStore = {
3268cbbe90SSandeepa Singh  namespaced: true,
3368cbbe90SSandeepa Singh  state: {
3468cbbe90SSandeepa Singh    isOperationInProgress: false,
3568cbbe90SSandeepa Singh    lastPowerOperationTime: null,
3668cbbe90SSandeepa Singh    lastBmcRebootTime: null,
3768cbbe90SSandeepa Singh  },
3868cbbe90SSandeepa Singh  getters: {
3968cbbe90SSandeepa Singh    isOperationInProgress: (state) => state.isOperationInProgress,
4068cbbe90SSandeepa Singh    lastPowerOperationTime: (state) => state.lastPowerOperationTime,
4168cbbe90SSandeepa Singh    lastBmcRebootTime: (state) => state.lastBmcRebootTime,
4268cbbe90SSandeepa Singh  },
4368cbbe90SSandeepa Singh  mutations: {
4468cbbe90SSandeepa Singh    setOperationInProgress: (state, inProgress) =>
4568cbbe90SSandeepa Singh      (state.isOperationInProgress = inProgress),
4668cbbe90SSandeepa Singh    setLastPowerOperationTime: (state, lastPowerOperationTime) =>
4768cbbe90SSandeepa Singh      (state.lastPowerOperationTime = lastPowerOperationTime),
4868cbbe90SSandeepa Singh    setLastBmcRebootTime: (state, lastBmcRebootTime) =>
4968cbbe90SSandeepa Singh      (state.lastBmcRebootTime = lastBmcRebootTime),
5068cbbe90SSandeepa Singh  },
5168cbbe90SSandeepa Singh  actions: {
5268cbbe90SSandeepa Singh    async getLastPowerOperationTime({ commit }) {
5368cbbe90SSandeepa Singh      return await api
548841b7d4SSean Zhang        .get(`${await this.dispatch('global/getSystemPath')}`)
5568cbbe90SSandeepa Singh        .then((response) => {
5668cbbe90SSandeepa Singh          const lastReset = response.data.LastResetTime;
5768cbbe90SSandeepa Singh          if (lastReset) {
5868cbbe90SSandeepa Singh            const lastPowerOperationTime = new Date(lastReset);
5968cbbe90SSandeepa Singh            commit('setLastPowerOperationTime', lastPowerOperationTime);
6068cbbe90SSandeepa Singh          }
6168cbbe90SSandeepa Singh        })
6268cbbe90SSandeepa Singh        .catch((error) => console.log(error));
6368cbbe90SSandeepa Singh    },
648841b7d4SSean Zhang    async getLastBmcRebootTime({ commit }) {
6568cbbe90SSandeepa Singh      return api
668841b7d4SSean Zhang        .get(`${await this.dispatch('global/getBmcPath')}`)
6768cbbe90SSandeepa Singh        .then((response) => {
6868cbbe90SSandeepa Singh          const lastBmcReset = response.data.LastResetTime;
6968cbbe90SSandeepa Singh          const lastBmcRebootTime = new Date(lastBmcReset);
7068cbbe90SSandeepa Singh          commit('setLastBmcRebootTime', lastBmcRebootTime);
7168cbbe90SSandeepa Singh        })
7268cbbe90SSandeepa Singh        .catch((error) => console.log(error));
7368cbbe90SSandeepa Singh    },
74*08039ab7SSean Zhang    async rebootBmc() {
7568cbbe90SSandeepa Singh      const data = { ResetType: 'GracefulRestart' };
7668cbbe90SSandeepa Singh      return await api
778841b7d4SSean Zhang        .post(
788841b7d4SSean Zhang          `${await this.dispatch('global/getBmcPath')}/Actions/Manager.Reset`,
798841b7d4SSean Zhang          data,
808841b7d4SSean Zhang        )
8168cbbe90SSandeepa Singh        .then(() => i18n.t('pageRebootBmc.toast.successRebootStart'))
8268cbbe90SSandeepa Singh        .catch((error) => {
8368cbbe90SSandeepa Singh          console.log(error);
8468cbbe90SSandeepa Singh          throw new Error(i18n.t('pageRebootBmc.toast.errorRebootStart'));
8568cbbe90SSandeepa Singh        });
8668cbbe90SSandeepa Singh    },
8768cbbe90SSandeepa Singh    async serverPowerOn({ dispatch, commit }) {
8868cbbe90SSandeepa Singh      const data = { ResetType: 'On' };
8968cbbe90SSandeepa Singh      dispatch('serverPowerChange', data);
9068cbbe90SSandeepa Singh      await checkForServerStatus.bind(this, 'on')();
9168cbbe90SSandeepa Singh      commit('setOperationInProgress', false);
9268cbbe90SSandeepa Singh      dispatch('getLastPowerOperationTime');
9368cbbe90SSandeepa Singh    },
9468cbbe90SSandeepa Singh    async serverSoftReboot({ dispatch, commit }) {
9568cbbe90SSandeepa Singh      const data = { ResetType: 'GracefulRestart' };
9668cbbe90SSandeepa Singh      dispatch('serverPowerChange', data);
9768cbbe90SSandeepa Singh      await checkForServerStatus.bind(this, 'on')();
9868cbbe90SSandeepa Singh      commit('setOperationInProgress', false);
9968cbbe90SSandeepa Singh      dispatch('getLastPowerOperationTime');
10068cbbe90SSandeepa Singh    },
10168cbbe90SSandeepa Singh    async serverHardReboot({ dispatch, commit }) {
10268cbbe90SSandeepa Singh      const data = { ResetType: 'ForceRestart' };
10368cbbe90SSandeepa Singh      dispatch('serverPowerChange', data);
10468cbbe90SSandeepa Singh      await checkForServerStatus.bind(this, 'on')();
10568cbbe90SSandeepa Singh      commit('setOperationInProgress', false);
10668cbbe90SSandeepa Singh      dispatch('getLastPowerOperationTime');
10768cbbe90SSandeepa Singh    },
10868cbbe90SSandeepa Singh    async serverSoftPowerOff({ dispatch, commit }) {
10968cbbe90SSandeepa Singh      const data = { ResetType: 'GracefulShutdown' };
11068cbbe90SSandeepa Singh      dispatch('serverPowerChange', data);
11168cbbe90SSandeepa Singh      await checkForServerStatus.bind(this, 'off')();
11268cbbe90SSandeepa Singh      commit('setOperationInProgress', false);
11368cbbe90SSandeepa Singh      dispatch('getLastPowerOperationTime');
11468cbbe90SSandeepa Singh    },
11568cbbe90SSandeepa Singh    async serverHardPowerOff({ dispatch, commit }) {
11668cbbe90SSandeepa Singh      const data = { ResetType: 'ForceOff' };
11768cbbe90SSandeepa Singh      dispatch('serverPowerChange', data);
11868cbbe90SSandeepa Singh      await checkForServerStatus.bind(this, 'off')();
11968cbbe90SSandeepa Singh      commit('setOperationInProgress', false);
12068cbbe90SSandeepa Singh      dispatch('getLastPowerOperationTime');
12168cbbe90SSandeepa Singh    },
1228841b7d4SSean Zhang    async serverPowerChange({ commit }, data) {
12368cbbe90SSandeepa Singh      commit('setOperationInProgress', true);
12468cbbe90SSandeepa Singh      api
1258841b7d4SSean Zhang        .post(
1268841b7d4SSean Zhang          `${await this.dispatch('global/getSystemPath')}/Actions/ComputerSystem.Reset`,
1278841b7d4SSean Zhang          data,
1288841b7d4SSean Zhang        )
12968cbbe90SSandeepa Singh        .catch((error) => {
13068cbbe90SSandeepa Singh          console.log(error);
13168cbbe90SSandeepa Singh          commit('setOperationInProgress', false);
13268cbbe90SSandeepa Singh        });
13368cbbe90SSandeepa Singh    },
13468cbbe90SSandeepa Singh  },
13568cbbe90SSandeepa Singh};
13668cbbe90SSandeepa Singh
13768cbbe90SSandeepa Singhexport default ControlStore;
138