1import api from '@/store/api'; 2import i18n from '@/i18n'; 3 4const DateTimeStore = { 5 namespaced: true, 6 state: { 7 ntpServers: [], 8 isNtpProtocolEnabled: null, 9 }, 10 getters: { 11 ntpServers: (state) => state.ntpServers, 12 isNtpProtocolEnabled: (state) => state.isNtpProtocolEnabled, 13 }, 14 mutations: { 15 setNtpServers: (state, ntpServers) => (state.ntpServers = ntpServers), 16 setIsNtpProtocolEnabled: (state, isNtpProtocolEnabled) => 17 (state.isNtpProtocolEnabled = isNtpProtocolEnabled), 18 }, 19 actions: { 20 async getNtpData({ commit }) { 21 return await api 22 .get(`${await this.dispatch('global/getBmcPath')}/NetworkProtocol`) 23 .then((response) => { 24 const ntpServers = response.data.NTP.NTPServers; 25 const isNtpProtocolEnabled = response.data.NTP.ProtocolEnabled; 26 commit('setNtpServers', ntpServers); 27 commit('setIsNtpProtocolEnabled', isNtpProtocolEnabled); 28 }) 29 .catch((error) => { 30 console.log(error); 31 }); 32 }, 33 async updateDateTime({ state }, dateTimeForm) { 34 const ntpData = { 35 NTP: { 36 ProtocolEnabled: dateTimeForm.ntpProtocolEnabled, 37 }, 38 }; 39 if (dateTimeForm.ntpProtocolEnabled) { 40 ntpData.NTP.NTPServers = dateTimeForm.ntpServersArray; 41 } 42 return await api 43 .patch( 44 `${await this.dispatch('global/getBmcPath')}/NetworkProtocol`, 45 ntpData, 46 ) 47 .then(async () => { 48 if (!dateTimeForm.ntpProtocolEnabled) { 49 const dateTimeData = { 50 DateTime: dateTimeForm.updatedDateTime, 51 }; 52 /** 53 * https://github.com/openbmc/phosphor-time-manager/blob/master/README.md#special-note-on-changing-ntp-setting 54 * When time mode is initially set to Manual from NTP, 55 * NTP service is disabled and the NTP service is 56 * stopping but not stopped, setting time will return an error. 57 * There are no responses from backend to notify when NTP is stopped. 58 * To work around, a timeout is set to allow NTP to fully stop 59 * TODO: remove timeout if backend solves 60 * https://github.com/openbmc/openbmc/issues/3459 61 */ 62 const timeoutVal = state.isNtpProtocolEnabled ? 20000 : 0; 63 return await new Promise((resolve, reject) => { 64 setTimeout(async () => { 65 return api 66 .patch( 67 `${await this.dispatch('global/getBmcPath')}`, 68 dateTimeData, 69 ) 70 .then(() => resolve()) 71 .catch(() => reject()); 72 }, timeoutVal); 73 }); 74 } 75 }) 76 .then(() => { 77 return i18n.global.t('pageDateTime.toast.successSaveDateTime'); 78 }) 79 .catch((error) => { 80 console.log(error); 81 throw new Error( 82 i18n.global.t('pageDateTime.toast.errorSaveDateTime'), 83 ); 84 }); 85 }, 86 }, 87}; 88 89export default DateTimeStore; 90